@alivecss/aliveui 1.1.0 → 1.3.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.
package/dist/vite.mjs CHANGED
@@ -2542,6 +2542,2047 @@ video {
2542
2542
  .alive-terminal-out { color: rgba(255,255,255,0.45); }
2543
2543
  .alive-terminal-ok { color: #4ade80; }
2544
2544
  .alive-terminal-err { color: #f87171; }
2545
+
2546
+ /* \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550
2547
+ AliveUI Video Blocks \u2014 cinematic building blocks for product videos
2548
+ \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 */
2549
+
2550
+ /* \u2500\u2500 Gradient Mesh Background \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
2551
+ @keyframes alive-mesh-shift {
2552
+ 0% { background-position: 0% 50%; }
2553
+ 50% { background-position: 100% 50%; }
2554
+ 100% { background-position: 0% 50%; }
2555
+ }
2556
+ .alive-gradient-mesh {
2557
+ background: linear-gradient(
2558
+ 135deg,
2559
+ #6366f1 0%,
2560
+ #8b5cf6 25%,
2561
+ #06b6d4 50%,
2562
+ #6366f1 75%,
2563
+ #8b5cf6 100%
2564
+ );
2565
+ background-size: 300% 300%;
2566
+ animation: alive-mesh-shift 8s ease infinite;
2567
+ }
2568
+ .alive-gradient-mesh-warm {
2569
+ background: linear-gradient(
2570
+ 135deg,
2571
+ #f59e0b 0%,
2572
+ #ef4444 25%,
2573
+ #ec4899 50%,
2574
+ #f59e0b 75%,
2575
+ #ef4444 100%
2576
+ );
2577
+ background-size: 300% 300%;
2578
+ animation: alive-mesh-shift 8s ease infinite;
2579
+ }
2580
+ .alive-gradient-mesh-cool {
2581
+ background: linear-gradient(
2582
+ 135deg,
2583
+ #0ea5e9 0%,
2584
+ #6366f1 25%,
2585
+ #14b8a6 50%,
2586
+ #0ea5e9 75%,
2587
+ #6366f1 100%
2588
+ );
2589
+ background-size: 300% 300%;
2590
+ animation: alive-mesh-shift 8s ease infinite;
2591
+ }
2592
+ .alive-gradient-mesh-dark {
2593
+ background: linear-gradient(
2594
+ 135deg,
2595
+ #1e1b4b 0%,
2596
+ #312e81 20%,
2597
+ #1e3a5f 40%,
2598
+ #0f172a 60%,
2599
+ #1e1b4b 80%,
2600
+ #312e81 100%
2601
+ );
2602
+ background-size: 300% 300%;
2603
+ animation: alive-mesh-shift 10s ease infinite;
2604
+ }
2605
+ /* Noise overlay layer \u2014 place over any bg */
2606
+ .alive-gradient-mesh::after,
2607
+ .alive-gradient-mesh-warm::after,
2608
+ .alive-gradient-mesh-cool::after,
2609
+ .alive-gradient-mesh-dark::after {
2610
+ content: '';
2611
+ position: absolute;
2612
+ inset: 0;
2613
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E");
2614
+ pointer-events: none;
2615
+ }
2616
+
2617
+ /* \u2500\u2500 Counter \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
2618
+ @keyframes alive-count-up {
2619
+ from { opacity: 0; transform: translateY(12px); }
2620
+ to { opacity: 1; transform: translateY(0); }
2621
+ }
2622
+ .alive-counter {
2623
+ display: inline-flex;
2624
+ flex-direction: column;
2625
+ align-items: center;
2626
+ gap: 4px;
2627
+ }
2628
+ .alive-counter-value {
2629
+ font-size: 3rem;
2630
+ font-weight: 800;
2631
+ letter-spacing: -0.03em;
2632
+ line-height: 1;
2633
+ animation: alive-count-up 0.6s cubic-bezier(0.22, 1, 0.36, 1) both;
2634
+ }
2635
+ .alive-counter-label {
2636
+ font-size: 0.8125rem;
2637
+ font-weight: 500;
2638
+ text-transform: uppercase;
2639
+ letter-spacing: 0.08em;
2640
+ opacity: 0.55;
2641
+ }
2642
+ .alive-counter-prefix,
2643
+ .alive-counter-suffix {
2644
+ font-size: 1.25rem;
2645
+ font-weight: 700;
2646
+ opacity: 0.7;
2647
+ align-self: flex-start;
2648
+ margin-top: 6px;
2649
+ }
2650
+ /* JS-driven counter \u2014 add data-target="4200" and call aliveCounter() */
2651
+ [data-alive-counter] { counter-reset: none; }
2652
+
2653
+ /* \u2500\u2500 Toast Notification \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
2654
+ @keyframes alive-toast-loop {
2655
+ 0% { opacity: 0; transform: translateY(16px) scale(0.95); }
2656
+ 8% { opacity: 1; transform: translateY(0) scale(1); }
2657
+ 70% { opacity: 1; transform: translateY(0) scale(1); }
2658
+ 80% { opacity: 0; transform: translateY(-10px) scale(0.97); }
2659
+ 100% { opacity: 0; transform: translateY(16px) scale(0.95); }
2660
+ }
2661
+ .alive-toast {
2662
+ display: inline-flex;
2663
+ align-items: center;
2664
+ gap: 10px;
2665
+ padding: 12px 18px;
2666
+ border-radius: 14px;
2667
+ background: var(--alive-toast-bg, rgba(255,255,255,0.08));
2668
+ backdrop-filter: blur(16px);
2669
+ -webkit-backdrop-filter: blur(16px);
2670
+ border: 1px solid var(--alive-toast-border, rgba(255,255,255,0.12));
2671
+ box-shadow: 0 8px 32px rgba(0,0,0,0.24), 0 1px 0 rgba(255,255,255,0.06) inset;
2672
+ font-size: 0.875rem;
2673
+ font-weight: 500;
2674
+ color: var(--alive-toast-color, #fff);
2675
+ animation: alive-toast-loop 5s cubic-bezier(0.22, 1, 0.36, 1) infinite both;
2676
+ }
2677
+ .alive-toast-icon {
2678
+ width: 28px;
2679
+ height: 28px;
2680
+ border-radius: 8px;
2681
+ display: flex;
2682
+ align-items: center;
2683
+ justify-content: center;
2684
+ flex-shrink: 0;
2685
+ font-size: 14px;
2686
+ background: var(--alive-toast-icon-bg, rgba(255,255,255,0.1));
2687
+ color: var(--alive-toast-icon-color, currentColor);
2688
+ }
2689
+ .alive-toast-title { font-weight: 600; font-size: 0.875rem; }
2690
+ .alive-toast-body { font-size: 0.8125rem; opacity: 0.65; margin-top: 1px; }
2691
+ .alive-toast-content { display: flex; flex-direction: column; }
2692
+ /* variants */
2693
+ .alive-toast-success { border-color: rgba(74,222,128,0.3); background: rgba(74,222,128,0.08); }
2694
+ .alive-toast-success .alive-toast-icon { background: rgba(74,222,128,0.15); color: #4ade80; }
2695
+ .alive-toast-error { border-color: rgba(248,113,113,0.3); background: rgba(248,113,113,0.08); }
2696
+ .alive-toast-error .alive-toast-icon { background: rgba(248,113,113,0.15); color: #f87171; }
2697
+ .alive-toast-info { border-color: rgba(99,102,241,0.35); background: rgba(99,102,241,0.08); }
2698
+ .alive-toast-info .alive-toast-icon { background: rgba(99,102,241,0.15); color: #818cf8; }
2699
+ .alive-toast-warning { border-color: rgba(251,191,36,0.3); background: rgba(251,191,36,0.08); }
2700
+ .alive-toast-warning .alive-toast-icon { background: rgba(251,191,36,0.15); color: #fbbf24; }
2701
+ /* light bg variant */
2702
+ .alive-toast-light {
2703
+ background: #fff;
2704
+ border-color: rgba(0,0,0,0.08);
2705
+ color: #111;
2706
+ box-shadow: 0 8px 32px rgba(0,0,0,0.12);
2707
+ }
2708
+
2709
+ /* \u2500\u2500 Typewriter \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
2710
+ @keyframes alive-blink {
2711
+ 0%, 100% { opacity: 1; }
2712
+ 50% { opacity: 0; }
2713
+ }
2714
+ @keyframes alive-type-in {
2715
+ from { clip-path: inset(0 100% 0 0); }
2716
+ to { clip-path: inset(0 0% 0 0); }
2717
+ }
2718
+ .alive-typewriter {
2719
+ display: inline-block;
2720
+ white-space: nowrap;
2721
+ border-right: 2px solid var(--alive-typewriter-cursor, currentColor);
2722
+ animation:
2723
+ alive-type-in 2s steps(40, end) both,
2724
+ alive-blink 0.8s step-end infinite;
2725
+ }
2726
+ .alive-typewriter-fast {
2727
+ animation:
2728
+ alive-type-in 1s steps(30, end) both,
2729
+ alive-blink 0.8s step-end infinite;
2730
+ }
2731
+ .alive-typewriter-slow {
2732
+ animation:
2733
+ alive-type-in 3.5s steps(60, end) both,
2734
+ alive-blink 0.8s step-end infinite;
2735
+ }
2736
+ .alive-typewriter-no-cursor {
2737
+ border-right: none;
2738
+ animation: alive-type-in 2s steps(40, end) both;
2739
+ }
2740
+
2741
+ /* \u2500\u2500 Word Reveal \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
2742
+ @keyframes alive-word-in {
2743
+ from { opacity: 0; transform: translateY(20px); filter: blur(4px); }
2744
+ to { opacity: 1; transform: translateY(0); filter: blur(0); }
2745
+ }
2746
+ @keyframes alive-word-in-up {
2747
+ from { opacity: 0; transform: translateY(-20px); }
2748
+ to { opacity: 1; transform: translateY(0); }
2749
+ }
2750
+ @keyframes alive-word-in-scale {
2751
+ from { opacity: 0; transform: scale(0.7); }
2752
+ to { opacity: 1; transform: scale(1); }
2753
+ }
2754
+ /* paused by default \u2014 add .alive-run to the wrapper to trigger */
2755
+ .alive-word-reveal > * {
2756
+ display: inline-block;
2757
+ opacity: 0;
2758
+ animation: alive-word-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;
2759
+ animation-play-state: paused;
2760
+ }
2761
+ .alive-word-reveal.alive-run > * {
2762
+ animation-play-state: running;
2763
+ }
2764
+ /* stagger helpers \u2014 add these to children */
2765
+ .alive-delay-1 { animation-delay: 0.1s; }
2766
+ .alive-delay-2 { animation-delay: 0.2s; }
2767
+ .alive-delay-3 { animation-delay: 0.3s; }
2768
+ .alive-delay-4 { animation-delay: 0.4s; }
2769
+ .alive-delay-5 { animation-delay: 0.5s; }
2770
+ .alive-delay-6 { animation-delay: 0.6s; }
2771
+ .alive-delay-7 { animation-delay: 0.7s; }
2772
+ .alive-delay-8 { animation-delay: 0.8s; }
2773
+ .alive-delay-9 { animation-delay: 0.9s; }
2774
+ .alive-delay-10 { animation-delay: 1.0s; }
2775
+ .alive-delay-12 { animation-delay: 1.2s; }
2776
+ .alive-delay-15 { animation-delay: 1.5s; }
2777
+ /* char-by-char variant */
2778
+ .alive-char-reveal > * {
2779
+ display: inline-block;
2780
+ opacity: 0;
2781
+ animation: alive-word-in-scale 0.35s cubic-bezier(0.22, 1, 0.36, 1) both;
2782
+ animation-play-state: paused;
2783
+ }
2784
+ .alive-char-reveal.alive-run > * {
2785
+ animation-play-state: running;
2786
+ }
2787
+
2788
+ /* \u2500\u2500 Animated Light Beam \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
2789
+ @keyframes alive-beam-sweep {
2790
+ 0% { transform: translateX(-100%) rotate(25deg); opacity: 0; }
2791
+ 15% { opacity: 1; }
2792
+ 85% { opacity: 1; }
2793
+ 100% { transform: translateX(200%) rotate(25deg); opacity: 0; }
2794
+ }
2795
+ @keyframes alive-beam-pulse {
2796
+ 0%, 100% { opacity: 0.3; }
2797
+ 50% { opacity: 0.7; }
2798
+ }
2799
+ .alive-beam {
2800
+ position: relative;
2801
+ overflow: hidden;
2802
+ }
2803
+ .alive-beam::before {
2804
+ content: '';
2805
+ position: absolute;
2806
+ top: -50%;
2807
+ left: 0;
2808
+ width: 60%;
2809
+ height: 200%;
2810
+ background: linear-gradient(
2811
+ 90deg,
2812
+ transparent 0%,
2813
+ rgba(255,255,255,0.06) 40%,
2814
+ rgba(255,255,255,0.12) 50%,
2815
+ rgba(255,255,255,0.06) 60%,
2816
+ transparent 100%
2817
+ );
2818
+ animation: alive-beam-sweep 4s cubic-bezier(0.4, 0, 0.2, 1) infinite;
2819
+ animation-delay: 1s;
2820
+ pointer-events: none;
2821
+ }
2822
+ /* radial glow beam from top */
2823
+ .alive-beam-glow::after {
2824
+ content: '';
2825
+ position: absolute;
2826
+ top: -20%;
2827
+ left: 50%;
2828
+ transform: translateX(-50%);
2829
+ width: 60%;
2830
+ height: 50%;
2831
+ background: radial-gradient(ellipse at top, rgba(99,102,241,0.35) 0%, transparent 70%);
2832
+ animation: alive-beam-pulse 3s ease-in-out infinite;
2833
+ pointer-events: none;
2834
+ }
2835
+
2836
+ /* \u2500\u2500 Noise / Film Grain \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
2837
+ @keyframes alive-noise-shift {
2838
+ 0% { transform: translate(0, 0); }
2839
+ 10% { transform: translate(-2%, -2%); }
2840
+ 20% { transform: translate(2%, 2%); }
2841
+ 30% { transform: translate(-1%, 1%); }
2842
+ 40% { transform: translate(1%, -1%); }
2843
+ 50% { transform: translate(-2%, 1%); }
2844
+ 60% { transform: translate(2%, -2%); }
2845
+ 70% { transform: translate(-1%, -1%); }
2846
+ 80% { transform: translate(1%, 2%); }
2847
+ 90% { transform: translate(-2%, 2%); }
2848
+ 100% { transform: translate(0, 0); }
2849
+ }
2850
+ .alive-noise {
2851
+ position: relative;
2852
+ }
2853
+ .alive-noise::after {
2854
+ content: '';
2855
+ position: absolute;
2856
+ inset: -10%;
2857
+ width: 120%;
2858
+ height: 120%;
2859
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 512 512' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)' opacity='1'/%3E%3C/svg%3E");
2860
+ opacity: 0.04;
2861
+ animation: alive-noise-shift 0.3s steps(1) infinite;
2862
+ pointer-events: none;
2863
+ z-index: 10;
2864
+ }
2865
+ .alive-noise-subtle::after { opacity: 0.025; }
2866
+ .alive-noise-strong::after { opacity: 0.07; }
2867
+
2868
+ /* \u2500\u2500 Animated Grid Background \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
2869
+ @keyframes alive-grid-scroll {
2870
+ from { background-position: 0 0; }
2871
+ to { background-position: 40px 40px; }
2872
+ }
2873
+ @keyframes alive-grid-fade {
2874
+ 0%, 100% { opacity: 0.4; }
2875
+ 50% { opacity: 0.8; }
2876
+ }
2877
+ .alive-grid {
2878
+ background-image:
2879
+ linear-gradient(rgba(255,255,255,0.06) 1px, transparent 1px),
2880
+ linear-gradient(90deg, rgba(255,255,255,0.06) 1px, transparent 1px);
2881
+ background-size: 40px 40px;
2882
+ animation: alive-grid-scroll 4s linear infinite;
2883
+ }
2884
+ .alive-grid-dark {
2885
+ background-image:
2886
+ linear-gradient(rgba(255,255,255,0.04) 1px, transparent 1px),
2887
+ linear-gradient(90deg, rgba(255,255,255,0.04) 1px, transparent 1px);
2888
+ background-size: 40px 40px;
2889
+ }
2890
+ .alive-grid-light {
2891
+ background-image:
2892
+ linear-gradient(rgba(0,0,0,0.06) 1px, transparent 1px),
2893
+ linear-gradient(90deg, rgba(0,0,0,0.06) 1px, transparent 1px);
2894
+ background-size: 40px 40px;
2895
+ }
2896
+ .alive-grid-sm { background-size: 20px 20px; }
2897
+ .alive-grid-lg { background-size: 60px 60px; }
2898
+ /* center fade \u2014 vignette over the grid */
2899
+ .alive-grid-vignette::after {
2900
+ content: '';
2901
+ position: absolute;
2902
+ inset: 0;
2903
+ background: radial-gradient(ellipse at center, transparent 30%, rgba(0,0,0,0.7) 100%);
2904
+ pointer-events: none;
2905
+ }
2906
+
2907
+ /* \u2500\u2500 Spotlight \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
2908
+ @keyframes alive-spotlight-in {
2909
+ from { opacity: 0; transform: scale(0.8); }
2910
+ to { opacity: 1; transform: scale(1); }
2911
+ }
2912
+ .alive-spotlight {
2913
+ position: relative;
2914
+ }
2915
+ .alive-spotlight::before {
2916
+ content: '';
2917
+ position: absolute;
2918
+ inset: -24px;
2919
+ border-radius: inherit;
2920
+ background: radial-gradient(ellipse at center, var(--alive-spotlight-color, rgba(99,102,241,0.25)) 0%, var(--alive-spotlight-color-mid, rgba(99,102,241,0.08)) 50%, transparent 70%);
2921
+ animation: alive-spotlight-in 0.6s cubic-bezier(0.22, 1, 0.36, 1) both;
2922
+ pointer-events: none;
2923
+ z-index: -1;
2924
+ }
2925
+ .alive-spotlight-ring::after {
2926
+ content: '';
2927
+ position: absolute;
2928
+ inset: -4px;
2929
+ border-radius: inherit;
2930
+ border: 1px solid var(--alive-spotlight-ring-color, rgba(99,102,241,0.4));
2931
+ box-shadow: 0 0 24px var(--alive-spotlight-glow, rgba(99,102,241,0.3)), 0 0 48px var(--alive-spotlight-glow-far, rgba(99,102,241,0.15));
2932
+ animation: alive-spotlight-in 0.6s cubic-bezier(0.22, 1, 0.36, 1) both;
2933
+ pointer-events: none;
2934
+ }
2935
+ .alive-spotlight-white::before {
2936
+ background: radial-gradient(ellipse at center, rgba(255,255,255,0.2) 0%, rgba(255,255,255,0.06) 50%, transparent 70%);
2937
+ }
2938
+
2939
+ /* \u2500\u2500 Badge Pulse / Live Indicator \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
2940
+ @keyframes alive-pulse-ring {
2941
+ 0% { transform: scale(1); opacity: 0.7; }
2942
+ 100% { transform: scale(2.5); opacity: 0; }
2943
+ }
2944
+ @keyframes alive-badge-in {
2945
+ from { opacity: 0; transform: scale(0.7); }
2946
+ to { opacity: 1; transform: scale(1); }
2947
+ }
2948
+ .alive-badge-pulse {
2949
+ display: inline-flex;
2950
+ align-items: center;
2951
+ gap: 7px;
2952
+ padding: 5px 12px 5px 8px;
2953
+ border-radius: 999px;
2954
+ font-size: 0.75rem;
2955
+ font-weight: 600;
2956
+ letter-spacing: 0.02em;
2957
+ background: var(--alive-badge-bg, transparent);
2958
+ color: var(--alive-badge-color, inherit);
2959
+ border: 1px solid var(--alive-badge-border, transparent);
2960
+ animation: alive-badge-in 0.4s cubic-bezier(0.22, 1, 0.36, 1) both;
2961
+ }
2962
+ .alive-badge-pulse .alive-badge-dot {
2963
+ position: relative;
2964
+ width: 8px;
2965
+ height: 8px;
2966
+ border-radius: 50%;
2967
+ flex-shrink: 0;
2968
+ background: var(--alive-badge-dot, currentColor);
2969
+ }
2970
+ .alive-badge-pulse .alive-badge-dot::before {
2971
+ content: '';
2972
+ position: absolute;
2973
+ inset: 0;
2974
+ border-radius: 50%;
2975
+ animation: alive-pulse-ring 1.4s cubic-bezier(0, 0, 0.2, 1) infinite;
2976
+ background: inherit;
2977
+ }
2978
+ /* color variants */
2979
+ .alive-badge-live {
2980
+ background: rgba(239,68,68,0.12);
2981
+ color: #ef4444;
2982
+ border: 1px solid rgba(239,68,68,0.2);
2983
+ }
2984
+ .alive-badge-live .alive-badge-dot { background: #ef4444; }
2985
+ .alive-badge-online {
2986
+ background: rgba(34,197,94,0.12);
2987
+ color: #22c55e;
2988
+ border: 1px solid rgba(34,197,94,0.2);
2989
+ }
2990
+ .alive-badge-online .alive-badge-dot { background: #22c55e; }
2991
+ .alive-badge-recording {
2992
+ background: rgba(239,68,68,0.1);
2993
+ color: #f87171;
2994
+ border: 1px solid rgba(239,68,68,0.15);
2995
+ }
2996
+ .alive-badge-recording .alive-badge-dot { background: #f87171; }
2997
+ .alive-badge-beta {
2998
+ background: rgba(99,102,241,0.12);
2999
+ color: #818cf8;
3000
+ border: 1px solid rgba(99,102,241,0.2);
3001
+ }
3002
+ .alive-badge-beta .alive-badge-dot { background: #818cf8; }
3003
+
3004
+ /* \u2500\u2500 Code Block (Syntax Highlight) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3005
+ @keyframes alive-code-reveal {
3006
+ from { opacity: 0; transform: translateY(8px); }
3007
+ to { opacity: 1; transform: translateY(0); }
3008
+ }
3009
+ @keyframes alive-code-scan {
3010
+ 0% { top: 0%; opacity: 0; }
3011
+ 5% { opacity: 1; }
3012
+ 95% { opacity: 1; }
3013
+ 100% { top: 100%; opacity: 0; }
3014
+ }
3015
+ @keyframes alive-code-glow {
3016
+ 0%, 100% { box-shadow: 0 20px 60px rgba(0,0,0,0.5); }
3017
+ 50% { box-shadow: 0 20px 60px rgba(0,0,0,0.5), 0 0 0 1px rgba(99,102,241,0.2), 0 0 24px rgba(99,102,241,0.1); }
3018
+ }
3019
+ .alive-code-block {
3020
+ border-radius: 12px;
3021
+ overflow: hidden;
3022
+ background: #0d1117;
3023
+ border: 1px solid rgba(255,255,255,0.06);
3024
+ box-shadow: 0 20px 60px rgba(0,0,0,0.5);
3025
+ font-family: ui-monospace, 'Cascadia Code', 'Fira Code', 'JetBrains Mono', monospace;
3026
+ animation: alive-code-reveal 0.5s cubic-bezier(0.22, 1, 0.36, 1) both, alive-code-glow 4s ease-in-out 1s infinite;
3027
+ position: relative;
3028
+ }
3029
+ /* scanning line \u2014 active code highlight */
3030
+ .alive-code-block::after {
3031
+ content: '';
3032
+ position: absolute;
3033
+ left: 0;
3034
+ right: 0;
3035
+ height: 1.75rem;
3036
+ background: linear-gradient(180deg, transparent 0%, rgba(99,102,241,0.07) 50%, transparent 100%);
3037
+ animation: alive-code-scan 3s ease-in-out 1s infinite;
3038
+ pointer-events: none;
3039
+ }
3040
+ .alive-code-block-bar {
3041
+ display: flex;
3042
+ align-items: center;
3043
+ justify-content: space-between;
3044
+ padding: 10px 16px;
3045
+ background: #161b22;
3046
+ border-bottom: 1px solid rgba(255,255,255,0.06);
3047
+ }
3048
+ .alive-code-block-dots {
3049
+ display: flex;
3050
+ gap: 6px;
3051
+ }
3052
+ .alive-code-block-dots span {
3053
+ width: 12px;
3054
+ height: 12px;
3055
+ border-radius: 50%;
3056
+ }
3057
+ .alive-code-block-dots span:nth-child(1) { background: #ff5f57; }
3058
+ .alive-code-block-dots span:nth-child(2) { background: #febc2e; }
3059
+ .alive-code-block-dots span:nth-child(3) { background: #28c840; }
3060
+ .alive-code-block-filename {
3061
+ font-size: 0.75rem;
3062
+ color: rgba(255,255,255,0.35);
3063
+ font-family: inherit;
3064
+ }
3065
+ .alive-code-block-lang {
3066
+ font-size: 0.6875rem;
3067
+ text-transform: uppercase;
3068
+ letter-spacing: 0.08em;
3069
+ color: rgba(255,255,255,0.25);
3070
+ }
3071
+ .alive-code-block-body {
3072
+ padding: 1.25rem 1.5rem;
3073
+ font-size: 0.8125rem;
3074
+ line-height: 1.75;
3075
+ overflow: auto;
3076
+ }
3077
+ /* line-by-line reveal \u2014 add alive-delay-* to each line */
3078
+ .alive-code-block-body .line {
3079
+ display: block;
3080
+ animation: alive-code-reveal 0.35s cubic-bezier(0.22, 1, 0.36, 1) both;
3081
+ }
3082
+ /* syntax tokens */
3083
+ .alive-token-keyword { color: #ff7b72; }
3084
+ .alive-token-string { color: #a5d6ff; }
3085
+ .alive-token-number { color: #79c0ff; }
3086
+ .alive-token-comment { color: rgba(255,255,255,0.3); font-style: italic; }
3087
+ .alive-token-fn { color: #d2a8ff; }
3088
+ .alive-token-var { color: #ffa657; }
3089
+ .alive-token-op { color: rgba(255,255,255,0.55); }
3090
+ .alive-token-type { color: #79c0ff; }
3091
+ .alive-token-punct { color: rgba(255,255,255,0.4); }
3092
+
3093
+ /* \u2500\u2500 Testimonial Card \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3094
+ @keyframes alive-card-in {
3095
+ from { opacity: 0; transform: translateY(24px) scale(0.97); }
3096
+ to { opacity: 1; transform: translateY(0) scale(1); }
3097
+ }
3098
+ @keyframes alive-float {
3099
+ 0%, 100% { transform: translateY(0px); }
3100
+ 50% { transform: translateY(-6px); }
3101
+ }
3102
+ .alive-testimonial {
3103
+ display: flex;
3104
+ flex-direction: column;
3105
+ gap: 16px;
3106
+ padding: 24px;
3107
+ border-radius: 16px;
3108
+ background: rgba(255,255,255,0.05);
3109
+ border: 1px solid rgba(255,255,255,0.08);
3110
+ box-shadow: 0 8px 32px rgba(0,0,0,0.2);
3111
+ animation: alive-card-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) both, alive-float 4s ease-in-out 0.5s infinite;
3112
+ max-width: 400px;
3113
+ }
3114
+ .alive-testimonial-quote {
3115
+ font-size: 1rem;
3116
+ line-height: 1.6;
3117
+ color: rgba(255,255,255,0.85);
3118
+ font-weight: 400;
3119
+ }
3120
+ .alive-testimonial-quote::before { content: '\u201C'; }
3121
+ .alive-testimonial-quote::after { content: '\u201D'; }
3122
+ .alive-testimonial-author {
3123
+ display: flex;
3124
+ align-items: center;
3125
+ gap: 12px;
3126
+ }
3127
+ .alive-testimonial-avatar {
3128
+ width: 36px;
3129
+ height: 36px;
3130
+ border-radius: 50%;
3131
+ background: linear-gradient(135deg, #6366f1, #8b5cf6);
3132
+ flex-shrink: 0;
3133
+ overflow: hidden;
3134
+ }
3135
+ .alive-testimonial-name {
3136
+ font-size: 0.875rem;
3137
+ font-weight: 600;
3138
+ color: #fff;
3139
+ }
3140
+ .alive-testimonial-role {
3141
+ font-size: 0.75rem;
3142
+ color: rgba(255,255,255,0.4);
3143
+ margin-top: 1px;
3144
+ }
3145
+ .alive-testimonial-stars {
3146
+ display: flex;
3147
+ gap: 3px;
3148
+ color: #fbbf24;
3149
+ font-size: 0.75rem;
3150
+ margin-bottom: 4px;
3151
+ }
3152
+ /* light variant */
3153
+ .alive-testimonial-light {
3154
+ background: #fff;
3155
+ border-color: rgba(0,0,0,0.06);
3156
+ box-shadow: 0 8px 32px rgba(0,0,0,0.08);
3157
+ }
3158
+ .alive-testimonial-light .alive-testimonial-quote { color: #1a1a1a; }
3159
+ .alive-testimonial-light .alive-testimonial-name { color: #111; }
3160
+ .alive-testimonial-light .alive-testimonial-role { color: rgba(0,0,0,0.4); }
3161
+
3162
+ /* \u2500\u2500 Metric Card \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3163
+ @keyframes alive-metric-in {
3164
+ from { opacity: 0; transform: translateY(16px); }
3165
+ to { opacity: 1; transform: translateY(0); }
3166
+ }
3167
+ @keyframes alive-bar-grow {
3168
+ from { transform: scaleX(0); }
3169
+ to { transform: scaleX(1); }
3170
+ }
3171
+ @keyframes alive-bar-shimmer {
3172
+ 0% { background-position: -200% center; }
3173
+ 100% { background-position: 200% center; }
3174
+ }
3175
+ @keyframes alive-value-pulse {
3176
+ 0%, 100% { opacity: 1; }
3177
+ 50% { opacity: 0.75; }
3178
+ }
3179
+ .alive-metric-card {
3180
+ display: flex;
3181
+ flex-direction: column;
3182
+ gap: 8px;
3183
+ padding: 20px 24px;
3184
+ border-radius: 14px;
3185
+ background: var(--alive-metric-bg, rgba(255,255,255,0.04));
3186
+ border: 1px solid var(--alive-metric-border, rgba(255,255,255,0.08));
3187
+ animation: alive-metric-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;
3188
+ min-width: 160px;
3189
+ }
3190
+ .alive-metric-card-label {
3191
+ font-size: 0.75rem;
3192
+ font-weight: 500;
3193
+ text-transform: uppercase;
3194
+ letter-spacing: 0.07em;
3195
+ color: var(--alive-metric-label-color, rgba(255,255,255,0.4));
3196
+ }
3197
+ .alive-metric-card-value {
3198
+ font-size: 2.25rem;
3199
+ font-weight: 800;
3200
+ letter-spacing: -0.04em;
3201
+ line-height: 1;
3202
+ color: var(--alive-metric-value-color, #fff);
3203
+ }
3204
+ .alive-metric-card-change {
3205
+ display: inline-flex;
3206
+ align-items: center;
3207
+ gap: 4px;
3208
+ font-size: 0.8125rem;
3209
+ font-weight: 600;
3210
+ padding: 3px 8px;
3211
+ border-radius: 6px;
3212
+ width: fit-content;
3213
+ }
3214
+ .alive-metric-card-up { color: #4ade80; background: rgba(74,222,128,0.12); }
3215
+ .alive-metric-card-down { color: #f87171; background: rgba(248,113,113,0.12); }
3216
+ .alive-metric-card-bar {
3217
+ height: 3px;
3218
+ border-radius: 2px;
3219
+ background: rgba(255,255,255,0.08);
3220
+ margin-top: 4px;
3221
+ overflow: hidden;
3222
+ }
3223
+ .alive-metric-card-bar-fill {
3224
+ height: 100%;
3225
+ border-radius: 2px;
3226
+ background: linear-gradient(90deg, var(--alive-metric-accent, #6366f1), var(--alive-metric-accent-2, #8b5cf6), var(--alive-metric-accent, #6366f1));
3227
+ background-size: 200% auto;
3228
+ transform-origin: left;
3229
+ animation:
3230
+ alive-bar-grow 1s cubic-bezier(0.22, 1, 0.36, 1) 0.3s both,
3231
+ alive-bar-shimmer 2.5s linear 1.3s infinite;
3232
+ }
3233
+ /* light variant */
3234
+ .alive-metric-card-light {
3235
+ background: #fff;
3236
+ border-color: rgba(0,0,0,0.06);
3237
+ box-shadow: 0 4px 16px rgba(0,0,0,0.06);
3238
+ }
3239
+ .alive-metric-card-light .alive-metric-card-label { color: rgba(0,0,0,0.4); }
3240
+ .alive-metric-card-light .alive-metric-card-value { color: #111; }
3241
+
3242
+ /* \u2500\u2500 Logo Marquee \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3243
+ @keyframes alive-marquee {
3244
+ from { transform: translateX(0); }
3245
+ to { transform: translateX(-50%); }
3246
+ }
3247
+ @keyframes alive-marquee-reverse {
3248
+ from { transform: translateX(-50%); }
3249
+ to { transform: translateX(0); }
3250
+ }
3251
+ .alive-marquee {
3252
+ display: flex;
3253
+ overflow: hidden;
3254
+ width: 100%;
3255
+ position: relative;
3256
+ }
3257
+ /* fade edges */
3258
+ .alive-marquee::before,
3259
+ .alive-marquee::after {
3260
+ content: '';
3261
+ position: absolute;
3262
+ top: 0;
3263
+ bottom: 0;
3264
+ width: 80px;
3265
+ z-index: 2;
3266
+ pointer-events: none;
3267
+ }
3268
+ .alive-marquee::before { left: 0; background: linear-gradient(to right, rgba(0,0,0,0.8), transparent); }
3269
+ .alive-marquee::after { right: 0; background: linear-gradient(to left, rgba(0,0,0,0.8), transparent); }
3270
+ .alive-marquee-track {
3271
+ display: flex;
3272
+ gap: 40px;
3273
+ align-items: center;
3274
+ flex-shrink: 0;
3275
+ animation: alive-marquee 20s linear infinite;
3276
+ will-change: transform;
3277
+ }
3278
+ .alive-marquee-track-slow { animation-duration: 35s; }
3279
+ .alive-marquee-track-fast { animation-duration: 12s; }
3280
+ .alive-marquee-track-reverse { animation-name: alive-marquee-reverse; }
3281
+ .alive-marquee-item {
3282
+ display: flex;
3283
+ align-items: center;
3284
+ justify-content: center;
3285
+ flex-shrink: 0;
3286
+ height: 32px;
3287
+ opacity: 0.45;
3288
+ filter: grayscale(1);
3289
+ transition: opacity 0.2s, filter 0.2s;
3290
+ }
3291
+ .alive-marquee-item:hover { opacity: 0.8; filter: grayscale(0); }
3292
+ .alive-marquee-item img { height: 100%; width: auto; object-fit: contain; }
3293
+ /* light bg variant */
3294
+ .alive-marquee-light::before { background: linear-gradient(to right, rgba(255,255,255,0.9), transparent); }
3295
+ .alive-marquee-light::after { background: linear-gradient(to left, rgba(255,255,255,0.9), transparent); }
3296
+ .alive-marquee-light .alive-marquee-item { filter: grayscale(1) invert(1); opacity: 0.35; }
3297
+
3298
+ /* \u2500\u2500 Glitch Text \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3299
+ @keyframes alive-glitch-1 {
3300
+ 0%, 100% { clip-path: inset(0 0 95% 0); transform: translate(-3px, 0); }
3301
+ 20% { clip-path: inset(20% 0 60% 0); transform: translate(3px, 0); }
3302
+ 40% { clip-path: inset(50% 0 30% 0); transform: translate(-3px, 0); }
3303
+ 60% { clip-path: inset(80% 0 5% 0); transform: translate(3px, 0); }
3304
+ 80% { clip-path: inset(10% 0 80% 0); transform: translate(-2px, 0); }
3305
+ }
3306
+ @keyframes alive-glitch-2 {
3307
+ 0%, 100% { clip-path: inset(50% 0 30% 0); transform: translate(3px, 0); }
3308
+ 25% { clip-path: inset(10% 0 70% 0); transform: translate(-3px, 0); }
3309
+ 50% { clip-path: inset(70% 0 10% 0); transform: translate(2px, 0); }
3310
+ 75% { clip-path: inset(30% 0 50% 0); transform: translate(-2px, 0); }
3311
+ }
3312
+ @keyframes alive-glitch-shake {
3313
+ 0%, 100% { transform: translate(0); }
3314
+ 10% { transform: translate(-2px, 1px); }
3315
+ 20% { transform: translate(2px, -1px); }
3316
+ 30% { transform: translate(-1px, 2px); }
3317
+ 40% { transform: translate(1px, -2px); }
3318
+ 50% { transform: translate(-2px, -1px); }
3319
+ }
3320
+ .alive-glitch {
3321
+ position: relative;
3322
+ display: inline-block;
3323
+ }
3324
+ .alive-glitch::before,
3325
+ .alive-glitch::after {
3326
+ content: attr(data-text);
3327
+ position: absolute;
3328
+ top: 0;
3329
+ left: 0;
3330
+ width: 100%;
3331
+ height: 100%;
3332
+ }
3333
+ .alive-glitch::before {
3334
+ color: #ff2d78;
3335
+ animation: alive-glitch-1 2.5s infinite linear alternate-reverse;
3336
+ }
3337
+ .alive-glitch::after {
3338
+ color: #00f5d4;
3339
+ animation: alive-glitch-2 2s infinite linear alternate-reverse;
3340
+ }
3341
+ .alive-glitch-shake {
3342
+ animation: alive-glitch-shake 0.4s cubic-bezier(0.36, 0.07, 0.19, 0.97) both infinite;
3343
+ }
3344
+
3345
+ /* \u2500\u2500 Scene Transitions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
3346
+ Usage: stack two scene layers (position:absolute, same inset).
3347
+ Add .alive-transition-*-out to the LEAVING layer.
3348
+ Add .alive-transition-*-in to the ENTERING layer.
3349
+ Both run for --alive-tr-dur (default 600ms).
3350
+ For video export: render each layer separately and composite.
3351
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3352
+ .alive-transition-fade-out,
3353
+ .alive-transition-fade-in,
3354
+ .alive-transition-wipe-left-out,
3355
+ .alive-transition-wipe-left-in,
3356
+ .alive-transition-wipe-right-out,
3357
+ .alive-transition-wipe-right-in,
3358
+ .alive-transition-wipe-up-out,
3359
+ .alive-transition-wipe-up-in,
3360
+ .alive-transition-wipe-down-out,
3361
+ .alive-transition-wipe-down-in,
3362
+ .alive-transition-slide-left-out,
3363
+ .alive-transition-slide-left-in,
3364
+ .alive-transition-slide-right-out,
3365
+ .alive-transition-slide-right-in,
3366
+ .alive-transition-slide-up-out,
3367
+ .alive-transition-slide-up-in,
3368
+ .alive-transition-slide-down-out,
3369
+ .alive-transition-slide-down-in,
3370
+ .alive-transition-zoom-in-out,
3371
+ .alive-transition-zoom-in-in,
3372
+ .alive-transition-zoom-out-out,
3373
+ .alive-transition-zoom-out-in,
3374
+ .alive-transition-blur-out,
3375
+ .alive-transition-blur-in,
3376
+ .alive-transition-flip-out,
3377
+ .alive-transition-flip-in,
3378
+ .alive-transition-clock-out,
3379
+ .alive-transition-clock-in {
3380
+ --alive-tr-dur: 600ms;
3381
+ --alive-tr-ease: cubic-bezier(0.4, 0, 0.2, 1);
3382
+ animation-duration: var(--alive-tr-dur);
3383
+ animation-timing-function: var(--alive-tr-ease);
3384
+ animation-fill-mode: both;
3385
+ }
3386
+
3387
+ /* \u2500\u2500 Fade \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3388
+ @keyframes alive-tr-fade-out {
3389
+ from { opacity: 1; }
3390
+ to { opacity: 0; }
3391
+ }
3392
+ @keyframes alive-tr-fade-in {
3393
+ from { opacity: 0; }
3394
+ to { opacity: 1; }
3395
+ }
3396
+ .alive-transition-fade-out { animation-name: alive-tr-fade-out; }
3397
+ .alive-transition-fade-in { animation-name: alive-tr-fade-in; }
3398
+
3399
+ /* \u2500\u2500 Wipe left (reveal from right) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3400
+ @keyframes alive-tr-wipe-left-out {
3401
+ from { clip-path: inset(0 0 0 0); }
3402
+ to { clip-path: inset(0 100% 0 0); }
3403
+ }
3404
+ @keyframes alive-tr-wipe-left-in {
3405
+ from { clip-path: inset(0 0 0 100%); }
3406
+ to { clip-path: inset(0 0 0 0); }
3407
+ }
3408
+ .alive-transition-wipe-left-out { animation-name: alive-tr-wipe-left-out; }
3409
+ .alive-transition-wipe-left-in { animation-name: alive-tr-wipe-left-in; }
3410
+
3411
+ /* \u2500\u2500 Wipe right (reveal from left) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3412
+ @keyframes alive-tr-wipe-right-out {
3413
+ from { clip-path: inset(0 0 0 0); }
3414
+ to { clip-path: inset(0 0 0 100%); }
3415
+ }
3416
+ @keyframes alive-tr-wipe-right-in {
3417
+ from { clip-path: inset(0 100% 0 0); }
3418
+ to { clip-path: inset(0 0 0 0); }
3419
+ }
3420
+ .alive-transition-wipe-right-out { animation-name: alive-tr-wipe-right-out; }
3421
+ .alive-transition-wipe-right-in { animation-name: alive-tr-wipe-right-in; }
3422
+
3423
+ /* \u2500\u2500 Wipe up (reveal from bottom) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3424
+ @keyframes alive-tr-wipe-up-out {
3425
+ from { clip-path: inset(0 0 0 0); }
3426
+ to { clip-path: inset(100% 0 0 0); }
3427
+ }
3428
+ @keyframes alive-tr-wipe-up-in {
3429
+ from { clip-path: inset(0 0 100% 0); }
3430
+ to { clip-path: inset(0 0 0 0); }
3431
+ }
3432
+ .alive-transition-wipe-up-out { animation-name: alive-tr-wipe-up-out; }
3433
+ .alive-transition-wipe-up-in { animation-name: alive-tr-wipe-up-in; }
3434
+
3435
+ /* \u2500\u2500 Wipe down (reveal from top) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3436
+ @keyframes alive-tr-wipe-down-out {
3437
+ from { clip-path: inset(0 0 0 0); }
3438
+ to { clip-path: inset(0 0 100% 0); }
3439
+ }
3440
+ @keyframes alive-tr-wipe-down-in {
3441
+ from { clip-path: inset(100% 0 0 0); }
3442
+ to { clip-path: inset(0 0 0 0); }
3443
+ }
3444
+ .alive-transition-wipe-down-out { animation-name: alive-tr-wipe-down-out; }
3445
+ .alive-transition-wipe-down-in { animation-name: alive-tr-wipe-down-in; }
3446
+
3447
+ /* \u2500\u2500 Slide left (new scene pushes in from right) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3448
+ @keyframes alive-tr-slide-left-out {
3449
+ from { transform: translateX(0); opacity: 1; }
3450
+ to { transform: translateX(-40%); opacity: 0; }
3451
+ }
3452
+ @keyframes alive-tr-slide-left-in {
3453
+ from { transform: translateX(100%); opacity: 0; }
3454
+ to { transform: translateX(0); opacity: 1; }
3455
+ }
3456
+ .alive-transition-slide-left-out { animation-name: alive-tr-slide-left-out; }
3457
+ .alive-transition-slide-left-in { animation-name: alive-tr-slide-left-in; }
3458
+
3459
+ /* \u2500\u2500 Slide right (new scene pushes in from left) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3460
+ @keyframes alive-tr-slide-right-out {
3461
+ from { transform: translateX(0); opacity: 1; }
3462
+ to { transform: translateX(40%); opacity: 0; }
3463
+ }
3464
+ @keyframes alive-tr-slide-right-in {
3465
+ from { transform: translateX(-100%); opacity: 0; }
3466
+ to { transform: translateX(0); opacity: 1; }
3467
+ }
3468
+ .alive-transition-slide-right-out { animation-name: alive-tr-slide-right-out; }
3469
+ .alive-transition-slide-right-in { animation-name: alive-tr-slide-right-in; }
3470
+
3471
+ /* \u2500\u2500 Slide up (new scene pushes in from bottom) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3472
+ @keyframes alive-tr-slide-up-out {
3473
+ from { transform: translateY(0); opacity: 1; }
3474
+ to { transform: translateY(-40%); opacity: 0; }
3475
+ }
3476
+ @keyframes alive-tr-slide-up-in {
3477
+ from { transform: translateY(100%); opacity: 0; }
3478
+ to { transform: translateY(0); opacity: 1; }
3479
+ }
3480
+ .alive-transition-slide-up-out { animation-name: alive-tr-slide-up-out; }
3481
+ .alive-transition-slide-up-in { animation-name: alive-tr-slide-up-in; }
3482
+
3483
+ /* \u2500\u2500 Slide down (new scene pushes in from top) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3484
+ @keyframes alive-tr-slide-down-out {
3485
+ from { transform: translateY(0); opacity: 1; }
3486
+ to { transform: translateY(40%); opacity: 0; }
3487
+ }
3488
+ @keyframes alive-tr-slide-down-in {
3489
+ from { transform: translateY(-100%); opacity: 0; }
3490
+ to { transform: translateY(0); opacity: 1; }
3491
+ }
3492
+ .alive-transition-slide-down-out { animation-name: alive-tr-slide-down-out; }
3493
+ .alive-transition-slide-down-in { animation-name: alive-tr-slide-down-in; }
3494
+
3495
+ /* \u2500\u2500 Zoom in (old scene shrinks away) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3496
+ @keyframes alive-tr-zoom-in-out {
3497
+ from { transform: scale(1); opacity: 1; }
3498
+ to { transform: scale(0.75); opacity: 0; }
3499
+ }
3500
+ @keyframes alive-tr-zoom-in-in {
3501
+ from { transform: scale(1.25); opacity: 0; }
3502
+ to { transform: scale(1); opacity: 1; }
3503
+ }
3504
+ .alive-transition-zoom-in-out { animation-name: alive-tr-zoom-in-out; }
3505
+ .alive-transition-zoom-in-in { animation-name: alive-tr-zoom-in-in; }
3506
+
3507
+ /* \u2500\u2500 Zoom out (old scene blows up) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3508
+ @keyframes alive-tr-zoom-out-out {
3509
+ from { transform: scale(1); opacity: 1; }
3510
+ to { transform: scale(1.3); opacity: 0; }
3511
+ }
3512
+ @keyframes alive-tr-zoom-out-in {
3513
+ from { transform: scale(0.7); opacity: 0; }
3514
+ to { transform: scale(1); opacity: 1; }
3515
+ }
3516
+ .alive-transition-zoom-out-out { animation-name: alive-tr-zoom-out-out; }
3517
+ .alive-transition-zoom-out-in { animation-name: alive-tr-zoom-out-in; }
3518
+
3519
+ /* \u2500\u2500 Blur \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3520
+ @keyframes alive-tr-blur-out {
3521
+ from { filter: blur(0px); opacity: 1; transform: scale(1); }
3522
+ to { filter: blur(20px); opacity: 0; transform: scale(1.05); }
3523
+ }
3524
+ @keyframes alive-tr-blur-in {
3525
+ from { filter: blur(20px); opacity: 0; transform: scale(0.95); }
3526
+ to { filter: blur(0px); opacity: 1; transform: scale(1); }
3527
+ }
3528
+ .alive-transition-blur-out { animation-name: alive-tr-blur-out; }
3529
+ .alive-transition-blur-in { animation-name: alive-tr-blur-in; }
3530
+
3531
+ /* \u2500\u2500 Flip (3-D card flip on Y axis) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3532
+ @keyframes alive-tr-flip-out {
3533
+ from { transform: perspective(800px) rotateY(0deg); opacity: 1; }
3534
+ to { transform: perspective(800px) rotateY(-90deg); opacity: 0; }
3535
+ }
3536
+ @keyframes alive-tr-flip-in {
3537
+ from { transform: perspective(800px) rotateY(90deg); opacity: 0; }
3538
+ to { transform: perspective(800px) rotateY(0deg); opacity: 1; }
3539
+ }
3540
+ .alive-transition-flip-out { animation-name: alive-tr-flip-out; }
3541
+ .alive-transition-flip-in { animation-name: alive-tr-flip-in; }
3542
+
3543
+ /* \u2500\u2500 Clock wipe (radial reveal) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3544
+ @keyframes alive-tr-clock-out {
3545
+ from { clip-path: polygon(50% 50%, 50% 0%, 100% 0%, 100% 100%, 0% 100%, 0% 0%, 50% 0%); opacity: 1; }
3546
+ to { clip-path: polygon(50% 50%, 50% 0%, 50% 0%, 50% 0%, 50% 0%, 50% 0%, 50% 0%); opacity: 0; }
3547
+ }
3548
+ @keyframes alive-tr-clock-in {
3549
+ from { clip-path: polygon(50% 50%, 50% 0%, 50% 0%, 50% 0%, 50% 0%, 50% 0%, 50% 0%); }
3550
+ to { clip-path: polygon(50% 50%, 50% 0%, 100% 0%, 100% 100%, 0% 100%, 0% 0%, 50% 0%); }
3551
+ }
3552
+ .alive-transition-clock-out { animation-name: alive-tr-clock-out; }
3553
+ .alive-transition-clock-in { animation-name: alive-tr-clock-in; }
3554
+
3555
+ /* \u2500\u2500 Duration overrides \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3556
+ .alive-tr-fast { --alive-tr-dur: 300ms; }
3557
+ .alive-tr-slow { --alive-tr-dur: 900ms; }
3558
+ .alive-tr-xslow { --alive-tr-dur: 1400ms; }
3559
+
3560
+ /* \u2500\u2500 3D Scenes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
3561
+ CSS 3D building blocks for cinematic product videos.
3562
+ Most require a perspective parent (.alive-3d-scene).
3563
+ Note: opacity/filter/clip-path on a parent flatten preserve-3d
3564
+ contexts \u2014 keep 3D wrappers free of those properties.
3565
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3566
+
3567
+ /* \u2500\u2500 Foundation \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3568
+ .alive-3d-scene {
3569
+ perspective: var(--alive-3d-perspective, 900px);
3570
+ perspective-origin: 50% 40%;
3571
+ }
3572
+ .alive-3d-preserve { transform-style: preserve-3d; }
3573
+ .alive-3d-backface-hidden { backface-visibility: hidden; -webkit-backface-visibility: hidden; }
3574
+
3575
+ /* \u2500\u2500 Spinning cube \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3576
+ @keyframes alive-cube-spin {
3577
+ from { transform: rotateX(-18deg) rotateY(0deg); }
3578
+ to { transform: rotateX(-18deg) rotateY(360deg); }
3579
+ }
3580
+ .alive-3d-cube {
3581
+ --alive-cube-size: 80px;
3582
+ width: var(--alive-cube-size);
3583
+ height: var(--alive-cube-size);
3584
+ transform-style: preserve-3d;
3585
+ animation: alive-cube-spin 8s linear infinite;
3586
+ position: relative;
3587
+ }
3588
+ .alive-3d-cube .face {
3589
+ position: absolute;
3590
+ width: 100%;
3591
+ height: 100%;
3592
+ border: 1px solid rgba(255,255,255,0.12);
3593
+ backdrop-filter: blur(4px);
3594
+ }
3595
+ .alive-3d-cube .face-front { transform: translateZ(calc(var(--alive-cube-size) / 2)); background: rgba(99,102,241,0.22); }
3596
+ .alive-3d-cube .face-back { transform: rotateY(180deg) translateZ(calc(var(--alive-cube-size) / 2)); background: rgba(99,102,241,0.08); }
3597
+ .alive-3d-cube .face-left { transform: rotateY(-90deg) translateZ(calc(var(--alive-cube-size) / 2)); background: rgba(139,92,246,0.16); }
3598
+ .alive-3d-cube .face-right { transform: rotateY(90deg) translateZ(calc(var(--alive-cube-size) / 2)); background: rgba(139,92,246,0.16); }
3599
+ .alive-3d-cube .face-top { transform: rotateX(90deg) translateZ(calc(var(--alive-cube-size) / 2)); background: rgba(167,139,250,0.24); }
3600
+ .alive-3d-cube .face-bottom { transform: rotateX(-90deg) translateZ(calc(var(--alive-cube-size) / 2)); background: rgba(99,102,241,0.06); }
3601
+ .alive-3d-cube-sm { --alive-cube-size: 56px; }
3602
+ .alive-3d-cube-lg { --alive-cube-size: 120px; }
3603
+ /* Slow/fast spin */
3604
+ .alive-3d-cube.alive-tr-slow { animation-duration: 16s; }
3605
+ .alive-3d-cube.alive-tr-fast { animation-duration: 4s; }
3606
+
3607
+ /* \u2500\u2500 Card flip \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3608
+ @keyframes alive-3d-flip-loop {
3609
+ 0%, 35% { transform: rotateY(0deg); }
3610
+ 50%, 85% { transform: rotateY(180deg); }
3611
+ 100% { transform: rotateY(360deg); }
3612
+ }
3613
+ .alive-3d-flip {
3614
+ transform-style: preserve-3d;
3615
+ animation: alive-3d-flip-loop 4s cubic-bezier(0.4, 0, 0.2, 1) infinite;
3616
+ position: relative;
3617
+ }
3618
+ .alive-3d-flip-front,
3619
+ .alive-3d-flip-back {
3620
+ backface-visibility: hidden;
3621
+ -webkit-backface-visibility: hidden;
3622
+ }
3623
+ .alive-3d-flip-back {
3624
+ position: absolute;
3625
+ inset: 0;
3626
+ transform: rotateY(180deg);
3627
+ }
3628
+ /* Flip on X axis variant */
3629
+ @keyframes alive-3d-flip-x-loop {
3630
+ 0%, 35% { transform: rotateX(0deg); }
3631
+ 50%, 85% { transform: rotateX(180deg); }
3632
+ 100% { transform: rotateX(360deg); }
3633
+ }
3634
+ .alive-3d-flip-x {
3635
+ transform-style: preserve-3d;
3636
+ animation: alive-3d-flip-x-loop 4s cubic-bezier(0.4, 0, 0.2, 1) infinite;
3637
+ position: relative;
3638
+ }
3639
+ .alive-3d-flip-x .alive-3d-flip-back {
3640
+ transform: rotateX(180deg);
3641
+ }
3642
+
3643
+ /* \u2500\u2500 Stacked deck of cards \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3644
+ .alive-3d-stack {
3645
+ transform-style: preserve-3d;
3646
+ position: relative;
3647
+ }
3648
+ .alive-3d-stack > *:nth-child(1) {
3649
+ position: relative;
3650
+ transform: translateZ(0px) rotateX(0deg);
3651
+ z-index: 3;
3652
+ }
3653
+ .alive-3d-stack > *:nth-child(2) {
3654
+ position: absolute; inset: 0;
3655
+ transform: translateZ(-20px) translateY(10px) scale(0.96);
3656
+ z-index: 2;
3657
+ }
3658
+ .alive-3d-stack > *:nth-child(3) {
3659
+ position: absolute; inset: 0;
3660
+ transform: translateZ(-40px) translateY(20px) scale(0.92);
3661
+ z-index: 1;
3662
+ }
3663
+
3664
+ /* \u2500\u2500 Float layers (parallax Z depth) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3665
+ @keyframes alive-3d-float-anim {
3666
+ 0%, 100% { transform: translateZ(var(--alive-z, 0px)) translateY(0px); }
3667
+ 50% { transform: translateZ(var(--alive-z, 0px)) translateY(-10px); }
3668
+ }
3669
+ .alive-3d-float-layer { animation: alive-3d-float-anim 4s ease-in-out infinite; }
3670
+ .alive-3d-float-near { --alive-z: 80px; animation-delay: 0s; }
3671
+ .alive-3d-float-mid { --alive-z: 40px; animation-delay: -0.6s; }
3672
+ .alive-3d-float-base { --alive-z: 0px; animation-delay: -1.2s; }
3673
+ .alive-3d-float-far { --alive-z: -30px; animation-delay: -1.8s; }
3674
+
3675
+ /* \u2500\u2500 Extruded 3D text \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3676
+ .alive-3d-text {
3677
+ text-shadow:
3678
+ 1px 1px 0 rgba(0,0,0,0.28),
3679
+ 2px 2px 0 rgba(0,0,0,0.22),
3680
+ 3px 3px 0 rgba(0,0,0,0.18),
3681
+ 4px 4px 0 rgba(0,0,0,0.14),
3682
+ 5px 5px 0 rgba(0,0,0,0.10),
3683
+ 6px 6px 16px rgba(0,0,0,0.3);
3684
+ }
3685
+ .alive-3d-text-indigo {
3686
+ text-shadow:
3687
+ 1px 1px 0 rgba(79,70,229,0.7),
3688
+ 2px 2px 0 rgba(79,70,229,0.6),
3689
+ 3px 3px 0 rgba(79,70,229,0.5),
3690
+ 4px 4px 0 rgba(79,70,229,0.4),
3691
+ 5px 5px 0 rgba(79,70,229,0.3),
3692
+ 6px 6px 20px rgba(99,102,241,0.5);
3693
+ }
3694
+ .alive-3d-text-glow {
3695
+ text-shadow:
3696
+ 1px 1px 0 rgba(0,0,0,0.3),
3697
+ 2px 2px 0 rgba(0,0,0,0.22),
3698
+ 3px 3px 0 rgba(0,0,0,0.14),
3699
+ 0 0 40px rgba(99,102,241,0.7),
3700
+ 0 0 80px rgba(99,102,241,0.3);
3701
+ }
3702
+
3703
+ /* \u2500\u2500 Looping perspective tilt \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3704
+ @keyframes alive-3d-tilt-loop {
3705
+ 0% { transform: rotateX(0deg) rotateY(0deg); }
3706
+ 25% { transform: rotateX(8deg) rotateY(10deg); }
3707
+ 50% { transform: rotateX(0deg) rotateY(0deg); }
3708
+ 75% { transform: rotateX(-8deg) rotateY(-10deg); }
3709
+ 100% { transform: rotateX(0deg) rotateY(0deg); }
3710
+ }
3711
+ @keyframes alive-3d-tilt-loop-sm {
3712
+ 0% { transform: rotateX(0deg) rotateY(0deg); }
3713
+ 25% { transform: rotateX(4deg) rotateY(5deg); }
3714
+ 50% { transform: rotateX(0deg) rotateY(0deg); }
3715
+ 75% { transform: rotateX(-4deg) rotateY(-5deg); }
3716
+ 100% { transform: rotateX(0deg) rotateY(0deg); }
3717
+ }
3718
+ .alive-3d-tilt { transform-style: preserve-3d; animation: alive-3d-tilt-loop 6s ease-in-out infinite; }
3719
+ .alive-3d-tilt-sm { transform-style: preserve-3d; animation: alive-3d-tilt-loop-sm 6s ease-in-out infinite; }
3720
+
3721
+ /* \u2500\u2500 Continuous axis rotations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3722
+ @keyframes alive-rotate-y { from { transform: rotateY(0deg); } to { transform: rotateY(360deg); } }
3723
+ @keyframes alive-rotate-x { from { transform: rotateX(0deg); } to { transform: rotateX(360deg); } }
3724
+ @keyframes alive-rotate-z { from { transform: rotateZ(0deg); } to { transform: rotateZ(360deg); } }
3725
+ .alive-3d-rotate-y { animation: alive-rotate-y 6s linear infinite; transform-style: preserve-3d; }
3726
+ .alive-3d-rotate-x { animation: alive-rotate-x 8s linear infinite; transform-style: preserve-3d; }
3727
+ .alive-3d-rotate-z { animation: alive-rotate-z 6s linear infinite; }
3728
+ .alive-3d-rotate-y.alive-tr-fast { animation-duration: 3s; }
3729
+ .alive-3d-rotate-y.alive-tr-slow { animation-duration: 12s; }
3730
+ .alive-3d-rotate-x.alive-tr-fast { animation-duration: 4s; }
3731
+ .alive-3d-rotate-x.alive-tr-slow { animation-duration: 16s; }
3732
+
3733
+ /* \u2500\u2500 3D Carousel (6-item ring) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3734
+ @keyframes alive-carousel-spin {
3735
+ from { transform: rotateY(0deg); }
3736
+ to { transform: rotateY(-360deg); }
3737
+ }
3738
+ .alive-3d-carousel {
3739
+ transform-style: preserve-3d;
3740
+ animation: alive-carousel-spin 12s linear infinite;
3741
+ position: relative;
3742
+ width: 100%;
3743
+ height: 100%;
3744
+ }
3745
+ .alive-3d-carousel > * { position: absolute; top: 50%; left: 50%; }
3746
+ .alive-3d-carousel > *:nth-child(1) { transform: translate(-50%,-50%) rotateY(0deg) translateZ(var(--alive-carousel-r, 140px)); }
3747
+ .alive-3d-carousel > *:nth-child(2) { transform: translate(-50%,-50%) rotateY(60deg) translateZ(var(--alive-carousel-r, 140px)); }
3748
+ .alive-3d-carousel > *:nth-child(3) { transform: translate(-50%,-50%) rotateY(120deg) translateZ(var(--alive-carousel-r, 140px)); }
3749
+ .alive-3d-carousel > *:nth-child(4) { transform: translate(-50%,-50%) rotateY(180deg) translateZ(var(--alive-carousel-r, 140px)); }
3750
+ .alive-3d-carousel > *:nth-child(5) { transform: translate(-50%,-50%) rotateY(240deg) translateZ(var(--alive-carousel-r, 140px)); }
3751
+ .alive-3d-carousel > *:nth-child(6) { transform: translate(-50%,-50%) rotateY(300deg) translateZ(var(--alive-carousel-r, 140px)); }
3752
+ /* 4-item variant */
3753
+ .alive-3d-carousel-4 > *:nth-child(1) { transform: translate(-50%,-50%) rotateY(0deg) translateZ(var(--alive-carousel-r, 120px)); }
3754
+ .alive-3d-carousel-4 > *:nth-child(2) { transform: translate(-50%,-50%) rotateY(90deg) translateZ(var(--alive-carousel-r, 120px)); }
3755
+ .alive-3d-carousel-4 > *:nth-child(3) { transform: translate(-50%,-50%) rotateY(180deg) translateZ(var(--alive-carousel-r, 120px)); }
3756
+ .alive-3d-carousel-4 > *:nth-child(4) { transform: translate(-50%,-50%) rotateY(270deg) translateZ(var(--alive-carousel-r, 120px)); }
3757
+ .alive-3d-carousel.alive-tr-slow { animation-duration: 24s; }
3758
+ .alive-3d-carousel.alive-tr-fast { animation-duration: 6s; }
3759
+
3760
+ /* \u2500\u2500 Charts & Data Visualization \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3761
+ @keyframes alive-bar-grow {
3762
+ from { transform: scaleY(0); }
3763
+ to { transform: scaleY(1); }
3764
+ }
3765
+ @keyframes alive-bar-shimmer {
3766
+ 0% { background-position: -200% 0; }
3767
+ 100% { background-position: 200% 0; }
3768
+ }
3769
+ .alive-bar-chart {
3770
+ display: flex;
3771
+ align-items: flex-end;
3772
+ gap: 6px;
3773
+ height: 100px;
3774
+ }
3775
+ .alive-bar {
3776
+ flex: 1;
3777
+ transform-origin: bottom;
3778
+ border-radius: 4px 4px 0 0;
3779
+ animation: alive-bar-grow 0.7s cubic-bezier(0.22, 1, 0.36, 1) both;
3780
+ background: linear-gradient(180deg, rgba(99,102,241,0.9) 0%, rgba(99,102,241,0.5) 100%);
3781
+ position: relative;
3782
+ overflow: hidden;
3783
+ }
3784
+ .alive-bar::after {
3785
+ content: '';
3786
+ position: absolute; inset: 0;
3787
+ background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.15) 50%, transparent 100%);
3788
+ background-size: 200% 100%;
3789
+ animation: alive-bar-shimmer 2s ease-in-out infinite;
3790
+ animation-delay: inherit;
3791
+ }
3792
+ .alive-bar:nth-child(1) { animation-delay: 0ms; }
3793
+ .alive-bar:nth-child(2) { animation-delay: 80ms; }
3794
+ .alive-bar:nth-child(3) { animation-delay: 160ms; }
3795
+ .alive-bar:nth-child(4) { animation-delay: 240ms; }
3796
+ .alive-bar:nth-child(5) { animation-delay: 320ms; }
3797
+ .alive-bar:nth-child(6) { animation-delay: 400ms; }
3798
+ .alive-bar:nth-child(7) { animation-delay: 480ms; }
3799
+ /* Color variants */
3800
+ .alive-bar-indigo { background: linear-gradient(180deg, rgba(99,102,241,0.9), rgba(99,102,241,0.4)); }
3801
+ .alive-bar-violet { background: linear-gradient(180deg, rgba(139,92,246,0.9), rgba(139,92,246,0.4)); }
3802
+ .alive-bar-sky { background: linear-gradient(180deg, rgba(14,165,233,0.9), rgba(14,165,233,0.4)); }
3803
+ .alive-bar-emerald { background: linear-gradient(180deg, rgba(16,185,129,0.9), rgba(16,185,129,0.4)); }
3804
+ .alive-bar-rose { background: linear-gradient(180deg, rgba(244,63,94,0.9), rgba(244,63,94,0.4)); }
3805
+ .alive-bar-amber { background: linear-gradient(180deg, rgba(251,191,36,0.9), rgba(251,191,36,0.4)); }
3806
+ /* Chart axis / labels */
3807
+ .alive-chart-axis {
3808
+ display: flex;
3809
+ align-items: flex-end;
3810
+ gap: 6px;
3811
+ border-top: 1px solid rgba(255,255,255,0.1);
3812
+ padding-top: 6px;
3813
+ margin-top: 4px;
3814
+ }
3815
+ .alive-chart-label {
3816
+ flex: 1;
3817
+ text-align: center;
3818
+ font-size: 0.625rem;
3819
+ color: rgba(255,255,255,0.35);
3820
+ font-weight: 500;
3821
+ }
3822
+ /* Donut / ring chart \u2014 use SVG stroke-dashoffset */
3823
+ @keyframes alive-donut-fill {
3824
+ from { stroke-dashoffset: var(--alive-donut-circ, 283); }
3825
+ to { stroke-dashoffset: var(--alive-donut-gap, 0); }
3826
+ }
3827
+ .alive-donut-arc {
3828
+ fill: none;
3829
+ stroke-linecap: round;
3830
+ animation: alive-donut-fill 1s cubic-bezier(0.22, 1, 0.36, 1) both;
3831
+ transform-origin: center;
3832
+ transform: rotate(-90deg);
3833
+ }
3834
+ /* Line chart path draw */
3835
+ @keyframes alive-line-draw {
3836
+ from { stroke-dashoffset: var(--alive-line-len, 500); }
3837
+ to { stroke-dashoffset: 0; }
3838
+ }
3839
+ .alive-line-path {
3840
+ fill: none;
3841
+ stroke-linecap: round;
3842
+ stroke-linejoin: round;
3843
+ animation: alive-line-draw 1.2s cubic-bezier(0.22, 1, 0.36, 1) both;
3844
+ }
3845
+ /* Area fill under line */
3846
+ @keyframes alive-area-fill {
3847
+ from { opacity: 0; }
3848
+ to { opacity: 1; }
3849
+ }
3850
+ .alive-area-fill {
3851
+ animation: alive-area-fill 1.2s ease 0.3s both;
3852
+ }
3853
+
3854
+ /* \u2500\u2500 Device Frames \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3855
+ /* Browser */
3856
+ .alive-device-browser {
3857
+ border-radius: 12px;
3858
+ border: 1px solid rgba(255,255,255,0.1);
3859
+ background: rgba(255,255,255,0.03);
3860
+ overflow: hidden;
3861
+ box-shadow: 0 24px 64px rgba(0,0,0,0.4);
3862
+ }
3863
+ .alive-device-browser-bar {
3864
+ height: 38px;
3865
+ background: rgba(255,255,255,0.05);
3866
+ border-bottom: 1px solid rgba(255,255,255,0.07);
3867
+ display: flex;
3868
+ align-items: center;
3869
+ gap: 6px;
3870
+ padding: 0 14px;
3871
+ flex-shrink: 0;
3872
+ }
3873
+ .alive-device-browser-dot {
3874
+ width: 10px; height: 10px;
3875
+ border-radius: 50%;
3876
+ flex-shrink: 0;
3877
+ }
3878
+ .alive-device-browser-dot:nth-child(1) { background: rgba(255,95,87,0.8); }
3879
+ .alive-device-browser-dot:nth-child(2) { background: rgba(254,188,46,0.8); }
3880
+ .alive-device-browser-dot:nth-child(3) { background: rgba(40,200,64,0.8); }
3881
+ .alive-device-browser-url {
3882
+ flex: 1;
3883
+ height: 20px;
3884
+ background: rgba(255,255,255,0.07);
3885
+ border-radius: 5px;
3886
+ margin: 0 10px;
3887
+ }
3888
+ .alive-device-browser-screen {
3889
+ overflow: hidden;
3890
+ }
3891
+ /* Phone */
3892
+ .alive-device-phone {
3893
+ border-radius: 36px;
3894
+ border: 1.5px solid rgba(255,255,255,0.12);
3895
+ background: rgba(255,255,255,0.03);
3896
+ padding: 44px 10px 28px;
3897
+ position: relative;
3898
+ overflow: hidden;
3899
+ box-shadow: 0 24px 64px rgba(0,0,0,0.4), inset 0 1px 0 rgba(255,255,255,0.08);
3900
+ }
3901
+ .alive-device-phone::before {
3902
+ content: '';
3903
+ position: absolute;
3904
+ top: 14px; left: 50%; transform: translateX(-50%);
3905
+ width: 64px; height: 20px;
3906
+ border-radius: 999px;
3907
+ background: rgba(255,255,255,0.08);
3908
+ border: 1px solid rgba(255,255,255,0.1);
3909
+ }
3910
+ .alive-device-phone::after {
3911
+ content: '';
3912
+ position: absolute;
3913
+ bottom: 10px; left: 50%; transform: translateX(-50%);
3914
+ width: 80px; height: 4px;
3915
+ border-radius: 2px;
3916
+ background: rgba(255,255,255,0.25);
3917
+ }
3918
+ .alive-device-phone-screen {
3919
+ border-radius: 24px;
3920
+ overflow: hidden;
3921
+ }
3922
+ /* Tablet */
3923
+ .alive-device-tablet {
3924
+ border-radius: 20px;
3925
+ border: 1.5px solid rgba(255,255,255,0.12);
3926
+ background: rgba(255,255,255,0.03);
3927
+ padding: 32px 16px;
3928
+ position: relative;
3929
+ overflow: hidden;
3930
+ box-shadow: 0 24px 64px rgba(0,0,0,0.4);
3931
+ }
3932
+ .alive-device-tablet::after {
3933
+ content: '';
3934
+ position: absolute;
3935
+ right: 6px; top: 50%; transform: translateY(-50%);
3936
+ width: 3px; height: 36px;
3937
+ border-radius: 2px;
3938
+ background: rgba(255,255,255,0.15);
3939
+ }
3940
+ /* Laptop */
3941
+ .alive-device-laptop {
3942
+ position: relative;
3943
+ }
3944
+ .alive-device-laptop-screen {
3945
+ border-radius: 12px 12px 0 0;
3946
+ border: 1.5px solid rgba(255,255,255,0.12);
3947
+ border-bottom: none;
3948
+ background: rgba(255,255,255,0.03);
3949
+ padding: 6px;
3950
+ overflow: hidden;
3951
+ box-shadow: 0 -4px 24px rgba(0,0,0,0.3);
3952
+ }
3953
+ .alive-device-laptop-base {
3954
+ height: 16px;
3955
+ background: rgba(255,255,255,0.06);
3956
+ border-radius: 0 0 4px 4px;
3957
+ border: 1px solid rgba(255,255,255,0.08);
3958
+ border-top: none;
3959
+ position: relative;
3960
+ }
3961
+ .alive-device-laptop-base::after {
3962
+ content: '';
3963
+ position: absolute;
3964
+ top: 4px; left: 50%; transform: translateX(-50%);
3965
+ width: 40px; height: 4px;
3966
+ border-radius: 2px;
3967
+ background: rgba(255,255,255,0.12);
3968
+ }
3969
+
3970
+ /* \u2500\u2500 Cursor & Interactions \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
3971
+ @keyframes alive-cursor-blink {
3972
+ 0%, 100% { opacity: 1; }
3973
+ 50% { opacity: 0; }
3974
+ }
3975
+ @keyframes alive-click-ripple {
3976
+ 0% { transform: scale(0); opacity: 0.8; }
3977
+ 100% { transform: scale(3); opacity: 0; }
3978
+ }
3979
+ @keyframes alive-cursor-appear {
3980
+ from { transform: scale(0.5) translateY(-8px); opacity: 0; }
3981
+ to { transform: scale(1) translateY(0); opacity: 1; }
3982
+ }
3983
+ .alive-cursor {
3984
+ width: 12px; height: 12px;
3985
+ border-radius: 50%;
3986
+ background: #fff;
3987
+ position: absolute;
3988
+ pointer-events: none;
3989
+ z-index: 9999;
3990
+ box-shadow: 0 0 0 1.5px rgba(0,0,0,0.3);
3991
+ animation: alive-cursor-appear 0.3s cubic-bezier(0.22, 1, 0.36, 1) both;
3992
+ }
3993
+ .alive-cursor-ring {
3994
+ width: 32px; height: 32px;
3995
+ border-radius: 50%;
3996
+ border: 1.5px solid rgba(255,255,255,0.6);
3997
+ position: absolute;
3998
+ pointer-events: none;
3999
+ z-index: 9998;
4000
+ transform: translate(-10px, -10px);
4001
+ transition: transform 0.1s ease;
4002
+ }
4003
+ .alive-click-ripple {
4004
+ width: 24px; height: 24px;
4005
+ border-radius: 50%;
4006
+ background: rgba(255,255,255,0.3);
4007
+ position: absolute;
4008
+ pointer-events: none;
4009
+ animation: alive-click-ripple 0.6s ease-out forwards;
4010
+ }
4011
+ /* Hover highlight glow */
4012
+ @keyframes alive-hover-pulse {
4013
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(99,102,241,0.4); }
4014
+ 50% { box-shadow: 0 0 0 8px rgba(99,102,241,0); }
4015
+ }
4016
+ .alive-hover-glow {
4017
+ animation: alive-hover-pulse 2s ease-in-out infinite;
4018
+ }
4019
+ /* Text cursor (caret) */
4020
+ @keyframes alive-caret-blink {
4021
+ 0%, 100% { border-right-color: currentColor; }
4022
+ 50% { border-right-color: transparent; }
4023
+ }
4024
+ .alive-text-cursor {
4025
+ border-right: 2px solid currentColor;
4026
+ animation: alive-caret-blink 1s step-end infinite;
4027
+ }
4028
+ /* Scroll indicator */
4029
+ @keyframes alive-scroll-bounce {
4030
+ 0%, 100% { transform: translateY(0); opacity: 1; }
4031
+ 50% { transform: translateY(6px); opacity: 0.4; }
4032
+ }
4033
+ .alive-scroll-indicator {
4034
+ animation: alive-scroll-bounce 1.5s ease-in-out infinite;
4035
+ }
4036
+
4037
+ /* \u2500\u2500 Lower Thirds \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
4038
+ @keyframes alive-lower-third-in {
4039
+ from { transform: translateX(-40px); opacity: 0; }
4040
+ to { transform: translateX(0); opacity: 1; }
4041
+ }
4042
+ @keyframes alive-lower-third-bar {
4043
+ from { transform: scaleX(0); }
4044
+ to { transform: scaleX(1); }
4045
+ }
4046
+ .alive-lower-third {
4047
+ display: inline-flex;
4048
+ flex-direction: column;
4049
+ gap: 3px;
4050
+ padding: 10px 16px 10px 14px;
4051
+ background: rgba(0,0,0,0.75);
4052
+ backdrop-filter: blur(12px);
4053
+ border-left: 3px solid #6366f1;
4054
+ border-radius: 0 8px 8px 0;
4055
+ animation: alive-lower-third-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;
4056
+ }
4057
+ .alive-lower-third-name {
4058
+ font-size: 0.9375rem;
4059
+ font-weight: 700;
4060
+ color: #fff;
4061
+ letter-spacing: -0.01em;
4062
+ }
4063
+ .alive-lower-third-title {
4064
+ font-size: 0.75rem;
4065
+ color: rgba(255,255,255,0.55);
4066
+ font-weight: 500;
4067
+ animation: alive-lower-third-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) 80ms both;
4068
+ }
4069
+ /* variants */
4070
+ .alive-lower-third-indigo { border-left-color: #6366f1; }
4071
+ .alive-lower-third-sky { border-left-color: #0ea5e9; }
4072
+ .alive-lower-third-emerald{ border-left-color: #10b981; }
4073
+ .alive-lower-third-rose { border-left-color: #f43f5e; }
4074
+ .alive-lower-third-amber { border-left-color: #f59e0b; }
4075
+ /* light variant */
4076
+ .alive-lower-third-light {
4077
+ background: rgba(255,255,255,0.92);
4078
+ }
4079
+ .alive-lower-third-light .alive-lower-third-name { color: #111; }
4080
+ .alive-lower-third-light .alive-lower-third-title { color: rgba(0,0,0,0.5); }
4081
+ /* News ticker */
4082
+ @keyframes alive-ticker-scroll {
4083
+ from { transform: translateX(100%); }
4084
+ to { transform: translateX(-100%); }
4085
+ }
4086
+ .alive-ticker {
4087
+ overflow: hidden;
4088
+ white-space: nowrap;
4089
+ background: rgba(99,102,241,0.9);
4090
+ padding: 8px 0;
4091
+ font-size: 0.8125rem;
4092
+ font-weight: 600;
4093
+ color: #fff;
4094
+ letter-spacing: 0.01em;
4095
+ }
4096
+ .alive-ticker-track {
4097
+ display: inline-block;
4098
+ animation: alive-ticker-scroll 18s linear infinite;
4099
+ padding-right: 4rem;
4100
+ }
4101
+ .alive-ticker-sep {
4102
+ display: inline-block;
4103
+ margin: 0 1.5rem;
4104
+ opacity: 0.5;
4105
+ }
4106
+ /* Chapter / scene title card */
4107
+ @keyframes alive-title-card-in {
4108
+ from { transform: translateY(20px); opacity: 0; }
4109
+ to { transform: translateY(0); opacity: 1; }
4110
+ }
4111
+ .alive-title-card {
4112
+ text-align: center;
4113
+ animation: alive-title-card-in 0.6s cubic-bezier(0.22, 1, 0.36, 1) both;
4114
+ }
4115
+ .alive-title-card-eyebrow {
4116
+ font-size: 0.6875rem;
4117
+ font-weight: 600;
4118
+ letter-spacing: 0.1em;
4119
+ text-transform: uppercase;
4120
+ color: #818cf8;
4121
+ margin-bottom: 6px;
4122
+ animation: alive-title-card-in 0.6s cubic-bezier(0.22, 1, 0.36, 1) 80ms both;
4123
+ }
4124
+ .alive-title-card-heading {
4125
+ font-size: 1.5rem;
4126
+ font-weight: 800;
4127
+ color: #fff;
4128
+ letter-spacing: -0.03em;
4129
+ line-height: 1.1;
4130
+ animation: alive-title-card-in 0.6s cubic-bezier(0.22, 1, 0.36, 1) 140ms both;
4131
+ }
4132
+
4133
+ /* \u2500\u2500 Callouts & Annotations \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
4134
+ @keyframes alive-callout-in {
4135
+ from { transform: scale(0.8) translateY(8px); opacity: 0; }
4136
+ to { transform: scale(1) translateY(0); opacity: 1; }
4137
+ }
4138
+ @keyframes alive-highlight-draw {
4139
+ from { clip-path: inset(0 100% 0 0 round 6px); }
4140
+ to { clip-path: inset(0 0% 0 0 round 6px); }
4141
+ }
4142
+ @keyframes alive-line-draw-in {
4143
+ from { stroke-dashoffset: 100; }
4144
+ to { stroke-dashoffset: 0; }
4145
+ }
4146
+ /* Callout bubble */
4147
+ .alive-callout {
4148
+ display: inline-flex;
4149
+ align-items: center;
4150
+ gap: 8px;
4151
+ padding: 8px 14px;
4152
+ background: rgba(99,102,241,0.15);
4153
+ border: 1px solid rgba(99,102,241,0.35);
4154
+ border-radius: 999px;
4155
+ font-size: 0.8125rem;
4156
+ font-weight: 600;
4157
+ color: #a5b4fc;
4158
+ animation: alive-callout-in 0.4s cubic-bezier(0.22, 1, 0.36, 1) both;
4159
+ }
4160
+ .alive-callout-arrow {
4161
+ display: inline-block;
4162
+ animation: alive-callout-in 0.4s cubic-bezier(0.22, 1, 0.36, 1) 60ms both;
4163
+ }
4164
+ /* Highlight box around an element */
4165
+ .alive-highlight-box {
4166
+ position: absolute;
4167
+ border: 2px solid #6366f1;
4168
+ border-radius: 8px;
4169
+ pointer-events: none;
4170
+ animation: alive-callout-in 0.4s cubic-bezier(0.22, 1, 0.36, 1) both;
4171
+ box-shadow: 0 0 0 4px rgba(99,102,241,0.15);
4172
+ }
4173
+ /* Underline highlight (text marker) */
4174
+ .alive-underline-highlight {
4175
+ position: relative;
4176
+ display: inline-block;
4177
+ }
4178
+ .alive-underline-highlight::after {
4179
+ content: '';
4180
+ position: absolute;
4181
+ left: 0; bottom: -2px;
4182
+ height: 3px;
4183
+ width: 100%;
4184
+ background: linear-gradient(90deg, #6366f1, #8b5cf6);
4185
+ border-radius: 2px;
4186
+ transform-origin: left;
4187
+ animation: alive-lower-third-bar 0.5s cubic-bezier(0.22, 1, 0.36, 1) 0.3s both;
4188
+ }
4189
+ /* Step marker */
4190
+ @keyframes alive-step-in {
4191
+ from { transform: scale(0) rotate(-90deg); opacity: 0; }
4192
+ to { transform: scale(1) rotate(0deg); opacity: 1; }
4193
+ }
4194
+ .alive-step-marker {
4195
+ width: 28px; height: 28px;
4196
+ border-radius: 50%;
4197
+ background: #6366f1;
4198
+ display: flex; align-items: center; justify-content: center;
4199
+ font-weight: 700; font-size: 0.8125rem; color: #fff;
4200
+ flex-shrink: 0;
4201
+ animation: alive-step-in 0.4s cubic-bezier(0.22, 1, 0.36, 1) both;
4202
+ }
4203
+ .alive-step-marker-outline {
4204
+ background: transparent;
4205
+ border: 2px solid #6366f1;
4206
+ color: #818cf8;
4207
+ }
4208
+ /* Zoom lens */
4209
+ .alive-zoom-lens {
4210
+ border-radius: 50%;
4211
+ border: 2px solid rgba(99,102,241,0.5);
4212
+ box-shadow: 0 0 0 4px rgba(99,102,241,0.1), 0 8px 32px rgba(0,0,0,0.3);
4213
+ overflow: hidden;
4214
+ animation: alive-callout-in 0.4s cubic-bezier(0.22, 1, 0.36, 1) both;
4215
+ }
4216
+ /* SVG annotation line */
4217
+ .alive-annotation-line {
4218
+ stroke-dasharray: 100;
4219
+ animation: alive-line-draw-in 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;
4220
+ }
4221
+
4222
+ /* \u2500\u2500 Kinetic Typography \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
4223
+ /* Slam \u2014 drops from above, impacts with squash */
4224
+ @keyframes alive-kinetic-slam {
4225
+ 0% { transform: translateY(-60px) scaleY(1.3); opacity: 0; }
4226
+ 55% { transform: translateY(6px) scaleY(0.88); opacity: 1; }
4227
+ 75% { transform: translateY(-3px) scaleY(1.04); }
4228
+ 100% { transform: translateY(0) scaleY(1); }
4229
+ }
4230
+ .alive-kinetic-slam {
4231
+ display: inline-block;
4232
+ animation: alive-kinetic-slam 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;
4233
+ }
4234
+ /* Pop \u2014 scale in with overshoot */
4235
+ @keyframes alive-kinetic-pop {
4236
+ 0% { transform: scale(0); opacity: 0; }
4237
+ 55% { transform: scale(1.15); opacity: 1; }
4238
+ 75% { transform: scale(0.92); }
4239
+ 100% { transform: scale(1); }
4240
+ }
4241
+ .alive-kinetic-pop {
4242
+ display: inline-block;
4243
+ animation: alive-kinetic-pop 0.45s cubic-bezier(0.22, 1, 0.36, 1) both;
4244
+ }
4245
+ /* Roll \u2014 comes from below with perspective */
4246
+ @keyframes alive-kinetic-roll {
4247
+ from { transform: translateY(80%) rotateX(60deg); opacity: 0; }
4248
+ to { transform: translateY(0) rotateX(0deg); opacity: 1; }
4249
+ }
4250
+ .alive-kinetic-roll {
4251
+ display: inline-block;
4252
+ transform-style: preserve-3d;
4253
+ animation: alive-kinetic-roll 0.5s cubic-bezier(0.22, 1, 0.36, 1) both;
4254
+ }
4255
+ /* Stretch \u2014 squishes then stretches to final size */
4256
+ @keyframes alive-kinetic-stretch {
4257
+ 0% { transform: scaleX(0.1) scaleY(1.5); opacity: 0; }
4258
+ 40% { transform: scaleX(1.1) scaleY(0.9); opacity: 1; }
4259
+ 70% { transform: scaleX(0.96) scaleY(1.04); }
4260
+ 100% { transform: scaleX(1) scaleY(1); }
4261
+ }
4262
+ .alive-kinetic-stretch {
4263
+ display: inline-block;
4264
+ animation: alive-kinetic-stretch 0.55s cubic-bezier(0.22, 1, 0.36, 1) both;
4265
+ }
4266
+ /* Neon flicker */
4267
+ @keyframes alive-kinetic-neon {
4268
+ 0%, 18%, 22%, 25%, 53%, 57%, 100% {
4269
+ text-shadow:
4270
+ 0 0 6px rgba(99,102,241,0.9),
4271
+ 0 0 16px rgba(99,102,241,0.7),
4272
+ 0 0 32px rgba(99,102,241,0.5),
4273
+ 0 0 64px rgba(99,102,241,0.3);
4274
+ }
4275
+ 20%, 24%, 55% { text-shadow: none; }
4276
+ }
4277
+ .alive-kinetic-neon {
4278
+ animation: alive-kinetic-neon 2.5s ease-in-out infinite;
4279
+ color: #a5b4fc;
4280
+ }
4281
+ /* Wave \u2014 each character waves */
4282
+ @keyframes alive-kinetic-wave-char {
4283
+ 0%, 100% { transform: translateY(0); }
4284
+ 50% { transform: translateY(-12px); }
4285
+ }
4286
+ .alive-kinetic-wave > span {
4287
+ display: inline-block;
4288
+ animation: alive-kinetic-wave-char 1s ease-in-out infinite;
4289
+ }
4290
+ .alive-kinetic-wave > span:nth-child(1) { animation-delay: 0ms; }
4291
+ .alive-kinetic-wave > span:nth-child(2) { animation-delay: 80ms; }
4292
+ .alive-kinetic-wave > span:nth-child(3) { animation-delay: 160ms; }
4293
+ .alive-kinetic-wave > span:nth-child(4) { animation-delay: 240ms; }
4294
+ .alive-kinetic-wave > span:nth-child(5) { animation-delay: 320ms; }
4295
+ .alive-kinetic-wave > span:nth-child(6) { animation-delay: 400ms; }
4296
+ .alive-kinetic-wave > span:nth-child(7) { animation-delay: 480ms; }
4297
+ .alive-kinetic-wave > span:nth-child(8) { animation-delay: 560ms; }
4298
+ .alive-kinetic-wave > span:nth-child(9) { animation-delay: 640ms; }
4299
+ .alive-kinetic-wave > span:nth-child(10) { animation-delay: 720ms; }
4300
+ /* Scramble placeholder \u2014 apply class, JS runtime handles character cycling */
4301
+ .alive-kinetic-scramble {
4302
+ font-family: ui-monospace, monospace;
4303
+ letter-spacing: 0.02em;
4304
+ }
4305
+ /* Gradient text animation */
4306
+ @keyframes alive-text-gradient-shift {
4307
+ 0% { background-position: 0% 50%; }
4308
+ 50% { background-position: 100% 50%; }
4309
+ 100% { background-position: 0% 50%; }
4310
+ }
4311
+ .alive-kinetic-gradient {
4312
+ background: linear-gradient(135deg, #6366f1, #8b5cf6, #0ea5e9, #6366f1);
4313
+ background-size: 300% 300%;
4314
+ -webkit-background-clip: text;
4315
+ -webkit-text-fill-color: transparent;
4316
+ background-clip: text;
4317
+ animation: alive-text-gradient-shift 4s ease infinite;
4318
+ }
4319
+
4320
+ /* \u2500\u2500 Scene Backgrounds \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
4321
+ /* Aurora */
4322
+ @keyframes alive-aurora-drift {
4323
+ 0% { background-position: 0% 50%; }
4324
+ 50% { background-position: 100% 50%; }
4325
+ 100% { background-position: 0% 50%; }
4326
+ }
4327
+ .alive-aurora {
4328
+ background: linear-gradient(135deg,
4329
+ rgba(99,102,241,0.5) 0%,
4330
+ rgba(14,165,233,0.4) 20%,
4331
+ rgba(139,92,246,0.5) 40%,
4332
+ rgba(16,185,129,0.35) 60%,
4333
+ rgba(99,102,241,0.5) 80%,
4334
+ rgba(14,165,233,0.4) 100%
4335
+ );
4336
+ background-size: 400% 400%;
4337
+ animation: alive-aurora-drift 10s ease infinite;
4338
+ }
4339
+ .alive-aurora-dark {
4340
+ background: linear-gradient(135deg,
4341
+ rgba(49,46,129,0.8) 0%,
4342
+ rgba(7,89,133,0.7) 25%,
4343
+ rgba(76,29,149,0.8) 50%,
4344
+ rgba(6,78,59,0.6) 75%,
4345
+ rgba(49,46,129,0.8) 100%
4346
+ );
4347
+ background-size: 400% 400%;
4348
+ animation: alive-aurora-drift 12s ease infinite;
4349
+ }
4350
+ /* Bokeh \u2014 blurred orbs */
4351
+ @keyframes alive-bokeh-drift {
4352
+ 0%, 100% { transform: translate(0, 0) scale(1); }
4353
+ 33% { transform: translate(20px, -15px) scale(1.1); }
4354
+ 66% { transform: translate(-15px, 10px) scale(0.9); }
4355
+ }
4356
+ .alive-bokeh {
4357
+ position: relative;
4358
+ overflow: hidden;
4359
+ }
4360
+ .alive-bokeh::before,
4361
+ .alive-bokeh::after {
4362
+ content: '';
4363
+ position: absolute;
4364
+ border-radius: 50%;
4365
+ filter: blur(40px);
4366
+ animation: alive-bokeh-drift 8s ease-in-out infinite;
4367
+ }
4368
+ .alive-bokeh::before {
4369
+ width: 200px; height: 200px;
4370
+ background: rgba(99,102,241,0.35);
4371
+ top: -50px; left: -50px;
4372
+ }
4373
+ .alive-bokeh::after {
4374
+ width: 160px; height: 160px;
4375
+ background: rgba(139,92,246,0.3);
4376
+ bottom: -40px; right: -40px;
4377
+ animation-delay: -4s;
4378
+ animation-direction: reverse;
4379
+ }
4380
+ /* Light rays / crepuscular */
4381
+ @keyframes alive-rays-spin {
4382
+ from { transform: rotate(0deg); }
4383
+ to { transform: rotate(360deg); }
4384
+ }
4385
+ .alive-rays {
4386
+ background: conic-gradient(
4387
+ rgba(99,102,241,0.12) 0deg, transparent 25deg,
4388
+ rgba(99,102,241,0.08) 50deg, transparent 75deg,
4389
+ rgba(99,102,241,0.12) 100deg, transparent 125deg,
4390
+ rgba(99,102,241,0.08) 150deg, transparent 175deg,
4391
+ rgba(99,102,241,0.12) 200deg, transparent 225deg,
4392
+ rgba(99,102,241,0.08) 250deg, transparent 275deg,
4393
+ rgba(99,102,241,0.12) 300deg, transparent 325deg,
4394
+ rgba(99,102,241,0.08) 350deg, transparent 360deg
4395
+ );
4396
+ animation: alive-rays-spin 24s linear infinite;
4397
+ }
4398
+ /* Starfield \u2014 dot pattern with twinkle */
4399
+ @keyframes alive-star-twinkle {
4400
+ 0%, 100% { opacity: 0.8; }
4401
+ 50% { opacity: 0.2; }
4402
+ }
4403
+ .alive-starfield {
4404
+ position: relative;
4405
+ overflow: hidden;
4406
+ }
4407
+ .alive-starfield::before {
4408
+ content: '';
4409
+ position: absolute; inset: 0;
4410
+ background-image:
4411
+ radial-gradient(1px 1px at 10% 15%, rgba(255,255,255,0.7) 0%, transparent 100%),
4412
+ radial-gradient(1px 1px at 25% 60%, rgba(255,255,255,0.5) 0%, transparent 100%),
4413
+ radial-gradient(1px 1px at 40% 30%, rgba(255,255,255,0.8) 0%, transparent 100%),
4414
+ radial-gradient(1px 1px at 55% 70%, rgba(255,255,255,0.6) 0%, transparent 100%),
4415
+ radial-gradient(1px 1px at 70% 20%, rgba(255,255,255,0.7) 0%, transparent 100%),
4416
+ radial-gradient(1px 1px at 80% 50%, rgba(255,255,255,0.5) 0%, transparent 100%),
4417
+ radial-gradient(1px 1px at 15% 85%, rgba(255,255,255,0.6) 0%, transparent 100%),
4418
+ radial-gradient(1px 1px at 90% 80%, rgba(255,255,255,0.8) 0%, transparent 100%),
4419
+ radial-gradient(1.5px 1.5px at 35% 45%, rgba(255,255,255,0.9) 0%, transparent 100%),
4420
+ radial-gradient(1.5px 1.5px at 60% 10%, rgba(255,255,255,0.7) 0%, transparent 100%),
4421
+ radial-gradient(1px 1px at 5% 40%, rgba(255,255,255,0.5) 0%, transparent 100%),
4422
+ radial-gradient(1px 1px at 95% 35%, rgba(255,255,255,0.6) 0%, transparent 100%),
4423
+ radial-gradient(1px 1px at 48% 90%, rgba(255,255,255,0.5) 0%, transparent 100%),
4424
+ radial-gradient(1px 1px at 72% 65%, rgba(255,255,255,0.7) 0%, transparent 100%),
4425
+ radial-gradient(1px 1px at 20% 5%, rgba(255,255,255,0.8) 0%, transparent 100%);
4426
+ animation: alive-star-twinkle 4s ease-in-out infinite;
4427
+ }
4428
+ .alive-starfield::after {
4429
+ content: '';
4430
+ position: absolute; inset: 0;
4431
+ background-image:
4432
+ radial-gradient(1px 1px at 8% 55%, rgba(255,255,255,0.6) 0%, transparent 100%),
4433
+ radial-gradient(1px 1px at 30% 75%, rgba(255,255,255,0.5) 0%, transparent 100%),
4434
+ radial-gradient(1px 1px at 45% 20%, rgba(255,255,255,0.7) 0%, transparent 100%),
4435
+ radial-gradient(1px 1px at 65% 40%, rgba(255,255,255,0.6) 0%, transparent 100%),
4436
+ radial-gradient(1.5px 1.5px at 85% 15%, rgba(255,255,255,0.9) 0%, transparent 100%),
4437
+ radial-gradient(1px 1px at 92% 60%, rgba(255,255,255,0.5) 0%, transparent 100%),
4438
+ radial-gradient(1px 1px at 18% 95%, rgba(255,255,255,0.6) 0%, transparent 100%),
4439
+ radial-gradient(1px 1px at 50% 50%, rgba(255,255,255,0.4) 0%, transparent 100%),
4440
+ radial-gradient(1px 1px at 75% 88%, rgba(255,255,255,0.7) 0%, transparent 100%),
4441
+ radial-gradient(1px 1px at 3% 25%, rgba(255,255,255,0.5) 0%, transparent 100%);
4442
+ animation: alive-star-twinkle 6s ease-in-out infinite reverse;
4443
+ animation-delay: -2s;
4444
+ }
4445
+ /* Noise overlay */
4446
+ .alive-film-grain {
4447
+ position: relative;
4448
+ }
4449
+ .alive-film-grain::after {
4450
+ content: '';
4451
+ position: absolute; inset: 0;
4452
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.04'/%3E%3C/svg%3E");
4453
+ pointer-events: none;
4454
+ opacity: 0.35;
4455
+ }
4456
+
4457
+ /* \u2500\u2500 Particles & FX \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
4458
+ /* Energy ring pulse */
4459
+ @keyframes alive-ring-expand {
4460
+ 0% { transform: scale(0.6); opacity: 0.9; }
4461
+ 100% { transform: scale(2.2); opacity: 0; }
4462
+ }
4463
+ .alive-energy-ring {
4464
+ border-radius: 50%;
4465
+ border: 2px solid rgba(99,102,241,0.7);
4466
+ position: relative;
4467
+ animation: alive-ring-expand 2s ease-out infinite;
4468
+ }
4469
+ .alive-energy-ring::before,
4470
+ .alive-energy-ring::after {
4471
+ content: '';
4472
+ position: absolute; inset: 0;
4473
+ border-radius: 50%;
4474
+ border: 2px solid rgba(99,102,241,0.5);
4475
+ animation: alive-ring-expand 2s ease-out infinite;
4476
+ }
4477
+ .alive-energy-ring::before { animation-delay: 0.65s; border-color: rgba(139,92,246,0.5); }
4478
+ .alive-energy-ring::after { animation-delay: 1.3s; border-color: rgba(99,102,241,0.3); }
4479
+ /* Glow burst */
4480
+ @keyframes alive-glow-burst {
4481
+ 0% { transform: scale(0.5); opacity: 1; }
4482
+ 100% { transform: scale(2); opacity: 0; }
4483
+ }
4484
+ .alive-glow-burst {
4485
+ border-radius: 50%;
4486
+ background: radial-gradient(circle, rgba(99,102,241,0.8) 0%, rgba(99,102,241,0.3) 40%, transparent 70%);
4487
+ animation: alive-glow-burst 1.5s ease-out infinite;
4488
+ }
4489
+ /* Floating orb */
4490
+ @keyframes alive-orb-drift {
4491
+ 0%, 100% { transform: translate(0, 0) scale(1); }
4492
+ 33% { transform: translate(12px, -16px) scale(1.08); }
4493
+ 66% { transform: translate(-8px, 8px) scale(0.94); }
4494
+ }
4495
+ .alive-orb {
4496
+ border-radius: 50%;
4497
+ filter: blur(var(--alive-orb-blur, 20px));
4498
+ animation: alive-orb-drift 6s ease-in-out infinite;
4499
+ }
4500
+ .alive-orb-indigo { background: rgba(99,102,241,0.6); --alive-orb-blur: 24px; }
4501
+ .alive-orb-violet { background: rgba(139,92,246,0.6); --alive-orb-blur: 28px; animation-delay: -2s; }
4502
+ .alive-orb-sky { background: rgba(14,165,233,0.5); --alive-orb-blur: 20px; animation-delay: -4s; }
4503
+ .alive-orb-emerald { background: rgba(16,185,129,0.5); --alive-orb-blur: 22px; animation-delay: -1s; }
4504
+ .alive-orb-rose { background: rgba(244,63,94,0.5); --alive-orb-blur: 26px; animation-delay: -3s; }
4505
+ /* Sparkle star */
4506
+ @keyframes alive-sparkle-burst {
4507
+ 0% { transform: scale(0) rotate(0deg); opacity: 0; }
4508
+ 40% { transform: scale(1.2) rotate(120deg); opacity: 1; }
4509
+ 80% { transform: scale(0.8) rotate(240deg); opacity: 0.6; }
4510
+ 100% { transform: scale(0) rotate(360deg); opacity: 0; }
4511
+ }
4512
+ .alive-sparkle {
4513
+ display: inline-block;
4514
+ color: #fbbf24;
4515
+ animation: alive-sparkle-burst 1.8s ease-in-out infinite;
4516
+ }
4517
+ .alive-sparkle:nth-child(2) { animation-delay: 0.3s; color: #818cf8; }
4518
+ .alive-sparkle:nth-child(3) { animation-delay: 0.6s; color: #34d399; }
4519
+ .alive-sparkle:nth-child(4) { animation-delay: 0.9s; color: #f472b6; }
4520
+ .alive-sparkle:nth-child(5) { animation-delay: 1.2s; color: #60a5fa; }
4521
+ /* Confetti pieces */
4522
+ @keyframes alive-confetti-fall {
4523
+ 0% { transform: translateY(-20px) rotate(0deg); opacity: 1; }
4524
+ 100% { transform: translateY(120px) rotate(720deg); opacity: 0; }
4525
+ }
4526
+ .alive-confetti-piece {
4527
+ position: absolute;
4528
+ width: 8px; height: 8px;
4529
+ border-radius: 2px;
4530
+ animation: alive-confetti-fall 2s ease-in infinite;
4531
+ }
4532
+ .alive-confetti-piece:nth-child(1) { left: 10%; background: #6366f1; animation-delay: 0s; animation-duration: 2.1s; }
4533
+ .alive-confetti-piece:nth-child(2) { left: 20%; background: #f43f5e; animation-delay: 0.2s; animation-duration: 1.8s; width: 6px; height: 10px; }
4534
+ .alive-confetti-piece:nth-child(3) { left: 30%; background: #fbbf24; animation-delay: 0.4s; animation-duration: 2.3s; border-radius: 50%; }
4535
+ .alive-confetti-piece:nth-child(4) { left: 42%; background: #10b981; animation-delay: 0.1s; animation-duration: 1.9s; width: 10px; height: 6px; }
4536
+ .alive-confetti-piece:nth-child(5) { left: 53%; background: #8b5cf6; animation-delay: 0.5s; animation-duration: 2.2s; }
4537
+ .alive-confetti-piece:nth-child(6) { left: 63%; background: #0ea5e9; animation-delay: 0.3s; animation-duration: 1.7s; border-radius: 50%; }
4538
+ .alive-confetti-piece:nth-child(7) { left: 72%; background: #f97316; animation-delay: 0.6s; animation-duration: 2.4s; width: 6px; height: 10px; }
4539
+ .alive-confetti-piece:nth-child(8) { left: 83%; background: #ec4899; animation-delay: 0.15s; animation-duration: 2.0s; }
4540
+ .alive-confetti-piece:nth-child(9) { left: 91%; background: #6366f1; animation-delay: 0.45s; animation-duration: 1.85s; border-radius: 50%; }
4541
+ .alive-confetti-piece:nth-child(10) { left: 5%; background: #34d399; animation-delay: 0.7s; animation-duration: 2.15s; width: 10px; height: 6px; }
4542
+ .alive-confetti { position: relative; overflow: hidden; }
4543
+ /* Meteor / shooting star */
4544
+ @keyframes alive-meteor {
4545
+ 0% { transform: translateX(0) translateY(0) rotate(-45deg); opacity: 1; }
4546
+ 70% { opacity: 1; }
4547
+ 100% { transform: translateX(200px) translateY(200px) rotate(-45deg); opacity: 0; }
4548
+ }
4549
+ .alive-meteor {
4550
+ position: absolute;
4551
+ width: 60px; height: 1.5px;
4552
+ background: linear-gradient(90deg, rgba(255,255,255,0.9), transparent);
4553
+ border-radius: 1px;
4554
+ animation: alive-meteor 2s ease-in infinite;
4555
+ }
4556
+ .alive-meteor:nth-child(1) { top: 10%; left: 5%; animation-delay: 0s; animation-duration: 2.2s; }
4557
+ .alive-meteor:nth-child(2) { top: 25%; left: 30%; animation-delay: 0.8s; animation-duration: 1.8s; width: 40px; }
4558
+ .alive-meteor:nth-child(3) { top: 5%; left: 60%; animation-delay: 1.5s; animation-duration: 2.5s; }
4559
+ .alive-meteor:nth-child(4) { top: 40%; left: 75%; animation-delay: 0.4s; animation-duration: 1.6s; width: 80px; }
4560
+
4561
+ /* \u2500\u2500 Scene Sequencer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
4562
+ Pair with [data-alive-sequence] + [data-alive-scene] attributes.
4563
+ The runtime (./runtime) drives is-active and transition classes.
4564
+ See: data-alive-duration, data-alive-transition, data-alive-loop.
4565
+ \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
4566
+ [data-alive-sequence] {
4567
+ position: relative;
4568
+ overflow: hidden;
4569
+ }
4570
+ [data-alive-scene] {
4571
+ position: absolute;
4572
+ inset: 0;
4573
+ opacity: 0;
4574
+ pointer-events: none;
4575
+ }
4576
+ [data-alive-scene].is-active {
4577
+ opacity: 1;
4578
+ pointer-events: auto;
4579
+ z-index: 1;
4580
+ }
4581
+ /* Outgoing scene (has a -out class) must stay visible during the transition */
4582
+ [data-alive-scene][class*="-out"] {
4583
+ opacity: 1;
4584
+ z-index: 2;
4585
+ }
2545
4586
  `;
2546
4587
  }
2547
4588
  var init_base = __esm({