/*
 * ============================================================================
 * ZenOps Studio — Slide Deck CSS
 * Épisode 01 : C'est quoi Teleport ?
 * ============================================================================
 *
 * Guide complet : ../../style/slide-engine-guide.md
 * Design guide  : ../../style/design-guide-slides.md
 *
 * Slides custom : chaos2 (16), timeline (10), arch (8), machid (14), outro (1)
 * Slides standard : intro, teleport, avant/après
 *
 * ============================================================================
 */

* { margin: 0; padding: 0; box-sizing: border-box; }

/* ── Design Tokens ──────────────────────────────────────────────────────────
 * Dark theme inspired by GitHub dark / YouTube Studio.
 * --bg/bg2/bg3: background layers (darkest → lightest) for depth
 * --green: primary accent (Teleport brand)
 * --border: subtle dividers, card outlines
 * Use rgba() variants of these for glows: rgba(0,230,118,0.15) etc.
 */
:root {
    --bg: #0D1117;
    --bg2: #161B22;
    --bg3: #1C2128;
    --green: #00E676;
    --violet: #7C3AED;
    --blue: #3B82F6;
    --orange: #F97316;
    --red: #EF4444;
    --yellow: #FBBF24;
    --cyan: #22D3EE;
    --pink: #F472B6;
    --teleport: #512FC9;
    --white: #FFFFFF;
    --gray: #9CA3AF;
    --border: #374151;
}

body {
    font-family: 'Segoe UI', system-ui, sans-serif;
    background: var(--bg);
    color: var(--white);
    overflow: hidden;
}

/* Subtle dot grid — creates a tech-grid background texture.
 * Fixed so it doesn't scroll. z-index:-1 keeps it behind everything. */
body::before {
    content: '';
    position: fixed; top: 0; left: 0; width: 100%; height: 100%;
    background-image: radial-gradient(circle, rgba(255,255,255,0.025) 1px, transparent 1px);
    background-size: 32px 32px;
    pointer-events: none; z-index: -1;
}

/* ===== SLIDE ENGINE ================================================================
 * The core presentation framework. All slides are stacked absolutely inside
 * .slide-container. Only the .active slide is visible (opacity:1, scale:1).
 *
 * Transitions between slides:
 *   - Outgoing slide fades to opacity:0 + slight scale-down (0.97)
 *   - Incoming slide fades to opacity:1 + scale(1)
 *   - Duration: 0.5s ease-out — feels smooth at 30/60fps video capture
 *
 * .sc ("slide content") is the centered wrapper — constrains width to 1300px
 * and vertically/horizontally centers all content via flexbox.
 * =============================================================================== */
.progress-bar {
    position: fixed; top: 0; left: 0; height: 3px;
    background: linear-gradient(90deg, var(--green), var(--cyan), var(--violet));
    z-index: 100; transition: width 0.5s ease-out;
}

.slide-container {
    position: fixed; top: 0; left: 0; width: 100%; height: 100%;
}

.slide {
    position: absolute; width: 100%; height: 100%;
    display: flex; align-items: center; justify-content: center;
    opacity: 0; transform: scale(0.97);
    transition: opacity 0.5s ease-out, transform 0.5s ease-out;
    pointer-events: none;
}

.slide.active {
    opacity: 1; transform: scale(1); pointer-events: auto;
}

.sc {
    width: 92%; max-width: 1300px;
    display: flex; flex-direction: column;
    justify-content: center; align-items: center;
    text-align: center; gap: 30px;
}

/* ===== REVEAL SYSTEM ================================================================
 * Progressive disclosure: elements appear one group at a time on keypress.
 *
 * HOW TO USE:
 *   <h2 class="r" data-step="0">Title</h2>        ← appears on slide enter
 *   <p class="r" data-step="1">Paragraph</p>       ← appears on 1st keypress
 *   <div class="r" data-step="1">Also step 1</div> ← same step = appear together
 *   <div class="r" data-step="2">Next group</div>  ← appears on 2nd keypress
 *
 * The JS engine reads data-step, adds .show when step >= data-step.
 * CSS handles the animation — 30px upward slide + fade + slight scale.
 *
 * EASING: cubic-bezier(.16,1,.3,1) — "expo out" feel, fast start, gentle land.
 * This easing is reused throughout the deck for consistency.
 *
 * STAGGER: To stagger items within the same step, use CSS transition-delay
 * directly in the HTML: style="transition-delay: 0.1s"
 * =============================================================================== */
.r {
    opacity: 0; transform: translateY(30px) scale(0.95);
    transition: opacity 0.5s cubic-bezier(.16,1,.3,1), transform 0.5s cubic-bezier(.16,1,.3,1);
}
.r.show {
    opacity: 1; transform: translateY(0) scale(1);
}

/* ===== TOPIC NAV ===== */
.nav {
    position: fixed; bottom: 0; left: 0; width: 100%; height: 60px;
    background: rgba(13,17,23,0.95); backdrop-filter: blur(12px);
    border-top: 1px solid var(--border);
    display: flex; align-items: center; justify-content: center; gap: 8px;
    z-index: 80; padding: 0 16px; overflow-x: auto;
}
.nav-item {
    padding: 6px 16px; border: 1px solid var(--border); border-radius: 20px;
    color: var(--gray); cursor: pointer; font-size: 0.95rem; font-weight: 500;
    transition: all 0.3s; white-space: nowrap;
}
.nav-item:hover { border-color: var(--green); color: var(--white); }
.nav-item.active {
    background: rgba(0,230,118,0.12); border-color: var(--green);
    color: var(--green); box-shadow: 0 0 16px rgba(0,230,118,0.15);
}

/* ===== LANGUAGE SWITCHER ===== */
.lang-switch {
    position: fixed; top: 14px; right: 16px; z-index: 90;
    display: flex; gap: 4px;
    background: rgba(13,17,23,0.85); backdrop-filter: blur(10px);
    border: 1px solid var(--border); border-radius: 8px;
    padding: 3px; font-size: 0.8rem; font-weight: 600;
}
.lang-btn {
    padding: 4px 10px; border-radius: 6px; border: none;
    background: transparent; color: var(--gray); cursor: pointer;
    transition: all 0.25s; font-family: inherit; font-size: inherit; font-weight: inherit;
}
.lang-btn:hover { color: var(--white); }
.lang-btn.active {
    background: rgba(0,230,118,0.15); color: var(--green);
}

/* ===== REUSABLE KEYFRAME ANIMATIONS ================================================
 * These are continuous (infinite) animations applied via CSS classes.
 * They run independently of the reveal system.
 *
 * HOW TO USE:
 *   animation: float 4s ease-in-out infinite;  ← gentle vertical bobbing
 *   animation: glow 3s ease-in-out infinite;   ← pulsing green box-shadow
 *   animation: pulse-border 1.5s infinite;      ← red border flicker (danger)
 *   animation: shake 0.5s ease-in-out;          ← horizontal shake (one-shot)
 *
 * PATTERN: All use 0%/100% same state + 50% peak — smooth sinusoidal feel.
 * Duration 3-4s for ambient effects, 0.5-1.5s for attention-grabbing.
 * =============================================================================== */
@keyframes glow { 0%,100% { box-shadow: 0 0 20px rgba(0,230,118,0); } 50% { box-shadow: 0 0 40px rgba(0,230,118,0.2); } }
@keyframes float { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-8px); } }
@keyframes pulse-border { 0%,100% { border-color: var(--red); } 50% { border-color: rgba(239,68,68,0.3); } }
@keyframes shake { 0%,100%{transform:translateX(0)} 20%{transform:translateX(-4px)} 40%{transform:translateX(4px)} 60%{transform:translateX(-3px)} 80%{transform:translateX(3px)} }

/* ===== GLOBAL REUSABLE ELEMENTS ==================================================
 * Shared components used across multiple slides.
 * When building a new slide, prefer reusing these over creating new ones.
 * =============================================================================== */
.big-icon {
    width: 80px; height: 80px; display: block; margin: 0 auto 12px;
    filter: drop-shadow(0 4px 12px rgba(0,0,0,0.5));
}
.big-icon.xl { width: 100px; height: 100px; }

h2.slide-title {
    font-size: 3.2rem; font-weight: 800; line-height: 1.2;
    background: linear-gradient(135deg, var(--white) 0%, var(--gray) 100%);
    -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
}
h2.slide-title.accent-green {
    background: linear-gradient(135deg, var(--green), var(--cyan));
    -webkit-background-clip: text; background-clip: text;
}
h2.slide-title.accent-red {
    background: linear-gradient(135deg, var(--red), var(--orange));
    -webkit-background-clip: text; background-clip: text;
}
h2.slide-title.accent-teleport {
    background: linear-gradient(135deg, var(--teleport), var(--violet));
    -webkit-background-clip: text; background-clip: text;
}

/* Teleport brand block (logo + title) */
.tp-brand {
    display: flex; align-items: center; justify-content: center; gap: 20px;
    margin-bottom: 8px;
}
.tp-brand-logo {
    width: 80px; height: 80px;
    filter: drop-shadow(0 0 20px rgba(81,47,201,0.5));
}

.sub { font-size: 1.35rem; color: var(--gray); max-width: 700px; line-height: 1.6; }

/* ===== CARD SYSTEM (YouTube style) ================================================
 * Reusable card component with colored top accent bar.
 *
 * HOW TO USE:
 *   <div class="card">                       ← default green accent
 *     <h3>Title</h3>
 *     <p>Description</p>
 *   </div>
 *
 * CUSTOMIZING ACCENT COLOR (per-card):
 *   Use CSS custom properties on the element:
 *     style="--card-accent: var(--red); --card-glow: rgba(239,68,68,0.12);"
 *   Or define a variant class (see .risk-card below for example).
 *
 * HOVER EFFECT:
 *   - Lifts 6px (translateY)
 *   - Deep shadow + colored glow
 *   - Border highlights to accent color
 *   - Same expo-out easing as reveal system
 *
 * The ::before pseudo-element creates the 3px colored top bar.
 * =============================================================================== */
.card {
    background: linear-gradient(145deg, var(--bg3) 0%, var(--bg2) 100%);
    border: 1px solid var(--border); border-radius: 16px;
    padding: 28px; text-align: center;
    transition: all 0.35s cubic-bezier(.16,1,.3,1);
    position: relative; overflow: hidden;
}
.card::before {
    content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px;
    background: var(--card-accent, var(--green));
    border-radius: 16px 16px 0 0;
}
.card:hover {
    transform: translateY(-6px);
    box-shadow: 0 20px 50px rgba(0,0,0,0.4), 0 0 30px var(--card-glow, rgba(0,230,118,0.08));
    border-color: var(--card-accent, var(--green));
}
.card h3 { font-size: 1.4rem; font-weight: 700; margin-bottom: 8px; }
.card p { font-size: 1.1rem; color: var(--gray); line-height: 1.5; }

/* ===== SLIDE 1: INTRO ============================================================
 * Full-screen title card with gradient text, floating animation, and badge.
 * Uses the .r reveal system: title (step 0), line (step 1), badge (step 2).
 * =============================================================================== */
.intro-logo {
    width: 120px; height: 120px;
    filter: drop-shadow(0 0 30px rgba(81,47,201,0.5)) drop-shadow(0 0 60px rgba(81,47,201,0.25));
    animation: float 4s ease-in-out infinite;
    margin-bottom: 20px;
}
.intro-title {
    font-size: 5.5rem; font-weight: 900; letter-spacing: -3px;
    background: linear-gradient(135deg, var(--teleport), var(--violet), var(--cyan));
    -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
}
.intro-line { width: 300px; height: 2px; background: linear-gradient(90deg, transparent, var(--teleport), transparent); }
.intro-badge {
    display: inline-block; padding: 10px 28px;
    background: linear-gradient(135deg, rgba(81,47,201,0.15), rgba(124,58,237,0.1));
    border: 1px solid rgba(81,47,201,0.4); border-radius: 30px;
    color: var(--teleport); font-weight: 600; font-size: 1.1rem; letter-spacing: 2px;
}

/* ===== SLIDE 2: CHAOS ANIMATED ===================================================
 * Custom multi-step animation (type: 'chaos' in slides[]).
 * NOT using the .r/data-step reveal system — fully JS-driven.
 *
 * ANIMATION SEQUENCE (6 keypresses):
 *   Step 0: Title appears ("Imagine a company...")
 *   Step 1: 30 scattered server icons fade in at random positions
 *   Step 2: Servers fade out → 4 hero cards slide up (Linux/Windows/K8s/Web)
 *   Step 3-6: Credential items appear inside each card, one category per step
 *
 * KEY PATTERNS:
 *   - .scattered: absolute container for random server icons
 *   - .scatter-srv: individual server icon, positioned via inline style (%)
 *   - .hero-cards: flexbox container for the 4 credential cards
 *   - .hero-card: card with colored top bar (.hc-green, .hc-blue, .hc-violet, .hc-cyan)
 *   - .cred-item: individual credential row inside hero-card, slides in from left
 *
 * JS controls visibility by toggling .show / .hide classes.
 * CSS handles all transitions (opacity, transform).
 * =============================================================================== */
