/* ═══════════════════════════════════════════════════════
   GT Atmosphere Library · v1
   Composable scene layers for any GT course
   Locked 2026-04-18 · see memory/feedback_atmosphere_principles.md
   ═══════════════════════════════════════════════════════

   The three rules:
   1. Static > motion. Default is motionless. Motion is rare + long-cycle.
   2. Sparingly > everywhere. Particles on hero/quote/closing only.
   3. Barely there > noticeable. Opacity 0.04-0.10 baseline.

   Usage:
     Include this CSS. On your stage/scene container, add combinations:
     <div class="stage atm-orbs atm-grain atm-ghost">

     Layers must be inserted as children inside the stage:
     <div class="layer-orbs"><div class="orb"></div>...</div>
     <div class="layer-ghost"></div>
     etc.

   Prefer atmosphere-presets from talpek-moments.css or course.css for
   curated compositions (summit, quiet, editorial, focus, live, moment).
   ═══════════════════════════════════════════════════════ */

:root {
  --atm-cream: #f4f1e8;
  --atm-accent-1: #a8c4b4;
  --atm-accent-2: #3e7361;
  --atm-violet: #8b80ff;
  --atm-cool: #6b8eae;
  --atm-warm: #d4a463;
}

/* Standard container for the atmosphere — fixed-position, full viewport,
   sits behind stage content but above body background. */
.stage-atmosphere {
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  overflow: hidden;
}

/* Ensure .stage (main content area) stacks above the atmosphere layers.
   Other chrome (topbar, bottom-nav, drawer, settings-panel, scrim) already
   have their own positioning rules in course.css — do NOT override those,
   or fixed-position panels will collapse inline and lose their overlay behavior. */
.stage {
  position: relative;
  z-index: 5;
}

/* On desktop, widen the stage-inner for Talpek Moment slides so the signal
   card + flow fan don't wrap to multiple rows. The phone-first 480px cap is
   right for content slides but cramped for Moment layouts that need horizontal
   breathing room (Learner → Talpek → Warehouse → three stakeholders). */
@media (min-width: 820px) {
  .stage-inner:has(> .tm) {
    max-width: 920px;
  }
}

/* ───── Effect 1: Soft orbs (STATIC) ───── */
.layer-orbs {
  position: absolute; inset: 0;
  pointer-events: none; z-index: 1;
  opacity: 0;
  transition: opacity 0.6s ease;
}
.atm-orbs .layer-orbs { opacity: 1; }
.layer-orbs .orb {
  position: absolute;
  width: 560px; height: 560px;
  border-radius: 50%;
  filter: blur(100px);
}
.layer-orbs .orb:nth-child(1) { background: var(--atm-accent-2); top: -12%; left: -12%; opacity: 0.05; }
.layer-orbs .orb:nth-child(2) { background: var(--atm-accent-1); bottom: -16%; right: -12%; opacity: 0.05; }
.layer-orbs .orb:nth-child(3) { background: var(--atm-violet); top: 40%; right: 20%; opacity: 0.03; }

/* ───── Effect 2: Film grain (STATIC) ─────
   Applied to <body> so its pseudo-element escapes any stacking context
   created by .stage-atmosphere and truly overlays all content. */
body.atm-grain::before {
  content: '';
  position: fixed; inset: 0;
  pointer-events: none;
  z-index: 9999;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 200 200'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.92' numOctaves='3' stitchTiles='stitch'/><feColorMatrix type='matrix' values='0 0 0 0 1  0 0 0 0 1  0 0 0 0 1  0 0 0 0.65 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>");
  background-size: 200px 200px;
  opacity: 0.05;
  mix-blend-mode: overlay;
}

