@kieransimkin/dancemoves 3.0.3 → 3.0.4

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/lib/index.mjs CHANGED
@@ -505,6 +505,17 @@ function install(__dmScope) {
505
505
  };
506
506
  }
507
507
  function dispatchLyric(entry, audio, index) {
508
+ var previousVisibleIndex = -1;
509
+ var previousVisibleEntry = null;
510
+ if (Number.isFinite(index)) {
511
+ for (var previousCursor = index - 1; previousCursor >= 0; previousCursor -= 1) {
512
+ if (String(lyricList[previousCursor].text || "").trim()) {
513
+ previousVisibleIndex = previousCursor;
514
+ previousVisibleEntry = lyricList[previousCursor];
515
+ break;
516
+ }
517
+ }
518
+ }
508
519
  var nextIndex = Number.isFinite(index) && index + 1 < lyricList.length ? index + 1 : -1;
509
520
  var nextEntry = nextIndex >= 0 ? lyricList[nextIndex] : null;
510
521
  var nextVisibleIndex = -1;
@@ -524,6 +535,10 @@ function install(__dmScope) {
524
535
  text: entry ? entry.text : "",
525
536
  normalisedText: entry ? entry.normalisedText : "",
526
537
  index: Number.isFinite(index) ? index : -1,
538
+ previousVisibleTime: previousVisibleEntry ? previousVisibleEntry.time : null,
539
+ previousVisibleText: previousVisibleEntry ? previousVisibleEntry.text : "",
540
+ previousVisibleNormalisedText: previousVisibleEntry ? previousVisibleEntry.normalisedText : "",
541
+ previousVisibleIndex,
527
542
  nextTime: nextEntry ? nextEntry.time : null,
528
543
  nextText: nextEntry ? nextEntry.text : "",
529
544
  nextNormalisedText: nextEntry ? nextEntry.normalisedText : "",
@@ -597,6 +612,7 @@ function install(__dmScope) {
597
612
  __dmScope.dataset(this.element, "danceMovesLyricState", "idle");
598
613
  }
599
614
  };
615
+ document2.dispatchEvent(new CustomEvent("dance-moves-lyric-ready", { detail: { element: container } }));
600
616
  return lyricRenderer;
601
617
  }
602
618
  function callHandlers(key, detail) {
@@ -1345,6 +1361,317 @@ function install2(__dmScope) {
1345
1361
  }
1346
1362
  }));
1347
1363
  }
