/* NuliBlog visual tokens, shared by the portal and CV. See /design.md. */
:root {
 --nb-blue: #0E38B1; --nb-blue-hover: #092B8C; --nb-blue-soft: #F1F5FD;
 --nb-canvas: #FFFEF5; --nb-sidebar: #F3F5FA; --nb-paper: #FFFFFF;
 --nb-ink: #202C3E; --nb-secondary: #526176; --nb-muted: #5F6F85;
 --nb-line: #E3E8F0; --nb-line-strong: #CBD5E1;
 --bg: var(--nb-canvas); --main-bg: var(--nb-paper); --ink: var(--nb-ink);
 --muted: var(--nb-secondary); --blue: var(--nb-blue); --line: var(--nb-line);
 --site-font: "NuliBlog MiSans", "MiSans", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
}
body { font-family: var(--site-font); color: var(--nb-ink); background: var(--nb-canvas); font-size: 14px; line-height: 1.75; text-align: left; }
button, input, select, textarea { font-family: inherit; }
a, button, summary { transition: color 150ms ease, background-color 150ms ease, border-color 150ms ease; }
a:focus-visible, button:focus-visible, summary:focus-visible, [tabindex]:focus-visible { outline: 2px solid var(--nb-blue); outline-offset: 3px; }
a:hover { color: var(--nb-blue-hover); }
@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } a, button, summary { transition: none; } }
@media print { body { background: white; font-size: 10pt; } }