/* ───── Effect 3: Ambient dust (SPARING · MOTION) ───── */
.layer-dust {
  position: absolute; inset: 0;
  pointer-events: none; z-index: 2;
  opacity: 0;
  transition: opacity 0.6s ease;
  overflow: hidden;
}
.atm-dust .layer-dust { opacity: 1; }
.layer-dust .mote {
  position: absolute;
  width: 2px; height: 2px;
  border-radius: 50%;
  background: var(--atm-cream);
  opacity: 0;
  box-shadow: 0 0 4px rgba(244, 241, 232, 0.6);
  animation: atm-dust-float linear infinite;
}
@keyframes atm-dust-float {
  0% { transform: translateY(105vh) translateX(0); opacity: 0; }
  5%, 95% { opacity: 0.4; }
  100% { transform: translateY(-5vh) translateX(40px); opacity: 0; }
}

/* ───── Effect 4: Vignette (STATIC) ───── */
.layer-vignette {
  position: absolute; inset: 0;
  pointer-events: none; z-index: 3;
  opacity: 0;
  background: radial-gradient(ellipse at center, transparent 40%, rgba(0, 0, 0, 0.55) 100%);
  transition: opacity 0.6s ease;
}
.atm-vignette .layer-vignette { opacity: 0.85; }

/* ───── Effect 5: Ghost imagery (STATIC) ───── */
.layer-ghost {
  position: absolute; inset: 0;
  pointer-events: none; z-index: 1;
  opacity: 0;
  transition: opacity 0.8s ease;
  background-size: cover;
  background-position: center;
  filter: grayscale(1) blur(3px) brightness(0.6) contrast(1.1);
  mix-blend-mode: screen;
}
.atm-ghost .layer-ghost { opacity: 0.10; }

/* Hero-slide ghost: 12 individual mountains — solid gray fills, balanced
   directional leans (left/centered/right), varied profiles (domes, rolling,
   asymmetric, double-summits). Distinct gray per mountain = clean edges
   where they overlap, no see-through. */
