/* 디제틱 미세 애니 v2 — 씬의 키 라이트가 만든 것만 움직인다 (CANON-3 §3).
 *
 * 왜 CSS 인가
 * -----------
 * 기존 움직임은 `E-*.webp` 를 WebGL 워프로 흔드는 방식이었고, 그 요소들은 **옛 그림에서**
 * 오려낸 것이라 새 배경 위에서는 남의 물건이다(설치 때 `_bgv2-retired-*` 로 뺐다).
 * 새 그림은 광원을 그림 안에 그려서 왔으므로, 움직여야 하는 것은 **그 광원의 숨**이다.
 *
 * 규율 (전부 실측 근거)
 * - `transform` · `opacity` 만 쓴다. 프레임마다 `filter`/`backdrop-filter` 를 바꾸지 않는다
 *   (iOS Safari 프레임 낙차). SVG 필터 애니 금지 — traps #2.
 * - 주기 2.4s 이상(불꽃만 1.4s), 진폭은 화면 대각의 1.5% 이하. "봤다"가 아니라 "숨쉰다".
 * - 깊이가 둘이면 **원경이 더 느리고 진폭이 작다**(steam-spaceunbound-1 실측).
 * - `prefers-reduced-motion: reduce` 에서 이동·흔들림은 정지. 밝기 호흡은 산다.
 * - 좌표는 **390x844 실기 프레임에서 눈으로 잡은 뷰포트 비율**이다.
 *   배경은 `object-fit: cover` 라 plate 좌우 각 15.3%가 잘린다 — plate 좌표를 그대로 쓰면 어긋난다.
 */

#diegetic {
  position: absolute;
  inset: 0;
  z-index: 7;              /* 배경 광원층(6) 위, 인물(9) 아래 */
  pointer-events: none;
  overflow: hidden;
}

/* 비 — 뒤(가늘고 느림)는 디제틱 안(z7), 앞(굵고 빠름)은 인물·CG 위(z10).
   CG 판이 불투명하면 z7 은 가려지므로, 가는 비는 앞 캔버스에도 한 겹 더 그린다.
   앞 층의 z 10: 인물 무대(9)·CG(8) 위, 대사창(12~20) 아래.
   인물을 어둡게 만들지 않는다. screen 은 달빛을 받은 빗줄기만 더한다. */
#diegetic .dg-rain-back {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  display: none;
  pointer-events: none;
  mix-blend-mode: screen;
}
#diegetic-rain-front {
  position: absolute;
  inset: 0;
  z-index: 10;
  width: 100%;
  height: 100%;
  display: none;
  pointer-events: none;
  mix-blend-mode: screen;
}
.game[data-background="joseon-rainy-forest"] #diegetic .dg-rain-back,
.game[data-background="joseon-rainy-forest"] #diegetic-rain-front { display: block; }

/* 이 배경의 옛 비 두 겹을 끈다. 고치는 파일이 여기뿐이라 선택자로만 덮는다.
   1) CG rain-overlay — 인물 판 위에 한 장이 통째로 미끄러진다(xAmp ~.22).
      빗줄기가 사람을 피해 옆으로 지나가는 합성 티의 원인.
   2) felt .rain-veil — c3-rescue #5 겉옷 탭이 민의 몸통을 비껴 가도록 짠 비.
      하객 눈에는 「이 사람이 비를 뚫고 왔다」가 아니라 「비만 사람을 피해 간다」. */
.game[data-background="joseon-rainy-forest"] .cg-motion-layer[data-motion-role="rescue-rain-overlay"],
.game[data-background="joseon-rainy-forest"] .cg-motion-layer[data-motion-role="rainy-forest-rain-overlay"] {
  /* ambient-loop 가 opacity 를 inline !important 로 쓴다. visibility 로만 덮는다. */
  visibility: hidden;
}
.game[data-background="joseon-rainy-forest"] .rain-veil { visibility: hidden; }
#diegetic i {
  position: absolute;
  display: none;
  inset: 0;
  will-change: transform, opacity;
  mix-blend-mode: screen;
}
/* 그림자 계열은 덧칠이 아니라 어둡히는 것이라 blend 를 바꾼다. */
#diegetic i.is-shade { mix-blend-mode: multiply; }

/* 켜지는 씬에서만 표시된다. 선언은 `data-background`(엔진이 씬마다 넣는 배경 키) 기준. */
.game[data-background] #diegetic i.is-on { display: block; }

