@bendyline/squisq-react 1.3.2 → 1.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +57 -23
  2. package/dist/index.d.ts +131 -26
  3. package/dist/index.js +1475 -755
  4. package/dist/index.js.map +1 -1
  5. package/dist/squisq-player.css +1 -1
  6. package/dist/squisq-player.css.map +1 -1
  7. package/dist/squisq-player.global.js +49 -13
  8. package/dist/squisq-player.global.js.map +1 -1
  9. package/dist/standalone-source.js +1 -1
  10. package/dist/styles/index.css +2263 -0
  11. package/package.json +9 -5
  12. package/src/BlockRenderer.tsx +15 -7
  13. package/src/DocPlayer.tsx +222 -55
  14. package/src/DocPlayerWithSidebar.tsx +21 -9
  15. package/src/DocProgressBar.tsx +21 -3
  16. package/src/LinearDocView.tsx +69 -206
  17. package/src/MarkdownRenderer.tsx +182 -41
  18. package/src/MediaClipLayer.tsx +135 -0
  19. package/src/__tests__/DocPlayer.test.tsx +81 -0
  20. package/src/__tests__/DocPlayerStylesSentinel.test.tsx +41 -0
  21. package/src/__tests__/DocProgressBar.test.tsx +76 -0
  22. package/src/__tests__/LinearDocView.test.tsx +53 -1
  23. package/src/__tests__/MarkdownRenderer.test.tsx +113 -1
  24. package/src/__tests__/PathLayer.test.tsx +73 -0
  25. package/src/__tests__/fillStyle.test.tsx +112 -0
  26. package/src/__tests__/transitionStyles.test.ts +125 -0
  27. package/src/__tests__/useDocPlayback.transition.test.ts +70 -0
  28. package/src/__tests__/useJsonViewTokens.test.ts +41 -0
  29. package/src/__tests__/useSlideSwipe.test.ts +81 -0
  30. package/src/hooks/{AudioProvider.ts → AudioController.ts} +3 -3
  31. package/src/hooks/index.ts +7 -2
  32. package/src/hooks/useAudioSync.ts +19 -5
  33. package/src/hooks/useDocPlayback.ts +81 -100
  34. package/src/hooks/useMediaSchedule.ts +39 -0
  35. package/src/hooks/useSlideSwipe.ts +265 -0
  36. package/src/index.ts +8 -1
  37. package/src/jsonView/useJsonViewTokens.ts +6 -31
  38. package/src/layers/ImageLayer.tsx +11 -1
  39. package/src/layers/PathLayer.tsx +146 -0
  40. package/src/layers/ShapeLayer.tsx +27 -5
  41. package/src/layers/TextLayer.tsx +395 -22
  42. package/src/layers/VideoLayer.tsx +16 -9
  43. package/src/layers/index.ts +1 -0
  44. package/src/standalone-entry.tsx +1 -1
  45. package/src/styles/doc-animations.css +1936 -35
  46. package/src/utils/fillStyle.tsx +148 -0
@@ -214,66 +214,1896 @@
214
214
  }
215
215
  }
216
216
 
