/* easytools4me.de - single hand-written stylesheet. Tokens live in :root; components use
   var(--et-*) only. Mobile-first, min-width queries only (48rem, 64rem). Register: modern product
   surface - white working cards on a cool tinted ground, system sans, petrol-green accent, two
   shadow tokens. Navigation wraps; nothing scrolls horizontally except .et-table-wrap. */

:root {
  color-scheme: light;

  --et-space-1: 0.25rem;
  --et-space-2: 0.5rem;
  --et-space-3: 0.75rem;
  --et-space-4: 1rem;
  --et-space-5: 1.5rem;
  --et-space-6: 2rem;
  --et-space-7: 3rem;
  --et-space-8: 4rem;

  --et-text-xs: 0.8125rem;
  --et-text-sm: 0.875rem;
  --et-text-base: 1rem;
  --et-text-lg: 1.125rem;
  --et-text-xl: 1.375rem;
  --et-text-2xl: 1.75rem;
  --et-text-3xl: 2.5rem;
  --et-text-4xl: 3.25rem;
  --et-leading-body: 1.6;
  /* Wide-measure compensation: running prose fills the content column (see the prose block near
     the end of this file), and a long line needs more leading to be tracked back reliably. */
  --et-leading-prose: 1.75;
  --et-leading-tight: 1.15;
  --et-tracking-caps: 0.08em;

  --et-font-sans: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  --et-font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;

  --et-radius-sm: 8px;
  --et-radius-md: 12px;
  --et-radius-pill: 999px;
  --et-container: 64rem;
  /* N1: et-measure-text bounds running text (p/ul/ol/dl/blockquote) and is the ONLY measure applied:.... Full note: docs/stylesheet-notes.md */
  --et-measure-text: 60ch;

  /* Palette verified against BOTH bg and surface (see design-system spec for the ratios).
     Warm paper ground; only working surfaces (form, result) are lifted out of it in white. */
  --et-color-bg: #f4f2ed;
  --et-color-surface: #ffffff;
  --et-color-text: #16232c;
  --et-color-text-muted: #4d5a66;
  --et-color-border: #ddd8cf;
  --et-color-border-strong: #6f7a84;
  --et-color-rule: #c8c1b4;
  --et-color-accent: #0a5c4e;
  --et-color-accent-soft: #e2f0ea;
  --et-color-on-accent: #ffffff;
  --et-color-focus: #0a5c4e;
  --et-color-success: #15713c;
  --et-color-warning: #925a00;
  --et-color-danger: #b4231f;
  --et-color-footer-bg: #17222c;
  --et-color-footer-text: #e7ecf1;
  --et-color-footer-link: #8fd6c6;
  /* Dark-ink counterpart to --et-color-rule: the footer needs a hairline that reads on the ink
     band, where the light-mode muted colour sits at about 1.6 to 1 and is nearly invisible. */
  --et-color-footer-rule: rgba(255, 255, 255, 0.14);

  /* One hue per category, so discovery is colour-coded rather than eight identical green rows.
     Every value clears WCAG AA against BOTH the paper ground and white (measured 5.82 to 7.61 on
     paper), because a category colour carries text and marks on both surfaces. */
  --et-cat-steuern-gehalt: #0a5c4e;
  --et-cat-familie-soziales: #a03418;
  --et-cat-arbeit: #2f4a8a;
  --et-cat-finanzen: #1f6b3a;
  --et-cat-gesundheit: #9b1c46;
  --et-cat-bildung: #6b3a86;
  --et-cat-auto-verkehr: #7a4b12;
  --et-cat-alltag: #0f5f72;

  --et-shadow-sm: 0 1px 2px rgba(23, 34, 44, 0.06), 0 1px 3px rgba(23, 34, 44, 0.08);
  --et-shadow-md: 0 4px 16px rgba(23, 34, 44, 0.12);
}

/* ---------- base ---------- */

*, *::before, *::after { box-sizing: border-box; }

/* Submitting a calculator moves the visitor to the answer rather than dropping them at the top;
   smooth makes that read as movement instead of a jump. The prefers-reduced-motion block near the
   end of this file already resets scroll-behavior, so the preference is honoured by construction
   and this needs no query of its own. */
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }

body {
  margin: 0;
  background: var(--et-color-bg);
  color: var(--et-color-text);
  font-family: var(--et-font-sans);
  font-size: var(--et-text-base);
  line-height: var(--et-leading-body);
  overflow-wrap: break-word;
}

img, svg, video { max-width: 100%; height: auto; }

/* N2: German is a compounding language and this site names things like "Datenschutzerklärung" and ".... Full note: docs/stylesheet-notes.md */
h1, h2, h3, h4 {
  font-weight: 700;
  line-height: var(--et-leading-tight);
  letter-spacing: -0.015em;
  margin: 0 0 var(--et-space-3);
  hyphens: auto;
}
h1 { font-size: clamp(var(--et-text-2xl), 7vw, var(--et-text-3xl)); font-weight: 800; }
h2 { font-size: var(--et-text-2xl); margin-top: var(--et-space-7); }
h3 { font-size: var(--et-text-xl); margin-top: var(--et-space-5); }
h4 { font-size: var(--et-text-lg); }
p, ul, ol, dl, table, figure { margin: 0 0 var(--et-space-4); }

.et-lead { font-size: var(--et-text-lg); color: var(--et-color-text-muted); }

:is(.et-card, .et-footer, .et-disclaimer, .et-banner, .et-result) :is(h2, h3, h4) { margin-top: 0; }
ul, ol { padding-left: var(--et-space-5); }
li + li { margin-top: var(--et-space-1); }
/* `anywhere`, not `break-word`: only the former reduces min-content width, so only the former can
   shrink the track an unbreakable identifier sits in. Same distinction the .et-dl-manifest rule
   documents. On <pre> it is not enough on its own: the UA default `white-space: pre` forbids
   wrapping outright and overrides it, which is why /datumsrechner/ stayed 522px wide at a 360px
   viewport until `pre-wrap` was added. `pre-wrap` keeps the authored line breaks and adds wrapping
   for the lines that do not fit, which is what a formula wants; a sideways-scrolling box is not. */
code, kbd, samp { font-family: var(--et-font-mono); font-size: var(--et-text-sm); overflow-wrap: anywhere; }
pre { white-space: pre-wrap; overflow-wrap: anywhere; }
[hidden] { display: none !important; }

a { color: var(--et-color-accent); text-decoration: underline; text-underline-offset: 0.15em; }
a:hover { text-decoration-thickness: 0.12em; }

:focus-visible {
  outline: 2px solid var(--et-color-focus);
  outline-offset: 2px;
  border-radius: var(--et-radius-sm);
}

.et-container {
  width: 100%;
  max-width: var(--et-container);
  margin: 0 auto;
  padding: 0 var(--et-space-4);
}

.et-muted { color: var(--et-color-text-muted); }
.et-small { font-size: var(--et-text-sm); }