.chaos-scene {
    position: relative; width: 100%; height: 80vh; max-height: 600px;
}

/* Scattered servers layer */
.scattered {
    position: absolute; top: 0; left: 0; width: 100%; height: 100%;
    transition: opacity 0.8s ease-out;
}
.scattered.hide { opacity: 0; pointer-events: none; }

.scatter-srv {
    position: absolute; width: 44px; height: 44px;
    background: var(--bg3); border: 1px solid var(--border); border-radius: 8px;
    display: flex; align-items: center; justify-content: center;
    opacity: 0; transition: opacity 0.4s ease-out, transform 0.4s ease-out;
    transform: scale(0.7);
}
.scatter-srv.show { opacity: 1; transform: scale(1); }
.scatter-srv img { width: 28px; height: 28px; }

/* Title overlay — positioned above scatter / below cards */
.chaos-title-overlay {
    position: absolute; top: 22%; left: 0; width: 100%;
    display: flex; justify-content: center;
    pointer-events: none; z-index: 15;
}
.chaos-title-overlay h2 {
    font-size: 1.9rem; font-weight: 600;
    color: var(--gray);
    opacity: 0;
    transition: opacity 0.5s, transform 0.5s cubic-bezier(.16,1,.3,1);
    transform: translateY(10px);
}
.chaos-title-overlay h2.show { opacity: 1; transform: translateY(0); }
.chaos-title-overlay h2.big-title {
    font-size: 3.2rem; font-weight: 800;
    background: linear-gradient(135deg, var(--white), var(--gray));
    -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
    color: unset;
}

/* 4 hero cards that appear after scatter */
.hero-cards {
    position: absolute; top: 0; left: 0; width: 100%; height: 100%;
    display: flex; align-items: center; justify-content: center; gap: 24px;
    opacity: 0; transform: translateY(20px);
    transition: opacity 0.6s cubic-bezier(.16,1,.3,1), transform 0.6s cubic-bezier(.16,1,.3,1);
    z-index: 10;
}
.hero-cards.show { opacity: 1; transform: translateY(0); }

.hero-card {
    width: 240px;
    background: linear-gradient(145deg, var(--bg3), var(--bg2));
    border: 1px solid var(--border); border-radius: 16px;
    padding: 20px; text-align: center;
    position: relative; overflow: hidden;
    opacity: 0; transform: translateY(30px);
    transition: opacity 0.5s cubic-bezier(.16,1,.3,1), transform 0.5s cubic-bezier(.16,1,.3,1);
}
.hero-card.show { opacity: 1; transform: translateY(0); }
.hero-card::before {
    content: ''; position: absolute; top: 0; left: 0; right: 0; height: 3px;
    border-radius: 16px 16px 0 0;
}
.hero-card.hc-green::before { background: var(--green); }
.hero-card.hc-blue::before { background: var(--blue); }
.hero-card.hc-violet::before { background: var(--violet); }
.hero-card.hc-cyan::before { background: var(--cyan); }

.hero-card img { width: 56px; height: 56px; margin-bottom: 10px; }
.hero-card h3 { font-size: 1.3rem; font-weight: 700; margin-bottom: 14px; }
.hero-card.hc-green h3 { color: var(--green); }
.hero-card.hc-blue h3 { color: var(--blue); }
.hero-card.hc-violet h3 { color: var(--violet); }
.hero-card.hc-cyan h3 { color: var(--cyan); }

/* Credential items inside hero cards */
.cred-item {
    display: flex; align-items: center; gap: 8px; padding: 6px 0;
    border-bottom: 1px solid rgba(55,65,81,0.3); font-size: 0.95rem; color: var(--gray);
    text-align: left;
    opacity: 0; transform: translateX(-10px);
    transition: opacity 0.35s ease-out, transform 0.35s ease-out;
}
.cred-item.show { opacity: 1; transform: translateX(0); }
.cred-item:last-child { border-bottom: none; }
.cred-item svg { width: 18px; height: 18px; flex-shrink: 0; opacity: 0.8; }
.cred-item .dot { color: var(--gray); opacity: 0.3; font-size: 1.2rem; }

/* ===== CHAOS v2: NARRATIVE MULTI-ACT ANIMATION ===================================
 * Custom multi-step animation (type: 'chaos2' in slides[]).
 * Fully JS-driven, NOT using .r/data-step reveal.
 *
 * STRUCTURE:
 *   .chaos2-scene        ← full-viewport container
 *     #c2Canvas          ← canvas for FX
 *     .c2-year           ← year badge (2015, 2017, …)
 *     .c2-narrative      ← centered narrative text
 *     .c2-stage          ← Act 1 servers + SSH key
 *     .c2-counter        ← live block counter (Act 2)
 *     .c2-columns        ← 5-column layout for block rain (Act 2)
 *     .c2-recap          ← auth method panels (Act 2, step 3)
 *     .c2-final          ← final narrative text (Act 2, step 4)
 *
 * ANIMATION SEQUENCE (Acts 1-2, steps 0-4):
 *   Step 0: Year "2015" + narrative text
 *   Step 1: 3 Linux servers + SSH key appear
 *   Step 2: Year "2017" + continuous block rain (~14s) → freeze
 *   Step 3: Recap — auth method panels fold down above columns
 *   Step 4: Final narrative text
 * =============================================================================== */
.chaos2-scene {
    position: relative; width: 100%; height: 100vh; overflow: hidden;
}
#c2Canvas {
    position: absolute; top: 0; left: 0; width: 100%; height: 100%;
    pointer-events: none; z-index: 0;
}

/* Year badge — big neon center → shrinks to top-left */
.c2-year {
    position: absolute; top: 50%; left: 50%;
    transform: translate(-50%, -50%) scale(0.8);
    font-size: 6rem; font-weight: 900; letter-spacing: -4px;
    font-family: 'Courier New', monospace;
    color: var(--green);
    text-shadow: 0 0 40px rgba(0,230,118,0.4), 0 0 80px rgba(0,230,118,0.15);
    opacity: 0;
    transition: all 0.8s cubic-bezier(.16,1,.3,1);
    z-index: 10;
}
.c2-year.show {
    opacity: 1; transform: translate(-50%, -50%) scale(1);
}
.c2-year.corner {
    top: 28px; left: 40px;
    transform: translate(0, 0) scale(1);
    font-size: 1.8rem; letter-spacing: -1px;
    text-shadow: 0 0 20px rgba(0,230,118,0.3);
}

/* Narrative text — centered below year */
.c2-narrative {
    position: absolute; top: 62%; left: 50%;
    transform: translate(-50%, -50%);
    font-size: 1.8rem; font-weight: 300; color: var(--gray);
    opacity: 0;
    transition: opacity 0.6s cubic-bezier(.16,1,.3,1);
    z-index: 10; white-space: nowrap;
}
.c2-narrative.show { opacity: 1; }

/* Stage — positional container for Act 1 elements */
.c2-stage {
    position: absolute; top: 0; left: 0; width: 100%; height: 100%;
    z-index: 5;
    transition: opacity 0.5s;
}
.c2-stage.hide { opacity: 0; pointer-events: none; }

/* Server items (Act 1) — small card with icon + label */
.c2-server {
    position: absolute;
    display: flex; flex-direction: column; align-items: center; gap: 6px;
    opacity: 0; transform: translateY(20px);
    transition: opacity 0.5s cubic-bezier(.16,1,.3,1), transform 0.5s cubic-bezier(.16,1,.3,1),
                left 0.8s cubic-bezier(.16,1,.3,1), top 0.8s cubic-bezier(.16,1,.3,1);
}
.c2-server.show { opacity: 1; transform: translateY(0); }
.c2-server .c2-srv-icon {
    width: 56px; height: 56px;
    background: var(--bg3); border: 1px solid var(--border); border-radius: 12px;
    display: flex; align-items: center; justify-content: center;
    box-shadow: 0 0 20px rgba(0,230,118,0.08);
}
.c2-server .c2-srv-icon svg { width: 32px; height: 32px; color: var(--green); }
.c2-server .c2-srv-label {
    font-family: 'Courier New', monospace; font-size: 0.8rem;
    color: var(--gray); letter-spacing: 0.5px;
}

/* SSH key indicator (Act 1) */
.c2-ssh-key {
    position: absolute;
    display: flex; align-items: center; gap: 10px;
    opacity: 0; transform: translateX(-15px);
    transition: opacity 0.5s 0.4s cubic-bezier(.16,1,.3,1), transform 0.5s 0.4s cubic-bezier(.16,1,.3,1),
                left 0.8s cubic-bezier(.16,1,.3,1), top 0.8s cubic-bezier(.16,1,.3,1);
}
.c2-ssh-key.show { opacity: 1; transform: translateX(0); }
.c2-ssh-key .c2-key-icon {
    width: 40px; height: 40px;
    background: rgba(0,230,118,0.08); border: 1px solid rgba(0,230,118,0.2); border-radius: 10px;
    display: flex; align-items: center; justify-content: center;
}
.c2-ssh-key .c2-key-icon svg { width: 22px; height: 22px; color: var(--green); }
.c2-ssh-key .c2-key-label {
    font-size: 0.95rem; color: var(--green); font-weight: 500;
}

/* ── Act 2: Live counter ────────────────────────────────────── */
.c2-counter {
    position: absolute; top: 6%; left: 50%;
    transform: translateX(-50%);
    text-align: center;
    z-index: 15;
    opacity: 0;
    transition: opacity 0.4s;
}
.c2-counter.show { opacity: 1; }
.c2-counter-num {
    font-size: 4.5rem; font-weight: 900;
    font-family: 'Courier New', monospace;
    color: var(--green);
    line-height: 1;
    transition: color 0.3s, text-shadow 0.3s;
}
.c2-counter-lbl {
    font-size: 1rem; color: var(--gray); letter-spacing: 1px;
    text-transform: uppercase;
}
.c2-counter-year {
    font-size: 1.3rem; font-weight: 700;
    color: var(--orange); letter-spacing: 2px;
    font-family: 'Courier New', monospace;
    opacity: 0; transition: opacity 0.3s;
    margin-top: 2px;
}
.c2-counter-year.show { opacity: 1; }
/* Counter escalation effects */
@keyframes c2-jitter {
    0%, 100% { transform: translate(0); }
    25% { transform: translate(-2px, 1px); }
    50% { transform: translate(1px, -2px); }
    75% { transform: translate(-1px, -1px); }
}
.c2-counter.jitter .c2-counter-num { animation: c2-jitter 0.12s infinite; }
.c2-counter.intense .c2-counter-num {
    color: var(--orange);
    text-shadow: 0 0 30px rgba(249,115,22,0.4);
}
.c2-counter.critical .c2-counter-num {
    color: var(--red);
    text-shadow: 0 0 40px rgba(239,68,68,0.5), 0 0 80px rgba(239,68,68,0.2);
}
@keyframes c2-flash {
    0%   { filter: brightness(1); }
    40%  { filter: brightness(3); }
    100% { filter: brightness(1); }
}
.c2-counter.flash { animation: c2-flash 0.4s ease-out; }

/* ── Act 2: 5-Column layout ─────────────────────────────────── */
.c2-columns {
    position: absolute; bottom: 12%; left: 4%; right: 4%;
    height: 50%;
    display: flex; gap: 10px;
    z-index: 5;
    opacity: 0;
    transition: opacity 0.5s;
}
.c2-columns.show { opacity: 1; }

.c2-col {
    flex: 1;
    display: flex; flex-direction: column;
    position: relative;
    border-bottom: 2px solid var(--border);
    overflow: hidden;
}
.c2-col-head {
    text-align: center; padding: 6px 0;
    font-size: 0.75rem; font-weight: 700;
    text-transform: uppercase; letter-spacing: 1px;
    flex-shrink: 0;
}
.c2-col[data-col="linux"]   .c2-col-head { color: var(--green); }
.c2-col[data-col="windows"] .c2-col-head { color: var(--blue); }
.c2-col[data-col="k8s"]     .c2-col-head { color: var(--violet); }
.c2-col[data-col="db"]      .c2-col-head { color: var(--orange); }
.c2-col[data-col="web"]     .c2-col-head { color: var(--pink); }

.c2-col-body {
    flex: 1; position: relative;
    display: flex; flex-wrap: wrap;
    align-content: flex-end;
    gap: 3px; padding: 3px;
    overflow: hidden;
}

/* ── Mini blocks (compact server-style) ──────────────────────── */
.c2-mini {
    width: calc(50% - 2px); height: 10px;
    border-radius: 3px;
    background: var(--bg3);
    border-left: 2px solid;
    font-family: 'Courier New', monospace;
    font-size: 0.48rem; font-weight: 500;
    color: var(--gray);
    display: flex; align-items: center;
    padding: 0 3px;
    animation: c2-drop 0.55s cubic-bezier(.45,0,.95,.6) both;
}
.c2-mini-linux   { border-left-color: var(--green); }
.c2-mini-windows { border-left-color: var(--blue); }
.c2-mini-k8s     { border-left-color: var(--violet); }
.c2-mini-db      { border-left-color: var(--orange); }
.c2-mini-web     { border-left-color: var(--pink); }