217
+ @keyframes slideInTop {
218
+ from {
219
+ transform: translateY(-100%);
220
+ }
221
+ to {
222
+ transform: translateY(0);
223
+ }
224
+ }
225
+
226
+ @keyframes slideInBottom {
227
+ from {
228
+ transform: translateY(100%);
229
+ }
230
+ to {
231
+ transform: translateY(0);
232
+ }
233
+ }
234
+
235
+ @keyframes slideOutTop {
236
+ from {
237
+ transform: translateY(0);
238
+ }
239
+ to {
240
+ transform: translateY(-100%);
241
+ }
242
+ }
243
+
244
+ @keyframes slideOutBottom {
245
+ from {
246
+ transform: translateY(0);
247
+ }
248
+ to {
249
+ transform: translateY(100%);
250
+ }
251
+ }
252
+
253
+ @keyframes transitionZoomIn {
254
+ from {
255
+ opacity: 0;
256
+ transform: scale(0.82);
257
+ }
258
+ to {
259
+ opacity: 1;
260
+ transform: scale(1);
261
+ }
262
+ }
263
+
264
+ @keyframes transitionZoomOut {
265
+ from {
266
+ opacity: 1;
267
+ transform: scale(1);
268
+ }
269
+ to {
270
+ opacity: 0;
271
+ transform: scale(1.08);
272
+ }
273
+ }
274
+
275
+ @keyframes transitionFlipIn {
276
+ from {
277
+ opacity: 0;
278
+ transform: perspective(1400px) rotateY(-72deg) scale(0.96);
279
+ }
280
+ to {
281
+ opacity: 1;
282
+ transform: perspective(1400px) rotateY(0deg) scale(1);
283
+ }
284
+ }
285
+
286
+ @keyframes transitionFlipOut {
287
+ from {
288
+ opacity: 1;
289
+ transform: perspective(1400px) rotateY(0deg) scale(1);
290
+ }
291
+ to {
292
+ opacity: 0;
293
+ transform: perspective(1400px) rotateY(56deg) scale(0.96);
294
+ }
295
+ }
296
+
297
+ @keyframes transitionRotateIn {
298
+ from {
299
+ opacity: 0;
300
+ transform: rotate(-8deg) scale(0.88);
301
+ }
302
+ to {
303
+ opacity: 1;
304
+ transform: rotate(0deg) scale(1);
305
+ }
306
+ }
307
+
308
+ @keyframes transitionRotateOut {
309
+ from {
310
+ opacity: 1;
311
+ transform: rotate(0deg) scale(1);
312
+ }
313
+ to {
314
+ opacity: 0;
315
+ transform: rotate(8deg) scale(1.04);
316
+ }
317
+ }
318
+
319
+ @keyframes transitionDissolveIn {
320
+ 0% {
321
+ opacity: 0;
322
+ filter: blur(10px);
323
+ }
324
+ 60% {
325
+ opacity: 0.72;
326
+ }
327
+ 100% {
328
+ opacity: 1;
329
+ filter: blur(0);
330
+ }
331
+ }
332
+
333
+ @keyframes transitionDissolveOut {
334
+ 0% {
335
+ opacity: 1;
336
+ filter: blur(0);
337
+ }
338
+ 100% {
339
+ opacity: 0;
340
+ filter: blur(12px);
341
+ }
342
+ }
343
+
344
+ @keyframes transitionMorphIn {
345
+ from {
346
+ opacity: 0;
347
+ filter: blur(16px) saturate(0.8);
348
+ transform: scale(1.025);
349
+ }
350
+ to {
351
+ opacity: 1;
352
+ filter: blur(0) saturate(1);
353
+ transform: scale(1);
354
+ }
355
+ }
356
+
357
+ @keyframes transitionMorphOut {
358
+ from {
359
+ opacity: 1;
360
+ filter: blur(0) saturate(1);
361
+ transform: scale(1);
362
+ }
363
+ to {
364
+ opacity: 0;
365
+ filter: blur(16px) saturate(0.85);
366
+ transform: scale(0.985);
367
+ }
368
+ }
369
+
370
+ @keyframes transitionHold {
371
+ from,
372
+ to {
373
+ opacity: 1;
374
+ transform: none;
375
+ }
376
+ }
377
+
378
+ @keyframes transitionWipeLeftIn {
379
+ from {
380
+ clip-path: inset(0 100% 0 0);
381
+ }
382
+ to {
383
+ clip-path: inset(0);
384
+ }
385
+ }
386
+
387
+ @keyframes transitionWipeLeftOut {
388
+ from {
389
+ clip-path: inset(0);
390
+ }
391
+ to {
392
+ clip-path: inset(0 0 0 100%);
393
+ }
394
+ }
395
+
396
+ @keyframes transitionWipeRightIn {
397
+ from {
398
+ clip-path: inset(0 0 0 100%);
399
+ }
400
+ to {
401
+ clip-path: inset(0);
402
+ }
403
+ }
404
+
405
+ @keyframes transitionWipeRightOut {
406
+ from {
407
+ clip-path: inset(0);
408
+ }
409
+ to {
410
+ clip-path: inset(0 100% 0 0);
411
+ }
412
+ }
413
+
414
+ @keyframes transitionWipeUpIn {
415
+ from {
416
+ clip-path: inset(100% 0 0 0);
417
+ }
418
+ to {
419
+ clip-path: inset(0);
420
+ }
421
+ }
422
+
423
+ @keyframes transitionWipeUpOut {
424
+ from {
425
+ clip-path: inset(0);
426
+ }
427
+ to {
428
+ clip-path: inset(0 0 100% 0);
429
+ }
430
+ }
431
+
432
+ @keyframes transitionWipeDownIn {
433
+ from {
434
+ clip-path: inset(0 0 100% 0);
435
+ }
436
+ to {
437
+ clip-path: inset(0);
438
+ }
439
+ }
440
+
441
+ @keyframes transitionWipeDownOut {
442
+ from {
443
+ clip-path: inset(0);
444
+ }
445
+ to {
446
+ clip-path: inset(100% 0 0 0);
447
+ }
448
+ }
449
+
450
+ @keyframes transitionSplitHorizontalIn {
451
+ from {
452
+ clip-path: inset(0 50% 0 50%);
453
+ }
454
+ to {
455
+ clip-path: inset(0);
456
+ }
457
+ }
458
+
459
+ @keyframes transitionSplitHorizontalOut {
460
+ from {
461
+ clip-path: inset(0);
462
+ }
463
+ to {
464
+ clip-path: inset(0 50% 0 50%);
465
+ }
466
+ }
467
+
468
+ @keyframes transitionSplitVerticalIn {
469
+ from {
470
+ clip-path: inset(50% 0 50% 0);
471
+ }
472
+ to {
473
+ clip-path: inset(0);
474
+ }
475
+ }
476
+
477
+ @keyframes transitionSplitVerticalOut {
478
+ from {
479
+ clip-path: inset(0);
480
+ }
481
+ to {
482
+ clip-path: inset(50% 0 50% 0);
483
+ }
484
+ }
485
+
486
+ @keyframes transitionCircleIn {
487
+ from {
488
+ clip-path: circle(0% at 50% 50%);
489
+ opacity: 0.4;
490
+ }
491
+ to {
492
+ clip-path: circle(75% at 50% 50%);
493
+ opacity: 1;
494
+ }
495
+ }
496
+
497
+ @keyframes transitionCircleOut {
498
+ from {
499
+ clip-path: circle(75% at 50% 50%);
500
+ opacity: 1;
501
+ }
502
+ to {
503
+ clip-path: circle(0% at 50% 50%);
504
+ opacity: 0;
505
+ }
506
+ }
507
+
508
+ @keyframes transitionDiamondIn {
509
+ from {
510
+ clip-path: polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%);
511
+ opacity: 0.35;
512
+ }
513
+ to {
514
+ clip-path: polygon(50% -30%, 130% 50%, 50% 130%, -30% 50%);
515
+ opacity: 1;
516
+ }
517
+ }
518
+
519
+ @keyframes transitionDiamondOut {
520
+ from {
521
+ clip-path: polygon(50% -30%, 130% 50%, 50% 130%, -30% 50%);
522
+ opacity: 1;
523
+ }
524
+ to {
525
+ clip-path: polygon(50% 50%, 50% 50%, 50% 50%, 50% 50%);
526
+ opacity: 0;
527
+ }
528
+ }
529
+
530
+ @keyframes transitionPlusIn {
531
+ 0% {
532
+ clip-path: polygon(
533
+ 50% 50%,
534
+ 50% 50%,
535
+ 50% 50%,
536
+ 50% 50%,
537
+ 50% 50%,
538
+ 50% 50%,
539
+ 50% 50%,
540
+ 50% 50%,
541
+ 50% 50%,
542
+ 50% 50%,
543
+ 50% 50%,
544
+ 50% 50%
545
+ );
546
+ opacity: 0.45;
547
+ }
548
+ 70% {
549
+ clip-path: polygon(
550
+ 43% 0,
551
+ 57% 0,
552
+ 57% 43%,
553
+ 100% 43%,
554
+ 100% 57%,
555
+ 57% 57%,
556
+ 57% 100%,
557
+ 43% 100%,
558
+ 43% 57%,
559
+ 0 57%,
560
+ 0 43%,
561
+ 43% 43%
562
+ );
563
+ opacity: 1;
564
+ }
565
+ 100% {
566
+ clip-path: inset(0);
567
+ opacity: 1;
568
+ }
569
+ }
570
+
571
+ @keyframes transitionPlusOut {
572
+ 0% {
573
+ clip-path: inset(0);
574
+ opacity: 1;
575
+ }
576
+ 100% {
577
+ clip-path: polygon(
578
+ 50% 50%,
579
+ 50% 50%,
580
+ 50% 50%,
581
+ 50% 50%,
582
+ 50% 50%,
583
+ 50% 50%,
584
+ 50% 50%,
585
+ 50% 50%,
586
+ 50% 50%,
587
+ 50% 50%,
588
+ 50% 50%,
589
+ 50% 50%
590
+ );
591
+ opacity: 0;
592
+ }
593
+ }
594
+
595
+ @keyframes transitionFlashIn {
596
+ 0% {
597
+ opacity: 0;
598
+ filter: brightness(2.8) contrast(1.5);
599
+ transform: scale(1.04);
600
+ }
601
+ 42% {
602
+ opacity: 1;
603
+ filter: brightness(3.5) contrast(1.8);
604
+ }
605
+ 100% {
606
+ opacity: 1;
607
+ filter: brightness(1) contrast(1);
608
+ transform: scale(1);
609
+ }
610
+ }
611
+
612
+ @keyframes transitionFlashOut {
613
+ 0% {
614
+ opacity: 1;
615
+ filter: brightness(1) contrast(1);
616
+ }
617
+ 55% {
618
+ opacity: 0.9;
619
+ filter: brightness(3) contrast(1.6);
620
+ }
621
+ 100% {
622
+ opacity: 0;
623
+ filter: brightness(0.4) contrast(1);
624
+ }
625
+ }
626
+
627
+ @keyframes transitionNewsflashIn {
628
+ 0% {
629
+ opacity: 0;
630
+ filter: brightness(3) contrast(1.8);
631
+ transform: scale(0.72) rotate(-2deg);
632
+ }
633
+ 45% {
634
+ opacity: 1;
635
+ filter: brightness(2.8) contrast(1.6);
636
+ transform: scale(1.08) rotate(1deg);
637
+ }
638
+ 100% {
639
+ opacity: 1;
640
+ filter: brightness(1) contrast(1);
641
+ transform: scale(1) rotate(0deg);
642
+ }
643
+ }
644
+
645
+ @keyframes transitionNewsflashOut {
646
+ from {
647
+ opacity: 1;
648
+ filter: brightness(1) contrast(1);
649
+ transform: scale(1);
650
+ }
651
+ to {
652
+ opacity: 0;
653
+ filter: brightness(2.4) contrast(1.6);
654
+ transform: scale(1.18) rotate(2deg);
655
+ }
656
+ }
657
+
658
+ @keyframes transitionFallOverIn {
659
+ from {
660
+ opacity: 0;
661
+ transform: perspective(1200px) rotateX(-72deg) translateY(-8%);
662
+ transform-origin: 50% 100%;
663
+ }
664
+ to {
665
+ opacity: 1;
666
+ transform: perspective(1200px) rotateX(0deg) translateY(0);
667
+ transform-origin: 50% 100%;
668
+ }
669
+ }
670
+
671
+ @keyframes transitionFallOverOut {
672
+ from {
673
+ opacity: 1;
674
+ transform: perspective(1200px) rotateX(0deg) translateY(0);
675
+ transform-origin: 50% 100%;
676
+ }
677
+ to {
678
+ opacity: 0;
679
+ transform: perspective(1200px) rotateX(76deg) translateY(8%);
680
+ transform-origin: 50% 100%;
681
+ }
682
+ }
683
+
684
+ @keyframes transitionDrapeIn {
685
+ from {
686
+ opacity: 0;
687
+ transform: perspective(1200px) rotateX(-42deg) skewX(-8deg) scaleY(0.82);
688
+ transform-origin: 50% 0;
689
+ }
690
+ to {
691
+ opacity: 1;
692
+ transform: perspective(1200px) rotateX(0deg) skewX(0deg) scaleY(1);
693
+ transform-origin: 50% 0;
694
+ }
695
+ }
696
+
697
+ @keyframes transitionDrapeOut {
698
+ from {
699
+ opacity: 1;
700
+ transform: perspective(1200px) rotateX(0deg) skewX(0deg) scaleY(1);
701
+ transform-origin: 50% 0;
702
+ }
703
+ to {
704
+ opacity: 0;
705
+ transform: perspective(1200px) rotateX(48deg) skewX(7deg) scaleY(0.74);
706
+ transform-origin: 50% 0;
707
+ }
708
+ }
709
+
710
+ @keyframes transitionCurtainsIn {
711
+ from {
712
+ opacity: 0.4;
713
+ transform: scaleX(0.04);
714
+ filter: brightness(0.75);
715
+ }
716
+ to {
717
+ opacity: 1;
718
+ transform: scaleX(1);
719
+ filter: brightness(1);
720
+ }
721
+ }
722
+
723
+ @keyframes transitionCurtainsOut {
724
+ from {
725
+ opacity: 1;
726
+ transform: scaleX(1);
727
+ filter: brightness(1);
728
+ }
729
+ to {
730
+ opacity: 0.35;
731
+ transform: scaleX(0.04);
732
+ filter: brightness(0.55);
733
+ }
734
+ }
735
+
736
+ @keyframes transitionWindIn {
737
+ from {
738
+ opacity: 0;
739
+ filter: blur(14px);
740
+ transform: translateX(24%) skewX(-14deg);
741
+ }
742
+ to {
743
+ opacity: 1;
744
+ filter: blur(0);
745
+ transform: translateX(0) skewX(0);
746
+ }
747
+ }
748
+
749
+ @keyframes transitionWindOut {
750
+ from {
751
+ opacity: 1;
752
+ filter: blur(0);
753
+ transform: translateX(0) skewX(0);
754
+ }
755
+ to {
756
+ opacity: 0;
757
+ filter: blur(14px);
758
+ transform: translateX(-24%) skewX(14deg);
759
+ }
760
+ }
761
+
762
+ @keyframes transitionPrestigeIn {
763
+ from {
764
+ opacity: 0;
765
+ filter: brightness(1.8) saturate(0.7);
766
+ transform: perspective(1200px) translateZ(-180px) scale(0.82);
767
+ }
768
+ to {
769
+ opacity: 1;
770
+ filter: brightness(1) saturate(1);
771
+ transform: perspective(1200px) translateZ(0) scale(1);
772
+ }
773
+ }
774
+
775
+ @keyframes transitionPrestigeOut {
776
+ from {
777
+ opacity: 1;
778
+ filter: brightness(1) saturate(1);
779
+ transform: perspective(1200px) translateZ(0) scale(1);
780
+ }
781
+ to {
782
+ opacity: 0;
783
+ filter: brightness(1.6) saturate(0.75);
784
+ transform: perspective(1200px) translateZ(140px) scale(1.06);
785
+ }
786
+ }
787
+
788
+ @keyframes transitionFractureIn {
789
+ 0% {
790
+ opacity: 0;
791
+ filter: contrast(1.8) brightness(1.4);
792
+ clip-path: polygon(0 0, 48% 0, 52% 24%, 100% 0, 100% 100%, 55% 78%, 45% 100%, 0 100%);
793
+ transform: skewX(-6deg) scale(1.03);
794
+ }
795
+ 100% {
796
+ opacity: 1;
797
+ filter: contrast(1) brightness(1);
798
+ clip-path: inset(0);
799
+ transform: skewX(0) scale(1);
800
+ }
801
+ }
802
+
803
+ @keyframes transitionFractureOut {
804
+ from {
805
+ opacity: 1;
806
+ filter: contrast(1) brightness(1);
807
+ clip-path: inset(0);
808
+ transform: skewX(0) scale(1);
809
+ }
810
+ to {
811
+ opacity: 0;
812
+ filter: contrast(1.8) brightness(1.2);
813
+ clip-path: polygon(0 0, 42% 8%, 56% 28%, 100% 0, 100% 100%, 58% 72%, 40% 94%, 0 100%);
814
+ transform: skewX(8deg) scale(1.05);
815
+ }
816
+ }
817
+
818
+ @keyframes transitionCrushIn {
819
+ from {
820
+ opacity: 0;
821
+ transform: scaleX(1.22) scaleY(0.08);
822
+ filter: contrast(1.4);
823
+ }
824
+ to {
825
+ opacity: 1;
826
+ transform: scaleX(1) scaleY(1);
827
+ filter: contrast(1);
828
+ }
829
+ }
830
+
831
+ @keyframes transitionCrushOut {
832
+ from {
833
+ opacity: 1;
834
+ transform: scaleX(1) scaleY(1);
835
+ filter: contrast(1);
836
+ }
837
+ to {
838
+ opacity: 0;
839
+ transform: scaleX(1.28) scaleY(0.04);
840
+ filter: contrast(1.5);
841
+ }
842
+ }
843
+
844
+ @keyframes transitionPeelIn {
845
+ from {
846
+ opacity: 0;
847
+ transform: perspective(1400px) rotateY(-78deg) skewY(8deg);
848
+ transform-origin: 0 50%;
849
+ }
850
+ to {
851
+ opacity: 1;
852
+ transform: perspective(1400px) rotateY(0deg) skewY(0deg);
853
+ transform-origin: 0 50%;
854
+ }
855
+ }
856
+
857
+ @keyframes transitionPeelOut {
858
+ from {
859
+ opacity: 1;
860
+ transform: perspective(1400px) rotateY(0deg) skewY(0deg);
861
+ transform-origin: 100% 50%;
862
+ }
863
+ to {
864
+ opacity: 0;
865
+ transform: perspective(1400px) rotateY(82deg) skewY(-8deg);
866
+ transform-origin: 100% 50%;
867
+ }
868
+ }
869
+
870
+ @keyframes transitionPageCurlIn {
871
+ from {
872
+ opacity: 0;
873
+ transform: perspective(1400px) rotateY(-64deg) rotateZ(-2deg);
874
+ transform-origin: 0 50%;
875
+ filter: brightness(0.85);
876
+ }
877
+ to {
878
+ opacity: 1;
879
+ transform: perspective(1400px) rotateY(0deg) rotateZ(0deg);
880
+ transform-origin: 0 50%;
881
+ filter: brightness(1);
882
+ }
883
+ }
884
+
885
+ @keyframes transitionPageCurlOut {
886
+ from {
887
+ opacity: 1;
888
+ transform: perspective(1400px) rotateY(0deg) rotateZ(0deg);
889
+ transform-origin: 100% 50%;
890
+ filter: brightness(1);
891
+ }
892
+ to {
893
+ opacity: 0;
894
+ transform: perspective(1400px) rotateY(68deg) rotateZ(2deg);
895
+ transform-origin: 100% 50%;
896
+ filter: brightness(0.8);
897
+ }
898
+ }
899
+
900
+ @keyframes transitionAirplaneIn {
901
+ from {
902
+ opacity: 0;
903
+ transform: translate(-40%, 30%) rotate(-18deg) scale(0.72);
904
+ filter: blur(2px);
905
+ }
906
+ to {
907
+ opacity: 1;
908
+ transform: translate(0, 0) rotate(0deg) scale(1);
909
+ filter: blur(0);
910
+ }
911
+ }
912
+
913
+ @keyframes transitionAirplaneOut {
914
+ from {
915
+ opacity: 1;
916
+ transform: translate(0, 0) rotate(0deg) scale(1);
917
+ filter: blur(0);
918
+ }
919
+ to {
920
+ opacity: 0;
921
+ transform: translate(42%, -28%) rotate(18deg) scale(0.72);
922
+ filter: blur(2px);
923
+ }
924
+ }
925
+
926
+ @keyframes transitionOrigamiIn {
927
+ from {
928
+ opacity: 0;
929
+ transform: perspective(1400px) rotateX(58deg) rotateY(-42deg) scale(0.86);
930
+ filter: brightness(0.85);
931
+ }
932
+ to {
933
+ opacity: 1;
934
+ transform: perspective(1400px) rotateX(0deg) rotateY(0deg) scale(1);
935
+ filter: brightness(1);
936
+ }
937
+ }
938
+
939
+ @keyframes transitionOrigamiOut {
940
+ from {
941
+ opacity: 1;
942
+ transform: perspective(1400px) rotateX(0deg) rotateY(0deg) scale(1);
943
+ filter: brightness(1);
944
+ }
945
+ to {
946
+ opacity: 0;
947
+ transform: perspective(1400px) rotateX(-58deg) rotateY(42deg) scale(0.82);
948
+ filter: brightness(0.82);
949
+ }
950
+ }
951
+
952
+ @keyframes transitionRippleIn {
953
+ 0% {
954
+ opacity: 0;
955
+ filter: blur(10px);
956
+ transform: scale(0.86);
957
+ clip-path: circle(0% at 50% 50%);
958
+ }
959
+ 60% {
960
+ opacity: 0.88;
961
+ filter: blur(3px);
962
+ transform: scale(1.035);
963
+ clip-path: circle(65% at 50% 50%);
964
+ }
965
+ 100% {
966
+ opacity: 1;
967
+ filter: blur(0);
968
+ transform: scale(1);
969
+ clip-path: circle(75% at 50% 50%);
970
+ }
971
+ }
972
+
973
+ @keyframes transitionRippleOut {
974
+ from {
975
+ opacity: 1;
976
+ filter: blur(0);
977
+ transform: scale(1);
978
+ clip-path: circle(75% at 50% 50%);
979
+ }
980
+ to {
981
+ opacity: 0;
982
+ filter: blur(10px);
983
+ transform: scale(1.08);
984
+ clip-path: circle(0% at 50% 50%);
985
+ }
986
+ }
987
+
988
+ @keyframes transitionTexturedIn {
989
+ 0% {
990
+ opacity: 0.12;
991
+ filter: contrast(1.6);
992
+ }
993
+ 88% {
994
+ opacity: 1;
995
+ filter: contrast(1.05);
996
+ }
997
+ 100% {
998
+ opacity: 1;
999
+ filter: contrast(1);
1000
+ -webkit-mask-image: none;
1001
+ mask-image: none;
1002
+ }
1003
+ }
1004
+
1005
+ @keyframes transitionTexturedOut {
1006
+ from {
1007
+ opacity: 1;
1008
+ filter: contrast(1);
1009
+ }
1010
+ to {
1011
+ opacity: 0;
1012
+ filter: contrast(1.7);
1013
+ }
1014
+ }
1015
+
1016
+ @keyframes transitionVortexIn {
1017
+ from {
1018
+ opacity: 0;
1019
+ transform: rotate(-110deg) scale(0.28);
1020
+ filter: blur(8px);
1021
+ }
1022
+ to {
1023
+ opacity: 1;
1024
+ transform: rotate(0deg) scale(1);
1025
+ filter: blur(0);
1026
+ }
1027
+ }
1028
+
1029
+ @keyframes transitionVortexOut {
1030
+ from {
1031
+ opacity: 1;
1032
+ transform: rotate(0deg) scale(1);
1033
+ filter: blur(0);
1034
+ }
1035
+ to {
1036
+ opacity: 0;
1037
+ transform: rotate(120deg) scale(0.2);
1038
+ filter: blur(10px);
1039
+ }
1040
+ }
1041
+
1042
+ @keyframes transitionShredIn {
1043
+ from {
1044
+ opacity: 0;
1045
+ clip-path: inset(0 42% 0 42%);
1046
+ transform: translateY(-9%) skewX(-8deg);
1047
+ filter: contrast(1.7);
1048
+ }
1049
+ to {
1050
+ opacity: 1;
1051
+ clip-path: inset(0);
1052
+ transform: translateY(0) skewX(0);
1053
+ filter: contrast(1);
1054
+ }
1055
+ }
1056
+
1057
+ @keyframes transitionShredOut {
1058
+ from {
1059
+ opacity: 1;
1060
+ clip-path: inset(0);
1061
+ transform: translateY(0) skewX(0);
1062
+ filter: contrast(1);
1063
+ }
1064
+ to {
1065
+ opacity: 0;
1066
+ clip-path: inset(0 44% 0 44%);
1067
+ transform: translateY(11%) skewX(8deg);
1068
+ filter: contrast(1.8);
1069
+ }
1070
+ }
1071
+
1072
+ @keyframes transitionSwitchIn {
1073
+ from {
1074
+ opacity: 0;
1075
+ transform: perspective(1400px) rotateY(-48deg) translateX(18%);
1076
+ }
1077
+ to {
1078
+ opacity: 1;
1079
+ transform: perspective(1400px) rotateY(0deg) translateX(0);
1080
+ }
1081
+ }
1082
+
1083
+ @keyframes transitionSwitchOut {
1084
+ from {
1085
+ opacity: 1;
1086
+ transform: perspective(1400px) rotateY(0deg) translateX(0);
1087
+ }
1088
+ to {
1089
+ opacity: 0;
1090
+ transform: perspective(1400px) rotateY(48deg) translateX(-18%);
1091
+ }
1092
+ }
1093
+
1094
+ @keyframes transitionCubeIn {
1095
+ from {
1096
+ opacity: 0;
1097
+ transform: perspective(1200px) rotateY(-86deg) translateX(44%);
1098
+ transform-origin: 0 50%;
1099
+ }
1100
+ to {
1101
+ opacity: 1;
1102
+ transform: perspective(1200px) rotateY(0deg) translateX(0);
1103
+ transform-origin: 0 50%;
1104
+ }
1105
+ }
1106
+
1107
+ @keyframes transitionCubeOut {
1108
+ from {
1109
+ opacity: 1;
1110
+ transform: perspective(1200px) rotateY(0deg) translateX(0);
1111
+ transform-origin: 100% 50%;
1112
+ }
1113
+ to {
1114
+ opacity: 0;
1115
+ transform: perspective(1200px) rotateY(86deg) translateX(-44%);
1116
+ transform-origin: 100% 50%;
1117
+ }
1118
+ }
1119
+
1120
+ @keyframes transitionDoorsIn {
1121
+ from {
1122
+ opacity: 0.2;
1123
+ transform: perspective(1200px) scaleX(0.04);
1124
+ filter: brightness(0.7);
1125
+ }
1126
+ to {
1127
+ opacity: 1;
1128
+ transform: perspective(1200px) scaleX(1);
1129
+ filter: brightness(1);
1130
+ }
1131
+ }
1132
+
1133
+ @keyframes transitionDoorsOut {
1134
+ from {
1135
+ opacity: 1;
1136
+ transform: perspective(1200px) scaleX(1);
1137
+ filter: brightness(1);
1138
+ }
1139
+ to {
1140
+ opacity: 0.2;
1141
+ transform: perspective(1200px) scaleX(0.04);
1142
+ filter: brightness(0.65);
1143
+ }
1144
+ }
1145
+
1146
+ @keyframes transitionBoxIn {
1147
+ from {
1148
+ opacity: 0.2;
1149
+ transform: scale(0.18);
1150
+ clip-path: inset(38%);
1151
+ }
1152
+ to {
1153
+ opacity: 1;
1154
+ transform: scale(1);
1155
+ clip-path: inset(0);
1156
+ }
1157
+ }
1158
+
1159
+ @keyframes transitionBoxOut {
1160
+ from {
1161
+ opacity: 1;
1162
+ transform: scale(1);
1163
+ clip-path: inset(0);
1164
+ }
1165
+ to {
1166
+ opacity: 0;
1167
+ transform: scale(0.18);
1168
+ clip-path: inset(38%);
1169
+ }
1170
+ }
1171
+
1172
+ @keyframes transitionGalleryIn {
1173
+ from {
1174
+ opacity: 0;
1175
+ transform: translateX(28%) scale(0.84);
1176
+ filter: brightness(0.82);
1177
+ }
1178
+ to {
1179
+ opacity: 1;
1180
+ transform: translateX(0) scale(1);
1181
+ filter: brightness(1);
1182
+ }
1183
+ }
1184
+
1185
+ @keyframes transitionGalleryOut {
1186
+ from {
1187
+ opacity: 1;
1188
+ transform: translateX(0) scale(1);
1189
+ filter: brightness(1);
1190
+ }
1191
+ to {
1192
+ opacity: 0;
1193
+ transform: translateX(-28%) scale(0.84);
1194
+ filter: brightness(0.82);
1195
+ }
1196
+ }
1197
+
1198
+ @keyframes transitionFerrisIn {
1199
+ from {
1200
+ opacity: 0;
1201
+ transform: translateY(42%) rotate(-34deg) scale(0.78);
1202
+ transform-origin: 50% 140%;
1203
+ }
1204
+ to {
1205
+ opacity: 1;
1206
+ transform: translateY(0) rotate(0deg) scale(1);
1207
+ transform-origin: 50% 140%;
1208
+ }
1209
+ }
1210
+
1211
+ @keyframes transitionFerrisOut {
1212
+ from {
1213
+ opacity: 1;
1214
+ transform: translateY(0) rotate(0deg) scale(1);
1215
+ transform-origin: 50% 140%;
1216
+ }
1217
+ to {
1218
+ opacity: 0;
1219
+ transform: translateY(-42%) rotate(34deg) scale(0.78);
1220
+ transform-origin: 50% 140%;
1221
+ }
1222
+ }
1223
+
1224
+ @keyframes transitionWindowIn {
1225
+ from {
1226
+ opacity: 0.35;
1227
+ clip-path: inset(50% 50% 50% 50%);
1228
+ transform: scale(1.08);
1229
+ }
1230
+ to {
1231
+ opacity: 1;
1232
+ clip-path: inset(0);
1233
+ transform: scale(1);
1234
+ }
1235
+ }
1236
+
1237
+ @keyframes transitionWindowOut {
1238
+ from {
1239
+ opacity: 1;
1240
+ clip-path: inset(0);
1241
+ transform: scale(1);
1242
+ }
1243
+ to {
1244
+ opacity: 0;
1245
+ clip-path: inset(50% 50% 50% 50%);
1246
+ transform: scale(1.08);
1247
+ }
1248
+ }
1249
+
1250
+ @keyframes transitionOrbitIn {
1251
+ from {
1252
+ opacity: 0;
1253
+ transform: rotate(-42deg) translateX(18%) scale(0.76);
1254
+ transform-origin: 50% 50%;
1255
+ }
1256
+ to {
1257
+ opacity: 1;
1258
+ transform: rotate(0deg) translateX(0) scale(1);
1259
+ transform-origin: 50% 50%;
1260
+ }
1261
+ }
1262
+
1263
+ @keyframes transitionOrbitOut {
1264
+ from {
1265
+ opacity: 1;
1266
+ transform: rotate(0deg) translateX(0) scale(1);
1267
+ transform-origin: 50% 50%;
1268
+ }
1269
+ to {
1270
+ opacity: 0;
1271
+ transform: rotate(42deg) translateX(-18%) scale(0.76);
1272
+ transform-origin: 50% 50%;
1273
+ }
1274
+ }
1275
+
1276
+ @keyframes transitionFlyThroughIn {
1277
+ from {
1278
+ opacity: 0;
1279
+ transform: perspective(1200px) translateZ(-520px) scale(0.56);
1280
+ filter: blur(4px);
1281
+ }
1282
+ to {
1283
+ opacity: 1;
1284
+ transform: perspective(1200px) translateZ(0) scale(1);
1285
+ filter: blur(0);
1286
+ }
1287
+ }
1288
+
1289
+ @keyframes transitionFlyThroughOut {
1290
+ from {
1291
+ opacity: 1;
1292
+ transform: perspective(1200px) translateZ(0) scale(1);
1293
+ filter: blur(0);
1294
+ }
1295
+ to {
1296
+ opacity: 0;
1297
+ transform: perspective(1200px) translateZ(420px) scale(1.28);
1298
+ filter: blur(5px);
1299
+ }
1300
+ }
1301
+
1302
+ @keyframes transitionWheelIn {
1303
+ from {
1304
+ opacity: 0;
1305
+ transform: rotate(-58deg) scale(0.7);
1306
+ clip-path: circle(0% at 50% 50%);
1307
+ }
1308
+ to {
1309
+ opacity: 1;
1310
+ transform: rotate(0deg) scale(1);
1311
+ clip-path: circle(75% at 50% 50%);
1312
+ }
1313
+ }
1314
+
1315
+ @keyframes transitionWheelOut {
1316
+ from {
1317
+ opacity: 1;
1318
+ transform: rotate(0deg) scale(1);
1319
+ clip-path: circle(75% at 50% 50%);
1320
+ }
1321
+ to {
1322
+ opacity: 0;
1323
+ transform: rotate(58deg) scale(0.7);
1324
+ clip-path: circle(0% at 50% 50%);
1325
+ }
1326
+ }
1327
+
1328
+ @keyframes transitionWheelReverseIn {
1329
+ from {
1330
+ opacity: 0;
1331
+ transform: rotate(58deg) scale(0.7);
1332
+ clip-path: circle(0% at 50% 50%);
1333
+ }
1334
+ to {
1335
+ opacity: 1;
1336
+ transform: rotate(0deg) scale(1);
1337
+ clip-path: circle(75% at 50% 50%);
1338
+ }
1339
+ }
1340
+
1341
+ @keyframes transitionWheelReverseOut {
1342
+ from {
1343
+ opacity: 1;
1344
+ transform: rotate(0deg) scale(1);
1345
+ clip-path: circle(75% at 50% 50%);
1346
+ }
1347
+ to {
1348
+ opacity: 0;
1349
+ transform: rotate(-58deg) scale(0.7);
1350
+ clip-path: circle(0% at 50% 50%);
1351
+ }
1352
+ }
1353
+
1354
+ @keyframes transitionWedgeIn {
1355
+ from {
1356
+ opacity: 0.4;
1357
+ clip-path: polygon(50% 50%, 50% 0, 50% 0);
1358
+ }
1359
+ to {
1360
+ opacity: 1;
1361
+ clip-path: polygon(50% 50%, -30% -30%, 130% -30%, 130% 130%, -30% 130%);
1362
+ }
1363
+ }
1364
+
1365
+ @keyframes transitionWedgeOut {
1366
+ from {
1367
+ opacity: 1;
1368
+ clip-path: polygon(50% 50%, -30% -30%, 130% -30%, 130% 130%, -30% 130%);
1369
+ }
1370
+ to {
1371
+ opacity: 0;
1372
+ clip-path: polygon(50% 50%, 50% 0, 50% 0);
1373
+ }
1374
+ }
1375
+
1376
+ @keyframes transitionPrismIn {
1377
+ from {
1378
+ opacity: 0;
1379
+ transform: perspective(1200px) rotateY(-28deg) skewX(-12deg) scale(0.9);
1380
+ filter: hue-rotate(24deg) saturate(1.6);
1381
+ }
1382
+ to {
1383
+ opacity: 1;
1384
+ transform: perspective(1200px) rotateY(0deg) skewX(0) scale(1);
1385
+ filter: hue-rotate(0deg) saturate(1);
1386
+ }
1387
+ }
1388
+
1389
+ @keyframes transitionPrismOut {
1390
+ from {
1391
+ opacity: 1;
1392
+ transform: perspective(1200px) rotateY(0deg) skewX(0) scale(1);
1393
+ filter: hue-rotate(0deg) saturate(1);
1394
+ }
1395
+ to {
1396
+ opacity: 0;
1397
+ transform: perspective(1200px) rotateY(28deg) skewX(12deg) scale(0.9);
1398
+ filter: hue-rotate(-24deg) saturate(1.6);
1399
+ }
1400
+ }
1401
+
1402
+ @keyframes transitionWarpIn {
1403
+ from {
1404
+ opacity: 0;
1405
+ transform: scaleX(0.72) scaleY(1.18) skewX(-14deg);
1406
+ filter: blur(8px);
1407
+ }
1408
+ to {
1409
+ opacity: 1;
1410
+ transform: scaleX(1) scaleY(1) skewX(0deg);
1411
+ filter: blur(0);
1412
+ }
1413
+ }
1414
+
1415
+ @keyframes transitionWarpOut {
1416
+ from {
1417
+ opacity: 1;
1418
+ transform: scaleX(1) scaleY(1) skewX(0deg);
1419
+ filter: blur(0);
1420
+ }
1421
+ to {
1422
+ opacity: 0;
1423
+ transform: scaleX(1.2) scaleY(0.72) skewX(14deg);
1424
+ filter: blur(8px);
1425
+ }
1426
+ }
1427
+
1428
+ @keyframes transitionClockIn {
1429
+ from {
1430
+ opacity: 0.35;
1431
+ transform: rotate(-90deg) scale(0.84);
1432
+ clip-path: circle(0% at 50% 50%);
1433
+ }
1434
+ to {
1435
+ opacity: 1;
1436
+ transform: rotate(0deg) scale(1);
1437
+ clip-path: circle(75% at 50% 50%);
1438
+ }
1439
+ }
1440
+
1441
+ @keyframes transitionClockOut {
1442
+ from {
1443
+ opacity: 1;
1444
+ transform: rotate(0deg) scale(1);
1445
+ clip-path: circle(75% at 50% 50%);
1446
+ }
1447
+ to {
1448
+ opacity: 0;
1449
+ transform: rotate(90deg) scale(0.84);
1450
+ clip-path: circle(0% at 50% 50%);
1451
+ }
1452
+ }
1453
+
217
1454
  /* ============================================
218
1455
  Text Animations
219
1456
  ============================================ */
