@import "tailwindcss"; @layer base, components, utilities; /* ── Font: Heming (self-hosted variable monospace) ──────────── */ @font-face { font-family: "Heming"; src: url("/fonts/Heming-Variable.woff2") format("woff2-variations"), url("/fonts/Heming-Variable.ttf") format("truetype-variations"); font-weight: 100 900; font-style: normal; font-display: swap; } /* ── Font & Typography Declarations (Claude lookalike) ────── */ :root { --font-serif-claude: var(--font-newsreader), "Newsreader", "Source Serif 4", "Charter", "Merriweather", Georgia, serif; --font-sans-claude: var(--font-sans), "Plus Jakarta Sans", system-ui, -apple-system, sans-serif; --font-mono-claude: var(--font-mono), "JetBrains Mono", monospace; } /* ── Theme: Dark (Claude Warm Dark: Deep Charcoal & Terracotta) ─ */ :root, [data-theme="dark"] { --bg-base: #1A1917; /* Warm charcoal */ --bg-surface: #22211E; --bg-card: #2A2925; --bg-card-hover: #33312C; --border: #3A3832; --border-light: #494740; --accent-1: #D97757; /* Claude signature terracotta */ --accent-2: #E0886A; --accent-hover: #C86A4C; --accent-success: #48BB78; --accent-warn: #ED8936; --accent-danger: #F56565; --text-primary: #F5F4EE; /* Warm ivory */ --text-secondary: #B8B4A8; /* Muted warm stone */ --text-muted: #827E74; --btn-primary-bg: #D97757; --btn-primary-text: #FFFFFF; --btn-success-text: #FFFFFF; --badge-bg-alpha: 0.12; --diagram-bg: #1A1917; --badge-blue-bg: rgba(217, 119, 87, 0.12); --badge-blue-text: #E0886A; --badge-green-bg: rgba(72, 187, 120, 0.12); --badge-green-text: #48BB78; --badge-red-bg: rgba(245, 101, 101, 0.12); --badge-red-text: #F56565; --feedback-error-bg: rgba(245, 101, 101, 0.08); --feedback-error-border:rgba(245, 101, 101, 0.25); --feedback-success-bg: rgba(72, 187, 120, 0.08); --feedback-success-border: rgba(72, 187, 120, 0.25); --feedback-info-bg: rgba(217, 119, 87, 0.06); --feedback-info-border: rgba(217, 119, 87, 0.2); --mcq-hover-bg: rgba(255, 255, 255, 0.03); --mcq-correct-bg: rgba(72, 187, 120, 0.1); --mcq-correct-border: rgba(72, 187, 120, 0.35); --mcq-wrong-bg: rgba(245, 101, 101, 0.1); --mcq-wrong-border: rgba(245, 101, 101, 0.35); --radius-sm: 6px; --radius-md: 10px; --radius-lg: 14px; --card-shadow: 0 4px 24px rgba(0, 0, 0, 0.35); } /* ── Theme: Light (Claude Warm Ivory Parchment & Terracotta) ── */ [data-theme="light"] { --bg-base: #FAF9F5; /* Claude signature warm cream paper */ --bg-surface: #F3F1EC; --bg-card: #FFFFFF; --bg-card-hover: #F7F5F0; --border: #E8E5DE; --border-light: #DFDBD2; --accent-1: #D97757; /* Claude terracotta */ --accent-2: #C86A4C; --accent-hover: #BA5C3E; --accent-success: #2F855A; --accent-warn: #DD6B20; --accent-danger: #C53030; --text-primary: #2C2825; /* Warm charcoal */ --text-secondary: #615C55; /* Warm muted stone */ --text-muted: #8F8A81; --btn-primary-bg: #D97757; --btn-primary-text: #FFFFFF; --btn-success-text: #FFFFFF; --badge-bg-alpha: 0.08; --diagram-bg: #F3F1EC; --badge-blue-bg: rgba(217, 119, 87, 0.08); --badge-blue-text: #C86A4C; --badge-green-bg: rgba(47, 133, 90, 0.08); --badge-green-text: #2F855A; --badge-red-bg: rgba(197, 48, 48, 0.08); --badge-red-text: #C53030; --feedback-error-bg: rgba(197, 48, 48, 0.05); --feedback-error-border:rgba(197, 48, 48, 0.2); --feedback-success-bg: rgba(47, 133, 90, 0.05); --feedback-success-border: rgba(47, 133, 90, 0.2); --feedback-info-bg: rgba(217, 119, 87, 0.04); --feedback-info-border: rgba(217, 119, 87, 0.15); --mcq-hover-bg: rgba(0, 0, 0, 0.02); --mcq-correct-bg: rgba(47, 133, 90, 0.06); --mcq-correct-border: rgba(47, 133, 90, 0.25); --mcq-wrong-bg: rgba(197, 48, 48, 0.06); --mcq-wrong-border: rgba(197, 48, 48, 0.25); --radius-sm: 6px; --radius-md: 10px; --radius-lg: 14px; --card-shadow: 0 2px 14px rgba(44, 40, 37, 0.08), 0 1px 3px rgba(44, 40, 37, 0.04); } /* ── Base Reset ────────────────────────────────────────────── */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html, body { height: 100%; } @layer base { body { background: var(--bg-base); color: var(--text-primary); font-family: var(--font-sans-claude); font-weight: 400; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; line-height: 1.65; letter-spacing: -0.01em; } } /* ── Theme transition for all elements ─────────────────────── */ *, *::before, *::after { transition-property: background-color, border-color, color, box-shadow; transition-duration: 0.15s; transition-timing-function: ease; } /* Exclude elements that shouldn't transition (spinners, animations) */ .spinner, .fade-up, .progress-bar-fill { transition: none; } /* ── Typography (Claude Editorial Serif for Headings) ─────── */ h1 { font-family: var(--font-serif-claude); font-size: clamp(2.1rem, 4.5vw, 3.4rem); font-weight: 500; line-height: 1.18; letter-spacing: -0.02em; } h2 { font-family: var(--font-serif-claude); font-size: 1.65rem; font-weight: 500; line-height: 1.25; letter-spacing: -0.015em; } h3 { font-family: var(--font-serif-claude); font-size: 1.25rem; font-weight: 500; line-height: 1.3; letter-spacing: -0.01em; } p, li { color: var(--text-secondary); } /* ── Gradient Text ─────────────────────────────────────────── */ .grad-text { background: linear-gradient(135deg, var(--accent-1), var(--accent-2)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } /* ── Badge-New ─────────────────────────────────────────────── */ .badge-new { display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.35rem 0.85rem; background: var(--bg-card); border: 1px solid var(--border); border-radius: 6px; font-size: 0.8rem; color: var(--text-secondary); } .badge-new-pill { background: var(--btn-primary-bg); color: var(--btn-primary-text); padding: 0.1rem 0.4rem; border-radius: 4px; font-weight: 700; font-size: 0.65rem; text-transform: uppercase; } /* ── Terminal Component ────────────────────────────────────── */ .terminal { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-lg); overflow: hidden; display: flex; flex-direction: column; box-shadow: var(--card-shadow); transition: border-color 0.2s ease, box-shadow 0.2s ease; } .terminal:focus-within { border-color: var(--accent-1); } .terminal-header { display: flex; align-items: center; gap: 1.75rem; padding: 0 1.25rem; border-bottom: 1px solid var(--border); height: 42px; background: var(--bg-surface); } .terminal-tab { height: 100%; display: flex; align-items: center; font-size: 0.8rem; font-weight: 500; color: var(--text-secondary); font-family: inherit; cursor: pointer; position: relative; transition: color 0.15s ease; letter-spacing: 0.02em; text-transform: capitalize; } .terminal-tab:hover { color: var(--text-primary); } .terminal-tab.active { color: var(--text-primary); font-weight: 600; } .terminal-tab.active::after { content: ""; position: absolute; bottom: -1px; left: 0; right: 0; height: 2px; background: var(--accent-1); border-radius: 2px 2px 0 0; } .terminal-content { padding: 1.25rem; min-height: 120px; } .terminal-body { padding: 1rem 1.25rem; flex: 1; display: flex; flex-direction: column; justify-content: center; min-height: 80px; background: var(--bg-card); } .terminal-prompt { font-family: inherit; font-size: 0.95rem; color: var(--text-primary); display: flex; align-items: center; gap: 0.85rem; width: 100%; } .terminal-input { background: transparent; border: none; font-family: inherit; color: var(--text-primary); outline: none; flex: 1; font-size: 0.95rem; } .terminal-input::placeholder { color: var(--text-muted); } /* ── Cards ─────────────────────────────────────────────────── */ .card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-md); padding: 1.25rem; } .card:hover { border-color: var(--border-light); background: var(--bg-card-hover); } /* ── Buttons ───────────────────────────────────────────────── */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: 0.5rem; padding: 0.65rem 1.4rem; border-radius: var(--radius-sm); font-size: 0.9rem; font-weight: 500; cursor: pointer; border: none; outline: none; transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1); } .btn:hover { transform: translateY(-1px); box-shadow: 0 4px 12px rgba(0,0,0,0.15); } .btn:active { transform: translateY(0); } .btn:disabled { opacity: 0.35; cursor: not-allowed; transform: none; } .btn-primary { background: var(--btn-primary-bg); color: var(--btn-primary-text); } .btn-primary:hover { opacity: 0.9; } .btn-outline { background: transparent; color: var(--text-primary); border: 1px solid var(--border); } .btn-outline:hover { border-color: var(--text-primary); } /* ── Inputs ────────────────────────────────────────────────── */ .input { width: 100%; background: var(--bg-base); border: 1px solid var(--border); color: var(--text-primary); font-family: inherit; font-size: 0.85rem; border-radius: var(--radius-sm); padding: 0.55rem 0.75rem; outline: none; transition: border-color 0.15s ease; } .input:focus { border-color: var(--text-muted); } .input::placeholder { color: var(--text-muted); } .textarea { width: 100%; background: var(--bg-base); border: 1px solid var(--border); color: var(--text-primary); font-family: inherit; font-size: 0.85rem; border-radius: var(--radius-sm); padding: 0.65rem 0.75rem; outline: none; resize: vertical; line-height: 1.6; transition: border-color 0.15s ease; } .textarea:focus { border-color: var(--text-muted); } .textarea::placeholder { color: var(--text-muted); } .input-terminal { width: 100%; background: transparent; border: none; color: var(--text-primary); font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: 1.1rem; outline: none; padding: 0.5rem 0; } .input-terminal::placeholder { color: var(--text-muted); } /* ── Labels ────────────────────────────────────────────────── */ .form-label { display: block; font-size: 0.75rem; color: var(--text-muted); margin-bottom: 0.35rem; text-transform: uppercase; letter-spacing: 0.04em; } /* ── Feedback Box ──────────────────────────────────────────── */ .feedback-box { padding: 0.75rem 1rem; border-radius: var(--radius-sm); font-size: 0.825rem; line-height: 1.55; color: var(--text-secondary); border: 1px solid var(--border); background: var(--bg-base); } .feedback-box.error { background: var(--feedback-error-bg); border-color: var(--feedback-error-border); color: var(--accent-danger); } .feedback-box.success { background: var(--feedback-success-bg); border-color: var(--feedback-success-border); color: var(--accent-success); } .feedback-box.info { background: var(--feedback-info-bg); border-color: var(--feedback-info-border); color: var(--text-secondary); } /* ── Badge ─────────────────────────────────────────────────── */ .badge { display: inline-block; padding: 0.15rem 0.6rem; border-radius: 4px; font-size: 0.7rem; font-weight: 500; letter-spacing: 0.01em; background: var(--border); color: var(--text-secondary); } .badge-blue { background: var(--badge-blue-bg); color: var(--badge-blue-text); } .badge-green { background: var(--badge-green-bg); color: var(--badge-green-text); } .badge-red { background: var(--badge-red-bg); color: var(--badge-red-text); } /* ── MCQ Options ───────────────────────────────────────────── */ .mcq-option { display: block; width: 100%; text-align: left; padding: 0.7rem 0.9rem; border: 1px solid var(--border); border-radius: var(--radius-sm); background: transparent; color: var(--text-primary); font-family: inherit; font-size: 0.825rem; cursor: pointer; margin-bottom: 0.4rem; transition: all 0.15s ease; line-height: 1.5; } .mcq-option:hover { background: var(--mcq-hover-bg); border-color: var(--border-light); } .mcq-option.disabled { cursor: default; pointer-events: none; opacity: 0.7; } .mcq-option.correct { background: var(--mcq-correct-bg); border-color: var(--mcq-correct-border); opacity: 1; } .mcq-option.wrong { background: var(--mcq-wrong-bg); border-color: var(--mcq-wrong-border); opacity: 1; } /* ── Learner Card ──────────────────────────────────────────── */ .learner-card { padding: 0.75rem; border: 1px solid var(--border); border-radius: var(--radius-sm); background: transparent; cursor: pointer; transition: all 0.15s ease; } .learner-card:hover { border-color: var(--border-light); background: var(--bg-card-hover); } .learner-card.selected { border-color: var(--text-primary); background: rgba(255,255,255,0.04); } /* ── Progress Bar ──────────────────────────────────────────── */ .progress-bar-bg { width: 100%; height: 6px; background: var(--border); border-radius: 3px; overflow: hidden; } .progress-bar-fill { height: 100%; background: var(--accent-1); border-radius: 3px; transition: width 0.4s cubic-bezier(0.4, 0, 0.2, 1); } /* ── Main Layout ───────────────────────────────────────────── */ .main-container { max-width: 1100px; margin: 0 auto; padding: 4rem 1.5rem; } .sidebar { width: 224px; min-height: 100vh; background: var(--bg-surface); border-right: 1px solid var(--border); display: flex; flex-direction: column; padding: 1.5rem 0.75rem; gap: 0.2rem; position: fixed; top: 0; left: 0; } .sidebar-logo { font-size: 1.1rem; font-weight: 500; margin-bottom: 1.75rem; padding: 0 0.5rem; letter-spacing: -0.03em; } .nav-item { display: flex; align-items: center; gap: 0.65rem; padding: 0.55rem 0.7rem; border-radius: var(--radius-sm); font-size: 0.825rem; font-weight: 300; color: var(--text-muted); text-decoration: none; cursor: pointer; } .nav-item:hover { background: var(--bg-card); color: var(--text-secondary); } .nav-item.active { background: rgba(128,128,128,0.08); color: var(--text-primary); } .page-content { margin-left: 224px; padding: 2.5rem; min-height: 100vh; } /* ── Drop Zone ─────────────────────────────────────────────── */ .drop-zone { border: 1px dashed var(--border-light); border-radius: var(--radius-md); padding: 2.5rem 2rem; text-align: center; cursor: pointer; transition: all 0.15s ease; } .drop-zone:hover, .drop-zone.dragging { border-color: var(--text-muted); background: rgba(128,128,128,0.03); } /* ── Spinner ───────────────────────────────────────────────── */ @keyframes spin { to { transform: rotate(360deg); } } .spinner { width: 18px; height: 18px; border: 2px solid var(--border); border-top-color: var(--text-primary); border-radius: 50%; animation: spin 0.7s linear infinite; display: inline-block; } /* ── Fade In ───────────────────────────────────────────────── */ @keyframes fadeUp { from { opacity: 0; transform: translateY(15px); } to { opacity: 1; transform: translateY(0); } } .fade-up { animation: fadeUp 0.5s cubic-bezier(0.16, 1, 0.3, 1) both; } /* ── Scrollbar ─────────────────────────────────────────────── */ ::-webkit-scrollbar { width: 4px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: var(--border-light); border-radius: 2px; } ::-webkit-scrollbar-thumb:hover { background: var(--text-muted); } /* ── Hero Styles ───────────────────────────────────────────── */ .hero-badge { display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.2rem 0.6rem; border-radius: 3px; background: var(--btn-primary-bg); color: var(--btn-primary-text); font-size: 0.65rem; font-weight: 800; letter-spacing: 0.05em; text-transform: uppercase; } .hero-announcement { display: inline-flex; align-items: center; flex-wrap: wrap; gap: 0.75rem; padding: 0.35rem 0.8rem; border-radius: 6px; background: var(--bg-card); border: 1px solid var(--border); font-size: 0.85rem; color: var(--text-secondary); } .hero-announcement a { color: var(--text-muted); text-decoration: underline; text-underline-offset: 3px; } .hero-announcement a:hover { color: var(--text-primary); } /* ── Theme Toggle ──────────────────────────────────────────── */ .theme-toggle { display: flex; align-items: center; gap: 0.5rem; padding: 0.45rem 0.7rem; border-radius: var(--radius-sm); font-size: 0.8rem; color: var(--text-secondary); background: transparent; border: 1px solid var(--border); cursor: pointer; width: 100%; transition: all 0.15s ease; } .theme-toggle:hover { background: var(--bg-card); border-color: var(--border-light); } /* ── Streaming / generation animations ────────────────────────── */ /* Section streams in from slightly below */ @keyframes sectionStream { from { opacity: 0; transform: translateY(14px); } to { opacity: 1; transform: translateY(0); } } .section-stream { animation: sectionStream 0.38s cubic-bezier(0.22, 1, 0.36, 1) both; } /* Diagram card pops in from slightly smaller + invisible */ @keyframes diagramPop { from { opacity: 0; transform: scale(0.93) translateY(10px); } to { opacity: 1; transform: scale(1) translateY(0); } } .diagram-pop { animation: diagramPop 0.42s cubic-bezier(0.34, 1.56, 0.64, 1) both; } /* Inline diagram insertion — expands from 0 height */ @keyframes expandIn { from { max-height: 0; opacity: 0; } to { max-height: 700px; opacity: 1; } } .diagram-expand { animation: expandIn 0.5s cubic-bezier(0.22, 1, 0.36, 1) both; overflow: hidden; } /* Popover scales in from selection point */ @keyframes popoverIn { from { opacity: 0; transform: translateX(-50%) scale(0.88) translateY(-4px); } to { opacity: 1; transform: translateX(-50%) scale(1) translateY(0); } } .popover-animated { animation: popoverIn 0.2s cubic-bezier(0.34, 1.56, 0.64, 1) both; } /* Toast fly-up in */ @keyframes toastIn { from { opacity: 0; transform: translateX(-50%) translateY(16px); } to { opacity: 1; transform: translateX(-50%) translateY(0); } } /* Toast fade out */ @keyframes toastOut { from { opacity: 1; transform: translateX(-50%) translateY(0); } to { opacity: 0; transform: translateX(-50%) translateY(8px); } } .toast-in { animation: toastIn 0.28s cubic-bezier(0.22, 1, 0.36, 1) both; } .toast-out { animation: toastOut 0.22s cubic-bezier(0.4, 0, 1, 1) both; } /* Typewriter cursor on streaming text */ @keyframes blink { 0%,100% { opacity: 1; } 50% { opacity: 0; } } .typewriter-cursor::after { content: "▍"; display: inline-block; margin-left: 2px; animation: blink 0.9s step-end infinite; color: var(--text-muted); font-size: 0.85em; } /* Skeleton shimmer for loading placeholders */ @keyframes shimmer { from { background-position: -600px 0; } to { background-position: 600px 0; } } .skeleton { background: linear-gradient( 90deg, rgba(128,128,128,0.06) 25%, rgba(128,128,128,0.14) 50%, rgba(128,128,128,0.06) 75% ); background-size: 600px 100%; animation: shimmer 1.6s ease-in-out infinite; border-radius: 6px; }