[data-ghost="summit"] .layer-ghost {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 900' preserveAspectRatio='xMidYMid slice'><defs><linearGradient id='sky' x1='0' y1='0' x2='0' y2='1'><stop offset='0%25' stop-color='%23a8c4b4' stop-opacity='0.6'/><stop offset='100%25' stop-color='%23ffffff' stop-opacity='0'/></linearGradient></defs><rect width='100%25' height='100%25' fill='url(%23sky)'/><polygon fill='rgb(55,55,55)' points='50,900 130,680 210,560 270,460 310,400 350,385 390,400 440,450 530,580 640,720 760,850 800,900'/><polygon fill='rgb(45,45,45)' points='500,900 620,600 740,420 820,280 870,220 925,180 980,220 1030,280 1110,420 1230,600 1350,900'/><polygon fill='rgb(70,70,70)' points='1020,900 1200,700 1340,550 1460,400 1570,310 1700,900'/><polygon fill='rgb(110,110,110)' points='-100,900 -20,740 60,620 140,560 200,580 280,660 370,780 540,900'/><polygon fill='rgb(95,95,95)' points='320,900 450,680 560,520 600,480 640,500 750,670 880,900'/><polygon fill='rgb(120,120,120)' points='780,900 900,620 980,530 1040,560 1100,500 1170,550 1250,650 1330,900'/><polygon fill='rgb(100,100,100)' points='1200,900 1260,720 1330,580 1380,470 1450,520 1530,620 1630,780 1700,900'/><polygon fill='rgb(200,200,200)' points='-120,900 -30,770 60,740 140,720 220,710 300,720 390,745 470,780 510,900'/><polygon fill='rgb(180,180,180)' points='130,900 200,740 260,700 330,685 390,690 450,700 530,740 610,790 700,900'/><polygon fill='rgb(235,235,235)' points='480,900 560,780 620,750 700,720 760,700 820,705 890,725 950,760 1020,820 1040,900'/><polygon fill='rgb(170,170,170)' points='830,900 920,790 1000,750 1080,720 1150,700 1220,695 1290,720 1350,770 1390,900'/><polygon fill='rgb(215,215,215)' points='1180,900 1250,800 1350,740 1450,710 1550,750 1650,820 1720,900'/></svg>");
}
/* Content-slide ghost: handwriting */
[data-ghost="notebook"] .layer-ghost {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 900' preserveAspectRatio='xMidYMid slice'><rect width='100%' height='100%' fill='%230e1a15'/><g stroke='%23ffffff' stroke-width='2' opacity='0.7' fill='none'><path d='M200,300 Q400,280 600,340 T900,380'/><path d='M200,420 Q400,400 600,460 T900,500'/><path d='M200,540 Q400,520 600,580 T750,620'/><line x1='1000' y1='280' x2='1400' y2='280'/><line x1='1000' y1='320' x2='1350' y2='320'/><line x1='1000' y1='360' x2='1380' y2='360'/><line x1='1000' y1='400' x2='1260' y2='400'/></g><circle cx='1480' cy='220' r='40' fill='%23ffffff' opacity='0.7'/></svg>");
}
/* Moment ghost: concentric signal rings */
[data-ghost="signal"] .layer-ghost {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 900' preserveAspectRatio='xMidYMid slice'><g opacity='0.8'><circle cx='400' cy='450' r='280' fill='none' stroke='%23a8c4b4' stroke-width='2'/><circle cx='400' cy='450' r='180' fill='none' stroke='%23a8c4b4' stroke-width='2'/><circle cx='400' cy='450' r='80' fill='none' stroke='%23a8c4b4' stroke-width='2'/><line x1='400' y1='170' x2='400' y2='730' stroke='%23a8c4b4' stroke-width='1'/><line x1='120' y1='450' x2='680' y2='450' stroke='%23a8c4b4' stroke-width='1'/></g></svg>");
}
/* Section-break ghost: layered cityscape silhouette migrated to the
   solid-fill technique (Top Vibe #8). Each building now uses a distinct
   gray value instead of opacity, giving clean edges where towers overlap.
   Cityscapes ARE man-made so straight edges are correct here (per the
   "no straight lines in nature" rule — the inverse applies: cityscapes
   SHOULD use straight geometry). */