@keyframes c2-drop {
    0%   { transform: translateY(-100px); opacity: 0; }
    12%  { opacity: 1; }
    78%  { transform: translateY(0); }
    88%  { transform: translateY(-5px); }
    95%  { transform: translateY(1px); }
    100% { transform: translateY(0); }
}
@keyframes c2-pop {
    0%   { transform: scale(0.4) translateY(-20px); opacity: 0; }
    60%  { transform: scale(1.08) translateY(0); opacity: 1; }
    100% { transform: scale(1) translateY(0); opacity: 1; }
}

/* ── Recap panels (fold down above columns) ──────────────────── */
.c2-recap {
    position: absolute; top: 18%; left: 4%; right: 4%;
    display: flex; gap: 10px;
    z-index: 15;
    opacity: 0;
    transition: opacity 0.3s;
}
.c2-recap.show { opacity: 1; }

.c2-recap-panel {
    flex: 1;
    background: var(--bg2);
    border: 1px solid var(--border); border-radius: 8px;
    padding: 10px 6px; text-align: center;
    transform: rotateX(-90deg);
    transform-origin: top center;
    opacity: 0;
    transition: transform 0.5s cubic-bezier(.16,1,.3,1), opacity 0.4s;
}
.c2-recap-panel.show {
    transform: rotateX(0); opacity: 1;
}
.c2-recap-panel .c2-rp-title {
    font-size: 0.7rem; font-weight: 700;
    text-transform: uppercase; letter-spacing: 1px;
    margin-bottom: 6px;
}
.c2-recap-panel .c2-rp-methods {
    display: flex; flex-direction: column; gap: 3px;
}
.c2-recap-panel .c2-rp-pill {
    font-size: 0.7rem; font-weight: 600;
    padding: 3px 8px; border-radius: 10px;
    display: inline-block;
}
/* Color variants for recap pills */
.c2-rp-green  { background: rgba(0,230,118,0.12); color: var(--green); border: 1px solid rgba(0,230,118,0.25); }
.c2-rp-blue   { background: rgba(59,130,246,0.12); color: var(--blue); border: 1px solid rgba(59,130,246,0.25); }
.c2-rp-violet { background: rgba(124,58,237,0.12); color: var(--violet); border: 1px solid rgba(124,58,237,0.25); }
.c2-rp-orange { background: rgba(249,115,22,0.12); color: var(--orange); border: 1px solid rgba(249,115,22,0.25); }
.c2-rp-pink   { background: rgba(244,114,182,0.12); color: var(--pink); border: 1px solid rgba(244,114,182,0.25); }

/* Auth count badge (shows cumulative distinct count) */
.c2-auth-count {
    position: absolute; bottom: 8%; left: 50%;
    transform: translateX(-50%);
    text-align: center; z-index: 16;
    opacity: 0;
    transition: opacity 0.4s;
}
.c2-auth-count.show { opacity: 1; }
.c2-auth-count-num {
    font-size: 3rem; font-weight: 900;
    font-family: 'Courier New', monospace;
    color: var(--red);
}
.c2-auth-count-lbl {
    font-size: 0.9rem; color: var(--gray);
}

/* ── Dark overlay (step 4) ─────────────────────────────────── */
.c2-overlay {
    position: absolute; top: 0; left: 0; width: 100%; height: 100%;
    background: rgba(0, 0, 0, 0.85);
    opacity: 0;
    transition: opacity 0.8s ease;
    z-index: 25;
    pointer-events: none;
}
.c2-overlay.show { opacity: 1; }

/* ── Final narrative lines (over overlay) ──────────────────── */
.c2-final {
    position: absolute; top: 0; left: 0; width: 100%; height: 100%;
    display: flex; flex-direction: column;
    align-items: center; justify-content: center;
    gap: 0.5em;
    z-index: 30;
    pointer-events: none;
}
.c2-final-line {
    opacity: 0; transform: translateY(20px);
    transition: opacity 0.6s cubic-bezier(.16,1,.3,1), transform 0.6s cubic-bezier(.16,1,.3,1);
    font-family: 'Courier New', monospace;
    text-align: center;
}
.c2-final-line.show { opacity: 1; transform: translateY(0); }
.c2-fl-big {
    font-size: 2.5rem; font-weight: 900; color: #fff;
    text-shadow: 0 0 30px rgba(255,255,255,0.3);
}
.c2-fl-warning {
    font-size: 1.8rem; font-weight: 700;
    color: var(--orange);
    text-shadow: 0 0 25px rgba(249,115,22,0.4);
}
.c2-fl-danger {
    font-size: 1.8rem; font-weight: 700;
    color: var(--red);
    text-shadow: 0 0 30px rgba(239,68,68,0.5);
}

/* ── Admin counter (Act 3) ─────────────────────────────────── */
.c2-admin-counter {
    position: absolute; top: 20px; left: 20px;
    display: flex; align-items: center; gap: 8px;
    background: var(--bg2); border: 1px solid var(--border); border-radius: 10px;
    padding: 10px 16px;
    font-family: 'Courier New', monospace;
    z-index: 20; opacity: 0; transform: translateX(-20px);
    transition: opacity 0.5s, transform 0.5s;
}
.c2-admin-counter.show { opacity: 1; transform: translateX(0); }
.c2-admin-counter-icon { font-size: 1.4rem; }
.c2-admin-counter-num {
    font-size: 1.8rem; font-weight: 900; color: var(--cyan);
    min-width: 2ch;
    transition: color 0.3s;
}
.c2-admin-counter.warn .c2-admin-counter-num { color: var(--orange); }
.c2-admin-counter.danger .c2-admin-counter-num { color: var(--red); }
.c2-admin-counter-lbl {
    font-size: 0.75rem; color: var(--gray); max-width: 80px;
}

/* ── Admin stick figures ───────────────────────────────────── */
/* Admins are KEY ACTORS — positioned mid-lower screen, overlapping columns */
.c2-admins {
    position: absolute; top: 26%; left: 2%; right: 2%;
    height: 80px;
    z-index: 28;
    pointer-events: none;
}
.c2-admin {
    position: absolute; bottom: 0;
    opacity: 0; transform: translateY(30px);
    transition: opacity 0.5s cubic-bezier(.16,1,.3,1), transform 0.5s cubic-bezier(.16,1,.3,1);
    /* Glow aura — colored per admin via inline color */
    filter: drop-shadow(0 0 8px currentColor) drop-shadow(0 0 3px currentColor);
}
.c2-admin.show { opacity: 1; transform: translateY(0); }
.c2-admin svg { width: 35px; height: 55px; }
.c2-admin.flip svg { transform: scaleX(-1); }

/* Reaction bubbles — large, bold, clearly visible */
.c2-admin-bubble {
    position: absolute; top: -30px; left: 50%;
    transform: translateX(-50%);
    font-size: 1.6rem; font-weight: 900;
    color: inherit;
    opacity: 0;
    transition: opacity 0.3s;
    white-space: nowrap;
    text-shadow: 0 0 10px currentColor;
}
.c2-admin-bubble.show { opacity: 1; }

/* Idle: gentle bob, visible sway */
@keyframes c2-bob {
    0%, 100% { transform: translateY(0); }
    50% { transform: translateY(-6px); }
}
.c2-admin.idle.show { animation: c2-bob 2s ease-in-out 0.3s infinite; }

/* Running: wide lateral movement */
@keyframes c2-run {
    0%, 100% { transform: translateX(0) translateY(0); }
    50% { transform: translateX(14px) translateY(-4px); }
}
.c2-admin.running.show { animation: c2-run 0.6s ease-in-out 0.3s infinite; }

/* Frozen: maximum glow, no movement */
.c2-admin.frozen {
    animation: none !important;
    filter: drop-shadow(0 0 10px currentColor) drop-shadow(0 0 20px currentColor) drop-shadow(0 0 4px currentColor);
    transform: translateY(0) !important;
    opacity: 1 !important;
}

/* ── Title cards (inter-act transitions) ─────────────────── */
.c2-titlecard {
    position: absolute; top: 0; left: 0; width: 100%; height: 100%;
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    z-index: 35; pointer-events: none;
    opacity: 0; transition: opacity 0.6s;
}
.c2-titlecard.show { opacity: 1; }
.c2-tc-year {
    font-size: 5rem; font-weight: 900;
    font-family: 'Courier New', monospace;
    letter-spacing: -3px;
    color: var(--orange);
    text-shadow: 0 0 40px rgba(249,115,22,0.5), 0 0 80px rgba(249,115,22,0.2);
}
.c2-tc-sub {
    font-size: 1.6rem; font-weight: 300; color: var(--gray);
    margin-top: 0.3em;
    opacity: 0; transition: opacity 0.5s 0.4s;
}
.c2-titlecard.show .c2-tc-sub { opacity: 1; }

/* ── Stats panel (Act 3, top-right) ──────────────────────── */
.c2-stats {
    position: absolute; top: 20px; right: 20px;
    background: var(--bg2); border: 1px solid var(--border); border-radius: 10px;
    padding: 14px 18px;
    font-family: 'Courier New', monospace; font-size: 0.85rem;
    z-index: 20;
    opacity: 0; transform: translateX(20px);
    transition: opacity 0.5s, transform 0.5s;
}
.c2-stats.show { opacity: 1; transform: translateX(0); }
.c2-stat-line {
    padding: 4px 0; white-space: nowrap;
    display: flex; justify-content: space-between; gap: 12px;
}
.c2-stat-label { color: var(--gray); }
.c2-stat-val { font-weight: 700; min-width: 60px; text-align: right; }
.c2-stat-val.warn { color: var(--orange); text-shadow: 0 0 10px rgba(249,115,22,0.3); }
.c2-stat-val.danger { color: var(--red); text-shadow: 0 0 10px rgba(239,68,68,0.3); }
.c2-stat-val.ok { color: var(--green); text-shadow: 0 0 10px rgba(0,230,118,0.3); }
@keyframes c2-stat-flash {
    0%   { filter: brightness(1); }
    50%  { filter: brightness(2); }
    100% { filter: brightness(1); }
}
.c2-stats.flash { animation: c2-stat-flash 0.4s ease-out; }

/* ── Floating credential tags (Act 3) ────────────────────── */
/* KEY NARRATIVE ELEMENT — shows proliferation of auth methods.
 * Must be clearly readable, large, colorful, and eye-catching. */
.c2-cred-tags {
    position: absolute; top: 0; left: 0; width: 100%; height: 100%;
    z-index: 12; pointer-events: none; overflow: hidden;
}
.c2-cred-tag {
    position: absolute;
    font-size: 0.85rem; font-weight: 700;
    font-family: 'Courier New', monospace;
    padding: 6px 14px; border-radius: 10px;
    min-width: 100px; text-align: center;
    border: 1.5px solid;
    opacity: 0;
    animation: c2-tag-pop 0.5s cubic-bezier(.16,1,.3,1) forwards,
               c2-tag-float var(--float-dur, 3s) ease-in-out var(--float-delay, 0.6s) infinite alternate;
}
/* Color variants — set by JS via data-color attribute */
.c2-cred-tag[data-color="green"] {
    background: rgba(0,230,118,0.12); border-color: rgba(0,230,118,0.35);
    color: var(--green); text-shadow: 0 0 8px rgba(0,230,118,0.2);
}
.c2-cred-tag[data-color="blue"] {
    background: rgba(59,130,246,0.12); border-color: rgba(59,130,246,0.35);
    color: var(--blue); text-shadow: 0 0 8px rgba(59,130,246,0.2);
}
.c2-cred-tag[data-color="violet"] {
    background: rgba(124,58,237,0.12); border-color: rgba(124,58,237,0.35);
    color: var(--violet); text-shadow: 0 0 8px rgba(124,58,237,0.2);
}
.c2-cred-tag[data-color="orange"] {
    background: rgba(249,115,22,0.12); border-color: rgba(249,115,22,0.35);
    color: var(--orange); text-shadow: 0 0 8px rgba(249,115,22,0.2);
}
.c2-cred-tag[data-color="pink"] {
    background: rgba(244,114,182,0.12); border-color: rgba(244,114,182,0.35);
    color: var(--pink); text-shadow: 0 0 8px rgba(244,114,182,0.2);
}
.c2-cred-tag[data-color="cyan"] {
    background: rgba(0,230,255,0.12); border-color: rgba(0,230,255,0.35);
    color: var(--cyan); text-shadow: 0 0 8px rgba(0,230,255,0.2);
}