1364
+ function lyricStage(options) {
1365
+ options = options || {};
1366
+ var state = commonState(options, "lyric-stage");
1367
+ var audio = element(options.audio, state.root.querySelector("audio"));
1368
+ var popover = element(options.popover, document2.querySelector(".dance-moves-lyric-popover"));
1369
+ if (!audio)
1370
+ throw new Error("DanceMovesEffects lyricStage requires an audio element");
1371
+ if (!popover) {
1372
+ let mountWhenReady = function() {
1373
+ if (!pending || !document2.querySelector(".dance-moves-lyric-popover"))
1374
+ return;
1375
+ pending = false;
1376
+ state.removers.splice(0).forEach(function(remove) {
1377
+ remove();
1378
+ });
1379
+ lyricStage(options);
1380
+ };
1381
+ var pending = true;
1382
+ listen(document2, "dance-moves-lyric-ready", mountWhenReady, void 0, state.removers);
1383
+ return register(state.id, Object.freeze({
1384
+ id: state.id,
1385
+ type: "lyric-stage-pending",
1386
+ snapshot: function() {
1387
+ return { id: state.id, type: "lyric-stage-pending", phase: "waiting-for-popover" };
1388
+ },
1389
+ teardown: function() {
1390
+ pending = false;
1391
+ state.removers.splice(0).forEach(function(remove) {
1392
+ remove();
1393
+ });
1394
+ instances.delete(state.id);
1395
+ }
1396
+ }));
1397
+ }
1398
+ var current = popover.querySelector(".dance-moves-lyric-popover__text");
1399
+ if (!current)
1400
+ throw new Error("DanceMovesEffects lyricStage requires the DanceMoves current lyric element");
1401
+ var viewport = document2.createElement("div");
1402
+ var track = document2.createElement("div");
1403
+ var previous = document2.createElement("span");
1404
+ var next = document2.createElement("span");
1405
+ viewport.className = "dance-moves-lyric-stage__viewport";
1406
+ track.className = "dance-moves-lyric-stage__track";
1407
+ previous.className = "dance-moves-lyric-stage__line dance-moves-lyric-stage__line--previous";
1408
+ current.className += " dance-moves-lyric-stage__line dance-moves-lyric-stage__line--current";
1409
+ next.className = "dance-moves-lyric-stage__line dance-moves-lyric-stage__line--next";
1410
+ __dmScope.dataset(previous, "danceMovesLyricSlot", "previous");
1411
+ __dmScope.dataset(current, "danceMovesLyricSlot", "current");
1412
+ __dmScope.dataset(next, "danceMovesLyricSlot", "next");
1413
+ track.appendChild(previous);
1414
+ track.appendChild(current);
1415
+ track.appendChild(next);
1416
+ viewport.appendChild(track);
1417
+ popover.appendChild(viewport);
1418
+ __dmScope.dataset(popover, "danceMovesLyricStage", "ready");
1419
+ __dmScope.setStyle(popover.style, "--dance-moves-lyric-progress", "0");
1420
+ var travelTicks = Math.max(1, Math.round(finite2(options.travelTicks, 32)));
1421
+ var defaultCueTicks = Math.max(1, Math.round(finite2(options.cueDurationTicks, 32)));
1422
+ var latest = null, phase = "idle", progress = 0, frame = 0, wakeTimer = 0, cueTimer = 0, cueCleanup = null, cueCount = 0;
1423
+ var lyricEffects = [];
1424
+ var slots = Object.freeze({ previous, current, next, viewport, track });
1425
+ function safely(callback, payload, label) {
1426
+ if (typeof callback !== "function")
1427
+ return null;
1428
+ try {
1429
+ return callback(payload);
1430
+ } catch (error) {
1431
+ if (window2.console && typeof window2.console.error === "function")
1432
+ window2.console.error("DanceMoves " + label + " callback failed", error);
1433
+ }
1434
+ return null;
1435
+ }
1436
+ function blocked() {
1437
+ return document2.hidden || state.reduced.matches || state.forced.matches;
1438
+ }
1439
+ function stopClock() {
1440
+ if (frame)
1441
+ window2.cancelAnimationFrame(frame);
1442
+ if (wakeTimer)
1443
+ window2.clearTimeout(wakeTimer);
1444
+ frame = 0;
1445
+ wakeTimer = 0;
1446
+ }
1447
+ function publish(reason) {
1448
+ __dmScope.dataset(popover, "danceMovesLyricPhase", phase);
1449
+ safely(options.render, {
1450
+ root: state.root,
1451
+ popover,
1452
+ audio,
1453
+ slots,
1454
+ detail: latest,
1455
+ phase,
1456
+ progress,
1457
+ reason,
1458
+ playing: !audio.paused && !audio.ended && !blocked(),
1459
+ reducedMotion: state.reduced.matches,
1460
+ forcedColours: state.forced.matches
1461
+ }, "lyricStage render");
1462
+ }
1463
+ function setPhase(value, reason) {
1464
+ if (phase === value)
1465
+ return;
1466
+ phase = value;
1467
+ publish(reason || value);
1468
+ }
1469
+ function setProgress(value) {
1470
+ progress = clamp(finite2(value, 0), 0, 1);
1471
+ __dmScope.setStyle(popover.style, "--dance-moves-lyric-progress", progress.toFixed(5));
1472
+ }
1473
+ function copyLyrics(detail) {
1474
+ previous.textContent = detail ? String(detail.previousVisibleText || "") : "";
1475
+ current.textContent = detail ? String(detail.text || "") : "";
1476
+ next.textContent = detail ? String(detail.nextVisibleText || "") : "";
1477
+ __dmScope.dataset(previous, "danceMovesLyricIndex", detail ? String(detail.previousVisibleIndex) : "-1");
1478
+ __dmScope.dataset(current, "danceMovesLyricIndex", detail ? String(detail.index) : "-1");
1479
+ __dmScope.dataset(next, "danceMovesLyricIndex", detail ? String(detail.nextVisibleIndex) : "-1");
1480
+ }
1481
+ function scheduleLyricEffect(result) {
1482
+ if (!result)
1483
+ return;
1484
+ var cleanup = typeof result === "function" ? result : typeof result.cleanup === "function" ? result.cleanup : null;
1485
+ if (!cleanup)
1486
+ return;
1487
+ var durationTicks = result && typeof result === "object" ? Math.max(1, Math.round(finite2(result.durationTicks, 64))) : 64;
1488
+ var record = { cleanup, timer: 0 };
1489
+ record.timer = window2.setTimeout(function() {
1490
+ lyricEffects = lyricEffects.filter(function(item) {
1491
+ return item !== record;
1492
+ });
1493
+ safely(cleanup, { reason: "complete" }, "lyricStage lyric cleanup");
1494
+ }, motion.durationMilliseconds(durationTicks));
1495
+ lyricEffects.push(record);
1496
+ }
1497
+ function travelWindow() {
1498
+ if (!latest || !Number.isFinite(Number(latest.nextVisibleTime)))
1499
+ return null;
1500
+ var end = Number(latest.nextVisibleTime);
1501
+ var duration = motion.durationMilliseconds(travelTicks) / 1e3;
1502
+ return { start: Math.max(Number(latest.time) || 0, end - duration), end };
1503
+ }
1504
+ function tick() {
1505
+ frame = 0;
1506
+ if (audio.paused || audio.ended || blocked())
1507
+ return reconcile("frame-inactive");
1508
+ var windowRange = travelWindow();
1509
+ if (!windowRange) {
1510
+ setProgress(0);
1511
+ return setPhase("waiting", "no-next-line");
1512
+ }
1513
+ var now = Math.max(0, finite2(audio.currentTime, 0));
1514
+ if (now < windowRange.start)
1515
+ return reconcile("frame-before-window");
1516
+ if (now >= windowRange.end) {
1517
+ setProgress(1);
1518
+ return setPhase("arrived", "line-arrival");
1519
+ }
1520
+ setPhase("travelling", "travel-start");
1521
+ setProgress((now - windowRange.start) / Math.max(1e-3, windowRange.end - windowRange.start));
1522
+ frame = window2.requestAnimationFrame(tick);
1523
+ }
1524
+ function reconcile(reason) {
1525
+ stopClock();
1526
+ if (blocked()) {
1527
+ setProgress(0);
1528
+ return setPhase("inactive", reason || "inactive");
1529
+ }
1530
+ if (audio.ended) {
1531
+ setProgress(0);
1532
+ return setPhase("ended", reason || "ended");
1533
+ }
1534
+ if (audio.paused) {
1535
+ setProgress(0);
1536
+ return setPhase("paused", reason || "paused");
1537
+ }
1538
+ var windowRange = travelWindow();
1539
+ if (!windowRange) {
1540
+ setProgress(0);
1541
+ return setPhase("waiting", reason || "no-next-line");
1542
+ }
1543
+ var now = Math.max(0, finite2(audio.currentTime, 0));
1544
+ if (now >= windowRange.end) {
1545
+ setProgress(1);
1546
+ return setPhase("arrived", reason || "arrived");
1547
+ }
1548
+ if (now >= windowRange.start) {
1549
+ setPhase("travelling", reason || "travelling");
1550
+ frame = window2.requestAnimationFrame(tick);
1551
+ return;
1552
+ }
1553
+ setProgress(0);
1554
+ setPhase("waiting", reason || "waiting");
1555
+ wakeTimer = window2.setTimeout(function() {
1556
+ wakeTimer = 0;
1557
+ tick();
1558
+ }, Math.max(0, (windowRange.start - now) * 1e3 / Math.max(0.01, finite2(audio.playbackRate, 1))));
1559
+ }
1560
+ function onLyric(detail) {
1561
+ var previousDetail = latest;
1562
+ var previousText = String(current.textContent || "");
1563
+ latest = detail || null;
1564
+ copyLyrics(latest);
1565
+ if (!blocked() && typeof options.renderLyric === "function") {
1566
+ scheduleLyricEffect(safely(options.renderLyric, {
1567
+ root: state.root,
1568
+ popover,
1569
+ audio,
1570
+ slots,
1571
+ detail: latest,
1572
+ previousDetail,
1573
+ previousText,
1574
+ reducedMotion: false,
1575
+ forcedColours: false
1576
+ }, "lyricStage lyric"));
1577
+ }
1578
+ setProgress(0);
1579
+ publish("lyric-change");
1580
+ reconcile("lyric-change");
1581
+ }
1582
+ function clearCue(reason) {
1583
+ if (cueTimer)
1584
+ window2.clearTimeout(cueTimer);
1585
+ cueTimer = 0;
1586
+ if (cueCleanup)
1587
+ safely(cueCleanup, { reason: reason || "complete" }, "lyricStage cue cleanup");
1588
+ cueCleanup = null;
1589
+ __dmScope.dataset(state.root, "danceMovesLyricCue", reason || "idle");
1590
+ }
1591
+ function onCue(detail) {
1592
+ clearCue("restart");
1593
+ if (blocked() || typeof options.renderCue !== "function")
1594
+ return;
1595
+ cueCount += 1;
1596
+ __dmScope.dataset(state.root, "danceMovesLyricCue", String(detail.normalisedName || detail.name || "cue"));
1597
+ var result = safely(options.renderCue, {
1598
+ root: state.root,
1599
+ popover,
1600
+ audio,
1601
+ slots,
1602
+ detail,
1603
+ count: cueCount,
1604
+ reducedMotion: false,
1605
+ forcedColours: false
1606
+ }, "lyricStage cue");
1607
+ var durationTicks = defaultCueTicks;
1608
+ if (typeof result === "function")
1609
+ cueCleanup = result;
1610
+ else if (result && typeof result === "object") {
1611
+ if (typeof result.cleanup === "function")
1612
+ cueCleanup = result.cleanup;
1613
+ durationTicks = Math.max(1, Math.round(finite2(result.durationTicks, defaultCueTicks)));
1614
+ }
1615
+ cueTimer = window2.setTimeout(function() {
1616
+ clearCue("complete");
1617
+ }, motion.durationMilliseconds(durationTicks));
1618
+ }
1619
+ var unsubscribeLyric = motion.onLyric(onLyric, { id: state.id });
1620
+ var unsubscribeCue = motion.onCue("*", onCue, { id: state.id + ":cue" });
1621
+ ["play", "playing", "pause", "ended", "seeking", "seeked", "ratechange", "timeupdate", "loadedmetadata"].forEach(function(name) {
1622
+ listen(audio, name, function() {
1623
+ reconcile(name);
1624
+ }, void 0, state.removers);
1625
+ });
1626
+ listen(document2, "visibilitychange", function() {
1627
+ reconcile(document2.hidden ? "hidden" : "visible");
1628
+ }, { passive: true }, state.removers);
1629
+ listen(window2, "resize", function() {
1630
+ publish("resize");
1631
+ }, { passive: true }, state.removers);
1632
+ listen(state.reduced, "change", function() {
1633
+ reconcile(state.reduced.matches ? "reduced-motion" : "motion-restored");
1634
+ }, void 0, state.removers);
1635
+ listen(state.forced, "change", function() {
1636
+ reconcile(state.forced.matches ? "forced-colours" : "colours-restored");
1637
+ }, void 0, state.removers);
1638
+ copyLyrics(null);
1639
+ publish("initial");
1640
+ reconcile("initial");
1641
+ return register(state.id, Object.freeze({
1642
+ id: state.id,
1643
+ type: "lyric-stage",
1644
+ restore: function(reason) {
1645
+ reconcile(reason || "manual-restore");
1646
+ },
1647
+ snapshot: function() {
1648
+ return { id: state.id, type: "lyric-stage", phase, progress, playing: !audio.paused && !audio.ended && !blocked(), lyricIndex: latest ? latest.index : -1, nextVisibleIndex: latest ? latest.nextVisibleIndex : -1, cueCount };
1649
+ },
1650
+ teardown: function() {
1651
+ stopClock();
1652
+ clearCue("teardown");
1653
+ unsubscribeLyric();
1654
+ unsubscribeCue();
1655
+ lyricEffects.splice(0).forEach(function(record) {
1656
+ if (record.timer)
1657
+ window2.clearTimeout(record.timer);
1658
+ safely(record.cleanup, { reason: "teardown" }, "lyricStage lyric cleanup");
1659
+ });
1660
+ state.removers.splice(0).forEach(function(remove) {
1661
+ remove();
1662
+ });
1663
+ current.className = current.className.replace(/\s*dance-moves-lyric-stage__line(?:--current)?/g, "").trim();
1664
+ __dmScope.dataset(current, "danceMovesLyricSlot", null);
1665
+ popover.appendChild(current);
1666
+ if (viewport.parentNode === popover)
1667
+ popover.removeChild(viewport);
1668
+ __dmScope.dataset(popover, "danceMovesLyricStage", null);
1669
+ __dmScope.dataset(popover, "danceMovesLyricPhase", null);
1670
+ __dmScope.removeStyle(popover.style, "--dance-moves-lyric-progress");
1671
+ instances.delete(state.id);
1672
+ }
1673
+ }));
1674
+ }
1348
1675
  function quality(options) {
1349
1676
  options = options || {};
1350
1677
  var state = commonState(options, "quality");
@@ -1459,6 +1786,7 @@ function install2(__dmScope) {
1459
1786
  playbackPulse,
1460
1787
  cueClass,
1461
1788
  cueTimeline,
1789
+ lyricStage,
1462
1790
  quality,
1463
1791
  get: function(id) {
1464
1792
  return instances.get(String(id)) || null;
@@ -4689,7 +5017,7 @@ function createMotionRecorder(scope, { durationMilliseconds = 3e4, maxSamples =
4689
5017
  }
4690
5018
 
4691
5019
  // .build/modules/version.mjs
4692
- var VERSION = "3.0.3";
5020
+ var VERSION = "3.0.4";
4693
5021
 
4694
5022
  // .build/modules/index.mjs
4695
5023
  var mounted = /* @__PURE__ */ new WeakMap();
@@ -1 +1 @@
1
- [data-dance-moves-start-interval]:not([data-dance-moves-started=true]),[data-dance-moves-start-interval]:not([data-dance-moves-started=true]):before,[data-dance-moves-start-interval]:not([data-dance-moves-started=true]):after{animation-play-state:paused!important}html[data-dance-moves-shared-controls=true] .ks-epk .epk-button,html[data-dance-moves-shared-controls=true] .ks-epk .epk-download{transition-property:background-color,color,transform,border-color!important;transition-duration:var(--dance-moves-shared-control-duration)!important;transition-timing-function:ease!important}.ks-epk .ks-epk-lyrics-track summary span[aria-hidden]{transition-property:transform!important;transition-duration:var(--dance-moves-lyric-disclosure-duration)!important;transition-timing-function:ease!important}.dance-moves-lyric-popover{--dance-moves-lyric-bg: rgba(20, 20, 24, .94);--dance-moves-lyric-border: rgba(255, 255, 255, .28);--dance-moves-lyric-color: #fff;position:fixed;z-index:9998;inset-inline:max(1rem,env(safe-area-inset-left)) max(1rem,env(safe-area-inset-right));bottom:max(1rem,env(safe-area-inset-bottom));display:flex;justify-content:center;pointer-events:none;opacity:0;transform:translateY(.75rem) scale(.98);transition:opacity var(--dance-moves-6t) ease,transform var(--dance-moves-6t) ease}.dance-moves-lyric-popover[data-dance-moves-lyric-state=active]{opacity:1;transform:translateY(0) scale(1)}.dance-moves-lyric-popover__text{display:block;max-width:min(44rem,100%);padding:.72rem 1rem;border:1px solid var(--dance-moves-lyric-border);border-radius:.75rem;background:var(--dance-moves-lyric-bg);color:var(--dance-moves-lyric-color);box-shadow:0 .6rem 1.8rem #00000052;font:700 clamp(1rem,2.4vw,1.35rem)/1.3 system-ui,sans-serif;text-align:center;text-wrap:balance}.dance-moves-lyric-popover[data-dance-moves-lyric-pulse=true] .dance-moves-lyric-popover__text{animation:dance-moves-lyric-arrive var(--dance-moves-6t) ease both}@keyframes dance-moves-lyric-arrive{0%{transform:translateY(.4rem) scale(.98)}to{transform:translateY(0) scale(1)}}@media(forced-colors:active){.dance-moves-lyric-popover__text{border:2px solid CanvasText;background:Canvas;color:CanvasText;box-shadow:none}}@media(prefers-reduced-motion:reduce){[data-dance-moves-start-interval],[data-dance-moves-start-interval]:before,[data-dance-moves-start-interval]:after{animation:none!important;transition-duration:.01ms!important}html[data-dance-moves-shared-controls=true] .ks-epk .epk-button,html[data-dance-moves-shared-controls=true] .ks-epk .epk-download,.ks-epk .ks-epk-lyrics-track summary span[aria-hidden]{transition:none!important}.dance-moves-lyric-popover,.dance-moves-lyric-popover__text{animation:none!important;transition:none!important;transform:none!important}}
1
+ [data-dance-moves-start-interval]:not([data-dance-moves-started=true]),[data-dance-moves-start-interval]:not([data-dance-moves-started=true]):before,[data-dance-moves-start-interval]:not([data-dance-moves-started=true]):after{animation-play-state:paused!important}html[data-dance-moves-shared-controls=true] .ks-epk .epk-button,html[data-dance-moves-shared-controls=true] .ks-epk .epk-download{transition-property:background-color,color,transform,border-color!important;transition-duration:var(--dance-moves-shared-control-duration)!important;transition-timing-function:ease!important}.ks-epk .ks-epk-lyrics-track summary span[aria-hidden]{transition-property:transform!important;transition-duration:var(--dance-moves-lyric-disclosure-duration)!important;transition-timing-function:ease!important}.dance-moves-lyric-popover{--dance-moves-lyric-bg: rgba(20, 20, 24, .94);--dance-moves-lyric-border: rgba(255, 255, 255, .28);--dance-moves-lyric-color: #fff;position:fixed;z-index:9998;inset-inline:max(1rem,env(safe-area-inset-left)) max(1rem,env(safe-area-inset-right));bottom:max(1rem,env(safe-area-inset-bottom));display:flex;justify-content:center;pointer-events:none;opacity:0;transform:translateY(.75rem) scale(.98);transition:opacity var(--dance-moves-6t) ease,transform var(--dance-moves-6t) ease}.dance-moves-lyric-popover[data-dance-moves-lyric-state=active]{opacity:1;transform:translateY(0) scale(1)}.dance-moves-lyric-popover__text{display:block;max-width:min(44rem,100%);padding:.72rem 1rem;border:1px solid var(--dance-moves-lyric-border);border-radius:.75rem;background:var(--dance-moves-lyric-bg);color:var(--dance-moves-lyric-color);box-shadow:0 .6rem 1.8rem #00000052;font:700 clamp(1rem,2.4vw,1.35rem)/1.3 system-ui,sans-serif;text-align:center;text-wrap:balance}.dance-moves-lyric-popover[data-dance-moves-lyric-pulse=true] .dance-moves-lyric-popover__text{animation:dance-moves-lyric-arrive var(--dance-moves-6t) ease both}.dance-moves-lyric-popover[data-dance-moves-lyric-stage=ready]{--dance-moves-lyric-stage-step: 4.75rem;--dance-moves-lyric-progress: 0;overflow:hidden;height:calc(var(--dance-moves-lyric-stage-step) * 3);align-items:stretch}.dance-moves-lyric-stage__viewport{width:min(48rem,100%);height:100%;overflow:hidden}.dance-moves-lyric-stage__track{display:grid;grid-template-rows:repeat(3,var(--dance-moves-lyric-stage-step));transform:translate3d(0,calc(var(--dance-moves-lyric-progress) * var(--dance-moves-lyric-stage-step) * -1),0);will-change:transform}.dance-moves-lyric-stage__line{display:grid;place-items:center;min-width:0;padding:.4rem 1rem;color:var(--dance-moves-lyric-color);font:650 clamp(.92rem,2.2vw,1.22rem)/1.25 system-ui,sans-serif;text-align:center;text-wrap:balance;opacity:.58}.dance-moves-lyric-stage__line--current{opacity:1}.dance-moves-lyric-popover[data-dance-moves-lyric-stage=ready] .dance-moves-lyric-popover__text{max-width:none;padding:.4rem 1rem;border:0;border-radius:0;background:transparent;box-shadow:none;animation:none}.dance-moves-lyric-popover[data-dance-moves-lyric-stage=ready][data-dance-moves-lyric-phase=waiting] .dance-moves-lyric-stage__track{will-change:auto}@keyframes dance-moves-lyric-arrive{0%{transform:translateY(.4rem) scale(.98)}to{transform:translateY(0) scale(1)}}@media(forced-colors:active){.dance-moves-lyric-popover__text{border:2px solid CanvasText;background:Canvas;color:CanvasText;box-shadow:none}}@media(prefers-reduced-motion:reduce){[data-dance-moves-start-interval],[data-dance-moves-start-interval]:before,[data-dance-moves-start-interval]:after{animation:none!important;transition-duration:.01ms!important}html[data-dance-moves-shared-controls=true] .ks-epk .epk-button,html[data-dance-moves-shared-controls=true] .ks-epk .epk-download,.ks-epk .ks-epk-lyrics-track summary span[aria-hidden]{transition:none!important}.dance-moves-lyric-popover,.dance-moves-lyric-popover__text,.dance-moves-lyric-stage__track{animation:none!important;transition:none!important;transform:none!important}}