mirror of
https://github.com/harvard-edge/cs249r_book.git
synced 2026-05-07 02:03:55 -05:00
`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>
1354 lines
36 KiB
CSS
1354 lines
36 KiB
CSS
/* =============================================================================
|
||
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 <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; }
|