/* ======================================================================== OPENBUREAU — site-level overrides on top of shibui. Differentiation from kgva.ch: serif body, strong wordmark, wider column, editorial journal entries (not portfolio cards), more breathing room, no 8bit cursor. ======================================================================== */ @import url('https://fonts.bunny.net/css?family=newsreader:400,400i,500,500i,600,600i|ibm-plex-mono:400,500|space-grotesk:400,500,700|inter:400,500,600'); :root { /* Typography — editorial: serif body, display for headings/nav, sans (Inter) for listings/labels, mono kept narrow (code, dates, technical stamps). */ --font-family-serif: 'Newsreader', Charter, 'Source Serif Pro', Georgia, serif; --font-family-sans: 'Inter', system-ui, -apple-system, sans-serif; --font-family-mono: 'IBM Plex Mono', 'Courier New', ui-monospace, monospace; --font-family-display: 'Space Grotesk', 'Inter', system-ui, sans-serif; --font-family-mono-shibui: var(--font-family-mono); --font-size-base: 1.0625rem; --font-size-small: 0.875rem; --font-size-code: 0.92rem; --spacing-base: 1.7em; --spacing-xs: calc(var(--spacing-base) * 0.25); --spacing-sm: calc(var(--spacing-base) * 0.5); --spacing-md: var(--spacing-base); --spacing-lg: calc(var(--spacing-base) * 2); --spacing-xl: calc(var(--spacing-base) * 3); --container-width: 72ch; /* Off-white paper + warm ink */ --bg-h: 35; --bg-s: 14%; --bg-l: 96%; --color-bg-primary: hsl(var(--bg-h) var(--bg-s) var(--bg-l)); --color-bg-secondary: hsl(var(--bg-h) var(--bg-s) calc(var(--bg-l) - 3%)); --color-border: hsl(var(--bg-h) var(--bg-s) calc(var(--bg-l) - 12%)); --color-text-primary: hsl(25 18% 10%); --color-text-muted: hsl(25 8% 38%); --color-text-code: hsl(25 10% 22%); --accent: #b54a2c; --accent-soft: #d97a5a; color-scheme: light; } /* ------------------------------------------------------------------------ Base body — serif by default (editorial) ------------------------------------------------------------------------ */ body { font-family: var(--font-family-serif); font-size: var(--font-size-base); line-height: 1.55; padding: var(--spacing-sm) 1.75rem var(--spacing-xl); gap: var(--spacing-sm); display: grid; grid-template-rows: auto 1fr auto; grid-template-columns: minmax(auto, var(--container-width)); justify-content: center; } p { margin: var(--spacing-sm) 0; } h1, h2, h3, h4, h5 { font-family: var(--font-family-display); font-weight: 600; } /* Disable shibui's nested h2/h3/h4 counters everywhere on this site */ h2::before, h3::before, h4::before, h5::before { content: none !important; } code, pre, kbd, samp { font-family: var(--font-family-mono); } code { font-size: var(--font-size-code); } a { color: var(--color-text-primary); border-bottom: 1px solid var(--color-border); text-decoration: none; margin-left: 0; } a:hover { color: var(--accent); border-bottom-color: var(--accent); } /* ------------------------------------------------------------------------ Site header — strong wordmark, not breadcrumb-first ------------------------------------------------------------------------ */ /* 2-column header: wordmark left edge of content | nav right edge of content. Center-aligned vertically so wordmark and nav read as one masthead line. */ .site-header { display: grid; grid-template-columns: auto 1fr; align-items: center; column-gap: 2rem; row-gap: 0.6rem; padding-bottom: var(--spacing-sm); border-bottom: 1px solid var(--color-border); } .wordmark-link { border: none; margin: 0; padding: 0; display: inline-block; grid-column: 1; justify-self: start; font-family: var(--font-family-display); font-weight: 700; font-size: clamp(1.2rem, 2.4vw, 1.5rem); letter-spacing: -0.01em; line-height: 1; color: var(--color-text-primary); } .wordmark-link:hover, .wordmark-link:focus { color: var(--color-text-primary); border: none; } .site-header .site-nav { grid-column: 2; justify-self: end; } /* Mobile: stack */ @media (max-width: 720px) { .site-header { grid-template-columns: 1fr; align-items: start; row-gap: 0.4rem; } .wordmark-link, .site-header .site-nav { grid-column: 1; justify-self: start; } } .wordmark-link:focus-visible { outline: 2px dotted var(--color-text-muted); outline-offset: 4px; } .wordmark-tagline { font-family: var(--font-family-serif); font-style: italic; font-size: var(--font-size-small); color: var(--color-text-muted); margin: 0; max-width: 32ch; line-height: 1.35; text-align: right; } @media (max-width: 720px) { .wordmark-tagline { text-align: left; max-width: 38ch; } } /* Site nav — horizontal, lowercase-strong, mono */ .site-nav nav { margin: 0; } .site-nav ul { list-style: none; margin-left: 0; display: flex; flex-wrap: wrap; gap: 0.25rem 1.4rem; font-family: var(--font-family-display); font-size: 0.9rem; font-weight: 500; letter-spacing: 0.02em; } .site-nav li { margin: 0; } .site-nav a { border: none; } .site-nav a.active, .site-nav a.ancestor { color: var(--accent); } /* Breadcrumb (only on non-home pages) */ .path-nav { font-family: var(--font-family-mono); font-size: var(--font-size-small); color: var(--color-text-muted); text-transform: uppercase; letter-spacing: 0.03em; } .path-nav ol { list-style: none; margin-left: 0; display: flex; flex-wrap: wrap; gap: 0.2rem; } .path-nav li { margin: 0; } .path-nav a { border: none; color: var(--color-text-muted); } .path-nav a:hover { color: var(--accent); } .path-nav li.current a { color: var(--color-text-primary); } /* ------------------------------------------------------------------------ Journal (home) — editorial entries, not portfolio cards ------------------------------------------------------------------------ */ .journal-header { margin-top: var(--spacing-md); margin-bottom: var(--spacing-md); } .journal-header h2 { font-size: 0.95rem; font-family: var(--font-family-mono); font-weight: 500; letter-spacing: 0.05em; color: var(--color-text-muted); margin: 0 0 0.25rem; } .journal-header p { margin: 0; font-style: italic; } .journal-list { list-style: none; margin-left: 0; display: flex; flex-direction: column; gap: 0; } .journal-entry { border-top: 1px solid var(--color-border); padding: 1rem 0 1.1rem; } .journal-entry:last-child { border-bottom: 1px solid var(--color-border); } /* Grid with explicit row-gap: bulletproof against margin/line-height inheritance */ .journal-entry-link { display: grid; grid-auto-flow: row; row-gap: 0.45rem; border: none; margin: 0; padding: 0; } .journal-entry-link > * { margin: 0; } .journal-entry-link:hover .journal-title { color: var(--accent); } .journal-meta { font-family: var(--font-family-mono); font-size: var(--font-size-small); line-height: 1.3; color: var(--color-text-muted); display: flex; gap: 0.8rem; align-items: baseline; } .journal-section { color: var(--accent); font-weight: 500; } .journal-date { font-variant-numeric: tabular-nums; } .journal-title { font-family: var(--font-family-display); font-size: 1.2rem; font-weight: 600; letter-spacing: -0.012em; line-height: 1.2; color: var(--color-text-primary); transition: color 0.15s ease; } .journal-summary { font-family: var(--font-family-serif); font-size: var(--font-size-base); line-height: 1.45; color: var(--color-text-primary); max-width: 60ch; } .journal-tags { list-style: none; display: flex; flex-wrap: wrap; gap: 0.6rem; font-family: var(--font-family-sans); font-size: 0.78rem; line-height: 1.2; color: var(--color-text-muted); padding: 0; } .journal-tags li { margin: 0; } .more { margin-top: var(--spacing-md); font-family: var(--font-family-mono); font-size: var(--font-size-small); } /* ------------------------------------------------------------------------ Library — Atlas view ------------------------------------------------------------------------ */ .atlas { display: flex; flex-direction: column; gap: var(--spacing-lg); margin-top: var(--spacing-md); } .atlas-section h2, .atlas-tags h2 { font-family: var(--font-family-display); font-size: 1.15rem; font-weight: 600; letter-spacing: -0.005em; color: var(--color-text-primary); border-bottom: 1px solid var(--color-border); padding-bottom: var(--spacing-xs); margin-bottom: var(--spacing-sm); } .atlas-section h2 a, .atlas-tags h2 a { border: none; color: inherit; } .atlas-section h2 a:hover { color: var(--accent); } .atlas-section > p { font-style: italic; color: var(--color-text-muted); margin-bottom: var(--spacing-sm); } .atlas-list { list-style: none; margin-left: 0; display: flex; flex-direction: column; gap: 0.5rem; } .atlas-list li { display: flex; gap: 0.6rem; align-items: baseline; flex-wrap: wrap; } .atlas-list .list-meta { font-family: var(--font-family-mono); font-size: 0.78rem; } .tag-cloud { list-style: none; margin-left: 0; display: flex; flex-wrap: wrap; gap: 0.5rem 1.1rem; font-family: var(--font-family-sans); font-size: var(--font-size-small); } .tag-cloud li { margin: 0; } .tag-cloud a { border: none; } /* ------------------------------------------------------------------------ Library subsection (chronological list) ------------------------------------------------------------------------ */ .time-list ul { list-style: none; margin-left: 0; } .list-item { border-top: 1px solid var(--color-border); padding: var(--spacing-sm) 0; } .list-item:last-child { border-bottom: 1px solid var(--color-border); } .list-title-row { display: flex; justify-content: space-between; align-items: baseline; gap: 1rem; } .list-title { margin: 0; font-family: var(--font-family-display); font-size: 1.15rem; font-weight: 500; flex: 1; } .list-title a { border: none; } .list-meta { font-family: var(--font-family-mono); font-size: 0.8rem; color: var(--color-text-muted); white-space: nowrap; } .list-summary { margin-top: 0.3rem; font-style: italic; line-height: 1.45; } /* ------------------------------------------------------------------------ Software showcase ------------------------------------------------------------------------ */ .software-showcase { display: flex; flex-direction: column; gap: var(--spacing-lg); margin-top: var(--spacing-md); } .software-item { border-top: 1px solid var(--color-border); padding-top: var(--spacing-md); } .software-item:last-child { border-bottom: 1px solid var(--color-border); padding-bottom: var(--spacing-md); } .software-item h2 { font-family: var(--font-family-display); font-size: 1.8rem; letter-spacing: -0.015em; margin: 0 0 0.4rem; } .software-item h2 a { border: none; } .software-summary { margin: 0 0 0.5rem; font-style: italic; color: var(--color-text-primary); max-width: 55ch; } .software-meta { font-family: var(--font-family-mono); font-size: var(--font-size-small); display: flex; gap: 0.4rem; align-items: baseline; flex-wrap: wrap; } .software-external { color: var(--accent); border-bottom-color: var(--accent); } /* ------------------------------------------------------------------------ Single page (article) ------------------------------------------------------------------------ */ .single { margin-top: var(--spacing-md); } .single-header { margin-bottom: var(--spacing-md); } .single-header h1 { font-family: var(--font-family-display); font-size: clamp(1.2rem, 2.4vw, 1.5rem); font-weight: 700; letter-spacing: -0.01em; line-height: 1.15; margin: 0 0 var(--spacing-xs); } .single-summary { font-family: var(--font-family-serif); font-style: italic; font-size: 1.02rem; line-height: 1.45; margin: 0; max-width: 55ch; } .single-content h2 { font-family: var(--font-family-display); font-size: 1.15rem; font-weight: 600; margin-top: var(--spacing-md); margin-bottom: var(--spacing-xs); } .single-content h3 { font-family: var(--font-family-display); font-size: 1rem; font-weight: 600; margin-top: var(--spacing-sm); margin-bottom: var(--spacing-xs); } .single-content blockquote { border-left: 2px solid var(--accent); padding-left: 1rem; margin: var(--spacing-md) 0; font-style: italic; color: var(--color-text-muted); } .single-content ul, .single-content ol { margin: var(--spacing-sm) 0 var(--spacing-sm) 1.6rem; } .single-content li { margin: 0.3rem 0; } .toc { font-family: var(--font-family-sans); font-size: var(--font-size-small); line-height: 1.45; border-left: 2px solid var(--color-border); padding: var(--spacing-xs) 0 var(--spacing-xs) var(--spacing-sm); margin-bottom: var(--spacing-lg); color: var(--color-text-muted); } .toc strong { color: var(--color-text-primary); display: block; margin-bottom: 0.4rem; font-size: 0.78rem; font-weight: 600; letter-spacing: 0.02em; } .toc a { border: none; color: var(--color-text-muted); } .toc a:hover { color: var(--accent); } .toc ul, .toc ol { margin: 0 0 0 1.2rem; padding: 0; } .toc li { margin: 0.15rem 0; } .time { font-family: var(--font-family-mono); font-size: var(--font-size-small); color: var(--color-text-muted); margin-top: var(--spacing-lg); padding-top: var(--spacing-sm); border-top: 1px solid var(--color-border); } .back-nav-wrap { margin-top: var(--spacing-md); font-family: var(--font-family-mono); font-size: var(--font-size-small); } .back-link { border: none; color: var(--color-text-muted); } .back-link:hover { color: var(--accent); } /* ------------------------------------------------------------------------ Page foot breadcrumb (moved from top → bottom) ------------------------------------------------------------------------ */ .page-foot-nav { margin-top: var(--spacing-lg); padding-top: var(--spacing-sm); border-top: 1px solid var(--color-border); font-family: var(--font-family-mono); font-size: var(--font-size-small); color: var(--color-text-muted); text-transform: uppercase; letter-spacing: 0.03em; } .page-foot-nav ol { list-style: none; margin-left: 0; display: flex; flex-wrap: wrap; gap: 0.2rem; } .page-foot-nav li { margin: 0; } .page-foot-nav a { border: none; color: var(--color-text-muted); } .page-foot-nav a:hover { color: var(--accent); } .page-foot-nav li.current a { color: var(--color-text-primary); } /* ------------------------------------------------------------------------ Footer — mirrors the header rhythm: 2-col grid, baseline-aligned, wordmark left, nav right; below: tagline left, credit right. Text left-aligned everywhere (no centering). ------------------------------------------------------------------------ */ footer { margin-top: var(--spacing-xl); padding-top: var(--spacing-md); border-top: 1px solid var(--color-border); color: var(--color-text-muted); } footer a { color: var(--color-text-muted); border: none; } footer a:hover { color: var(--accent); } footer p { text-align: left; margin: 0; } .footer-grid { display: grid; grid-template-columns: auto 1fr; align-items: baseline; column-gap: 2rem; row-gap: var(--spacing-sm); } .footer-mark { grid-column: 1; font-family: var(--font-family-display); font-weight: 600; font-size: 0.95rem; letter-spacing: 0.01em; color: var(--color-text-primary); } .footer-nav { grid-column: 2; justify-self: end; } .footer-nav ul { list-style: none; margin-left: 0; display: flex; flex-wrap: wrap; gap: 0.4rem 1.2rem; font-family: var(--font-family-display); font-size: 0.85rem; font-weight: 500; letter-spacing: 0.01em; } .footer-nav li { margin: 0; } .footer-tagline { grid-column: 1; font-family: var(--font-family-serif); font-style: italic; font-size: var(--font-size-small); line-height: 1.4; max-width: 36ch; } .footer-credit { grid-column: 2; justify-self: end; font-family: var(--font-family-mono); font-size: 0.78rem; } /* Mobile: stack everything left */ @media (max-width: 720px) { .footer-grid { grid-template-columns: 1fr; } .footer-mark, .footer-nav, .footer-tagline, .footer-credit { grid-column: 1; justify-self: start; } } /* ------------------------------------------------------------------------ Images — keep grayscale-on-hover but no portfolio aspect-ratio crop ------------------------------------------------------------------------ */ img { filter: grayscale(100%); transition: filter 0.4s ease; max-width: 100%; height: auto; margin: var(--spacing-sm) 0; } img:hover { filter: grayscale(0%); }