[data-ghost="cityscape"] .layer-ghost {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 900' preserveAspectRatio='xMidYMid slice'><defs><linearGradient id='sky' x1='0' y1='0' x2='0' y2='1'><stop offset='0%25' stop-color='%23a8c4b4' stop-opacity='0.35'/><stop offset='70%25' stop-color='%23ffffff' stop-opacity='0'/></linearGradient></defs><rect width='100%25' height='100%25' fill='url(%23sky)'/><rect fill='rgb(82,82,82)' x='-20' y='630' width='100' height='270'/><rect fill='rgb(102,102,102)' x='70' y='580' width='140' height='320'/><rect fill='rgb(115,115,115)' x='200' y='540' width='110' height='360'/><rect fill='rgb(92,92,92)' x='300' y='600' width='90' height='300'/><rect fill='rgb(107,107,107)' x='380' y='520' width='120' height='380'/><rect fill='rgb(92,92,92)' x='490' y='560' width='80' height='340'/><rect fill='rgb(112,112,112)' x='560' y='500' width='130' height='400'/><rect fill='rgb(102,102,102)' x='680' y='570' width='100' height='330'/><rect fill='rgb(110,110,110)' x='770' y='540' width='120' height='360'/><rect fill='rgb(97,97,97)' x='880' y='580' width='110' height='320'/><rect fill='rgb(115,115,115)' x='980' y='520' width='140' height='380'/><rect fill='rgb(94,94,94)' x='1110' y='570' width='90' height='330'/><rect fill='rgb(107,107,107)' x='1190' y='540' width='130' height='360'/><rect fill='rgb(102,102,102)' x='1310' y='590' width='100' height='310'/><rect fill='rgb(112,112,112)' x='1400' y='530' width='120' height='370'/><rect fill='rgb(102,102,102)' x='1510' y='570' width='110' height='330'/><rect fill='rgb(165,165,165)' x='40' y='480' width='100' height='420'/><polygon fill='rgb(178,178,178)' points='200,420 220,380 240,420 240,900 200,900'/><rect fill='rgb(184,184,184)' x='280' y='380' width='140' height='520'/><rect fill='rgb(173,173,173)' x='450' y='440' width='110' height='460'/><polygon fill='rgb(204,204,204)' points='590,330 640,240 690,330 690,900 590,900'/><rect fill='rgb(184,184,184)' x='720' y='400' width='130' height='500'/><rect fill='rgb(191,191,191)' x='880' y='360' width='110' height='540'/><rect fill='rgb(178,178,178)' x='1020' y='420' width='140' height='480'/><polygon fill='rgb(199,199,199)' points='1190,380 1220,330 1250,380 1250,900 1190,900'/><rect fill='rgb(178,178,178)' x='1290' y='430' width='120' height='470'/><rect fill='rgb(189,189,189)' x='1430' y='390' width='100' height='510'/><rect fill='rgb(234,234,234)' x='130' y='440' width='80' height='460'/><polygon fill='rgb(242,242,242)' points='360,280 385,180 410,280 410,900 360,900'/><rect fill='rgb(242,242,242)' x='383' y='140' width='4' height='50'/><rect fill='rgb(224,224,224)' x='520' y='380' width='90' height='520'/><polygon fill='rgb(245,245,245)' points='760,240 810,110 860,240 860,900 760,900'/><rect fill='rgb(245,245,245)' x='807' y='60' width='6' height='60'/><rect fill='rgb(230,230,230)' x='930' y='320' width='100' height='580'/><rect fill='rgb(234,234,234)' x='1090' y='300' width='80' height='600'/><polygon fill='rgb(230,230,230)' points='1280,350 1310,290 1340,350 1340,900 1280,900'/><rect fill='rgb(227,227,227)' x='1430' y='330' width='90' height='570'/><g fill='rgb(140,140,140)'><rect x='375' y='420' width='6' height='10'/><rect x='390' y='420' width='6' height='10'/><rect x='375' y='470' width='6' height='10'/><rect x='390' y='470' width='6' height='10'/><rect x='375' y='540' width='6' height='10'/><rect x='790' y='360' width='6' height='10'/><rect x='810' y='360' width='6' height='10'/><rect x='830' y='360' width='6' height='10'/><rect x='790' y='410' width='6' height='10'/><rect x='830' y='410' width='6' height='10'/><rect x='790' y='470' width='6' height='10'/><rect x='810' y='470' width='6' height='10'/><rect x='830' y='470' width='6' height='10'/><rect x='790' y='540' width='6' height='10'/><rect x='830' y='540' width='6' height='10'/><rect x='950' y='400' width='6' height='10'/><rect x='970' y='400' width='6' height='10'/><rect x='990' y='400' width='6' height='10'/><rect x='1010' y='400' width='6' height='10'/><rect x='950' y='460' width='6' height='10'/><rect x='990' y='460' width='6' height='10'/><rect x='950' y='530' width='6' height='10'/><rect x='1010' y='530' width='6' height='10'/></g></svg>");
}

/* Forest ghost: layered tree silhouettes. Organic subject — NO straight edges.
   Solid-fill individual shapes per Top Vibe #8. */