/* ─────────────────────────── 공통 키프레임 ─────────────────────────── */
@keyframes dgBreathe   { 0%, 100% { opacity: var(--dg-lo, .55); } 50% { opacity: var(--dg-hi, 1); } }
@keyframes dgPulse     { 0%, 100% { opacity: var(--dg-lo, .7); transform: scale(1); }
                         50%      { opacity: var(--dg-hi, 1);  transform: scale(var(--dg-scale, 1.05)); } }
@keyframes dgFlame     { 0%, 100% { opacity: .78; transform: scale(1, 1) translateX(0); }
                         38%      { opacity: 1;   transform: scale(1.04, 1.12) translateX(2px); }
                         71%      { opacity: .88; transform: scale(.98, 1.06) translateX(-2px); } }
@keyframes dgRise      { from { transform: translateY(10px); opacity: 0; }
                         22%  { opacity: var(--dg-hi, .5); }
                         to   { transform: translateY(-14px); opacity: 0; } }
@keyframes dgSway      { 0%, 100% { transform: translateX(-4px) rotate(-.35deg); }
                         50%      { transform: translateX(4px) rotate(.35deg); } }
@keyframes dgFlutter   { 0%, 100% { transform: rotate(-1.2deg); }
                         50%      { transform: rotate(1.2deg); } }
@keyframes dgDrift     { from { transform: translateX(-14px); } to { transform: translateX(14px); } }
@keyframes dgBlink     { 0%, 88%, 100% { opacity: 1; } 91%, 95% { opacity: 0; } }
@keyframes dgSeam      { 0%, 100% { transform: scaleX(1); opacity: .82; }
                         50%      { transform: scaleX(1.06); opacity: 1; } }

/* ───────────────────── 1. modern-cafe — 창빛과 먼지 ───────────────────── */
.game[data-background="modern-cafe"] #diegetic i.dg-a {
  display: block;
  background: radial-gradient(46% 34% at 9% 19%, rgba(255, 214, 150, .30), transparent 68%);
  animation: dgBreathe 6.2s ease-in-out infinite; --dg-lo: .62; --dg-hi: 1;
}
.game[data-background="modern-cafe"] #diegetic i.dg-b {
  display: block;
  background:
    radial-gradient(1.6px 1.6px at 14% 30%, rgba(255, 236, 200, .85), transparent 60%),
    radial-gradient(1.4px 1.4px at 23% 46%, rgba(255, 236, 200, .70), transparent 60%),
    radial-gradient(1.8px 1.8px at 9% 58%, rgba(255, 236, 200, .60), transparent 60%),
    radial-gradient(1.3px 1.3px at 27% 22%, rgba(255, 236, 200, .55), transparent 60%);
  animation: dgRise 14s linear infinite; --dg-hi: .55;
}

/* ─────────────── 2. modern-jongno-jewelry — 쇼윈도와 가로등 ─────────────── */
.game[data-background="modern-jongno-jewelry"] #diegetic i.dg-a {
  display: block;
  background: radial-gradient(40% 26% at 79% 31%, rgba(255, 196, 108, .34), transparent 66%);
  animation: dgBreathe 4.6s ease-in-out infinite; --dg-lo: .72; --dg-hi: 1;
}
.game[data-background="modern-jongno-jewelry"] #diegetic i.dg-b {
  display: block;
  background: radial-gradient(16% 11% at 11% 9%, rgba(255, 224, 168, .40), transparent 70%);
  animation: dgPulse 7.5s ease-in-out infinite; --dg-lo: .66; --dg-hi: 1; --dg-scale: 1.05;
}

/* ─────────────── 3. joseon-room — 창호지 빛과 나뭇가지 그림자 ─────────────── */
.game[data-background="joseon-room"] #diegetic i.dg-a {
  display: block;
  background: radial-gradient(42% 30% at 13% 23%, rgba(255, 226, 168, .26), transparent 70%);
  animation: dgBreathe 8s ease-in-out infinite; --dg-lo: .66; --dg-hi: 1;
}
.game[data-background="joseon-room"] #diegetic i.dg-b {
  display: block;
  background:
    radial-gradient(9% 5% at 10% 16%, rgba(58, 52, 44, .40), transparent 72%),
    radial-gradient(7% 4% at 20% 27%, rgba(58, 52, 44, .34), transparent 72%),
    radial-gradient(6% 6% at 6% 34%, rgba(58, 52, 44, .30), transparent 72%);
  animation: dgSway 5.8s ease-in-out infinite;
}
.game[data-background="joseon-room"] #diegetic i.dg-b { mix-blend-mode: multiply; }

