/* ============================================================ FrameVis — global reset + base ============================================================ */ *, *::before, *::after { box-sizing: border-box; } html, body, #root { height: 100%; } html { background: var(--bg); color-scheme: dark; } body { margin: 0; font-family: var(--font-mono); font-size: var(--fs-base); line-height: var(--lh-base); color: var(--text); background: var(--bg); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; font-feature-settings: "ss01", "ss02"; position: relative; overflow-x: hidden; overflow-y: auto; } /* Subtle film-grain overlay across the entire viewport, sits above bg but below interactive content. Keeps dark UI from feeling plastic. */ body::before { content: ""; position: fixed; inset: 0; background-image: var(--grain); background-repeat: repeat; opacity: 0.35; mix-blend-mode: overlay; pointer-events: none; z-index: 1; } /* Cold blue undertone wash over the bottom of the viewport — adds depth */ body::after { content: ""; position: fixed; inset: 0; background: radial-gradient(ellipse at 20% -10%, rgba(200, 169, 110, 0.04), transparent 60%), radial-gradient(ellipse at 110% 110%, rgba(50, 90, 130, 0.07), transparent 55%); pointer-events: none; z-index: 0; } #root { position: relative; z-index: 2; } h1, h2, h3, h4, h5, h6 { margin: 0; font-family: var(--font-display); font-weight: 400; letter-spacing: -0.01em; color: var(--text); } p { margin: 0; } button { font-family: inherit; font-size: inherit; color: inherit; background: transparent; border: 1px solid var(--border); border-radius: var(--radius); padding: var(--sp-2) var(--sp-4); cursor: pointer; letter-spacing: 0.04em; text-transform: uppercase; transition: background var(--transition), border-color var(--transition), color var(--transition); } button:hover:not(:disabled) { border-color: var(--accent); color: var(--accent); } button:disabled { opacity: 0.4; cursor: not-allowed; } button.primary { background: var(--accent); border-color: var(--accent); color: #14110A; font-weight: 500; } button.primary:hover:not(:disabled) { background: #D8B97D; border-color: #D8B97D; color: #14110A; } button.ghost { border-color: transparent; } input, textarea, select { font-family: var(--font-mono); font-size: inherit; color: var(--text); background: transparent; border: 1px solid var(--border); border-radius: var(--radius); padding: var(--sp-3) var(--sp-4); outline: none; transition: border-color var(--transition), background var(--transition); } input:focus, textarea:focus, select:focus { border-color: var(--accent); background: rgba(200, 169, 110, 0.04); } select option { background: var(--surface); color: var(--text); } input::placeholder { color: var(--text-faint); } a { color: var(--accent); text-decoration: none; border-bottom: 1px dotted var(--accent-soft); transition: color var(--transition); } a:hover { color: #D8B97D; } ::selection { background: var(--accent-dim); color: var(--text); } /* Custom scrollbars — narrow, monochrome */ * { scrollbar-width: thin; scrollbar-color: var(--border-strong) transparent; } *::-webkit-scrollbar { width: 8px; height: 8px; } *::-webkit-scrollbar-thumb { background: var(--border-strong); border-radius: 0; } *::-webkit-scrollbar-thumb:hover { background: var(--accent-soft); } /* ---------- Utility classes ---------- */ .mono { font-family: var(--font-mono); } .serif { font-family: var(--font-display); } .muted { color: var(--text-muted); } .faint { color: var(--text-faint); } .accent { color: var(--accent); } .danger { color: var(--danger); } .label { font-family: var(--font-mono); font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: 0.16em; color: var(--text-muted); } .divider { height: 1px; background: var(--border); border: 0; margin: var(--sp-4) 0; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } /* ---------- App shell layout ---------- */ .app { display: grid; grid-template-columns: var(--sidebar-w) 1fr; grid-template-rows: minmax(var(--topbar-h), auto) minmax(0, 1fr) auto; grid-template-areas: "sidebar topbar" "sidebar main" "sidebar footer"; min-height: 100vh; min-height: 100dvh; width: 100%; max-width: 100%; overflow: visible; } .app--sidebar-hidden { grid-template-columns: 1fr; grid-template-areas: "topbar" "main" "footer"; } .app--sidebar-hidden .app__sidebar { display: none; } .app__sidebar { grid-area: sidebar; } .app__topbar { grid-area: topbar; } .app__main { grid-area: main; position: relative; overflow: visible; background: var(--bg); min-height: 0; } .app__footer { grid-area: footer; border-top: 1px solid var(--border); background: var(--bg-elevated); padding: var(--sp-4) var(--sp-6); } .app__footer-text { color: var(--text-faint); font-size: var(--fs-xs); letter-spacing: 0.08em; text-transform: uppercase; } @media (max-width: 1200px) { .app { grid-template-columns: var(--sidebar-w) 1fr; } } @media (max-width: 900px) { .app { grid-template-columns: 1fr; grid-template-rows: auto minmax(0, 1fr) auto; grid-template-areas: "topbar" "main" "footer"; min-height: 100vh; min-height: 100dvh; } .app__sidebar { display: none; } .app--sidebar-hidden { grid-template-areas: "topbar" "main" "footer"; } .app__footer { padding-inline: var(--sp-4); } }