220
1457
 
221
- @keyframes typewriter {
222
- from {
223
- clip-path: inset(0 100% 0 0);
224
- }
225
- to {
226
- clip-path: inset(0 0 0 0);
227
- }
1458
+ @keyframes typewriter {
1459
+ from {
1460
+ clip-path: inset(0 100% 0 0);
1461
+ }
1462
+ to {
1463
+ clip-path: inset(0 0 0 0);
1464
+ }
1465
+ }
1466
+
1467
+ /* Fallback for browsers without clip-path */
1468
+ @keyframes typewriterFallback {
1469
+ from {
1470
+ width: 0;
1471
+ overflow: hidden;
1472
+ }
1473
+ to {
1474
+ width: 100%;
1475
+ overflow: hidden;
1476
+ }
1477
+ }
1478
+
1479
+ /* ============================================
1480
+ Block Transitions
1481
+ Applied to entire block containers
1482
+ ============================================ */
1483
+
1484
+ .transition-fade-enter {
1485
+ animation: fadeIn var(--transition-duration, 1.5s) ease-out forwards;
1486
+ }
1487
+
1488
+ .transition-fade-exit {
1489
+ animation: fadeOut var(--transition-duration, 1.5s) ease-out forwards;
1490
+ }
1491
+
1492
+ .transition-dissolve-enter {
1493
+ animation: transitionDissolveIn var(--transition-duration, 0.8s) ease-in-out forwards;
1494
+ }
1495
+
1496
+ .transition-dissolve-exit {
1497
+ animation: transitionDissolveOut var(--transition-duration, 0.8s) ease-in-out forwards;
1498
+ }
1499
+
1500
+ .transition-morph-enter {
1501
+ animation: transitionMorphIn var(--transition-duration, 0.9s) ease-in-out forwards;
1502
+ }
1503
+
1504
+ .transition-morph-exit {
1505
+ animation: transitionMorphOut var(--transition-duration, 0.9s) ease-in-out forwards;
1506
+ }
1507
+
1508
+ .transition-pushLeft-enter,
1509
+ .transition-slideLeft-enter {
1510
+ animation: slideInRight var(--transition-duration, 0.8s) ease-out forwards;
1511
+ }
1512
+
1513
+ .transition-pushLeft-exit,
1514
+ .transition-slideLeft-exit {
1515
+ animation: slideOutLeft var(--transition-duration, 0.8s) ease-out forwards;
1516
+ }
1517
+
1518
+ .transition-pushRight-enter,
1519
+ .transition-slideRight-enter {
1520
+ animation: slideInLeft var(--transition-duration, 0.8s) ease-out forwards;
1521
+ }
1522
+
1523
+ .transition-pushRight-exit,
1524
+ .transition-slideRight-exit {
1525
+ animation: slideOutRight var(--transition-duration, 0.8s) ease-out forwards;
1526
+ }
1527
+
1528
+ .transition-pushUp-enter,
1529
+ .transition-slideUp-enter {
1530
+ animation: slideInBottom var(--transition-duration, 0.8s) ease-out forwards;
1531
+ }
1532
+
1533
+ .transition-pushUp-exit,
1534
+ .transition-slideUp-exit {
1535
+ animation: slideOutTop var(--transition-duration, 0.8s) ease-out forwards;
1536
+ }
1537
+
1538
+ .transition-pushDown-enter,
1539
+ .transition-slideDown-enter {
1540
+ animation: slideInTop var(--transition-duration, 0.8s) ease-out forwards;
1541
+ }
1542
+
1543
+ .transition-pushDown-exit,
1544
+ .transition-slideDown-exit {
1545
+ animation: slideOutBottom var(--transition-duration, 0.8s) ease-out forwards;
1546
+ }
1547
+
1548
+ .transition-zoom-enter {
1549
+ animation: transitionZoomIn var(--transition-duration, 0.7s) ease-out forwards;
1550
+ }
1551
+
1552
+ .transition-zoom-exit {
1553
+ animation: transitionZoomOut var(--transition-duration, 0.7s) ease-in forwards;
1554
+ }
1555
+
1556
+ .transition-flip-enter {
1557
+ animation: transitionFlipIn var(--transition-duration, 0.8s) ease-out forwards;
1558
+ }
1559
+
1560
+ .transition-flip-exit {
1561
+ animation: transitionFlipOut var(--transition-duration, 0.8s) ease-in forwards;
1562
+ }
1563
+
1564
+ .transition-rotate-enter {
1565
+ animation: transitionRotateIn var(--transition-duration, 0.8s) ease-out forwards;
1566
+ }
1567
+
1568
+ .transition-rotate-exit {
1569
+ animation: transitionRotateOut var(--transition-duration, 0.8s) ease-in forwards;
1570
+ }
1571
+
1572
+ .transition-wipeLeft-enter,
1573
+ .transition-revealLeft-enter {
1574
+ animation: transitionWipeLeftIn var(--transition-duration, 0.75s) ease-out forwards;
228
1575
  }
229
1576
 
230
- /* Fallback for browsers without clip-path */
231
- @keyframes typewriterFallback {
232
- from {
233
- width: 0;
234
- overflow: hidden;
235
- }
236
- to {
237
- width: 100%;
238
- overflow: hidden;
239
- }
1577
+ .transition-wipeLeft-exit {
1578
+ animation: transitionWipeLeftOut var(--transition-duration, 0.75s) ease-in forwards;
240
1579
  }
241
1580
 
242
- /* ============================================
243
- Block Transitions
244
- Applied to entire block containers
245
- ============================================ */
1581
+ .transition-wipeRight-enter,
1582
+ .transition-revealRight-enter {
1583
+ animation: transitionWipeRightIn var(--transition-duration, 0.75s) ease-out forwards;
1584
+ }
246
1585
 
247
- .transition-fade-enter {
248
- animation: fadeIn var(--transition-duration, 1.5s) ease-out forwards;
1586
+ .transition-wipeRight-exit {
1587
+ animation: transitionWipeRightOut var(--transition-duration, 0.75s) ease-in forwards;
249
1588
  }
250
1589
 
251
- .transition-fade-exit {
252
- animation: fadeOut var(--transition-duration, 1.5s) ease-out forwards;
1590
+ .transition-wipeUp-enter,
1591
+ .transition-revealUp-enter {
1592
+ animation: transitionWipeUpIn var(--transition-duration, 0.75s) ease-out forwards;
253
1593
  }
254
1594
 
255
- .transition-dissolve-enter {
256
- animation: fadeIn var(--transition-duration, 2s) ease-in-out forwards;
1595
+ .transition-wipeUp-exit {
1596
+ animation: transitionWipeUpOut var(--transition-duration, 0.75s) ease-in forwards;
257
1597
  }
258
1598
 
259
- .transition-dissolve-exit {
260
- animation: fadeOut var(--transition-duration, 2s) ease-in-out forwards;
1599
+ .transition-wipeDown-enter,
1600
+ .transition-revealDown-enter {
1601
+ animation: transitionWipeDownIn var(--transition-duration, 0.75s) ease-out forwards;
261
1602
  }
262
1603
 
263
- .transition-slideLeft-enter {
1604
+ .transition-wipeDown-exit {
1605
+ animation: transitionWipeDownOut var(--transition-duration, 0.75s) ease-in forwards;
1606
+ }
1607
+
1608
+ .transition-revealLeft-exit,
1609
+ .transition-revealRight-exit,
1610
+ .transition-revealUp-exit,
1611
+ .transition-revealDown-exit {
1612
+ animation: fadeOut var(--transition-duration, 0.75s) ease-in forwards;
1613
+ }
1614
+
1615
+ .transition-splitHorizontal-enter {
1616
+ animation: transitionSplitHorizontalIn var(--transition-duration, 0.8s) ease-out forwards;
1617
+ }
1618
+
1619
+ .transition-splitHorizontal-exit {
1620
+ animation: transitionSplitHorizontalOut var(--transition-duration, 0.8s) ease-in forwards;
1621
+ }
1622
+
1623
+ .transition-splitVertical-enter {
1624
+ animation: transitionSplitVerticalIn var(--transition-duration, 0.8s) ease-out forwards;
1625
+ }
1626
+
1627
+ .transition-splitVertical-exit {
1628
+ animation: transitionSplitVerticalOut var(--transition-duration, 0.8s) ease-in forwards;
1629
+ }
1630
+
1631
+ .transition-coverLeft-enter,
1632
+ .transition-pullLeft-enter {
1633
+ animation: slideInRight var(--transition-duration, 0.75s) ease-out forwards;
1634
+ }
1635
+
1636
+ .transition-coverRight-enter,
1637
+ .transition-pullRight-enter {
1638
+ animation: slideInLeft var(--transition-duration, 0.75s) ease-out forwards;
1639
+ }
1640
+
1641
+ .transition-coverUp-enter,
1642
+ .transition-pullUp-enter {
1643
+ animation: slideInBottom var(--transition-duration, 0.75s) ease-out forwards;
1644
+ }
1645
+
1646
+ .transition-coverDown-enter,
1647
+ .transition-pullDown-enter {
1648
+ animation: slideInTop var(--transition-duration, 0.75s) ease-out forwards;
1649
+ }
1650
+
1651
+ .transition-coverLeft-exit,
1652
+ .transition-coverRight-exit,
1653
+ .transition-coverUp-exit,
1654
+ .transition-coverDown-exit,
1655
+ .transition-pullLeft-exit,
1656
+ .transition-pullRight-exit,
1657
+ .transition-pullUp-exit,
1658
+ .transition-pullDown-exit {
1659
+ animation: transitionHold var(--transition-duration, 0.75s) linear forwards;
1660
+ }
1661
+
1662
+ .transition-uncoverLeft-enter,
1663
+ .transition-uncoverRight-enter,
1664
+ .transition-uncoverUp-enter,
1665
+ .transition-uncoverDown-enter {
1666
+ animation: fadeIn var(--transition-duration, 0.75s) ease-out forwards;
1667
+ }
1668
+
1669
+ .transition-uncoverLeft-exit {
1670
+ animation: slideOutLeft var(--transition-duration, 0.75s) ease-in forwards;
1671
+ }
1672
+
1673
+ .transition-uncoverRight-exit {
1674
+ animation: slideOutRight var(--transition-duration, 0.75s) ease-in forwards;
1675
+ }
1676
+
1677
+ .transition-uncoverUp-exit {
1678
+ animation: slideOutTop var(--transition-duration, 0.75s) ease-in forwards;
1679
+ }
1680
+
1681
+ .transition-uncoverDown-exit {
1682
+ animation: slideOutBottom var(--transition-duration, 0.75s) ease-in forwards;
1683
+ }
1684
+
1685
+ .transition-shapeCircle-enter {
1686
+ animation: transitionCircleIn var(--transition-duration, 0.75s) ease-out forwards;
1687
+ }
1688
+
1689
+ .transition-shapeCircle-exit {
1690
+ animation: transitionCircleOut var(--transition-duration, 0.75s) ease-in forwards;
1691
+ }
1692
+
1693
+ .transition-shapeDiamond-enter {
1694
+ animation: transitionDiamondIn var(--transition-duration, 0.75s) ease-out forwards;
1695
+ }
1696
+
1697
+ .transition-shapeDiamond-exit {
1698
+ animation: transitionDiamondOut var(--transition-duration, 0.75s) ease-in forwards;
1699
+ }
1700
+
1701
+ .transition-shapePlus-enter {
1702
+ animation: transitionPlusIn var(--transition-duration, 0.8s) ease-out forwards;
1703
+ }
1704
+
1705
+ .transition-shapePlus-exit {
1706
+ animation: transitionPlusOut var(--transition-duration, 0.8s) ease-in forwards;
1707
+ }
1708
+
1709
+ .transition-flash-enter {
1710
+ animation: transitionFlashIn var(--transition-duration, 0.7s) ease-out forwards;
1711
+ }
1712
+
1713
+ .transition-flash-exit {
1714
+ animation: transitionFlashOut var(--transition-duration, 0.7s) ease-in forwards;
1715
+ }
1716
+
1717
+ .transition-newsflash-enter {
1718
+ animation: transitionNewsflashIn var(--transition-duration, 0.75s) ease-out forwards;
1719
+ }
1720
+
1721
+ .transition-newsflash-exit {
1722
+ animation: transitionNewsflashOut var(--transition-duration, 0.75s) ease-in forwards;
1723
+ }
1724
+
1725
+ .transition-fallOver-enter {
1726
+ animation: transitionFallOverIn var(--transition-duration, 0.85s) ease-out forwards;
1727
+ }
1728
+
1729
+ .transition-fallOver-exit {
1730
+ animation: transitionFallOverOut var(--transition-duration, 0.85s) ease-in forwards;
1731
+ }
1732
+
1733
+ .transition-drape-enter {
1734
+ animation: transitionDrapeIn var(--transition-duration, 0.85s) ease-out forwards;
1735
+ }
1736
+
1737
+ .transition-drape-exit {
1738
+ animation: transitionDrapeOut var(--transition-duration, 0.85s) ease-in forwards;
1739
+ }
1740
+
1741
+ .transition-curtains-enter {
1742
+ animation: transitionCurtainsIn var(--transition-duration, 0.85s) ease-out forwards;
1743
+ }
1744
+
1745
+ .transition-curtains-exit {
1746
+ animation: transitionCurtainsOut var(--transition-duration, 0.85s) ease-in forwards;
1747
+ }
1748
+
1749
+ .transition-wind-enter {
1750
+ animation: transitionWindIn var(--transition-duration, 0.8s) ease-out forwards;
1751
+ }
1752
+
1753
+ .transition-wind-exit {
1754
+ animation: transitionWindOut var(--transition-duration, 0.8s) ease-in forwards;
1755
+ }
1756
+
1757
+ .transition-prestige-enter {
1758
+ animation: transitionPrestigeIn var(--transition-duration, 0.85s) ease-out forwards;
1759
+ }
1760
+
1761
+ .transition-prestige-exit {
1762
+ animation: transitionPrestigeOut var(--transition-duration, 0.85s) ease-in forwards;
1763
+ }
1764
+
1765
+ .transition-fracture-enter {
1766
+ animation: transitionFractureIn var(--transition-duration, 0.8s) ease-out forwards;
1767
+ }
1768
+
1769
+ .transition-fracture-exit {
1770
+ animation: transitionFractureOut var(--transition-duration, 0.8s) ease-in forwards;
1771
+ }
1772
+
1773
+ .transition-crush-enter {
1774
+ animation: transitionCrushIn var(--transition-duration, 0.75s) ease-out forwards;
1775
+ }
1776
+
1777
+ .transition-crush-exit {
1778
+ animation: transitionCrushOut var(--transition-duration, 0.75s) ease-in forwards;
1779
+ }
1780
+
1781
+ .transition-peelOff-enter {
1782
+ animation: transitionPeelIn var(--transition-duration, 0.85s) ease-out forwards;
1783
+ }
1784
+
1785
+ .transition-peelOff-exit {
1786
+ animation: transitionPeelOut var(--transition-duration, 0.85s) ease-in forwards;
1787
+ }
1788
+
1789
+ .transition-pageCurl-enter,
1790
+ .transition-pageCurlDouble-enter,
1791
+ .transition-pageCurlSingle-enter {
1792
+ animation: transitionPageCurlIn var(--transition-duration, 0.9s) ease-out forwards;
1793
+ }
1794
+
1795
+ .transition-pageCurl-exit,
1796
+ .transition-pageCurlDouble-exit,
1797
+ .transition-pageCurlSingle-exit {
1798
+ animation: transitionPageCurlOut var(--transition-duration, 0.9s) ease-in forwards;
1799
+ }
1800
+
1801
+ .transition-airplane-enter {
1802
+ animation: transitionAirplaneIn var(--transition-duration, 0.85s) ease-out forwards;
1803
+ }
1804
+
1805
+ .transition-airplane-exit {
1806
+ animation: transitionAirplaneOut var(--transition-duration, 0.85s) ease-in forwards;
1807
+ }
1808
+
1809
+ .transition-origami-enter {
1810
+ animation: transitionOrigamiIn var(--transition-duration, 0.85s) ease-out forwards;
1811
+ }
1812
+
1813
+ .transition-origami-exit {
1814
+ animation: transitionOrigamiOut var(--transition-duration, 0.85s) ease-in forwards;
1815
+ }
1816
+
1817
+ .transition-ripple-enter {
1818
+ animation: transitionRippleIn var(--transition-duration, 0.85s) ease-out forwards;
1819
+ }
1820
+
1821
+ .transition-ripple-exit {
1822
+ animation: transitionRippleOut var(--transition-duration, 0.85s) ease-in forwards;
1823
+ }
1824
+
1825
+ .transition-checkerboard-enter,
1826
+ .transition-random-enter {
1827
+ -webkit-mask-image:
1828
+ linear-gradient(45deg, #000 25%, transparent 25%, transparent 75%, #000 75%),
1829
+ linear-gradient(45deg, #000 25%, transparent 25%, transparent 75%, #000 75%);
1830
+ -webkit-mask-size: 12% 12%;
1831
+ -webkit-mask-position:
1832
+ 0 0,
1833
+ 6% 6%;
1834
+ mask-image:
1835
+ linear-gradient(45deg, #000 25%, transparent 25%, transparent 75%, #000 75%),
1836
+ linear-gradient(45deg, #000 25%, transparent 25%, transparent 75%, #000 75%);
1837
+ mask-size: 12% 12%;
1838
+ mask-position:
1839
+ 0 0,
1840
+ 6% 6%;
1841
+ animation: transitionTexturedIn var(--transition-duration, 0.85s) steps(8, end) forwards;
1842
+ }
1843
+
1844
+ .transition-checkerboard-exit,
1845
+ .transition-random-exit {
1846
+ -webkit-mask-image:
1847
+ linear-gradient(45deg, #000 25%, transparent 25%, transparent 75%, #000 75%),
1848
+ linear-gradient(45deg, #000 25%, transparent 25%, transparent 75%, #000 75%);
1849
+ -webkit-mask-size: 12% 12%;
1850
+ -webkit-mask-position:
1851
+ 0 0,
1852
+ 6% 6%;
1853
+ mask-image:
1854
+ linear-gradient(45deg, #000 25%, transparent 25%, transparent 75%, #000 75%),
1855
+ linear-gradient(45deg, #000 25%, transparent 25%, transparent 75%, #000 75%);
1856
+ mask-size: 12% 12%;
1857
+ mask-position:
1858
+ 0 0,
1859
+ 6% 6%;
1860
+ animation: transitionTexturedOut var(--transition-duration, 0.85s) steps(8, end) forwards;
1861
+ }
1862
+
1863
+ .transition-randomBarsHorizontal-enter,
1864
+ .transition-blindsHorizontal-enter,
1865
+ .transition-combHorizontal-enter,
1866
+ .transition-stripsLeft-enter,
1867
+ .transition-stripsRight-enter {
1868
+ -webkit-mask-image: repeating-linear-gradient(0deg, #000 0 6%, transparent 6% 12%);
1869
+ mask-image: repeating-linear-gradient(0deg, #000 0 6%, transparent 6% 12%);
1870
+ animation: transitionTexturedIn var(--transition-duration, 0.8s) steps(9, end) forwards;
1871
+ }
1872
+
1873
+ .transition-randomBarsHorizontal-exit,
1874
+ .transition-blindsHorizontal-exit,
1875
+ .transition-combHorizontal-exit,
1876
+ .transition-stripsLeft-exit,
1877
+ .transition-stripsRight-exit {
1878
+ -webkit-mask-image: repeating-linear-gradient(0deg, #000 0 6%, transparent 6% 12%);
1879
+ mask-image: repeating-linear-gradient(0deg, #000 0 6%, transparent 6% 12%);
1880
+ animation: transitionTexturedOut var(--transition-duration, 0.8s) steps(9, end) forwards;
1881
+ }
1882
+
1883
+ .transition-randomBarsVertical-enter,
1884
+ .transition-blindsVertical-enter,
1885
+ .transition-combVertical-enter,
1886
+ .transition-stripsUp-enter,
1887
+ .transition-stripsDown-enter {
1888
+ -webkit-mask-image: repeating-linear-gradient(90deg, #000 0 6%, transparent 6% 12%);
1889
+ mask-image: repeating-linear-gradient(90deg, #000 0 6%, transparent 6% 12%);
1890
+ animation: transitionTexturedIn var(--transition-duration, 0.8s) steps(9, end) forwards;
1891
+ }
1892
+
1893
+ .transition-randomBarsVertical-exit,
1894
+ .transition-blindsVertical-exit,
1895
+ .transition-combVertical-exit,
1896
+ .transition-stripsUp-exit,
1897
+ .transition-stripsDown-exit {
1898
+ -webkit-mask-image: repeating-linear-gradient(90deg, #000 0 6%, transparent 6% 12%);
1899
+ mask-image: repeating-linear-gradient(90deg, #000 0 6%, transparent 6% 12%);
1900
+ animation: transitionTexturedOut var(--transition-duration, 0.8s) steps(9, end) forwards;
1901
+ }
1902
+
1903
+ .transition-honeycomb-enter {
1904
+ -webkit-mask-image: radial-gradient(circle, #000 0 34%, transparent 35% 48%, #000 49%);
1905
+ -webkit-mask-size: 10% 17%;
1906
+ mask-image: radial-gradient(circle, #000 0 34%, transparent 35% 48%, #000 49%);
1907
+ mask-size: 10% 17%;
1908
+ animation: transitionTexturedIn var(--transition-duration, 0.85s) steps(8, end) forwards;
1909
+ }
1910
+
1911
+ .transition-honeycomb-exit {
1912
+ -webkit-mask-image: radial-gradient(circle, #000 0 34%, transparent 35% 48%, #000 49%);
1913
+ -webkit-mask-size: 10% 17%;
1914
+ mask-image: radial-gradient(circle, #000 0 34%, transparent 35% 48%, #000 49%);
1915
+ mask-size: 10% 17%;
1916
+ animation: transitionTexturedOut var(--transition-duration, 0.85s) steps(8, end) forwards;
1917
+ }
1918
+
1919
+ .transition-glitter-enter {
1920
+ -webkit-mask-image: radial-gradient(circle, #000 0 18%, transparent 20% 36%, #000 38%);
1921
+ -webkit-mask-size: 7% 7%;
1922
+ mask-image: radial-gradient(circle, #000 0 18%, transparent 20% 36%, #000 38%);
1923
+ mask-size: 7% 7%;
1924
+ animation: transitionFlashIn var(--transition-duration, 0.85s) steps(10, end) forwards;
1925
+ }
1926
+
1927
+ .transition-glitter-exit {
1928
+ -webkit-mask-image: radial-gradient(circle, #000 0 18%, transparent 20% 36%, #000 38%);
1929
+ -webkit-mask-size: 7% 7%;
1930
+ mask-image: radial-gradient(circle, #000 0 18%, transparent 20% 36%, #000 38%);
1931
+ mask-size: 7% 7%;
1932
+ animation: transitionFlashOut var(--transition-duration, 0.85s) steps(10, end) forwards;
1933
+ }
1934
+
1935
+ .transition-vortex-enter {
1936
+ animation: transitionVortexIn var(--transition-duration, 0.85s) ease-out forwards;
1937
+ }
1938
+
1939
+ .transition-vortex-exit {
1940
+ animation: transitionVortexOut var(--transition-duration, 0.85s) ease-in forwards;
1941
+ }
1942
+
1943
+ .transition-shred-enter {
1944
+ -webkit-mask-image: repeating-linear-gradient(90deg, #000 0 5%, transparent 5% 8%);
1945
+ mask-image: repeating-linear-gradient(90deg, #000 0 5%, transparent 5% 8%);
1946
+ animation: transitionShredIn var(--transition-duration, 0.85s) ease-out forwards;
1947
+ }
1948
+
1949
+ .transition-shred-exit {
1950
+ -webkit-mask-image: repeating-linear-gradient(90deg, #000 0 5%, transparent 5% 8%);
1951
+ mask-image: repeating-linear-gradient(90deg, #000 0 5%, transparent 5% 8%);
1952
+ animation: transitionShredOut var(--transition-duration, 0.85s) ease-in forwards;
1953
+ }
1954
+
1955
+ .transition-switch-enter {
1956
+ animation: transitionSwitchIn var(--transition-duration, 0.8s) ease-out forwards;
1957
+ }
1958
+
1959
+ .transition-switch-exit {
1960
+ animation: transitionSwitchOut var(--transition-duration, 0.8s) ease-in forwards;
1961
+ }
1962
+
1963
+ .transition-cube-enter {
1964
+ animation: transitionCubeIn var(--transition-duration, 0.85s) ease-out forwards;
1965
+ }
1966
+
1967
+ .transition-cube-exit {
1968
+ animation: transitionCubeOut var(--transition-duration, 0.85s) ease-in forwards;
1969
+ }
1970
+
1971
+ .transition-doors-enter {
1972
+ animation: transitionDoorsIn var(--transition-duration, 0.85s) ease-out forwards;
1973
+ }
1974
+
1975
+ .transition-doors-exit {
1976
+ animation: transitionDoorsOut var(--transition-duration, 0.85s) ease-in forwards;
1977
+ }
1978
+
1979
+ .transition-box-enter {
1980
+ animation: transitionBoxIn var(--transition-duration, 0.75s) ease-out forwards;
1981
+ }
1982
+
1983
+ .transition-box-exit {
1984
+ animation: transitionBoxOut var(--transition-duration, 0.75s) ease-in forwards;
1985
+ }
1986
+
1987
+ .transition-gallery-enter {
1988
+ animation: transitionGalleryIn var(--transition-duration, 0.8s) ease-out forwards;
1989
+ }
1990
+
1991
+ .transition-gallery-exit {
1992
+ animation: transitionGalleryOut var(--transition-duration, 0.8s) ease-in forwards;
1993
+ }
1994
+
1995
+ .transition-conveyor-enter,
1996
+ .transition-panLeft-enter {
264
1997
  animation: slideInRight var(--transition-duration, 0.8s) ease-out forwards;
265
1998
  }
266
1999
 
267
- .transition-slideLeft-exit {
268
- animation: slideOutLeft var(--transition-duration, 0.8s) ease-out forwards;
2000
+ .transition-conveyor-exit,
2001
+ .transition-panLeft-exit {
2002
+ animation: slideOutLeft var(--transition-duration, 0.8s) ease-in forwards;
269
2003
  }
270
2004
 
271
- .transition-slideRight-enter {
2005
+ .transition-panRight-enter {
272
2006
  animation: slideInLeft var(--transition-duration, 0.8s) ease-out forwards;
273
2007
  }
274
2008
 
275
- .transition-slideRight-exit {
276
- animation: slideOutRight var(--transition-duration, 0.8s) ease-out forwards;
2009
+ .transition-panRight-exit {
2010
+ animation: slideOutRight var(--transition-duration, 0.8s) ease-in forwards;
2011
+ }
2012
+
2013
+ .transition-panUp-enter {
2014
+ animation: slideInBottom var(--transition-duration, 0.8s) ease-out forwards;
2015
+ }
2016
+
2017
+ .transition-panUp-exit {
2018
+ animation: slideOutTop var(--transition-duration, 0.8s) ease-in forwards;
2019
+ }
2020
+
2021
+ .transition-panDown-enter {
2022
+ animation: slideInTop var(--transition-duration, 0.8s) ease-out forwards;
2023
+ }
2024
+
2025
+ .transition-panDown-exit {
2026
+ animation: slideOutBottom var(--transition-duration, 0.8s) ease-in forwards;
2027
+ }
2028
+
2029
+ .transition-ferrisWheel-enter {
2030
+ animation: transitionFerrisIn var(--transition-duration, 0.85s) ease-out forwards;
2031
+ }
2032
+
2033
+ .transition-ferrisWheel-exit {
2034
+ animation: transitionFerrisOut var(--transition-duration, 0.85s) ease-in forwards;
2035
+ }
2036
+
2037
+ .transition-window-enter {
2038
+ animation: transitionWindowIn var(--transition-duration, 0.8s) ease-out forwards;
2039
+ }
2040
+
2041
+ .transition-window-exit {
2042
+ animation: transitionWindowOut var(--transition-duration, 0.8s) ease-in forwards;
2043
+ }
2044
+
2045
+ .transition-orbit-enter {
2046
+ animation: transitionOrbitIn var(--transition-duration, 0.85s) ease-out forwards;
2047
+ }
2048
+
2049
+ .transition-orbit-exit {
2050
+ animation: transitionOrbitOut var(--transition-duration, 0.85s) ease-in forwards;
2051
+ }
2052
+
2053
+ .transition-flyThrough-enter {
2054
+ animation: transitionFlyThroughIn var(--transition-duration, 0.85s) ease-out forwards;
2055
+ }
2056
+
2057
+ .transition-flyThrough-exit {
2058
+ animation: transitionFlyThroughOut var(--transition-duration, 0.85s) ease-in forwards;
2059
+ }
2060
+
2061
+ .transition-wheel-enter {
2062
+ animation: transitionWheelIn var(--transition-duration, 0.85s) ease-out forwards;
2063
+ }
2064
+
2065
+ .transition-wheel-exit {
2066
+ animation: transitionWheelOut var(--transition-duration, 0.85s) ease-in forwards;
2067
+ }
2068
+
2069
+ .transition-wheelReverse-enter {
2070
+ animation: transitionWheelReverseIn var(--transition-duration, 0.85s) ease-out forwards;
2071
+ }
2072
+
2073
+ .transition-wheelReverse-exit {
2074
+ animation: transitionWheelReverseOut var(--transition-duration, 0.85s) ease-in forwards;
2075
+ }
2076
+
2077
+ .transition-wedge-enter {
2078
+ animation: transitionWedgeIn var(--transition-duration, 0.8s) ease-out forwards;
2079
+ }
2080
+
2081
+ .transition-wedge-exit {
2082
+ animation: transitionWedgeOut var(--transition-duration, 0.8s) ease-in forwards;
2083
+ }
2084
+
2085
+ .transition-prism-enter {
2086
+ animation: transitionPrismIn var(--transition-duration, 0.85s) ease-out forwards;
2087
+ }
2088
+
2089
+ .transition-prism-exit {
2090
+ animation: transitionPrismOut var(--transition-duration, 0.85s) ease-in forwards;
2091
+ }
2092
+
2093
+ .transition-warp-enter {
2094
+ animation: transitionWarpIn var(--transition-duration, 0.85s) ease-out forwards;
2095
+ }
2096
+
2097
+ .transition-warp-exit {
2098
+ animation: transitionWarpOut var(--transition-duration, 0.85s) ease-in forwards;
2099
+ }
2100
+
2101
+ .transition-clock-enter {
2102
+ animation: transitionClockIn var(--transition-duration, 0.8s) ease-out forwards;
2103
+ }
2104
+
2105
+ .transition-clock-exit {
2106
+ animation: transitionClockOut var(--transition-duration, 0.8s) ease-in forwards;
277
2107
  }
278
2108
 
279
2109
  /* ============================================
@@ -385,6 +2215,32 @@
385
2215
  z-index: 1;
386
2216
  }
387
2217
 
2218
+ /* Drag-to-swipe (slideshow mode) — the active slide tracks the pointer 1:1
2219
+ while dragging (no transition), then eases to its resting position (snap
2220
+ back) or flings off-screen (commit) on release. The 260ms below must match
2221
+ DEFAULT_SETTLE_MS in hooks/useSlideSwipe.ts. Like the block slide/push
2222
+ transitions, this is a brief, purposeful motion, so it is intentionally left
2223
+ running under prefers-reduced-motion (only long ambient loops are frozen). */
2224
+ .doc-player__block--active.doc-player__block--dragging {
2225
+ transition: none;
2226
+ }
2227
+
2228
+ .doc-player__block--active.doc-player__block--settling {
2229
+ transition: transform 260ms cubic-bezier(0.22, 1, 0.36, 1);
2230
+ }
2231
+
2232
+ .doc-player--swipe {
2233
+ cursor: grab;
2234
+ /* Slideshow presentation surface: suppress text selection so a mouse drag
2235
+ never starts a selection instead of a swipe. */
2236
+ -webkit-user-select: none;
2237
+ user-select: none;
2238
+ }
2239
+
2240
+ .doc-player--swipe.doc-player--grabbing {
2241
+ cursor: grabbing;
2242
+ }
2243
+
388
2244
  /* Tap-to-toggle play/pause feedback */
389
2245
  .doc-player__tap-feedback {
390
2246
  position: absolute;
@@ -419,6 +2275,13 @@
419
2275
  width: 100%;
420
2276
  height: 100%;
421
2277
  display: block;
2278
+ transform-origin: center;
2279
+ transform-box: fill-box;
2280
+ }
2281
+
2282
+ .block-svg[class*='transition-'] {
2283
+ backface-visibility: hidden;
2284
+ will-change: transform, opacity, filter, clip-path;
422
2285
  }
423
2286
 
424
2287
  /* Layer containers within SVG */
@@ -492,3 +2355,41 @@
492
2355
  display: block;
493
2356
  width: 100%;
494
2357
  }
2358
+
2359
+ /* ============================================
2360
+ Reduced motion
2361
+ Freeze ambient/Ken Burns motion when the user asks for calm. Entrance
2362
+ fades and block transitions are brief and purposeful, so they stay;
2363
+ the long-running spatial loops are the vestibular offenders.
2364
+ Player-only by construction: headless export renders with no
2365
+ reduced-motion preference, so videos are unaffected.
2366
+ ============================================ */
2367
+ @media (prefers-reduced-motion: reduce) {
2368
+ .anim-slowZoom-in,
2369
+ .anim-slowZoom-out,
2370
+ .anim-slowZoom-panLeft,
2371
+ .anim-slowZoom-panRight,
2372
+ .anim-drift {
2373
+ animation: none;
2374
+ }
2375
+ }
2376
+
2377
+ /* ============================================
2378
+ Empty state
2379
+ Rendered by <DocPlayer> when neither `doc` nor `markdown` is provided.
2380
+ ============================================ */
2381
+ .doc-player--empty {
2382
+ min-height: 120px;
2383
+ width: 100%;
2384
+ background: #f0f0f0;
2385
+ }
2386
+
2387
+ /* ============================================
2388
+ Missing-stylesheet sentinel
2389
+ DocPlayer reads this custom property at mount (dev builds only) and
2390
+ warns when it computes empty — i.e. when the host app forgot to import
2391
+ "@bendyline/squisq-react/styles".
2392
+ ============================================ */
2393
+ .doc-player {
2394
+ --squisq-styles-loaded: 1;
2395
+ }