osi-cards-lib 1.5.32 → 1.5.34

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 (87) hide show
  1. package/fesm2022/osi-cards-lib.mjs +31889 -0
  2. package/fesm2022/osi-cards-lib.mjs.map +1 -0
  3. package/index.d.ts +11528 -0
  4. package/package.json +25 -13
  5. package/scripts/setup-angular-styles.js +169 -0
  6. package/styles/_components.scss +38 -0
  7. package/styles/_index.scss +25 -0
  8. package/styles/_osi-cards-mixins.scss +459 -0
  9. package/styles/_osi-cards-tokens.scss +333 -0
  10. package/styles/_styles-scoped.scss +81 -0
  11. package/styles/_styles.scss +26 -0
  12. package/styles/bundles/_ai-card.scss +245 -0
  13. package/styles/bundles/_all.scss +68 -0
  14. package/styles/bundles/_base.scss +60 -0
  15. package/styles/bundles/_card-skeleton.scss +290 -0
  16. package/styles/bundles/_index.scss +25 -0
  17. package/styles/bundles/_sections.scss +48 -0
  18. package/styles/bundles/_tokens-only.scss +139 -0
  19. package/styles/components/_ai-card-renderer.scss +104 -0
  20. package/styles/components/_badges.scss +317 -0
  21. package/styles/components/_card-actions.scss +169 -0
  22. package/styles/components/_card-footer.scss +47 -0
  23. package/styles/components/_component-styles.scss +205 -0
  24. package/styles/components/_empty-state.scss +630 -0
  25. package/styles/components/_hero-card.scss +422 -0
  26. package/styles/components/_image-fallback.scss +28 -0
  27. package/styles/components/_streaming-effects.scss +518 -0
  28. package/styles/components/cards/_ai-card.scss +718 -0
  29. package/styles/components/sections/_all-sections.generated.scss +41 -0
  30. package/styles/components/sections/_all-sections.scss +1086 -0
  31. package/styles/components/sections/_balanced-compact-system.scss +186 -0
  32. package/styles/components/sections/_compact-mixins.scss +180 -0
  33. package/styles/components/sections/_component-mixins.scss +454 -0
  34. package/styles/components/sections/_design-system.scss +477 -0
  35. package/styles/components/sections/_design-tokens.scss +308 -0
  36. package/styles/components/sections/_enhanced-design-variables.scss +147 -0
  37. package/styles/components/sections/_master-compact-system.scss +302 -0
  38. package/styles/components/sections/_master-dense-system.scss +239 -0
  39. package/styles/components/sections/_minimalistic-design.scss +268 -0
  40. package/styles/components/sections/_modern-effects.scss +392 -0
  41. package/styles/components/sections/_modern-sections.scss +351 -0
  42. package/styles/components/sections/_perfect-system.scss +204 -0
  43. package/styles/components/sections/_section-animations.scss +331 -0
  44. package/styles/components/sections/_section-shell.scss +337 -0
  45. package/styles/components/sections/_section-types.generated.scss +30 -0
  46. package/styles/components/sections/_sections-all.scss +26 -0
  47. package/styles/components/sections/_sections-base.scss +334 -0
  48. package/styles/components/sections/_typography-system.scss +327 -0
  49. package/styles/components/sections/_ultra-compact-tokens.scss +375 -0
  50. package/styles/components/sections/_unified-section-style.scss +157 -0
  51. package/styles/components/sections/_utility-classes.scss +567 -0
  52. package/styles/components/sections/_visual-effects-library.scss +374 -0
  53. package/styles/core/_animations.scss +1498 -0
  54. package/styles/core/_bootstrap-reset.scss +445 -0
  55. package/styles/core/_color-helpers.scss +46 -0
  56. package/styles/core/_global-unified.scss +118 -0
  57. package/styles/core/_global.scss +73 -0
  58. package/styles/core/_mixins.scss +491 -0
  59. package/styles/core/_surface-layers.scss +76 -0
  60. package/styles/core/_utilities.scss +326 -0
  61. package/styles/core/_variables-unified.scss +57 -0
  62. package/styles/core/_variables.scss +36 -0
  63. package/styles/core/variables/_colors-source.scss +34 -0
  64. package/styles/core/variables/_colors-unified.scss +26 -0
  65. package/styles/core/variables/_colors.scss +21 -0
  66. package/styles/critical.scss +353 -0
  67. package/styles/design-system/_compact-theme.scss +159 -0
  68. package/styles/design-system/_section-base.scss +426 -0
  69. package/styles/design-system/_tokens.scss +237 -0
  70. package/styles/design-system/_unified-sections.scss +215 -0
  71. package/styles/layout/_feature-grid.scss +322 -0
  72. package/styles/layout/_masonry.scss +734 -0
  73. package/styles/layout/_tilt.scss +244 -0
  74. package/styles/micro-interactions.scss +583 -0
  75. package/styles/mixins/_section-mixins.scss +280 -0
  76. package/styles/non-critical.scss +643 -0
  77. package/styles/reset/_framework-reset.scss +457 -0
  78. package/styles/reset/_index.scss +14 -0
  79. package/styles/reset/_shadow-reset.scss +383 -0
  80. package/styles/responsive.scss +326 -0
  81. package/styles/themes.scss +573 -0
  82. package/styles/tokens/_index.scss +92 -0
  83. package/styles/tokens/_master.scss +1404 -0
  84. package/styles/tokens/_section-tokens.generated.scss +140 -0
  85. package/postcss.config.js +0 -81
  86. package/section-registry.json +0 -3864
  87. package/section-registry.schema.json +0 -264
