@elsapiens/styles 0.1.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,892 @@
1
+ /* @elsapiens/sdk Animated Backgrounds
2
+ *
3
+ * Visible animated backgrounds with large floating shapes.
4
+ * Apply these classes to create atmospheric depth.
5
+ *
6
+ * Available backgrounds:
7
+ * - .el-bg-aurora - Large flowing aurora bands
8
+ * - .el-bg-mesh - Large floating gradient orbs
9
+ * - .el-bg-waves - Flowing wave curves
10
+ * - .el-bg-glow - Pulsing glow orbs
11
+ * - .el-bg-dots - Floating dot pattern
12
+ * - .el-bg-gradient-shift - Color shifting gradient
13
+ * - .el-bg-northern-lights - Dramatic aurora effect
14
+ * - .el-bg-particles - Floating particles
15
+ * - .el-bg-blobs - Large moving blob shapes
16
+ *
17
+ * For fixed backgrounds that don't scroll with content,
18
+ * apply the class to a fixed wrapper element or use
19
+ * background-attachment: fixed on the body.
20
+ */
21
+
22
+ /* ============================================
23
+ Aurora / Northern Lights Effect
24
+ Large flowing gradient bands
25
+ ============================================ */
26
+ .el-bg-aurora {
27
+ position: relative;
28
+ }
29
+
30
+ .el-bg-aurora::before {
31
+ content: '';
32
+ position: fixed;
33
+ inset: 0;
34
+ z-index: 0;
35
+ pointer-events: none;
36
+ opacity: 0.5;
37
+ background:
38
+ radial-gradient(ellipse 80% 50% at 20% 30%, hsl(var(--wisteria-400)) 0%, transparent 50%),
39
+ radial-gradient(ellipse 60% 70% at 70% 60%, hsl(var(--wisteria-500)) 0%, transparent 50%),
40
+ radial-gradient(ellipse 90% 40% at 50% 80%, hsl(var(--wisteria-300)) 0%, transparent 50%);
41
+ animation: aurora-drift 15s ease-in-out infinite;
42
+ filter: blur(40px);
43
+ }
44
+
45
+ .el-bg-aurora::after {
46
+ content: '';
47
+ position: fixed;
48
+ inset: 0;
49
+ z-index: 0;
50
+ pointer-events: none;
51
+ opacity: 0.2;
52
+ background:
53
+ radial-gradient(ellipse 70% 60% at 80% 20%, hsl(var(--wisteria-300) / 0.5) 0%, transparent 50%),
54
+ radial-gradient(ellipse 50% 80% at 30% 70%, hsl(var(--wisteria-500) / 0.4) 0%, transparent 50%);
55
+ animation: aurora-drift 20s ease-in-out infinite reverse;
56
+ filter: blur(40px);
57
+ }
58
+
59
+ @keyframes aurora-drift {
60
+ 0%, 100% {
61
+ transform: translate(0, 0) scale(1);
62
+ }
63
+ 25% {
64
+ transform: translate(5%, -3%) scale(1.05);
65
+ }
66
+ 50% {
67
+ transform: translate(-3%, 5%) scale(1.1);
68
+ }
69
+ 75% {
70
+ transform: translate(-5%, -2%) scale(1.02);
71
+ }
72
+ }
73
+
74
+ .dark .el-bg-aurora::before {
75
+ opacity: 0.35;
76
+ }
77
+
78
+ .dark .el-bg-aurora::after {
79
+ opacity: 0.3;
80
+ }
81
+
82
+ /* ============================================
83
+ Mesh Gradient Background
84
+ Large floating gradient orbs that drift around
85
+ ============================================ */
86
+ .el-bg-mesh {
87
+ position: relative;
88
+ }
89
+
90
+ .el-bg-mesh::before {
91
+ content: '';
92
+ position: fixed;
93
+ width: 700px;
94
+ height: 700px;
95
+ top: -150px;
96
+ left: -100px;
97
+ z-index: 0;
98
+ pointer-events: none;
99
+ opacity: 0.4;
100
+ background: radial-gradient(circle, hsl(var(--wisteria-400)) 0%, transparent 70%);
101
+ border-radius: 50%;
102
+ filter: blur(60px);
103
+ animation: mesh-orb-1 25s ease-in-out infinite;
104
+ }
105
+
106
+ .el-bg-mesh::after {
107
+ content: '';
108
+ position: fixed;
109
+ width: 600px;
110
+ height: 600px;
111
+ bottom: -100px;
112
+ right: -50px;
113
+ z-index: 0;
114
+ pointer-events: none;
115
+ opacity: 0.35;
116
+ background: radial-gradient(circle, hsl(var(--wisteria-500)) 0%, transparent 70%);
117
+ border-radius: 50%;
118
+ filter: blur(50px);
119
+ animation: mesh-orb-2 30s ease-in-out infinite;
120
+ }
121
+
122
+ @keyframes mesh-orb-1 {
123
+ 0%, 100% {
124
+ transform: translate(0, 0) scale(1);
125
+ }
126
+ 33% {
127
+ transform: translate(100px, 80px) scale(1.2);
128
+ }
129
+ 66% {
130
+ transform: translate(-50px, 120px) scale(0.9);
131
+ }
132
+ }
133
+
134
+ @keyframes mesh-orb-2 {
135
+ 0%, 100% {
136
+ transform: translate(0, 0) scale(1);
137
+ }
138
+ 33% {
139
+ transform: translate(-80px, -100px) scale(1.1);
140
+ }
141
+ 66% {
142
+ transform: translate(60px, -60px) scale(1.15);
143
+ }
144
+ }
145
+
146
+ .dark .el-bg-mesh::before {
147
+ opacity: 0.5;
148
+ }
149
+
150
+ .dark .el-bg-mesh::after {
151
+ opacity: 0.45;
152
+ }
153
+
154
+ /* ============================================
155
+ Wave Animation
156
+ Large flowing curves that sweep across
157
+ ============================================ */
158
+ .el-bg-waves {
159
+ position: relative;
160
+ }
161
+
162
+ .el-bg-waves::before {
163
+ content: '';
164
+ position: fixed;
165
+ width: 200%;
166
+ height: 500px;
167
+ bottom: -50px;
168
+ left: -50%;
169
+ z-index: 0;
170
+ pointer-events: none;
171
+ opacity: 0.35;
172
+ background:
173
+ radial-gradient(ellipse 40% 100% at 20% 100%, hsl(var(--wisteria-400)) 0%, transparent 70%),
174
+ radial-gradient(ellipse 50% 100% at 60% 100%, hsl(var(--wisteria-500)) 0%, transparent 70%),
175
+ radial-gradient(ellipse 35% 100% at 90% 100%, hsl(var(--wisteria-300)) 0%, transparent 70%);
176
+ filter: blur(40px);
177
+ animation: wave-sweep 12s ease-in-out infinite;
178
+ }
179
+
180
+ .el-bg-waves::after {
181
+ content: '';
182
+ position: fixed;
183
+ width: 150%;
184
+ height: 400px;
185
+ top: -50px;
186
+ left: -25%;
187
+ z-index: 0;
188
+ pointer-events: none;
189
+ opacity: 0.3;
190
+ background:
191
+ radial-gradient(ellipse 60% 100% at 30% 0%, hsl(var(--wisteria-300)) 0%, transparent 60%),
192
+ radial-gradient(ellipse 40% 100% at 80% 0%, hsl(var(--wisteria-500)) 0%, transparent 60%);
193
+ filter: blur(50px);
194
+ animation: wave-sweep-top 15s ease-in-out infinite reverse;
195
+ }
196
+
197
+ @keyframes wave-sweep {
198
+ 0%, 100% {
199
+ transform: translateX(0) scaleY(1);
200
+ }
201
+ 50% {
202
+ transform: translateX(10%) scaleY(1.2);
203
+ }
204
+ }
205
+
206
+ @keyframes wave-sweep-top {
207
+ 0%, 100% {
208
+ transform: translateX(0) scaleY(1);
209
+ }
210
+ 50% {
211
+ transform: translateX(-8%) scaleY(1.15);
212
+ }
213
+ }
214
+
215
+ .dark .el-bg-waves::before {
216
+ opacity: 0.45;
217
+ }
218
+
219
+ .dark .el-bg-waves::after {
220
+ opacity: 0.4;
221
+ }
222
+
223
+ /* ============================================
224
+ Glow Effect
225
+ Large pulsing orbs in corners
226
+ ============================================ */
227
+ .el-bg-glow {
228
+ position: relative;
229
+ }
230
+
231
+ .el-bg-glow::before {
232
+ content: '';
233
+ position: fixed;
234
+ width: 500px;
235
+ height: 500px;
236
+ top: -200px;
237
+ right: -150px;
238
+ z-index: 0;
239
+ pointer-events: none;
240
+ opacity: 0.2;
241
+ background: radial-gradient(circle, hsl(var(--wisteria-400)) 0%, transparent 50%);
242
+ border-radius: 50%;
243
+ filter: blur(50px);
244
+ animation: glow-pulse 6s ease-in-out infinite;
245
+ }
246
+
247
+ .el-bg-glow::after {
248
+ content: '';
249
+ position: fixed;
250
+ width: 400px;
251
+ height: 400px;
252
+ bottom: -100px;
253
+ left: -100px;
254
+ z-index: 0;
255
+ pointer-events: none;
256
+ opacity: 0.15;
257
+ background: radial-gradient(circle, hsl(var(--wisteria-500)) 0%, transparent 50%);
258
+ border-radius: 50%;
259
+ filter: blur(40px);
260
+ animation: glow-pulse 8s ease-in-out infinite 3s;
261
+ }
262
+
263
+ @keyframes glow-pulse {
264
+ 0%, 100% {
265
+ transform: scale(1);
266
+ opacity: 0.2;
267
+ }
268
+ 50% {
269
+ transform: scale(1.3);
270
+ opacity: 0.35;
271
+ }
272
+ }
273
+
274
+ .dark .el-bg-glow::before,
275
+ .dark .el-bg-glow::after {
276
+ opacity: 0.3;
277
+ }
278
+
279
+ /* ============================================
280
+ Animated Dots Pattern
281
+ Large dots that slowly float
282
+ ============================================ */
283
+ .el-bg-dots {
284
+ position: relative;
285
+ }
286
+
287
+ .el-bg-dots::before {
288
+ content: '';
289
+ position: fixed;
290
+ inset: 0;
291
+ z-index: 0;
292
+ pointer-events: none;
293
+ opacity: 0.25;
294
+ background-image:
295
+ radial-gradient(circle at 4px 4px, hsl(var(--wisteria-400)) 4px, transparent 4px);
296
+ background-size: 50px 50px;
297
+ animation: dots-float 50s linear infinite;
298
+ }
299
+
300
+ .el-bg-dots::after {
301
+ content: '';
302
+ position: fixed;
303
+ inset: 0;
304
+ z-index: 0;
305
+ pointer-events: none;
306
+ opacity: 0.2;
307
+ background-image:
308
+ radial-gradient(circle at 3px 3px, hsl(var(--wisteria-500)) 3px, transparent 3px);
309
+ background-size: 70px 70px;
310
+ animation: dots-float 70s linear infinite reverse;
311
+ }
312
+
313
+ @keyframes dots-float {
314
+ 0% {
315
+ transform: translate(0, 0);
316
+ }
317
+ 100% {
318
+ transform: translate(60px, 60px);
319
+ }
320
+ }
321
+
322
+ .dark .el-bg-dots::before {
323
+ opacity: 0.35;
324
+ }
325
+
326
+ .dark .el-bg-dots::after {
327
+ opacity: 0.3;
328
+ }
329
+
330
+ /* ============================================
331
+ Gradient Shift
332
+ Large color bands that shift and move
333
+ ============================================ */
334
+ .el-bg-gradient-shift {
335
+ position: relative;
336
+ }
337
+
338
+ .el-bg-gradient-shift::before {
339
+ content: '';
340
+ position: fixed;
341
+ inset: 0;
342
+ z-index: 0;
343
+ pointer-events: none;
344
+ opacity: 0.15;
345
+ background: linear-gradient(
346
+ 135deg,
347
+ hsl(var(--wisteria-300) / 0.8) 0%,
348
+ hsl(var(--wisteria-400) / 0.6) 25%,
349
+ transparent 50%,
350
+ hsl(var(--wisteria-500) / 0.6) 75%,
351
+ hsl(var(--wisteria-400) / 0.8) 100%
352
+ );
353
+ background-size: 200% 200%;
354
+ animation: gradient-shift 20s ease infinite;
355
+ }
356
+
357
+ .el-bg-gradient-shift::after {
358
+ content: '';
359
+ position: fixed;
360
+ inset: 0;
361
+ z-index: 0;
362
+ pointer-events: none;
363
+ opacity: 0.1;
364
+ background: linear-gradient(
365
+ -45deg,
366
+ transparent 0%,
367
+ hsl(var(--wisteria-400) / 0.5) 30%,
368
+ transparent 50%,
369
+ hsl(var(--wisteria-300) / 0.5) 70%,
370
+ transparent 100%
371
+ );
372
+ background-size: 200% 200%;
373
+ animation: gradient-shift 25s ease infinite reverse;
374
+ }
375
+
376
+ @keyframes gradient-shift {
377
+ 0%, 100% {
378
+ background-position: 0% 0%;
379
+ }
380
+ 25% {
381
+ background-position: 100% 0%;
382
+ }
383
+ 50% {
384
+ background-position: 100% 100%;
385
+ }
386
+ 75% {
387
+ background-position: 0% 100%;
388
+ }
389
+ }
390
+
391
+ .dark .el-bg-gradient-shift::before {
392
+ opacity: 0.22;
393
+ }
394
+
395
+ .dark .el-bg-gradient-shift::after {
396
+ opacity: 0.15;
397
+ }
398
+
399
+ /* ============================================
400
+ Northern Lights Full Effect
401
+ Dramatic large aurora bands
402
+ ============================================ */
403
+ .el-bg-northern-lights {
404
+ position: relative;
405
+ }
406
+
407
+ .el-bg-northern-lights::before {
408
+ content: '';
409
+ position: fixed;
410
+ width: 150%;
411
+ height: 100%;
412
+ top: 0;
413
+ left: -25%;
414
+ z-index: 0;
415
+ pointer-events: none;
416
+ opacity: 0.25;
417
+ background:
418
+ radial-gradient(ellipse 100% 50% at 30% 20%, hsl(160 70% 45% / 0.6) 0%, transparent 50%),
419
+ radial-gradient(ellipse 80% 60% at 60% 40%, hsl(var(--wisteria-400) / 0.7) 0%, transparent 50%),
420
+ radial-gradient(ellipse 90% 40% at 80% 70%, hsl(280 70% 55% / 0.5) 0%, transparent 50%);
421
+ filter: blur(80px);
422
+ animation: northern-lights-dance 12s ease-in-out infinite;
423
+ }
424
+
425
+ .el-bg-northern-lights::after {
426
+ content: '';
427
+ position: fixed;
428
+ width: 120%;
429
+ height: 80%;
430
+ top: 10%;
431
+ left: -10%;
432
+ z-index: 0;
433
+ pointer-events: none;
434
+ opacity: 0.2;
435
+ background:
436
+ radial-gradient(ellipse 60% 80% at 25% 50%, hsl(var(--wisteria-300) / 0.6) 0%, transparent 50%),
437
+ radial-gradient(ellipse 70% 50% at 75% 30%, hsl(200 70% 50% / 0.5) 0%, transparent 50%);
438
+ filter: blur(60px);
439
+ animation: northern-lights-shimmer 10s ease-in-out infinite 2s;
440
+ }
441
+
442
+ @keyframes northern-lights-dance {
443
+ 0%, 100% {
444
+ transform: translateY(0) scaleY(1) rotate(0deg);
445
+ }
446
+ 25% {
447
+ transform: translateY(-30px) scaleY(1.1) rotate(1deg);
448
+ }
449
+ 50% {
450
+ transform: translateY(20px) scaleY(0.95) rotate(-1deg);
451
+ }
452
+ 75% {
453
+ transform: translateY(-15px) scaleY(1.05) rotate(0.5deg);
454
+ }
455
+ }
456
+
457
+ @keyframes northern-lights-shimmer {
458
+ 0%, 100% {
459
+ transform: translateX(0) scale(1);
460
+ opacity: 0.2;
461
+ }
462
+ 50% {
463
+ transform: translateX(30px) scale(1.1);
464
+ opacity: 0.35;
465
+ }
466
+ }
467
+
468
+ .dark .el-bg-northern-lights::before {
469
+ opacity: 0.4;
470
+ }
471
+
472
+ .dark .el-bg-northern-lights::after {
473
+ opacity: 0.35;
474
+ }
475
+
476
+ /* ============================================
477
+ Particles Effect
478
+ Larger floating orbs that drift
479
+ ============================================ */
480
+ .el-bg-particles {
481
+ position: relative;
482
+ }
483
+
484
+ .el-bg-particles::before {
485
+ content: '';
486
+ position: fixed;
487
+ inset: 0;
488
+ z-index: 0;
489
+ pointer-events: none;
490
+ background:
491
+ radial-gradient(circle 80px at 10% 20%, hsl(var(--wisteria-400) / 0.3) 0%, transparent 100%),
492
+ radial-gradient(circle 60px at 30% 70%, hsl(var(--wisteria-500) / 0.25) 0%, transparent 100%),
493
+ radial-gradient(circle 100px at 70% 30%, hsl(var(--wisteria-300) / 0.3) 0%, transparent 100%),
494
+ radial-gradient(circle 50px at 85% 80%, hsl(var(--wisteria-400) / 0.2) 0%, transparent 100%),
495
+ radial-gradient(circle 70px at 50% 50%, hsl(var(--wisteria-500) / 0.2) 0%, transparent 100%);
496
+ filter: blur(20px);
497
+ animation: particles-drift 30s ease-in-out infinite;
498
+ }
499
+
500
+ .el-bg-particles::after {
501
+ content: '';
502
+ position: fixed;
503
+ inset: 0;
504
+ z-index: 0;
505
+ pointer-events: none;
506
+ background:
507
+ radial-gradient(circle 90px at 20% 80%, hsl(var(--wisteria-300) / 0.25) 0%, transparent 100%),
508
+ radial-gradient(circle 70px at 60% 15%, hsl(var(--wisteria-500) / 0.2) 0%, transparent 100%),
509
+ radial-gradient(circle 55px at 90% 50%, hsl(var(--wisteria-400) / 0.25) 0%, transparent 100%);
510
+ filter: blur(25px);
511
+ animation: particles-drift-reverse 40s ease-in-out infinite;
512
+ }
513
+
514
+ @keyframes particles-drift {
515
+ 0%, 100% {
516
+ transform: translate(0, 0);
517
+ }
518
+ 25% {
519
+ transform: translate(30px, -20px);
520
+ }
521
+ 50% {
522
+ transform: translate(-20px, 30px);
523
+ }
524
+ 75% {
525
+ transform: translate(15px, 15px);
526
+ }
527
+ }
528
+
529
+ @keyframes particles-drift-reverse {
530
+ 0%, 100% {
531
+ transform: translate(0, 0);
532
+ }
533
+ 25% {
534
+ transform: translate(-25px, 25px);
535
+ }
536
+ 50% {
537
+ transform: translate(35px, -15px);
538
+ }
539
+ 75% {
540
+ transform: translate(-10px, -30px);
541
+ }
542
+ }
543
+
544
+ .dark .el-bg-particles::before {
545
+ opacity: 1;
546
+ background:
547
+ radial-gradient(circle 80px at 10% 20%, hsl(var(--wisteria-400) / 0.4) 0%, transparent 100%),
548
+ radial-gradient(circle 60px at 30% 70%, hsl(var(--wisteria-500) / 0.35) 0%, transparent 100%),
549
+ radial-gradient(circle 100px at 70% 30%, hsl(var(--wisteria-300) / 0.4) 0%, transparent 100%),
550
+ radial-gradient(circle 50px at 85% 80%, hsl(var(--wisteria-400) / 0.3) 0%, transparent 100%),
551
+ radial-gradient(circle 70px at 50% 50%, hsl(var(--wisteria-500) / 0.3) 0%, transparent 100%);
552
+ }
553
+
554
+ .dark .el-bg-particles::after {
555
+ opacity: 1;
556
+ background:
557
+ radial-gradient(circle 90px at 20% 80%, hsl(var(--wisteria-300) / 0.35) 0%, transparent 100%),
558
+ radial-gradient(circle 70px at 60% 15%, hsl(var(--wisteria-500) / 0.3) 0%, transparent 100%),
559
+ radial-gradient(circle 55px at 90% 50%, hsl(var(--wisteria-400) / 0.35) 0%, transparent 100%);
560
+ }
561
+
562
+ /* ============================================
563
+ Blobs Effect - Large morphing shapes
564
+ ============================================ */
565
+ .el-bg-blobs {
566
+ position: relative;
567
+ }
568
+
569
+ .el-bg-blobs::before {
570
+ content: '';
571
+ position: fixed;
572
+ width: 500px;
573
+ height: 400px;
574
+ top: -100px;
575
+ left: -100px;
576
+ z-index: 0;
577
+ pointer-events: none;
578
+ opacity: 0.2;
579
+ background: hsl(var(--wisteria-400));
580
+ border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%;
581
+ filter: blur(60px);
582
+ animation: blob-morph-1 20s ease-in-out infinite;
583
+ }
584
+
585
+ .el-bg-blobs::after {
586
+ content: '';
587
+ position: fixed;
588
+ width: 450px;
589
+ height: 350px;
590
+ bottom: -80px;
591
+ right: -80px;
592
+ z-index: 0;
593
+ pointer-events: none;
594
+ opacity: 0.18;
595
+ background: hsl(var(--wisteria-500));
596
+ border-radius: 40% 60% 70% 30% / 40% 70% 30% 60%;
597
+ filter: blur(50px);
598
+ animation: blob-morph-2 25s ease-in-out infinite;
599
+ }
600
+
601
+ @keyframes blob-morph-1 {
602
+ 0%, 100% {
603
+ border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%;
604
+ transform: translate(0, 0) rotate(0deg);
605
+ }
606
+ 25% {
607
+ border-radius: 30% 60% 70% 40% / 50% 60% 30% 60%;
608
+ transform: translate(50px, 30px) rotate(5deg);
609
+ }
610
+ 50% {
611
+ border-radius: 50% 60% 30% 60% / 30% 40% 70% 60%;
612
+ transform: translate(20px, 80px) rotate(-5deg);
613
+ }
614
+ 75% {
615
+ border-radius: 40% 50% 60% 50% / 60% 50% 40% 50%;
616
+ transform: translate(-30px, 40px) rotate(3deg);
617
+ }
618
+ }
619
+
620
+ @keyframes blob-morph-2 {
621
+ 0%, 100% {
622
+ border-radius: 40% 60% 70% 30% / 40% 70% 30% 60%;
623
+ transform: translate(0, 0) rotate(0deg);
624
+ }
625
+ 25% {
626
+ border-radius: 70% 30% 50% 50% / 30% 50% 70% 50%;
627
+ transform: translate(-40px, -50px) rotate(-4deg);
628
+ }
629
+ 50% {
630
+ border-radius: 50% 50% 40% 60% / 60% 40% 50% 50%;
631
+ transform: translate(-80px, -20px) rotate(6deg);
632
+ }
633
+ 75% {
634
+ border-radius: 30% 70% 60% 40% / 50% 60% 40% 60%;
635
+ transform: translate(-20px, -60px) rotate(-3deg);
636
+ }
637
+ }
638
+
639
+ .dark .el-bg-blobs::before {
640
+ opacity: 0.3;
641
+ }
642
+
643
+ .dark .el-bg-blobs::after {
644
+ opacity: 0.28;
645
+ }
646
+
647
+ /* ============================================
648
+ Network Effect - Delicate constellation pattern
649
+ Small dots connected by thin lines that drift
650
+ ============================================ */
651
+ .el-bg-network {
652
+ position: relative;
653
+ }
654
+
655
+ .el-bg-network::before {
656
+ content: '';
657
+ position: fixed;
658
+ inset: 0;
659
+ z-index: 0;
660
+ pointer-events: none;
661
+ opacity: 0.4;
662
+ background:
663
+ /* Small dots - nodes */
664
+ radial-gradient(circle 3px at 12% 18%, hsl(var(--wisteria-400)) 0%, transparent 100%),
665
+ radial-gradient(circle 2px at 28% 12%, hsl(var(--wisteria-500)) 0%, transparent 100%),
666
+ radial-gradient(circle 3px at 45% 22%, hsl(var(--wisteria-400)) 0%, transparent 100%),
667
+ radial-gradient(circle 2px at 62% 15%, hsl(var(--wisteria-300)) 0%, transparent 100%),
668
+ radial-gradient(circle 3px at 78% 28%, hsl(var(--wisteria-500)) 0%, transparent 100%),
669
+ radial-gradient(circle 2px at 88% 18%, hsl(var(--wisteria-400)) 0%, transparent 100%),
670
+ radial-gradient(circle 3px at 18% 42%, hsl(var(--wisteria-300)) 0%, transparent 100%),
671
+ radial-gradient(circle 2px at 35% 48%, hsl(var(--wisteria-500)) 0%, transparent 100%),
672
+ radial-gradient(circle 3px at 55% 38%, hsl(var(--wisteria-400)) 0%, transparent 100%),
673
+ radial-gradient(circle 2px at 72% 52%, hsl(var(--wisteria-300)) 0%, transparent 100%),
674
+ radial-gradient(circle 3px at 85% 45%, hsl(var(--wisteria-500)) 0%, transparent 100%),
675
+ radial-gradient(circle 2px at 22% 68%, hsl(var(--wisteria-400)) 0%, transparent 100%),
676
+ radial-gradient(circle 3px at 42% 72%, hsl(var(--wisteria-300)) 0%, transparent 100%),
677
+ radial-gradient(circle 2px at 58% 65%, hsl(var(--wisteria-500)) 0%, transparent 100%),
678
+ radial-gradient(circle 3px at 75% 78%, hsl(var(--wisteria-400)) 0%, transparent 100%),
679
+ radial-gradient(circle 2px at 92% 72%, hsl(var(--wisteria-300)) 0%, transparent 100%),
680
+ radial-gradient(circle 3px at 15% 88%, hsl(var(--wisteria-500)) 0%, transparent 100%),
681
+ radial-gradient(circle 2px at 38% 92%, hsl(var(--wisteria-400)) 0%, transparent 100%),
682
+ radial-gradient(circle 3px at 65% 85%, hsl(var(--wisteria-300)) 0%, transparent 100%),
683
+ radial-gradient(circle 2px at 82% 95%, hsl(var(--wisteria-500)) 0%, transparent 100%);
684
+ animation: network-drift 20s ease-in-out infinite;
685
+ }
686
+
687
+ .el-bg-network::after {
688
+ content: '';
689
+ position: fixed;
690
+ inset: 0;
691
+ z-index: 0;
692
+ pointer-events: none;
693
+ opacity: 0.2;
694
+ background:
695
+ /* Thin connecting lines */
696
+ linear-gradient(125deg, transparent 11.5%, hsl(var(--wisteria-400) / 0.6) 12%, hsl(var(--wisteria-400) / 0.6) 12.05%, transparent 12.5%),
697
+ linear-gradient(65deg, transparent 27.5%, hsl(var(--wisteria-500) / 0.5) 28%, hsl(var(--wisteria-500) / 0.5) 28.05%, transparent 28.5%),
698
+ linear-gradient(155deg, transparent 44.5%, hsl(var(--wisteria-300) / 0.5) 45%, hsl(var(--wisteria-300) / 0.5) 45.05%, transparent 45.5%),
699
+ linear-gradient(85deg, transparent 38.5%, hsl(var(--wisteria-400) / 0.4) 39%, hsl(var(--wisteria-400) / 0.4) 39.05%, transparent 39.5%),
700
+ linear-gradient(175deg, transparent 62.5%, hsl(var(--wisteria-500) / 0.5) 63%, hsl(var(--wisteria-500) / 0.5) 63.05%, transparent 63.5%),
701
+ linear-gradient(35deg, transparent 55.5%, hsl(var(--wisteria-300) / 0.4) 56%, hsl(var(--wisteria-300) / 0.4) 56.05%, transparent 56.5%),
702
+ linear-gradient(115deg, transparent 71.5%, hsl(var(--wisteria-400) / 0.5) 72%, hsl(var(--wisteria-400) / 0.5) 72.05%, transparent 72.5%),
703
+ linear-gradient(145deg, transparent 82.5%, hsl(var(--wisteria-500) / 0.4) 83%, hsl(var(--wisteria-500) / 0.4) 83.05%, transparent 83.5%);
704
+ animation: network-drift-reverse 25s ease-in-out infinite;
705
+ }
706
+
707
+ @keyframes network-drift {
708
+ 0%, 100% {
709
+ transform: translate(0, 0) scale(1);
710
+ }
711
+ 20% {
712
+ transform: translate(15px, -20px) scale(1.01);
713
+ }
714
+ 40% {
715
+ transform: translate(-10px, 15px) scale(0.99);
716
+ }
717
+ 60% {
718
+ transform: translate(20px, 10px) scale(1.02);
719
+ }
720
+ 80% {
721
+ transform: translate(-15px, -10px) scale(1);
722
+ }
723
+ }
724
+
725
+ @keyframes network-drift-reverse {
726
+ 0%, 100% {
727
+ transform: translate(0, 0) scale(1);
728
+ }
729
+ 20% {
730
+ transform: translate(-20px, 15px) scale(0.99);
731
+ }
732
+ 40% {
733
+ transform: translate(15px, -10px) scale(1.01);
734
+ }
735
+ 60% {
736
+ transform: translate(-10px, -20px) scale(1);
737
+ }
738
+ 80% {
739
+ transform: translate(10px, 20px) scale(1.02);
740
+ }
741
+ }
742
+
743
+ .dark .el-bg-network::before {
744
+ opacity: 0.5;
745
+ }
746
+
747
+ .dark .el-bg-network::after {
748
+ opacity: 0.3;
749
+ }
750
+
751
+ /* ============================================
752
+ Origami Effect - Subtle geometric shapes
753
+ A few elegant triangles and diamonds that float
754
+ ============================================ */
755
+ .el-bg-origami {
756
+ position: relative;
757
+ }
758
+
759
+ .el-bg-origami::before {
760
+ content: '';
761
+ position: fixed;
762
+ inset: 0;
763
+ z-index: 0;
764
+ pointer-events: none;
765
+ opacity: 0.35;
766
+ background:
767
+ /* Large triangle top-left */
768
+ conic-gradient(from 0deg at 15% 25%, hsl(var(--wisteria-400) / 0.5) 0deg, hsl(var(--wisteria-400) / 0.5) 60deg, transparent 60deg),
769
+ /* Diamond bottom-right */
770
+ conic-gradient(from 45deg at 80% 70%, hsl(var(--wisteria-500) / 0.4) 0deg, hsl(var(--wisteria-500) / 0.4) 90deg, transparent 90deg, transparent 180deg, hsl(var(--wisteria-500) / 0.4) 180deg, hsl(var(--wisteria-500) / 0.4) 270deg, transparent 270deg);
771
+ filter: blur(40px);
772
+ animation: origami-float 25s ease-in-out infinite;
773
+ }
774
+
775
+ .el-bg-origami::after {
776
+ content: '';
777
+ position: fixed;
778
+ inset: 0;
779
+ z-index: 0;
780
+ pointer-events: none;
781
+ opacity: 0.3;
782
+ background:
783
+ /* Triangle bottom-left */
784
+ conic-gradient(from 180deg at 25% 75%, hsl(var(--wisteria-300) / 0.45) 0deg, hsl(var(--wisteria-300) / 0.45) 60deg, transparent 60deg),
785
+ /* Small diamond top-right */
786
+ conic-gradient(from 45deg at 75% 20%, hsl(var(--wisteria-400) / 0.35) 0deg, hsl(var(--wisteria-400) / 0.35) 90deg, transparent 90deg, transparent 180deg, hsl(var(--wisteria-400) / 0.35) 180deg, hsl(var(--wisteria-400) / 0.35) 270deg, transparent 270deg);
787
+ filter: blur(50px);
788
+ animation: origami-drift 30s ease-in-out infinite reverse;
789
+ }
790
+
791
+ @keyframes origami-float {
792
+ 0%, 100% {
793
+ transform: translate(0, 0) rotate(0deg) scale(1);
794
+ }
795
+ 33% {
796
+ transform: translate(30px, -20px) rotate(2deg) scale(1.05);
797
+ }
798
+ 66% {
799
+ transform: translate(-20px, 25px) rotate(-1deg) scale(0.98);
800
+ }
801
+ }
802
+
803
+ @keyframes origami-drift {
804
+ 0%, 100% {
805
+ transform: translate(0, 0) rotate(0deg) scale(1);
806
+ }
807
+ 33% {
808
+ transform: translate(-25px, 20px) rotate(-2deg) scale(1.03);
809
+ }
810
+ 66% {
811
+ transform: translate(25px, -15px) rotate(2deg) scale(0.97);
812
+ }
813
+ }
814
+
815
+ .dark .el-bg-origami::before {
816
+ opacity: 0.45;
817
+ }
818
+
819
+ .dark .el-bg-origami::after {
820
+ opacity: 0.4;
821
+ }
822
+
823
+ /* ============================================
824
+ Utility: Ensure content stays above backgrounds
825
+ ============================================ */
826
+ .el-bg-aurora > *,
827
+ .el-bg-mesh > *,
828
+ .el-bg-waves > *,
829
+ .el-bg-glow > *,
830
+ .el-bg-dots > *,
831
+ .el-bg-gradient-shift > *,
832
+ .el-bg-northern-lights > *,
833
+ .el-bg-particles > *,
834
+ .el-bg-blobs > *,
835
+ .el-bg-network > *,
836
+ .el-bg-origami > * {
837
+ position: relative;
838
+ z-index: 1;
839
+ }
840
+
841
+
842
+ /* ============================================
843
+ Clip backgrounds to main content area
844
+ Uses CSS variables set by the background container:
845
+ --bg-clip-left: sidebar offset
846
+ --bg-clip-top: top bar offset
847
+ Applied to the container element to clip all pseudo-elements
848
+ ============================================ */
849
+ .el-bg-aurora,
850
+ .el-bg-mesh,
851
+ .el-bg-waves,
852
+ .el-bg-glow,
853
+ .el-bg-dots,
854
+ .el-bg-gradient-shift,
855
+ .el-bg-northern-lights,
856
+ .el-bg-particles,
857
+ .el-bg-blobs,
858
+ .el-bg-network,
859
+ .el-bg-origami {
860
+ clip-path: inset(var(--bg-clip-top, 0px) 0 0 var(--bg-clip-left, 0px));
861
+ }
862
+
863
+ /* ============================================
864
+ Reduced Motion Support
865
+ Disable animations for users who prefer reduced motion
866
+ ============================================ */
867
+ @media (prefers-reduced-motion: reduce) {
868
+ .el-bg-aurora::before,
869
+ .el-bg-aurora::after,
870
+ .el-bg-mesh::before,
871
+ .el-bg-mesh::after,
872
+ .el-bg-waves::before,
873
+ .el-bg-waves::after,
874
+ .el-bg-glow::before,
875
+ .el-bg-glow::after,
876
+ .el-bg-dots::before,
877
+ .el-bg-dots::after,
878
+ .el-bg-gradient-shift::before,
879
+ .el-bg-gradient-shift::after,
880
+ .el-bg-northern-lights::before,
881
+ .el-bg-northern-lights::after,
882
+ .el-bg-particles::before,
883
+ .el-bg-particles::after,
884
+ .el-bg-blobs::before,
885
+ .el-bg-blobs::after,
886
+ .el-bg-network::before,
887
+ .el-bg-network::after,
888
+ .el-bg-origami::before,
889
+ .el-bg-origami::after {
890
+ animation: none;
891
+ }
892
+ }