/* Pop-in: scale from 0 → 1.1 → 1 with glow flash */
@keyframes c2-tag-pop {
    0%   { opacity: 0; transform: scale(0); }
    60%  { opacity: 1; transform: scale(1.12); }
    100% { opacity: 1; transform: scale(1); }
}
/* Gentle organic float (each tag gets a different --float-dur and --float-delay) */
@keyframes c2-tag-float {
    0%   { transform: translateY(0); }
    100% { transform: translateY(-6px); }
}

/* ── Admin label (placard above admin, e.g. Excel filename) ── */
.c2-admin-label {
    position: absolute; top: -44px; left: 50%;
    transform: translateX(-50%);
    font-size: 0.75rem; font-weight: 700;
    font-family: 'Courier New', monospace;
    color: var(--yellow);
    white-space: nowrap;
    opacity: 0; transition: opacity 0.4s;
    background: rgba(0,0,0,0.8);
    border: 1px solid rgba(234,179,8,0.4);
    padding: 4px 10px; border-radius: 5px;
    text-shadow: 0 0 8px rgba(234,179,8,0.4);
    box-shadow: 0 0 12px rgba(234,179,8,0.15);
}
.c2-admin-label.show { opacity: 1; }

/* ── Post-it notes (floating from admins) ────────────────── */
@keyframes c2-postit-float {
    0%   { opacity: 0; transform: translateY(0) rotate(0deg); }
    15%  { opacity: 1; }
    100% { opacity: 0; transform: translateY(-120px) rotate(15deg) translateX(30px); }
}
.c2-postit {
    position: absolute;
    width: 24px; height: 24px;
    background: var(--yellow); border-radius: 2px;
    opacity: 0;
    z-index: 29;
    box-shadow: 0 0 8px rgba(234,179,8,0.3);
    animation: c2-postit-float 3s ease-out forwards;
}

/* ── Act 4: Red overlay variant ──────────────────────────── */
.c2-overlay.red {
    background: radial-gradient(ellipse at center, rgba(40,0,0,0.85) 0%, rgba(20,0,0,0.95) 100%);
}

/* ── Act 4: Spotlight container ──────────────────────────── */
.c2-spotlights {
    position: absolute; top: 0; left: 0; width: 100%; height: 100%;
    z-index: 32; pointer-events: none;
}

/* Spotlight card */
.c2-spotlight {
    position: absolute;
    width: 340px; max-width: 80vw;
    padding: 28px;
    background: var(--bg2);
    border: 1px solid rgba(239,68,68,0.4);
    border-radius: 14px;
    box-shadow: 0 0 40px rgba(239,68,68,0.15);
    opacity: 0; transform: scale(0.85);
    transition: opacity 0.6s cubic-bezier(.16,1,.3,1), transform 0.6s cubic-bezier(.16,1,.3,1);
}
.c2-spotlight.show { opacity: 1; transform: scale(1); }
.c2-spotlight-icon {
    font-size: 2.2rem; margin-bottom: 10px;
}
.c2-spotlight h4 {
    font-size: 1.2rem; font-weight: 700; color: var(--red);
    margin-bottom: 8px;
    text-shadow: 0 0 15px rgba(239,68,68,0.3);
}
.c2-spotlight p {
    font-size: 0.95rem; color: var(--gray); line-height: 1.5;
    margin: 0;
}

/* Spotlight glow ring (CSS circle expanding behind card) */
.c2-spot-ring {
    position: absolute;
    border-radius: 50%;
    border: 2px solid rgba(239,68,68,0.3);
    box-shadow: 0 0 30px rgba(239,68,68,0.15), inset 0 0 30px rgba(239,68,68,0.05);
    width: 0; height: 0;
    transition: width 0.8s cubic-bezier(.16,1,.3,1), height 0.8s cubic-bezier(.16,1,.3,1);
    transform: translate(-50%, -50%);
    pointer-events: none;
}
.c2-spot-ring.expand {
    width: 380px; height: 380px;
}

/* ── Act 5: Portal effect ────────────────────────────────── */
.c2-portal {
    position: absolute; top: 50%; left: 50%;
    width: 0; height: 0;
    border-radius: 50%;
    background: radial-gradient(circle, rgba(0,230,255,0.3) 0%, rgba(249,115,22,0.15) 50%, transparent 70%);
    box-shadow: 0 0 60px rgba(0,230,255,0.4), 0 0 120px rgba(249,115,22,0.2);
    transform: translate(-50%, -50%);
    z-index: 35;
    transition: width 1.5s cubic-bezier(.16,1,.3,1), height 1.5s cubic-bezier(.16,1,.3,1),
                opacity 0.8s;
    pointer-events: none;
}
.c2-portal.expand {
    width: 200vmax; height: 200vmax;
}
.c2-portal.stable {
    width: 140px; height: 140px;
    background: radial-gradient(circle, rgba(0,230,255,0.2) 0%, transparent 70%);
    box-shadow: 0 0 40px rgba(0,230,255,0.3);
}

/* Chaos elements sucked in */
.c2-columns.suck {
    transition: transform 1.2s cubic-bezier(.7,0,.3,1), opacity 1s !important;
    transform: scale(0) !important;
    opacity: 0 !important;
}
.c2-stats.suck, .c2-cred-tags.suck, .c2-counter.suck, .c2-admins.suck, .c2-admin-counter.suck {
    transition: transform 1.2s cubic-bezier(.7,0,.3,1), opacity 1s !important;
    transform: scale(0) !important;
    opacity: 0 !important;
}

/* ── Act 5: Teleport Architecture Diagram ─────────────────── */
/* Full 3-column architecture: Users | Teleport Core | Resources+Agents
 * Must contrast with chaos: clean, organized, professional. */
.c2-tp-hub {
    position: absolute; top: 0; left: 0; width: 100%; height: 100%;
    z-index: 36; pointer-events: none;
    opacity: 0; transition: opacity 0.8s;
}
.c2-tp-hub.show { opacity: 1; }

/* 3-column grid layout */
.c2-tp-grid {
    position: absolute; top: 5%; left: 3%; right: 3%; bottom: 15%;
    display: grid;
    grid-template-columns: 160px 1fr 180px;
    grid-template-rows: 1fr auto;
    gap: 0;
    align-items: start;
}

/* ── Left column: Users ── */
.c2-tp-users {
    grid-column: 1; grid-row: 1;
    display: flex; flex-direction: column; gap: 10px;
    justify-content: center; height: 100%;
    padding-right: 10px;
}
.c2-tp-user {
    display: flex; align-items: center; gap: 8px;
    background: var(--bg3); border: 1px solid var(--border);
    border-radius: 8px; padding: 8px 10px;
    opacity: 0; transform: translateX(-30px);
    transition: opacity 0.5s cubic-bezier(.16,1,.3,1), transform 0.5s cubic-bezier(.16,1,.3,1);
}
.c2-tp-user.show { opacity: 1; transform: translateX(0); }
.c2-tp-user-icon {
    font-size: 1.1rem; flex-shrink: 0;
}
.c2-tp-user-label {
    font-size: 0.85rem; font-weight: 600; color: var(--gray);
    font-family: 'Courier New', monospace;
    line-height: 1.2;
}

/* ── Center: Teleport Core Box ── */
.c2-tp-core {
    grid-column: 2; grid-row: 1;
    display: flex; flex-direction: column; align-items: center;
    justify-content: center; height: 100%;
    padding: 0 20px;
}
.c2-tp-core-box {
    border: 2px solid rgba(81,47,201,0.4);
    border-radius: 14px;
    padding: 16px 20px;
    background: rgba(81,47,201,0.05);
    box-shadow: 0 0 30px rgba(81,47,201,0.1), inset 0 0 20px rgba(81,47,201,0.03);
    width: 100%; max-width: 420px;
    opacity: 0; transform: scale(0.85);
    transition: opacity 0.8s cubic-bezier(.16,1,.3,1), transform 0.8s cubic-bezier(.16,1,.3,1);
}
.c2-tp-core-box.show {
    opacity: 1; transform: scale(1);
}
@keyframes c2-core-pulse {
    0%, 100% { box-shadow: 0 0 30px rgba(81,47,201,0.1), inset 0 0 20px rgba(81,47,201,0.03); }
    50%      { box-shadow: 0 0 40px rgba(81,47,201,0.2), inset 0 0 25px rgba(81,47,201,0.06); }
}
.c2-tp-core-box.pulse { animation: c2-core-pulse 3s ease-in-out infinite; }

/* Logo above the core box */
.c2-tp-logo {
    display: flex; align-items: center; justify-content: center; gap: 10px;
    text-align: center;
    margin-bottom: 10px;
}
.c2-tp-logo img {
    width: 36px; height: 36px;
    filter: drop-shadow(0 0 12px rgba(81,47,201,0.5));
}
.c2-tp-logo span {
    font-size: 1.8rem; font-weight: 900;
    font-family: 'Courier New', monospace;
    color: var(--teleport);
    text-shadow: 0 0 20px rgba(81,47,201,0.4);
    letter-spacing: 3px;
}

/* Sub-components inside core box */
.c2-tp-comp {
    background: var(--bg2); border: 1px solid var(--border);
    border-radius: 8px; padding: 10px 14px;
    margin-bottom: 8px;
    opacity: 0; transform: translateY(10px);
    transition: opacity 0.4s cubic-bezier(.16,1,.3,1), transform 0.4s cubic-bezier(.16,1,.3,1);
}
.c2-tp-comp:last-child { margin-bottom: 0; }
.c2-tp-comp.show { opacity: 1; transform: translateY(0); }
.c2-tp-comp-name {
    font-size: 0.95rem; font-weight: 700; color: var(--teleport);
    font-family: 'Courier New', monospace;
    margin-bottom: 3px;
}
.c2-tp-comp-desc {
    font-size: 0.8rem; color: var(--gray);
    font-family: 'Courier New', monospace;
}

/* ── Right column: Resources with Agents ── */
.c2-tp-resources {
    grid-column: 3; grid-row: 1;
    display: flex; flex-direction: column; gap: 8px;
    justify-content: center; height: 100%;
    padding-left: 10px;
}
.c2-tp-res {
    display: flex; align-items: center; gap: 8px;
    background: var(--bg3); border-radius: 8px;
    padding: 7px 10px;
    border-left: 3px solid;
    opacity: 0; transform: translateX(30px);
    transition: opacity 0.5s cubic-bezier(.16,1,.3,1), transform 0.5s cubic-bezier(.16,1,.3,1);
}
.c2-tp-res.show { opacity: 1; transform: translateX(0); }
.c2-tp-res-icon { font-size: 1rem; flex-shrink: 0; }
.c2-tp-res-info { flex: 1; min-width: 0; }
.c2-tp-res-name {
    font-size: 0.85rem; font-weight: 700;
    font-family: 'Courier New', monospace;
    line-height: 1.2;
}
.c2-tp-res-badge {
    display: inline-block;
    font-size: 0.5rem; font-weight: 700;
    padding: 1px 5px; border-radius: 3px;
    background: rgba(0,230,118,0.15); color: var(--green);
    border: 1px solid rgba(0,230,118,0.3);
    letter-spacing: 0.5px;
    text-transform: uppercase;
}
@keyframes c2-agent-glow {
    0%, 100% { box-shadow: 0 0 4px rgba(0,230,118,0.2); }
    50%      { box-shadow: 0 0 8px rgba(0,230,118,0.4); }
}
.c2-tp-res-badge.glow { animation: c2-agent-glow 2s ease-in-out infinite; }

/* Color variants for resource blocks */
.c2-tp-res[data-color="green"]  { border-left-color: var(--green); }
.c2-tp-res[data-color="green"]  .c2-tp-res-name { color: var(--green); }
.c2-tp-res[data-color="blue"]   { border-left-color: var(--blue); }
.c2-tp-res[data-color="blue"]   .c2-tp-res-name { color: var(--blue); }
.c2-tp-res[data-color="violet"] { border-left-color: var(--violet); }
.c2-tp-res[data-color="violet"] .c2-tp-res-name { color: var(--violet); }
.c2-tp-res[data-color="orange"] { border-left-color: var(--orange); }
.c2-tp-res[data-color="orange"] .c2-tp-res-name { color: var(--orange); }
.c2-tp-res[data-color="pink"]   { border-left-color: var(--pink); }
.c2-tp-res[data-color="pink"]   .c2-tp-res-name { color: var(--pink); }

/* ── Flow labels (small labels on connection lines) ── */
.c2-tp-flow-label {
    position: absolute;
    font-size: 0.55rem; font-weight: 600;
    font-family: 'Courier New', monospace;
    color: var(--gray); background: var(--bg);
    padding: 1px 6px; border-radius: 3px;
    white-space: nowrap;
    opacity: 0; transition: opacity 0.5s;
}
.c2-tp-flow-label.show { opacity: 1; }