@@ -0,0 +1,630 @@
1
+ // ============================================
2
+ // EMPTY STATE ANIMATION
3
+ // ============================================
4
+ //
5
+ // Animated empty state for AI Card Renderer
6
+ // Shows while waiting for content during "thinking" phase
7
+ //
8
+ // ============================================
9
+
10
+ /* Card container wrapper */
11
+ .card-container-wrapper {
12
+ width: 100%;
13
+ }
14
+
15
+ .glow-container {
16
+ width: 100%;
17
+ }
18
+
19
+ .tilt-container {
20
+ width: 100%;
21
+ }
22
+
23
+ /* Utility classes for Shadow DOM (Tailwind not available) */
24
+ .w-full {
25
+ width: 100%;
26
+ }
27
+ .h-full {
28
+ height: 100%;
29
+ }
30
+ .flex-1 {
31
+ flex: 1 1 0%;
32
+ }
33
+ .min-h-0 {
34
+ min-height: 0;
35
+ }
36
+ .max-w-none {
37
+ max-width: none;
38
+ }
39
+
40
+ /* Animated Empty State */
41
+ .card-empty-state {
42
+ position: relative;
43
+ display: flex;
44
+ flex-direction: column;
45
+ align-items: center;
46
+ justify-content: center;
47
+ min-height: 100%;
48
+ height: 100%;
49
+ padding: 4rem 2rem;
50
+ border-radius: 1.5rem;
51
+ overflow: hidden;
52
+ border: 1px solid color-mix(in srgb, var(--color-brand, #ff7900) 20%, transparent);
53
+ background: color-mix(in srgb, var(--background, #0c0c0c) 98%, transparent);
54
+ transition: all 0.3s ease;
55
+ flex: 1;
56
+ box-sizing: border-box;
57
+ }
58
+
59
+ /* Empty state layout for card surface */
60
+ .ai-card-surface--empty-state {
61
+ display: flex;
62
+ flex-direction: column;
63
+ min-height: 100%;
64
+ height: 100%;
65
+ }
66
+
67
+ .ai-card-surface--empty-state .card-empty-state {
68
+ flex: 1 1 auto;
69
+ min-height: 0;
70
+ height: 100%;
71
+ display: flex;
72
+ }
73
+
74
+ .card-empty-state:hover {
75
+ border-color: color-mix(in srgb, var(--color-brand, #ff7900) 30%, transparent);
76
+ background: color-mix(in srgb, var(--background, #0c0c0c) 99%, transparent);
77
+ }
78
+
79
+ .empty-state-background {
80
+ position: absolute;
81
+ inset: 0;
82
+ overflow: hidden;
83
+ pointer-events: none;
84
+ }
85
+
86
+ .empty-state-gradient {
87
+ position: absolute;
88
+ top: 50%;
89
+ left: 50%;
90
+ transform: translate(-50%, -50%);
91
+ width: 150%;
92
+ height: 150%;
93
+ background: radial-gradient(
94
+ circle,
95
+ color-mix(in srgb, var(--color-brand, #ff7900) 6%, transparent) 0%,
96
+ color-mix(in srgb, var(--color-brand, #ff7900) 3%, transparent) 50%,
97
+ transparent 80%
98
+ );
99
+ animation: gradient-pulse 5s ease-in-out infinite;
100
+ opacity: 0.8;
101
+ }
102
+
103
+ @keyframes gradient-pulse {
104
+ 0%,
105
+ 100% {
106
+ opacity: 0.6;
107
+ transform: translate3d(-50%, -50%, 0) scale(1);
108
+ }
109
+ 50% {
110
+ opacity: 0.9;
111
+ transform: translate3d(-50%, -50%, 0) scale(1.05);
112
+ }
113
+ }
114
+
115
+ .empty-state-particles {
116
+ position: absolute;
117
+ inset: 0;
118
+ }
119
+
120
+ /* Empty state particles (different from loading particles) */
121
+ .empty-state-particles .particle {
122
+ position: absolute;
123
+ width: 4px;
124
+ height: 4px;
125
+ border-radius: 50%;
126
+ background: var(--color-brand, #ff7900);
127
+ box-shadow: 0 0 8px var(--color-brand, #ff7900);
128
+ transition:
129
+ transform 0.8s cubic-bezier(0.23, 1, 0.32, 1),
130
+ opacity 0.5s ease;
131
+ will-change: transform, opacity;
132
+ top: 50%;
133
+ left: 50%;
134
+ margin-left: -2px;
135
+ margin-top: -2px;
136
+ pointer-events: none;
137
+ opacity: 0.7;
138
+ }
139
+
140
+ .empty-state-particles .particle:nth-child(odd) {
141
+ width: 5px;
142
+ height: 5px;
143
+ background: var(--color-brand, #ff7900);
144
+ box-shadow: 0 0 10px var(--color-brand, #ff7900);
145
+ opacity: 0.8;
146
+ }
147
+
148
+ .empty-state-particles .particle:nth-child(even) {
149
+ width: 3px;
150
+ height: 3px;
151
+ background: var(--color-brand, #ff7900);
152
+ box-shadow: 0 0 6px var(--color-brand, #ff7900);
153
+ opacity: 0.6;
154
+ }
155
+
156
+ .empty-state-content {
157
+ position: relative;
158
+ z-index: 1;
159
+ display: flex;
160
+ flex-direction: column;
161
+ align-items: center;
162
+ justify-content: center;
163
+ text-align: center;
164
+ gap: 1rem;
165
+ max-width: 420px;
166
+ width: 100%;
167
+ transition: transform 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);
168
+ will-change: transform;
169
+ }
170
+
171
+ .empty-state-icon-wrapper {
172
+ position: relative;
173
+ display: flex;
174
+ align-items: center;
175
+ justify-content: center;
176
+ width: 88px;
177
+ height: 88px;
178
+ }
179
+
180
+ .empty-state-icon-ring {
181
+ position: absolute;
182
+ inset: -8px;
183
+ border: 1.5px solid color-mix(in srgb, var(--color-brand, #ff7900) 25%, transparent);
184
+ border-radius: 50%;
185
+ animation: ring-pulse 3s ease-in-out infinite;
186
+ }
187
+
188
+ .empty-state-icon-pulse {
189
+ position: absolute;
190
+ inset: -16px;
191
+ border: 1px solid color-mix(in srgb, var(--color-brand, #ff7900) 15%, transparent);
192
+ border-radius: 50%;
193
+ animation: ring-pulse 3s ease-in-out infinite 0.75s;
194
+ }
195
+
196
+ @keyframes ring-pulse {
197
+ 0%,
198
+ 100% {
199
+ opacity: 0.4;
200
+ transform: scale(1);
201
+ }
202
+ 50% {
203
+ opacity: 0.7;
204
+ transform: scale(1.08);
205
+ }
206
+ }
207
+
208
+ .empty-state-icon {
209
+ position: relative;
210
+ z-index: 1;
211
+ color: var(--color-brand, #ff7900);
212
+ animation: icon-float 4s ease-in-out infinite;
213
+ filter: drop-shadow(0 2px 8px color-mix(in srgb, var(--color-brand, #ff7900) 25%, transparent));
214
+ opacity: 0.95;
215
+ }
216
+
217
+ @keyframes icon-float {
218
+ 0%,
219
+ 100% {
220
+ transform: translate3d(0, 0, 0) rotate(0deg);
221
+ }
222
+ 25% {
223
+ transform: translate3d(0, -6px, 0) rotate(-3deg);
224
+ }
225
+ 50% {
226
+ transform: translate3d(0, -10px, 0) rotate(0deg);
227
+ }
228
+ 75% {
229
+ transform: translate3d(0, -6px, 0) rotate(3deg);
230
+ }
231
+ }
232
+
233
+ .empty-state-text {
234
+ display: flex;
235
+ flex-direction: column;
236
+ align-items: center;
237
+ justify-content: center;
238
+ gap: 0.75rem;
239
+ width: 100%;
240
+ }
241
+
242
+ .empty-state-title {
243
+ font-size: 1.75rem;
244
+ font-weight: 700;
245
+ color: var(--foreground, #ffffff);
246
+ margin: 0;
247
+ letter-spacing: -0.03em;
248
+ line-height: 1.2;
249
+ text-align: center;
250
+ animation: fade-in-up 0.6s ease-out 0.2s both;
251
+ }
252
+
253
+ .empty-state-message-container {
254
+ min-height: 2.5rem;
255
+ display: flex;
256
+ align-items: center;
257
+ justify-content: center;
258
+ width: 100%;
259
+ }
260
+
261
+ .empty-state-message {
262
+ font-size: 1rem;
263
+ color: var(--color-brand, #ff7900);
264
+ margin: 0;
265
+ line-height: 1.6;
266
+ font-weight: 500;
267
+ font-style: italic;
268
+ text-align: center;
269
+ animation: fade-in-up 0.6s ease-out 0.4s both;
270
+ letter-spacing: 0.01em;
271
+ }
272
+
273
+ @keyframes fade-in-up {
274
+ from {
275
+ opacity: 0;
276
+ transform: translate3d(0, 10px, 0);
277
+ }
278
+ to {
279
+ opacity: 1;
280
+ transform: translate3d(0, 0, 0);
281
+ }
282
+ }
283
+
284
+ /* Legacy empty state (kept for backward compatibility) */
285
+ .card-empty-state-legacy {
286
+ min-height: 200px;
287
+ display: flex;
288
+ align-items: center;
289
+ justify-content: center;
290
+ padding: 3rem;
291
+ background: linear-gradient(
292
+ 135deg,
293
+ color-mix(in srgb, var(--color-brand, #ff7900) 5%, transparent) 0%,
294
+ color-mix(in srgb, var(--background, #0c0c0c) 98%, transparent) 50%,
295
+ transparent 100%
296
+ );
297
+ border-radius: 1.5rem;
298
+ border: 1px dashed color-mix(in srgb, var(--color-brand, #ff7900) 20%, transparent);
299
+ }
300
+
301
+ .empty-state-box {
302
+ text-align: center;
303
+ max-width: 320px;
304
+ }
305
+
306
+ .empty-state-icon-legacy {
307
+ display: flex;
308
+ justify-content: center;
309
+ margin-bottom: 1.5rem;
310
+ color: var(--color-brand, #ff7900);
311
+ opacity: 0.7;
312
+ }
313
+
314
+ .empty-state-message-legacy {
315
+ font-size: 0.95rem;
316
+ color: var(--muted-foreground, #a1a1aa);
317
+ line-height: 1.6;
318
+ margin: 0;
319
+ }
320
+
321
+ /* Generating State - fills entire card surface */
322
+ .ai-card-surface.has-loading-overlay {
323
+ display: flex;
324
+ align-items: center;
325
+ justify-content: center;
326
+ min-height: 500px;
327
+ position: relative;
328
+ overflow: hidden;
329
+ background: radial-gradient(
330
+ circle at 50% 50%,
331
+ color-mix(in srgb, var(--color-brand, #ff7900) 5%, transparent) 0%,
332
+ transparent 70%
333
+ );
334
+ animation:
335
+ generating-bg-pulse 3s ease-in-out infinite,
336
+ card-generating-pulse 2s ease-in-out infinite;
337
+ }
338
+
339
+ @keyframes card-generating-pulse {
340
+ 0%,
341
+ 100% {
342
+ box-shadow:
343
+ inset 0 1px 3px color-mix(in srgb, var(--color-brand, #ff7900) 8%, transparent),
344
+ 0 4px 20px rgba(0, 0, 0, 0.15),
345
+ 0 0 0 transparent;
346
+ }
347
+ 50% {
348
+ box-shadow:
349
+ inset 0 1px 3px color-mix(in srgb, var(--color-brand, #ff7900) 15%, transparent),
350
+ 0 4px 20px rgba(0, 0, 0, 0.15),
351
+ 0 0 30px color-mix(in srgb, var(--color-brand, #ff7900) 20%, transparent);
352
+ }
353
+ }
354
+
355
+ @keyframes generating-bg-pulse {
356
+ 0%,
357
+ 100% {
358
+ background: radial-gradient(
359
+ circle at 50% 50%,
360
+ color-mix(in srgb, var(--color-brand, #ff7900) 5%, transparent) 0%,
361
+ transparent 70%
362
+ );
363
+ }
364
+ 50% {
365
+ background: radial-gradient(
366
+ circle at 50% 50%,
367
+ color-mix(in srgb, var(--color-brand, #ff7900) 12%, transparent) 0%,
368
+ transparent 70%
369
+ );
370
+ }
371
+ }
372
+
373
+ .generating-content {
374
+ position: relative;
375
+ z-index: 2;
376
+ text-align: center;
377
+ }
378
+
379
+ .generating-shimmer {
380
+ position: absolute;
381
+ top: 0;
382
+ left: -100%;
383
+ width: 100%;
384
+ height: 100%;
385
+ background: linear-gradient(
386
+ 90deg,
387
+ transparent 0%,
388
+ color-mix(in srgb, var(--color-brand, #ff7900) 15%, transparent) 50%,
389
+ transparent 100%
390
+ );
391
+ animation: shimmer-sweep 2.5s ease-in-out infinite;
392
+ pointer-events: none;
393
+ z-index: 1;
394
+ }
395
+
396
+ @keyframes shimmer-sweep {
397
+ 0% {
398
+ left: -100%;
399
+ }
400
+ 100% {
401
+ left: 100%;
402
+ }
403
+ }
404
+
405
+ .generating-text {
406
+ font-size: 1.125rem;
407
+ font-weight: 600;
408
+ color: var(--foreground, #ffffff);
409
+ margin: 0;
410
+ background: linear-gradient(
411
+ 90deg,
412
+ var(--foreground, #ffffff) 0%,
413
+ var(--color-brand, #ff7900) 50%,
414
+ var(--foreground, #ffffff) 100%
415
+ );
416
+ background-size: 200% 100%;
417
+ background-clip: text;
418
+ -webkit-background-clip: text;
419
+ -webkit-text-fill-color: transparent;
420
+ animation: text-shimmer-flow 2.5s ease-in-out infinite;
421
+ position: relative;
422
+ z-index: 2;
423
+ letter-spacing: 0.02em;
424
+ }
425
+
426
+ @keyframes text-shimmer-flow {
427
+ 0%,
428
+ 100% {
429
+ background-position: -200% 0;
430
+ }
431
+ 50% {
432
+ background-position: 200% 0;
433
+ }
434
+ }
435
+
436
+ /* Loading particles (for loading overlay) */
437
+ .loading-particles {
438
+ position: absolute;
439
+ inset: 0;
440
+ overflow: hidden;
441
+ pointer-events: none;
442
+ }
443
+
444
+ .particle {
445
+ position: absolute;
446
+ width: 4px;
447
+ height: 4px;
448
+ border-radius: 50%;
449
+ background: var(--color-brand, #ff7900);
450
+ box-shadow: 0 0 6px var(--color-brand, #ff7900);
451
+ animation: particle-float 4s ease-in-out infinite;
452
+ }
453
+
454
+ .particle:nth-child(1) {
455
+ top: 10%;
456
+ left: 20%;
457
+ animation-delay: 0s;
458
+ }
459
+ .particle:nth-child(2) {
460
+ top: 30%;
461
+ left: 80%;
462
+ animation-delay: 0.5s;
463
+ }
464
+ .particle:nth-child(3) {
465
+ top: 70%;
466
+ left: 30%;
467
+ animation-delay: 1s;
468
+ }
469
+ .particle:nth-child(4) {
470
+ top: 80%;
471
+ left: 70%;
472
+ animation-delay: 1.5s;
473
+ }
474
+ .particle:nth-child(5) {
475
+ top: 20%;
476
+ left: 50%;
477
+ animation-delay: 0.3s;
478
+ }
479
+ .particle:nth-child(6) {
480
+ top: 60%;
481
+ left: 15%;
482
+ animation-delay: 0.9s;
483
+ }
484
+ .particle:nth-child(7) {
485
+ top: 50%;
486
+ left: 90%;
487
+ animation-delay: 1.8s;
488
+ }
489
+ .particle:nth-child(8) {
490
+ top: 15%;
491
+ left: 60%;
492
+ animation-delay: 2.1s;
493
+ }
494
+
495
+ @keyframes particle-float {
496
+ 0%,
497
+ 100% {
498
+ transform: translateY(0) translateX(0) scale(1);
499
+ opacity: 0.3;
500
+ }
501
+ 25% {
502
+ transform: translateY(-30px) translateX(20px) scale(1.2);
503
+ opacity: 0.7;
504
+ }
505
+ 50% {
506
+ transform: translateY(-60px) translateX(-10px) scale(0.8);
507
+ opacity: 1;
508
+ }
509
+ 75% {
510
+ transform: translateY(-30px) translateX(15px) scale(1.1);
511
+ opacity: 0.6;
512
+ }
513
+ }
514
+
515
+ .loading-content {
516
+ position: relative;
517
+ z-index: 2;
518
+ display: flex;
519
+ flex-direction: column;
520
+ align-items: center;
521
+ gap: 1.5rem;
522
+ }
523
+
524
+ .loading-spinner {
525
+ width: 64px;
526
+ height: 64px;
527
+ position: relative;
528
+ }
529
+
530
+ .spinner-svg {
531
+ width: 100%;
532
+ height: 100%;
533
+ animation: spinner-rotate 1.5s linear infinite;
534
+ transform-origin: center;
535
+ }
536
+
537
+ .spinner-circle {
538
+ stroke-dasharray: 125.6;
539
+ stroke-dashoffset: 31.4;
540
+ stroke: var(--color-brand, #ff7900);
541
+ animation: spinner-dash 1.5s ease-in-out infinite;
542
+ }
543
+
544
+ @keyframes spinner-rotate {
545
+ 0% {
546
+ transform: rotate(0deg);
547
+ }
548
+ 100% {
549
+ transform: rotate(360deg);
550
+ }
551
+ }
552
+
553
+ @keyframes spinner-dash {
554
+ 0% {
555
+ stroke-dasharray: 1, 125.6;
556
+ stroke-dashoffset: 0;
557
+ }
558
+ 50% {
559
+ stroke-dasharray: 94.2, 125.6;
560
+ stroke-dashoffset: -31.4;
561
+ }
562
+ 100% {
563
+ stroke-dasharray: 94.2, 125.6;
564
+ stroke-dashoffset: -125.6;
565
+ }
566
+ }
567
+
568
+ .loading-text {
569
+ text-align: center;
570
+ }
571
+
572
+ .loading-title {
573
+ font-size: 1.25rem;
574
+ font-weight: 600;
575
+ color: var(--foreground, #ffffff);
576
+ margin-bottom: 0.5rem;
577
+ background: linear-gradient(
578
+ 90deg,
579
+ var(--foreground, #ffffff) 0%,
580
+ var(--color-brand, #ff7900) 50%,
581
+ var(--foreground, #ffffff) 100%
582
+ );
583
+ background-size: 200% 100%;
584
+ background-clip: text;
585
+ -webkit-background-clip: text;
586
+ -webkit-text-fill-color: transparent;
587
+ animation: text-shimmer 2s ease-in-out infinite;
588
+ }
589
+
590
+ .loading-subtitle {
591
+ font-size: 0.875rem;
592
+ color: var(--muted-foreground, #a1a1aa);
593
+ margin: 0;
594
+ }
595
+
596
+ @keyframes text-shimmer {
597
+ 0%,
598
+ 100% {
599
+ background-position: -200% 0;
600
+ }
601
+ 50% {
602
+ background-position: 200% 0;
603
+ }
604
+ }
605
+
606
+ .loading-wave {
607
+ position: absolute;
608
+ bottom: 0;
609
+ left: 0;
610
+ right: 0;
611
+ height: 4px;
612
+ background: linear-gradient(
613
+ 90deg,
614
+ transparent 0%,
615
+ var(--color-brand, #ff7900) 25%,
616
+ var(--color-brand, #ff7900) 75%,
617
+ transparent 100%
618
+ );
619
+ background-size: 200% 100%;
620
+ animation: wave-slide 2s ease-in-out infinite;
621
+ }
622
+
623
+ @keyframes wave-slide {
624
+ 0% {
625
+ background-position: -200% 0;
626
+ }
627
+ 100% {
628
+ background-position: 200% 0;
629
+ }
630
+ }