[data-ghost="forest"] .layer-ghost {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 900' preserveAspectRatio='xMidYMid slice'><defs><linearGradient id='sky' x1='0' y1='0' x2='0' y2='1'><stop offset='0%25' stop-color='%23a8c4b4' stop-opacity='0.4'/><stop offset='60%25' stop-color='%23ffffff' stop-opacity='0'/></linearGradient></defs><rect width='100%25' height='100%25' fill='url(%23sky)'/><polygon fill='rgb(50,50,50)' points='50,900 70,610 80,580 95,560 110,580 125,600 135,900'/><polygon fill='rgb(55,55,55)' points='180,900 195,640 210,605 220,585 235,605 250,635 260,900'/><polygon fill='rgb(48,48,48)' points='300,900 320,590 330,565 350,545 365,560 385,590 400,900'/><polygon fill='rgb(52,52,52)' points='450,900 465,620 480,590 495,575 510,595 525,625 535,900'/><polygon fill='rgb(50,50,50)' points='600,900 620,570 635,545 650,525 665,545 685,575 700,900'/><polygon fill='rgb(55,55,55)' points='770,900 790,610 805,580 820,565 835,580 855,615 870,900'/><polygon fill='rgb(48,48,48)' points='920,900 940,585 955,555 975,535 995,555 1015,590 1035,900'/><polygon fill='rgb(52,52,52)' points='1090,900 1110,615 1125,590 1140,575 1155,595 1175,625 1190,900'/><polygon fill='rgb(50,50,50)' points='1250,900 1270,600 1290,570 1310,550 1330,570 1350,605 1370,900'/><polygon fill='rgb(55,55,55)' points='1420,900 1440,620 1455,590 1475,570 1495,595 1515,625 1530,900'/><polygon fill='rgb(105,105,105)' points='120,900 145,510 170,470 195,445 215,470 240,510 260,900'/><polygon fill='rgb(115,115,115)' points='290,900 320,480 345,440 370,415 395,440 420,480 445,900'/><polygon fill='rgb(100,100,100)' points='480,900 510,520 535,480 560,455 580,480 605,525 625,900'/><polygon fill='rgb(120,120,120)' points='660,900 690,460 715,420 745,395 775,420 800,465 820,900'/><polygon fill='rgb(105,105,105)' points='870,900 900,500 925,460 950,435 975,460 1000,505 1025,900'/><polygon fill='rgb(115,115,115)' points='1060,900 1090,480 1115,440 1140,415 1170,440 1195,485 1220,900'/><polygon fill='rgb(100,100,100)' points='1260,900 1290,510 1315,470 1345,445 1370,470 1395,515 1420,900'/><polygon fill='rgb(110,110,110)' points='1460,900 1490,495 1515,455 1540,430 1560,455 1580,500 1600,900'/><polygon fill='rgb(220,220,220)' points='120,900 160,420 185,370 210,330 235,295 260,330 290,370 315,420 340,900'/><polygon fill='rgb(200,200,200)' points='510,900 545,370 575,315 605,275 635,240 665,275 695,315 725,370 755,900'/><polygon fill='rgb(230,230,230)' points='960,900 995,400 1025,350 1055,310 1085,275 1115,310 1145,350 1175,400 1210,900'/><polygon fill='rgb(210,210,210)' points='1350,900 1385,390 1415,340 1445,300 1475,265 1505,300 1535,340 1565,390 1595,900'/></svg>");
}

/* Ocean ghost: layered wave silhouettes. Organic subject — curves, no straight edges. */
[data-ghost="ocean"] .layer-ghost {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 900' preserveAspectRatio='xMidYMid slice'><defs><linearGradient id='sky' x1='0' y1='0' x2='0' y2='1'><stop offset='0%25' stop-color='%23a8c4b4' stop-opacity='0.35'/><stop offset='55%25' stop-color='%23ffffff' stop-opacity='0'/></linearGradient></defs><rect width='100%25' height='100%25' fill='url(%23sky)'/><path fill='rgb(60,60,60)' d='M -50,560 Q 150,540 280,555 T 540,545 T 820,555 T 1100,540 T 1380,550 T 1650,545 L 1650,900 L -50,900 Z'/><path fill='rgb(85,85,85)' d='M -50,640 Q 180,615 320,635 T 600,625 T 900,640 T 1180,620 T 1460,640 T 1650,630 L 1650,900 L -50,900 Z'/><path fill='rgb(110,110,110)' d='M -50,720 Q 210,695 370,718 T 670,705 T 980,720 T 1280,700 T 1540,720 T 1650,710 L 1650,900 L -50,900 Z'/><path fill='rgb(145,145,145)' d='M -50,780 Q 240,755 420,780 T 740,765 T 1060,785 T 1380,760 T 1650,780 L 1650,900 L -50,900 Z'/><path fill='rgb(185,185,185)' d='M -50,830 Q 280,810 480,832 T 820,818 T 1160,835 T 1460,815 T 1650,830 L 1650,900 L -50,900 Z'/><path fill='rgb(235,235,235)' d='M -50,870 Q 320,855 540,872 T 900,860 T 1240,875 T 1560,858 T 1650,870 L 1650,900 L -50,900 Z'/></svg>");
}