/* Secondary text that names a limit: what a calculation does not cover, what a figure is qualified
   by, when the formulas were last checked. Each of these classes was in the markup already and
   matched nothing here, so the text rendered at body weight and size and read as part of the answer
   rather than as an aside about it. They share .et-field__help's treatment because they are the same
   kind of remark in a different place, and one treatment is the point of having a design system. */
.et-form__hint,
.et-form__note,
.et-prose__meta,
.et-result__note { color: var(--et-color-text-muted); font-size: var(--et-text-sm); }
.et-num { font-variant-numeric: tabular-nums; }

.et-link-button{display:inline;min-width:44px;min-height:44px;padding:0;border:0;background:transparent;color:var(--et-color-accent);font:inherit;text-decoration:underline;cursor:pointer}

.et-visually-hidden { position: absolute; width: 0.0625rem; height: 0.0625rem; margin: 0; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }

.skip-link { position: absolute; left: var(--et-space-2); top: var(--et-space-2); z-index: 20; transform: translateY(-200%); background: var(--et-color-accent); color: var(--et-color-on-accent); padding: var(--et-space-2) var(--et-space-4); border-radius: var(--et-radius-sm); text-decoration: none; }
.skip-link:focus { transform: translateY(0); }

/* ---------- header ---------- */

/* Reflow floor. At 320px with 200% text zoom the masthead was the widest thing on EVERY page: the
   wordmark is one unbreakable word at --et-text-xl, and a nav label like "Familie & Soziales" could
   not break either, so the band set the document width and every page scrolled sideways. `min-width:
   0` lets these flex items shrink below their content, and `overflow-wrap: anywhere` gives the text
   somewhere to break. Nothing changes at normal sizes, where neither ever needs to break. */

/* The one solid ink band on the site: a fixed anchor that leaves the paper ground below it alone. */
.et-header {
  background: var(--et-color-footer-bg);
  color: var(--et-color-footer-text);
  border-bottom: 3px solid var(--et-color-accent);
}
.et-header__bar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--et-space-3);
  padding-top: var(--et-space-4);
  padding-bottom: var(--et-space-2);
}
.et-wordmark { display: inline-flex; align-items: center; gap: var(--et-space-2); font-size: var(--et-text-xl); font-weight: 800; letter-spacing: -0.02em; text-decoration: none; color: var(--et-color-footer-text); margin-right: auto; min-width: 0; overflow-wrap: anywhere; }

/* First-party inline marks. Sized in em so a mark always matches the type it sits beside, and
   coloured by `currentColor` so it needs no per-context variant. */
.et-icon { flex: none; width: 1.5em; height: 1.5em; }
.et-icon--brand { width: 1.6em; height: 1.6em; color: var(--et-color-footer-link); }
.et-icon--cat { width: 1.75rem; height: 1.75rem; color: var(--et-color-accent); }

/* A category carries its own hue wherever it is named. `--et-cat` is set once per element by the
   `data-cat` hook below, and the mark, the count and the rule all inherit it, so one attribute
   colours the whole row without a class per category. */
[data-cat="steuern-gehalt"] { --et-cat: var(--et-cat-steuern-gehalt); }
[data-cat="familie-soziales"] { --et-cat: var(--et-cat-familie-soziales); }
[data-cat="arbeit"] { --et-cat: var(--et-cat-arbeit); }
[data-cat="finanzen"] { --et-cat: var(--et-cat-finanzen); }
[data-cat="gesundheit"] { --et-cat: var(--et-cat-gesundheit); }
[data-cat="bildung"] { --et-cat: var(--et-cat-bildung); }
[data-cat="auto-verkehr"] { --et-cat: var(--et-cat-auto-verkehr); }
[data-cat="alltag"] { --et-cat: var(--et-cat-alltag); }
[data-cat] .et-icon { color: var(--et-cat, var(--et-color-accent)); }
[data-cat] .et-figure { color: var(--et-cat, var(--et-color-accent)); }
[data-cat] .et-card__meta { color: var(--et-cat, var(--et-color-text-muted)); }
.et-title-icon[data-cat] .et-icon { color: var(--et-cat, var(--et-color-accent)); }
.et-icon--title { width: 1em; height: 1em; color: var(--et-color-accent); }
.et-icon--meta { width: 1.15em; height: 1.15em; }
.et-title-icon { display: flex; align-items: center; gap: var(--et-space-3); }
.et-card__meta { display: flex; align-items: center; gap: var(--et-space-2); }
/* The nav wraps - never a scrollbar, never a truncated category. */
.et-nav ul {
  display: flex;
  flex-wrap: wrap;
  gap: var(--et-space-2);
  list-style: none;
  margin: 0;
  padding: 0 0 var(--et-space-3);
}
.et-nav li { margin: 0; min-width: 0; }
/* Tighter padding at narrow widths, so eight wrapped categories cost three rows of the first
   viewport rather than four. The minimum target size is never traded away for it. */
.et-nav a { display: flex; align-items: center; min-width: 0; overflow-wrap: anywhere; min-height: 44px; padding: 0 var(--et-space-2); border-radius: var(--et-radius-sm); text-decoration: none; color: var(--et-color-footer-text); font-size: var(--et-text-xs); font-weight: 500; transition: background-color 0.15s, color 0.15s; }
.et-nav a:hover { background: rgba(255, 255, 255, 0.12); color: var(--et-color-on-accent); }
.et-nav a[aria-current="page"], .et-nav a.is-active { background: var(--et-color-accent); color: var(--et-color-on-accent); font-weight: 600; }
.et-header :focus-visible { outline-color: var(--et-color-footer-link); }

/* ---------- breadcrumbs ---------- */

.et-breadcrumb { padding: var(--et-space-3) 0 0; font-size: var(--et-text-sm); }
.et-breadcrumb ol {
  display: flex;
  flex-wrap: wrap;
  gap: var(--et-space-2);
  list-style: none;
  margin: 0;
  padding: 0;
}
.et-breadcrumb li { margin: 0; display: flex; gap: var(--et-space-2); }
.et-breadcrumb li + li::before { content: "\203A"; color: var(--et-color-text-muted); }
.et-breadcrumb [aria-current="page"] { color: var(--et-color-text-muted); }

/* ---------- main / footer ---------- */

/* Margins, not padding: .et-container on <main> would override a padding shorthand. */
main { display: block; margin: var(--et-space-5) 0 var(--et-space-8); }

.et-footer {
  background: var(--et-color-footer-bg);
  color: var(--et-color-footer-text);
  padding: var(--et-space-7) 0 var(--et-space-6);
  font-size: var(--et-text-sm);
}
.et-footer a { color: var(--et-color-footer-link); }
.et-footer .et-link-button { color: var(--et-color-footer-link); }
.et-footer :focus-visible { outline-color: var(--et-color-footer-link); }
.et-footer h2 {
  font-size: var(--et-text-xs);
  font-weight: 700;
  letter-spacing: var(--et-tracking-caps);
  text-transform: uppercase;
  margin: 0 0 var(--et-space-3);
}
.et-footer ul { list-style: none; margin: 0 0 var(--et-space-5); padding: 0; }
.et-footer li { margin: 0 0 var(--et-space-2); }
.et-footer__cols { display: grid; gap: var(--et-space-5); }
.et-footer__note { margin: var(--et-space-4) 0 0; border-top: 1px solid var(--et-color-text-muted); padding-top: var(--et-space-4); }