/* ─────────────── 4. joseon-street — 역광 속 먼지와 안개의 숨 ─────────────── */
.game[data-background="joseon-street"] #diegetic i.dg-a {
  display: block;
  background: radial-gradient(38% 26% at 52% 21%, rgba(255, 230, 186, .24), transparent 70%);
  animation: dgBreathe 9s ease-in-out infinite; --dg-lo: .70; --dg-hi: 1;
}
.game[data-background="joseon-street"] #diegetic i.dg-b {
  display: block;
  background:
    radial-gradient(1.7px 1.7px at 44% 34%, rgba(255, 238, 206, .70), transparent 60%),
    radial-gradient(1.4px 1.4px at 58% 27%, rgba(255, 238, 206, .60), transparent 60%),
    radial-gradient(1.9px 1.9px at 50% 45%, rgba(255, 238, 206, .52), transparent 60%),
    radial-gradient(1.3px 1.3px at 63% 39%, rgba(255, 238, 206, .48), transparent 60%);
  animation: dgRise 16s linear infinite; --dg-hi: .5;   /* 원경이라 느리게 */
}

/* ───────────── 5. joseon-wall-night-road — 호롱불과 달 ───────────── */
.game[data-background="joseon-wall-night-road"] #diegetic i.dg-a {
  display: block;
  background: radial-gradient(11% 7% at 62% 20%, rgba(255, 176, 92, .48), transparent 68%);
  animation: dgFlame 2.6s ease-in-out infinite;
}
.game[data-background="joseon-wall-night-road"] #diegetic i.dg-b {
  display: block;
  background: radial-gradient(20% 13% at 84% 9%, rgba(176, 206, 255, .26), transparent 70%);
  animation: dgPulse 11s ease-in-out infinite; --dg-lo: .72; --dg-hi: 1; --dg-scale: 1.03;
}

/* ───────────── 6. joseon-rainy-forest — 짐승의 눈과 물웅덩이 ───────────── */
.game[data-background="joseon-rainy-forest"] #diegetic i.dg-a {
  display: block;
  background:
    radial-gradient(2.6px 2.2px at 9.0% 37%, rgba(210, 226, 128, .95), transparent 62%),
    radial-gradient(2.6px 2.2px at 11.4% 37.4%, rgba(210, 226, 128, .95), transparent 62%);
  animation: dgBlink 7.3s steps(1, end) infinite;
}
.game[data-background="joseon-rainy-forest"] #diegetic i.dg-b {
  display: block;
  background:
    radial-gradient(24% 7% at 56% 73%, rgba(158, 186, 224, .42), transparent 72%),
    radial-gradient(14% 4% at 40% 84%, rgba(158, 186, 224, .30), transparent 72%);
  animation: dgBreathe 3.1s ease-in-out infinite; --dg-lo: .22; --dg-hi: 1;
}

/* ───────────── 7. joseon-cave — 모닥불과 그 불에 반응하는 벽 ─────────────
   ⚠ dg-b 가 이 회전에서 가장 중요한 애니다. 벽이 불에 반응하지 않으면 불은 계속 스티커다.
      두 주기를 일부러 어긋내(1.4s / 1.9s) 동기화돼 보이지 않게 한다. */
.game[data-background="joseon-cave"] #diegetic i.dg-a {
  display: block;
  background: radial-gradient(13% 9% at 14% 70%, rgba(255, 158, 74, .52), transparent 66%);
  animation: dgFlame 1.4s ease-in-out infinite;
}
.game[data-background="joseon-cave"] #diegetic i.dg-b {
  display: block;
  background: radial-gradient(52% 40% at 52% 44%, rgba(236, 146, 74, .20), transparent 70%);
  animation: dgPulse 1.9s ease-in-out infinite; --dg-lo: .70; --dg-hi: 1; --dg-scale: 1.02;
}

