Files
OPENBUREAU/assets/css/custom.css
T
karim f82214719a ui: Header/Footer/Journal/Dialog überarbeitet + Logo
Header/Masthead:
- neuer Wortmark logo.svg; Home als Full-Height-Flex (zwei eigenständig
  scrollbare Journal-Spalten, Footer klebt unten)
- kompakte Masthead; scrollbar-gutter:stable auf html → kein weißer Streifen
  links und kein Logo/Menü-Versatz zwischen den Seiten

Journal-Home:
- zwei Spalten, eckige Karten in natürlicher Höhe; Bild als Block (Inline-
  Whitespace-Lücke behoben)

Footer:
- Lizenzen AGPL-3.0 / CC BY-SA verlinken auf /lizenz/ (eigene Seite);
  „Hosted in Lucerne" (Link zur Autor-URL); keine Underlines; flush unten;
  kein Open-Source-Fließtext mehr, kein Name im Copyright

Dialog:
- schlichte Foren-Auflistung statt Karten; kompaktes Login; kleinerer
  „→ Dialog"-Button (nur noch auf Library-Artikeln); einheitliche Fontgrößen;
  weniger Abstand zum Header, Trennlinien entfernt

Config: CODE-Menü → git.openbureau.ch; params.author.url

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-01 04:47:36 +02:00