/* ---------- buttons ---------- */

.et-btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--et-space-2); min-height: 44px; min-width: 44px; padding: var(--et-space-2) var(--et-space-5); border: 1px solid var(--et-color-accent); border-radius: var(--et-radius-sm); background: var(--et-color-accent); color: var(--et-color-on-accent); font: inherit; font-weight: 600; text-decoration: none; cursor: pointer; transition: filter 0.15s, box-shadow 0.15s; }
.et-btn:hover { filter: brightness(1.15); box-shadow: var(--et-shadow-sm); }
.et-btn--secondary { background: transparent; color: var(--et-color-accent); border-color: var(--et-color-accent); }
.et-btn--secondary:hover { filter: none; background: var(--et-color-accent-soft); }
.et-btn--ghost { background: transparent; color: var(--et-color-text); border-color: transparent; }
.et-btn--small { padding: var(--et-space-1) var(--et-space-3); font-size: var(--et-text-sm); }

/* ---------- forms ---------- */

/* The form is one of the page's two working cards. Sections come from styled fieldsets. */
/* The question. Deliberately the quieter of the two working cards; the result carries the accent
   edge and the deeper shadow. */
.et-form { margin: 0 0 var(--et-space-5); background: var(--et-color-surface); border: 1px solid var(--et-color-border); border-radius: var(--et-radius-md); padding: var(--et-space-5); }
.et-form fieldset { border: 0; margin: 0; padding: 0; min-width: 0; }
.et-form fieldset + fieldset { margin-top: var(--et-space-5); padding-top: var(--et-space-5); border-top: 1px solid var(--et-color-border); }
.et-form legend { font-size: var(--et-text-lg); font-weight: 700; padding: 0; margin: 0 0 var(--et-space-4); }

/* The grid is established by the FORM and by every section inside it, never by a wrapper class the
   markup has to remember. Putting it only on `fieldset` was not enough: 28 of the 60 forms have no
   fieldset at all, and 5 of those (elterngeld, minijob, pendlerpauschale, rentenpunkte, unterhalt)
   hang their fields straight off <form>, so they stayed ungridded and, once the help paragraph's
   margin was dropped, their fields touched. Nor was enumerating wrapper classes enough: bundles
   group fields in <details class="et-form__group">, <details class="et-form__block"> and a bare
   <details>, and .et-form__group had no CSS at all. So the selector asks what an element CONTAINS
   rather than what it is called: any fieldset, details, div or section that holds a field directly
   is a field container, EXCEPT <details>: see the note under this rule.
   firmenwagen's <fieldset class="et-field"> radio group holds radios, not fields, so it is left
   alone. A .et-notenliste__row is excluded for the same reason as <details>: it holds two fields
   directly, so it matched here, and this rule's two-column track list at 48rem outranks the row's
   own three-track Nr./Note/Gewichtung grid (0,2,1 against 0,1,0). From 768 px up every grade read
   as three stacked half-columns. It is a ROW, not a field container.
   See redesign-forms-and-sources/design.md D1. */
.et-form,
.et-form :is(fieldset, div, section):not(.et-notenliste__row):has(> .et-field),
.et-fields { display: grid; gap: var(--et-space-4) var(--et-space-5); }
/* A <details> is NEVER gridded: giving it any display other than block breaks the native closed
   state, and four bundles use it as a collapsible form group. Their fields are not grid items, so
   they get the same rhythm from a margin instead. */
.et-form details > .et-field + .et-field { margin-top: var(--et-space-4); }
/* A SECTION takes the whole row; only a field takes a column. Without this, gridding .et-form drops
   a fieldset, a group or the submit row into a half-width column. */
.et-form > :is(fieldset, details, section),
.et-form > p,
.et-form__actions,
.et-form :is(fieldset, div, section) > :is(legend, p, h2, h3) { grid-column: 1 / -1; }
/* min-width: 0 because a <select> is sized by its widest OPTION and an option is a German phrase
   („Stromkosten eines einzelnen Geräts"): without it the field's grid track could not go below that
   width, and /stromkosten-rechner/ measured 403 px at a 320 px viewport under 200 % text zoom. */
.et-field { display: flex; flex-direction: column; gap: var(--et-space-1); min-width: 0; }
.et-field--inactive { opacity: 0.55; }
/* One grade per row. The old rules selected `.et-notenliste > li`, but this form emits
   `.et-notenliste__row`, so nothing matched and each row stacked vertically down half the column,
   20 times over. form.php had diagnosed it and asked for these rules by name. */
.et-notenliste { display: grid; gap: var(--et-space-3); list-style: none; margin: 0; padding: 0; grid-column: 1 / -1; }
.et-notenliste__row { display: grid; grid-template-columns: auto minmax(0, 2fr) minmax(0, 1fr); align-items: end; gap: var(--et-space-3); }
.et-notenliste__nr { padding-bottom: var(--et-space-3); color: var(--et-color-text-muted); font-variant-numeric: tabular-nums; }
.et-notenliste .et-field { margin: 0; }
.et-field__label { font-weight: 600; }
.et-field__req { color: var(--et-color-text-muted); font-weight: 400; font-size: var(--et-text-sm); }
.et-field__row { display: flex; flex-wrap: wrap; align-items: center; gap: var(--et-space-2); }
.et-field__unit { color: var(--et-color-text-muted); white-space: nowrap; }
/* Stepper: the visitor reads minus, field, plus, but the DOM must keep the field FIRST and both
   buttons after it, because a no-JS submit lets the pressed button's value win by document order.
   The visual order is therefore CSS, and it is a component here rather than a style attribute in a
   bundle: the CSP is `style-src 'self'`, so a style attribute is blocked outright and the buttons
   land behind the field on the live site. The row keeps .et-field__row's flex-wrap: wrap on
   purpose. nowrap would put minus + field + plus + a unit such as "Tage, üblich: 21 bis 35 Tage"
   (204 px) on one 278 px line and push the document past 320 px. The field is the item that gives:
   it starts from 7rem and grows into whatever the line leaves, so the triple stays together and
   only the unit drops to the next line. */
.et-field__row--stepper input { flex: 1 1 7rem; min-width: 0; }
.et-stepper__btn { flex: 0 0 auto; }
.et-stepper__btn--minus { order: -1; }
.et-stepper__btn--plus { order: 1; }
/* white-space: normal only here: .et-field__unit is nowrap so that "€/kWh" never breaks, but a
   stepper's unit is a sentence ("Tage, üblich: 21 bis 35 Tage", 204 px, 408 px under 200 % zoom)
   and a sentence that cannot wrap sets the document width. */