/* ───────────── 8. joseon-cave-morning — 꺼진 화덕의 잔연기와 입구빛 먼지 ───────────── */
.game[data-background="joseon-cave-morning"] #diegetic i.dg-a {
  display: block;
  background: radial-gradient(4% 12% at 17% 64%, rgba(226, 226, 220, .22), transparent 72%);
  animation: dgRise 9s ease-in-out infinite; --dg-hi: .6;
}
.game[data-background="joseon-cave-morning"] #diegetic i.dg-b {
  display: block;
  background:
    radial-gradient(1.7px 1.7px at 33% 40%, rgba(255, 240, 214, .70), transparent 60%),
    radial-gradient(1.4px 1.4px at 42% 52%, rgba(255, 240, 214, .60), transparent 60%),
    radial-gradient(1.9px 1.9px at 28% 58%, rgba(255, 240, 214, .52), transparent 60%);
  animation: dgRise 13s linear infinite; --dg-hi: .5;
}

/* ───────────── 9. joseon-misty-river-boat — 깨진 달빛과 안개 ───────────── */
.game[data-background="joseon-misty-river-boat"] #diegetic i.dg-a {
  display: block;
  background:
    radial-gradient(7px 2.4px at 66% 46%, rgba(232, 242, 255, .95), transparent 62%),
    radial-gradient(9px 2.6px at 62% 54%, rgba(232, 242, 255, .88), transparent 62%),
    radial-gradient(6px 2.2px at 71% 61%, rgba(232, 242, 255, .82), transparent 62%),
    radial-gradient(10px 3px at 65% 68%, rgba(232, 242, 255, .74), transparent 62%),
    radial-gradient(8px 2.4px at 68% 76%, rgba(232, 242, 255, .62), transparent 62%);
  animation: dgBreathe 5.2s ease-in-out infinite; --dg-lo: .34; --dg-hi: 1;
}
.game[data-background="joseon-misty-river-boat"] #diegetic i.dg-b {
  display: block;
  background: linear-gradient(180deg, transparent 26%, rgba(196, 214, 236, .13) 33%, transparent 44%);
  animation: dgDrift 22s ease-in-out infinite alternate;   /* 원경 — 가장 느리다 */
}

/* ───────────── 10. joseon-market-workshop — 숯불과 문빛 먼지 ───────────── */
.game[data-background="joseon-market-workshop"] #diegetic i.dg-a {
  display: block;
  background: radial-gradient(12% 8% at 12% 62%, rgba(255, 168, 82, .44), transparent 66%);
  animation: dgFlame 2.2s ease-in-out infinite;
}
.game[data-background="joseon-market-workshop"] #diegetic i.dg-b {
  display: block;
  background:
    radial-gradient(1.8px 1.8px at 68% 34%, rgba(255, 244, 218, .72), transparent 60%),
    radial-gradient(1.5px 1.5px at 76% 46%, rgba(255, 244, 218, .60), transparent 60%),
    radial-gradient(2.0px 2.0px at 71% 55%, rgba(255, 244, 218, .52), transparent 60%);
  animation: dgRise 15s linear infinite; --dg-hi: .55;
}

/* ───────────── 11. joseon-gate — 문틈의 흰빛과 청홍 천 ─────────────
   `joseon-gate` 와 `joseon-traditional-wedding` 은 같은 대문 그림을 쓴다. */
.game[data-background="joseon-gate"] #diegetic i.dg-a,
.game[data-background="joseon-traditional-wedding"] #diegetic i.dg-a {
  display: block;
  background: linear-gradient(90deg, transparent 47.5%, rgba(255, 246, 224, .30) 50%, transparent 52.5%);
  transform-origin: 50% 50%;
  animation: dgSeam 5.5s ease-in-out infinite;
}
.game[data-background="joseon-gate"] #diegetic i.dg-b,
.game[data-background="joseon-traditional-wedding"] #diegetic i.dg-b {
  display: block;
  background: radial-gradient(5% 14% at 22% 26%, rgba(226, 96, 96, .22), transparent 70%);
  transform-origin: 22% 12%;
  animation: dgFlutter 3.8s ease-in-out infinite;
}