1421 lines
49 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ========================================================================
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,700,700i,800,800i|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.1875rem; /* +2pt vs. 1.0625 — better body legibility */
--font-size-small: 0.875rem;
--font-size-code: 0.95rem;
--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;
/* Republik-aligned tokens */
--color-dark-panel: #191919; /* masthead/footer/hero */
--color-dark-panel-text: #f0f0f0;
--color-dark-panel-muted: #a9a9a9;
/* Section accents — warm palette tuned to OPENBUREAU's terracotta brand.
Each library section reads on the warm-paper background. */
--section-color-software: #b54a2c; /* terracotta — brand primary */
--section-color-buerofuehrung: #D0913C; /* gold — warm/editorial */
--section-color-theorie: #7d2e16; /* deep rust — heavier weight */
/* Per-post color palette — Japanese accents, soft and editorial.
Set `color: <name>` in front matter (e.g. color: sakura). */
--palette-ajisai: #A39EC4; /* hydrangea (lavender) */
--palette-sakura: #C49EC4; /* cherry blossom (pink) */
--palette-suna: #C4C19E; /* sand (warm beige) */
--palette-ichigo: #C49EA0; /* strawberry (rose) */
--palette-yuyake: #CEB188; /* sunset (peach) */
--palette-sora: #9EC3C4; /* sky (teal) */
--palette-kusa: #9EC49F; /* grass (green) */
--palette-kori: #A5B4CB; /* ice (cool blue) */
--palette-amagumo: #4C4C4C; /* rain cloud (grey) */
--palette-yuki: #F0F0F0; /* snow (near white) */
color-scheme: light;
}
/* ------------------------------------------------------------------------
Base body — serif editorial, 3-col grid so header/footer can full-bleed
while content stays boxed
------------------------------------------------------------------------ */
/* Theme setzt html{margin-left:calc(100vw - 100%)} (Anti-Scrollbar-Sprung) —
das schiebt die GANZE Seite um die Scrollbar-Breite nach rechts → weißer
Streifen links. Zurücknehmen: alles bündig am linken Rand. */
/* Scrollbalken-Platz auf der Wurzel reservieren UND horizontalen Überlauf hier
kappen → Inhaltsbreite identisch auf ALLEN Seiten (auch Home ohne Scrollbar),
damit das zentrierte Logo/Menü nirgends springt. */
html { margin: 0; overflow-x: hidden; scrollbar-gutter: stable; }
body {
font-family: var(--font-family-serif);
font-size: var(--font-size-base);
line-height: 1.55;
padding: 0;
margin: 0;
min-height: 100vh;
/* overflow-x + scrollbar-gutter liegen jetzt auf html (Wurzel) → Body füllt
konsistent die gleiche Breite auf allen Seiten. */
/* nur Zeilen-Abstand (Header/Main/Footer); KEIN Spalten-Gap, sonst entstehen
ungleiche Ränder an der Inhaltsspalte (der „weiße Spalt"). */
row-gap: var(--spacing-sm);
column-gap: 0;
display: grid;
grid-template-rows: auto 1fr auto;
justify-content: stretch;
/* Boxed content column = 72ch with 1.75rem gutters, side columns absorb the rest */
grid-template-columns:
1fr
min(var(--container-width), 100% - 3.5rem)
1fr;
}
/* Default: every direct body child sits in the content column */
body > * { grid-column: 2; }
/* Opt-in: full-bleed children break out edge-to-edge */
body > .full-bleed,
body > header.site-header,
body > footer { grid-column: 1 / -1; }
p { margin: var(--spacing-sm) 0; }
/* Republik-style: serif headlines as the visual anchor, not sans display */
h1, h2, h3, h4, h5 { font-family: var(--font-family-serif); font-weight: 600; letter-spacing: -0.015em; }
/* 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 — black masthead, Republik-style serif wordmark
Full-bleed bar with content-column-aligned inner layout
------------------------------------------------------------------------ */
.site-header {
background: var(--color-dark-panel);
color: var(--color-dark-panel-text);
/* oben etwas Luft über dem Logo, unten nur 12px unter dem Menü */
padding: 0.4rem 0 2px;
border-bottom: none;
margin-bottom: 0;
/* inner 3-col grid matches body so wordmark/nav align with content column */
display: grid;
grid-template-columns:
1fr
min(var(--container-width), 100% - 3.5rem)
1fr;
align-items: center;
row-gap: 0;
}
.site-header > * { grid-column: 2; }
.site-header .wordmark-link,
.site-header .site-nav {
grid-column: 2;
}
/* Inner row: wordmark center, nav under it (closer to Republik's stacked masthead).
To get wordmark + nav as one row instead, change to grid-template-columns: auto 1fr. */
.site-header {
/* override: stack wordmark above nav, both within content column */
}
/* Logo as background image (paths-only SVG, no font dependency) */
/* Wortmark: eigener SVG-Schriftzug „openbureau" (logo-ob2.svg). */
.wordmark-link {
border: none;
margin: 0;
padding: 0;
display: block;
justify-self: center;
width: clamp(140px, 18vw, 200px);
aspect-ratio: 1412 / 231;
height: auto;
background-image: url("/logo/logo.svg");
background-repeat: no-repeat;
background-position: center;
background-size: contain;
}
.wordmark-text {
position: absolute;
width: 1px; height: 1px;
overflow: hidden;
clip: rect(0 0 0 0);
}
.wordmark-link:hover,
.wordmark-link:focus { border: none; opacity: 0.85; }
.site-header .site-nav {
justify-self: center;
/* etwas Luft zwischen Logo und Menü. */
margin-top: 0.1em;
}
.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 — under wordmark, white on black masthead.
Keeps the original display font (Space Grotesk) — only colour changes. */
.site-nav nav {
margin: 0;
}
.site-nav ul {
list-style: none;
margin: 0;
padding: 0;
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 0.25rem 1.6rem;
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;
color: #d4d4d4;
}
.site-nav a:hover { color: #fff; }
.site-nav a.active,
.site-nav a.ancestor {
color: #fff;
font-weight: 600;
}
/* 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: ZWEI eigenständig scrollbare Spalten, eckige Karten aneinander ──
.journal-cols = zwei Spalten nebeneinander (kein Abstand). Jede .journal-list
ist EINE Spalte, die für sich scrollt (overflow-y). Karten ohne Rundung und
ohne Abstände — direkt aneinander, nur eine Hairline als Trenner. */
/* Volle Breite (aus der 72ch-Spalte ausbrechen) */
.journal { width: 100vw; position: relative; left: 50%; margin-left: -50vw; }
.journal-header { padding: 0 10px; }
.journal-cols {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 0;
}
.journal-list { /* eine Spalte — eigenständig scrollbar */
margin: 0;
padding: 0;
max-height: 82vh;
overflow-y: auto;
}
.journal-cols > .journal-list:first-child { border-right: 1px solid var(--color-border); }
.journal-entry {
border: none;
border-radius: 0;
background: var(--color-bg-secondary);
padding: 1.5rem;
margin: 0;
}
.journal-entry + .journal-entry { border-top: 1px solid var(--color-border); }
/* In den Karten links bündig statt zentriert */
.journal-list .journal-entry .journal-entry-body { justify-items: start; text-align: left; }
.journal-list .journal-entry .journal-entry-body > * { max-width: none; }
.journal-list .journal-bg-image {
width: 100%; height: auto; aspect-ratio: 16 / 9; object-fit: cover;
border-radius: 0; margin-bottom: 0.9rem;
}
@media (max-width: 720px) {
.journal-cols { grid-template-columns: 1fr; }
.journal-cols > .journal-list:first-child { border-right: none; }
.journal-list { max-height: none; overflow: visible; }
}
/* ── Startseite: Full-Height-Layout ──────────────────────────────────────────
Masthead oben, zwei eigenständig scrollbare Spalten in der Mitte, Footer klebt
unten. Die Seite selbst scrollt nicht — nur die Spalten (overflow-y). Kette
definierter Höhen: body 100dvh → main (1fr) → .journal → .journal-cols → Spalte. */
/* Flexbox statt Grid für die Home-Höhenverteilung: flex:none hält Header und
Footer exakt auf Inhaltshöhe (im Grid wurde der Header gestreckt → Menü
rutschte nach unten). Nur main füllt die Mitte. */
body.is-home {
height: 100dvh;
overflow: hidden;
display: flex;
flex-direction: column;
gap: 0;
}
body.is-home > header.site-header { margin-bottom: 0; flex: none; }
body.is-home > footer { flex: none; }
body.is-home > main {
flex: 1 1 auto; /* füllt die Mitte */
min-height: 0;
display: flex;
flex-direction: column;
overflow: hidden;
}
/* Kein Text über den Spalten: Intro + „Journal"-Header weg → Spalten beginnen
direkt unter der Masthead und füllen die volle weiße Höhe. */
body.is-home > main > p { display: none; }
body.is-home .journal-header { display: none; }
body.is-home .journal {
width: auto; left: auto; margin: 0; /* 100vw-Ausbruch zurücknehmen */
flex: 1; min-height: 0;
display: flex; flex-direction: column;
}
body.is-home .journal-cols { flex: 1; min-height: 0; }
body.is-home .journal-list {
display: flex; flex-direction: column;
max-height: none; height: 100%; min-height: 0; overflow-y: auto;
scrollbar-width: none; /* Firefox: Scrollbar aus */
-ms-overflow-style: none; /* alte Edge */
}
body.is-home .journal-list::-webkit-scrollbar { width: 0; height: 0; display: none; }
/* Karten in NATÜRLICHER Höhe (kein Stretch) → Bild + Headline bleiben kompakt
zusammen; die Spalte scrollt bei Überlauf. Kein Auseinanderreißen mehr. */
body.is-home .journal-entry { flex: 0 0 auto; }
body.is-home .more { flex: none; padding: 0.4rem 10px; margin: 0; }
/* Footer kompakt (~1/3): kein großer Außenabstand, knappes Padding. */
body.is-home > footer { margin-top: 0; padding: 0.55rem 0; }
body.is-home > footer .footer-grid { row-gap: 0.2rem; }
@media (max-width: 720px) {
/* Mobil: kein Full-Height-Zwang — normal scrollen, eine Spalte. */
body.is-home { height: auto; overflow: visible; }
body.is-home > main { display: block; overflow: visible; }
body.is-home .journal { display: block; }
body.is-home .journal-cols { min-height: 0; }
body.is-home .journal-list { height: auto; overflow: visible; }
}
/* Card link: image (optional) + body block */
.journal-entry-link,
.journal-entry-link:hover,
.journal-entry-link:focus {
display: block;
border: none;
margin: 0;
padding: 0;
color: inherit;
text-decoration: none;
}
.journal-entry-body {
display: grid;
grid-auto-flow: row;
row-gap: 0.7rem;
}
.journal-entry-body > * { margin: 0; }
/* Center non-hero entries' content (excluding icon-mode which has horizontal layout) */
.journal-entry:not(.journal-entry--hero):not([data-image="icon"]) .journal-entry-body {
justify-items: start;
text-align: left;
}
.journal-entry:not(.journal-entry--hero):not([data-image="icon"]) .journal-entry-body > * {
max-width: 55ch;
}
.journal-entry:not(.journal-entry--hero):not([data-image="icon"]) > .tag-pills {
text-align: center;
}
/* Rubric (section label, own line above headline) — Republik pattern */
.journal-rubric {
margin: 0;
line-height: 1;
}
/* Byline: single smooth sans line, "Von Author, DD.MM.YYYY" — Republik-style */
.journal-byline {
font-family: var(--font-family-sans);
font-size: 0.95rem;
font-style: normal;
font-weight: 400;
line-height: 1.4;
color: var(--color-text-muted);
margin: 0;
white-space: normal;
}
.journal-byline .journal-author {
color: var(--color-text-primary);
font-weight: 500;
text-decoration: none;
}
.journal-byline .journal-date { font-variant-numeric: tabular-nums; }
/* Legacy .journal-meta retained for backwards-compat if any markup references it */
.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 {
display: inline-block;
background: color-mix(in oklab, var(--section-color, var(--accent)) 35%, transparent);
color: var(--color-text-primary);
font-family: var(--font-family-display);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.08em;
font-size: 0.78rem;
padding: 0.2rem 0.6rem;
border-radius: 2px;
line-height: 1.35;
}
/* Hero section label sits on its own line above the headline */
.journal-entry--hero .journal-section {
font-size: 0.9rem;
letter-spacing: 0.12em;
}
.journal-author::before { content: "Von "; color: var(--color-text-muted); font-weight: 400; }
.journal-entry--hero .journal-author::before { color: var(--color-dark-panel-muted); }
.journal-title {
font-family: var(--font-family-serif);
font-size: 1.65rem;
font-weight: 700;
letter-spacing: -0.02em;
line-height: 1.2;
color: var(--color-text-primary);
transition: color 0.15s ease;
}
/* Section-color mapping — sets --section-color per entry so meta label
and hero top-border pick up the right accent. */
[data-section="software"] { --section-color: var(--section-color-software); }
[data-section="buerofuehrung"] { --section-color: var(--section-color-buerofuehrung); }
[data-section="theorie"] { --section-color: var(--section-color-theorie); }
/* Per-post color override (front matter `color: <name>`) — wins over section */
[data-color="ajisai"] { --section-color: var(--palette-ajisai); }
[data-color="sakura"] { --section-color: var(--palette-sakura); }
[data-color="suna"] { --section-color: var(--palette-suna); }
[data-color="ichigo"] { --section-color: var(--palette-ichigo); }
[data-color="yuyake"] { --section-color: var(--palette-yuyake); }
[data-color="sora"] { --section-color: var(--palette-sora); }
[data-color="kusa"] { --section-color: var(--palette-kusa); }
[data-color="kori"] { --section-color: var(--palette-kori); }
[data-color="amagumo"] { --section-color: var(--palette-amagumo); }
[data-color="yuki"] { --section-color: var(--palette-yuki); }
/* Autor-Seite (/authors/<slug>/) — zentriert: rundes Bild, Name, Kurztext */
.author-page {
max-width: 54ch;
margin: 0 auto;
padding: var(--spacing-xl) var(--spacing-md);
text-align: center;
}
.author-photo {
width: 168px;
height: 168px;
border-radius: 50%;
object-fit: cover;
display: block;
margin: 0 auto var(--spacing-md);
}
.author-name {
font-family: var(--font-family-serif);
margin: 0 0 var(--spacing-sm);
}
.author-bio {
color: var(--color-text-muted);
line-height: 1.7;
}
.author-bio p { margin: 0 0 1em; }
a.byline-author, a.journal-author { color: inherit; text-decoration: none; }
a.byline-author:hover, a.journal-author:hover { color: var(--accent); }
/* ── Dialog ───────────────────────────────────────────────────────────────── */
/* Link am Ende des Beitrags (der Beitrag selbst bleibt sauber) */
.dialog-link {
display: inline-block;
margin-top: var(--spacing-md);
font-family: var(--font-family-display);
font-weight: 500;
font-size: 0.82rem;
color: var(--accent);
text-decoration: none;
border: 1px solid var(--accent);
border-radius: 999px;
padding: 0.28em 0.85em;
}
.dialog-link:hover { background: var(--accent); color: #fff; }
/* Eigene Dialog-Seite (/dialog/?thread=…) */
/* Füllt die normale Inhaltsspalte (kein eigenes max-width/Seiten-Padding → gleiche Breite wie andere Seiten) */
.dialog-page { padding: var(--spacing-sm) 0 var(--spacing-xl); }
.dialog-overview { display: flex; flex-direction: column; gap: 0.6em; }
.dialog-overview-item {
display: flex; justify-content: space-between; align-items: baseline; gap: 1em;
border: 1px solid var(--color-border); border-radius: 12px;
padding: 0.8em 1em; background: var(--color-bg-secondary);
}
.dialog-overview-item:hover { border-color: var(--accent); color: inherit; }
.dialog-ov-title { font-family: var(--font-family-serif); font-weight: 600; }
.dialog-ov-meta { font-size: var(--font-size-small); color: var(--color-text-muted); flex: none; }
.dialog-back { margin: 0 0 var(--spacing-sm); }
.dialog-back:empty { margin: 0; }
.dialog-back a { color: var(--color-text-muted); text-decoration: none; }
.dialog-back a:hover { color: var(--accent); }
.dialog-title {
font-family: var(--font-family-serif);
margin: 0 0 var(--spacing-md);
}
.dialog-list { display: flex; flex-direction: column; gap: var(--spacing-md); margin-bottom: var(--spacing-lg); }
.dialog-empty { color: var(--color-text-muted); font-style: italic; }
.dialog-card { border: 1px solid var(--color-border); border-radius: 12px; padding: var(--spacing-md); background: var(--color-bg-secondary); }
.dialog-card-head { display: flex; align-items: center; gap: 0.7em; margin-bottom: 0.6em; }
.dialog-avatar {
width: 40px; height: 40px; border-radius: 50%; flex: none;
background: var(--color-border) center/cover no-repeat;
display: grid; place-items: center; font-weight: 600; color: var(--color-text-muted);
}
.dialog-meta { display: flex; flex-direction: column; line-height: 1.3; }
.dialog-name { font-weight: 600; }
.dialog-time { font-size: var(--font-size-small); color: var(--color-text-muted); }
.dialog-replyto { font-size: var(--font-size-small); color: var(--accent); }
.dialog-body { font-family: var(--font-family-serif); line-height: 1.6; white-space: pre-wrap; }
.dialog-actions { display: flex; gap: 0.8em; margin-top: 0.6em; }
.dialog-actions button {
background: none; border: none; padding: 0; cursor: pointer;
font-size: var(--font-size-small); color: var(--color-text-muted);
}
.dialog-actions button:hover { color: var(--accent); }
.dialog-composer { display: flex; flex-direction: column; gap: 0.6em; }
.dialog-loginhint { color: var(--color-text-muted); margin: 0; }
/* Subtiles Login: dezenter Text-Link statt dominantem Formular. */
.dialog-loginlink {
align-self: flex-start; font: inherit; font-size: var(--font-size-small);
background: none; border: none; padding: 0.2em 0; cursor: pointer;
color: var(--color-text-muted); text-decoration: underline; text-underline-offset: 3px;
}
.dialog-loginlink:hover { color: var(--accent); }
.dialog-loginform { display: flex; flex-wrap: wrap; align-items: center; gap: 0.4em; font-size: var(--font-size-small); max-width: 30em; }
.dialog-loginform .dialog-input { width: auto; flex: 1 1 8em; min-width: 7em; padding: 0.35em 0.6em; font-size: inherit; border-radius: 7px; }
.dialog-loginform .dialog-send { padding: 0.35em 0.9em; font-size: inherit; }
.dialog-logincancel { align-self: center; }
/* ── Übersicht: Split-View (links letzte Wortmeldungen, rechts Foren) ── */
.dialog-split { display: grid; grid-template-columns: 1.2fr 1fr; gap: 2.4em; align-items: start; }
@media (max-width: 720px) { .dialog-split { grid-template-columns: 1fr; gap: 1.6em; } }
/* Schlichte Auflistung statt Karten: nur Trennlinien + großzügiger Abstand. */
.dialog-recent-list, .dialog-forum-list, .dialog-thread-list { display: flex; flex-direction: column; }
.dialog-recent-item, .dialog-forum-item, .dialog-thread-item {
display: block; text-decoration: none; color: inherit;
padding: 1.05em 0;
border-bottom: 1px solid var(--color-border);
transition: color .12s;
}
.dialog-recent-item:first-child, .dialog-forum-item:first-child, .dialog-thread-item:first-child { padding-top: 0.3em; }
.dialog-recent-item:last-child, .dialog-forum-item:last-child, .dialog-thread-item:last-child { border-bottom: none; }
.dialog-recent-item:hover, .dialog-thread-item:hover { color: var(--accent); }
.dialog-recent-top { display: flex; justify-content: space-between; gap: 1em; align-items: baseline; }
.dialog-recent-author { font-weight: 600; }
.dialog-recent-meta, .dialog-thread-meta, .dialog-forum-meta { color: var(--color-text-muted); font-size: var(--font-size-small); }
.dialog-recent-thread { font-family: var(--font-family-serif); font-style: italic; color: var(--accent); margin: 0.15em 0; }
.dialog-recent-body { color: var(--color-text-muted); font-size: var(--font-size-small);
display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
/* Foren-Auflistung: Name mit kleinem Farbpunkt (Forum-Farbe), Meta darunter. */
.dialog-forum-name {
display: flex; align-items: center; gap: 0.55em;
font-family: var(--font-family-serif); font-weight: 600; font-size: var(--font-size-base);
}
.dialog-forum-name::before {
content: ""; flex: none; width: 0.6em; height: 0.6em; border-radius: 2px;
background: var(--forum-accent, var(--accent));
}
.dialog-forum-item:hover .dialog-forum-name { color: var(--accent); }
.dialog-forum-meta { display: block; margin-top: 0.15em; }
.dialog-forum-desc { display: block; color: var(--color-text-muted); font-size: var(--font-size-small); margin-top: 0.2em; }
/* Forum-Ansicht */
.dialog-forum-head { border-left: 4px solid var(--forum-accent, var(--accent)); padding-left: 0.6em; }
.dialog-thread-title { display: block; font-weight: 600; }
.dialog-lock { color: var(--color-text-muted); }
.dialog-newthread { margin: 0.4em 0 1.4em; display: flex; flex-direction: column; gap: 0.6em; }
.dialog-newbtn { align-self: flex-start; font: inherit; cursor: pointer; padding: 0.5em 1.2em; border-radius: 999px;
background: var(--accent); color: #fff; border: 1px solid var(--accent); }
.dialog-newbtn:hover { background: #a23f23; }
/* Thread-Ansicht: Moderationsleiste */
.dialog-modbar { display: flex; align-items: center; gap: 0.6em; margin: 0.2em 0 1em; flex-wrap: wrap; }
.dialog-modbar:empty { display: none; }
.dialog-modlabel { color: var(--color-text-muted); font-size: var(--font-size-small); }
.dialog-modbtn { font: inherit; font-size: var(--font-size-small); cursor: pointer; padding: 0.3em 0.9em; border-radius: 999px;
background: none; border: 1px solid var(--color-border); color: var(--color-text-muted); }
.dialog-modbtn:hover { border-color: var(--accent); color: var(--accent); }
.dialog-locked { color: var(--color-text-muted); font-style: italic; margin: 0.4em 0; }
.dialog-textarea, .dialog-input {
width: 100%; font: inherit; padding: 0.7em 0.9em;
border: 1px solid var(--color-border); border-radius: 10px; background: var(--color-bg-primary);
}
.dialog-textarea { min-height: 90px; resize: vertical; font-family: var(--font-family-serif); }
.dialog-row { display: flex; gap: 0.6em; }
.dialog-send {
font: inherit; cursor: pointer; padding: 0.55em 1.3em; border-radius: 999px;
background: var(--accent); color: #fff; border: 1px solid var(--accent);
}
.dialog-send:hover { background: #a23f23; }
.dialog-logout { font: inherit; cursor: pointer; padding: 0.55em 1.1em; border-radius: 999px; background: none; border: 1px solid var(--color-border); color: var(--color-text-muted); }
.dialog-replychip { align-self: flex-start; font-size: var(--font-size-small); cursor: pointer; padding: 0.25em 0.8em; border-radius: 999px; border: 1px solid var(--accent); color: var(--accent); background: none; }
/* ------------------------------------------------------------------------
Journal entries — three Republik-style layouts (set in front matter
via `layout: image|icon|text`). Every entry is a full-bleed coloured
or image panel; per-section/per-post colour drives the bg.
- image: cover image fills panel; text on dark gradient overlay; white type
- icon: coloured bg; small centred image above text; dark type
- text: coloured bg; no image; dark type
------------------------------------------------------------------------ */
/* Base panel — break out of the boxed content column */
.journal-entry--layout-image,
.journal-entry--layout-icon,
.journal-entry--layout-text {
list-style: none;
border: none;
margin: 0 calc(50% - 50vw);
padding: 0;
position: relative;
overflow: hidden;
}
.journal-entry--layout-image .journal-entry-link,
.journal-entry--layout-icon .journal-entry-link,
.journal-entry--layout-text .journal-entry-link {
display: block;
width: 100%;
color: inherit;
text-decoration: none;
border: none;
}
/* Centred body, generous padding */
.journal-entry--layout-image .journal-entry-body,
.journal-entry--layout-icon .journal-entry-body,
.journal-entry--layout-text .journal-entry-body {
max-width: 60ch;
margin: 0 auto;
padding: 3.5rem 1.75rem 3rem;
display: grid;
justify-items: center;
row-gap: 1.1rem;
text-align: center;
}
.journal-entry--layout-image .journal-entry-body > *,
.journal-entry--layout-icon .journal-entry-body > *,
.journal-entry--layout-text .journal-entry-body > * {
margin: 0;
max-width: 60ch;
}
/* Title sizes per layout — image (hero) is bigger, icon/text more modest */
.journal-entry--layout-image .journal-title {
font-size: clamp(2rem, 3.8vw, 2.8rem);
line-height: 1.08;
letter-spacing: -0.026em;
font-weight: 800;
}
.journal-entry--layout-icon .journal-title,
.journal-entry--layout-text .journal-title {
font-size: clamp(1.7rem, 3vw, 2.2rem);
line-height: 1.1;
letter-spacing: -0.022em;
font-weight: 800;
}
.journal-entry--layout-image .journal-summary,
.journal-entry--layout-icon .journal-summary,
.journal-entry--layout-text .journal-summary {
font-size: 1.15rem;
line-height: 1.4;
max-width: 42ch;
}
.journal-entry--layout-image .journal-byline,
.journal-entry--layout-icon .journal-byline,
.journal-entry--layout-text .journal-byline {
font-size: 0.95rem;
}
/* ---- Layout: IMAGE (full-bleed photo as background, no overlay) ---- */
.journal-entry--layout-image {
background: #1a1a1a;
color: #fff;
}
/* (Alte Vollflächen-Mechanik entfernt: Link war display:flex + min-height:70vh
+ justify-content:flex-end, Bild position:absolute, Body padding-top:3rem —
das zog Bild und Headline in der Karte auseinander. Karten-Layout läuft jetzt
ausschließlich über die .journal-list-Regeln weiter oben.) */
/* Solid white text — no shadow halo. Legibility comes from the slight
darkening of the image at the bottom (where the body sits). */
.journal-entry--layout-image .journal-title,
.journal-entry--layout-image .journal-rubric,
.journal-entry--layout-image .journal-summary,
.journal-entry--layout-image .journal-byline {
color: #fff;
text-shadow: none;
}
.journal-entry--layout-image .journal-section {
background: rgba(0, 0, 0, 0.45);
color: #fff;
backdrop-filter: blur(2px);
-webkit-backdrop-filter: blur(2px);
}
.journal-entry--layout-image .journal-byline,
.journal-entry--layout-image .journal-byline .journal-author,
.journal-entry--layout-image .journal-byline .journal-date,
.journal-entry--layout-image .journal-byline .journal-author::before { color: #fff; }
.journal-entry--layout-image .journal-byline .journal-author { text-decoration: none; }
/* ---- Layout: ICON (coloured bg + small centred image, image is NOT tinted) ---- */
.journal-entry--layout-icon {
background: var(--section-color, var(--accent));
color: var(--color-text-primary);
}
.journal-icon-image {
display: block;
max-width: 240px;
max-height: 240px;
width: auto;
height: auto;
margin: 0 auto 1rem;
filter: none;
}
.journal-icon-image:hover { filter: none; }
/* ---- Layout: TEXT (coloured bg only) ---- */
.journal-entry--layout-text {
background: var(--section-color, var(--accent));
color: var(--color-text-primary);
}
/* Section pill on coloured panels — darker overlay on the colour bg */
.journal-entry--layout-icon .journal-section,
.journal-entry--layout-text .journal-section {
background: color-mix(in oklab, var(--color-text-primary) 10%, transparent);
color: var(--color-text-primary);
}
/* All text on coloured panels is solid text-primary — including byline */
.journal-entry--layout-icon .journal-title,
.journal-entry--layout-text .journal-title,
.journal-entry--layout-icon .journal-summary,
.journal-entry--layout-text .journal-summary,
.journal-entry--layout-icon .journal-byline,
.journal-entry--layout-text .journal-byline,
.journal-entry--layout-icon .journal-byline .journal-author,
.journal-entry--layout-text .journal-byline .journal-author,
.journal-entry--layout-icon .journal-byline .journal-date,
.journal-entry--layout-text .journal-byline .journal-date,
.journal-entry--layout-icon .journal-byline .journal-author::before,
.journal-entry--layout-text .journal-byline .journal-author::before {
color: var(--color-text-primary);
}
/* Tags sit centred inside the coloured panel, below the link */
.journal-entry--layout-image > .tag-pills,
.journal-entry--layout-icon > .tag-pills,
.journal-entry--layout-text > .tag-pills {
margin: 0 auto;
padding: 0 1.75rem 2.6rem;
max-width: var(--container-width);
text-align: center;
}
.journal-entry--layout-image > .tag-pills a {
background: color-mix(in oklab, var(--section-color, var(--accent-soft)) 30%, transparent);
color: var(--color-dark-panel-text);
}
.journal-entry--layout-image > .tag-pills a:hover {
background: color-mix(in oklab, var(--section-color, var(--accent-soft)) 50%, transparent);
}
.journal-entry--layout-icon > .tag-pills a,
.journal-entry--layout-text > .tag-pills a {
background: color-mix(in oklab, var(--color-text-primary) 12%, transparent);
color: var(--color-text-primary);
}
.journal-entry--layout-icon > .tag-pills a:hover,
.journal-entry--layout-text > .tag-pills a:hover {
background: color-mix(in oklab, var(--color-text-primary) 22%, transparent);
}
.journal-tags { /* extends .tag-pills */ }
/* ════════════════════════════════════════════════════════════════════════
Journal-Startseite: KARTEN-Kontext. Nimmt die Vollflächen-Panel-Regeln von
oben innerhalb von .journal-list zurück — kompakte 2-Spalten-Karten:
Bild als 16/9-Block OBEN (kein absolutes Overlay), dunkle Schrift,
natürliche Höhe (align-items:start → keine Zeilen-Stretchung; ein hoher
Eintrag zieht den Nachbarn NICHT mit).
════════════════════════════════════════════════════════════════════════ */
.journal-list .journal-entry,
.journal-list .journal-entry--layout-image,
.journal-list .journal-entry--layout-icon,
.journal-list .journal-entry--layout-text {
margin: 0;
/* oben/unten 20% knapper (1.25rem → 1rem), links/rechts unverändert */
padding: 1rem 1.25rem;
position: relative;
overflow: hidden;
border-radius: 0;
}
.journal-list .journal-entry--layout-image {
background: var(--color-bg-secondary);
color: var(--color-text-primary);
}
/* Inhalt oben-bündig (kein altes justify-content:flex-end/min-height:70vh mehr,
das Bild und Text in der gewachsenen Karte auseinanderzog). */
/* Flexbox-Spalte: Bild oben, Body darunter, oben-bündig. In Flex werden reine
Whitespace-Textknoten NICHT gerendert → die 78px-Inline-Lücke ist unmöglich. */
.journal-list .journal-entry-link {
display: flex;
flex-direction: column;
justify-content: flex-start;
min-height: 0;
height: auto;
}
/* Bild: normaler Block oben statt absolutem Hintergrund-Overlay.
display:block + vertical-align:bottom killen die Inline-Baseline-Lücke
(der „whitespace" unter dem Bild, den du im DevTools gesehen hast). */
.journal-list .journal-bg-image {
display: block;
vertical-align: bottom;
position: static;
inset: auto;
z-index: auto;
width: 100%;
height: auto;
aspect-ratio: 16 / 9;
object-fit: cover;
border-radius: 0; /* eckig */
margin: 0 0 0.7rem;
}
/* Body: linksbündig, normaler Textfluss, kompakt, dunkle Schrift */
.journal-list .journal-entry-body {
position: static;
z-index: auto;
max-width: none;
margin: 0;
padding: 0;
display: grid;
justify-items: start;
text-align: left;
row-gap: 0.55rem;
color: var(--color-text-primary);
}
.journal-list .journal-entry-body > * { max-width: none; }
/* Bild-Layout: Schrift wieder dunkel (kein Weiß-auf-Bild) */
.journal-list .journal-entry--layout-image .journal-title,
.journal-list .journal-entry--layout-image .journal-rubric,
.journal-list .journal-entry--layout-image .journal-summary,
.journal-list .journal-entry--layout-image .journal-byline,
.journal-list .journal-entry--layout-image .journal-byline .journal-author,
.journal-list .journal-entry--layout-image .journal-byline .journal-date,
.journal-list .journal-entry--layout-image .journal-byline .journal-author::before {
color: var(--color-text-primary);
text-shadow: none;
}
.journal-list .journal-entry--layout-image .journal-section {
background: color-mix(in oklab, var(--section-color, var(--accent)) 35%, transparent);
color: var(--color-text-primary);
backdrop-filter: none;
-webkit-backdrop-filter: none;
}
/* Kompaktere Karten-Typografie (nicht Hero-Größe) */
.journal-list .journal-title { font-size: 1.4rem; line-height: 1.2; font-weight: 700; letter-spacing: -0.02em; }
.journal-list .journal-summary { font-size: 1rem; line-height: 1.45; max-width: none; }
.journal-list .journal-byline { font-size: 0.9rem; }
/* Icon-Bild kleiner und linksbündig */
.journal-list .journal-icon-image { max-width: 96px; max-height: 96px; margin: 0 0 0.6rem; }
/* Tags innerhalb der Karte links, kompakt */
.journal-list .journal-entry > .tag-pills {
margin: 0.6rem 0 0;
padding: 0;
max-width: none;
text-align: left;
}
.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-serif);
font-size: 1.4rem;
font-weight: 700;
letter-spacing: -0.018em;
color: var(--color-text-primary);
border-bottom: 3px solid var(--section-color, var(--accent));
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)
------------------------------------------------------------------------ */
.section-header {
border-top: 8px solid var(--section-color, var(--accent));
padding-top: var(--spacing-sm);
margin-top: var(--spacing-md);
margin-bottom: var(--spacing-md);
}
.section-rubric {
font-family: var(--font-family-display);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.1em;
font-size: 0.85rem;
color: var(--section-color, var(--accent));
margin: 0 0 0.4rem;
}
.section-title {
font-family: var(--font-family-serif);
font-size: clamp(1.9rem, 4vw, 2.6rem);
font-weight: 800;
letter-spacing: -0.026em;
line-height: 1.05;
margin: 0 0 0.4rem;
}
.section-description {
font-style: italic;
color: var(--color-text-muted);
margin: 0 0 var(--spacing-sm);
max-width: 60ch;
}
.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-serif);
font-size: 1.25rem;
font-weight: 600;
letter-spacing: -0.01em;
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-serif);
font-size: 2rem;
font-weight: 800;
letter-spacing: -0.024em;
line-height: 1.08;
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 article — full-bleed cover image directly under the masthead.
width:100vw breaks the boxed column horizontally; negative top margin
cancels the body grid gap + header margin so the image sits flush. */
.single-hero-image {
display: block;
width: 100vw;
max-width: 100vw;
height: auto;
max-height: 60vh;
object-fit: cover;
margin-left: calc(50% - 50vw);
margin-right: calc(50% - 50vw);
/* bündig direkt unter die Masthead (kein Überlappen) — gleicht nur den
Body-Grid-Gap aus, nicht mehr (sonst rutscht das Bild über den Header). */
margin-top: calc(-1 * var(--spacing-sm));
margin-bottom: var(--spacing-sm);
filter: none;
}
.single-hero-image:hover { filter: none; }
/* Nach einem Hero-Bild: Artikel + Header bündig → kein Riesenabstand Bild↔Headline */
.single-hero-image + .single { margin-top: 0; }
.single-hero-image + .single .single-header { margin-top: 0; }
.single-header {
position: relative;
margin-top: var(--spacing-md);
margin-bottom: var(--spacing-md);
}
.single-header h1 {
font-family: var(--font-family-serif);
font-size: clamp(2.1rem, 4.6vw, 3rem);
font-weight: 800;
letter-spacing: -0.028em;
line-height: 1.05;
margin: 0 0 var(--spacing-sm);
}
.single-summary {
font-family: var(--font-family-serif);
font-style: normal;
font-size: 1.4rem;
line-height: 1.4;
color: var(--color-text-primary);
margin: 0 0 var(--spacing-md); /* breathing room before byline */
max-width: 55ch;
}
.single-byline {
font-family: var(--font-family-sans);
font-size: 0.95rem;
line-height: 1.4;
color: var(--color-text-muted);
margin: 0 0 0.6rem;
}
/* Reading time + last-modified — sits just below the byline */
.single-meta {
font-family: var(--font-family-sans);
font-size: 0.9rem;
line-height: 1.4;
color: var(--color-text-muted);
margin: 0;
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
align-items: baseline;
}
.single-meta .reading-time,
.single-meta .lastmod { font-variant-numeric: tabular-nums; }
.single-byline .byline-author {
color: var(--color-text-primary);
font-weight: 500;
text-decoration: none;
}
.single-byline .byline-author::before {
content: "Von ";
color: var(--color-text-muted);
font-weight: 400;
text-decoration: none;
}
.single-byline .byline-date { font-variant-numeric: tabular-nums; }
.byline-author { color: var(--color-text-primary); font-weight: 500; }
.byline-date { font-variant-numeric: tabular-nums; }
.single-content h2 {
font-family: var(--font-family-serif);
font-size: 1.45rem;
font-weight: 600;
letter-spacing: -0.015em;
line-height: 1.2;
margin-top: var(--spacing-lg);
margin-bottom: var(--spacing-xs);
}
.single-content h3 {
font-family: var(--font-family-serif);
font-size: 1.2rem;
font-weight: 600;
letter-spacing: -0.01em;
margin-top: var(--spacing-md);
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; }
/* Tag pills — small section-tinted chips at the foot of the article.
No hash symbol, lowercase, rounded; subtle on the warm paper. */
.tag-pills {
list-style: none;
margin: var(--spacing-sm) 0 0;
margin-left: 0;
padding: 0;
line-height: 1;
}
.tag-pills li {
display: inline-block;
margin: 0 0.3rem 0.3rem 0;
padding: 0;
list-style: none;
vertical-align: middle;
}
.tag-pills a {
display: inline-block;
padding: 0.35rem 0.85rem;
line-height: 1.3;
font-family: var(--font-family-display);
font-size: 0.78rem;
font-weight: 500;
letter-spacing: 0.02em;
text-transform: lowercase;
background: color-mix(in oklab, var(--section-color, var(--accent)) 14%, transparent);
color: var(--color-text-primary);
border: none;
border-radius: 999px;
margin: 0;
white-space: nowrap;
text-decoration: none;
vertical-align: middle;
transition: background-color 0.15s ease;
}
.tag-pills a:hover {
background: color-mix(in oklab, var(--section-color, var(--accent)) 30%, transparent);
border: none;
}
.time {
font-family: var(--font-family-sans);
font-size: 0.9rem;
color: var(--color-text-muted);
margin-top: var(--spacing-md);
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-sans);
font-size: 0.9rem;
}
.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-sans);
font-size: 0.85rem;
color: var(--color-text-muted);
letter-spacing: 0.01em;
}
.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 — dark full-bleed bar mirroring the masthead
------------------------------------------------------------------------ */
footer {
background: var(--color-dark-panel);
color: var(--color-dark-panel-text); /* hell & lesbar auf Schwarz */
margin-top: 0; /* kein Ablöse-Abstand → klebt flush unten (sticky via Body-Grid) */
padding: var(--spacing-md) 0;
border-top: none;
/* inner grid aligns with content column, same trick as header */
display: grid;
grid-template-columns:
1fr
min(var(--container-width), 100% - 3.5rem)
1fr;
}
footer > * { grid-column: 2; }
footer a, footer a:hover, footer a:focus { border: none; border-bottom: none; text-decoration: none; }
footer a { color: var(--color-dark-panel-text); }
footer a:hover { color: var(--accent-soft); }
footer p { margin: 0; }
/* Zwei Zeilen: oben Inhalts-Absatz (links) | Links (rechts),
unten Lizenz/Copyright (links). */
.footer-grid {
display: grid;
grid-template-columns: 1fr auto;
align-items: start;
column-gap: var(--spacing-lg);
row-gap: var(--spacing-sm);
}
.footer-legal { grid-row: 1; grid-column: 1; }
.footer-licenses {
font-family: var(--font-family-mono);
font-size: 0.8rem;
color: var(--color-dark-panel-text);
}
.footer-hosted {
font-family: var(--font-family-mono);
font-size: 0.75rem;
color: var(--color-dark-panel-muted);
margin-top: 0.35rem;
}
.footer-links {
grid-row: 1; grid-column: 2;
justify-self: end;
display: flex;
flex-wrap: wrap;
gap: 0.4rem 1.3rem;
font-family: var(--font-family-display);
font-size: 0.9rem;
font-weight: 500;
}
.footer-legal a { color: inherit; text-decoration: none; }
.footer-legal a:hover { color: var(--accent-soft); }
/* Mobile: alles linksbündig stapeln */
@media (max-width: 720px) {
.footer-grid { grid-template-columns: 1fr; }
.footer-legal,
.footer-links {
grid-column: 1;
justify-self: start;
}
.footer-legal { grid-row: 1; }
.footer-links { grid-row: 2; }
}
/* ------------------------------------------------------------------------
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%); }