.et-field__row--stepper .et-field__unit { order: 2; white-space: normal; }
/* margin:0 is load-bearing: the base <p> margin was the only separation between fields, so spacing
   depended on whether a field declared help. The grid gap owns field rhythm now. (D4) */
.et-field__help,
.et-year-variants__intro { margin: 0; color: var(--et-color-text-muted); font-size: var(--et-text-sm); }
.et-field__error { margin: 0; color: var(--et-color-danger); font-size: var(--et-text-sm); font-weight: 600; }

/* Wrapper stays a COLUMN; only the label (box + sentence) is a row. flex-direction:row sat on the
   wrapper, so help and error rendered BESIDE the checkbox. (D3) */
/* .et-radio is the same object with a radio in it: one label, one 44 px target, one sentence. */
.et-field--check label,
.et-radio { display: flex; align-items: center; gap: var(--et-space-2); min-height: 44px; min-width: 0; overflow-wrap: anywhere; }
.et-field--check .et-field__help,
.et-field--check .et-field__error { padding-left: calc(1.25rem + var(--et-space-2)); }

/* Width from the CONTROL'S OWN ATTRIBUTES, not a class the markup must remember: 24 bundles
   hand-write the very fields that needed capping. max-width on the control only, nothing is
   clipped; `select` is absent on purpose. (D2) */
.et-field input[inputmode="numeric"] { max-width: 7rem; }
.et-field input[inputmode="decimal"] { max-width: 11rem; }
.et-field :is(input[type="date"], input[type="month"]) { max-width: 14rem; }
/* A count that carries a unit is an amount, not a count. */
.et-field:has(.et-field__unit) input[inputmode="numeric"] { max-width: 11rem; }

input[type="text"], input[type="search"], input[type="date"], select, textarea {
  font: inherit;
  min-height: 44px;
  width: 100%;
  padding: var(--et-space-2) var(--et-space-3);
  background: var(--et-color-surface);
  color: var(--et-color-text);
  border: 1px solid var(--et-color-border-strong);
  border-radius: var(--et-radius-sm);
  transition: border-color 0.15s;
}
:is(input[type="text"], input[type="search"], input[type="date"], select, textarea):hover { border-color: var(--et-color-accent); }
input[type="checkbox"] { width: 1.25rem; height: 1.25rem; accent-color: var(--et-color-accent); }
input[aria-invalid="true"], select[aria-invalid="true"] {
  border-color: var(--et-color-danger);
  border-width: 2px;
}
.et-form__actions { display: flex; flex-wrap: wrap; gap: var(--et-space-3); margin-top: var(--et-space-5); }
.et-form__actions .et-btn { flex-grow: 1; }

/* ---------- result panel ---------- */

/* N3: The hero card, and it must outrank the form: the form is the question, this is the answer. Full note: docs/stylesheet-notes.md */
.et-result { display: block; min-height: 12rem; background: var(--et-color-surface); border: 1px solid var(--et-color-border); border-radius: var(--et-radius-md); box-shadow: var(--et-shadow-md); padding: var(--et-space-6) var(--et-space-5) var(--et-space-5); }
.et-result--l { min-height: 20rem; }
.et-result--xl { min-height: 34rem; }
.et-result__placeholder { color: var(--et-color-text-muted); margin: 0; }
/* The one number the visitor came for. Lining and tabular, tightened, and a size step above the
   page heading, because on a calculator page the answer outranks the title. */
.et-result__primary { font-size: var(--et-text-3xl); line-height: 1; letter-spacing: -0.035em; font-variant-numeric: tabular-nums lining-nums; font-weight: 800; color: var(--et-color-accent); margin: 0 0 var(--et-space-3); }
.et-result__primary-label { display: block; font-size: var(--et-text-xs); font-weight: 700; letter-spacing: var(--et-tracking-caps); text-transform: uppercase; color: var(--et-color-text-muted); margin-bottom: var(--et-space-1); }
.et-result dl { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 0 var(--et-space-4); margin: var(--et-space-4) 0; }
.et-result dt { color: var(--et-color-text-muted); padding: var(--et-space-2) 0; border-top: 1px solid var(--et-color-border); }
.et-result dd { margin: 0; text-align: right; font-variant-numeric: tabular-nums; padding: var(--et-space-2) 0; border-top: 1px solid var(--et-color-border); }
/* The plain-language reading of the figure: set at reading size, not shrunk to fine print. */
.et-result__text { margin: 0; font-size: var(--et-text-lg); }
.et-result__warnings { list-style: none; margin: var(--et-space-4) 0 0; padding: 0; }
.et-result__warnings li {
  color: var(--et-color-warning);
  border-left: 3px solid var(--et-color-warning);
  padding-left: var(--et-space-3);
}
.et-result__errors { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--et-space-2); }
.et-result__error { color: var(--et-color-danger); font-weight: 600; margin: 0; }
.et-result-actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--et-space-3);
  min-height: 3rem;
  margin: var(--et-space-3) 0 var(--et-space-6);
}
/* The answer should not land glued to the viewport edge, the same courtesy #method already gets. */
#tool-result { scroll-margin-top: var(--et-space-4); }
#tool-result-status { margin: 0; color: var(--et-color-text-muted); font-size: var(--et-text-sm); }

/* ---------- cards ---------- */

.et-cards { display: grid; gap: var(--et-space-4); list-style: none; margin: 0 0 var(--et-space-6); padding: 0; }
.et-cards li { margin: 0; min-width: 0; }
/* Teaser: a ruled, title-led entry on paper. Equal-weight boxes read as a wall; rules read as a list. */
.et-card { display: flex; flex-direction: column; height: 100%; background: transparent; border: 0; border-top: 2px solid var(--et-color-text); border-radius: 0; padding: var(--et-space-4) 0 var(--et-space-5); transition: border-color 0.15s; }
.et-card:hover { border-top-color: var(--et-color-accent); }
.et-card h2, .et-card h3 { font-size: var(--et-text-lg); margin: 0 0 var(--et-space-2); letter-spacing: -0.02em; overflow-wrap: anywhere; }
.et-card h2 a, .et-card h3 a { text-decoration: none; color: var(--et-color-text); }
.et-card h2 a:hover, .et-card h3 a:hover { color: var(--et-color-accent); text-decoration: underline; }
.et-card p { margin: 0 0 var(--et-space-3); color: var(--et-color-text-muted); }
/* Category label: a quiet caps line, not a filled pill on every card. */
.et-card__meta { margin: auto 0 0; font-size: var(--et-text-xs); font-weight: 700; letter-spacing: var(--et-tracking-caps); text-transform: uppercase; color: var(--et-color-text-muted); }