/* ───────────── 12. modern-wedding-interior — 촛불 둘과 안쪽 창 ───────────── */
.game[data-background="modern-wedding-interior"] #diegetic i.dg-a {
  display: block;
  background:
    radial-gradient(4% 3% at 12% 79%, rgba(255, 196, 118, .55), transparent 66%),
    radial-gradient(4% 3% at 88% 75%, rgba(255, 196, 118, .48), transparent 66%);
  animation: dgFlame 2.8s ease-in-out infinite;
}
.game[data-background="modern-wedding-interior"] #diegetic i.dg-b {
  display: block;
  background: radial-gradient(34% 26% at 80% 29%, rgba(255, 238, 208, .24), transparent 70%);
  animation: dgBreathe 9s ease-in-out infinite; --dg-lo: .76; --dg-hi: 1;
}

/* ───────────── 13. modern-cheonggyecheon — 수면 반짝임과 벽등 ───────────── */
.game[data-background="modern-cheonggyecheon"] #diegetic i.dg-a {
  display: block;
  background:
    radial-gradient(22% 6% at 28% 58%, rgba(168, 214, 255, .36), transparent 72%),
    radial-gradient(16% 4% at 22% 72%, rgba(168, 214, 255, .26), transparent 72%);
  animation: dgBreathe 4.8s ease-in-out infinite; --dg-lo: .28; --dg-hi: 1;
}
.game[data-background="modern-cheonggyecheon"] #diegetic i.dg-b {
  display: block;
  background: radial-gradient(9% 6% at 72% 34%, rgba(255, 236, 198, .34), transparent 68%);
  animation: dgPulse 7.2s ease-in-out infinite; --dg-lo: .70; --dg-hi: 1; --dg-scale: 1.04;
}

/* ───────────── 14. modern-boat-night — 강 반짝임과 원경 창빛 ───────────── */
.game[data-background="modern-boat-night"] #diegetic i.dg-a {
  display: block;
  background:
    radial-gradient(8px 2.4px at 68% 42%, rgba(196, 220, 255, .72), transparent 62%),
    radial-gradient(10px 2.6px at 74% 50%, rgba(196, 220, 255, .58), transparent 62%),
    radial-gradient(7px 2.2px at 62% 56%, rgba(196, 220, 255, .48), transparent 62%);
  animation: dgBreathe 5.6s ease-in-out infinite; --dg-lo: .32; --dg-hi: 1;
}
.game[data-background="modern-boat-night"] #diegetic i.dg-b {
  display: block;
  background:
    radial-gradient(18% 10% at 58% 18%, rgba(176, 206, 255, .22), transparent 70%),
    radial-gradient(6% 4% at 12% 28%, rgba(255, 220, 160, .36), transparent 68%);
  animation: dgPulse 9.5s ease-in-out infinite; --dg-lo: .68; --dg-hi: 1; --dg-scale: 1.03;
}

/* ───────────── 15. modern-invitation-prep — 스탠드 등불과 창 밖 도시 ───────────── */
.game[data-background="modern-invitation-prep"] #diegetic i.dg-a {
  display: block;
  background: radial-gradient(14% 10% at 78% 36%, rgba(255, 214, 150, .42), transparent 66%);
  animation: dgBreathe 5.4s ease-in-out infinite; --dg-lo: .68; --dg-hi: 1;
}
.game[data-background="modern-invitation-prep"] #diegetic i.dg-b {
  display: block;
  background:
    radial-gradient(8% 12% at 7% 18%, rgba(160, 190, 255, .22), transparent 70%),
    radial-gradient(1.5px 1.5px at 5% 22%, rgba(255, 230, 170, .70), transparent 60%),
    radial-gradient(1.3px 1.3px at 9% 28%, rgba(255, 230, 170, .55), transparent 60%);
  animation: dgBlink 11s steps(1, end) infinite;
}

/* ───────────── 16. joseon-hanseong-stream — 석등불과 수면 달빛 ───────────── */
.game[data-background="joseon-hanseong-stream"] #diegetic i.dg-a {
  display: block;
  background: radial-gradient(10% 7% at 22% 44%, rgba(255, 188, 96, .48), transparent 66%);
  animation: dgFlame 2.4s ease-in-out infinite;
}
.game[data-background="joseon-hanseong-stream"] #diegetic i.dg-b {
  display: block;
  background:
    radial-gradient(9px 2.6px at 48% 48%, rgba(176, 214, 236, .78), transparent 62%),
    radial-gradient(11px 2.8px at 56% 56%, rgba(176, 214, 236, .64), transparent 62%),
    radial-gradient(8px 2.4px at 44% 62%, rgba(176, 214, 236, .52), transparent 62%);
  animation: dgBreathe 4.6s ease-in-out infinite; --dg-lo: .30; --dg-hi: 1;
}