/* ── Gains summary (below diagram) ── */
.c2-tp-gains {
    grid-column: 1 / -1; grid-row: 2;
    display: flex; gap: 20px; justify-content: center;
    flex-wrap: wrap;
    padding-top: 12px;
}
.c2-tp-gain {
    font-family: 'Courier New', monospace;
    font-size: 0.95rem;
    text-align: center;
    opacity: 0; transform: translateY(10px);
    transition: opacity 0.4s cubic-bezier(.16,1,.3,1), transform 0.4s cubic-bezier(.16,1,.3,1);
}
.c2-tp-gain.show { opacity: 1; transform: translateY(0); }
.c2-tp-gain-label {
    color: var(--gray); margin-bottom: 3px;
}
.c2-tp-gain-before {
    color: var(--red); text-decoration: line-through;
    font-weight: 600; opacity: 0.7;
}
.c2-tp-gain-arrow { color: var(--gray); margin: 0 4px; }
.c2-tp-gain-after {
    color: var(--green); font-weight: 700;
    text-shadow: 0 0 8px rgba(0,230,118,0.3);
}

/* ── Act 6: Closing ──────────────────────────────────────── */
.c2-closing {
    position: absolute; top: 0; left: 0; width: 100%; height: 100%;
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 1.5em; z-index: 40;
    opacity: 0; transition: opacity 0.8s;
    pointer-events: none;
}
.c2-closing.show { opacity: 1; pointer-events: auto; }
.c2-closing-logo {
    display: flex; align-items: center; justify-content: center; gap: 16px;
}
.c2-closing-logo img {
    width: 64px; height: 64px;
    filter: drop-shadow(0 0 25px rgba(81,47,201,0.6)) drop-shadow(0 0 50px rgba(81,47,201,0.3));
}
.c2-closing-logo span {
    font-size: 3rem; font-weight: 900; color: var(--teleport);
    font-family: 'Courier New', monospace;
    text-shadow: 0 0 40px rgba(81,47,201,0.4), 0 0 80px rgba(81,47,201,0.15);
}
.c2-closing-tagline {
    font-size: 1.5rem; font-weight: 300; color: var(--gray);
    font-family: 'Courier New', monospace;
    border-right: 2px solid var(--teleport);
    padding-right: 4px;
    min-height: 1.8em;
}
@keyframes c2-blink { 50% { border-color: transparent; } }
.c2-closing-tagline.typing { animation: c2-blink 0.7s step-end infinite; }
.c2-closing-tagline.done { border-color: transparent; }
.c2-closing-replay {
    background: none; border: 1px solid var(--cyan); border-radius: 8px;
    color: var(--cyan); padding: 10px 24px;
    font-size: 1rem; font-weight: 600;
    font-family: 'Courier New', monospace;
    cursor: pointer;
    opacity: 0; transition: opacity 0.5s;
}
.c2-closing-replay.show { opacity: 1; }
.c2-closing-replay:hover { background: rgba(0,230,255,0.1); }

/* ===== SLIDE 3: MULTIPLICATION ===================================================
 * Visual equation: Resources × Environments × Access = CHAOS
 * Uses .mult-box for each group, .pill for colored tags, .mult-op for × symbols.
 * Standard .r/data-step reveal: each group appears on a separate step.
 * .pill variants: .g (green), .b (blue), .v (violet), .o (orange), .rd (red)
 * =============================================================================== */
.mult-row {
    display: flex; align-items: center; gap: 20px; flex-wrap: wrap; justify-content: center;
}
.mult-box {
    background: var(--bg3); border: 1px solid var(--border); border-radius: 16px;
    padding: 24px 28px; text-align: center; min-width: 180px;
}
.mult-box h3 { font-size: 1.1rem; color: var(--gray); margin-bottom: 14px; text-transform: uppercase; letter-spacing: 1px; }
.pill {
    display: inline-block; padding: 6px 16px; border-radius: 20px;
    font-size: 1rem; font-weight: 600; margin: 3px;
}
.pill.g { background: rgba(0,230,118,0.12); color: var(--green); border: 1px solid rgba(0,230,118,0.25); }
.pill.b { background: rgba(59,130,246,0.12); color: var(--blue); border: 1px solid rgba(59,130,246,0.25); }
.pill.v { background: rgba(124,58,237,0.12); color: var(--violet); border: 1px solid rgba(124,58,237,0.25); }
.pill.o { background: rgba(249,115,22,0.12); color: var(--orange); border: 1px solid rgba(249,115,22,0.25); }
.pill.rd { background: rgba(239,68,68,0.12); color: var(--red); border: 1px solid rgba(239,68,68,0.25); }
.mult-op { font-size: 4rem; font-weight: 200; color: var(--gray); }
.mult-result { text-align: center; }
.mult-result .big { font-size: 5.5rem; font-weight: 900; color: var(--red); letter-spacing: -3px; animation: shake 0.5s ease-in-out; }
.mult-result .lbl { font-size: 1.15rem; color: var(--gray); margin-top: 4px; }

/* ===== SLIDE 4: RISKS ============================================================
 * 2×2 grid of risk cards. Extends .card with red accent + danger hover animation.
 * Uses --card-accent/--card-glow CSS custom props to override card defaults.
 * =============================================================================== */
.risk-grid {
    display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px;
    width: 100%; max-width: 900px;
}
.risk-card {
    --card-accent: var(--red); --card-glow: rgba(239,68,68,0.12);
    text-align: left;
}
.risk-card:hover { animation: pulse-border 1.5s infinite; }
.risk-card .risk-icon { font-size: 3rem; margin-bottom: 10px; }
.risk-card h3 { color: var(--red); }

/* ===== SLIDE 5: PUNCHLINE ========================================================
 * Two-line statement with gradient divider between them.
 * Line 1: muted gray (the "obvious" part). Line 2: green gradient (the insight).
 * =============================================================================== */
.punch { max-width: 850px; }
.punch .l1 {
    font-size: 2.6rem; font-weight: 400; color: var(--gray); margin-bottom: 24px;
}
.punch .divider {
    width: 100px; height: 3px; margin: 0 auto 24px;
    background: linear-gradient(90deg, var(--green), var(--cyan));
}
.punch .l2 {
    font-size: 3.5rem; font-weight: 800; line-height: 1.3;
    background: linear-gradient(135deg, var(--green), var(--cyan));
    -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
}

/* ===== SLIDE 6: TELEPORT =========================================================
 * Protocol list — vertical stack of .proto-row items with colored left accent bar.
 * Hover slides row 8px right + green border highlight.
 * =============================================================================== */
.proto-list {
    display: flex; flex-direction: column; gap: 12px;
    width: 100%; max-width: 800px;
}
.proto-row {
    display: flex; align-items: center; gap: 16px; padding: 16px 20px;
    background: var(--bg3); border: 1px solid var(--border); border-radius: 12px;
    text-align: left; transition: all 0.3s;
}
.proto-row:hover { border-color: var(--green); transform: translateX(8px); }
.proto-accent {
    width: 4px; height: 40px; border-radius: 2px; flex-shrink: 0;
}
.proto-row h3 { font-size: 1.25rem; margin-bottom: 2px; }
.proto-row p { font-size: 1.05rem; color: var(--gray); }

/* ===== SLIDE 11: TELEPORT PRESENTATION ==========================================
 * Static info slide with hero + 4 cards + timeline.
 * Standard .r/data-step reveal system, no custom animation.
 * =============================================================================== */

.tp-info {
    display: flex; flex-direction: column; align-items: center;
    gap: 18px; padding-top: 24px; padding-bottom: 20px;
}

/* ── Hero section ── */
.tp-hero { text-align: center; margin-bottom: 4px; }
.tp-hero-brand {
    display: flex; align-items: center; justify-content: center; gap: 18px;
    margin-bottom: 10px;
}
.tp-hero-logo {
    width: 64px; height: 64px;
    filter: drop-shadow(0 0 20px rgba(81,47,201,0.5));
    animation: tpLogoPulse 3s ease-in-out infinite;
}
@keyframes tpLogoPulse {
    0%, 100% { filter: drop-shadow(0 0 20px rgba(81,47,201,0.5)); }
    50% { filter: drop-shadow(0 0 30px rgba(81,47,201,0.7)); }
}
.tp-hero-title {
    font-family: 'Courier New', monospace;
    font-size: 3rem; font-weight: 800; letter-spacing: 8px;
    background: linear-gradient(135deg, var(--teleport), var(--violet));
    -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
}
.tp-hero-tagline {
    font-size: 1.1rem; color: var(--white); font-style: italic;
    max-width: 700px; margin: 0 auto 6px;
    line-height: 1.5; opacity: 0.9;
}
.tp-hero-subtitle {
    font-size: 0.95rem; color: var(--gray); max-width: 650px; margin: 0 auto;
    line-height: 1.4;
}

/* ── Cards grid ── */
.tp-cards {
    display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px;
    width: 100%; max-width: 1100px;
}
.tp-card {
    background: var(--bg3); border: 1px solid var(--border); border-radius: 12px;
    padding: 16px 18px; text-align: left;
    transition: all 0.4s cubic-bezier(.16,1,.3,1);
}
.tp-card:hover {
    border-color: rgba(81,47,201,0.4);
    transform: translateY(-3px);
    box-shadow: 0 8px 30px rgba(81,47,201,0.1);
}
.tp-card-head {
    display: flex; align-items: center; gap: 10px; margin-bottom: 10px;
}
.tp-card-icon { font-size: 1.6rem; flex-shrink: 0; }
.tp-card-title {
    font-family: 'Courier New', monospace;
    font-size: 1rem; font-weight: 700; color: var(--cyan);
    letter-spacing: 0.5px;
}
.tp-card-body { font-size: 0.85rem; color: var(--gray); line-height: 1.55; }
.tp-card-body ul {
    list-style: none; padding: 0; margin: 0;
    display: flex; flex-direction: column; gap: 3px;
}
.tp-card-body li::before {
    content: "›"; color: var(--cyan); margin-right: 6px; font-weight: 700;
}
.tp-card-body p { margin: 0 0 8px; }
.tp-quote {
    margin: 8px 0 0; padding: 8px 12px;
    border-left: 3px solid var(--teleport);
    background: rgba(81,47,201,0.06);
    border-radius: 0 6px 6px 0;
    font-style: italic; font-size: 0.82rem; color: var(--white);
    line-height: 1.5;
}
.tp-quote cite {
    display: block; margin-top: 4px;
    font-style: normal; font-size: 0.75rem; color: var(--gray);
}

/* ── Timeline ── */
.tp-timeline {
    display: flex; align-items: flex-start; gap: 0;
    width: 100%; max-width: 1100px;
    padding: 10px 0; position: relative;
    overflow-x: auto;
}
.tp-timeline::before {
    content: ''; position: absolute; top: 8px; left: 0; right: 0;
    height: 2px; background: var(--border); z-index: 0;
}
.tp-milestone {
    flex: 1; min-width: 90px; text-align: center;
    position: relative; padding-top: 22px; z-index: 1;
}
.tp-ms-dot {
    position: absolute; top: 2px; left: 50%; transform: translateX(-50%);
    width: 12px; height: 12px; border-radius: 50%;
    background: var(--teleport); border: 2px solid var(--bg);
    box-shadow: 0 0 8px rgba(81,47,201,0.4);
}
.tp-ms-year {
    font-family: 'Courier New', monospace;
    font-size: 0.8rem; font-weight: 800; color: var(--cyan);
    margin-bottom: 2px;
}
.tp-ms-text {
    font-size: 0.68rem; color: var(--gray); line-height: 1.35;
    padding: 0 4px;
}