/* N4: Category tile: the hue gives each category an IDENTITY. Full note: docs/stylesheet-notes.md */
.et-cards--cats { gap: var(--et-space-3); margin-bottom: var(--et-space-7); }
.et-card--cat { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: start; column-gap: var(--et-space-4); border: 0; padding: var(--et-space-4); border-radius: var(--et-radius-md); }
.et-card--cat[data-cat] { background: color-mix(in srgb, var(--et-cat) 7%, var(--et-color-surface)); transition: background 0.15s; }
.et-card--cat[data-cat]:hover { background: color-mix(in srgb, var(--et-cat) 15%, var(--et-color-surface)); }
.et-card--cat .et-icon { grid-column: 1; grid-row: 1 / span 2; width: 2.5rem; height: 2.5rem; margin-top: 0; color: var(--et-cat, var(--et-color-accent)); }
.et-card--cat h3 { grid-column: 2; font-size: var(--et-text-xl); margin: 0; align-self: center; }
.et-card--cat h3 a { color: var(--et-cat, var(--et-color-accent)); }
.et-card--cat p { grid-column: 2; margin: var(--et-space-2) 0 0; }
/* N5: A tile deliberately carries NOTHING but the mark, the name and the description. Full note: docs/stylesheet-notes.md */

/* Signature: a calculator portal sets its numerals large, lining and tabular. */
.et-figure { display: block; font-size: var(--et-text-3xl); font-weight: 800; line-height: 1; letter-spacing: -0.04em; font-variant-numeric: tabular-nums lining-nums; color: var(--et-color-accent); }
.et-figure__unit { display: block; font-size: var(--et-text-xs); font-weight: 700; letter-spacing: var(--et-tracking-caps); text-transform: uppercase; color: var(--et-color-text-muted); margin-top: var(--et-space-1); }
/* N6: The opening block is the one place the page lifts off the paper, so the first viewport has a.... Full note: docs/stylesheet-notes.md */
.et-hero { background: var(--et-color-surface); border: 1px solid var(--et-color-border); border-radius: var(--et-radius-md); padding: var(--et-space-6) var(--et-space-5); margin-bottom: var(--et-space-7); }
.et-hero h1 { font-size: var(--et-text-3xl); letter-spacing: -0.03em; text-wrap: balance; }
.et-hero .et-lead { margin-bottom: 0; }
/* Proof strip: sourced and dated is the product claim, so it is stated up front. Only real
   quantities take the figure style; a claim stays ink at text weight. */
.et-proof { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(9rem, 100%), 1fr)); gap: var(--et-space-5); list-style: none; margin: var(--et-space-5) 0 0; padding: 0; }
.et-proof li { margin: 0; }
.et-proof .et-figure { font-size: var(--et-text-2xl); }
.et-proof__claim { display: block; font-size: var(--et-text-base); font-weight: 700; line-height: 1.25; color: var(--et-color-text); }

/* ---------- tables ---------- */

.et-table-wrap { overflow-x: auto; margin: 0 0 var(--et-space-5); }
.et-table { width: 100%; border-collapse: collapse; font-size: var(--et-text-sm); }
.et-table caption { text-align: left; font-size: var(--et-text-xs); font-weight: 700; letter-spacing: var(--et-tracking-caps); text-transform: uppercase; color: var(--et-color-text-muted); padding: 0 0 var(--et-space-2); }
.et-table th, .et-table td { padding: var(--et-space-2) var(--et-space-3); border-bottom: 1px solid var(--et-color-border); text-align: left; }
.et-table td.et-num, .et-table th.et-num { text-align: right; font-variant-numeric: tabular-nums; }
.et-table thead th { background: var(--et-color-bg); border-bottom: 1px solid var(--et-color-border-strong); }

/* ---------- FAQ, banner, disclaimer ---------- */

/* N7: Questions are a ruled index like the rest of the site, not a stack of floating cards: they si.... Full note: docs/stylesheet-notes.md */
.et-faq__item { border-top: 1px solid var(--et-color-rule); padding: var(--et-space-4) 0; }
.et-faq__item:last-child { border-bottom: 1px solid var(--et-color-rule); }
/* A question is a heading, not a control: as <summary> it hid five of six answers behind a click.
   margin-top:0 beats the global h3 rule. (D7) */
.et-faq__q { font-size: var(--et-text-lg); margin: 0 0 var(--et-space-2); padding-top: 0; border-top: 0; }
/* No measure cap: the item draws a full-width rule and the question is a full-width heading, so a
   capped answer reads as truncated against the block's own edge — the same ragged look the container
   cap gave "So wird gerechnet". A surface keeps the measure only when nothing in its block is wider.
   The prose leading comes with the width, as it does everywhere else. */
.et-faq__a { margin: 0; line-height: var(--et-leading-prose); }

.et-banner {
  padding: var(--et-space-3) var(--et-space-4);
  margin: 0 0 var(--et-space-5);
  border-left: 4px solid var(--et-color-warning);
  border-radius: var(--et-radius-sm);
  background: var(--et-color-surface);
  box-shadow: var(--et-shadow-sm);
}

.et-disclaimer {
  margin: var(--et-space-6) 0 0;
  padding: var(--et-space-4);
  border-left: 4px solid var(--et-color-warning);
  border-radius: var(--et-radius-sm);
  background: var(--et-color-surface);
}
.et-disclaimer h2 { font-size: var(--et-text-lg); margin: 0 0 var(--et-space-2); }
.et-disclaimer p { margin: 0; }

/* An index, not a bullet list: 24 citations used to mean 24 full-bleed hairlines each holding a
   bare link. Rules separate the two GROUPS now. An entry is a citation plus a purpose line. (D5) */
.et-sources__group { margin: 0 0 var(--et-space-5); }
.et-sources__group-title { font-size: var(--et-text-xs); font-weight: 700; letter-spacing: var(--et-tracking-caps); text-transform: uppercase; color: var(--et-color-text-muted); margin: 0 0 var(--et-space-3); padding-top: var(--et-space-3); border-top: 1px solid var(--et-color-rule); }
.et-sources ul { list-style: none; padding: 0; margin: 0; display: grid; gap: var(--et-space-3); }
/* A Fundstelle such as „BMF Finaler Programmablaufplan 2026, Anlage 1" is the widest single item on
   a tool page and sets its grid track: it may shrink and break (overflow-wrap is inherited, so the
   link and the purpose line inside get it too). */
.et-sources li { margin: 0; padding: 0; border: 0; min-width: 0; overflow-wrap: anywhere; }
/* The purpose line: what this citation backs. Muted and one step down, so the citation stays the
   thing being scanned and the explanation supports it instead of competing. */
.et-sources__what { display: block; color: var(--et-color-text-muted); font-size: var(--et-text-sm); }
.et-sources__host { color: var(--et-color-text-muted); font-size: var(--et-text-sm); font-weight: 400; }
/* Stand-Chip: the signature mark - value freshness as a badge. */
.et-stand { display: inline-block; color: var(--et-color-accent); background: var(--et-color-accent-soft); border-radius: var(--et-radius-pill); padding: var(--et-space-1) var(--et-space-3); font-size: var(--et-text-sm); font-weight: 600; }

