/* ========================================================================== Flash Tutorial — visual system -------------------------------------------------------------------------- Clean, Apple/Google-inspired: generous whitespace, a confident type scale, soft tonal elevation instead of hairline-everywhere, white cards on a calm grey app surface (light) / deep neutral surfaces (dark). One brand accent — Flash amber — graded per surface so small text always clears ~4.5:1. Syntax highlighting (Monaco) stays One Dark / One Light verbatim. ========================================================================== */ :root { --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; --font-display: 'Orbitron', var(--font-sans); /* wordmark only */ --font-mono: 'JetBrains Mono', 'Fira Code', monospace; /* Softer, larger radii read calmer than tight corners */ --radius-s: 10px; /* small controls */ --radius-m: 14px; /* cards, callouts, code blocks */ --radius-l: 20px; /* large panels */ --radius-pill: 999px; /* Spacing scale */ --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-5: 24px; --space-6: 32px; --space-7: 48px; --transition-fast: 0.15s ease; --transition-normal: 0.28s cubic-bezier(0.32, 0.72, 0, 1); /* Apple-style ease */ --header-h: 64px; } .dark-theme { /* Surfaces — deep neutral, a touch warmer than pure black */ --bg-app: #17191e; --bg-panel: #1f2229; --bg-panel-hover: #262a32; --bg-header: rgba(23, 25, 30, 0.72); --bg-elevated: #21252b; --border-color: #2b2f37; --border-subtle: #23272e; /* Text */ --ink: #f5f5f7; /* wordmark neutral */ --text-primary: #e6e8ec; --text-secondary: #b3b8c2; --text-muted: #7d828d; /* Brand accent (amber) — matches the dark logo "lash" (#FBBF24) */ --accent: #fbbf24; /* text & icons on dark */ --accent-fill: #fbbf24; /* filled controls, wordmark "lash" */ --accent-fill-hover: #fcd34d; --accent-ink: #1a1205; /* text on an amber fill */ --accent-glow: rgba(251, 191, 36, 0.14); --accent-glow-strong: rgba(251, 191, 36, 0.22); /* Semantic states */ --info: #61afef; --info-bg: rgba(97, 175, 239, 0.12); --success: #98c379; --success-bg: rgba(152, 195, 121, 0.12); --error: #e06c75; --error-bg: rgba(224, 108, 117, 0.12); --warning: #d19a66; --warning-bg: rgba(209, 154, 102, 0.12); /* Editor & terminal surfaces — One Dark verbatim to match Monaco */ --bg-editor: #282c34; --bg-terminal: #16181d; /* Soft elevation (subtle on dark; pairs with a faint border) */ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.30); --shadow-md: 0 6px 20px rgba(0, 0, 0, 0.36); --shadow-lg: 0 20px 48px rgba(0, 0, 0, 0.50); } .light-theme { /* Surfaces — Apple-style calm grey app, white cards */ --bg-app: #f5f5f7; --bg-panel: #ffffff; --bg-panel-hover: #f0f0f3; --bg-header: rgba(255, 255, 255, 0.75); --bg-elevated: #ffffff; --border-color: #e4e4ea; --border-subtle: #ececf1; /* Text */ --ink: #1d1d1f; --text-primary: #1d1d1f; --text-secondary: #515154; --text-muted: #86868b; /* Brand accent (amber, darkened for small text on light) */ --accent: #b45309; --accent-fill: #f59e0b; --accent-fill-hover: #d97706; --accent-ink: #2a1d04; --accent-glow: rgba(245, 158, 11, 0.12); --accent-glow-strong: rgba(245, 158, 11, 0.18); /* Semantic states */ --info: #2563eb; --info-bg: rgba(37, 99, 235, 0.08); --success: #16a34a; --success-bg: rgba(22, 163, 74, 0.08); --error: #dc2626; --error-bg: rgba(220, 38, 38, 0.08); --warning: #c18401; --warning-bg: rgba(193, 132, 1, 0.10); /* Editor & terminal surfaces — One Light verbatim to match Monaco */ --bg-editor: #fafafa; --bg-terminal: #f5f5f7; /* Soft elevation — layered, low-opacity (Apple/Google) */ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.04), 0 1px 3px rgba(0, 0, 0, 0.06); --shadow-md: 0 4px 16px rgba(0, 0, 0, 0.06), 0 2px 6px rgba(0, 0, 0, 0.05); --shadow-lg: 0 16px 40px rgba(0, 0, 0, 0.10), 0 4px 12px rgba(0, 0, 0, 0.06); } /* ========================================================================== Base Elements & Reset ========================================================================== */ * { box-sizing: border-box; margin: 0; padding: 0; } html { -webkit-text-size-adjust: 100%; } body { font-family: var(--font-sans); background-color: var(--bg-app); color: var(--text-primary); line-height: 1.6; overflow: hidden; height: 100vh; height: 100dvh; /* mobile: track the real viewport when the URL bar collapses */ display: flex; flex-direction: column; -webkit-font-smoothing: antialiased; text-rendering: optimizeLegibility; transition: background-color var(--transition-normal), color var(--transition-normal); } a { color: var(--accent); text-decoration: none; text-underline-offset: 2px; transition: color var(--transition-fast); } a:hover { color: var(--accent-fill-hover); text-decoration: underline; } button { cursor: pointer; font-family: var(--font-sans); border: none; background: none; color: inherit; } :focus-visible { outline: 2px solid var(--accent-fill); outline-offset: 2px; border-radius: var(--radius-s); } ::selection { background-color: var(--accent-glow-strong); color: var(--text-primary); } /* Thin, quiet scrollbars */ ::-webkit-scrollbar { width: 10px; height: 10px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: var(--border-color); border: 3px solid transparent; background-clip: padding-box; border-radius: var(--radius-pill); } ::-webkit-scrollbar-thumb:hover { background: var(--text-muted); background-clip: padding-box; } /* ========================================================================== Header — clean nav bar, frosted glass over the app surface ========================================================================== */ .app-header { height: var(--header-h); background-color: var(--bg-header); -webkit-backdrop-filter: saturate(180%) blur(20px); backdrop-filter: saturate(180%) blur(20px); border-bottom: 1px solid var(--border-subtle); display: flex; justify-content: space-between; align-items: center; padding: 0 24px; z-index: 30; flex-shrink: 0; transition: background-color var(--transition-normal), border-color var(--transition-normal); } .header-logo-section { display: flex; align-items: center; gap: 14px; } /* Brand wordmark: bold neutral "F" + regular amber "lash" (Orbitron) */ .wordmark { font-family: var(--font-display); font-size: 19px; font-weight: 400; letter-spacing: 0.02em; line-height: 1; } .wordmark-f { font-weight: 700; color: var(--ink); } .wordmark-lash { color: var(--accent-fill); } .sub-badge { font-size: 11px; font-weight: 600; background-color: var(--accent-glow); color: var(--accent); padding: 4px 10px; border-radius: var(--radius-pill); text-transform: uppercase; letter-spacing: 0.07em; } .header-actions { display: flex; align-items: center; gap: 10px; } .github-btn { display: flex; align-items: center; gap: 7px; font-size: 13px; font-weight: 500; color: var(--text-primary); background-color: var(--bg-panel); border: 1px solid var(--border-color); padding: 7px 15px; border-radius: var(--radius-pill); transition: background-color var(--transition-fast), border-color var(--transition-fast), box-shadow var(--transition-fast); } .github-btn:hover { background-color: var(--bg-panel-hover); text-decoration: none; color: var(--text-primary); box-shadow: var(--shadow-sm); } .github-btn i { width: 15px; height: 15px; } .theme-toggle-btn, .layout-toggle-btn, .sidebar-toggle-btn { width: 36px; height: 36px; border-radius: var(--radius-s); border: 1px solid transparent; background-color: transparent; color: var(--text-secondary); display: flex; align-items: center; justify-content: center; transition: background-color var(--transition-fast), color var(--transition-fast); } .theme-toggle-btn:hover, .layout-toggle-btn:hover, .sidebar-toggle-btn:hover { background-color: var(--bg-panel-hover); color: var(--accent); } .theme-toggle-btn i, .layout-toggle-btn i, .sidebar-toggle-btn i { width: 18px; height: 18px; } /* Drawer toggle exists only on narrow screens (see media queries) */ .sidebar-toggle-btn { display: none; flex-shrink: 0; } /* Theme button shows only the icon for the current mode (auto/light/dark). */ .auto-icon, .light-icon, .dark-icon { display: none; } .theme-toggle-btn[data-mode="auto"] .auto-icon { display: block; } .theme-toggle-btn[data-mode="light"] .light-icon { display: block; } .theme-toggle-btn[data-mode="dark"] .dark-icon { display: block; } /* ========================================================================== App Layout ========================================================================== */ .app-layout { display: flex; flex: 1; overflow: hidden; position: relative; } /* Sidebar Navigation */ .app-sidebar { width: 280px; background-color: var(--bg-app); display: flex; flex-direction: column; flex-shrink: 0; transition: background-color var(--transition-normal); } /* Dim layer behind the off-canvas drawer; activated on narrow screens */ .sidebar-backdrop { display: none; position: fixed; top: var(--header-h); left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.40); -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px); z-index: 40; } .sidebar-backdrop.visible { display: block; } .sidebar-header { padding: 24px 28px 10px; } .sidebar-header h3 { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.09em; color: var(--text-muted); } .sidebar-nav { flex: 1; overflow-y: auto; padding: 4px 16px 20px; display: flex; flex-direction: column; gap: 2px; } .nav-item { display: flex; align-items: center; padding: 10px 14px; border-radius: var(--radius-s); color: var(--text-secondary); font-size: 14px; font-weight: 500; line-height: 1.3; text-align: left; transition: background-color var(--transition-fast), color var(--transition-fast); } .nav-item:hover { background-color: var(--bg-panel-hover); color: var(--text-primary); } .nav-item.active { background-color: var(--accent-glow); color: var(--accent); font-weight: 600; } .nav-loading { padding: 20px; text-align: center; color: var(--text-muted); font-size: 13px; } /* Workspace Pane (Split Screen) */ .workspace-pane { flex: 1; display: grid; grid-template-columns: 1fr 1fr; gap: 0; overflow: hidden; padding: 16px 16px 16px 0; transition: grid-template-columns var(--transition-normal); } /* Workspace Layout Modes */ .workspace-pane.reader-only { grid-template-columns: 1fr 0px; } .workspace-pane.editor-only { grid-template-columns: 0px 1fr; } /* ========================================================================== Content Reader Panel (Left) ========================================================================== */ .content-panel { display: flex; flex-direction: column; background-color: var(--bg-app); overflow: hidden; transition: background-color var(--transition-normal); } .content-body { flex: 1; overflow-y: auto; padding: 56px 56px 64px; font-size: 16px; color: var(--text-primary); scroll-behavior: smooth; } /* Comfortable reading measure. Plain block flow left-aligns by default (the centring auto-margins are gone), and lets the panel scroll normally — a flex column here squishes tall code blocks instead of stacking them. */ .content-body > * { max-width: 820px; } /* Markdown rendering — hierarchy through type scale and space, no boxes */ .content-body h1, .content-body h2, .content-body h3 { color: var(--text-primary); font-weight: 700; letter-spacing: -0.022em; } .content-body h1 { font-size: 36px; line-height: 1.1; margin: 0 0 12px; } .content-body h2 { font-size: 25px; line-height: 1.2; margin: 56px 0 16px; } .content-body h3 { font-size: 19px; line-height: 1.3; margin: 36px 0 12px; letter-spacing: -0.015em; } .content-body p { margin: 0 0 18px; color: var(--text-secondary); line-height: 1.75; } .content-body ul, .content-body ol { margin: 0 0 20px; padding-left: 22px; color: var(--text-secondary); } .content-body li { margin-bottom: 8px; line-height: 1.7; } .content-body li::marker { color: var(--text-muted); } .content-body strong { color: var(--text-primary); font-weight: 600; } .content-body hr { border: none; border-top: 1px solid var(--border-subtle); margin: 40px 0; } /* Plain blockquotes */ .content-body blockquote { margin: 24px 0; padding: 14px 22px; border-left: 3px solid var(--accent-fill); background-color: var(--bg-panel); border-radius: var(--radius-m); box-shadow: var(--shadow-sm); } .content-body blockquote p { margin-bottom: 0; color: var(--text-primary); font-weight: 500; } /* Callout alerts (GitHub semantics: note=blue, tip=green, warning=amber) */ .callout { margin: 24px 0; padding: 16px 20px; border-radius: var(--radius-m); border: 1px solid var(--border-subtle); border-left: 3px solid var(--info); background-color: var(--bg-panel); box-shadow: var(--shadow-sm); } .callout-title { font-weight: 600; font-size: 12px; text-transform: uppercase; letter-spacing: 0.08em; margin-bottom: 8px; display: flex; align-items: center; gap: 8px; } .callout p { margin-bottom: 0; } .callout-note { border-left-color: var(--info); } .callout-note .callout-title { color: var(--info); } .callout-tip { border-left-color: var(--success); } .callout-tip .callout-title { color: var(--success); } .callout-warning { border-left-color: var(--warning); } .callout-warning .callout-title { color: var(--warning); } /* Code & tables */ .content-body pre { background-color: var(--bg-panel); border: 1px solid var(--border-subtle); border-radius: var(--radius-m); padding: 18px 20px; margin: 24px 0; overflow-x: auto; box-shadow: var(--shadow-sm); } .content-body code { font-family: var(--font-mono); font-size: 13.5px; background-color: var(--bg-panel-hover); border: 1px solid var(--border-subtle); padding: 1px 6px; border-radius: 6px; color: var(--text-primary); } .content-body pre code { background-color: transparent; border: none; padding: 0; border-radius: 0; font-size: 13.5px; line-height: 1.6; } .content-body table { width: 100%; border-collapse: collapse; margin: 24px 0; font-size: 14px; } .content-body th, .content-body td { text-align: left; padding: 10px 14px; border-bottom: 1px solid var(--border-subtle); } .content-body th { color: var(--text-primary); font-weight: 600; } .content-body td { color: var(--text-secondary); } /* Runnable example cards */ .example-card { background-color: var(--bg-panel); border: 1px solid var(--border-subtle); border-radius: var(--radius-m); margin: 28px 0; overflow: hidden; box-shadow: var(--shadow-sm); transition: box-shadow var(--transition-fast); } .example-card:hover { box-shadow: var(--shadow-md); } .example-header { padding: 12px 18px; border-bottom: 1px solid var(--border-subtle); display: flex; justify-content: space-between; align-items: center; } .example-title { font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: var(--text-muted); } .example-card pre { border: none; border-radius: 0; margin: 0; max-width: none; box-shadow: none; background-color: transparent; } .load-example-btn { font-size: 12px; font-weight: 600; background-color: var(--accent-glow); color: var(--accent); padding: 5px 13px; border-radius: var(--radius-pill); display: flex; align-items: center; gap: 5px; transition: background-color var(--transition-fast), color var(--transition-fast); } .load-example-btn:hover { background-color: var(--accent-fill); color: var(--accent-ink); } /* Loading state */ .content-loading { display: flex; flex-direction: column; align-items: center; justify-content: center; width: 100%; max-width: none; min-height: 60vh; color: var(--text-secondary); gap: 16px; } .spinner { width: 32px; height: 32px; border: 3px solid var(--border-color); border-top-color: var(--accent-fill); border-radius: 50%; animation: spin 1s infinite linear; } /* Chapter prev/next */ .content-nav-buttons { padding: 16px 40px; display: flex; justify-content: space-between; gap: 12px; } .nav-btn { display: flex; align-items: center; gap: 7px; font-size: 14px; font-weight: 500; color: var(--text-primary); background-color: var(--bg-panel); border: 1px solid var(--border-color); padding: 9px 18px; border-radius: var(--radius-pill); transition: background-color var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast), box-shadow var(--transition-fast); } .nav-btn:hover:not(:disabled) { background-color: var(--bg-panel); border-color: var(--accent-fill); color: var(--accent); box-shadow: var(--shadow-sm); } .nav-btn:disabled { opacity: 0.4; cursor: not-allowed; } .nav-btn i { width: 16px; height: 16px; } /* ========================================================================== Playground Panel (Right) — a floating card ========================================================================== */ .playground-panel { display: flex; flex-direction: column; overflow: hidden; background-color: var(--bg-panel); border: 1px solid var(--border-subtle); border-radius: var(--radius-l); box-shadow: var(--shadow-md); } .playground-header { height: 52px; background-color: var(--bg-panel); border-bottom: 1px solid var(--border-subtle); display: flex; justify-content: space-between; align-items: center; padding: 0 14px; flex-shrink: 0; } .tab-selectors { display: flex; gap: 4px; align-items: center; background-color: var(--bg-app); padding: 4px; border-radius: var(--radius-pill); } .tab-btn { padding: 6px 14px; font-size: 13px; font-weight: 500; color: var(--text-secondary); border-radius: var(--radius-pill); display: flex; align-items: center; gap: 6px; transition: color var(--transition-fast), background-color var(--transition-fast), box-shadow var(--transition-fast); } .tab-btn:hover { color: var(--text-primary); } .tab-btn.active { color: var(--accent); background-color: var(--bg-panel); box-shadow: var(--shadow-sm); font-weight: 600; } .tab-btn i { width: 14px; height: 14px; } .playground-actions { display: flex; align-items: center; } .action-btn { display: flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 600; padding: 8px 18px; border-radius: var(--radius-pill); transition: background-color var(--transition-fast), transform var(--transition-fast), box-shadow var(--transition-fast); } .action-btn:active { transform: scale(0.97); } .action-btn.primary { background-color: var(--accent-fill); color: var(--accent-ink); box-shadow: var(--shadow-sm); } .action-btn.primary:hover { background-color: var(--accent-fill-hover); box-shadow: var(--shadow-md); } .action-btn i { width: 14px; height: 14px; } .playground-body { flex: 1; overflow: hidden; position: relative; } .tab-content { display: none; width: 100%; height: 100%; overflow: hidden; } .tab-content.active { display: block; } #editor-container, #output-container { width: 100%; height: 100%; background-color: var(--bg-editor); } /* ========================================================================== Terminal Drawer ========================================================================== */ .playground-terminal { height: 168px; background-color: var(--bg-terminal); border-top: 1px solid var(--border-subtle); display: flex; flex-direction: column; overflow: hidden; flex-shrink: 0; transition: height var(--transition-normal); } .terminal-header { height: 40px; flex-shrink: 0; padding: 0 16px; background-color: var(--bg-terminal); display: flex; justify-content: space-between; align-items: center; user-select: none; cursor: pointer; /* tap to collapse/expand the drawer */ } .playground-terminal.collapsed { height: 40px; } /* Collapse chevron in the terminal header */ .terminal-chevron { width: 16px; height: 16px; color: var(--text-muted); transition: transform var(--transition-fast); } .playground-terminal.collapsed .terminal-chevron { transform: rotate(180deg); } .terminal-title { font-size: 12px; font-weight: 600; color: var(--text-secondary); display: flex; align-items: center; gap: 7px; } .terminal-title i { width: 14px; height: 14px; } .terminal-controls { display: flex; align-items: center; gap: 12px; } .status-indicator { font-size: 11px; font-weight: 600; padding: 3px 10px; border-radius: var(--radius-pill); letter-spacing: 0.02em; } .status-indicator.idle { background-color: var(--bg-panel-hover); color: var(--text-secondary); } .status-indicator.transpiling { background-color: var(--accent-glow); color: var(--accent); } .status-indicator.success { background-color: var(--success-bg); color: var(--success); } .status-indicator.error { background-color: var(--error-bg); color: var(--error); } .control-btn { color: var(--text-muted); display: flex; align-items: center; justify-content: center; transition: color var(--transition-fast); } .control-btn:hover { color: var(--error); } .control-btn i { width: 15px; height: 15px; } .terminal-output { flex: 1; padding: 14px 16px; overflow-y: auto; font-family: var(--font-mono); font-size: 12.5px; color: var(--text-secondary); white-space: pre-wrap; line-height: 1.55; } .terminal-output.log-error { color: var(--error); } .terminal-output.log-success { color: var(--success); } .terminal-output.log-warning { color: var(--warning); } /* ========================================================================== Animations — functional only, nothing decorative ========================================================================== */ @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; } } /* ========================================================================== Responsive (Medium Screens) -------------------------------------------------------------------------- ≤992px: the chapters sidebar becomes an off-canvas drawer (hamburger in the header), and the reader/playground panes stack vertically. The app keeps its fixed-viewport layout — 100dvh on handles mobile URL bars. ========================================================================== */ @media (max-width: 992px) { .sidebar-toggle-btn { display: flex; } .app-sidebar { position: fixed; top: var(--header-h); bottom: 0; left: 0; width: 300px; max-width: 85vw; z-index: 50; background-color: var(--bg-panel); border-right: 1px solid var(--border-subtle); box-shadow: var(--shadow-lg); transform: translateX(-110%); transition: transform var(--transition-normal); } .app-sidebar.open { transform: translateX(0); } .workspace-pane { grid-template-columns: 1fr; grid-template-rows: 1fr 1fr; gap: 12px; padding: 12px; } .workspace-pane.reader-only { grid-template-columns: 1fr; grid-template-rows: 1fr 0px; } .workspace-pane.editor-only { grid-template-columns: 1fr; grid-template-rows: 0px 1fr; } } @media (max-width: 600px) { body { --header-h: 56px; } .app-header { padding: 0 14px; height: 56px; } .header-actions { gap: 4px; } .github-label { display: none; } /* icon-only GitHub button saves header width */ .github-btn { padding: 7px 10px; } .content-body { padding: 32px 20px 44px; font-size: 15px; } .content-body h1 { font-size: 29px; } .content-body h2 { font-size: 22px; margin-top: 40px; } .content-nav-buttons { padding: 12px 20px; } .workspace-pane { padding: 10px; gap: 10px; } .playground-header { padding: 0 10px; height: 48px; } .tab-btn { padding: 6px 11px; } .action-btn { padding: 7px 13px; } /* Smaller default drawer; users can collapse it by tapping its header */ .playground-terminal { height: 140px; } }