/* ===== SLIDE 7: ARCHITECTURE ANIMATED ============================================
 * The most complex slide — 9-step animated architecture diagram.
 * Custom type: 'arch' in slides[]. Fully JS-driven animation.
 *
 * WORLD STRUCTURE:
 *   .arch-world          ← transformable container (camera target)
 *       #archCanvas      ← <canvas> for particles, paths, ripples (z:1)
 *       .abox            ← positioned architecture boxes (z:2)
 *       .a-label         ← floating labels (z:5)
 *       .a-cert          ← certificate emoji animation (z:6)
 *
 *   (outside .arch-world, positioned fixed — not affected by camera):
 *       .a-flowstep      ← bottom-left step indicator
 *       .a-subtitle      ← bottom-center subtitle text
 *       .a-legend        ← bottom-right color legend
 *
 * CAMERA SYSTEM:
 *   .arch-world uses transform: translate(X%, Y%) scale(S)
 *   with transform-origin: 0 0.
 *
 *   JS computes bounding box of "active" elements (from the AL layout object),
 *   then calculates translate + scale to center that bbox in the viewport.
 *   Transition: 1.2s cubic-bezier(0.4,0,0.2,1) — smooth cinematic pan+zoom.
 *
 *   Camera presets per step:
 *     Step 0: zoom on terminal
 *     Step 1: terminal + proxy
 *     Step 2: proxy + IdP
 *     Step 3: proxy + auth → then zoom out to include terminal
 *     Step 4: all resources (wide shot)
 *     Step 5: terminal + proxy + SSH (focused)
 *     Step 6: SSH → then zoom out to include S3
 *     Step 7: S3 + audit
 *     Step 8: everything (recap wide shot)
 *
 * LAYOUT (AL object in JS):
 *   All .abox positions are in % of .arch-world (left/top/width/height).
 *   This keeps the layout responsive and allows camera math in % space.
 *   The AL object maps keys to {l, t, w, h} rectangles:
 *     term (1%, 22%), proxy (36%, 20%), idp (37.5%, 1%), auth (37.5%, 75%),
 *     ssh/k8s/db/web (68%, stacked), s3 (15%, 87%), audit (45%, 85%)
 *
 * CANVAS ANIMATION (particles + paths):
 *   - Bezier curves defined between box centers/edges (AP paths object)
 *   - APart: particle that travels along a Bezier curve with trailing tail
 *   - ARipple: expanding circle at connection endpoints
 *   - Dashed animated paths: ctx.setLineDash + archDashOff for flowing effect
 *   - Arrows: triangular arrowheads at 90% of each path
 *   - spawnAP(): spawns N particles with staggered delays
 *
 * ANIMATION SEQUENCE (9 keypresses):
 *   Step 0: Terminal appears, types "tsh login" command
 *   Step 1: Proxy lights up, TLS path + particles flow term→proxy
 *   Step 2: IdP lights up, OIDC auth flow (proxy↔IdP)
 *   Step 3: Auth signs X.509 cert, cert emoji pops, cert flows back to terminal
 *   Step 4: All 4 resource boxes appear with reverse tunnel arrows
 *   Step 5: Focus on SSH — others dim, types "tsh ssh" command
 *   Step 6: Session recording → S3 bucket, rec counter
 *   Step 7: Audit log → DynamoDB, log lines appear one by one
 *   Step 8: Recap — all 3 flows visible (data, recording, audit) + legend
 *
 * COLOR CODING:
 *   Cyan (#22d3ee)   — SSH data flow, proxy, TLS
 *   Violet (#a855f7) — Identity/auth flow, IdP, audit events
 *   Green (#00e676)  — Certificates, auth service
 *   Orange (#f97316) — Resources, agents, reverse tunnels, session recording
 *
 * .abox STATES:
 *   default     — opacity: 0.15 (ghosted, visible but inactive)
 *   .a-active   — opacity: 1 (highlighted, participating in current step)
 *   .a-dimmed   — opacity: 0.12 + grayscale (explicitly de-emphasized)
 *   .a-ssh-hl   — cyan border + glow (SSH focus highlight)
 * =============================================================================== */
.arch-world {
    position: absolute; top: 0; left: 0; width: 100%; height: 120%;
    transform-origin: 0 0;
    transition: transform 1.2s cubic-bezier(0.4, 0, 0.2, 1);
    will-change: transform;
}
#archCanvas { position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 1; }
.abox {
    position: absolute; border-radius: 14px;
    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
    transition: all 0.8s cubic-bezier(.16,1,.3,1); opacity: 0.15; z-index: 2;
}
.abox.a-active { opacity: 1; }
.abox h3 { font-size: 1.25rem; font-weight: 700; text-transform: uppercase; letter-spacing: 1px; }
.abox p { font-size: 1.05rem; color: var(--gray); text-align: center; }
.a-icon { font-size: 2.5rem; margin-bottom: 4px; }

/* Terminal — fake CLI window with title bar dots and monospace body.
 * JS types commands character by character (archTypeCmd function).
 * .at-cursor blinks via @keyframes blink (step-end for sharp on/off). */