/* Clockwork ghost: nested gears. Man-made subject — straight geometry + perfect circles OK. */
[data-ghost="clockwork"] .layer-ghost {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 900' preserveAspectRatio='xMidYMid slice'><rect width='100%25' height='100%25' fill='transparent'/><g fill='rgb(65,65,65)'><circle cx='320' cy='280' r='95'/><circle cx='320' cy='280' r='76' fill='rgb(11,20,16)'/><circle cx='320' cy='280' r='55'/><circle cx='320' cy='280' r='38' fill='rgb(11,20,16)'/><circle cx='320' cy='280' r='14'/></g><g fill='rgb(65,65,65)'><rect x='314' y='178' width='12' height='18'/><rect x='314' y='364' width='12' height='18'/><rect x='218' y='274' width='18' height='12'/><rect x='404' y='274' width='18' height='12'/><rect x='253,215' width='15' height='14' transform='rotate(45 320 280)'/><rect x='249' y='209' width='14' height='16' transform='rotate(45 320 280)'/><rect x='377' y='209' width='14' height='16' transform='rotate(-45 320 280)'/><rect x='249' y='335' width='14' height='16' transform='rotate(-45 320 280)'/><rect x='377' y='335' width='14' height='16' transform='rotate(45 320 280)'/></g><g fill='rgb(120,120,120)'><circle cx='820' cy='520' r='145'/><circle cx='820' cy='520' r='118' fill='rgb(11,20,16)'/><circle cx='820' cy='520' r='88'/><circle cx='820' cy='520' r='62' fill='rgb(11,20,16)'/><circle cx='820' cy='520' r='22'/></g><g fill='rgb(120,120,120)'><rect x='812' y='370' width='16' height='22'/><rect x='812' y='648' width='16' height='22'/><rect x='670' y='512' width='22' height='16'/><rect x='948' y='512' width='22' height='16'/><rect x='707' y='400' width='18' height='22' transform='rotate(45 820 520)'/><rect x='915' y='400' width='18' height='22' transform='rotate(-45 820 520)'/><rect x='707' y='618' width='18' height='22' transform='rotate(-45 820 520)'/><rect x='915' y='618' width='18' height='22' transform='rotate(45 820 520)'/></g><g fill='rgb(200,200,200)'><circle cx='1290' cy='300' r='105'/><circle cx='1290' cy='300' r='85' fill='rgb(11,20,16)'/><circle cx='1290' cy='300' r='60'/><circle cx='1290' cy='300' r='42' fill='rgb(11,20,16)'/><circle cx='1290' cy='300' r='15'/></g><g fill='rgb(200,200,200)'><rect x='1283' y='190' width='14' height='20'/><rect x='1283' y='390' width='14' height='20'/><rect x='1180' y='293' width='20' height='14'/><rect x='1380' y='293' width='20' height='14'/></g></svg>");
}

