/* ============================================================================= Deep Research — entry / about / faq / graph pages. Design language mirrors krisyotam/share + krisyotam/tools. Index page uses its own static/index.css. ============================================================================= */ /* ── Tokens — OpenAI (ChatGPT) language ───────────────────────── See CLAUDE.md for the full reference + local divergences. */ :root { /* OpenAI named palette */ --color-carbon: #0d0d0d; --color-snow: #ffffff; --color-fog: #f9f9f9; --color-pewter: #5d5d5d; --color-stone: #8f8f8f; --color-arctic-mist: #ececec; --color-link-blue: #007aff; /* Semantic surfaces (light default) */ --bg-color: var(--color-snow); --bg-surface: var(--color-fog); --bg-hover: var(--color-arctic-mist); --fg-color: var(--color-carbon); --fg-muted: var(--color-pewter); --fg-dim: var(--color-stone); --border-color: rgba(0,0,0,0.08); --rule-color: rgba(0,0,0,0.12); --link: var(--color-link-blue); --code-bg: var(--color-fog); --panel-bg: var(--color-snow); /* Legacy HSL-triple aliases — preserved so the rest of the stylesheet (toolbar, panel, sidebar) doesn't need a rewrite. */ --bg: 0 0% 100%; --fg: 0 0% 5%; --fg-dim-h: 0 0% 56%; --muted: 0 0% 92%; --muted-fg: 0 0% 37%; --border: 0 0% 92%; --rule: 0 0% 86%; --accent: 0 0% 98%; /* Aliases used by d3 graph code — keep them resolving to colors */ --text: var(--fg-color); --text-muted: var(--fg-muted); --text-dim: var(--color-stone); /* Type families — OpenAI uses the system stack */ --font-ui: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; --font-title: 'Lora', ui-serif, Georgia, Cambria, 'Times New Roman', serif; --font-mono: ui-monospace, "SF Mono", "JetBrains Mono", Menlo, Consolas, monospace; /* Aliases for older rules that referenced --serif / --sans / --mono */ --serif: var(--font-title); --sans: var(--font-ui); --mono: var(--font-mono); /* OpenAI type scale */ --text-caption: 14px; --leading-caption: 1.43; --text-body: 16px; --leading-body: 1.5; --text-subheading: 18px; --leading-subheading: 1.56; --text-heading: 24px; --leading-heading: 1; /* OpenAI spacing scale */ --spacing-4: 4px; --spacing-6: 6px; --spacing-8: 8px; --spacing-10: 10px; --spacing-12: 12px; --spacing-16: 16px; --spacing-20: 20px; --spacing-60: 60px; --spacing-64: 64px; --spacing-127: 127px; /* Radii */ --radius-default: 10px; --radius-button: 10px; --radius-pill: 16px; --radius-input: 28px; --sidebar-w: 56px; --panel-w: 380px; --max-content: 720px; --max-breakout: 1100px; } [data-theme="dark"] { --bg-color: #121212; --bg-surface: #1a1a1a; --bg-hover: #222222; --fg-color: #f3f3f3; --fg-muted: #a8a8a8; --fg-dim: #6f6f6f; --border-color: rgba(255,255,255,0.10); --rule-color: rgba(255,255,255,0.16); --code-bg: #1a1a1a; --panel-bg: #121212; --bg: 0 0% 7%; --fg: 0 0% 95%; --fg-dim-h: 0 0% 44%; --muted: 0 0% 8%; --muted-fg: 0 0% 66%; --border: 0 0% 10%; --rule: 0 0% 14%; --accent: 0 0% 8%; color-scheme: dark; } @media (prefers-color-scheme: dark) { html:not([data-theme="light"]):not([data-theme="dark"]) { color-scheme: dark; --bg-color: #121212; --bg-surface: #1a1a1a; --bg-hover: #222222; --fg-color: #f3f3f3; --fg-muted: #a8a8a8; --fg-dim: #6f6f6f; --border-color: rgba(255,255,255,0.10); --rule-color: rgba(255,255,255,0.16); --code-bg: #1a1a1a; --panel-bg: #121212; --bg: 0 0% 7%; --fg: 0 0% 95%; --fg-dim-h: 0 0% 44%; --muted: 0 0% 8%; --muted-fg: 0 0% 66%; --border: 0 0% 10%; --rule: 0 0% 14%; --accent: 0 0% 8%; } } /* Theme-icon visibility (Sun shown in dark, Moon shown in light) */ .theme-icon-light { display: none; } .theme-icon-dark { display: flex; } [data-theme="dark"] .theme-icon-light { display: flex; } [data-theme="dark"] .theme-icon-dark { display: none; } /* ── Base ─────────────────────────────────────────────────────── */ *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; } html { font-size: 16px; } html, body { background: var(--bg-color); color: var(--fg-color); } body { font-family: var(--font-ui); font-feature-settings: "liga" 0; font-size: var(--text-body); line-height: var(--leading-body); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-rendering: optimizeLegibility; } /* ── Layout ───────────────────────────────────────────────────── */ .layout { display: flex; min-height: 100vh; min-height: 100dvh; } /* ── Left sidebar — minimal dot rail + hover tooltips (original) ── */ .sidebar { position: fixed; top: 0; left: 0; width: var(--sidebar-w); height: 100vh; background: var(--bg-surface); border-right: 1px solid var(--border-color); display: flex; flex-direction: column; align-items: center; padding: var(--spacing-16) 0; z-index: 10; } .sidebar-back { display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; color: hsl(var(--muted-fg)); text-decoration: none; border-radius: 6px; transition: background 0.15s, color 0.15s; } .sidebar-back:hover { background: hsl(var(--accent)); color: hsl(var(--fg)); } .sidebar-back svg { width: 18px; height: 18px; } .toc { margin: auto 0; /* center the dot cluster in remaining sidebar space */ list-style: none; display: flex; flex-direction: column; gap: 2px; width: 100%; padding: 8px; overflow-y: auto; flex: 0 0 auto; /* take natural height; don't stretch */ max-height: calc(100% - 64px); /* safety: scroll if cluster is taller than viewport */ scrollbar-width: none; } .toc::-webkit-scrollbar { display: none; } .toc li { position: relative; } .toc a { display: block; width: 6px; height: 6px; border-radius: 50%; background: var(--fg-dim); /* Stone — visible on Fog rail */ margin: 4px auto; transition: background 0.2s, transform 0.2s; text-decoration: none; } .toc a:hover, .toc a.active { background: var(--fg-color); /* Carbon — focused dot pops */ transform: scale(1.5); } .toc-tooltip { position: absolute; left: 48px; top: 50%; transform: translateY(-50%); background: hsl(var(--bg)); border: 1px solid hsl(var(--border)); color: hsl(var(--fg)); padding: 4px 10px; border-radius: 6px; font-family: var(--sans); font-size: 12px; white-space: nowrap; pointer-events: none; opacity: 0; transition: opacity 0.15s; z-index: 100; box-shadow: 0 4px 16px rgba(0,0,0,0.06); } [data-theme="dark"] .toc-tooltip { box-shadow: 0 4px 16px rgba(0,0,0,0.4); } .toc li:hover .toc-tooltip { opacity: 1; } /* ── Main content column ──────────────────────────────────────── */ .main { margin-left: var(--sidebar-w); flex: 1; display: flex; justify-content: center; padding: 72px 56px 120px; } .content { max-width: var(--max-content); width: 100%; } /* ── Header section (title + meta) ───────────────────────────── Title: Lora serif — the only font distinction in the document, marking "editorial report" the way OpenAI Sans marks the hero prompt on chatgpt.com. Sized at the heading rung but weight 500. ============================================================== */ .content > h1 { font-family: var(--font-title); font-weight: 500; font-size: 36px; letter-spacing: -0.016em; line-height: 1.12; color: var(--fg-color); margin: 0 0 var(--spacing-12); } .content-meta { font-family: var(--font-mono); font-size: 12px; font-weight: 500; letter-spacing: 0.02em; color: var(--fg-muted); margin-bottom: var(--spacing-64); display: inline-flex; align-items: center; flex-wrap: wrap; gap: var(--spacing-10); } .content-meta time { font-variant-numeric: tabular-nums; } .content-meta .sep { color: var(--color-stone); opacity: 0.5; font-size: 12px; line-height: 1; } .content-meta .meta-tags { color: var(--fg-muted); } /* ── Content typography — OpenAI ───────────────────────────────── System UI for body and section headings. 16/1.7 (1.7 line-height is our local divergence from 1.5; long-form reading wants it). Headings stay within the 24px max weight 600 rule. =============================================================== */ .content { font-family: var(--font-ui); font-feature-settings: "liga" 0; font-size: var(--text-body); line-height: 1.7; color: var(--fg-color); font-weight: 400; } .content h2 { font-family: var(--font-ui); font-weight: 600; font-size: var(--text-heading); letter-spacing: -0.012em; line-height: 1.15; margin: var(--spacing-64) 0 var(--spacing-16); color: var(--fg-color); } .content h3 { font-family: var(--font-ui); font-weight: 600; font-size: var(--text-subheading); letter-spacing: -0.005em; line-height: var(--leading-subheading); margin: 40px 0 var(--spacing-10); color: var(--fg-color); } .content h4 { font-family: var(--font-ui); font-weight: 600; font-size: var(--text-caption); letter-spacing: 0.06em; text-transform: uppercase; color: var(--fg-muted); margin: var(--spacing-20) 0 var(--spacing-6); } .content h5, .content h6 { font-family: var(--font-ui); font-weight: 600; font-size: var(--text-caption); color: var(--fg-color); margin: var(--spacing-16) 0 var(--spacing-6); } .content h2 + h3, .content h3 + h4 { margin-top: var(--spacing-16); } .content p { margin-bottom: var(--spacing-16); } .content a { color: var(--link); text-decoration: none; border-bottom: 1px solid color-mix(in srgb, var(--link) 30%, transparent); padding-bottom: 1px; transition: border-color 140ms ease; } .content a:hover { border-bottom-color: var(--link); } .content ul, .content ol { margin: 0 0 var(--spacing-16) 0; padding-left: var(--spacing-20); } .content li { margin-bottom: var(--spacing-6); } .content blockquote { border-left: 2px solid var(--rule-color); padding: var(--spacing-4) 0 var(--spacing-4) var(--spacing-16); color: var(--fg-muted); margin: var(--spacing-20) 0; } .content blockquote blockquote { margin-top: var(--spacing-8); border-left-color: var(--border-color); } .content strong { font-weight: 600; color: var(--fg-color); } .content em { font-style: italic; } /* Markdown often double-bolds headings with ** — keep heading weight neutral. */ .content h1 strong, .content h2 strong, .content h3 strong, .content h4 strong, .content h5 strong, .content h6 strong { font-weight: inherit; color: inherit; } .content code { font-family: var(--font-mono); font-size: 14px; background: var(--code-bg); border: 1px solid var(--border-color); padding: 1px 6px; border-radius: var(--radius-default); } .content pre { font-family: var(--font-mono); font-size: 14px; line-height: 1.55; background: var(--code-bg); border: 1px solid var(--border-color); border-radius: var(--radius-default); padding: var(--spacing-12) var(--spacing-16); margin: var(--spacing-20) 0; overflow-x: auto; } .content pre code { background: transparent; border: 0; padding: 0; font-size: inherit; } .content hr { border: 0; border-top: 1px solid var(--rule-color); margin: var(--spacing-60) 0; } .content img { max-width: 100%; height: auto; display: block; margin: var(--spacing-20) auto; border-radius: var(--radius-default); } /* Tables — break out of the 720px reading column up to 1100px wide, centered within .main, never crossing the 56px sidebar. The table itself uses the OpenAI spacing/density. */ .content .table-wrap { position: relative; width: min(var(--max-breakout), calc(100vw - var(--sidebar-w) - var(--spacing-64))); left: 50%; transform: translateX(-50%); margin: var(--spacing-20) 0; overflow-x: auto; -webkit-overflow-scrolling: touch; border-radius: var(--radius-default); } .content table { width: 100%; border-collapse: collapse; font-size: var(--text-caption); line-height: var(--leading-caption); margin: 0; } .content thead { background: var(--bg-surface); border-bottom: 1px solid var(--border-color); } .content th { text-align: left; font-family: var(--font-ui); font-size: 12px; font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; color: var(--fg-muted); padding: var(--spacing-10) var(--spacing-12); white-space: nowrap; } .content td { padding: var(--spacing-10) var(--spacing-12); border-bottom: 1px solid var(--border-color); vertical-align: top; } .content tbody tr:last-child td { border-bottom: none; } .content tbody tr:hover { background: var(--bg-surface); } .content tbody tr { transition: background 120ms ease; } .content dl { margin-bottom: var(--spacing-16); } .content dt { font-weight: 600; margin-bottom: var(--spacing-4); } .content dd { margin-left: var(--spacing-20); margin-bottom: var(--spacing-12); color: var(--fg-muted); } .cite-ref { font-family: var(--font-mono); font-size: 11px; vertical-align: super; color: var(--link); cursor: pointer; margin-left: 1px; } .cite-ref:hover { text-decoration: underline; } /* ── Toolbar (top right) ─────────────────────────────────────── */ .toolbar { position: fixed; top: 18px; right: 24px; display: flex; gap: 6px; z-index: 20; } .toolbar-btn { appearance: none; display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; border: 1px solid hsl(var(--border)); border-radius: 4px; background: hsl(var(--bg)); color: hsl(var(--fg-dim)); cursor: pointer; transition: background 120ms ease, color 120ms ease, border-color 120ms ease; position: relative; } .toolbar-btn:hover { background: hsl(var(--accent)); color: hsl(var(--fg)); border-color: hsl(var(--rule)); } .toolbar-btn svg { width: 15px; height: 15px; } /* ── Download dropdown ───────────────────────────────────────── */ .download-menu { position: absolute; top: calc(100% + 6px); right: 0; background: hsl(var(--bg)); border: 1px solid hsl(var(--border)); border-radius: 6px; padding: 4px; min-width: 180px; display: none; flex-direction: column; box-shadow: 0 6px 24px rgba(0,0,0,0.08); } [data-theme="dark"] .download-menu { box-shadow: 0 6px 24px rgba(0,0,0,0.35); } .download-menu.open { display: flex; } .download-menu button { appearance: none; background: none; border: none; color: hsl(var(--fg)); padding: 8px 12px; text-align: left; font-family: var(--sans); font-size: 13px; border-radius: 4px; cursor: pointer; } .download-menu button:hover { background: hsl(var(--accent)); } /* ── Sources panel — sexier OpenAI-inspired right rail ─────────── */ .sources-panel { position: fixed; top: 0; right: 0; width: var(--panel-w); height: 100vh; height: 100dvh; background: hsl(var(--bg)); border-left: 1px solid hsl(var(--border)); transform: translateX(100%); transition: transform 280ms cubic-bezier(0.22, 0.61, 0.36, 1); z-index: 30; display: flex; flex-direction: column; box-shadow: -20px 0 60px rgba(0,0,0,0.04); } [data-theme="dark"] .sources-panel { box-shadow: -20px 0 60px rgba(0,0,0,0.4); } .sources-panel.open { transform: translateX(0); } .sources-header { padding: 22px 24px 18px; display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; flex-shrink: 0; border-bottom: 1px solid hsl(var(--border)); } .sources-header-text { display: flex; flex-direction: column; gap: 4px; } .sources-header h3 { font-family: var(--serif); font-weight: 500; font-size: 18px; letter-spacing: -0.005em; color: hsl(var(--fg)); line-height: 1.2; display: inline-flex; align-items: baseline; gap: 8px; } .sources-header h3 .count { font-family: 'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size: 11px; font-weight: 500; letter-spacing: 0.06em; color: hsl(var(--muted-fg)); background: transparent; border: 0; padding: 0; font-variant-numeric: tabular-nums; } .sources-header-sub { font-family: 'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size: 10.5px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.14em; color: hsl(var(--muted-fg)); } .sources-close { appearance: none; background: transparent; border: 1px solid transparent; color: hsl(var(--muted-fg)); cursor: pointer; width: 28px; height: 28px; border-radius: 6px; display: inline-flex; align-items: center; justify-content: center; transition: background 120ms ease, color 120ms ease, border-color 120ms ease; flex-shrink: 0; } .sources-close:hover { background: hsl(var(--accent)); color: hsl(var(--fg)); border-color: hsl(var(--border)); } .sources-close svg { width: 14px; height: 14px; } .sources-list { flex: 1; overflow-y: auto; padding: 8px 12px 24px; scrollbar-width: thin; scrollbar-color: hsl(var(--border)) transparent; } .sources-list::-webkit-scrollbar { width: 6px; } .sources-list::-webkit-scrollbar-thumb { background: hsl(var(--border)); border-radius: 3px; } .source-item { display: grid; grid-template-columns: 20px 1fr; gap: 12px; padding: 12px 12px 12px 10px; border-radius: 8px; text-decoration: none; color: hsl(var(--fg)); transition: background 140ms ease, transform 140ms ease; margin-bottom: 1px; align-items: start; position: relative; } .source-item:hover { background: hsl(var(--accent)); } .source-item:active { transform: scale(0.995); } /* Favicon — replaces the old numeric chip */ .source-icon { width: 20px; height: 20px; border-radius: 4px; margin-top: 2px; object-fit: contain; flex-shrink: 0; background: hsl(var(--accent)); } .source-body { min-width: 0; display: flex; flex-direction: column; gap: 4px; } /* Source panel typography — pinned explicitly to the pre-overhaul stack (Inter + JetBrains Mono) so it doesn't drift when global tokens move. */ .source-title { font-family: 'Inter', ui-sans-serif, system-ui, -apple-system, 'Segoe UI', sans-serif; font-size: 13.5px; font-weight: 500; line-height: 1.4; color: hsl(var(--fg)); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; margin: 0; } .source-url { font-family: 'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, Consolas, monospace; font-size: 11px; color: hsl(var(--muted-fg)); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* ── Graph modal ─────────────────────────────────────────────── */ .graph-backdrop { display: none; position: fixed; inset: 0; background: rgba(0, 0, 0, 0.45); z-index: 50; align-items: center; justify-content: center; } [data-theme="dark"] .graph-backdrop { background: rgba(0, 0, 0, 0.65); } .graph-backdrop.open { display: flex; } .graph-modal { width: 80vw; height: 80vh; background: hsl(var(--bg)); border: 1px solid hsl(var(--border)); border-radius: 8px; position: relative; overflow: hidden; } .graph-modal svg { width: 100%; height: 100%; } .graph-modal-tooltip { position: absolute; top: 14px; left: 14px; background: var(--bg-color); border: 1px solid var(--border-color); color: var(--fg-color); padding: 6px 12px; border-radius: var(--radius-default); font-family: var(--font-ui); font-size: 12px; font-weight: 500; letter-spacing: -0.005em; white-space: nowrap; pointer-events: none; opacity: 0; transition: opacity 180ms ease; z-index: 51; } .graph-modal-tooltip.visible { opacity: 1; } /* ── Static pages (about, faq, /graph/) ──────────────────────── */ .page-container { max-width: 640px; margin: 80px auto 64px; padding: 0 32px; } .page-container h1 { font-family: var(--serif); font-weight: 500; font-size: 32px; letter-spacing: -0.01em; line-height: 1.15; margin-bottom: 28px; } .page-container h2 { font-family: var(--serif); font-weight: 500; font-size: 20px; margin-top: 36px; margin-bottom: 12px; } .page-container p, .page-container li { color: hsl(var(--fg)); line-height: 1.72; margin-bottom: 12px; font-size: 15px; } .page-container a { color: hsl(var(--fg)); text-decoration: underline; text-decoration-color: hsl(var(--rule)); text-underline-offset: 3px; } .page-container a:hover { text-decoration-color: hsl(var(--fg-dim)); } .page-nav { margin-bottom: 48px; font-family: var(--mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.12em; } .page-nav a { color: hsl(var(--muted-fg)); text-decoration: none; transition: color 120ms ease; } .page-nav a:hover { color: hsl(var(--fg)); } /* Page-level theme button (about / faq) — kept for compatibility */ .page-theme-btn { position: fixed; top: 16px; right: 24px; appearance: none; display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px; border-radius: 4px; border: 1px solid hsl(var(--border)); background: hsl(var(--bg)); color: hsl(var(--fg-dim)); cursor: pointer; transition: background 120ms ease, color 120ms ease, border-color 120ms ease; z-index: 20; } .page-theme-btn:hover { background: hsl(var(--accent)); color: hsl(var(--fg)); border-color: hsl(var(--rule)); } .page-theme-btn svg { width: 16px; height: 16px; } /* Epigraph (only on legacy pages; not on the new index) */ .epigraph { margin-bottom: 32px; } .epigraph blockquote { border-left: 2px solid hsl(var(--rule)); padding-left: 16px; margin: 0 0 8px; color: hsl(var(--muted-fg)); font-style: italic; line-height: 1.7; font-size: 14px; } .epigraph cite { display: block; font-family: var(--mono); font-size: 11px; letter-spacing: 0.08em; color: hsl(var(--muted-fg)); font-style: normal; padding-left: 16px; } /* FAQ page */ .faq-container { max-width: 640px; margin: 80px auto 64px; padding: 0 32px; } .faq-header { margin-bottom: 32px; } .faq-header h1 { font-family: var(--serif); font-weight: 500; font-size: 28px; letter-spacing: -0.01em; line-height: 1.15; margin-bottom: 12px; } .faq-meta { display: flex; gap: 24px; font-family: var(--mono); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.12em; color: hsl(var(--muted-fg)); } .faq-toc { margin-bottom: 40px; padding-bottom: 24px; border-bottom: 1px solid hsl(var(--rule)); } .faq-toc h2 { font-family: var(--mono); font-size: 10.5px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.14em; color: hsl(var(--muted-fg)); margin-bottom: 10px; } .faq-toc ol { list-style: none; padding: 0; display: flex; flex-direction: column; gap: 4px; } .faq-toc li a { font-size: 14px; color: hsl(var(--muted-fg)); text-decoration: none; line-height: 1.6; transition: color 120ms ease; } .faq-toc li a:hover { color: hsl(var(--fg)); } .faq-body h2 { font-family: var(--serif); font-weight: 500; font-size: 18px; margin: 36px 0 10px; color: hsl(var(--fg)); } .faq-body p { font-size: 15px; color: hsl(var(--fg)); line-height: 1.72; margin-bottom: 12px; } /* ── Responsive ─────────────────────────────────────────────── */ @media (max-width: 900px) { .sidebar { display: none; } .main { margin-left: 0; padding: 56px 24px 96px; } } @media (max-width: 560px) { .toolbar { right: 14px; top: 14px; } .sources-panel { width: 100%; } .content table { font-size: 13px; } .content th, .content td { padding: 6px 8px; } .entry-title { font-size: 28px; } .page-container, .faq-container { padding: 0 22px; margin: 56px auto 48px; } } /* ── Scrollbar ─────────────────────────────────────────────── */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: hsl(var(--border)); border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: hsl(var(--rule)); } /* ── Print ─────────────────────────────────────────────────── */ @media print { .sidebar, .toolbar, .sources-panel, .page-theme-btn { display: none !important; } .main { margin-left: 0; padding: 0; } body { background: #fff; color: #000; font-family: Georgia, serif; } .content a { color: #000; } .content pre { border-color: #ccc; background: #f6f6f6; } }