Files
cs249r_book/site/landing.css
Vijay Janapa Reddi 00c10e4413 fix(site): remove scroll-snap from landing page
`scroll-snap-type: y mandatory` was set on <html> globally (landing.css)
and re-asserted with !important when the v3 landing class was present
(landing-v3.css). The intended mobile escape hatch — disabling
scroll-snap-align inside @media (max-width: 768px) — never worked:

  1. Specificity mismatch. Enable rules used `.mls-landing-v3
     .mls-section-richcards` (0,2,0); the disable used `.mls-section-
     richcards` (0,1,0). Media queries don't bump specificity, so the
     enable rule won and snap stayed active on phones for two of three
     sections.
  2. The mandatory `scroll-snap-type` on <html> was never disabled, so
     even with all snap-aligns removed, mandatory snap remained active
     on iOS — fighting Safari's momentum scroll.

Both bugs combined to produce the jittery, half-snap behavior on phones.
Even fixed, mandatory snap on a content-rich landing page locks readers
into one section at a time on small viewports — the polish wasn't worth
the friction. Removed entirely.

Kept: scroll-behavior: smooth and scroll-padding-top: 60px on <html> for
in-page anchor smoothness.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 19:39:51 -04:00

1354 lines
36 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* =============================================================================
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 arent 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 <animate> 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 <animate> 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; }