/* Quote-slide ghost: parchment/journal lines */
[data-ghost="journal"] .layer-ghost {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1600 900' preserveAspectRatio='xMidYMid slice'><g stroke='%23ffffff' stroke-width='1' opacity='0.3' fill='none'><line x1='200' y1='180' x2='1400' y2='180'/><line x1='200' y1='240' x2='1400' y2='240'/><line x1='200' y1='300' x2='1400' y2='300'/><line x1='200' y1='360' x2='1400' y2='360'/><line x1='200' y1='420' x2='1400' y2='420'/><line x1='200' y1='480' x2='1400' y2='480'/><line x1='200' y1='540' x2='1400' y2='540'/><line x1='200' y1='600' x2='1400' y2='600'/><line x1='200' y1='660' x2='1400' y2='660'/><line x1='200' y1='720' x2='1400' y2='720'/></g><g stroke='%23ffffff' stroke-width='1.5' opacity='0.6' fill='none'><path d='M180,170 Q170,450 180,740'/></g></svg>");
}

/* ───── Effect 6: Aurora mesh (STATIC) ───── */
.layer-aurora {
  position: absolute; inset: 0;
  pointer-events: none; z-index: 1;
  opacity: 0;
  transition: opacity 0.8s ease;
  background:
    radial-gradient(ellipse 60% 40% at 20% 30%, rgba(62, 115, 97, 0.22), transparent 60%),
    radial-gradient(ellipse 50% 50% at 80% 70%, rgba(168, 196, 180, 0.16), transparent 60%),
    radial-gradient(ellipse 40% 60% at 50% 50%, rgba(139, 128, 255, 0.08), transparent 70%);
  filter: blur(40px);
}
.atm-aurora .layer-aurora { opacity: 1; }

/* ───── Effect 7: Star drift (SPARING · MOTION) ───── */
.layer-stars {
  position: absolute; inset: 0;
  pointer-events: none; z-index: 1;
  opacity: 0;
  transition: opacity 0.6s ease;
  background-image:
    radial-gradient(1px 1px at 13% 19%, rgba(244, 241, 232, 0.9), transparent),
    radial-gradient(1px 1px at 27% 38%, rgba(244, 241, 232, 0.7), transparent),
    radial-gradient(1.2px 1.2px at 42% 12%, rgba(244, 241, 232, 1), transparent),
    radial-gradient(1px 1px at 58% 71%, rgba(244, 241, 232, 0.6), transparent),
    radial-gradient(1px 1px at 71% 29%, rgba(244, 241, 232, 0.8), transparent),
    radial-gradient(1.4px 1.4px at 86% 52%, rgba(244, 241, 232, 0.9), transparent),
    radial-gradient(1px 1px at 18% 61%, rgba(244, 241, 232, 0.5), transparent),
    radial-gradient(1.2px 1.2px at 35% 83%, rgba(244, 241, 232, 0.7), transparent),
    radial-gradient(1px 1px at 49% 47%, rgba(244, 241, 232, 0.6), transparent),
    radial-gradient(1.3px 1.3px at 64% 8%, rgba(244, 241, 232, 0.85), transparent),
    radial-gradient(1px 1px at 78% 77%, rgba(244, 241, 232, 0.7), transparent),
    radial-gradient(1px 1px at 91% 88%, rgba(244, 241, 232, 0.6), transparent),
    radial-gradient(1px 1px at 4% 44%, rgba(244, 241, 232, 0.8), transparent);
  background-size: 100% 100%;
  animation: atm-star-drift 180s linear infinite;
}
.atm-stars .layer-stars { opacity: 0.6; }
@keyframes atm-star-drift {
  0% { background-position: 0 0; }
  100% { background-position: 40px 40px; }
}

/* ───── Effect 8: Horizon sweep — RETIRED 2026-04-18 ───────
   Removed from the library at Mark's direction. Dust particles alone
   carry the meditative slide beat effectively; the horizon line added
   motion without clear purpose for the courses we're building. If a
   future course genuinely needs a slow cinematic sweep beat, we can
   restore from git history. */

