/* ============================================================================= MLSysBook Landing — Root hub for two volumes. Matches Vol 1 theme. Supports both Light and Dark mode via data-bs-theme. ============================================================================= */ :root { --mls-accent: #A51C30; --mls-accent-hover: #8b1728; --mls-text: #111111; --mls-text-muted: #555555; --mls-bg: #ffffff; --mls-card-bg: rgba(255, 255, 255, 1); --mls-card-border: rgba(0, 0, 0, 0.05); --mls-card-shadow: 0 10px 30px rgba(0, 0, 0, 0.08); --mls-card-shadow-hover: 0 20px 40px rgba(0, 0, 0, 0.12); --mls-glass-bg: rgba(255, 255, 255, 0.85); --mls-glass-border: rgba(255, 255, 255, 0.6); --mls-terminal-bg: rgba(25, 25, 30, 0.95); --mls-terminal-border: rgba(255, 255, 255, 0.1); --mls-terminal-shadow: 0 20px 40px rgba(0, 0, 0, 0.15); --mls-terminal-text: #e6e6e6; --mls-slider-bg: rgba(255, 255, 255, 0.5); --mls-slider-track: rgba(0, 0, 0, 0.1); --mls-slider-thumb: #ffffff; --mls-link: #444444; --mls-footer-bg: rgba(255, 255, 255, 0.9); --mls-vol-sep: rgba(0, 0, 0, 0.08); } [data-bs-theme="dark"] { --mls-accent: #ff4d6d; --mls-accent-hover: #ff758f; --mls-text: #e0e0e0; --mls-text-muted: #aaaaaa; --mls-bg: #0a0a0c; --mls-card-bg: rgba(20, 20, 25, 0.95); --mls-card-border: rgba(255, 255, 255, 0.1); --mls-card-shadow: 0 10px 30px rgba(0, 0, 0, 0.5); --mls-card-shadow-hover: 0 20px 40px rgba(0, 0, 0, 0.7); --mls-glass-bg: rgba(15, 15, 20, 0.85); --mls-glass-border: rgba(255, 255, 255, 0.1); --mls-terminal-bg: rgba(10, 10, 12, 0.95); --mls-terminal-border: rgba(255, 255, 255, 0.1); --mls-terminal-shadow: 0 20px 40px rgba(0, 0, 0, 0.5); --mls-terminal-text: #e6e6e6; --mls-slider-bg: rgba(20, 20, 25, 0.8); --mls-slider-track: rgba(255, 255, 255, 0.1); --mls-slider-thumb: #222222; --mls-link: #cccccc; --mls-footer-bg: rgba(20, 20, 25, 0.9); --mls-vol-sep: rgba(255, 255, 255, 0.1); } /* Page background */ html { scroll-behavior: smooth; scroll-padding-top: 60px; } body, #quarto-content, main.content, .column-page { background: var(--mls-bg) !important; color: var(--mls-text) !important; } /* No Quarto title block; we use .mls-hero only */ #title-block-header, #title-block-header .description, .quarto-title-block { display: none !important; } #quarto-margin-sidebar, .quarto-sidebar-toggle { display: none !important; } .page-columns .content-col { margin-left: 0 !important; } /* Neural net background: fixed, behind content, non-interactive */ #mls-neural-bg { position: fixed; top: 0; left: 0; width: 100%; height: 100%; z-index: 0; pointer-events: none; overflow: hidden; } #mls-neural-bg canvas { display: block; width: 100%; height: 100%; } /* Main column: above background; translucent so canvas shows through */ .mls-landing { position: relative; z-index: 1; font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; color: var(--mls-text); line-height: 1.6; background: transparent; } .mls-section { min-height: calc(100vh - 60px); display: flex; flex-direction: column; justify-content: center; max-width: 1200px; margin: 0 auto; padding: 4rem 2rem; position: relative; } .mls-landing-grid { display: grid; grid-template-columns: 0.9fr 1.1fr; gap: 3rem; align-items: center; width: 100%; } .mls-landing-left { background: var(--mls-glass-bg); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); padding: 3rem; border-radius: 24px; border: 1px solid var(--mls-glass-border); box-shadow: var(--mls-card-shadow); } @media (max-width: 900px) { .mls-landing-grid { grid-template-columns: 1fr; gap: 3rem; } .mls-landing-left { padding: 2rem; } } .mls-hero-eyebrow { font-size: 0.8rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.15em; color: var(--mls-accent); margin: 0 0 1.5rem; } .mls-hero-title { font-size: clamp(2.5rem, 5vw, 4rem); font-weight: 800; color: var(--mls-text); letter-spacing: -0.03em; margin: 0 0 1.5rem; line-height: 1.2; } .mls-hero-tagline { font-size: 1.25rem; font-weight: 600; color: var(--mls-text); opacity: 0.9; margin: 0 0 1rem; line-height: 1.4; } .mls-hero-intro { font-size: 1.1rem; color: var(--mls-text-muted); margin: 0 0 2.5rem; line-height: 1.5; } .mls-meta { margin-top: 1rem; } .mls-links { font-size: 0.95rem; margin: 0 0 0.75rem; } .mls-links a { color: var(--mls-link); text-decoration: none; font-weight: 600; } .mls-links a:hover { color: var(--mls-accent); } /* Volume cards: stacked or side-by-side */ .mls-volumes { display: flex; flex-direction: column; gap: 2rem; } @media (min-width: 600px) { .mls-volumes { flex-direction: row; gap: 1.5rem; } } .mls-vol-card { background: var(--mls-card-bg); border: 1px solid var(--mls-card-border); border-radius: 16px; box-shadow: var(--mls-card-shadow); padding: 1.25rem; transition: transform 0.3s ease, box-shadow 0.3s ease; flex: 1; display: flex; flex-direction: column; } .mls-vol-card:hover { transform: translateY(-5px); box-shadow: var(--mls-card-shadow-hover); } .mls-vol-card-link { display: block; text-decoration: none; color: inherit; flex-grow: 1; display: flex; flex-direction: column; } .mls-vol-card-link:hover { color: inherit; } /* Cover: larger so images aren’t blurry, fixed aspect */ .mls-vol-cover-wrap { display: block; width: 100%; max-width: 100%; margin: 0 auto 1.5rem; border-radius: 4px; overflow: hidden; } .mls-vol-cover { width: 100%; height: auto; display: block; box-shadow: 0 4px 16px rgba(0,0,0,0.15); } .mls-vol-title { font-size: 0.85rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: var(--mls-accent); margin: 0 0 0.5rem; } .mls-vol-subtitle { font-size: 1.1rem; font-weight: 700; color: var(--mls-text); margin: 0 0 1.25rem; line-height: 1.3; } .mls-vol-downloads { font-size: 0.85rem; color: var(--mls-text-muted); margin: auto 0 0 0; padding-top: 1rem; border-top: 1px solid var(--mls-vol-sep); font-weight: 600; display: flex; justify-content: space-between; } .mls-vol-downloads a { color: var(--mls-text); text-decoration: none; } .mls-vol-downloads a:hover { color: var(--mls-accent); } .mls-vol-sep { display: none; } .mls-footer { margin-top: 4rem; text-align: center; font-size: 0.85rem; color: var(--mls-text-muted); } .mls-footer span { background: var(--mls-footer-bg); padding: 0.5rem 1rem; border-radius: 6px; display: inline-block; } .mls-scroll-indicator { position: absolute; bottom: 2rem; left: 50%; transform: translateX(-50%); text-align: center; color: var(--mls-text-muted); font-size: 0.85rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.1em; animation: bounce 2s infinite; pointer-events: none; } .mls-scroll-arrow { font-size: 1.5rem; margin-top: 0.25rem; color: var(--mls-accent); } @keyframes bounce { 0%, 20%, 50%, 80%, 100% { transform: translateY(0); } 40% { transform: translateY(-10px); } 60% { transform: translateY(-5px); } } /* Feature Sections (TinyTorch, Hardware, Labs) */ .mls-feature-card { background: var(--mls-card-bg); border: 1px solid var(--mls-card-border); border-radius: 12px; box-shadow: var(--mls-card-shadow); padding: 4rem 2rem; display: flex; flex-direction: column; justify-content: center; align-items: center; text-align: center; min-height: 400px; } .mls-feature-header { position: relative; display: inline-block; padding-left: 1.5rem; padding-bottom: 0.75rem; margin-bottom: 1.5rem; border-bottom: 1px solid rgba(165, 28, 48, 0.3); text-align: left; } .mls-feature-header::before { content: ''; position: absolute; left: 0; top: 0.25rem; bottom: 0.75rem; width: 6px; background-color: var(--mls-accent); } .mls-feature-title { font-size: clamp(2rem, 4vw, 2.75rem); font-weight: 800; color: var(--mls-text); margin: 0; line-height: 1.1; letter-spacing: -0.02em; } .mls-feature-desc { font-size: 1.25rem; color: var(--mls-text-muted); max-width: 420px; margin: 0 auto; line-height: 1.5; } /* Animations */ /* Terminal Animation */ .css-terminal-wrapper { position: relative; width: 280px; margin: 0 auto 2rem auto; animation: floatTerminal 6s ease-in-out infinite; } .css-terminal { background: var(--mls-terminal-bg); border-radius: 8px; border: 1px solid var(--mls-terminal-border); box-shadow: var(--mls-terminal-shadow), inset 0 1px 0 rgba(255,255,255,0.1); overflow: hidden; backdrop-filter: blur(10px); -webkit-backdrop-filter: blur(10px); } .css-terminal-header { background: rgba(0, 0, 0, 0.2); padding: 10px 12px; display: flex; gap: 8px; border-bottom: 1px solid rgba(0,0,0,0.2); } .term-dot { width: 12px; height: 12px; border-radius: 50%; } .term-dot.close { background: #ff5f56; } .term-dot.min { background: #ffbd2e; } .term-dot.max { background: #27c93f; } .css-terminal-body { padding: 16px; font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace; font-size: 0.75rem; color: var(--mls-terminal-text); text-align: left; min-height: 100px; line-height: 1.4; } .term-line { display: flex; gap: 10px; white-space: nowrap; } /* Syntax highlighting */ .term-kw { color: #ff7b72; } .term-def { color: #d2a8ff; } .term-var { color: #79c0ff; } .term-num { color: #79c0ff; } .term-comment { color: #8b949e; } .term-prompt { color: #4285F4; font-weight: 600; } .term-cursor { display: inline-block; width: 8px; height: 16px; background: var(--mls-terminal-text); animation: blink 1s step-end infinite; } .term-shadow { position: absolute; bottom: -20px; left: 10%; width: 80%; height: 15px; background: rgba(0,0,0,0.1); border-radius: 50%; filter: blur(5px); animation: shadowTerminal 6s ease-in-out infinite; } [data-bs-theme="dark"] .term-shadow { background: rgba(0,0,0,0.5); } @keyframes floatTerminal { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-10px); } } @keyframes shadowTerminal { 0%, 100% { transform: scale(1); opacity: 0.5; } 50% { transform: scale(0.85); opacity: 0.2; } } @keyframes blink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } } /* MLSysim Panel — navy gradient + teal accent (distinct from TinyTorch terminal) */ .sim-panel { background: linear-gradient(135deg, #162836 0%, #1e3a4d 50%, #162836 100%); border: 1.5px solid rgba(94, 204, 199, 0.4); border-radius: 16px; padding: 1.5rem 1.75rem; max-width: 420px; margin: 0 auto 2rem auto; font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace; color: #cdd6f4; box-shadow: 0 4px 24px rgba(22, 40, 54, 0.5); position: relative; overflow: hidden; animation: sim-panel-pulse 9s ease-in-out infinite; } /* Border glow pulse at each of the 3 transition moments */ @keyframes sim-panel-pulse { 0%, 26% { border-color: rgba(94, 204, 199, 0.4); box-shadow: 0 4px 24px rgba(22, 40, 54, 0.5); } 30% { border-color: rgba(94, 204, 199, 0.9); box-shadow: 0 4px 24px rgba(22, 40, 54, 0.5), 0 0 20px rgba(94, 204, 199, 0.3); } 36%, 59% { border-color: rgba(94, 204, 199, 0.4); box-shadow: 0 4px 24px rgba(22, 40, 54, 0.5); } 63% { border-color: rgba(94, 204, 199, 0.9); box-shadow: 0 4px 24px rgba(22, 40, 54, 0.5), 0 0 20px rgba(94, 204, 199, 0.3); } 69%, 93% { border-color: rgba(94, 204, 199, 0.4); box-shadow: 0 4px 24px rgba(22, 40, 54, 0.5); } 97% { border-color: rgba(94, 204, 199, 0.9); box-shadow: 0 4px 24px rgba(22, 40, 54, 0.5), 0 0 20px rgba(94, 204, 199, 0.3); } 100% { border-color: rgba(94, 204, 199, 0.4); box-shadow: 0 4px 24px rgba(22, 40, 54, 0.5); } } /* Horizontal scan line sweeps across panel at each transition */ .sim-panel::after { content: ''; position: absolute; top: 0; left: -100%; width: 100%; height: 100%; background: linear-gradient(90deg, transparent 0%, rgba(94, 204, 199, 0.08) 40%, rgba(94, 204, 199, 0.15) 50%, rgba(94, 204, 199, 0.08) 60%, transparent 100% ); pointer-events: none; animation: sim-scan 9s ease-in-out infinite; } @keyframes sim-scan { 0%, 27% { left: -100%; } 28%, 34% { left: 100%; } 35%, 60% { left: -100%; } 61%, 67% { left: 100%; } 68%, 94% { left: -100%; } 95%, 99% { left: 100%; } 100% { left: -100%; } } /* ── 3-Scenario Toggle (A/B/C cycle: 12s total, ~4s each) ── */ /* A = batch 1 (mem-bound), B = batch 32 (ridge), C = batch 128 (compute-bound) */ /* Timeline: A 0-28% | transition | B 33-61% | transition | C 66-95% | transition | A */ .sim-tri-a { animation: sim-tri-show-a 9s ease-in-out infinite; } .sim-tri-b { animation: sim-tri-show-b 9s ease-in-out infinite; } .sim-tri-c { animation: sim-tri-show-c 9s ease-in-out infinite; } @keyframes sim-tri-show-a { 0%, 28% { opacity: 1; visibility: visible; } 33%, 95% { opacity: 0; visibility: hidden; } 100% { opacity: 1; visibility: visible; } } @keyframes sim-tri-show-b { 0%, 28% { opacity: 0; visibility: hidden; } 33%, 61% { opacity: 1; visibility: visible; } 66%, 100% { opacity: 0; visibility: hidden; } } @keyframes sim-tri-show-c { 0%, 61% { opacity: 0; visibility: hidden; } 66%, 95% { opacity: 1; visibility: visible; } 100% { opacity: 0; visibility: hidden; } } /* CLI command line */ .sim-cli { background: rgba(0, 0, 0, 0.2); border: 1px solid rgba(94, 204, 199, 0.18); border-radius: 6px; padding: 0.5rem 0.85rem; margin-bottom: 1rem; font-size: 0.78rem; letter-spacing: 0.02em; white-space: nowrap; overflow: hidden; position: relative; } .sim-cli-prompt { color: rgba(94, 204, 199, 0.6); margin-right: 0.4em; } .sim-cli-cmd { color: #5ec4c7; font-weight: 700; } .sim-cli-arg { color: #cdd6f4; } .sim-cli-model { color: #f9e2af; } .sim-cli-flag { color: rgba(205, 214, 244, 0.5); } .sim-cli-val { color: #a6e3a1; } .sim-cli-batch-val { color: #fab387; font-weight: 700; animation: sim-batch-highlight 9s ease-in-out infinite; } @keyframes sim-batch-highlight { 0%, 26% { color: #fab387; text-shadow: none; } 30% { color: #fff; text-shadow: 0 0 8px rgba(250, 179, 135, 0.8); } 36%, 59% { color: #fab387; text-shadow: none; } 63% { color: #fff; text-shadow: 0 0 8px rgba(250, 179, 135, 0.8); } 69%, 93% { color: #fab387; text-shadow: none; } 97% { color: #fff; text-shadow: 0 0 8px rgba(250, 179, 135, 0.8); } 100% { color: #fab387; text-shadow: none; } } .sim-roofline-top { margin-bottom: 0.8rem; } .sim-roofline-svg { width: 100%; height: auto; font-family: inherit; } /* (dot labels now use .sim-tri-a/b/c classes directly) */ /* Config output grid */ .sim-output { margin-bottom: 0.6rem; padding-bottom: 0.5rem; border-bottom: 1px solid rgba(255,255,255,0.06); } .sim-output-grid { display: grid; grid-template-columns: auto 1fr auto 1fr; gap: 0.3rem 0.8rem; font-size: 0.74rem; } .sim-output-key { color: rgba(94, 204, 199, 0.5); font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; font-size: 0.62rem; } .sim-output-val { color: #e6edf3; font-weight: 600; position: relative; } /* Swap container — inline element where A/B overlap in same space */ .sim-swap { position: relative; display: inline-block; } .sim-swap .sim-tri-b, .sim-swap .sim-tri-c { position: absolute; left: 0; top: 0; } /* Overlay row — stacks A and B on top of each other */ .sim-overlay-row { position: relative; display: flex; justify-content: center; align-items: center; min-height: 1.6rem; margin-bottom: 0.5rem; } .sim-overlay-row .sim-tri-b, .sim-overlay-row .sim-tri-c { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } /* Chips row needs more height for the chip sets */ .sim-chips-row { min-height: 2rem; } .sim-result-set { display: flex; justify-content: center; gap: 0.5rem; flex-wrap: wrap; } .sim-chips-row .sim-tri-b, .sim-chips-row .sim-tri-c { width: 100%; } .sim-bottleneck-chip { font-size: 0.62rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; display: flex; align-items: center; gap: 5px; } .sim-bn-icon { width: 6px; height: 6px; border-radius: 50%; } .sim-bn-icon.mem { background: #c87b2a; box-shadow: 0 0 6px rgba(200, 123, 42, 0.5); } .sim-bn-icon.ridge { background: #3d9e5a; box-shadow: 0 0 6px rgba(61, 158, 90, 0.5); } .sim-bn-icon.compute { background: #e05252; box-shadow: 0 0 6px rgba(224, 82, 82, 0.5); } /* Bottleneck chip text colors */ .sim-bn-amber { color: #c87b2a; } .sim-bn-green { color: #3d9e5a; } .sim-bn-red { color: #e05252; } /* Result chips */ .sim-result-chip { font-size: 0.72rem; font-weight: 700; padding: 0.35rem 0.75rem; border-radius: 12px; letter-spacing: 0.02em; transition: all 0.3s ease; } .sim-chip-green { color: #3d9e5a; background: rgba(61,158,90,0.15); border: 1px solid rgba(61,158,90,0.25); } .sim-chip-amber { color: #c87b2a; background: rgba(200,123,42,0.15); border: 1px solid rgba(200,123,42,0.25); } .sim-chip-red { color: #e05252; background: rgba(224,82,82,0.15); border: 1px solid rgba(224,82,82,0.25); } /* Hexagon/Cube Taxonomy Animation */ .hex-wrapper { position: relative; width: 320px; height: 240px; margin: 0 auto 2rem auto; } .hex-lines { position: absolute; top: 20px; left: 60px; width: 200px; height: 200px; overflow: visible; color: var(--mls-text-muted); opacity: 0.7; } .hex-polygon, .hex-line { stroke-dasharray: 6 6; animation: hexDash 20s linear infinite; } @keyframes hexDash { to { stroke-dashoffset: 200; } } .hex-dot { filter: drop-shadow(0 0 4px currentColor); } .dot-dam { color: var(--mls-accent); fill: var(--mls-accent); } .dot-c3 { color: #4285F4; fill: #4285F4; } .hex-node { position: absolute; display: flex; align-items: center; gap: 8px; z-index: 2; } /* Center is at (160, 120). Radius is 80. */ .node-alg { top: 40px; left: 160px; transform: translate(-50%, -100%); flex-direction: column; padding-bottom: 8px;} .node-comp { top: 80px; left: 229px; transform: translate(0, -50%); padding-left: 8px;} .node-coord { top: 160px; left: 229px; transform: translate(0, -50%); padding-left: 8px;} .node-mach { top: 200px; left: 160px; transform: translate(-50%, 0); flex-direction: column; padding-top: 8px;} .node-comm { top: 160px; left: 91px; transform: translate(-100%, -50%); flex-direction: row-reverse; padding-right: 8px;} .node-data { top: 80px; left: 91px; transform: translate(-100%, -50%); flex-direction: row-reverse; padding-right: 8px;} .node-circle { width: 12px; height: 12px; background: var(--mls-card-bg); border: 2px solid var(--mls-text); border-radius: 50%; flex-shrink: 0; position: relative; } .node-circle::after { content: ''; position: absolute; top: 2px; left: 2px; right: 2px; bottom: 2px; border-radius: 50%; background: currentColor; opacity: 0.5; } .dam-color { border-color: var(--mls-accent); color: var(--mls-accent); box-shadow: 0 0 10px rgba(165,28,48,0.2); } [data-bs-theme="dark"] .dam-color { box-shadow: 0 0 10px rgba(255,77,109,0.3); } .c3-color { border-color: #4285F4; color: #4285F4; box-shadow: 0 0 10px rgba(66,133,244,0.2); } .node-label { font-size: 0.7rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.05em; color: var(--mls-text); white-space: nowrap; } .mls-feature-image { max-width: 140px; height: auto; margin-bottom: 2rem; } /* ── Lab Card (Labs section — Marimo-style light card) ── */ .lab-card { background: #f4f6f8; border: 1.5px solid #94a3b8; border-radius: 12px; max-width: 340px; margin: 0 auto 2rem auto; overflow: hidden; box-shadow: 0 3px 16px rgba(0,0,0,0.10); font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace; color: #334155; } [data-bs-theme="dark"] .lab-card { background: #1a1a2e; border-color: rgba(255,255,255,0.1); color: #cdd6f4; box-shadow: 0 4px 20px rgba(0,0,0,0.3); } .lab-header { display: flex; align-items: center; justify-content: space-between; padding: 0.55rem 0.9rem; border-bottom: 1px solid #e2e8f0; font-size: 0.56rem; color: #64748b; } [data-bs-theme="dark"] .lab-header { border-bottom-color: rgba(255,255,255,0.06); color: #8b949e; } .lab-badge { background: #a31f34; color: #fff; font-size: 0.44rem; font-weight: 700; padding: 2px 7px; border-radius: 8px; } .lab-body { padding: 0.75rem; display: flex; flex-direction: column; gap: 7px; } .lab-footer { display: flex; justify-content: space-between; align-items: center; padding: 0.45rem 0.9rem; background: #f8fafc; border-top: 1px solid #e2e8f0; font-size: 0.48rem; color: #64748b; } [data-bs-theme="dark"] .lab-footer { background: rgba(255,255,255,0.03); border-top-color: rgba(255,255,255,0.06); color: #6e7681; } .lab-status-dot { display: inline-block; width: 5px; height: 5px; background: #3d9e5a; border-radius: 50%; margin-right: 3px; animation: lab-dot-pulse 2s ease-in-out infinite; } @keyframes lab-dot-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } } /* ── Lab question ── */ .lab-question { font-size: 0.5rem; font-weight: 600; color: #334155; font-family: 'Inter', -apple-system, sans-serif; line-height: 1.3; } [data-bs-theme="dark"] .lab-question { color: #cdd6f4; } /* ── Lab insight ── */ .lab-insight { display: flex; align-items: center; gap: 5px; padding: 0.3rem 0.55rem; background: rgba(61,158,90,0.08); border: 1.5px solid rgba(61,158,90,0.25); border-radius: 6px; font-size: 0.42rem; font-weight: 600; color: #3d9e5a; font-family: 'Inter', -apple-system, sans-serif; } [data-bs-theme="dark"] .lab-insight { background: rgba(61,158,90,0.12); border-color: rgba(61,158,90,0.3); } .lab-insight-icon { font-size: 0.56rem; } /* ── 6-way toggle for labs (24s cycle, 4s per region) ── */ /* Timeline: R1 0-14% | R2 16.7-31% | R3 33.3-48% | R4 50-64% | R5 66.7-81% | R6 83.3-97% */ .lab-r1 { animation: lab-r1 15s ease-in-out infinite; } .lab-r2 { animation: lab-r2 15s ease-in-out infinite; } .lab-r3 { animation: lab-r3 15s ease-in-out infinite; } .lab-r4 { animation: lab-r4 15s ease-in-out infinite; } .lab-r5 { animation: lab-r5 15s ease-in-out infinite; } .lab-r6 { animation: lab-r6 15s ease-in-out infinite; } @keyframes lab-r1 { 0%,14% { opacity:1; visibility:visible; } 16.7%,97% { opacity:0; visibility:hidden; } 100% { opacity:1; visibility:visible; } } @keyframes lab-r2 { 0%,14% { opacity:0; visibility:hidden; } 16.7%,31% { opacity:1; visibility:visible; } 33.3%,100% { opacity:0; visibility:hidden; } } @keyframes lab-r3 { 0%,31% { opacity:0; visibility:hidden; } 33.3%,48% { opacity:1; visibility:visible; } 50%,100% { opacity:0; visibility:hidden; } } @keyframes lab-r4 { 0%,48% { opacity:0; visibility:hidden; } 50%,64% { opacity:1; visibility:visible; } 66.7%,100% { opacity:0; visibility:hidden; } } @keyframes lab-r5 { 0%,64% { opacity:0; visibility:hidden; } 66.7%,81% { opacity:1; visibility:visible; } 83.3%,100% { opacity:0; visibility:hidden; } } @keyframes lab-r6 { 0%,81% { opacity:0; visibility:hidden; } 83.3%,97% { opacity:1; visibility:visible; } 100% { opacity:0; visibility:hidden; } } .lab-six-stack { position: relative; } .lab-six-stack > *:nth-child(n+2) { position: absolute; top: 0; left: 0; right: 0; } .lab-six-swap { position: relative; display: inline-block; } .lab-six-swap > *:nth-child(n+2) { position: absolute; left: 0; top: 0; } /* ── World map ── */ .lab-map-wrap { background: #eef2f7; border: 1px solid #e2e8f0; border-radius: 8px; padding: 4px; overflow: hidden; } [data-bs-theme="dark"] .lab-map-wrap { background: rgba(255,255,255,0.04); border-color: rgba(255,255,255,0.08); } .lab-map-svg { width: 100%; height: auto; display: block; } .lab-map-land { fill: #d0d7e0; stroke: #bcc5d0; stroke-width: 0.3; stroke-linejoin: round; } [data-bs-theme="dark"] .lab-map-land { fill: #3a3f4a; stroke: #4a4f5a; } [data-bs-theme="dark"] .lab-map-wrap svg rect { fill: #1a1a2e !important; } .lab-map-dot { stroke: #fff; stroke-width: 1.2; } /* Map dots and glow now handled by SVG elements */ /* ── Region tags ── */ .lab-rtag { display: inline-flex; align-items: center; gap: 4px; font-size: 0.48rem; font-weight: 700; font-family: 'Inter', -apple-system, sans-serif; padding: 3px 10px; border-radius: 6px; } .lab-rdot { width: 6px; height: 6px; border-radius: 50%; } .lab-rtag-n { background: rgba(61,158,90,0.1); color: #3d9e5a; } .lab-rtag-n .lab-rdot { background: #3d9e5a; box-shadow: 0 0 4px rgba(61,158,90,0.5); } .lab-rtag-u { background: rgba(200,123,42,0.1); color: #c87b2a; } .lab-rtag-u .lab-rdot { background: #c87b2a; box-shadow: 0 0 4px rgba(200,123,42,0.5); } .lab-rtag-p { background: rgba(224,82,82,0.1); color: #e05252; } .lab-rtag-p .lab-rdot { background: #e05252; box-shadow: 0 0 4px rgba(224,82,82,0.5); } /* ── Sustainability panel (donut + metrics) ── */ .lab-sustain-panel { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; padding: 8px; } [data-bs-theme="dark"] .lab-sustain-panel { background: rgba(255,255,255,0.04); border-color: rgba(255,255,255,0.08); } .lab-sustain-top { display: flex; align-items: center; gap: 10px; } .lab-sustain-donut { width: 68px; height: 68px; position: relative; flex-shrink: 0; } .lab-sustain-donut svg { width: 100%; height: 100%; transform: rotate(-90deg); } .lab-donut-bg { fill: none; stroke: #e2e8f0; stroke-width: 7; } [data-bs-theme="dark"] .lab-donut-bg { stroke: rgba(255,255,255,0.1); } .lab-donut-fill { fill: none; stroke-width: 7; stroke-linecap: round; stroke-dasharray: 150.8; } /* Donut morph now handled by SVG elements */ .lab-donut-center { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); text-align: center; line-height: 1; } .lab-donut-pct { font-size: 0.72rem; font-weight: 800; } .lab-donut-label { font-size: 0.28rem; color: #94a3b8; font-weight: 600; } /* Metrics sidebar */ .lab-sustain-metrics { flex: 1; display: flex; flex-direction: column; gap: 4px; } .lab-smetric { display: flex; justify-content: space-between; font-size: 0.42rem; } .lab-smetric-label { color: #64748b; font-weight: 600; } [data-bs-theme="dark"] .lab-smetric-label { color: #8b949e; } .lab-smetric-val { font-weight: 700; font-size: 0.46rem; text-align: right; min-width: 36px; } /* ── Comparison strip ── */ .lab-cstrip { display: flex; gap: 3px; margin-top: 5px; } .lab-cstrip-item { flex: 1; text-align: center; padding: 3px 2px; border-radius: 4px; font-size: 0.34rem; border: 1px solid #e2e8f0; } [data-bs-theme="dark"] .lab-cstrip-item { border-color: rgba(255,255,255,0.08); } .lab-cstrip-name { font-weight: 600; margin-bottom: 1px; } .lab-cstrip-val { font-weight: 800; font-size: 0.42rem; } .lab-cstrip-n { color: #3d9e5a; } .lab-cstrip-u { color: #c87b2a; } .lab-cstrip-p { color: #e05252; } .lab-chi-1 { animation: lab-chi-1 15s ease-in-out infinite; } .lab-chi-2 { animation: lab-chi-2 15s ease-in-out infinite; } .lab-chi-3 { animation: lab-chi-3 15s ease-in-out infinite; } .lab-chi-4 { animation: lab-chi-4 15s ease-in-out infinite; } .lab-chi-5 { animation: lab-chi-5 15s ease-in-out infinite; } .lab-chi-6 { animation: lab-chi-6 15s ease-in-out infinite; } @keyframes lab-chi-1 { 0%,14% { background: rgba(61,158,90,0.1); border-color: rgba(61,158,90,0.4); transform: scale(1.08); } 16.7%,97% { background: transparent; border-color: #e2e8f0; transform: scale(1); } 100% { background: rgba(61,158,90,0.1); border-color: rgba(61,158,90,0.4); transform: scale(1.08); } } @keyframes lab-chi-2 { 0%,14% { background: transparent; border-color: #e2e8f0; transform: scale(1); } 16.7%,31% { background: rgba(61,158,90,0.1); border-color: rgba(61,158,90,0.4); transform: scale(1.08); } 33.3%,100% { background: transparent; border-color: #e2e8f0; transform: scale(1); } } @keyframes lab-chi-3 { 0%,31% { background: transparent; border-color: #e2e8f0; transform: scale(1); } 33.3%,48% { background: rgba(200,123,42,0.1); border-color: rgba(200,123,42,0.4); transform: scale(1.08); } 50%,100% { background: transparent; border-color: #e2e8f0; transform: scale(1); } } @keyframes lab-chi-4 { 0%,48% { background: transparent; border-color: #e2e8f0; transform: scale(1); } 50%,64% { background: rgba(200,123,42,0.1); border-color: rgba(200,123,42,0.4); transform: scale(1.08); } 66.7%,100% { background: transparent; border-color: #e2e8f0; transform: scale(1); } } @keyframes lab-chi-5 { 0%,64% { background: transparent; border-color: #e2e8f0; transform: scale(1); } 66.7%,81% { background: rgba(224,82,82,0.1); border-color: rgba(224,82,82,0.4); transform: scale(1.08); } 83.3%,100% { background: transparent; border-color: #e2e8f0; transform: scale(1); } } @keyframes lab-chi-6 { 0%,81% { background: transparent; border-color: #e2e8f0; transform: scale(1); } 83.3%,97% { background: rgba(224,82,82,0.1); border-color: rgba(224,82,82,0.4); transform: scale(1.08); } 100% { background: transparent; border-color: #e2e8f0; transform: scale(1); } } /* ===== Clickable Cards ===== */ .mls-card-clickable[data-href] { cursor: pointer; transition: transform 0.2s ease, box-shadow 0.2s ease; } .mls-card-clickable[data-href]:hover { transform: translateY(-3px); box-shadow: 0 12px 32px rgba(0,0,0,0.12); } /* ===== Beamer Slide Frame (Lecture Slides section) ===== */ .beamer-frame { background: #fff; border-radius: 8px; overflow: hidden; box-shadow: 0 4px 16px rgba(0,0,0,0.1); border: 1px solid #dee2e6; } .beamer-topbar { height: 28px; background: linear-gradient(90deg, #a31f34, #8b1728); display: flex; align-items: center; padding: 0 10px; gap: 6px; overflow: hidden; } .beamer-topbar span { font-size: 0.6rem; color: rgba(255,255,255,0.55); white-space: nowrap; } .beamer-topbar span.active { color: #fff; font-weight: 600; background: rgba(255,255,255,0.18); padding: 2px 8px; border-radius: 4px; } .beamer-body { padding: 1.25rem; } .beamer-title { font-size: 0.95rem; font-weight: 700; color: #1a1a2e; margin-bottom: 0.75rem; } .beamer-eq { background: #1a1a2e; color: #fff; padding: 0.75rem 1rem; border-radius: 6px; font-family: 'Times New Roman', Georgia, serif; font-size: 1.05rem; text-align: center; margin: 0.75rem 0; letter-spacing: 0.3px; } .beamer-eq sub { font-size: 0.65rem; } .beamer-bullets { font-size: 0.7rem; color: #555; line-height: 2; padding-left: 0.25rem; } .beamer-bullets strong { color: #1a1a2e; } .beamer-footer { display: flex; justify-content: space-between; align-items: center; padding: 0.5rem 0.75rem; border-top: 1px solid #f0f0f0; font-size: 0.6rem; color: #adb5bd; } .beamer-page { background: #f0f0f5; padding: 2px 8px; border-radius: 4px; font-weight: 600; color: #555; } /* ===== Interview Prep Flashcard Stack ===== */ .iprep-stack { position: relative; width: 100%; min-height: 220px; margin-bottom: 0.5rem; } .iprep-card { position: absolute; background: #fff; border-radius: 8px; border: 1px solid #e9ecef; padding: 1rem; width: 88%; transition: transform 0.3s ease; } .iprep-back { top: 0; left: 10%; transform: rotate(3deg); box-shadow: 0 1px 4px rgba(0,0,0,0.06); min-height: 50px; } .iprep-mid { top: 10px; left: 5%; transform: rotate(-1.5deg); box-shadow: 0 2px 6px rgba(0,0,0,0.08); } .iprep-front { top: 20px; left: 2%; box-shadow: 0 4px 16px rgba(0,0,0,0.12); } .iprep-domain { display: inline-block; padding: 2px 10px; border-radius: 10px; font-size: 0.65rem; font-weight: 600; margin-bottom: 0.5rem; } .iprep-q { font-size: 0.8rem; font-weight: 600; color: #1a1a2e; line-height: 1.45; margin-bottom: 0.5rem; } .iprep-meta { display: flex; justify-content: space-between; font-size: 0.6rem; color: #6c757d; margin-bottom: 0.5rem; } .iprep-rubric { color: #a31f34; font-weight: 600; } .iprep-bars { margin-top: 0.4rem; } .iprep-bar { display: flex; align-items: center; gap: 0.4rem; margin: 4px 0; } .iprep-bar-label { font-size: 0.55rem; color: #6c757d; width: 55px; flex-shrink: 0; } .iprep-bar-track { flex: 1; height: 5px; background: #e9ecef; border-radius: 3px; overflow: hidden; } .iprep-bar-fill { height: 100%; border-radius: 3px; } .iprep-domains { display: flex; justify-content: center; gap: 0.5rem; margin-top: 2.5rem; } .iprep-tag { padding: 4px 12px; border-radius: 12px; font-size: 0.7rem; font-weight: 600; } /* ===== Blueprint Schematic (Instructor Hub section) ===== */ .bp-sheet { background: #1a2744; border-radius: 8px; padding: 1.25rem; position: relative; overflow: visible; min-height: 220px; } .bp-grid-overlay { position: absolute; inset: 0; background-image: linear-gradient(rgba(100,160,220,0.08) 1px, transparent 1px), linear-gradient(90deg, rgba(100,160,220,0.08) 1px, transparent 1px); background-size: 20px 20px; pointer-events: none; } .bp-title-block { position: relative; border: 1px solid rgba(100,160,220,0.3); padding: 6px 12px; margin-bottom: 1rem; display: inline-block; } .bp-title-text { color: #7db8e0; font-size: 0.7rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.1em; } .bp-title-sub { color: rgba(125,184,224,0.5); font-size: 0.55rem; margin-top: 2px; } .bp-layout { position: relative; display: grid; grid-template-columns: 1fr 1fr; gap: 8px; } .bp-module { border: 1px dashed rgba(100,160,220,0.35); border-radius: 4px; padding: 8px; } .bp-module-label { font-size: 0.55rem; color: #7db8e0; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 4px; } .bp-module-items { font-size: 0.5rem; color: rgba(125,184,224,0.6); line-height: 1.6; } .bp-stamp { position: absolute; bottom: -20px; right: -10px; border: 3px solid #a31f34; border-radius: 10px; padding: 10px 16px; transform: rotate(-10deg); background: rgba(255,255,255,0.85); backdrop-filter: blur(6px); text-align: center; min-width: 90px; box-shadow: 0 3px 14px rgba(0,0,0,0.18); } .bp-stamp-icon { font-size: 2.2rem; line-height: 1; margin-bottom: 4px; } .bp-stamp-text { color: #a31f34; font-size: 0.65rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.12em; line-height: 1.25; text-shadow: none; } /* ===== Mobile responsiveness for new sections ===== */ @media (max-width: 480px) { /* Beamer: smaller text */ .beamer-topbar { gap: 3px; padding: 0 6px; } .beamer-topbar span { font-size: 0.5rem; } .beamer-body { padding: 0.75rem; } .beamer-title { font-size: 0.8rem; } .beamer-eq { font-size: 0.85rem; padding: 0.5rem 0.75rem; } .beamer-bullets { font-size: 0.6rem; } /* Blueprint: stack 2x2 to single column */ .bp-layout { grid-template-columns: 1fr; } .bp-sheet { padding: 1rem; } .bp-title-text { font-size: 0.6rem; } .bp-stamp { bottom: -16px; right: -6px; padding: 8px 12px; min-width: 75px; } .bp-stamp-icon { font-size: 1.6rem; } .bp-stamp-text { font-size: 0.55rem; } /* Flashcards: reduce stack offset */ .iprep-stack { min-height: 180px; } .iprep-card { padding: 0.75rem; } .iprep-q { font-size: 0.7rem; } .iprep-domains { gap: 0.35rem; } .iprep-tag { padding: 3px 8px; font-size: 0.6rem; } } @media (max-width: 600px) { /* Blueprint grid: stay 2-col but tighter */ .bp-layout { gap: 5px; } .bp-module { padding: 6px; } .bp-module-label { font-size: 0.5rem; } .bp-module-items { font-size: 0.45rem; } } /* Dark mode adjustments */ [data-bs-theme="dark"] .beamer-frame { background: #2a2a3e; border-color: #3a3a4e; } [data-bs-theme="dark"] .beamer-title { color: #e2e8f0; } [data-bs-theme="dark"] .beamer-bullets { color: #adb5bd; } [data-bs-theme="dark"] .beamer-bullets strong { color: #e2e8f0; } [data-bs-theme="dark"] .beamer-footer { border-color: #3a3a4e; } [data-bs-theme="dark"] .iprep-card { background: #2a2a3e; border-color: #3a3a4e; } [data-bs-theme="dark"] .iprep-q { color: #e2e8f0; } [data-bs-theme="dark"] .iprep-bar-track { background: #3a3a4e; }