/* N8: The privacy manifest prints each processor's own policy URL as its own link text, so a dd her.... Full note: docs/stylesheet-notes.md */
.et-dl-manifest { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--et-space-1); margin: 0 0 var(--et-space-4); }
.et-dl-manifest dt { font-weight: 600; }
.et-dl-manifest dd { margin: 0 0 var(--et-space-2); overflow-wrap: anywhere; }

/* ---------- print footer (screen: hidden) ---------- */

.et-print-only { display: none; }

/* ---------- tool component hooks (bundles emit the classes; CSP forbids inline styles) ---------- */

.et-bmi-badge { display: inline-block; padding: var(--et-space-1) 0; font-weight: 700; }
.et-bmi-badge--normal { color: var(--et-color-success); }
.et-bmi-badge--untergewicht, .et-bmi-badge--uebergewicht { color: var(--et-color-warning); }
.et-bmi-badge--adipositas-1, .et-bmi-badge--adipositas-2, .et-bmi-badge--adipositas-3 { color: var(--et-color-danger); }
/* N9: Six German compound labels, Untergewicht through Adipositas Grad III, cannot share one row on.... Full note: docs/stylesheet-notes.md */
.et-bmi-scale { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(8.5em, 100%), 1fr)); gap: var(--et-space-1); margin: var(--et-space-4) 0 0; }
.et-bmi-scale__band { padding: var(--et-space-1) 0; border-top: 2px solid var(--et-color-border-strong); font-size: var(--et-text-xs); text-align: center; }
.et-bmi-scale__band--active { border-top-color: var(--et-color-text); font-weight: 700; }
.et-bmi-scale__band--active::before { content: "\25BC"; display: block; color: var(--et-color-text); }

/* Both shapes: the modifier is written like one on the <ul>, but its only consumer puts it on the
   <li> that carries the Lebensgefahr warning, so the descendant form alone matched nothing and the
   bundle fell back to a style attribute the CSP blocks. The element is part of the second selector
   on purpose: a bare class (0,1,0) loses to `.et-result__warnings li` (0,1,1) above. font-weight is
   in the rule for the same reason as the colours: it was in that attribute. */
.et-result__warnings--danger li,
li.et-result__warnings--danger { color: var(--et-color-danger); border-left-color: var(--et-color-danger); font-weight: 700; }
.et-result__tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(9rem, 100%), 1fr)); gap: var(--et-space-3); margin: var(--et-space-4) 0 0; }
.et-table__row--current { background: var(--et-color-accent-soft); font-weight: 600; }

.et-eisprung__head { display: grid; gap: var(--et-space-3); margin: 0 0 var(--et-space-2); }
.et-eisprung__zyklen { margin: var(--et-space-5) 0 0; }
.et-eisprung__warn--stark { font-weight: 700; border-left-width: 5px; }
.et-eisprung__privacy { margin: var(--et-space-4) 0 0; font-size: var(--et-text-sm); color: var(--et-color-text-muted); }