/* ───── Effect 9: Edge glow (STATIC) ───── */
.layer-edge {
  position: absolute; inset: 0;
  pointer-events: none; z-index: 3;
  opacity: 0;
  transition: opacity 0.8s ease;
  box-shadow:
    inset 0 0 80px 20px rgba(62, 115, 97, 0.22),
    inset 0 0 160px 40px rgba(62, 115, 97, 0.10);
}
.atm-edge .layer-edge { opacity: 1; }

/* ───── Effect 10: Caustic light (STATIC · RARE) ───── */
.layer-caustic {
  position: absolute; inset: -20%;
  pointer-events: none; z-index: 1;
  opacity: 0;
  transition: opacity 0.8s ease;
  background:
    radial-gradient(circle at 20% 30%, rgba(168, 196, 180, 0.14), transparent 18%),
    radial-gradient(circle at 70% 20%, rgba(168, 196, 180, 0.11), transparent 20%),
    radial-gradient(circle at 40% 60%, rgba(168, 196, 180, 0.14), transparent 15%),
    radial-gradient(circle at 80% 70%, rgba(168, 196, 180, 0.10), transparent 22%),
    radial-gradient(circle at 15% 80%, rgba(168, 196, 180, 0.12), transparent 16%),
    radial-gradient(circle at 55% 45%, rgba(168, 196, 180, 0.09), transparent 20%);
  filter: blur(20px);
}
.atm-caustic .layer-caustic { opacity: 1; }

/* ───── Effect 11: Spotlight (STATIC) ───── */
.layer-spotlight {
  position: absolute; inset: 0;
  pointer-events: none; z-index: 2;
  opacity: 0;
  transition: opacity 0.6s ease;
  background: radial-gradient(ellipse 60% 60% at center, rgba(244, 241, 232, 0.05) 0%, transparent 70%);
}
.atm-spotlight .layer-spotlight { opacity: 1; }

/* ───── Effect 12: Color grade (STATIC) ───── */
.layer-grade {
  position: absolute; inset: 0;
  pointer-events: none; z-index: 90;
  opacity: 0;
  transition: opacity 1.2s ease, background-color 1.2s ease;
  mix-blend-mode: overlay;
}
.atm-grade-warm .layer-grade { opacity: 1; background: rgba(212, 164, 99, 0.14); }
.atm-grade-cool .layer-grade { opacity: 1; background: rgba(107, 142, 174, 0.14); }

/* ═══════════════════════════════════════════════════════
   PRESETS — curated compositions
   Applied by setting the preset class on the stage.
   Each preset sets the atm-* classes it needs.
   ═══════════════════════════════════════════════════════ */
.atm-preset-summit   { /* Hero · ghost + stars + edge + cool */
  /* Apply via JS: atm-ghost atm-stars atm-edge atm-grade-cool */
}
.atm-preset-quiet    { /* Content baseline · orbs + grain */
  /* Apply via JS: atm-orbs atm-grain */
}
.atm-preset-editorial { /* Content with place · orbs + grain + ghost + vignette */
  /* Apply via JS: atm-orbs atm-grain atm-ghost atm-vignette */
}
.atm-preset-focus    { /* KC / quiz · spotlight + vignette + grain */
  /* Apply via JS: atm-spotlight atm-vignette atm-grain */
}
.atm-preset-live     { /* Interactives · orbs + edge + grain */
  /* Apply via JS: atm-orbs atm-edge atm-grain */
}
.atm-preset-moment   { /* Talpek Moments · caustic + spotlight + grain */
  /* Apply via JS: atm-caustic atm-spotlight atm-grain */
}
.atm-preset-celestial { /* Alternate hero · stars + aurora + grain */
  /* Apply via JS: atm-stars atm-aurora atm-grain */
}
.atm-preset-meditative { /* Quote / contemplation · quiet + horizon + dust */
  /* Apply via JS: atm-orbs atm-grain atm-horizon atm-dust */
}