/* ───────────── 17. modern-memory-montage — 무너짐 직후, 먼지 한 줌만 ─────────────
   긴장 장면. 광원 애니 최소 — 먼지 상승 한 층 + 아주 옅은 창빛 호흡. */
.game[data-background="modern-memory-montage"] #diegetic i.dg-a {
  display: block;
  background: radial-gradient(28% 18% at 18% 22%, rgba(255, 244, 228, .14), transparent 72%);
  animation: dgBreathe 12s ease-in-out infinite; --dg-lo: .78; --dg-hi: 1;
}
.game[data-background="modern-memory-montage"] #diegetic i.dg-b {
  display: block;
  background:
    radial-gradient(1.4px 1.4px at 42% 48%, rgba(255, 240, 220, .42), transparent 60%),
    radial-gradient(1.2px 1.2px at 58% 56%, rgba(255, 240, 220, .34), transparent 60%),
    radial-gradient(1.5px 1.5px at 50% 64%, rgba(255, 240, 220, .28), transparent 60%);
  animation: dgRise 18s linear infinite; --dg-hi: .35;
}

/* ───────────── 18. modern-wedding-entrance — 홀 안쪽 온광과 창빛 ───────────── */
.game[data-background="modern-wedding-entrance"] #diegetic i.dg-a {
  display: block;
  background: radial-gradient(36% 28% at 58% 38%, rgba(255, 228, 186, .28), transparent 70%);
  animation: dgBreathe 7.5s ease-in-out infinite; --dg-lo: .72; --dg-hi: 1;
}
.game[data-background="modern-wedding-entrance"] #diegetic i.dg-b {
  display: block;
  background: radial-gradient(18% 16% at 78% 42%, rgba(255, 240, 210, .26), transparent 70%);
  animation: dgPulse 10s ease-in-out infinite; --dg-lo: .74; --dg-hi: 1; --dg-scale: 1.03;
}

/* ───────────── 19. joseon-large-house — 문등불과 청홍 천막 ───────────── */
.game[data-background="joseon-large-house"] #diegetic i.dg-a {
  display: block;
  background:
    radial-gradient(8% 6% at 86% 36%, rgba(255, 214, 150, .38), transparent 68%),
    radial-gradient(22% 18% at 62% 48%, rgba(255, 236, 200, .16), transparent 72%);
  animation: dgBreathe 6.8s ease-in-out infinite; --dg-lo: .70; --dg-hi: 1;
}
.game[data-background="joseon-large-house"] #diegetic i.dg-b {
  display: block;
  background: radial-gradient(8% 5% at 78% 18%, rgba(72, 96, 196, .24), transparent 70%);
  transform-origin: 78% 12%;
  animation: dgFlutter 4.2s ease-in-out infinite;
}

/* reduce: 이동(rise/sway/flutter/drift)만 죽인다. 불·창빛 호흡(opacity)은 산다.
   비는 이동이라 JS 가 빗줄기를 그 자리에 얼린다. 젖은 웅덩이(dg-b 호흡)는 산다 —
   「비 오는 밤」은 보여야 하고, 흘러내리는 것만 끈다.
   키프레임을 미디어 안에서 다시 쓰면 그 미디어에서만 치환된다. */
@media (prefers-reduced-motion: reduce) {
  @keyframes dgPulse {
    0%, 100% { opacity: var(--dg-lo, .7); }
    50% { opacity: var(--dg-hi, 1); }
  }
  @keyframes dgFlame {
    0%, 100% { opacity: .68; }
    38% { opacity: 1; }
    71% { opacity: .80; }
  }
  @keyframes dgSeam {
    0%, 100% { opacity: .78; }
    50% { opacity: 1; }
  }
  @keyframes dgRise {
    from, to { transform: none; opacity: var(--dg-hi, .35); }
  }
  @keyframes dgSway {
    from, to { transform: none; }
  }
  @keyframes dgFlutter {
    from, to { transform: none; }
  }
  @keyframes dgDrift {
    from, to { transform: none; }
  }
}
/* 저전력은 워프/시차를 아끼는 자리이지 광원을 끄는 자리가 아니다. 호흡은 남긴다. */
.game.is-low-power #diegetic i {
  --dg-scale: 1;
}