/* Stacked table on a phone, real table again at 48rem (min-width queries only). */
.et-eisprung__zyklen :is(table, tbody, tr, td, tbody th) { display: block; }
.et-eisprung__zyklen thead { position: absolute; width: 0.0625rem; height: 0.0625rem; margin: 0; padding: 0; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
.et-eisprung__zyklen tbody tr { margin: 0 0 var(--et-space-3); padding: var(--et-space-2) var(--et-space-3); border: 1px solid var(--et-color-border); border-radius: var(--et-radius-md); }
.et-eisprung__zyklen :is(tbody th, tbody td) { display: flex; justify-content: space-between; gap: var(--et-space-4); padding: var(--et-space-1) 0; border: 0; text-align: left; }
.et-eisprung__zyklen :is(tbody th, tbody td)::before { content: attr(data-label) ": "; font-weight: 600; color: var(--et-color-text-muted); }

.et-table-details { margin: var(--et-space-4) 0 0; }
.et-table-details > summary { min-height: 44px; padding: var(--et-space-2) 0; font-weight: 600; cursor: pointer; }
.et-result__exclusions { margin: var(--et-space-5) 0 0; padding: var(--et-space-3) 0 0; border-top: 1px solid var(--et-color-border); }
.et-result__exclusions-title { margin: 0 0 var(--et-space-2); font-weight: 600; }
/* Quick-pick chips - only interactive ones are targets, a label pill is not. */
.et-chips { display: flex; flex-wrap: wrap; gap: var(--et-space-2); }
.et-chip { display: inline-flex; align-items: center; justify-content: center; padding: var(--et-space-1) var(--et-space-3); border: 1px solid var(--et-color-border-strong); border-radius: var(--et-radius-pill); background: var(--et-color-surface); color: var(--et-color-text); font: inherit; font-size: var(--et-text-sm); text-decoration: none; transition: border-color 0.15s, color 0.15s; }
:is(button, a).et-chip { min-height: 44px; min-width: 44px; cursor: pointer; }
:is(button, a).et-chip:hover { border-color: var(--et-color-accent); color: var(--et-color-accent); background: var(--et-color-accent-soft); }
.et-segmented { display: flex; flex-wrap: wrap; gap: var(--et-space-2); }
.et-segmented__option { min-height: 44px; padding: var(--et-space-2) var(--et-space-3); border: 1px solid var(--et-color-border-strong); border-radius: var(--et-radius-sm); cursor: pointer; }
.et-segmented__option.is-active { border-color: var(--et-color-accent); background: var(--et-color-accent); color: var(--et-color-on-accent); }
.et-lookup [role="listbox"] { max-height: 18rem; overflow: auto; border: 1px solid var(--et-color-border-strong); border-radius: var(--et-radius-sm); background: var(--et-color-surface); }
.et-lookup [role="option"] { display: flex; align-items: center; min-height: 44px; width: 100%; padding: var(--et-space-2); border: 0; background: transparent; text-align: left; }
.et-lookup [role="option"][aria-selected="true"] { font-weight: 700; color: var(--et-color-accent); }

/* ---------- larger viewports ---------- */

@media (min-width: 48rem) {
  .et-result { min-height: 9rem; }
  /* Wide enough for six labels side by side: restore the horizontal scale. */
  .et-nav a { padding: 0 var(--et-space-3); font-size: var(--et-text-sm); }
  .et-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: var(--et-space-6); }
  .et-cards--cats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .et-form,
  .et-form :is(fieldset, div, section):not(.et-notenliste__row):has(> .et-field),
  .et-fields { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  /* --wide is the existing name (select); --full is the same span for checkboxes, whose label is a
     sentence. minmax(0, 1fr) stops a long German compound from widening its track. */
  .et-field--wide,
  .et-field--full { grid-column: 1 / -1; }
  .et-form__actions .et-btn { flex-grow: 0; }
  .et-eisprung__head { grid-template-columns: 1fr 1fr; align-items: start; }
  .et-eisprung__zyklen :is(table, tbody, tr, td, tbody th) { display: revert; }
  .et-eisprung__zyklen thead { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip-path: none; }
  .et-eisprung__zyklen tbody tr { margin: 0; padding: 0; border: 0; }
  .et-eisprung__zyklen :is(tbody th, tbody td)::before { content: none; }
  .et-table-details > summary { list-style: none; cursor: default; }
  .et-table-details > summary::-webkit-details-marker { display: none; }
  .et-table-details > *:not(summary) { display: block; }
  .et-footer__cols { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (min-width: 64rem) {
  .et-cards { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .et-cards--cats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  /* The text column keeps the lion's share: the headline is the page's largest object and must not
     be squeezed into a narrow measure, so the proof column takes only what four short items need,
     stacked one per row rather than two by two, which is what makes the strip read as a column
     beside the claim instead of a second block under it. */
  .et-hero { display: grid; grid-template-columns: minmax(0, 1.7fr) minmax(0, 1fr); column-gap: var(--et-space-7); align-items: start; }
  .et-hero .et-proof { margin-top: 0; grid-template-columns: minmax(0, 1fr); gap: var(--et-space-4); }
  .et-footer__cols { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/* ---------- motion ---------- */

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

/* ---------- print ---------- */

@media print {
  @page { margin: 1.5cm; }

  :root {
    --et-color-bg: white;
    --et-color-surface: white;
    --et-color-text: black;
    --et-color-text-muted: black;
    --et-color-border: black;
    --et-color-border-strong: black;
    --et-color-accent: black;
    --et-color-accent-soft: white;
    --et-color-on-accent: white;
    --et-color-focus: black;
    --et-color-success: black;
    --et-color-warning: black;
    --et-color-danger: black;
    --et-color-footer-bg: white;
    --et-color-footer-text: black;
    --et-color-footer-link: black;
    --et-shadow-sm: none;
    --et-shadow-md: none;
  }

  body { background: white; color: black; }

  /* A collapsed table must still appear on paper. */
  details > *:not(summary) { display: block !important; }
  details > summary { list-style: none; }

  .skip-link,
  .et-header,
  .et-breadcrumb,
  .et-footer,
  .et-result-actions,
  #related,
  .et-faq,
  .et-no-print { display: none !important; }

  .et-print-only { display: block; font-size: var(--et-text-sm); }
  .et-result { break-inside: avoid; page-break-inside: avoid; border: 1px solid black; }
  a[href]::after { content: ""; }
  main { padding: 0; }
}

/* ---------- Global frame: masthead, navigation, breadcrumbs, footer ---------- */

/* design-frame.css: masthead, nav, breadcrumbs, footer.
   Self-contained delta for layout.php / breadcrumbs.php; append after main.css. Uses only existing
   --et-* tokens except one new token (justified below). No new breakpoints, so base plus 48rem plus 64rem,
   matching main.css's own register. */


/* ---------- header: one band instead of two ---------- */

/* N10: The wordmark used to sit in its own full-width bar with the nav wrapped in a second container.... Full note: docs/stylesheet-notes.md */
.et-nav { flex: 1 1 100%; }

@media (min-width: 64rem) {
  .et-header__bar { flex-wrap: nowrap; align-items: flex-start; }
  .et-nav { flex: 1 1 auto; min-width: 0; }
  /* The brand keeps its own width on the single-row masthead. From 64rem the bar stops wrapping, so
     the wordmark and the nav become flex siblings on one line, and flex hands out shrink to both at
     once: the wordmark reached its own min-content width long before the nav ran out of room to
     give. That min-content width is one character, because the reflow floor lets the wordmark break
     anywhere, so the mark read "EasyTools4 / Me" on every desktop viewport. `flex: none` takes it
     out of the negotiation and leaves the shrink to the nav, which is built to absorb it by wrapping
     into another row. Below 64rem the wordmark has the row to itself and the reflow rule is
     untouched; that case is also unreachable here, since `rem` in a media query cannot observe text
     zoom, so this query never fires at the 320 px zoom floor the reflow rule exists for. */
  .et-wordmark { flex: none; }
}

/* Tighter row rhythm: gap was one value (8px) for both axes, so four wrapped rows on narrow
   viewports each carried a full 8px seam. Splitting the gap keeps 8px between items on the same row
   (still comfortable to tell pills apart) but halves the seam between rows, and the list's own
   trailing padding drops a notch too. Pure density and type, no change to the 44px minimum target. */
.et-nav ul { row-gap: var(--et-space-1); column-gap: var(--et-space-2); padding-bottom: var(--et-space-2); }

/* N11: The active pill carried one hard-coded accent green regardless of which of the eight categori.... Full note: docs/stylesheet-notes.md */
.et-nav a[aria-current="page"], .et-nav a.is-active { background: var(--et-cat, var(--et-color-accent)); }

/* ---------- breadcrumbs: presence via type and a rule, not a box ---------- */

/* A thin, low-padding grey line had no weight of its own between the ink band and the page's own
   H1. A hairline rule (the paper-ground --et-color-rule already used for this purpose elsewhere),
   more breathing room and a touch more weight give it a defined place without introducing a card or
   shadow, matching the rest of the site's typographic-only separation. */
.et-breadcrumb {
  display: flex;
  align-items: center;
  gap: var(--et-space-2);
  padding: var(--et-space-4) 0;
  margin-bottom: var(--et-space-2);
  border-bottom: 1px solid var(--et-color-rule);
  font-weight: 500;
}
/* N12: Small category mark ahead of the trail: same [data-cat] mechanism as the nav pill and the cat.... Full note: docs/stylesheet-notes.md */
.et-breadcrumb__icon { width: 1.1em; height: 1.1em; flex: none; color: var(--et-cat, var(--et-color-text-muted)); }

/* ---------- footer: brand presence and hierarchy ---------- */

/* Bookend the masthead: the exact same mark and wordmark used at the top of the page now open the
   footer too, reusing .et-wordmark as-is (same ink band, same colours, zero new rules needed for the
   mark itself) rather than inventing a second brand treatment. Block-level instead of the header's
   inline-flex so the rule below it can span the full column width. */
.et-footer__brand {
  display: flex;
  width: 100%;
  margin-bottom: var(--et-space-5);
  padding-bottom: var(--et-space-5);
  border-bottom: 1px solid var(--et-color-footer-rule);
}

/* Only two column groups now (see layout.php: Rechtliches and Übersicht share one column instead of
   giving a single "Startseite" link its own equal-weight column), so the 64rem tier that used to
   stretch three columns across the row is brought down to two; otherwise the freed third track would
   sit empty on the right. */
@media (min-width: 64rem) {
  .et-footer__cols { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* N13: A small category mark ahead of each footer category link, so the site's longest link list sca.... Full note: docs/stylesheet-notes.md */
[data-cat] .et-icon--footer,
.et-icon--footer { width: 1.1em; height: 1.1em; margin-right: var(--et-space-2); vertical-align: -0.15em; color: var(--et-color-footer-link); }

/* The low-contrast divider above "Alle Angaben ohne Gewähr." borrowed the light-mode muted-text
   colour (~1.6:1 on this ink); switch it to the same hairline used above the footer link columns. */
.et-footer__note { border-top-color: var(--et-color-footer-rule); }

/* ---------- Category hubs and long-form reading surfaces ---------- */

/* N14: design-hub.css - category hub & legal/content surfaces. Full note: docs/stylesheet-notes.md */

/* N15: finding: continuous prose measure ---------- `--et-measure` (66ch) already existed as a token.... Full note: docs/stylesheet-notes.md */

/* Running text uses the content column. The cap was --et-measure-text (60ch, ~549px), which left
   445px of a 992px column empty to the right of every paragraph while the headings and their
   chapter rules spanned the full width: the block read as ragged and half-finished, and the owner
   called it twice. OWNER DECISION 11.08.2026: fill the column.

   The cost is real and is accepted, not overlooked. 992px is about 105 characters per line, past the
   70-to-75 ceiling an earlier review recommended, and a long line is harder to track back to the
   start of the next one. --et-leading-prose buys that back where it is spent: 1.75 instead of the
   body's 1.6, which is the standard compensation for a wide measure. The container itself is still
   capped at 64rem, so the line cannot grow without bound on an ultra-wide display.

   --et-measure-text survives for the lead dek alone, the one surface where nothing in the band is
   wider than the capped text. FAQ answers do NOT keep it: the question heading and the item rule
   above them span the full width, so a capped answer reads as truncated against its own block. */
.et-prose :is(p, ul, ol, dl, blockquote) {
  line-height: var(--et-leading-prose);
}

/* The dek under the h1 keeps a measure: it is one or two sentences at --et-text-lg, and a lead set
   to the full column reads as body copy rather than as an opening line. */
:is(p, ul, ol, dl, blockquote).et-prose {
  max-width: var(--et-measure-text);
}

/* ---------- category hub ---------- */

/* The editorial intro used to be one undifferentiated block. category.php now splits its opening
   sentence into a lead line ahead of the rest, the same lead/body pairing a tool page already gives
   its own dek (`.et-lead` on tool-page.php); no wording changed, the identical string just renders
   across two <p> elements. This rule only tightens the spacing between the two. */
.et-hub-intro .et-lead { margin-bottom: var(--et-space-3); }

/* N16: How much is in this hub, signalled before the visitor reads a single card title: a hub with o.... Full note: docs/stylesheet-notes.md */

/* ---------- legal / long-form content pages ---------- */

/* The Impressum contact plate: an image of the e-mail address rather than text (owner directive
   11.08.2026). It sits on the text baseline and never grows past the measure; the intrinsic size is
   in the markup, so it reserves its box and costs no layout shift. */
.et-contact-plate { display: inline-block; vertical-align: middle; max-width: 100%; height: auto; }

/* N17: A short jump-list right under the h1: the visitor sees the shape of the page before committin.... Full note: docs/stylesheet-notes.md */
.et-toc {
  margin: var(--et-space-5) 0 var(--et-space-6);
  padding: var(--et-space-3) 0;
  border-top: 1px solid var(--et-color-rule);
  border-bottom: 1px solid var(--et-color-rule);
}
.et-toc__label {
  display: block;
  font-size: var(--et-text-xs);
  font-weight: 700;
  letter-spacing: var(--et-tracking-caps);
  text-transform: uppercase;
  color: var(--et-color-text-muted);
  margin: 0 0 var(--et-space-2);
}
/* The year-variant nav under a tool's h1 is the same object as the jump list: a short wrapping row
   of links with no bullets, so it shares the rule instead of restating it. It renders only once a
   registry period publishes a coming year, which is why it shipped unstyled and unnoticed. */
.et-toc ul,
.et-year-variants__list { display: flex; flex-wrap: wrap; gap: var(--et-space-1) var(--et-space-5); list-style: none; margin: 0; padding: 0; }
.et-toc li,
.et-year-variants__list li { margin: 0; }
.et-toc a { font-weight: 600; }
.et-year-variants { display: grid; gap: var(--et-space-2); margin: var(--et-space-5) 0 0; }

/* A heading the jump-list scrolls to lands with a little breathing room instead of flush against
   the viewport edge. */
.et-prose :is(h2, h3)[id] { scroll-margin-top: var(--et-space-4); }

@media (min-width: 48rem) {
  .et-toc ul { gap: var(--et-space-2) var(--et-space-6); }
}

/* ---------- Calculator page composition ---------- */

/* N18: Calculator page composition (www/templates/tool-page.php). Full note: docs/stylesheet-notes.md */

/* ---------- 1. prose measure: owned entirely by the rule further up ---------- */

/* `.et-prose { max-width: var(--et-measure) }` was here and is gone: it capped the CONTAINER, so
   at 1280px the column stopped at ~604px of ~992px and read as half-cut, the exact failure the
   "continuous prose measure" block above rejects. Both shipped, each asserting the opposite.
   --et-measure-text on running text owns the measure now, and the --et-measure token went with the
   rule, since no rule referenced it any more. (D8) */

/* ---------- 2. section rhythm ---------- */

/* Comfortable landing spot for the #method jump target below, independent of whether a future
   header ever becomes sticky. */
#method { scroll-margin-top: var(--et-space-4); }

/* N19: Evenly weighted chapter marks down the page: one hairline rule per top-level section, so scan.... Full note: docs/stylesheet-notes.md */
.et-prose > section > h2,
#faq > h2,
#related > h2,
#sources > h2 {
  padding-top: var(--et-space-5);
  border-top: 3px solid var(--et-color-rule);
}

/* N20: Inside "So wird gerechnet" specifically: nine H3 subsections used to sit at near-identical we.... Full note: docs/stylesheet-notes.md */
.et-prose h3 {
  padding-top: var(--et-space-3);
  border-top: 1px solid var(--et-color-border);
}
.et-prose h3:first-of-type {
  padding-top: 0;
  border-top: 0;
}

/* ---------- 3. result-to-explanation link ---------- */

/* A plain link, not a third button next to Kopieren/Drucken: this is content navigation ("show me
   the method"), not a page action, so it is set apart by kind, not just by position. Sized to the
   same 44px row as the buttons beside it so the action row keeps one shared alignment. */
.et-result-jump {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  color: var(--et-color-accent);
  font-weight: 600;
  font-size: var(--et-text-sm);
  text-decoration: underline;
  text-underline-offset: 0.15em;
}
.et-result-jump:hover { text-decoration-thickness: 0.12em; }
.et-result-jump__arrow { display: inline-block; margin-left: var(--et-space-1); text-decoration: none; }

/* ---------- 4. category hue on the result figure ---------- */

/* N21: The result figure is the product's signature (see .et-result__primary in main.css); tying it.... Full note: docs/stylesheet-notes.md */
/* DELIBERATELY NOT category-hued. Colour on a number reads as a verdict: tying the result figure to
   its category tinted a perfectly normal BMI crimson, which says "bad" about a value that is fine.
   The hue belongs on chrome (mark, label, nav, breadcrumb), never on the answer itself. */
[data-cat] .et-result__primary { color: var(--et-color-accent); }