.a-terminal {
    left: 1%; top: 22%; width: 17%; height: 42%;
    background: #0f1219; border: 1.5px solid var(--border);
    padding: 0; overflow: hidden; align-items: stretch; justify-content: flex-start;
}
.a-terminal.a-active { border-color: var(--cyan); box-shadow: 0 0 35px rgba(34,211,238,0.15); }
.at-bar { background: #1a1f2e; padding: 6px 10px; display: flex; gap: 5px; border-bottom: 1px solid var(--border); }
.at-dot { width: 7px; height: 7px; border-radius: 50%; display: inline-block; }
.at-body { padding: 12px; font-family: 'Courier New', monospace; font-size: 1.05rem; line-height: 2; color: #94a3b8; }
.at-prompt { color: var(--green); }
.at-cmd { color: var(--cyan); }
.at-success { color: var(--green); }
.at-cursor { display: inline-block; width: 8px; height: 14px; background: var(--cyan); animation: blink 1s step-end infinite; vertical-align: middle; margin-left: 2px; }

.a-proxy {
    left: 36%; top: 20%; width: 14%; height: 48%;
    background: linear-gradient(145deg, #0f172a, #1e293b); border: 2px solid #334155; padding: 16px;
}
.a-proxy.a-active { border-color: var(--cyan); box-shadow: 0 0 50px rgba(34,211,238,0.2); }
.a-proxy h3 { color: var(--cyan); }

.a-idp {
    left: 37.5%; top: 1%; width: 11%; height: 15%;
    background: linear-gradient(145deg, #1a0f2e, #2d1b4e); border: 2px solid #4c1d95; padding: 12px;
}
.a-idp.a-active { border-color: var(--violet); box-shadow: 0 0 40px rgba(124,58,237,0.25); }
.a-idp h3 { color: var(--violet); }

.a-auth {
    left: 37.5%; top: 75%; width: 11%; height: 15%;
    background: linear-gradient(145deg, #0f2922, #1a3f35); border: 2px solid #065f46; padding: 12px;
}
.a-auth.a-active { border-color: var(--green); box-shadow: 0 0 40px rgba(0,230,118,0.2); }
.a-auth h3 { color: var(--green); }

.a-internet {
    left: 22%; top: 40%; width: auto; height: auto;
    background: none; border: none; font-size: 1.1rem; color: #475569; letter-spacing: 2px; text-transform: uppercase;
}

.a-resource {
    width: 24%; height: 14%;
    background: linear-gradient(145deg, #1a1505, #2a2008); border: 1.5px solid #78350f;
    padding: 10px 16px; flex-direction: row; gap: 12px;
}
.a-resource.a-active { border-color: var(--orange); box-shadow: 0 0 30px rgba(249,115,22,0.2); }
.a-resource b { color: var(--orange); font-size: 1.25rem; }
.a-ssh { left: 68%; top: 4%; }
.a-k8s { left: 68%; top: 26%; }
.a-db { left: 68%; top: 48%; }
.a-web { left: 68%; top: 70%; }
.a-badge {
    font-size: 0.7rem; background: rgba(249,115,22,0.12); color: var(--orange);
    padding: 2px 8px; border-radius: 4px; border: 1px solid rgba(249,115,22,0.3); font-weight: 600;
}

/* Floating labels — positioned absolutely, toggled by archLbl() in JS.
 * Appear at fixed positions (archLabel1 left side, archLabel2 right side).
 * Content is set dynamically per step via textContent. */
.a-label {
    position: absolute; font-size: 1rem; font-weight: 600;
    padding: 4px 12px; border-radius: 6px;
    background: rgba(34,211,238,0.08); color: var(--cyan); border: 1px solid rgba(34,211,238,0.2);
    z-index: 5; opacity: 0; transition: opacity 0.5s; pointer-events: none; white-space: nowrap;
}
.a-label.show { opacity: 1; }
#archLabel1 { left: 22%; top: 38%; }
#archLabel2 { left: 55%; top: 80%; }

.a-reverse {
    position: absolute; left: 55%; top: 45%;
    font-size: 1.15rem; font-weight: 700; color: var(--orange);
    text-transform: uppercase; letter-spacing: 3px;
    z-index: 5; opacity: 0; transition: opacity 0.6s;
}
.a-reverse.show { opacity: 1; }
.a-reverse .arrows { display: inline-block; animation: flowLeft 1.2s ease-in-out infinite; margin-right: 6px; }
@keyframes flowLeft { 0%,100% { transform: translateX(0); } 50% { transform: translateX(-8px); } }

.a-cert {
    position: absolute; left: 42%; top: 69%; font-size: 2.5rem; z-index: 6;
    opacity: 0; transition: all 0.4s cubic-bezier(.16,1,.3,1);
    transform: scale(0) rotate(-20deg); filter: drop-shadow(0 0 15px rgba(0,230,118,0.6));
}
.a-cert.show { opacity: 1; transform: scale(1) rotate(0); }

.a-subtitle {
    position: absolute; bottom: 70px; left: 50%; transform: translateX(-50%);
    font-size: 1.15rem; color: var(--gray); z-index: 5;
    opacity: 0; transition: opacity 0.5s; white-space: nowrap;
}
.a-subtitle.show { opacity: 1; }

/* .abox visual states — used to focus attention on specific elements.
 * .a-dimmed: grays out boxes not relevant to the current step.
 * .a-ssh-hl: special cyan highlight for the SSH resource during focus. */
.abox.a-dimmed { opacity: 0.12 !important; filter: grayscale(0.8); transition: all 0.6s; }

/* SSH highlight */
.abox.a-ssh-hl { border-color: var(--cyan) !important; box-shadow: 0 0 40px rgba(34,211,238,0.3) !important; }

/* HUD overlays — positioned OUTSIDE .arch-world so they don't zoom/pan.
 * These use position:absolute relative to the .slide, not .arch-world. */
/* Flow step indicator (bottom-left) — shows "Step N: description" */
.a-flowstep {
    position: absolute; bottom: 20px; left: 20px;
    display: flex; align-items: center; gap: 12px;
    padding: 10px 18px; background: var(--bg3);
    border: 1px solid var(--border); border-radius: 12px;
    z-index: 10; opacity: 0; transition: all 0.5s cubic-bezier(.16,1,.3,1);
    transform: translateY(10px);
}
.a-flowstep.show { opacity: 1; transform: translateY(0); }
.a-flowstep .fs-num {
    width: 32px; height: 32px; border-radius: 50%;
    display: flex; align-items: center; justify-content: center;
    font-weight: 700; font-size: 1rem; flex-shrink: 0;
    background: var(--green); color: var(--bg);
}
.a-flowstep .fs-text { font-size: 1.05rem; color: var(--white); font-weight: 500; }

/* S3 Bucket */
.a-s3 {
    left: 15%; top: 87%; width: 18%; height: 11%;
    background: linear-gradient(145deg, #1a1505, #2a2008); border: 1.5px solid #78350f;
    padding: 8px; gap: 2px;
}
.a-s3.a-active { border-color: var(--orange); box-shadow: 0 0 30px rgba(249,115,22,0.2); }
.a-s3 h3 { color: var(--orange); font-size: 1rem; }
.a-s3 p { font-size: 0.85rem; }
.a-rec {
    font-family: 'Courier New', monospace; font-size: 0.8rem; color: var(--red);
    padding: 2px 8px; border-radius: 4px;
    background: rgba(239,68,68,0.1); border: 1px solid rgba(239,68,68,0.2);
    opacity: 0; transition: opacity 0.4s;
}
.a-rec.show { opacity: 1; }
@keyframes pulse-rec { 0%,100% { opacity: 1; } 50% { opacity: 0.5; } }
.a-rec.show { animation: pulse-rec 1.5s infinite; }

/* Audit Log */
.a-audit {
    left: 45%; top: 85%; width: 32%; height: 14%;
    background: linear-gradient(145deg, #1a0f2e, #2d1b4e); border: 1.5px solid #4c1d95;
    padding: 8px 10px; align-items: flex-start; gap: 3px;
}
.a-audit.a-active { border-color: var(--violet); box-shadow: 0 0 30px rgba(124,58,237,0.2); }
.a-audit h3 { color: var(--violet); font-size: 0.95rem; }
.a-logfeed {
    font-family: 'Courier New', monospace; font-size: 0.65rem; letter-spacing: -0.3px;
    color: #94a3b8; line-height: 1.5; width: 100%; text-align: left;
    max-height: 55px; overflow: hidden;
}
.a-logfeed .log-line {
    opacity: 0; transform: translateY(5px);
    transition: opacity 0.3s, transform 0.3s;
}
.a-logfeed .log-line.show { opacity: 1; transform: translateY(0); }
.a-logfeed .log-ts { color: var(--violet); }
.a-logfeed .log-ev { color: var(--cyan); }
.a-audit-dest { font-size: 0.7rem; color: var(--gray); margin-top: 2px; font-style: italic; }

/* Recap legend (bottom-right) — appears on step 8 to explain color coding */
.a-legend {
    position: absolute; bottom: 20px; right: 20px;
    display: flex; gap: 16px; padding: 8px 16px;
    background: var(--bg3); border: 1px solid var(--border); border-radius: 10px;
    z-index: 10; opacity: 0; transition: opacity 0.5s; font-size: 0.9rem;
}
.a-legend.show { opacity: 1; }
.a-legend span { display: flex; align-items: center; gap: 6px; }
.a-legend .dot-cyan { width: 8px; height: 8px; border-radius: 50%; background: var(--cyan); }
.a-legend .dot-orange { width: 8px; height: 8px; border-radius: 50%; background: var(--orange); }
.a-legend .dot-violet { width: 8px; height: 8px; border-radius: 50%; background: var(--violet); }

/* ===== SLIDE: MACHINE ID ==========================================================
 * Architecture-style slide with canvas-based lines, percentage-positioned nodes,
 * and camera system identical to the Architecture slide.
 *
 * WORLD STRUCTURE:
 *   .mid-scene           ← clips to viewport
 *     .mid-world          ← transformable container (camera target), 100% × 200%
 *       #midCanvas        ← canvas for lines/particles (z:1)
 *       .mbox             ← positioned boxes (z:2), absolute in %
 *       .mid-ptitle       ← section titles (z:3)
 *       .mid-warns        ← warning tags (z:5)
 *       .mid-recap-bar    ← recap bars (z:5)
 *     (outside .mid-world — HUD):
 *       .mid-subtitle     ← bottom subtitle text
 *       .mid-compare      ← comparison overlay
 *
 * Part 1 (static secrets) occupies top half (0–45%)
 * Part 2 (Machine ID)     occupies bottom half (55–100%)
 * Camera pans between them via translate + scale on .mid-world
 * =============================================================================== */

.mid-scene {
    position: relative; height: 100vh; width: 100%; padding: 0; overflow: hidden;
}

.mid-world {
    position: absolute; top: 0; left: 0; width: 100%; height: 200%;
    transform-origin: 0 0;
    transition: transform 1.2s cubic-bezier(0.4, 0, 0.2, 1);
    will-change: transform;
}
#midCanvas {
    position: absolute; top: 0; left: 0; width: 100%; height: 100%;
    pointer-events: none; z-index: 1;
}

/* — Boxes: same pattern as .abox — */
.mbox {
    position: absolute; border-radius: 14px;
    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
    background: linear-gradient(145deg, #0f172a, #1e293b); border: 1.5px solid #334155;
    padding: 14px 12px; overflow: hidden;
    transition: all 0.8s cubic-bezier(.16,1,.3,1); opacity: 0.15; z-index: 2;
}
.mbox.m-active { opacity: 1; }
.mbox.m-active.glow-red {
    border-color: var(--red);
    box-shadow: 0 0 40px rgba(239,68,68,0.25), inset 0 0 20px rgba(239,68,68,0.05);
}
.mbox.m-active.glow-cyan {
    border-color: var(--cyan);
    box-shadow: 0 0 40px rgba(34,211,238,0.25), inset 0 0 20px rgba(34,211,238,0.05);
}
.mbox.m-active.glow-green {
    border-color: var(--green);
    box-shadow: 0 0 40px rgba(0,230,118,0.25), inset 0 0 20px rgba(0,230,118,0.05);
}
.mbox.m-active.glow-violet {
    border-color: var(--violet);
    box-shadow: 0 0 40px rgba(124,58,237,0.25), inset 0 0 20px rgba(124,58,237,0.05);
}
.mbox.m-dimmed { opacity: 0.12 !important; filter: grayscale(0.8); }
.mbox.m-past { opacity: 0.85; box-shadow: 0 0 12px rgba(255,255,255,0.04); }

.m-icon { font-size: 2rem; line-height: 1; margin-bottom: 2px; }
.m-name {
    font-size: 0.85rem; font-weight: 700; color: var(--white);
    font-family: 'Courier New', monospace;
    text-align: center; line-height: 1.3;
}

/* ── Part 1 node positions (top half, % of .mid-world) ── */
.m-git      { left: 2%;  top: 16%; width: 11%; height: 10%; }
.m-pipe     { left: 18%; top: 16%; width: 11%; height: 10%; }
.m-runner   { left: 34%; top: 12%; width: 13%; height: 18%; }
.m-secrets  { left: 52%; top: 10%; width: 13%; height: 20%;
    background: linear-gradient(145deg, #1a0a0a, #200505) !important;
}
.m-secrets .m-name { color: var(--red); }
.m-k8s1     { left: 72%; top: 8%;  width: 14%; height: 12%; }
.m-ssh1     { left: 72%; top: 24%; width: 14%; height: 12%; }

/* ── Part 2 node positions (bottom half) ── */
.m-git2     { left: 1%;  top: 57%; width: 10%; height: 9%; }
.m-pipe2    { left: 14%; top: 57%; width: 10%; height: 9%; }
.m-runner2  { left: 27%; top: 53%; width: 13%; height: 17%; }
.m-teleport { left: 44%; top: 51%; width: 16%; height: 24%;
    border-width: 2px;
    background: linear-gradient(145deg, #0a1a2a, #05101e) !important;
}
.m-teleport .m-name {
    color: var(--cyan); font-size: 1.1rem; font-weight: 800; letter-spacing: 3px;
}
.m-teleport.m-active {
    border-color: var(--cyan) !important;
    box-shadow: 0 0 50px rgba(34,211,238,0.3), 0 0 100px rgba(34,211,238,0.1), inset 0 0 25px rgba(34,211,238,0.06) !important;
}
.m-k8s2     { left: 66%; top: 52%; width: 14%; height: 11%; }
.m-ssh2     { left: 66%; top: 66%; width: 14%; height: 11%; }
.m-k8s2 .m-name, .m-ssh2 .m-name { color: var(--green); }
.m-audit    { left: 84%; top: 57%; width: 14%; height: 18%;
    background: linear-gradient(145deg, #1a0f2e, #2d1b4e) !important;
    border-color: #4c1d95;
}

/* ── Section titles ── */
.mid-ptitle {
    position: absolute; z-index: 3;
    font-size: 1.5rem; font-weight: 800; letter-spacing: 0.5px;
    opacity: 0; transition: opacity 0.6s;
}
.mid-ptitle.show { opacity: 1; }
#midTitle1 { left: 2%; top: 3%; }
#midTitle2 { left: 1%; top: 48%; }
.mid-ptitle.mid-danger { color: var(--red); }
.mid-ptitle.mid-clean {
    background: linear-gradient(90deg, var(--cyan), var(--green));
    -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;
}

/* ── Mini terminal inside .mbox nodes ── */
.mid-miniterm {
    width: 100%; margin-top: 6px;
    background: #0a0e14; border: 1px solid #1e293b; border-radius: 6px;
    padding: 8px; overflow: hidden;
    font-family: 'Courier New', monospace; font-size: 0.7rem; line-height: 1.6;
    color: #94a3b8; text-align: left;
    max-height: 0; opacity: 0;
    transition: max-height 0.5s cubic-bezier(.16,1,.3,1), opacity 0.4s;
}
.mid-miniterm.show { max-height: 200px; opacity: 1; }
.mid-miniterm .mt-line { white-space: pre-wrap; word-break: break-all; }
.mid-miniterm .mt-prompt { color: var(--cyan); }
.mid-miniterm .mt-ok { color: var(--green); }

/* ── Warning tags ── */
.mid-warns {
    position: absolute; left: 53%; top: 31%; width: 12%;
    display: flex; flex-direction: column; gap: 4px;
    z-index: 5;
}
.mid-warn-tag {
    font-size: 0.7rem; font-weight: 700; color: var(--red);
    background: rgba(239,68,68,0.08); border: 1px solid rgba(239,68,68,0.3);
    padding: 4px 10px; border-radius: 6px; text-align: center; white-space: nowrap;
    opacity: 0; transform: translateY(-4px);
    transition: all 0.35s cubic-bezier(.16,1,.3,1);
}
.mid-warn-tag.show { opacity: 1; transform: translateY(0); }

/* ── tbot badge ── */
.mid-tbot-badge {
    font-size: 0.7rem; font-weight: 700; color: var(--cyan);
    background: rgba(34,211,238,0.1); border: 1px solid rgba(34,211,238,0.3);
    padding: 3px 8px; border-radius: 6px; margin-top: 4px;
}

/* ── Identity + certs panels ── */
.mid-identity, .mid-certs {
    width: 100%; margin-top: 4px;
    font-family: 'Courier New', monospace; font-size: 0.65rem; line-height: 1.4;
    color: var(--cyan); text-align: left; padding: 6px 8px;
    background: rgba(34,211,238,0.04); border: 1px solid rgba(34,211,238,0.15);
    border-radius: 5px;
    max-height: 0; overflow: hidden; opacity: 0;
    transition: max-height 0.5s cubic-bezier(.16,1,.3,1), opacity 0.4s;
}
.mid-identity.show, .mid-certs.show { max-height: 200px; opacity: 1; }
.mid-certs {
    color: var(--green);
    background: rgba(0,230,118,0.04); border-color: rgba(0,230,118,0.15);
}

/* ── Timer ── */
.mid-timer {
    font-family: 'Courier New', monospace; font-size: 1.2rem; font-weight: 800;
    color: var(--green); text-shadow: 0 0 10px rgba(0,230,118,0.4);
    text-align: center; margin-top: 4px;
    opacity: 0; transition: opacity 0.3s, color 0.3s, text-shadow 0.3s;
}
.mid-timer.show { opacity: 1; }
.mid-timer.warn { color: var(--yellow); text-shadow: 0 0 10px rgba(251,191,36,0.4); }
.mid-timer.expired { color: var(--red); text-shadow: 0 0 10px rgba(239,68,68,0.4); }

/* ── Audit log feed ── */
.mid-logfeed {
    width: 100%; margin-top: 6px;
    font-family: 'Courier New', monospace; font-size: 0.65rem; line-height: 1.5;
    color: #94a3b8; text-align: left;
}
.mid-logfeed .log-line {
    opacity: 0; transform: translateY(3px);
    transition: all 0.3s cubic-bezier(.16,1,.3,1);
}
.mid-logfeed .log-line.show { opacity: 1; transform: translateY(0); }

/* ── Recap bars (absolute inside .mid-world) ── */
.mid-recap-bar {
    position: absolute; z-index: 5;
    display: flex; flex-wrap: wrap; gap: 12px; justify-content: center;
    padding: 14px 20px; border-radius: 10px;
    font-size: 0.8rem; font-weight: 700;
    opacity: 0; transform: translateY(10px);
    transition: all 0.6s cubic-bezier(.16,1,.3,1);
}
.mid-recap-bar.show { opacity: 1; transform: translateY(0); }
#midRecap1 { left: 2%; top: 39%; width: 88%; }
#midRecap2 { left: 1%; top: 82%; width: 96%; }
.mid-recap-danger {
    background: rgba(239,68,68,0.06); border: 1.5px solid rgba(239,68,68,0.3);
    color: var(--red);
}
.mid-recap-clean {
    background: rgba(0,230,118,0.06); border: 1.5px solid rgba(0,230,118,0.3);
    color: var(--green);
}
.mid-recap-bar span {
    opacity: 0; transform: translateY(4px);
    transition: all 0.3s cubic-bezier(.16,1,.3,1);
}
.mid-recap-bar span.show { opacity: 1; transform: translateY(0); }

/* ── Subtitle (HUD, outside .mid-world) ── */
.mid-subtitle {
    position: absolute; bottom: 70px; left: 50%; transform: translateX(-50%);
    font-size: 1.15rem; color: var(--gray); z-index: 10;
    opacity: 0; transition: opacity 0.5s; white-space: nowrap;
}
.mid-subtitle.show { opacity: 1; }

/* ── Comparison overlay (HUD) ── */
.mid-compare {
    position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%);
    display: flex; flex-direction: column; gap: 14px;
    width: 700px; max-width: 90vw; z-index: 20;
    opacity: 0; pointer-events: none; transition: opacity 0.6s;
}
.mid-compare.show { opacity: 1; pointer-events: auto; }
.mid-cmp-row {
    display: flex; align-items: center; gap: 12px;
    opacity: 0; transform: translateY(8px);
    transition: all 0.4s cubic-bezier(.16,1,.3,1);
}
.mid-cmp-row.show { opacity: 1; transform: translateY(0); }
.mid-cmp-left {
    flex: 1; text-align: right; padding: 10px 16px;
    font-size: 0.95rem; font-weight: 700; color: var(--red);
    background: rgba(239,68,68,0.06); border: 1.5px solid rgba(239,68,68,0.25);
    border-radius: 8px; text-decoration: line-through;
    font-family: 'Courier New', monospace;
}
.mid-cmp-arrow {
    color: var(--gray); font-size: 1.4rem; flex: 0 0 auto; font-weight: 800;
}
.mid-cmp-right {
    flex: 1; text-align: left; padding: 10px 16px;
    font-size: 0.95rem; font-weight: 700; color: var(--green);
    background: rgba(0,230,118,0.06); border: 1.5px solid rgba(0,230,118,0.25);
    border-radius: 8px; font-family: 'Courier New', monospace;
}


/* ===== SLIDE 8: BEFORE/AFTER =====================================================
 * Simple two-column comparison grid.
 * .before column uses red ✗ prefix, .after uses green ✓ prefix (via ::before).
 * Standard .r/data-step reveal system.
 * =============================================================================== */
.ba-grid {
    display: grid; grid-template-columns: 1fr 1fr; gap: 40px; width: 100%; max-width: 900px;
}
.ba-col h3 { font-size: 1.6rem; margin-bottom: 20px; padding-bottom: 12px; border-bottom: 2px solid var(--border); }
.ba-col.before h3 { color: var(--red); }
.ba-col.after h3 { color: var(--green); }
.ba-row {
    padding: 10px 14px; margin-bottom: 8px; border-radius: 8px;
    background: rgba(255,255,255,0.03); font-size: 1.1rem; text-align: left;
}
.ba-col.before .ba-row::before { content: '✗ '; color: var(--red); font-weight: 700; }
.ba-col.after .ba-row::before { content: '✓ '; color: var(--green); font-weight: 700; }

/* Gains summary row above the before/after columns */
.ba-gains {
    display: flex; gap: 14px; justify-content: center;
    width: 100%; max-width: 960px;
    margin-bottom: 28px;
}
.ba-gain {
    flex: 1;
    display: flex; flex-direction: column; justify-content: center;
    background: var(--bg2); border: 1px solid var(--border); border-radius: 10px;
    padding: 12px 10px; text-align: center;
    min-height: 80px;
}
.ba-gain-label {
    font-size: 0.75rem; color: var(--gray);
    font-family: 'Courier New', monospace;
    text-transform: uppercase; letter-spacing: 1px;
    margin-bottom: 8px;
}
.ba-gain-values {
    display: flex; align-items: baseline; justify-content: center; gap: 6px;
    flex-wrap: wrap;
    font-family: 'Courier New', monospace;
    font-size: 0.95rem; font-weight: 700;
}
.ba-gain-before {
    color: var(--red); text-decoration: line-through; opacity: 0.7;
}
.ba-gain-arrow { color: var(--gray); }
.ba-gain-after {
    color: var(--green);
    text-shadow: 0 0 8px rgba(0,230,118,0.3);
}

/* ===== SLIDE 12: CHRONOLOGIE TELEPORT =============================================
 * Animated horizontal timeline with camera panning.
 *
 * STRUCTURE:
 *   .tl-scene            ← clips to viewport
 *     .tl-world          ← transformable container (200% wide × 100% tall)
 *       #tlCanvas        ← canvas for timeline line drawing (z:1)
 *       .tlbox / .tl-node ← milestone dots (z:2)
 *       .tl-content      ← milestone content cards (z:3)
 *     (outside .tl-world — HUD):
 *       .tl-hud-title    ← slide title
 *       .tl-hud-sub      ← subtitle text
 *
 * Camera pans LEFT to RIGHT across the 200% wide world.
 * =============================================================================== */

.tl-scene {
    position: relative; height: 100vh; width: 100%; padding: 0; overflow: hidden;
}

.tl-world {
    position: absolute; top: 0; left: 0; width: 200%; height: 100%;
    transform-origin: 0 0;
    transition: transform 1.2s cubic-bezier(0.4, 0, 0.2, 1);
    will-change: transform;
}
#tlCanvas {
    position: absolute; top: 0; left: 0; width: 100%; height: 100%;
    pointer-events: none; z-index: 1;
}

/* ── Node dots (absolute in % of .tl-world) ── */
.tlbox {
    position: absolute; z-index: 2;
    display: flex; flex-direction: column; align-items: center; gap: 4px;
    opacity: 0.2;
    transition: all 0.8s cubic-bezier(.16,1,.3,1);
}
.tlbox.tl-active { opacity: 1; }
.tlbox.tl-past { opacity: 0.6; }
.tlbox.tl-dimmed { opacity: 0.15; }

.tl-dot {
    width: 16px; height: 16px; border-radius: 50%;
    border: 3px solid var(--bg);
    transition: all 0.6s cubic-bezier(.16,1,.3,1);
}
.tl-active .tl-dot {
    width: 22px; height: 22px;
    filter: brightness(1.3);
}
.tl-n0 .tl-dot, .tl-n3 .tl-dot, .tl-n5 .tl-dot, .tl-n8 .tl-dot {
    width: 20px; height: 20px;
}

.tl-year {
    font-family: 'Courier New', monospace;
    font-size: 0.85rem; font-weight: 800;
    letter-spacing: 1px;
}

/* Node positions — 9 milestones spread across 200% wide world */
/* x positions: 5%, 16.5%, 28%, 39.5%, 51%, 62.5%, 74%, 85.5%, 95% */
.tl-n0 { left: 5%;    top: 46%; }
.tl-n1 { left: 16.5%; top: 46%; }
.tl-n2 { left: 28%;   top: 46%; }
.tl-n3 { left: 39.5%; top: 46%; }
.tl-n4 { left: 51%;   top: 46%; }
.tl-n5 { left: 62.5%; top: 46%; }
.tl-n6 { left: 74%;   top: 46%; }
.tl-n7 { left: 85.5%; top: 46%; }
.tl-n8 { left: 95%;   top: 46%; }

/* ── Content cards ── */
.tl-content {
    position: absolute; z-index: 3;
    width: 9%; min-width: 140px;
    padding: 12px 14px;
    background: var(--bg3); border: 1px solid var(--border); border-radius: 10px;
    opacity: 0; transform: translateY(15px);
    transition: all 0.7s cubic-bezier(.16,1,.3,1);
}
.tl-content.tl-show {
    opacity: 1; transform: translateY(0);
}
.tl-content.tl-past-c {
    opacity: 0.4; transform: scale(0.92);
}

/* Alternating above/below */
.tl-above { bottom: 58%; }
.tl-below { top: 62%; }

/* Content card positions — aligned with nodes */
.tl-c0 { left: 1.5%; }
.tl-c1 { left: 13%; }
.tl-c2 { left: 24.5%; }
.tl-c3 { left: 36%; }
.tl-c4 { left: 47.5%; }
.tl-c5 { left: 59%; }
.tl-c6 { left: 70.5%; }
.tl-c7 { left: 82%; }
.tl-c8 { left: 91.5%; }

.tl-card-icon { font-size: 1.8rem; margin-bottom: 4px; }
.tl-card-title {
    font-family: 'Courier New', monospace;
    font-size: 0.9rem; font-weight: 700;
    margin-bottom: 6px; letter-spacing: 0.5px;
}
.tl-card-text {
    font-size: 0.75rem; color: var(--gray); line-height: 1.4;
    margin-bottom: 8px;
}
.tl-badge {
    display: inline-block;
    font-family: 'Courier New', monospace;
    font-size: 0.65rem; font-weight: 700;
    padding: 2px 8px; border: 1px solid;
    border-radius: 20px; letter-spacing: 0.5px;
}

/* ── HUD elements (outside tl-world) ── */
.tl-hud-title {
    position: absolute; top: 20px; left: 50%; transform: translateX(-50%);
    font-family: 'Courier New', monospace;
    font-size: 1.3rem; font-weight: 800; letter-spacing: 4px;
    color: var(--white); z-index: 10;
    opacity: 0.8;
}
.tl-hud-sub {
    position: absolute; bottom: 60px; left: 50%; transform: translateX(-50%);
    font-size: 1.05rem; color: var(--gray); z-index: 10;
    opacity: 0; transition: opacity 0.5s; white-space: nowrap;
}
.tl-hud-sub.show { opacity: 1; }

/* ── Presentation overlay (final step of timeline) ── */
.tl-pres-overlay {
    position: absolute; top: 0; left: 0; width: 100%; height: 100%;
    z-index: 20;
    display: flex; flex-direction: column; align-items: center;
    justify-content: center; gap: 18px;
    padding: 30px 40px;
    background: var(--bg);
    opacity: 0; pointer-events: none;
    transition: opacity 0.8s cubic-bezier(0.4, 0, 0.2, 1);
}
.tl-pres-overlay.show {
    opacity: 1; pointer-events: auto;
}
.tl-pres-overlay .tp-cards {
    max-width: 1100px;
}

/* ===== OUTRO / CONCLUSION SLIDE ================================================ */
.outro-scene {
    position: relative; width: 100%; height: 100vh;
    overflow: hidden; display: flex; align-items: center; justify-content: center;
}
#outroCanvas {
    position: absolute; top: 0; left: 0; width: 100%; height: 100%;
    pointer-events: none; z-index: 0;
}

/* ── Phase containers ── */
.outro-p1, .outro-p3 {
    position: absolute; top: 0; left: 0; width: 100%; height: 100%;
    display: flex; flex-direction: column; align-items: center; justify-content: center;
    z-index: 2; opacity: 0; pointer-events: none;
    transition: opacity 0.8s cubic-bezier(0.4,0,0.2,1), transform 0.8s cubic-bezier(0.4,0,0.2,1);
}
.outro-p1.active, .outro-p3.active { opacity: 1; pointer-events: auto; }
.outro-p1.done { opacity: 0; transform: scale(0.85) translateY(-10%); }

/* ── Phase 1: Recap ── */
.outro-p1-title {
    font-size: 2.4rem; font-weight: 800; color: var(--white);
    font-family: 'Courier New', monospace; letter-spacing: 2px;
    margin-bottom: 40px; opacity: 0; transform: translateY(20px);
    transition: opacity 0.8s, transform 0.8s;
}
.outro-p1-title.show { opacity: 1; transform: translateY(0); }

.outro-recap {
    display: flex; flex-direction: column; gap: 16px;
    max-width: 800px; width: 90%;
}
.outro-recap-item {
    display: flex; align-items: center; gap: 16px;
    padding: 14px 20px; border-radius: 12px;
    background: rgba(15,23,42,0.7); border: 1px solid rgba(255,255,255,0.06);
    opacity: 0; transform: translateX(-30px);
    transition: opacity 0.6s cubic-bezier(0.4,0,0.2,1), transform 0.6s cubic-bezier(0.4,0,0.2,1);
}
.outro-recap-item.show { opacity: 1; transform: translateX(0); }
.outro-recap-icon { font-size: 1.5rem; flex-shrink: 0; }
.outro-recap-text {
    font-size: 1.1rem; color: var(--white); font-weight: 500;
    border-left: 3px solid var(--accent); padding-left: 14px;
}

/* ── Phase 2: CTA / Outro ── */
.outro-logo {
    font-size: 3.5rem; font-weight: 900; color: var(--cyan);
    font-family: 'Courier New', monospace; letter-spacing: 8px;
    text-shadow: 0 0 40px rgba(34,211,238,0.4), 0 0 80px rgba(34,211,238,0.15);
    margin-bottom: 50px; opacity: 0; transform: scale(0.9);
    transition: opacity 1s, transform 1s;
    animation: outroLogoGlow 3s ease-in-out infinite;
}
.outro-logo.show { opacity: 1; transform: scale(1); }

.outro-ctas {
    display: flex; flex-direction: column; align-items: center; gap: 22px;
    max-width: 600px; width: 90%;
}
.outro-cta-item {
    display: flex; align-items: center; gap: 16px;
    opacity: 0; transform: translateY(20px);
    transition: opacity 0.6s, transform 0.6s;
}
.outro-cta-item.show { opacity: 1; transform: translateY(0); }
.outro-cta-icon { font-size: 1.6rem; flex-shrink: 0; }
.outro-cta-text { display: flex; flex-direction: column; gap: 2px; }
.outro-cta-title {
    font-size: 1.3rem; font-weight: 700; color: var(--white);
    font-family: 'Courier New', monospace;
}
/* First CTA (subscribe) is most prominent */
.outro-cta-item[data-idx="0"] .outro-cta-title {
    font-size: 1.5rem; color: var(--cyan);
    text-shadow: 0 0 20px rgba(34,211,238,0.3);
}
.outro-cta-sub {
    font-size: 0.85rem; color: #64748b; font-weight: 400;
}

.outro-footer {
    position: absolute; bottom: 30px; left: 0; width: 100%;
    display: flex; justify-content: center; align-items: center; gap: 16px;
    opacity: 0; transition: opacity 0.8s;
}
.outro-footer.show { opacity: 1; }
.outro-brand {
    font-size: 0.8rem; color: #475569; font-family: 'Courier New', monospace;
    letter-spacing: 2px;
}

/* ── Outro animations ── */
@keyframes outroPulse {
    0%, 100% { opacity: 0.4; }
    50% { opacity: 0.8; }
}
@keyframes outroLogoGlow {
    0%, 100% { text-shadow: 0 0 40px rgba(34,211,238,0.4), 0 0 80px rgba(34,211,238,0.15); }
    50% { text-shadow: 0 0 60px rgba(34,211,238,0.6), 0 0 120px rgba(34,211,238,0.25); }
}

/* ===== RESPONSIVE ================================================================
 * Minimal responsive rules — the deck is primarily designed for 1920×1080 capture.
 * These ensure it doesn't break on smaller screens (preview on laptop).
 * =============================================================================== */
@media (max-width: 900px) {
    .access-cols, .mult-row { flex-direction: column; align-items: center; }
    .risk-grid, .ba-grid { grid-template-columns: 1fr; }
    .arch-flow { flex-direction: column; }
    .arch-arrow { transform: rotate(90deg); }
    .intro-title { font-size: 3rem; }
}
