/* KUKANILEA Webtools — Hintergrund entfernen. Eigenständige Subdomain, eigenes Mini-Design-System
   (Brand-Werte aus sites/kukanilea-www/styles.css :root übernommen, nicht importiert —
   volle Unabhängigkeit der Subdomain). */

:root {
  --cream: #ffffff;
  --ink: #0f172a;
  --ink-2: #1e293b;
  --ink-3: #475569;
  --ink-4: #5a6678;
  --line: #e6ebf1;
  --line-2: #cbd5e1;
  --white: #ffffff;
  --paper: #f4f6f9;
  /* Der Arbeitsgrund des Editors -- bewusst dunkel und neutral, damit
     helle UND dunkle Motive darauf als Objekt lesbar bleiben. Kein
     reines Schwarz: dunkle Motive wuerden darin verschwinden, und die
     Kante zum hellen Bedienfeld daneben waere zu hart. */
  --arbeitsgrund: #232b36;
  --blue: #1B4965;
  --blue-2: #123449;
  --blue-soft: #d7e3ea;
  --blue-tint: #eef3f6;
  --green: #18553a;
  --green-soft: #e4f1e9;
  --green-border: #bfe0cd;
  --warn-ink: #97491a;
  --warn-soft: #fde9d4;

  --radius: 14px;
  --radius-lg: 20px;
  --radius-sm: 8px;
  --shadow-sm: 0 1px 0 rgba(15,23,42,.04), 0 1px 2px rgba(15,23,42,.05);
  --shadow: 0 1px 0 rgba(15,23,42,.04), 0 12px 28px -16px rgba(15,23,42,.16);

  --font-sans: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  --font-mono: "SFMono-Regular", "SF Mono", "IBM Plex Mono", monospace;
  --maxw: 880px;
}

*, *::before, *::after { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
html { scroll-behavior: smooth; }
/* `hidden` heißt "nicht darstellen". Das ist keine Empfehlung, und deshalb
   steht hier `!important`.

   Vorher stand hier erhöhte Spezifität statt `!important`, mit der Begründung,
   `html body [hidden]` schlage jede Klassenregel. Das stimmt nicht: der
   Selektor wiegt (0,1,2) und verliert gegen jede Zwei-Klassen-Regel mit
   `display` — und gegen jeden ID-Selektor sowieso.

   Am 2026-09-19 gemessen, indem jedem Element im Dokument testweise `hidden`
   gegeben und das berechnete `display` gelesen wurde. Sieben Elemente blieben
   sichtbar:

       .he-feature strong, .he-feature > span:last-child { display:block }   (0,2,1)
       #motivCanvas { display:block }                                        (1,0,0)

   Die sechs Spans sind heute harmlos — sie bekommen nie `hidden`. Der Canvas
   ist es nicht: er ist genau das Element, dessen Sichtbarkeit den Unterschied
   zwischen Start- und Editorzustand trägt. Eine Invariante, die von der
   nächsten ID-Regel gekippt wird, ist keine. */
html body [hidden] { display: none !important; }

body {
  background: var(--paper);
  color: var(--ink);
  font-family: var(--font-sans);
  font-size: 16px;
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
}

.container { max-width: var(--maxw); margin: 0 auto; padding: 0 20px; }
.wide { max-width: 1080px; }

a { color: var(--blue); }

/* ── Header ── */
.site-header {
  background: var(--white);
  border-bottom: 1px solid var(--line);
  position: sticky;
  top: 0;
  z-index: 40;
}
.header-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 20px;
  padding: 14px 20px;
}
.brand { display: flex; align-items: center; gap: 10px; text-decoration: none; color: var(--ink); }
.brand-mark { display: block; }
.brand-text { display: flex; flex-direction: column; line-height: 1.15; }
.brand-name { font-weight: 700; font-size: 15px; letter-spacing: .01em; }
.brand-sub { font-size: 11px; color: var(--ink-4); font-weight: 600; text-transform: uppercase; letter-spacing: .06em; }
.brand-sub.tool-suite { color: var(--blue); }

.site-nav { display: flex; flex-wrap: wrap; gap: 4px 18px; }
.site-nav a { color: var(--ink-3); font-size: 14px; font-weight: 600; text-decoration: none; }
.site-nav a:hover, .site-nav a[aria-current] { color: var(--blue); }

.header-actions a.text-link { font-size: 14px; font-weight: 600; text-decoration: none; }

@media (max-width: 720px) {
  .header-row { flex-wrap: wrap; }
  .site-nav { order: 3; width: 100%; padding-top: 8px; border-top: 1px solid var(--line); }
}

/* ── Hero / intro ── */
.tool-hero { padding: 44px 0 8px; }
.tool-kicker {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .06em;
  color: var(--blue); margin-bottom: 10px;
}
.tool-hero h1 { font-size: clamp(28px, 4vw, 38px); line-height: 1.15; margin: 0 0 12px; letter-spacing: -0.01em; }
.tool-hero p.lede { font-size: 17px; color: var(--ink-3); max-width: 60ch; margin: 0 0 0; }

/* Der Produktname sagt die Aufgabe, dieser Satz sagt die Grenze der Engine.
   Er steht bewusst im Hero und nicht im Kleingedruckten: wer ein Produktfoto
   freistellen will, soll es vor dem Hochladen erfahren, nicht danach. */
.tool-hero p.capability-note {
  font-size: 15px; color: var(--ink-3); max-width: 60ch;
  margin: 10px 0 0; padding: 10px 14px;
  border-left: 3px solid var(--blue-soft);
  background: var(--blue-tint); border-radius: 0 8px 8px 0;
}
.tool-hero p.capability-note strong { color: var(--ink-2); }

.privacy-note {
  display: flex; align-items: flex-start; gap: 10px;
  margin: 22px 0 0;
  padding: 14px 16px;
  background: var(--blue-tint);
  border: 1px solid var(--blue-soft);
  border-radius: var(--radius);
  font-size: 14px; color: var(--blue-2);
}
.privacy-note svg { flex: none; margin-top: 2px; }

/* ── Tool card / workspace ── */
.tool-card {
  background: var(--white);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow);
  padding: 28px;
  margin: 28px 0 40px;
}

.dropzone {
  border: 2px dashed var(--line-2);
  border-radius: var(--radius);
  padding: 40px 20px;
  text-align: center;
  cursor: pointer;
  background: var(--paper);
  transition: border-color .15s ease, background .15s ease;
}
.dropzone:hover, .dropzone.is-dragover { border-color: var(--blue); background: var(--blue-tint); }
.dropzone svg { color: var(--ink-4); margin-bottom: 10px; }
.dropzone .dz-title { font-weight: 700; font-size: 15px; color: var(--ink-2); }
.dropzone .dz-sub { font-size: 13px; color: var(--ink-4); margin-top: 4px; }
.dropzone input[type="file"] { display: none; }

.file-list { list-style: none; margin: 18px 0 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.file-list li {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 12px;
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  font-size: 14px;
}
.file-list .file-name { flex: 1 1 auto; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; }
.file-list .file-size { color: var(--ink-4); font-size: 12px; font-variant-numeric: tabular-nums; }
.file-list .file-remove {
  border: 0; background: none; color: var(--ink-4); cursor: pointer; font-size: 16px; line-height: 1; padding: 4px;
}
.file-list .file-remove:hover { color: var(--warn-ink); }
.file-list li[draggable="true"] { cursor: grab; }

.tool-actions { display: flex; align-items: center; gap: 14px; margin-top: 20px; flex-wrap: wrap; }

.btn {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 11px 20px;
  border-radius: 999px;
  font-size: 14px; font-weight: 700;
  border: 1px solid transparent;
  cursor: pointer;
  text-decoration: none;
}
.btn-primary { background: var(--blue); color: var(--white); }
.btn-primary:hover:not(:disabled) { background: var(--blue-2); }
.btn-primary:disabled { background: var(--line-2); color: var(--ink-4); cursor: not-allowed; }
.btn-ghost { background: var(--white); color: var(--ink-2); border-color: var(--line-2); }
.btn-ghost:hover { border-color: var(--blue); color: var(--blue); }

.tool-status { font-size: 14px; color: var(--ink-3); }
.tool-status[data-state="error"] { color: var(--warn-ink); }
.tool-status[data-state="done"] { color: var(--green); font-weight: 600; }
/* "Bitte pruefen" ist kein Fehler: es liegt ein Ergebnis vor, und der Weg
   geht weiter. Deshalb die ruhige Textfarbe statt der Warnfarbe -- sonst
   sieht der haeufigste Ausgang aus wie ein Abbruch, und die Warnfarbe
   verliert ihre Bedeutung fuer die Faelle, in denen wirklich etwas
   schiefging.

   Die Regel haengt an `data-urteil`, nicht an `data-state`: letzteres ist
   das Maschinensignal "Verarbeitung beendet", auf das siebzehn
   Messskripte warten. Ein Maschinensignal fuer eine Textfarbe zu brechen
   waere der falsche Tausch. */
.tool-status[data-urteil="UNCERTAIN"] { color: #425365; font-weight: 500; }
/* Kein Motiv ist weder Erfolg noch Fehler. Gruen waere eine Zusage, die
   nicht gilt; warnrot wuerde dem Menschen einen Fehler anlasten, den es
   nicht gibt. Neutral und ruhig ist die ehrliche Farbe. */
.tool-status[data-state="no-subject"] { color: var(--ink-2, inherit); }

.result-panel {
  margin-top: 20px;
  padding: 18px;
  background: var(--green-soft);
  border: 1px solid var(--green-border);
  border-radius: var(--radius);
  display: none;
}
.result-panel.is-visible { display: block; }
.result-panel h3 { margin: 0 0 6px; font-size: 15px; color: var(--green); }

.result-textarea {
  width: 100%;
  margin-top: 10px;
  padding: 12px;
  font: 13px/1.5 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  color: var(--ink);
  background: #fff;
  border: 1px solid var(--green-border);
  border-radius: var(--radius);
  resize: vertical;
}

.page-select-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(64px, 1fr));
  gap: 10px;
  margin: 18px 0 0;
}
.page-thumb {
  position: relative;
  border: 2px solid var(--line);
  border-radius: var(--radius-sm);
  padding: 4px;
  cursor: pointer;
  background: var(--white);
  text-align: center;
  font-size: 11px;
  color: var(--ink-4);
}
.page-thumb.is-selected { border-color: var(--blue); background: var(--blue-tint); color: var(--blue); font-weight: 700; }
.page-thumb canvas { display: block; width: 100%; height: auto; border-radius: 4px; margin-bottom: 4px; }

/* ── Landing: tool grid ── */
.tool-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 18px;
  margin: 28px 0 48px;
}
.tool-tile {
  display: block;
  background: var(--white);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  padding: 22px;
  text-decoration: none;
  color: var(--ink);
  box-shadow: var(--shadow-sm);
  transition: transform .15s ease, box-shadow .15s ease, border-color .15s ease;
}
.tool-tile:hover { transform: translateY(-2px); box-shadow: var(--shadow); border-color: var(--blue-soft); }
.tool-tile .tt-icon { color: var(--blue); margin-bottom: 12px; }
.tool-tile h2 { font-size: 16px; margin: 0 0 6px; }
.tool-tile p { font-size: 13.5px; color: var(--ink-3); margin: 0; }

/* ── Footer ── */
.site-footer {
  border-top: 1px solid var(--line);
  padding: 32px 0 40px;
  margin-top: 40px;
}
.ft-row {
  display: flex; flex-wrap: wrap; gap: 10px 24px;
  align-items: center; justify-content: space-between;
  font-size: 13px; color: var(--ink-4);
}
.ft-links { display: flex; flex-wrap: wrap; gap: 6px 18px; }
.ft-links a { color: var(--ink-4); text-decoration: none; }
.ft-links a:hover { color: var(--blue); }

/* ── Bild-Tool-spezifisch: Regler, Zahlenfelder, Vorschau ── */
.field-row { display: flex; flex-wrap: wrap; align-items: center; gap: 14px 24px; margin-top: 18px; }
.field-row label { font-size: 14px; font-weight: 600; color: var(--ink-2); display: flex; align-items: center; gap: 10px; }
.field-row input[type="number"] {
  width: 88px; padding: 8px 10px; border: 1px solid var(--line-2); border-radius: var(--radius-sm);
  font-size: 14px; font-family: var(--font-sans); color: var(--ink);
}
.field-row input[type="range"] { width: 200px; accent-color: var(--blue); }
.field-row .field-value { font-variant-numeric: tabular-nums; color: var(--ink-3); font-size: 13px; min-width: 3.5ch; }
.field-row .field-sep { color: var(--ink-4); }

.result-preview { display: flex; flex-wrap: wrap; gap: 16px; margin-top: 14px; }
.result-preview figure { margin: 0; text-align: center; }
.result-preview img { max-width: 160px; max-height: 160px; border-radius: var(--radius-sm); border: 1px solid var(--line); display: block; }
.result-preview figcaption { font-size: 12px; color: var(--ink-4); margin-top: 6px; }

.result-list { list-style: none; margin: 14px 0 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.result-list li { display: flex; justify-content: space-between; gap: 12px; font-size: 13px; color: var(--ink-3); }
.result-list a { font-weight: 600; }

/* ── Vorlagen (Dimension 8: Werkzeug-Ertrag) — Muster kukanilea-brief/-post ── */
.preset-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 10px; margin-top: 18px; }
.preset-label { font-size: 12px; font-weight: 700; color: var(--ink-4); text-transform: uppercase; letter-spacing: .04em; }
.chip {
  padding: 7px 14px;
  border-radius: 999px;
  border: 1px solid var(--line-2);
  background: var(--white);
  color: var(--ink-2);
  font-size: 13px; font-weight: 600;
  cursor: pointer;
}
.chip:hover { border-color: var(--blue); color: var(--blue); }


/* ═══ Ablage und Editor ═══════════════════════════════════════════════════
   Die Startflaeche bleibt schmal, der Editor besteht aus Bild plus einer
   Leiste. Kein dauerhafter Werkzeugbaum links, kein Inspector rechts: der
   Vertrag lautet "Bild rein, Hintergrund weg", und alles, was staendig
   danebensteht, behauptet etwas anderes.

   Die Faehigkeiten sind dadurch nicht kleiner geworden, sondern unsichtbar --
   Bereinigung, Kantenbehandlung und Lichtsaumkorrektur laufen mit Vorgaben
   mit. */

kbd {
  font: inherit; font-size: 12px; padding: 2px 6px; border-radius: 5px;
  border: 1px solid var(--line-2); background: var(--paper); color: var(--ink-2);
}
.btn-klein { padding: 10px 14px; font-size: 14px; min-height: 44px; }

/* ── Vorarbeit: welches Motiv ist gemeint? ──────────────────────────
   Bewusst ruhig und ohne Werkzeugleiste. Hier gibt es genau eine
   Aufgabe, und alles, was daneben stuende, wuerde davon ablenken. */
.vorarbeit {
  display: flex; flex-direction: column; gap: 12px;
  padding: 12px 16px 24px; min-height: 60vh;
}
.vorarbeit[hidden] { display: none; }
.vorarbeit-kopf {
  display: flex; align-items: flex-start; gap: 12px; flex-wrap: wrap;
}
.vorarbeit-titelgruppe { flex: 1 1 auto; text-align: center; }
.vorarbeit-frage {
  margin: 0; font-size: 1.15rem; font-weight: 600;
}
.vorarbeit-hinweis {
  margin: 4px 0 0; color: var(--ink-2, #5a6472);
  font-size: .95rem; min-height: 1.4em;
}
/* Den Zustand "zuklein" gibt es beim Marker nicht mehr. Beim Umkreisen
   war ein winziges Polygon fast sicher ein Verrutschen; ein kurzer
   Strich ist dagegen genau die Bedienart, die ohne Ziehen auskommt. */
.vorarbeit-buehne {
  flex: 1 1 auto; display: flex; align-items: center; justify-content: center;
  min-height: 0; background: var(--flaeche-2, #f4f6f9);
  border-radius: 12px; padding: 8px; overflow: hidden;
}
#vorarbeitCanvas {
  display: block; max-width: 100%; max-height: 100%;
  border-radius: 6px;
  /* Der Zeiger gehoert der Geste, nicht dem Scrollen. Ohne `touch-action`
     nimmt der Browser den ersten Zug als Wisch und die Linie beginnt
     mitten im Bild. */
  touch-action: none;
  cursor: crosshair;
}
.vorarbeit-fuss {
  display: flex; align-items: center; justify-content: center; gap: 12px;
  flex-wrap: wrap;
}
/* DIE ZIELGROESSE HING AN EINER BREITENABFRAGE, UND DAS WAR FALSCH.

   `min-height: 44px` stand nur unter `max-width: 560px`. Am 2026-09-21
   gemessen: „Freistellen" war 39 px hoch, sobald das Fenster breiter
   war -- und das trifft genau das Geraet, das der Qualitaetsvertrag als
   Beispiel nennt, das iPad im Querformat: grober Zeiger, 1024 Pixel
   breit, also keine Telefonregel.

   Die 44 Pixel gelten deshalb jetzt unbedingt. Ein groesserer
   Hauptknopf schadet auf keinem Geraet; die Frage war nie, ob er auf
   dem Desktop kleiner sein DARF, sondern warum er es sollte.

   UND DIE ZAHL IST UNSERE, NICHT DIE DER NORM. WCAG 2.2 AA verlangt in
   SC 2.5.8 mindestens 24x24 CSS-Pixel oder entsprechende Abstaende; die
   44 stehen in SC 2.5.5 und gehoeren zur AAA-Stufe. 39 px waren also
   normkonform und trotzdem zu klein -- KUKANILEA fordert hier bewusst
   mehr als das Pflichtmass. */
.vorarbeit-fuss > .btn { min-height: 44px; }
/* Der Weg ohne Ziehen braucht keinen eigenen Knopf mehr: ein Tipp IST
   ein Strich mit einem Punkt. Der Satz daneben sagt es, damit niemand
   es ausprobieren muss. */
.vorarbeit-tipp {
  margin: 0; color: var(--ink-2, #5a6472); font-size: .9rem;
}
@media (max-width: 560px) {
  .vorarbeit { padding: 8px 10px 0; }
  .vorarbeit-frage { font-size: 1.05rem; }
  .vorarbeit-titelgruppe { order: -1; flex-basis: 100%; }
  /* Der Fuss bleibt erreichbar, ohne den Bildbereich zu verkleinern.
     Eine Seitenleiste waere auf dem Telefon genau die falsche
     Bauform -- sie nimmt Breite, und Breite ist hier das Knappe. */
  .vorarbeit-fuss {
    position: sticky; bottom: 0; z-index: 2;
    padding: 10px 0 14px; margin-top: 8px;
    background: linear-gradient(to bottom,
      rgba(246,248,251,0) 0%, var(--flaeche, #f6f8fb) 28%);
  }
  .vorarbeit-fuss > .btn { flex: 1 1 45%; }
}

/* Der Skip-Link gehoert seit V17 der Shell (sync_webtool_shell.py) --
   sie blendet ihn nach oben aus und holt ihn bei Fokus herein. Die
   fruehere eigene Regel hier (`left: -9999px`) war danach eine zweite
   Wahrheit fuer dasselbe Element und ist entfernt. */

/* ── ARBEITSMODUS ─────────────────────────────────────────────────────
   Ab dem ersten Bild gehoert der Viewport der Aufgabe.

   Vorher war der Editor ein Abschnitt in einer Landingpage: Markenleiste
   und Werkzeugleiste uebereinander, darunter lief der Erklaertext weiter,
   und das Bedienfeld schwebte als Karte rechts in einer grossen leeren
   Flaeche. Am realen Screenshot bei 1440x900 gemessen: das Bild stand auf
   58 % der Hoehe klein in der Mitte, rechts daneben mehrere hundert Pixel
   tote Flaeche.

   Die Ursache war nicht die Karte -- sie war, dass niemand die Hoehe
   besass. Deshalb aendert sich hier die EIGENTUEMERSCHAFT und nicht die
   Optik: Kopf und Arbeitsflaeche fuellen zusammen den Viewport, die
   Buehne nimmt, was uebrig ist, der Inspector docket daran an.

   `100dvh` statt `100vh`: auf dem Telefon waere die Arbeitsflaeche sonst
   genau um die ein- und ausfahrende Adressleiste zu hoch. */
[data-he-modus="arbeit"], [data-he-modus="arbeit"] body {
  height: 100%; overflow: hidden;
}
[data-he-modus="arbeit"] body { display: flex; flex-direction: column; }
/* Kopfleiste, Fuss und Erklaerabschnitte gehoeren zum Erklaermodus. Sie
   werden nicht verkleinert, sondern treten ab -- ein halber
   Marketingabschnitt unter einer Arbeitsflaeche ist schlechter als
   keiner. Die `#start`-Sektion ist ohnehin schon `hidden`. */
[data-he-modus="arbeit"] .site-header,
[data-he-modus="arbeit"] .site-footer,
[data-he-modus="arbeit"] .kuk-legal-bar { display: none; }
/* Der Statussatz behaelt seine Hoehe. Ohne das schrumpft er als
   Flex-Kind der Arbeitsflaeche und wird mitten im Wort abgeschnitten --
   am 2026-09-22 im ersten Anlauf genau so gemessen. */
[data-he-modus="arbeit"] .editor-kopf,
[data-he-modus="arbeit"] .editor-status { flex: none; }
/* Die Zeilenlaenge war fuer einen Textblock in einer scrollenden Seite
   gedacht. Als Leiste ueber einer Arbeitsflaeche erzeugt `78ch` einen
   weissen Kasten, der mitten im Nichts endet -- der Satz sieht dann
   abgeschnitten aus, obwohl er vollstaendig da ist. */
[data-he-modus="arbeit"] .editor-status .tool-status { max-width: none; }
[data-he-modus="arbeit"] #main {
  flex: 1; min-height: 0; display: flex; flex-direction: column;
}
/* IM ARBEITSMODUS IST DER EDITOR DAS EINZIGE KIND VON `#main`.
   Nicht nach Klassennamen ausgeblendet, sondern nach Stellung: neben
   `#start` und `#vorarbeit` liegen dort noch zwei `.container`-Abschnitte
   und der Seitenfuss. Genau die haben den Umbau zuerst zum Scheitern
   gebracht -- `.editor` hatte `flex-grow: 1` und trotzdem Hoehe 0, weil
   die Geschwister die 900 px bereits verbraucht hatten. Eine Liste von
   Klassennamen waere beim naechsten neuen Abschnitt still wieder falsch;
   diese Regel ist es nie. */
[data-he-modus="arbeit"] #main > :not(#editor):not(#vorarbeit):not(#arbeit) { display: none; }
/* Die Stufenanzeige zwischen "Freistellen" und Ergebnis. Sie zieht dafuer
   aus dem Hero nach `#main` um -- sonst stuende sie in einem versteckten
   Elternteil, und die Seite waere waehrend der Verarbeitung leer. Mittig,
   weil sie in diesem Moment das Einzige ist, was es zu sehen gibt. */
[data-he-modus="arbeit"] #main > #arbeit {
  margin: auto; width: min(560px, calc(100% - 32px));
}
[data-he-modus="arbeit"] #main > #arbeit[hidden] { display: none; }

/* Die Vorarbeit ist die zweite Arbeitsflaeche, nicht ein Vorspann.
   Sie bekommt dieselbe Hoehenkette -- `min-height: 0` an jedem Glied,
   sonst setzt die Flexbox-Mindestgroesse die Inhaltshoehe durch und die
   Kette bricht still.

   `min-height: 60vh` faellt dabei weg: das war eine Schaetzung des
   verfuegbaren Raums fuer eine scrollende Seite. Hier kennt die Flaeche
   ihre Hoehe. */
[data-he-modus="arbeit"] .vorarbeit {
  flex: 1; min-height: 0; padding-bottom: 12px;
}
[data-he-modus="arbeit"] .vorarbeit-kopf,
[data-he-modus="arbeit"] .vorarbeit-fuss { flex: none; }
[data-he-modus="arbeit"] .vorarbeit-buehne { min-height: 0; }
[data-he-modus="arbeit"] .vorarbeit-recht { flex: none; }
/* Im Erklaermodus traegt der Seitenfuss den Rechtsweg. Zwei Paare
   Impressum-Links auf einer Seite sind keine Redundanz, sondern die
   Frage, welches gilt. */
.vorarbeit-recht {
  display: none; justify-content: center; gap: 16px;
  font-size: 12.5px; padding-top: 2px;
}
[data-he-modus="arbeit"] .vorarbeit-recht { display: flex; }
.vorarbeit-recht a { color: var(--ink-2, #5a6472); text-decoration: none; }
.vorarbeit-recht a:hover { text-decoration: underline; }

.editor { display: flex; flex-direction: column; padding-bottom: 76px; }
/* KEIN `padding-bottom: 0` HIER.
   Unterhalb von 960 px liegt die Werkzeugleiste als `position: fixed`
   am unteren Rand -- die Arbeitsflaeche weiss nichts von ihr. Der erste
   Anlauf hat den Abstand global entfernt, und prompt endete das Bild auf
   dem Telefon bei 744, waehrend die Leiste bei 733 beginnt.
   Die Hoehe wird gemessen, nicht geraten: `--leiste-h` pflegt
   `hintergrund-entfernen.js` per ResizeObserver, weil fuenf Knoepfe bei
   412 px Breite in zwei Zeilen umbrechen und die Leiste dann 111 px hoch
   ist. Ab 960 px ist sie ausgeblendet, und der 960er-Block setzt den
   Abstand dort ohnehin auf 0. */
[data-he-modus="arbeit"] .editor {
  flex: 1; min-height: 0;
  padding-bottom: calc(var(--leiste-h, 76px) + 8px);
}

/* ── Desktop: Bild links, Einstellungen rechts ────────────────────────────
   Der frueher hier stehende Vertrag lautete "eine Leiste unten, sonst Bild,
   kein Inspector rechts". Er galt fuer ein Werkzeug mit einem Knopf. Mit
   Korrektur, Hintergruenden, Text, mehreren Grafiken und Format ist das
   Gegenteil richtig: wer eine Kante korrigiert, will Kante UND Regler sehen,
   ohne vorher etwas aufzuklappen.
   Auf dem Telefon bleibt es beim Blatt -- dort ist neben dem Bild kein
   Platz, und das ist keine Geschmacksfrage. */
@media (min-width: 960px) {
  /* KEIN `gap`, KEIN `padding-right`, KEIN `align-items: start`.
     Alle drei zusammen erzeugten die schwebende Insel: der Abstand
     trennte den Inspector von der Buehne, der Innenabstand schob ihn vom
     Fensterrand weg, und `start` liess ihn auf seiner Inhaltshoehe
     stehen statt mitzuwachsen. Er docket jetzt an -- eine Trennlinie
     statt einer Luecke.
     Die Spalte ist 320 px und waechst bis 340: das ist der Bereich, in
     dem Desktop-Inspektoren ueblicherweise liegen, und er traegt die
     laengste Beschriftung dieses Panels ohne Umbruch. */
  .editor-arbeit {
    display: grid; grid-template-columns: minmax(0, 1fr) minmax(320px, 340px);
    align-items: stretch;
  }
  /* Ab hier traegt das Raster; darunter ist die Arbeitsflaeche ein
     einspaltiger Flexcontainer (siehe oben). `display: grid` muss den
     dortigen `display: flex` deshalb ausdruecklich zuruecknehmen. */
  [data-he-modus="arbeit"] .editor-arbeit { display: grid; }
  /* Hier ist die Leiste ausgeblendet, also braucht niemand Platz fuer
     sie. Die Regel muss dieselbe Spezifitaet tragen wie die
     Arbeitsmodus-Regel oben -- `.editor { padding-bottom: 0 }` allein
     verliert gegen sie, und das kostete auf dem Desktop 84 px Bildhoehe
     (477x720 fiel auf 421x636). */
  [data-he-modus="arbeit"] .editor { padding-bottom: 0; }
  @media (min-width: 1280px) {
    .editor-arbeit { grid-template-columns: minmax(0, 1fr) 340px; }
  }
  /* Der Inspector gehoert zur Anwendung, nicht ueber sie: eine
     Trennlinie, kein Schlagschatten, kein abgerundeter Kartenrand.

     EIN MEDIA QUERY ERHOEHT KEINE SPEZIFITAET.
     Zwanzig Zeilen weiter unten steht `.blatt { position: static; width:
     auto }` -- die Regel, die den Inspector auf dem Desktop andocken
     SOLLTE. Sie hat nie gewirkt: die Grundregel `.blatt { position:
     fixed; width: min(360px, ...) }` steht spaeter in der Datei, hat
     dieselbe Spezifitaet und gewinnt deshalb.
     Gemessen am 2026-09-22: Spalte `1100px 340px`, und darin ein
     `position: fixed`-Element von 360 px Breite. Das war die schwebende
     Karte -- nicht eine Gestaltungsentscheidung, sondern eine Regel, die
     seit ihrem ersten Tag stumm verloren hat.
     Diese Regel hier hat eine Klasse mehr und gewinnt unabhaengig von
     der Reihenfolge. */
  [data-he-modus="arbeit"] .blatt {
    position: static; width: auto; pointer-events: auto;
    border-left: 1px solid var(--line); background: var(--white);
    min-height: 0; overflow: hidden; display: flex;
  }
  [data-he-modus="arbeit"] .blatt-inner {
    flex: 1; min-height: 0; overflow-y: auto;
    border: 0; border-radius: 0; box-shadow: none;
  }
  /* Die Leiste unten entfaellt: zwei Wege zur selben Wahl nebeneinander sind
     keine Redundanz, sondern eine Frage ("welcher gilt?"). Die Tabs stehen
     dort, wo ihre Wirkung sichtbar wird. */
  .editor .leiste { display: none; }
  .editor { padding-bottom: 0; }
  .blatt { position: static; width: auto; pointer-events: auto; }
  .blatt-inner { max-height: none; }
  .blatt-zu { display: none; }        /* nichts zu schliessen */
  .buehne { padding-right: 0; }
}
.editor-kopf {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 18px; border-bottom: 1px solid var(--line); background: var(--white);
}
.editor-marke {
  font-weight: 700; font-size: 12px; letter-spacing: .12em;
  color: var(--ink-4); white-space: nowrap;
}
/* Auf schmalen Fenstern zaehlt jeder Pixel der Kopfzeile fuer die
   Knoepfe -- die Marke steht dann in der Startansicht. */
@media (max-width: 720px) { .editor-marke { display: none; } }
.editor-titel { font-weight: 700; color: var(--ink-2); flex: 1; text-align: center; }
.editor-kopf-rechts { display: flex; gap: 8px; }

/* Das Urteil steht zwischen Kopf und Buehne -- also zwischen dem, was der
   Mensch angestossen hat, und dem, was dabei herauskam.

   Leer nimmt es keinen Platz: `:empty` faellt ganz weg, damit der ruhige
   Fall (CONFIDENT nach dem Lesen, oder ein zurueckgesetzter Zustand) keine
   leere Leiste ueber dem Bild stehen laesst und die Buehne nicht springt.

   Kein `position: sticky` und keine Animation: der Satz ist eine Auskunft,
   kein Alarm. Wer ihn gelesen hat, soll ihn wegscrollen koennen.

   Die Regeln haengen am Textelement, nicht am Container: der Container
   traegt nach dem Umzug immer das `<p>` und waere nie `:empty`. Das `<p>`
   dagegen ist es genau dann, wenn `melde("")` es geleert hat.

   EIN KOMMENTAR, DER ZWEIMAL SCHLIESST, VERWIRFT DIE REGEL DAHINTER.
   Hier stand mitten im Absatz ein zweites Kommentarende. Alles danach bis
   zur naechsten geschweiften Klammer las der Parser als Selektor -- und
   weil ein Selektor diese Zeichenfolge nicht enthalten darf, fiel die
   GANZE folgende Regel weg. Am 2026-09-22 live gemessen: padding 0px,
   kein Rahmen, kein Hintergrund, max-width none. Der Statussatz klebte am
   linken Fensterrand. Rot wurde davon nichts.

   Und die Falle schnappt beim Erklaeren sofort wieder zu: der erste
   Versuch dieses Absatzes ZITIERTE die Zeichenfolge -- und schloss damit
   denselben Kommentar an derselben Stelle. Sie wird hier deshalb benannt
   und nicht geschrieben. Waechter: check_css_kommentare.py */
.editor-status .tool-status {
  margin: 0;
  max-width: 78ch;
  padding: 10px 18px;
  border-bottom: 1px solid var(--line);
  background: var(--white);
}
.editor-status .tool-status:empty { display: none; }

.buehne {
  display: flex; flex-direction: column; min-width: 0;
  padding: 20px 18px 10px; background: var(--paper);
}
.buehne-inner {
  flex: 1; display: flex; align-items: center; justify-content: center; min-height: 0;
}

/* ── Nur das Ergebnis ─────────────────────────────────────────────────
   Hier stand die Vorher/Nachher-Apparatur: zwei deckungsgleiche
   Leinwaende, eine Trennlinie, zwei Marken, ein Schieberegler und ein
   Umschalter darunter. Sie war technisch schoen -- beim Ziehen wanderte
   nur ein `clip-path`, nichts wurde neu gerechnet.

   Sie beantwortete nur die falsche Frage. Wer ein Bild freistellt, will
   das Ergebnis sehen, nicht zur Haelfte das, was er loswerden wollte.
   Das Original ist nicht verloren: "Rueckgaengig" fuehrt dorthin
   zurueck, und die Datei liegt ohnehin auf seinem Geraet. */
.ergebnisflaeche { display: inline-block; max-width: 100%; }

/* Ist ein Panel offen, macht das Bild Platz. Sonst arbeitet der Mensch an
   einem Motiv, das er nicht sieht -- und genau das war der erste Eindruck
   des fertigen Panels. */
@media (max-width: 860px) { .editor.hat-panel #motivCanvas { max-height: 30vh; } }
/* ── Das Bild nimmt den Raum, der da ist ──────────────────────────────
   `max-height: 58vh` war eine willkuerliche Zahl aus der Zeit, als der
   Editor mitten in einer scrollenden Seite stand -- dort musste unter
   dem Bild noch etwas sichtbar bleiben. Im Arbeitsmodus ist genau das
   falsch: die Buehne kennt ihre Hoehe, und das Bild soll sie ausnutzen.

   Gemessen am realen Screenshot bei 1440x900: die Flasche stand auf rund
   der halben verfuegbaren Hoehe, darunter und daneben mehrere hundert
   Pixel leerer Grund. Kein Pixel davon war noetig.

   `max-height: 100%` gilt aber nur, wo die Buehne eine BESTIMMTE Hoehe
   hat. Unterhalb von 960 px gibt es kein Workspace-Raster: dort ist die
   Hoehe der Kette auto, ein Prozentwert damit unbestimmt -- und der
   Browser laesst ihn fallen.

   Genau das ist im ersten Anlauf passiert. Auf dem Tablet (768x1024) kam
   das Bild in seiner vollen Eigenhoehe von 1000 px heraus, endete bei
   1120 und lag damit unter der Werkzeugleiste, die bei 913 beginnt. Die
   vorherige viewportbezogene Deckelung war dort richtig und bleibt.

   Deshalb stehen die Regeln im 960er-Block und nicht hier. Hier bleibt
   nur, was auf jeder Breite stimmt. */
/* ── DIE ARBEITSFLAECHE IST KEIN SEITENHINTERGRUND ────────────────────
   `--paper` ist #f4f6f9 -- fast weiss. Ein helles Motiv darauf hat
   keinen Halt: Bild und Flaeche verschwimmen, und was bleibt, ist der
   Eindruck von viel leerem Raum. Genau das war der Befund am realen
   Screenshot ("zu breit, zu schwer").
   Gemessen: das Bild belegt bei 1440x900 nur 26 % des Fensters -- die
   Hoehe zu 91 %, die Breite aber nur zu 43 %. Der Rest ist bei einem
   Hochformat unvermeidlich; was sich aendern laesst, ist NICHT die
   Groesse, sondern ob er wie Arbeitsflaeche aussieht oder wie Leere.
   Dunkel und neutral ist deshalb kein Geschmack, sondern die Bauform
   jedes Bildeditors: das Bild wird zum Objekt auf einem Tisch. */
[data-he-modus="arbeit"] .buehne {
  min-height: 0;
  background: var(--arbeitsgrund);
}
[data-he-modus="arbeit"] .buehne-fuss { color: rgba(255, 255, 255, .62); }
[data-he-modus="arbeit"] .buehne-recht a { color: rgba(255, 255, 255, .62); }
[data-he-modus="arbeit"] .buehne-recht a:hover { color: #fff; }
/* Auf dunklem Grund traegt ein dunkler Schlagschatten nichts. Eine
   feine helle Kante trennt das Bild von der Flaeche -- auch dann, wenn
   das Motiv selbst dunkel ist. */
[data-he-modus="arbeit"] #motivCanvas {
  box-shadow: 0 0 0 1px rgba(255, 255, 255, .14), 0 18px 40px rgba(0, 0, 0, .35);
}
/* Die Hoehenkette gilt auf JEDER Breite -- nur das Raster daneben nicht.
   Beim ersten Anlauf stand `flex: 1` nur im 960er-Block, und damit blieb
   die Kette auf dem Telefon unbestimmt: das Bild hing an `max-height:
   44vh`, waehrend die Buehne nach dem Wegfall von Kopf und
   Landingpage-Inhalt die ganze Hoehe hatte. Live gemessen: das Bild
   endete bei 400 px, die Werkzeugleiste beginnt bei 733 -- dazwischen
   rund 330 px, und darunter noch einmal so viel. */
/* NUR unterhalb des Rasters. Beim ersten Anlauf stand diese Regel ohne
   Media Query -- und weil sie SPAETER in der Datei steht als der
   960er-Block und dieselbe Spezifitaet hat, machte sie aus dem Raster
   wieder einen Flexcontainer. Ergebnis auf dem Desktop: zwischen Buehne
   und Inspector klafften 781 px. Drei Workspace-Tests haben genau das
   gefangen. */
[data-he-modus="arbeit"] .editor-arbeit { flex: 1; min-height: 0; }
@media (max-width: 959.98px) {
  [data-he-modus="arbeit"] .editor-arbeit { display: flex; }
  [data-he-modus="arbeit"] .editor-arbeit > .buehne { flex: 1; min-width: 0; }
}
[data-he-modus="arbeit"] .buehne-inner { padding: 4px; }
[data-he-modus="arbeit"] .ergebnisflaeche {
  display: flex; width: 100%; height: 100%; min-height: 0;
  align-items: center; justify-content: center;
}
/* Jetzt ist die Hoehe bestimmt, also darf das Bild in Prozent rechnen.
   Die viewportbezogenen Deckelungen weiter unten (44vh, 58vh) stammen
   aus der Zeit, als der Editor in einer scrollenden Seite stand.
   NICHT zurueckgenommen werden darf die Deckelung bei offenem Panel:
   ist auf dem Telefon ein Blatt offen, MUSS das Bild Platz machen,
   sonst korrigiert der Mensch an einem Motiv, das er nicht sieht.

   HIER STAND, JENE REGEL STEHE SPAETER UND GEWINNE. Das war falsch --
   sie steht rund achtzig Zeilen FRUEHER, hat dieselbe Spezifitaet, und
   damit gewann diese hier. Live gemessen: Bild endet bei 543, das Blatt
   beginnt bei 275; es lag darunter. Dieselbe Kaskadenfalle zum dritten
   Mal an einem Tag, diesmal in einem Kommentar, der sie erklaeren
   sollte. Die Deckelung steht deshalb jetzt am Ende dieser Datei, mit
   Arbeitsmodus-Spezifitaet. */
/* Die FLAECHE traegt das Seitenverhaeltnis (`--bild-ar` setzt `male()`),
   das Canvas fuellt sie ganz aus. So passt das Bild in beide Richtungen
   ein -- auch nach OBEN -- und die Elementbox bleibt trotzdem exakt das
   gemalte Bild. Genau das unterscheidet diesen Weg von
   `object-fit: contain`, dessen Briefkastenrand jeden Zeigerpfad
   zerstoeren wuerde. */
/* DAS VERHAELTNIS HAELT NUR, WER NICHT BEIDE MASSE VORGIBT.
   Hier stand `height: 100%` zusammen mit `aspect-ratio` und
   `max-width: 100%`. Auf einer hochkanten Buehne (Telefon, 362x539) war
   die Hoehe fest, die Breite wurde gekappt -- und `aspect-ratio` fiel
   still weg: ein Querformatfoto 1,20 stand in einer Flaeche von 0,67,
   senkrecht um den Faktor 1,79 gestreckt (2026-09-23, live).
   Jetzt wird die BREITE aus beiden Grenzen gerechnet -- Buehnenbreite
   und Buehnenhoehe mal Verhaeltnis --, und die Hoehe folgt daraus. Die
   Buehne ist dafuer ein Groessencontainer; ihre Groesse kommt aus
   `flex: 1 1 0%`, nicht aus dem Inhalt, sonst fiele sie auf null. */
[data-he-modus="arbeit"] .buehne-inner { container-type: size; }
[data-he-modus="arbeit"] .ergebnisflaeche {
  aspect-ratio: var(--bild-ar, auto);
  height: auto;
  width: min(100cqw, calc(100cqh * var(--bild-q, 1)),
             var(--bild-max-b, 100cqw),
             calc(var(--bild-max-h, 100cqh) * var(--bild-q, 1)));
  max-width: none; max-height: none;
}
[data-he-modus="arbeit"] .ergebnisflaeche canvas,
[data-he-modus="arbeit"] .ergebnisflaeche #motivCanvas {
  width: 100%; height: 100%; max-width: none; max-height: none;
}
#motivCanvas {
  max-width: 100%; max-height: 58vh; display: block;
  border-radius: 8px; box-shadow: 0 2px 14px rgba(15, 23, 42, .10);
  touch-action: none;   /* sonst scrollt die Seite beim Malen oder Ziehen */
}
#motivCanvas.ist-pinsel { cursor: var(--pinsel-cursor, crosshair); }
/* Schachbrett nur dort, wo Transparenz auch gemeint ist. */
#motivCanvas.ist-transparent {
  background-image:
    linear-gradient(45deg, #e9edf2 25%, transparent 25%, transparent 75%, #e9edf2 75%),
    linear-gradient(45deg, #e9edf2 25%, transparent 25%, transparent 75%, #e9edf2 75%);
  background-size: 18px 18px; background-position: 0 0, 9px 9px;
  background-color: var(--white);
}
.buehne-fuss {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; margin-top: 14px; font-size: 13px; color: var(--ink-4);
}
/* Ruhig: eine Auskunft am Rand der Arbeitsflaeche, kein Menue. */
.buehne-recht { display: flex; gap: 16px; }
.buehne-recht a { color: var(--ink-4); text-decoration: none; }
.buehne-recht a:hover { color: var(--ink-2); text-decoration: underline; }
.vergleich { display: inline-flex; border: 1px solid var(--line-2); border-radius: 9px; overflow: hidden; }
.vgl {
  border: 0; background: var(--white); font: inherit; font-size: 13px;
  padding: 10px 16px; min-height: 44px; cursor: pointer; color: var(--ink-3);
}
.vgl.is-aktiv { background: var(--blue); color: var(--white); font-weight: 600; }

/* Die eine Leiste. Fest am Fensterrand und ueber dem Panel: sie ist das, was
   erreichbar bleiben muss. `position: sticky` haengt am Container -- sobald
   der Editor hoeher ist als das Fenster, steht sie woanders als ein Panel,
   das mit dem FENSTER rechnet. Genau daran ist der erste Anlauf gescheitert. */
.leiste {
  display: flex; gap: 8px; justify-content: center; flex-wrap: wrap;
  padding: 10px 14px; background: var(--white); border-top: 1px solid var(--line);
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 70;
}
.lz {
  border: 1px solid var(--line-2); border-radius: 10px; background: var(--white);
  font: inherit; font-size: 14px; padding: 10px 18px; min-height: 44px;
  cursor: pointer; color: var(--ink-2);
}
.lz:hover { border-color: var(--blue-soft); background: var(--blue-tint); }
.lz.is-aktiv { border-color: var(--blue); background: var(--blue); color: var(--white); font-weight: 600; }

/* Das Panel ist KEIN Dialog. Es laesst die Leiste frei und das Bild sichtbar;
   ein Panel, das die Leiste blockiert, aus der es aufgerufen wurde, ist ein
   Bedienfehler.

   Auf dem Desktop sitzt es RECHTS, nicht unten. Unten hat es das Motiv
   verdeckt -- und wer die Kante korrigiert, muss die Kante sehen. Auf einem
   breiten Bildschirm ist daneben Platz; auf einem schmalen ist er nicht da,
   dort wird es ein Blatt am unteren Rand. */
.blatt {
  position: fixed; right: 18px; z-index: 60;
  width: min(360px, calc(100vw - 36px));
  pointer-events: none;
  /* DIE HOEHE DER LEISTE WIRD GEMESSEN, NICHT GERATEN.
     Hier stand `bottom: 82px` und weiter unten `bottom: 70px` fuer das
     Telefon. Die Leiste ist dort aber 111 Pixel hoch -- fuenf Knoepfe
     brechen bei 412 Pixeln Breite in zwei Zeilen um. Das Blatt lag
     damit 41 Pixel zu tief, und "Entfernen" ragte unter die Leiste;
     Playwright kam zehn Versuche lang nicht an den Knopf.
     `--leiste-h` pflegt `hintergrund-entfernen.js` per ResizeObserver.
     Der Vorgabewert traegt den Fall, dass kein Skript laeuft. */
  bottom: calc(var(--leiste-h, 82px) + 12px);
}
.blatt-inner {
  pointer-events: auto;
  max-height: min(62vh, 620px); overflow-y: auto;
  background: var(--white); border: 1px solid var(--line);
  border-radius: 14px; padding: 16px 18px 18px;
  box-shadow: 0 8px 30px rgba(15, 23, 42, .18);
}
.blatt-tabs {
  display: flex; gap: 4px; margin: -4px -6px 12px; flex-wrap: wrap;
  border-bottom: 1px solid var(--line); padding-bottom: 8px;
}
/* AUF DEM TELEFON FUEHRT DIE LEISTE UNTEN -- UND NUR SIE.
   Diese Regel stand schon im Stylesheet, rund hundertsiebzig Zeilen
   WEITER OBEN, und hat nie gewirkt: eine Media-Query erhoeht die
   Spezifitaet nicht, und bei gleicher Spezifitaet gewinnt die spaetere
   Regel -- also die Definition darueber.
   Am 2026-09-21 in der realen Abnahme gesehen: auf 412 Pixeln standen
   "Korrigieren · Hintergrund · Text · Grafik · Format" ZWEIMAL
   gleichzeitig, einmal als Reiterzeile im Blatt und einmal in der
   Leiste darunter. Zwei Wege zur selben Wahl nebeneinander sind keine
   Redundanz, sondern eine Frage. */
@media (max-width: 959px) {
  .blatt-tabs { display: none; }
}
.blatt-tab {
  border: 0; background: transparent; font: inherit; font-size: 13px;
  padding: 8px 10px; min-height: 40px; border-radius: 8px; cursor: pointer;
  color: var(--ink-3);
}
.blatt-tab:hover { background: var(--blue-tint); color: var(--ink-2); }
.blatt-tab[aria-selected="true"] { background: var(--blue); color: var(--white); font-weight: 600; }
@media (min-width: 960px) { .blatt-kopf h2 { display: none; } }

.blatt-kopf { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
.blatt-kopf h2 { font-size: 16px; margin: 0; }
.blatt-zu {
  border: 0; background: transparent; font-size: 26px; line-height: 1;
  width: 44px; height: 44px; cursor: pointer; color: var(--ink-3); border-radius: 8px;
}
.blatt-zu:hover { background: var(--paper); color: var(--ink); }
.blatt-inhalt { margin-top: 10px; }

/* ══ BEDIENFELD TRITT BEIM PINSELN ZURUECK ═════════════════════════════
   Auf dem Telefon liegt das Blatt ueber der unteren Bildhaelfte. Wer
   "Behalten" oder "Entfernen" waehlt, will im naechsten Moment auf dem
   Bild streichen -- und sieht davon die Haelfte nicht.

   Es verschwindet nicht, es schrumpft: die Tabs und die Kopfzeile
   bleiben stehen, der Rest klappt weg. Damit ist der Weg zurueck immer
   sichtbar, und niemand muss raten, wo die Einstellungen geblieben sind.

   Ausdruecklich NUR unterhalb von 960 px. Auf dem Desktop steht das Feld
   neben dem Bild und verdeckt nichts -- dort waere das Schrumpfen ein
   Verlust ohne Gegenwert. */
@media (max-width: 959px) {
  .blatt.ist-kompakt .blatt-inner {
    max-height: none;
    padding-bottom: 10px;
  }
  .blatt.ist-kompakt .blatt-inhalt {
    max-height: 0; margin-top: 0; overflow: hidden;
    opacity: 0; transition: max-height .22s ease, opacity .16s ease;
  }
  /* Ein Hinweis, der sagt, was gerade gilt und wie man zurueckkommt.
     Ohne ihn saehe das eingeklappte Feld aus, als waere etwas kaputt. */
  .blatt.ist-kompakt .blatt-kopf::after {
    content: "Streichen Sie auf dem Bild · Tab antippen für Einstellungen";
    flex: 1; font-size: 12px; color: var(--ink-3); text-align: right;
  }
  .blatt.ist-kompakt .blatt-kopf h2 { display: none; }
}
@media (prefers-reduced-motion: reduce) {
  .blatt.ist-kompakt .blatt-inhalt { transition: none; }
}
.blatt-frage { font-size: 14px; color: var(--ink-3); margin: 0 0 14px; }
.blatt-wahl { display: flex; flex-wrap: wrap; gap: 10px; }
.blatt-wahl-spalte { flex-direction: column; }
.blatt-wahl .btn { flex: 1; min-width: 150px; }

.insp-hinweis { font-size: 13px; color: var(--ink-4); line-height: 1.5; margin: 8px 0 0; }
.insp-trenner { border: 0; border-top: 1px solid var(--line); margin: 16px 0; }
.insp-feld { display: block; margin-bottom: 14px; font-size: 13px; color: var(--ink-3); }
.insp-feld > span { display: block; font-weight: 600; color: var(--ink-2); margin-bottom: 6px; }
.insp-feld input[type="range"] { width: 100%; }
.insp-feld output { font-size: 12px; color: var(--ink-4); }
.insp-feld textarea {
  width: 100%; font: inherit; font-size: 14px; padding: 9px 11px;
  border: 1px solid var(--line-2); border-radius: 8px; resize: vertical;
}
/* Ein Regler mit zwei Enden sagt, was er tut. "Toleranz 115 %" sagt es nicht.
   Die Spezifitaet muss `.insp-feld > span` schlagen -- sonst gewinnt dort
   `display: block`, und die beiden Enden stehen als ein zusammenhaengender
   Satz nebeneinander statt links und rechts. Genau so gemessen. */
.insp-feld > span.regler-enden {
  display: flex; justify-content: space-between; gap: 16px;
  font-size: 12px; font-weight: 400; color: var(--ink-4); margin: 4px 0 0;
}
.regler-enden span { display: inline; }
.insp-farbe input[type="color"] {
  width: 100%; height: 44px; padding: 2px; border: 1px solid var(--line-2);
  border-radius: 8px; background: var(--white); cursor: pointer;
}
.insp-reihe { display: flex; flex-wrap: wrap; gap: 14px; margin-bottom: 14px; }
.insp-schalter {
  display: inline-flex; align-items: center; gap: 8px; min-height: 44px;
  font-size: 14px; color: var(--ink-2); cursor: pointer;
}
.insp-aktionen { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }

.segmente { display: inline-flex; border: 1px solid var(--line-2); border-radius: 8px; overflow: hidden; }
.seg {
  border: 0; background: var(--white); font: inherit; font-size: 14px;
  padding: 10px 16px; min-height: 44px; cursor: pointer; color: var(--ink-3);
}
.seg.is-aktiv { background: var(--blue); color: var(--white); font-weight: 600; }

.hg-gitter { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.hg {
  border: 1px solid var(--line-2); border-radius: 9px; background: var(--white);
  font: inherit; font-size: 13px; padding: 10px 8px; min-height: 48px;
  cursor: pointer; color: var(--ink-2); line-height: 1.3;
}
.hg small { color: var(--ink-4); font-size: 11px; }
.hg.is-aktiv { border-color: var(--blue); background: var(--blue-tint); color: var(--blue); font-weight: 600; }
.hg.is-aktiv small { color: var(--blue); }

@media (max-width: 860px) {
  /* Der Editorkopf trug drei beschriftete Knoepfe plus Titel und lief bei
     390 px um 128 Pixel ueber -- waagerechtes Scrollen mitten im
     Kernworkflow. Gemessen im LAUFENDEN Zustand: die laengsten Zeilen einer
     Anwendung stehen im offenen Editor, nicht auf der Startseite. */
  .editor-titel { display: none; }
  .editor-kopf { gap: 8px; padding: 8px 10px; }
  .editor-kopf-rechts { margin-left: auto; }
  #btnZurueck .wort, #btnVor .wort { display: none; }
  #btnZurueck, #btnVor { padding: 10px 12px; min-width: 44px; }
  .buehne { padding: 12px 10px 6px; }
  #motivCanvas { max-height: 44vh; }
  .leiste { gap: 6px; padding: 8px 8px; }
  .lz { flex: 1 1 30%; padding: 10px 6px; font-size: 13px; }
  .blatt { left: 0; right: 0; width: auto; display: flex; justify-content: center; }
  .blatt-inner {
    width: 100%; border-radius: 14px 14px 0 0;
    /* 3 · DIE HOEHE FOLGT DEM, WAS DA IST.
       `46vh` war eine Zahl ohne Bezug: bei 839 Pixeln sind das 386, und
       darunter stehen noch Leiste und Abstand. Gemessen ragte der
       Inhalt 87 Pixel unter den Viewport, und Pinselgroesse,
       Rueckgaengig und Zuruecksetzen waren ohne Scrollen nicht da.
       Jetzt bleibt oben ein Drittel fuer das Bild stehen -- wer die
       Kante korrigiert, muss die Kante sehen. */
    max-height: calc(100vh - var(--leiste-h, 82px) - 34vh);
    box-shadow: 0 -8px 30px rgba(15, 23, 42, .16);
  }
  .hg-gitter { grid-template-columns: 1fr 1fr; }
}

@media (prefers-reduced-motion: reduce) {
  .ablage, .lz, .vgl, .hg, .seg { transition: none; }
}

/* KUK-ZIELGROESSEN:ANFANG -- ERZEUGT, NICHT VON HAND AENDERN.
   Quelle: scripts/ops/sync_webtool_common.py
   Zielgroessen fuer Pointer und Touch: WCAG 2.2 SC 2.5.8 verlangt 24x24,
   das Produktziel sind rund 44 Pixel fuer haeufig benutzte Schaltflaechen. */
.btn-sm,
.chip {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.vz-radio-group label,
.chip-group > label {
  min-height: 44px;
  display: flex;
  align-items: center;
  gap: 8px;
}

/* Die Vorlagenleiste auf schmalen Bildschirmen.
   Gemessen am 2026-09-16 auf `prozent` bei 390 Pixeln: die Leiste bricht auf
   vier Zeilen um und wird 200 Pixel hoch -- ein Viertel des Bildschirms, VOR
   dem ersten Eingabefeld. Das erste Feld begann dadurch erst nach 1,12
   Bildschirmhoehen; der Mensch musste scrollen, bevor er die Aufgabe
   ueberhaupt sah. Die Hoehe kommt nicht von der Schrift, sondern von der
   44-Pixel-Zielgroesse oben: sie multipliziert sich mit jeder Umbruchzeile.

   Zwei Varianten gemessen, bevor eine gebaut wurde:

       Ausgang           200 px    erstes Feld bei 1,12x
       eine Zeile         44 px    erstes Feld bei 0,93x
       Leiste ausgeblendet 0 px    erstes Feld bei 0,86x

   Das Ausblenden bringt 0,07 Bildschirme mehr und kostet die Vorlagen ganz.
   Eine Zeile bringt das Feld in den ersten Viewport und laesst sie stehen --
   fuer wiederkehrende Nutzer sind sie echte Beschleuniger, kein Beiwerk.

   Der Tastaturweg traegt ohne Zutun: die Knoepfe sind fokussierbar, und der
   Browser scrollt sie beim Tabben in den Blick (gemessen: 480 Pixel). Anders
   als bei den breiten Tabellen, deren Inhalt NICHT fokussierbar ist und die
   deshalb einen eigenen Tabstopp brauchten, waere hier ein Handler Ueberbau.

   Nur bis 600 Pixel. Wo Platz ist, bleiben die Vorlagen vollstaendig
   sichtbar -- dieselbe Funktion, andere Darstellung. */
@media (max-width: 600px) {
  .preset-bar { flex-wrap: nowrap; overflow-x: auto; }
  .preset-bar > * { flex: none; }
}

/* Die Fusszeilen-Navigation.
   Am 2026-09-16 ueber vier Archetypen gemessen: "Impressum", "Datenschutz"
   und "KUKANILEA Buerosoftware" sind 20 Pixel hoch bei `padding: 0`, und sie
   stehen untereinander so dicht, dass der 24-Pixel-Kreis des Erfolgs-
   kriteriums den Nachbarn beruehrt.
   Damit greift KEINE der beiden Ausnahmen von SC 2.5.8: Spacing nicht, weil
   die Kreise sich schneiden -- und Inline nicht, weil `nav.ft-links` eine
   Navigation ist und kein Satz. Der Kommentar oben nimmt Inline-Links im
   Fliesstext bewusst aus; diese hier sind keine.
   Drei Werkzeuge von vieren trugen den Befund, das vierte nur deshalb nicht,
   weil seine Fusszeile weiter auseinanderstand. Ein gemeinsamer Owner, ein
   Fix: vier Pixel Innenabstand machen aus 20 genau 24, ohne dass sich die
   Schrift oder das Bild der Seite aendert. */
.ft-links a {
  display: inline-flex;
  align-items: center;
  min-height: 24px;
}

/* Waagerechtes Scrollen im Hauptweg.
   Ein Grid-Kind traegt von sich aus `min-width: auto` und kann deshalb nicht
   unter die Mindestbreite seines Inhalts schrumpfen. Eine einzige lange
   Auswahloption genuegt, um die ganze Spalte breiter zu machen als den
   Bildschirm -- gemessen am 2026-09-12 auf fristen.kukanilea.de: 421 Pixel
   Scrollbreite bei 390 Pixeln Viewport, verursacht von einem <select>, dessen
   breiteste Option 409 Pixel misst. `min-width: 0` gibt dem Kind das
   Schrumpfen zurueck; die Option bricht dann in der Liste um, statt die Seite
   zu verschieben. */
.tool-layout > *,
.tool-card-stack > *,
.form-grid > *,
.vz-form > *,
.pp-form > *,
/* Und das Kind selbst, statt jeden Container einzeln aufzuzaehlen.
   Am 2026-09-12 gemessen: acht Werkzeuge scrollten bei 390 Pixeln waagerecht,
   und jedes hatte seinen EIGENEN Grid-Container -- eg-form, es-form, gh-grid,
   kz-form, ab-grid. Das nicht schrumpfende Kind hiess aber ueberall gleich.
   Wer die Container aufzaehlt, vergisst den naechsten; wer das Kind nimmt,
   erwischt auch den, den es noch nicht gibt. */
.form-field,
/* Und dieselbe Lehre ein zweites Mal, an einem anderen Kind.
   Am 2026-09-16 scrollte fahrtenbuch.kukanilea.de bei 320 Pixeln waagerecht:
   drei `.tool-card` waren 363 Pixel breit und trugen `min-width: auto`. Die
   Regel darueber zaehlt Container auf -- `.tool-layout`, `.tool-card-stack`,
   `.form-grid` --, und der Grid-Container dieser Karten war keiner davon.
   Genau der Fall, den der Kommentar daneben vorhergesagt hat: wer die
   Container aufzaehlt, vergisst den naechsten. `.tool-card` ist die
   durchgehende Klasse in allen Werkzeugen. */
.tool-card {
  min-width: 0;
}

/* Ein Schieberegler in einer Flex-Zeile hat dasselbe Problem aus derselben
   Ursache. Auf kfz-steuer.kukanilea.de steht neben ihm ein Zahlenfeld, das
   auf schmalen Schirmen ABSICHTLICH breiter wird, damit es die 44 Pixel
   Zielmass erreicht -- der Regler daneben konnte aber nicht nachgeben und
   schob die Seite auf 400 Pixel. Beide Anforderungen vertragen sich, sobald
   der Regler schrumpfen darf. */
.slider-row input[type="range"] {
  min-width: 0;
}

/* Deutsche Komposita in Ueberschriften.
   "Weihnachtsgeld-/Urlaubsgeld-Rechner" bietet dem Browser keine
   Umbruchstelle: nach einem Bindestrich, auf den ein Schraegstrich folgt,
   wird nicht getrennt. Das Wort war 398 Pixel breit in einer 350 Pixel
   breiten Ueberschrift. Diese Regel greift nur, wenn ein Wort sonst gar
   nicht passt -- an vier Kontrollwerkzeugen gemessen blieb die Hoehe der
   Ueberschrift auf das Pixel gleich, und auch beim Anlassfall kam keine
   Zeile hinzu. */
h1, h2, h3 {
  overflow-wrap: break-word;
}

/* Kontrollkaestchen und Radiofelder.
   Gemessen am 2026-09-12 ueber 242 Werkzeuge bei 390 Pixeln Breite: 73 trugen
   Ziele unter 24 CSS-Pixeln, und 103 davon waren Kontrollkaestchen oder
   Radiofelder. Gezaehlt wurde bereits das GROESSTE Ziel -- Element,
   umschliessendes Label oder label[for] -- diese blieben trotzdem darunter.
   Ein Browser zeichnet sie von sich aus mit ungefaehr dreizehn Pixeln; auf
   dem Telefon ist das mit dem Daumen nicht sicher zu treffen. WCAG 2.2
   SC 2.5.8 nennt 24 x 24 als Untergrenze. */
input[type="checkbox"],
input[type="radio"] {
  min-width: 24px;
  min-height: 24px;
}

/* Und die uebrigen Bedienelemente auf dieselbe Untergrenze. In den meisten
   Werkzeugen sind sie ohnehin um die 39 Pixel hoch -- das hebt nur die
   Ausreisser, etwa die 21 Pixel hohen Felder des SEPA-Formulars. */
input[type="text"],
input[type="email"],
input[type="tel"],
input[type="url"],
input[type="number"],
input[type="date"],
input[type="file"],
input[type="range"],
select,
textarea {
  min-height: 24px;
}

/* Das Dateifeld schiebt die Seite waagerecht, und zwar aus einem Grund, den
   man ihm nicht ansieht: ein `input[type="file"]` traegt `white-space: pre`.
   Seine Mindestbreite ist damit der Text "Datei auswaehlen | Keine
   ausgewaehlt", der nicht umbrechen darf -- rund 320 Pixel, unabhaengig davon,
   wieviel Platz da ist.
   Am 2026-09-16 auf fahrtenbuch.kukanilea.de gemessen: das Sicherungsfeld war
   321 Pixel breit in einem 320 Pixel breiten Fenster und schob das ganze
   Dokument auf 383 Pixel. Derselbe Fehler hatte kurz zuvor die PDF-Werkstatt
   getroffen; 95 index.html tragen Dateifelder.
   `min-width: 0` allein genuegt nicht -- die Mindestbreite kommt aus dem
   Inhalt, nicht aus der Eigenschaft. */
input[type="file"] {
  max-width: 100%;
  min-width: 0;
}

/* Aufklapper sind Bedienelemente, keine Ueberschriften.
   Am 2026-09-16 auf elterngeld.kukanilea.de bei 390 und 430 Pixeln gemessen:
   die FAQ-Zeilen waren 23 Pixel hoch -- einen Pixel unter der Grenze des
   WCAG 2.2 SC 2.5.8. Bei 320 und 360 Pixeln fiel es nicht auf, weil der Text
   dort umbricht und die Zeile dadurch hoeher wird; genau deshalb ist so ein
   Fehler ohne Messung an mehreren Breiten unsichtbar.
   Die Inline-Ausnahme des Erfolgskriteriums greift hier NICHT: ein <summary>
   ist ein eigenes Bedienelement, kein Verweis in einem Satz.
   Nur `min-height`, bewusst ohne `display: flex`: sobald `display` gesetzt
   wird, verschwindet die Aufklappmarkierung des Browsers -- und die zeichnen
   nicht alle Werkzeuge selbst nach. Fuer das Zielmass genuegt die Hoehe. */
summary {
  min-height: 24px;
}
/* KUK-ZIELGROESSEN:ENDE */


/* ═════════════════════════════════════════════════════════════════════════
   STARTFLAECHE
   Eigenes Farb- und Massystem fuer diesen Abschnitt, damit er sich ohne
   Seiteneffekte auf den Editor anpassen laesst.
   ═════════════════════════════════════════════════════════════════════════ */

/* Die Farbwerte gelten fuer den Hero UND fuer die Stufenanzeige. Die
   Anzeige zieht waehrend der Verarbeitung aus dem Hero nach `#main` um --
   dort erbte sie diese Variablen nicht mehr, jede Deklaration mit ihnen
   wurde ungueltig, und der Balken verschwand samt Spur. Eine Stelle,
   zwei Traeger; keine zweite Kopie der Werte. */
.he-start, .he-arbeit {
  --he-ink: #132033;
  --he-muted: #5d6b7e;
  --he-line: #dce4ea;
  --he-soft: #f4f7f9;
  --he-soft-2: #edf3f5;
  --he-petrol: #1b5874;
}
.he-start {
  padding: clamp(2.5rem, 5vw, 5.75rem) 0 5rem;
  color: var(--he-ink);
  background:
    radial-gradient(circle at 78% 13%, rgba(27, 88, 116, .07), transparent 28rem),
    linear-gradient(180deg, #fff 0, #f7f9fb 100%);
}

.he-hero {
  display: grid;
  grid-template-columns: minmax(0, .9fr) minmax(420px, 1.1fr);
  /* Getrennt, nicht `gap`. Der eine Wert galt sonst auch zwischen den beiden
     Zeilen der linken Spalte, und zwischen Unterzeile und Knopf klaffte auf
     dem Desktop eine Luecke von sechs Zentimetern. */
  column-gap: clamp(2.5rem, 5vw, 6rem);
  row-gap: 2rem;
  align-items: center;
  min-height: min(670px, calc(100svh - 120px));
}
/* Fehlt der Produktbeweis, waere eine leere rechte Haelfte ein sichtbarer
   Fehler. Dann wird der Hero einspaltig. */
.he-hero.ohne-beweis { grid-template-columns: minmax(0, 1fr); min-height: 0; }
.he-hero-copy { max-width: 650px; }
/* Drei Kinder, zwei Spalten: Text und Aktionen untereinander links, der
   Beweis rechts ueber beide Zeilen. Vorher waren Text und Aktionen EIN Block
   -- siehe den Kommentar im HTML. */
.he-hero { grid-template-areas: "copy proof" "aktion proof"; align-content: center; }
.he-hero-copy { grid-area: copy; }
.he-hero-actions { grid-area: aktion; max-width: 650px; }
.he-proof { grid-area: proof; }
.he-hero.ohne-beweis { grid-template-areas: "copy" "aktion"; }

.he-kicker, .he-eyebrow {
  display: inline-block; margin: 0 0 .85rem;
  color: var(--he-petrol); font-size: .76rem; font-weight: 800;
  letter-spacing: .095em; text-transform: uppercase;
}

.he-hero h1 {
  max-width: 690px; margin: 0; color: var(--he-ink);
  font-size: clamp(2.7rem, 5.1vw, 5.15rem); line-height: .98; letter-spacing: -.052em;
}
.he-lead {
  margin: 1.45rem 0 0; color: var(--he-ink);
  font-size: clamp(1.25rem, 2vw, 1.72rem); font-weight: 700;
  line-height: 1.3; letter-spacing: -.02em;
}
.he-sub {
  max-width: 590px; margin: .65rem 0 0; color: var(--he-muted);
  font-size: clamp(1rem, 1.35vw, 1.12rem); line-height: 1.7;
}

.he-import { display: flex; align-items: center; gap: 1rem; margin-top: 2rem; }
.he-import.ist-ziel .he-primary { outline: 3px solid var(--he-petrol); outline-offset: 3px; }
.he-import.ist-beschaeftigt { opacity: .6; pointer-events: none; }
/* Sichtbar verborgen, nicht display:none -- sonst ist das Feld fuer die
   Tastatur und fuer <label for> nicht mehr erreichbar. */
.he-file-input {
  position: absolute; inline-size: 1px; block-size: 1px;
  overflow: hidden; clip-path: inset(50%); white-space: nowrap;
}
.he-file-input:focus-visible + .he-primary { outline: 3px solid var(--he-petrol); outline-offset: 3px; }
.he-primary { min-height: 52px; padding-inline: 1.25rem; gap: .55rem; cursor: pointer; }
.he-import-hint { color: var(--he-muted); font-size: .93rem; }

.he-paste-row { display: flex; align-items: center; gap: .85rem; margin-top: .75rem; }
.he-paste {
  appearance: none; border: 0; padding: .35rem 0; background: transparent;
  color: var(--he-petrol); font: inherit; font-size: .9rem; font-weight: 700;
  cursor: pointer; min-height: 44px;
}
.he-paste:hover { text-decoration: underline; }
.he-shortcut { display: inline-flex; align-items: center; gap: .2rem; color: var(--he-muted); font-size: .78rem; }
.he-shortcut kbd {
  min-width: 1.55rem; padding: .12rem .34rem; border: 1px solid var(--he-line);
  border-radius: .36rem; background: #fff; box-shadow: 0 1px 0 rgba(19,32,51,.06);
  color: var(--he-ink); font: inherit; font-size: .78rem; text-align: center;
}

.he-trust {
  display: flex; flex-wrap: wrap; align-items: center; gap: .7rem 1.35rem;
  margin-top: 1.6rem; color: #425365; font-size: .86rem; font-weight: 650;
}
.he-trust span { display: inline-flex; align-items: center; gap: .42rem; }
.he-trust svg { width: 17px; height: 17px; color: var(--he-petrol); }
.he-capability { margin: .75rem 0 0; color: var(--he-muted); font-size: .82rem; }
.he-hero .tool-status { margin-top: .75rem; }

/* ══ VERARBEITUNGSANZEIGE ═══════════════════════════════════════════════
   Sie erscheint zwischen Auswahl und Editor und nimmt den Platz, auf dem
   vorher nichts geschah. Bewusst ruhig: kein Schimmern, kein Puls, keine
   Farbe, die nach Warnung aussieht. Was hier passiert, ist normal.

   Feste Hoehe fuer Kopf und Schritt, damit ein laengerer Dateiname oder
   ein Stufenwechsel das Layout nicht springen laesst -- die Anzeige sitzt
   zwischen Knopf und Beweis, und jeder Sprung dort waere sichtbar. */
.he-arbeit {
  margin-top: 1.1rem; padding: .95rem 1.05rem 1rem;
  border: 1px solid rgba(19, 32, 51, .1); border-radius: 14px;
  background: #fff;
}
.he-arbeit-kopf {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 1rem; min-height: 1.2rem;
}
.he-arbeit-datei {
  color: var(--he-ink); font-size: .86rem; font-weight: 650;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.he-arbeit-groesse {
  flex: none; color: var(--he-muted); font-size: .8rem;
  font-variant-numeric: tabular-nums;
}
.he-arbeit-schritt {
  margin: .5rem 0 .55rem; min-height: 1.25rem;
  color: #425365; font-size: .86rem;
}

/* Natives <progress>. Ohne `value` stellt es sich unbestimmt dar -- genau
   das wird gebraucht, solange keine Stufe fertig ist, und es kostet
   keinen eigenen ARIA-Vertrag. Die Herrichtung braucht beide
   Pseudoelemente, weil WebKit und Firefox verschiedene benutzen. */
.he-arbeit-balken {
  display: block; width: 100%; height: 6px; border: 0; border-radius: 99px;
  background: rgba(19, 32, 51, .08);
  appearance: none; -webkit-appearance: none;
}
.he-arbeit-balken::-webkit-progress-bar {
  border-radius: 99px; background: rgba(19, 32, 51, .08);
}
.he-arbeit-balken::-webkit-progress-value {
  border-radius: 99px; background: var(--he-petrol);
  transition: inline-size .32s ease;
}
.he-arbeit-balken::-moz-progress-bar {
  border-radius: 99px; background: var(--he-petrol);
}
/* Unbestimmt: ein schmaler Laeufer statt eines gefuellten Balkens. Er
   behauptet keinen Stand -- er zeigt nur, dass gearbeitet wird. */
.he-arbeit-balken:not([value]) {
  background:
    linear-gradient(90deg, transparent 0%, var(--he-petrol) 45%,
                    var(--he-petrol) 55%, transparent 100%) 0 0 / 38% 100%
    no-repeat,
    rgba(19, 32, 51, .08);
  animation: he-laeufer 1.4s ease-in-out infinite;
}
/* DER LAEUFER LIEF -- UNTER EINER DECKENDEN SCHICHT.
   In Chromium und WebKit liegt die Pseudoschicht des Balkens mit eigener
   Farbe UEBER dem Elementhintergrund, auf dem der Laeufer animiert. Am
   2026-09-23 gemessen: kein Wert, Animation aktiv, und auf dem Bild ein
   leerer grauer Strich. Ein Balken, der wie null Prozent aussieht, sagt
   "nichts passiert" -- genau der Zweifel, der gemeldet wurde.
   Die Schicht nur durchsichtig zu machen genuegt nicht: dann verschwand
   auch die Spur. Chromium malt den Elementhintergrund bei
   appearance none gar nicht. Der Laeufer gehoert deshalb AUF die
   Schicht; Firefox liest weiter die Elementregel darueber. */
.he-arbeit-balken:not([value])::-webkit-progress-bar {
  background:
    linear-gradient(90deg, transparent 0%, var(--he-petrol) 45%,
                    var(--he-petrol) 55%, transparent 100%) 0 0 / 38% 100%
    no-repeat,
    rgba(19, 32, 51, .08);
  animation: he-laeufer 1.4s ease-in-out infinite;
}
@keyframes he-laeufer {
  0%   { background-position: -40% 0; }
  100% { background-position: 140% 0; }
}
.he-arbeit-fuss {
  margin: .6rem 0 0; color: var(--he-muted); font-size: .76rem;
}
.he-arbeit[data-fehler] { border-color: rgba(176, 90, 30, .35); }
.he-arbeit[data-fehler] .he-arbeit-schritt { color: var(--warn-ink, #8a4b12); }

@media (prefers-reduced-motion: reduce) {
  /* Der Laeufer ist Dekoration. Ohne ihn bleibt die Aussage vollstaendig:
     der Balken steht, die Stufe steht als Text darueber. */
  .he-arbeit-balken:not([value]) { animation: none; background-position: 50% 0; }
  .he-arbeit-balken:not([value])::-webkit-progress-bar { animation: none; background-position: 50% 0, 0 0; }
  .he-arbeit-balken::-webkit-progress-value { transition: none; }
}

.he-proof { min-width: 0; }
.he-proof-card {
  overflow: hidden; border: 1px solid rgba(19,32,51,.09);
  border-radius: clamp(1.2rem, 2vw, 1.8rem); background: #fff;
  box-shadow: 0 32px 70px rgba(19,32,51,.1), 0 3px 12px rgba(19,32,51,.04);
}
.he-proof-top, .he-proof-bottom {
  display: flex; align-items: center; justify-content: space-between;
  gap: 1rem; padding: .85rem 1.05rem;
}
.he-proof-top {
  color: #657385; font-size: .77rem; font-weight: 800;
  letter-spacing: .06em; text-transform: uppercase;
}
.he-proof-picture {
  display: block; position: relative;
  background:
    linear-gradient(45deg, #e5e8eb 25%, transparent 25%),
    linear-gradient(-45deg, #e5e8eb 25%, transparent 25%),
    linear-gradient(45deg, transparent 75%, #e5e8eb 75%),
    linear-gradient(-45deg, transparent 75%, #e5e8eb 75%), #f6f7f8;
  background-position: 0 0, 0 10px, 10px -10px, -10px 0;
  background-size: 20px 20px;
}
.he-proof-picture img { display: block; width: 100%; height: auto; aspect-ratio: 4 / 3; object-fit: cover; }
.he-proof-bottom { color: var(--he-muted); font-size: .78rem; }
.he-proof-live { display: inline-flex; align-items: center; gap: .45rem; }
.he-dot { width: 7px; height: 7px; border-radius: 999px; background: var(--he-petrol); }

.he-examples, .he-more, .he-steps { margin-top: clamp(4.5rem, 8vw, 8rem); }
.he-section-head {
  display: flex; align-items: end; justify-content: space-between;
  gap: 2rem; margin-bottom: 1.5rem;
}
.he-section-head h2 {
  margin: 0; color: var(--he-ink); font-size: clamp(1.8rem, 3vw, 2.65rem);
  line-height: 1.08; letter-spacing: -.035em;
}
.he-section-head p { max-width: 430px; margin: 0; color: var(--he-muted); line-height: 1.6; }
.he-section-head-centered { justify-content: center; text-align: center; }

.he-example-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1rem; }
.he-example {
  overflow: hidden; padding: 0; border: 1px solid rgba(19,32,51,.1);
  border-radius: 1rem; background: #fff; color: var(--he-ink);
  text-align: left; cursor: pointer; font: inherit;
  transition: transform 160ms ease, border-color 160ms ease, box-shadow 160ms ease;
}
.he-example:hover { transform: translateY(-2px); border-color: rgba(27,88,116,.35);
  box-shadow: 0 12px 28px rgba(19,32,51,.08); }
.he-example:focus-visible { outline: 3px solid rgba(27,88,116,.3); outline-offset: 3px; }
.he-example:disabled { opacity: .55; cursor: progress; transform: none; }
.he-example img { display: block; width: 100%; aspect-ratio: 4 / 3; object-fit: cover; background: var(--he-soft); }
.he-example > span { display: flex; flex-direction: column; gap: .2rem; padding: .85rem .9rem 1rem; }
.he-example strong { font-size: .94rem; }
.he-example small { color: var(--he-muted); font-size: .76rem; }

.he-feature-grid {
  display: grid; grid-template-columns: repeat(6, minmax(0, 1fr));
  overflow: hidden; border: 1px solid rgba(19,32,51,.09);
  border-radius: 1.25rem; background: #fff;
}
.he-feature { min-width: 0; padding: 1.35rem 1.1rem; border-right: 1px solid rgba(19,32,51,.08); }
.he-feature:last-child { border-right: 0; }
/* Das Feld ist jetzt das SVG selbst, nicht mehr eine Huelle um ein
   Schriftzeichen. `box-sizing` steht ausdruecklich dabei: ohne es waere das
   Kaestchen 34 + 2x7 = 48 px breit und die Reihe brichte frueher um. */
.he-feature-icon {
  box-sizing: border-box; display: block; width: 34px; height: 34px;
  padding: 6px; margin-bottom: 1rem;
  border-radius: .65rem; background: var(--he-soft-2); color: var(--he-petrol);
}
.he-feature strong, .he-feature > span:last-child { display: block; }
.he-feature strong { margin-bottom: .35rem; font-size: .9rem; }
.he-feature > span:last-child { color: var(--he-muted); font-size: .78rem; line-height: 1.45; }

.he-step-grid {
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1rem; max-width: 980px; margin-inline: auto;
}
.he-step { padding: 1.6rem; border: 1px solid rgba(19,32,51,.09); border-radius: 1.2rem; background: #fff; }
.he-step-number {
  display: grid; place-items: center; width: 2rem; height: 2rem; margin-bottom: 1.2rem;
  border-radius: 999px; background: var(--he-petrol); color: #fff;
  font-size: .82rem; font-weight: 800;
}
.he-step h3 { margin: 0; font-size: 1.03rem; }
.he-step p { margin: .55rem 0 0; color: var(--he-muted); font-size: .88rem; line-height: 1.6; }

/* Tablet. Die Demo darf hier nicht so schmal werden, dass die Kante
   unkenntlich wird -- deshalb behaelt sie den groesseren Anteil. */
@media (max-width: 1024px) {
  .he-hero { grid-template-columns: minmax(330px, .9fr) minmax(360px, 1fr); gap: 2.25rem; }
  .he-hero h1 { font-size: clamp(2.8rem, 6vw, 4.2rem); }
  .he-example-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .he-feature-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .he-feature { border-bottom: 1px solid rgba(19,32,51,.08); }
  .he-feature:nth-child(3n) { border-right: 0; }
  .he-feature:nth-last-child(-n + 3) { border-bottom: 0; }
}

/* Mobil: eine eigene Komposition, nicht der zusammengedrueckte Desktop.
   Die Reihenfolge entsteht aus der normalen Dokumentstruktur plus wenigen
   `order`-Angaben innerhalb der Copy-Huelle -- kein `display: contents` und
   keine negativen Margins. Die trugen zwar optisch, aber jede spaetere
   Aenderung an einem Abstand haette die Komposition zerlegt. */
@media (max-width: 700px) {
  .he-start { padding: 1.75rem 0 3.5rem; }
  .he-hero { display: flex; flex-direction: column; align-items: stretch;
             gap: 0; min-height: auto; }
  .he-hero-copy { display: flex; flex-direction: column; max-width: none; order: 1; }
  .he-hero-actions { display: flex; flex-direction: column; max-width: none; order: 3; }
  .he-kicker { order: 1; margin-bottom: .7rem; }
  .he-hero h1 { order: 2; margin: 0; font-size: clamp(2.45rem, 11vw, 3.4rem); line-height: .98; }
  .he-lead { order: 3; margin-top: 1.15rem; font-size: 1.2rem; }
  .he-sub { order: 4; margin-top: .45rem; font-size: .98rem; line-height: 1.55; }

  /* Der Produktbeweis liegt zwischen Erklaerung und Aktion: erst sehen, was
     herauskommt, dann handeln. */
  .he-proof { order: 2; margin-top: 1.5rem; }
  .he-import { order: 6; display: block; margin-top: 1.25rem; }
  .he-primary { display: flex; width: 100%; min-height: 50px; justify-content: center; }
  .he-import-hint { display: block; margin-top: .65rem; text-align: center; }
  .he-paste-row { order: 7; justify-content: center; min-height: 44px; margin-top: .5rem; }
  .he-trust { order: 8; justify-content: center; margin-top: 1rem; }
  .he-capability { order: 9; text-align: center; }
  .he-hero .tool-status { order: 10; }

  .he-section-head { align-items: flex-start; flex-direction: column; gap: .65rem; }
  .he-example-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .65rem; }
  .he-example > span { padding: .7rem; }
  .he-feature-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .he-feature { border-bottom: 1px solid rgba(19,32,51,.08); padding: 1.05rem .85rem; }
  .he-feature:nth-child(3n) { border-right: 1px solid rgba(19,32,51,.08); }
  .he-feature:nth-child(2n) { border-right: 0; }
  .he-feature:nth-last-child(-n + 2) { border-bottom: 0; }
  .he-step-grid { grid-template-columns: 1fr; }
  .he-proof-card { border-radius: 1.2rem; }
  .he-proof-top, .he-proof-bottom { padding-inline: .8rem; }
}

@media (max-width: 380px) {
  .he-hero h1 { font-size: 2.35rem; }
  .he-feature-grid { grid-template-columns: 1fr; }
  .he-feature { border-right: 0; }
  .he-proof-bottom { align-items: flex-start; flex-direction: column; gap: .2rem; }
}

/* Zeigerfaehigkeit statt Geraeteannahme: ein Tablet im Querformat ist breit
   und wird trotzdem mit dem Finger bedient. WCAG 2.2 verlangt 24 px; 44 sind
   die Groesse, bei der niemand zielen muss. */
@media (pointer: coarse) {
  .he-primary, .he-paste, .he-example, .he-file-input + .he-primary { min-height: 44px; }
}

@media (prefers-reduced-motion: reduce) {
  .he-example { transition: none; }
}


/* ═══ FAQ und Infokarte ═══════════════════════════════════════════════════
   Beim Umbau der Startflaeche sind diese Regeln mitgeloescht worden -- die
   FAQ stand danach als nackte <details>-Liste mit Browser-Dreiecken da,
   ohne Abstaende und mit Zielgroessen weit unter 44 px. Sichtbar erst im
   Browser; kein Test prueft, ob etwas huebsch ist. */

.tool-card {
  border: 1px solid rgba(19, 32, 51, .09); border-radius: 1.25rem;
  background: #fff; padding: clamp(1.25rem, 2.5vw, 2rem);
}
.tool-card-title { margin: 0 0 1rem; font-size: 1.35rem; letter-spacing: -.02em; }

.faq-list { display: grid; }
.faq-item, .info-item { border-top: 1px solid rgba(19, 32, 51, .08); }
.faq-list .faq-item:first-child { border-top: 0; }
.info-item { border-top: 0; }

.faq-item > summary, .info-item > summary {
  display: flex; align-items: center; gap: .75rem;
  padding: 1rem .25rem; min-height: 44px; cursor: pointer;
  font-size: 1rem; font-weight: 600; color: var(--ink);
  list-style: none;                /* das Browser-Dreieck ersetzen wir */
}
.faq-item > summary::-webkit-details-marker,
.info-item > summary::-webkit-details-marker { display: none; }
.faq-item > summary::before, .info-item > summary::before {
  content: ""; flex: none; width: 9px; height: 9px;
  border-right: 2px solid var(--blue); border-bottom: 2px solid var(--blue);
  transform: rotate(-45deg); transition: transform .15s ease;
}
.faq-item[open] > summary::before, .info-item[open] > summary::before {
  transform: rotate(45deg);
}
.faq-item > summary:hover, .info-item > summary:hover { color: var(--blue); }
.faq-item > summary:focus-visible, .info-item > summary:focus-visible {
  outline: 3px solid rgba(27, 88, 116, .3); outline-offset: 2px; border-radius: 6px;
}
.faq-item > p, .info-item > p {
  margin: 0 0 1rem; padding-left: 1.7rem; max-width: 72ch;
  color: var(--ink-3); font-size: .95rem; line-height: 1.65;
}

@media (prefers-reduced-motion: reduce) {
  .faq-item > summary::before, .info-item > summary::before { transition: none; }
}


/* ── Desktop-Feinschliff, bewusst am Dateiende ────────────────────────────
   Diese Regeln standen zuerst oben im Desktop-Block und blieben
   wirkungslos: die Hoehenregel des Bildes und
   `.blatt-tabs { flex-wrap: wrap }` stehen weiter unten in der Datei und
   gewinnen bei gleicher Spezifitaet ueber die Quellreihenfolge. Die Tabs
   brachen weiter um und das Bild blieb klein -- sichtbar im Screenshot,
   nicht in der Regel.

   Am Ende stehen heisst: sie gewinnen, ohne dass irgendwo ein `!important`
   noetig wird. */
@media (min-width: 960px) {
  /* Die Ergebnisflaeche bekommt die Hoehe, die da ist. */
  .ergebnisflaeche canvas,
  .ergebnisflaeche #motivCanvas { max-height: min(72vh, 780px); }
  /* IM ARBEITSMODUS IST "DIE HOEHE, DIE DA IST" DIE DER BUEHNE.
     `min(72vh, 780px)` ist eine Schaetzung des verfuegbaren Raums aus
     der Zeit, als der Editor in einer scrollenden Seite stand. Seit die
     Buehne ihre Hoehe selbst besitzt, ist die Schaetzung schlechter als
     die Messung: bei 1440x900 deckelte sie das Bild auf 648 px, waehrend
     720 zur Verfuegung standen.
     Die Regel steht hier und nicht oben, weil dieser Block laut seinem
     eigenen Kopfkommentar der Ort fuer das letzte Wort ist -- so bleibt
     die Datei ohne `!important`.
     `width`/`height: auto` bleiben stehen: die Elementbox muss so gross
     sein wie das gemalte Bild. Ein `object-fit: contain` auf einer
     groesseren Box waere huebsch und wuerde den Pinsel zerstoeren --
     Zeigerkoordinaten werden ueber `getBoundingClientRect` auf
     Canvaspixel abgebildet, und der Briefkastenrand gehoert nicht dazu. */
  /* DAS EINPASSEN TRAEGT DIE FLAECHE, NICHT DAS CANVAS.
     Hier stand `width/height: auto` -- das skaliert nur HERUNTER, und
     ein 348x400 grosses Bild stand damit auf der halben Buehnenhoehe.
     Seit dem 2026-09-22 traegt `.ergebnisflaeche` das Seitenverhaeltnis
     (`--bild-ar` aus `male()`) und wird selbst eingepasst; das Canvas
     fuellt sie nur noch aus. Die Elementbox bleibt dabei exakt das
     gemalte Bild -- anders als bei `object-fit`, dessen Briefkastenrand
     jeden Zeigerpfad zerstoeren wuerde.
     Diese Regel steht am Ende der Datei und gewinnt; die erste Fassung
     des Fixes hat nur das FRUEHERE der beiden Vorkommen ersetzt und
     deshalb nichts bewirkt. */
  [data-he-modus="arbeit"] .ergebnisflaeche canvas,
  [data-he-modus="arbeit"] .ergebnisflaeche #motivCanvas {
    width: 100%; height: 100%; max-width: none; max-height: none;
  }
  /* Fuenf Reiter in 360 px: eng, aber in einer Zeile. Zwei Zeilen sehen aus,
     als waere der fuenfte etwas anderes als die ersten vier. */
  .blatt-tabs { flex-wrap: nowrap; }
  .blatt-tab { padding: 8px 6px; font-size: 12.5px; white-space: nowrap; }
}

/* ── Das Bedienfeld als Werkzeugkasten, nicht als Formular ────────────
   Am 2026-09-22 gemessen: bei 1440x900 blieben 294 von 792 px des
   Panels leer, bei 1920x1080 sogar 474 von 972 -- fast die Haelfte.
   Gleichzeitig war das Hauptwerkzeug ein Paar kleiner Textknoepfe unter
   einem Regler. Beides zusammen ergab den Eindruck, den der Screenshot
   zeigte: viel Flaeche, wenig Werkzeug.

   Der Leerraum verschwindet nicht durch Strecken -- ein Panel, das sich
   fuellt, indem es Abstaende aufblaest, ist danach leer UND traege.
   Stattdessen wird das Wichtige groesser und das Beiwerk enger. */
[data-he-modus="arbeit"] .blatt-inner { padding: 14px 16px 16px; }
[data-he-modus="arbeit"] .blatt-tabs {
  margin: -2px -4px 10px; padding-bottom: 6px; gap: 2px;
}
[data-he-modus="arbeit"] .blatt-kopf { margin-bottom: 8px; }
[data-he-modus="arbeit"] .insp-hinweis { margin: 6px 0 12px; font-size: 12.5px; }
[data-he-modus="arbeit"] .insp-feld { margin-bottom: 14px; }

/* Das Hauptwerkzeug traegt sein Gewicht sichtbar: hoehere Ziele, klare
   Trennung, und der aktive Zustand ist auf einen Blick erkennbar. */
.segmente-gross { display: flex; }
.segmente-gross .seg {
  flex: 1; min-height: 52px; font-size: 15px; font-weight: 600;
}
.insp-werkzeug > span {
  font-weight: 600; color: var(--ink-2);
}
/* Zwei Knoepfe ohne Trennung lesen sich als ein Feld. Die Linie macht
   aus ihnen ein Paar, aus dem man WAEHLT -- und genau das ist hier die
   Aufgabe: ein Werkzeug, nicht zwei Aktionen. */
.segmente-gross .seg + .seg { border-left: 1px solid var(--line-2); }

/* ── Bei offenem Blatt macht das Bild Platz ───────────────────────────
   Am Ende der Datei, weil genau diese Regel am 2026-09-22 dreimal
   verloren hat: gleiche Spezifitaet, frueherer Ort. Hier gewinnt sie
   ohne `!important`.
   Sie gilt nur dort, wo das Blatt wirklich ueber dem Bild liegt -- auf
   dem Desktop docket es an und verdeckt nichts. */
@media (max-width: 959.98px) {
  /* Die BUEHNE endet ueber dem Blatt, nicht das Bild irgendwo darin.
     `--blatt-h` misst ein ResizeObserver, genau wie `--leiste-h`: die
     Hoehe haengt vom gewaehlten Werkzeug ab. Der Vorgabewert traegt den
     Fall, dass kein Skript laeuft. */
  [data-he-modus="arbeit"] .editor.hat-panel .buehne {
    /* Das Blatt liegt bei `bottom: leiste-h + 12` und ist `blatt-h`
       hoch; der Editor traegt unten bereits `leiste-h + 8`. Bis zur
       Blattoberkante fehlen also genau `blatt-h + 4`.
       `max()` ist die Notbremse: ein sehr hohes Blatt wuerde die Buehne
       sonst auf null druecken, und der Mensch korrigierte an einem Bild,
       das er gar nicht mehr sieht -- schlimmer als ein verdecktes. */
    max-height: max(22vh, calc(100% - var(--blatt-h, 46vh) - 4px));
  }
}

/* ── Das aufgeklappte Blatt darf den Schirm nicht besetzen ────────────
   Am 2026-09-22 auf dem Telefon gemessen, bevor der Mensch den ersten
   Pinsel waehlt:

       Blatt 446 px = 53 % des Schirms   ->   Bild 126 px

   Sobald er streicht, klappt das Blatt in eine schmale Zeile und das
   Bild bekommt den ganzen Schirm -- der Arbeitszustand war nie das
   Problem. Der ZWISCHENZUSTAND war es: wer das Werkzeug gerade erst
   oeffnet, sieht kaum noch, woran er arbeitet.

   Gedeckelt statt gekuerzt: der Inhalt bleibt vollstaendig erreichbar,
   er scrollt nur. Das Hauptwerkzeug steht seit dem UX-Umbau ganz oben
   und ist damit immer ohne Scrollen sichtbar -- die Empfindlichkeit,
   die niemand vor dem ersten Strich braucht, rutscht unter die Kante.

   `dvh` und nicht `vh`: auf dem Telefon faehrt die Adressleiste ein und
   aus, und `vh` rechnet mit dem groesseren Zustand. */
@media (max-width: 959.98px) {
  [data-he-modus="arbeit"] .blatt-inner { max-height: 42dvh; }
}

/* ══ V15 · GESTALTEN UND DAUMENLEISTE ══════════════════════════════════
   Am Ende der Datei, damit diese Regeln ohne `!important` gewinnen --
   die drei Kaskadenfallen vom 2026-09-22 stehen im Workspace-Vertrag.

   Gemessen am 2026-09-23 auf 390x844, "Korrigieren" offen:
       Blatt 354 px + Leiste 111 px = 55 % des Schirms, Bild 242x181.
   Und beim Streichen zeigte die eingeklappte Zeile nur "x" und einen
   Hinweis: welcher Pinsel gilt, stand nirgends, und wer umschalten oder
   die Groesse aendern wollte, musste die 55 % wieder aufklappen. */

/* Die Wahl unter "Gestalten": drei Karten, die sagen, wofuer. */
.gestalten-karten { display: grid; gap: 8px; }
.gestalten-karte {
  display: flex; flex-direction: column; align-items: flex-start; gap: 2px;
  border: 1px solid var(--line-2); border-radius: 10px; background: var(--white);
  font: inherit; font-size: 15px; font-weight: 600; color: var(--ink-2);
  padding: 12px 14px; min-height: 56px; cursor: pointer; text-align: left;
}
.gestalten-karte small { font-size: 12.5px; font-weight: 400; color: var(--ink-4); }
.gestalten-karte:hover { border-color: var(--blue-soft); background: var(--blue-tint); }
.gestalten-wahl { display: flex; width: 100%; margin-bottom: 14px; }
.gestalten-wahl .seg { flex: 1; }
.gestalten-wahl .seg + .seg { border-left: 1px solid var(--line-2); }

@media (min-width: 960px) {
  /* Drei Reiter tragen wieder normale Schrift -- die Enge war den fuenf
     geschuldet. */
  .blatt-tab { flex: 1; padding: 8px 10px; font-size: 13.5px; }
}

@media (max-width: 959.98px) {
  /* ── Eine Zeile: drei Werkzeuge links, Verlauf und Export rechts ── */
  .leiste {
    flex-wrap: nowrap; justify-content: space-between; align-items: center;
    gap: 4px; padding: 6px 8px calc(6px + env(safe-area-inset-bottom, 0px));
  }
  .lz {
    flex: 1 1 0; min-width: 0; display: flex; flex-direction: column;
    align-items: center; justify-content: center; gap: 2px;
    border: 0; background: transparent; border-radius: 10px;
    padding: 4px 2px; min-height: 52px; font-size: 11.5px; color: var(--ink-3);
  }
  .lz span { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
  .lz-ico {
    width: 22px; height: 22px; fill: none; stroke: currentColor;
    stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round;
  }
  .lz:hover { background: var(--blue-tint); border: 0; }
  .lz.is-aktiv { background: var(--blue-tint); color: var(--blue); border: 0; }
  /* Gemessen bei 390 px: "Hintergrund" braucht 66 px, "Korrigieren" 60,
     "Gestalten" 53. Mit Trennlinie und 44er-Pfeilen blieben je 60 --
     "Korrigie..." und "Hintergr...". Die Pfeile werden deshalb 40 breit
     (die Hoehe bleibt 44, darauf kommt es beim Tippen an), die
     Trennlinie entfaellt, und die Werkzeuge teilen den Rest nach
     Bedarf statt zu gleichen Teilen. */
  .lz { flex: 1 1 auto; }
  .leiste .editor-kopf-rechts { flex: 0 0 auto; display: flex; gap: 4px; margin-left: 2px; }
  .leiste #btnZurueck, .leiste #btnVor {
    min-width: 40px; width: 40px; min-height: 44px; padding: 0;
    border-color: transparent; background: transparent;
    font-size: 22px; color: var(--ink-2);
  }
  .leiste #btnZurueck:disabled, .leiste #btnVor:disabled { color: var(--line-2); }
  .leiste #btnExport { min-height: 44px; padding: 0 14px; }

  /* ── Das offene Blatt: hoechstens 30 % ──
     Bei 42dvh war die Empfindlichkeit schon im Blick, bevor jemand den
     ersten Strich zog. Oben stehen Pinsel und Pinselgroesse; alles
     Weitere scrollt, bleibt aber vollstaendig erreichbar. */
  [data-he-modus="arbeit"] .blatt-inner { max-height: 30dvh; padding: 10px 14px 12px; }
  [data-he-modus="arbeit"] .blatt-kopf { margin-bottom: 0; }
  .blatt-kopf h2 { font-size: 15px; }
  .blatt-zu { width: 44px; height: 44px; }
  /* Die Ueberschrift des Blatts sagt schon "Korrigieren" -- die zweite,
     gleichlautende Zeile darunter kostete 30 px. Auf dem Desktop fehlt
     die Blattueberschrift, dort bleibt sie stehen. */
  .insp-werkzeug > span { display: none; }
  [data-he-modus="arbeit"] .blatt-inhalt { margin-top: 4px; }

  /* ── Beim Streichen: eine Werkzeugzeile statt eines Hinweises ──
     Pinsel und Pinselgroesse bleiben sichtbar und bedienbar, alles
     andere tritt ab. Umschalten kostet damit einen Tipp, nicht das
     Aufklappen des ganzen Blatts. Das "x" beendet den Pinsel. */
  .blatt.ist-kompakt .blatt-inner { position: relative; max-height: none; padding: 8px 60px 8px 12px; }
  .blatt.ist-kompakt .blatt-kopf { position: absolute; top: 8px; right: 8px; }
  .blatt.ist-kompakt .blatt-kopf::after { content: none; }
  .blatt.ist-kompakt .blatt-inhalt {
    max-height: none; margin-top: 0; overflow: visible; opacity: 1;
  }
  .blatt.ist-kompakt .blatt-inhalt > :not(.kompakt-bleibt) { display: none; }
  .blatt.ist-kompakt .kompakt-bleibt { margin: 0; }
  .blatt.ist-kompakt .kompakt-bleibt + .kompakt-bleibt { margin-top: 6px; }
  .blatt.ist-kompakt .segmente-gross .seg { min-height: 44px; font-size: 14px; }
  .blatt.ist-kompakt .kompakt-bleibt .insp-feld {
    display: grid; grid-template-columns: auto 1fr auto; align-items: center;
    gap: 10px; margin: 0; min-height: 44px;
  }
  .blatt.ist-kompakt .kompakt-bleibt .insp-feld > span { margin: 0; font-size: 12.5px; }
}

/* ══ V15 · FARBWELT DER STARTSEITE: PETROLNACHT UND SCHNITTGOLD ═══════
   Eine eigene Palette, abgeleitet aus den beiden Farben der Bildmarke --
   Petrol #1B4965 und Gold #C8920A --, nicht aus einem Framework-Satz.
   Die Idee dahinter: Gold ist die SCHNITTKANTE. Wo das Werkzeug trennt,
   leuchtet es; alles andere bleibt ruhige Petrolnacht.

   Kontraste gegen den Grund #061419 (WCAG 2.2, nachgerechnet):
       Text #edf5f4 16,9 : 1   gedaempft #a8c1c5 9,9 : 1
       Gold #f0c26a 11,3 : 1   Lagune #7fd0dc 10,7 : 1
       Knopftext #061419 auf Gold #e8b04a 9,6 : 1

   SEIT V17 DAS DUNKLE THEMA, NICHT MEHR DIE VORGABE. Das Oekosystem
   (www.kukanilea.de) zeigt hell zuerst und dunkel auf Wunsch; der
   Umschalter kommt aus der Shell, gespeichert unter `kuk-theme`.

   Gilt NUR auf der Startflaeche. Der Arbeitsmodus bleibt, wie er ist:
   die Buehne ist ohnehin dunkel, und die Bedienfelder sind am
   2026-09-22 gemessen und abgenommen. */
:root {
  --pn-grund: #061419;
  --pn-grund-2: #0b222b;
  --pn-flaeche: #0f2a35;
  --pn-glas: rgba(16, 46, 58, .58);
  --pn-linie: rgba(170, 214, 222, .14);
  --pn-linie-2: rgba(170, 214, 222, .24);
  --pn-text: #edf5f4;
  --pn-text-2: #a8c1c5;
  --pn-gold: #e8b04a;
  --pn-gold-hell: #f0c26a;
  --pn-lagune: #7fd0dc;
  /* DAS TRANSPARENZMUSTER BLEIBT HELL -- wie im Editor.
     Ein dunkles Muster zeigte am 2026-09-23 einen hellen Saum um den
     Apfel, den das Werkzeug selbst auf seinem hellen Schachbrett nicht
     zeigt: Randpixel mit Weissanteil aus dem Originalhintergrund. Der
     Hero soll zeigen, was der Mensch danach im Werkzeug sieht -- nicht
     schoener und nicht haesslicher. Der Saum ist als Engine-Befund
     gemeldet, nicht hier versteckt. Leicht ins Petrol getoent, damit
     das Muster zur Marke gehoert. */
  --pn-karo-a: #dde8ea;
  --pn-karo-b: #f4f8f8;
}
:root {
  /* Bauteilwerte fuer Regler und Tabelle, die in BEIDEN Themen stehen.
     Hell ist die Vorgabe (wie auf www: hell zuerst); die Werte darunter
     gelten nur im dunklen Thema. Kontraste auf Weiss: Text 16,4 : 1,
     gedaempft 7,1 : 1, Goldschrift 5,8 : 1. */
  --ht-text: #132033;
  --ht-text-2: #4a5a6d;
  --ht-linie: rgba(19, 32, 51, .1);
  --ht-akzent-text: #8a5d00;
  --ht-naht: #c8920a;
  --ht-griff: #ffffff;
  --ht-fokus: #1b5874;
  --ht-wir: rgba(200, 146, 10, .07);
}
html[data-theme="dark"] {
  --ht-text: var(--pn-text);
  --ht-text-2: var(--pn-text-2);
  --ht-linie: var(--pn-linie);
  --ht-akzent-text: var(--pn-gold-hell);
  --ht-naht: var(--pn-gold-hell);
  --ht-griff: var(--pn-grund);
  --ht-fokus: var(--pn-lagune);
  --ht-wir: rgba(232, 176, 74, .07);
}
.visually-hidden {
  position: absolute !important; width: 1px; height: 1px; margin: -1px;
  padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}

html[data-theme="dark"]:not([data-he-modus="arbeit"]) body { background: var(--pn-grund); color: var(--pn-text); }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) { color-scheme: dark; }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) a { color: var(--pn-lagune); }

html[data-theme="dark"]:not([data-he-modus="arbeit"]) .site-header {
  background: rgba(6, 20, 25, .82); border-bottom-color: var(--pn-linie);
  -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px);
}
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .brand { color: var(--pn-text); }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .brand-sub.tool-suite { color: var(--pn-gold-hell); }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .header-actions a.text-link { color: var(--pn-text); }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .header-actions a.text-link:hover { color: var(--pn-gold-hell); }

html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-start,
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-arbeit {
  --he-ink: var(--pn-text);
  --he-muted: var(--pn-text-2);
  --he-line: var(--pn-linie-2);
  --he-soft: var(--pn-flaeche);
  --he-soft-2: rgba(232, 176, 74, .12);
  --he-petrol: var(--pn-gold-hell);
}
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-start {
  background:
    radial-gradient(60rem 36rem at 82% -8%, rgba(27, 73, 101, .55), transparent 70%),
    radial-gradient(40rem 30rem at 8% 38%, rgba(200, 146, 10, .07), transparent 70%),
    linear-gradient(180deg, var(--pn-grund) 0, var(--pn-grund-2) 55%, var(--pn-grund) 100%);
}
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-hero h1 {
  background: linear-gradient(100deg, #ffffff 0%, #d9ecee 55%, var(--pn-gold-hell) 100%);
  -webkit-background-clip: text; background-clip: text; color: transparent;
}
@media (forced-colors: active) {
  html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-hero h1 { background: none; color: CanvasText; }
}

/* Der eine Hauptweg traegt Gold, alles andere nicht. */
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .btn-primary.he-primary {
  background: var(--pn-gold); color: var(--pn-grund);
  box-shadow: 0 10px 30px -10px rgba(232, 176, 74, .55);
}
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .btn-primary.he-primary:hover { background: var(--pn-gold-hell); }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-import.ist-ziel .he-primary,
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-file-input:focus-visible + .he-primary {
  outline-color: var(--pn-lagune);
}
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-shortcut kbd {
  background: var(--pn-flaeche); border-color: var(--pn-linie-2);
  box-shadow: none; color: var(--pn-text);
}
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-trust { color: var(--pn-text); }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .tool-status { color: var(--pn-text-2); }

/* Glas nur dort, wo etwas darunter liegt -- die Karten ueber dem Verlauf. */
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-proof-card,
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-example,
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-feature-grid,
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-step,
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-arbeit,
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .tool-card,
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-tabelle-huelle {
  background: var(--pn-glas); border-color: var(--pn-linie);
  -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px);
  color: var(--pn-text);
}
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-proof-card {
  box-shadow: 0 40px 90px -30px rgba(0, 0, 0, .7), 0 0 0 1px rgba(232, 176, 74, .08);
}
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-proof-top { color: var(--pn-text-2); }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-example:hover {
  border-color: rgba(232, 176, 74, .45); box-shadow: 0 16px 36px -18px rgba(0, 0, 0, .8);
}
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-example:focus-visible { outline-color: var(--pn-lagune); }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-feature,
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-feature:nth-child(n) { border-color: var(--pn-linie); }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .he-step-number { background: var(--pn-gold); color: var(--pn-grund); }

html[data-theme="dark"]:not([data-he-modus="arbeit"]) .faq-item,
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .info-item { border-color: var(--pn-linie); }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .faq-item > summary,
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .info-item > summary { color: var(--pn-text); }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .faq-item > summary:hover,
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .info-item > summary:hover { color: var(--pn-gold-hell); }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .faq-item > summary::before,
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .info-item > summary::before { border-color: var(--pn-gold-hell); }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .faq-item > p,
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .info-item > p,
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .tool-card p,
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .tool-card li { color: var(--pn-text-2); }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .site-footer { border-top-color: var(--pn-linie); }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .ft-row,
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .ft-links a { color: var(--pn-text-2); }

/* ── Der Vergleichsregler ──
   Zwei deckungsgleiche Ebenen; das Ergebnis liegt oben und wird ab der
   Naht gezeigt. `clip-path` statt Breite: das Bild darin bleibt still
   stehen, nur die Grenze wandert -- sonst verschoebe sich das Motiv
   beim Ziehen, und der Vergleich waere keiner. */
.he-vergleich { --naht: 50%; position: relative; overflow: hidden; }
.he-vergleich .he-proof-picture { background: #fff; }
.he-nachher-ebene {
  position: absolute; inset: 0; clip-path: inset(0 0 0 var(--naht));
  background-color: var(--pn-karo-b);
  background-image:
    linear-gradient(45deg, var(--pn-karo-a) 25%, transparent 25%),
    linear-gradient(-45deg, var(--pn-karo-a) 25%, transparent 25%),
    linear-gradient(45deg, transparent 75%, var(--pn-karo-a) 75%),
    linear-gradient(-45deg, transparent 75%, var(--pn-karo-a) 75%);
  background-size: 22px 22px;
  background-position: 0 0, 0 11px, 11px -11px, -11px 0;
}
/* Das Muster zieht langsam -- ein Hinweis, dass dort NICHTS ist, kein
   Schmuck. Wer weniger Bewegung will, bekommt ein stehendes Muster. */
@media (prefers-reduced-motion: no-preference) {
  .he-nachher-ebene { animation: pn-karo 14s linear infinite; }
  @keyframes pn-karo { to { background-position: 22px 0, 22px 11px, 33px -11px, 11px 0; } }
}
.he-nachher, .he-nachher img { display: block; width: 100%; height: 100%; }
.he-nachher img { aspect-ratio: 4 / 3; object-fit: cover; }
.he-naht {
  position: absolute; top: 0; bottom: 0; left: var(--naht); width: 2px;
  margin-left: -1px; background: var(--ht-naht); pointer-events: none;
  box-shadow: 0 0 18px rgba(240, 194, 106, .75);
}
.he-naht-griff {
  position: absolute; top: 50%; left: 50%; width: 44px; height: 44px;
  margin: -22px 0 0 -22px; border-radius: 999px;
  background: var(--ht-griff); border: 2px solid var(--ht-naht);
  box-shadow: 0 6px 20px rgba(0, 0, 0, .5);
}
.he-naht-griff::before, .he-naht-griff::after {
  content: ""; position: absolute; top: 50%; width: 7px; height: 7px;
  margin-top: -4px; border: solid var(--ht-naht); border-width: 0 0 2px 2px;
}
.he-naht-griff::before { left: 10px; transform: rotate(45deg); }
.he-naht-griff::after { right: 10px; transform: rotate(-135deg); }
/* Der Regler liegt unsichtbar ueber der ganzen Flaeche und nimmt Maus,
   Finger und Tastatur entgegen. `pan-y`: senkrecht wischen scrollt die
   Seite weiter, nur waagerecht verschiebt es die Naht. */
.he-vergleich-regler {
  position: absolute; inset: 0; width: 100%; height: 100%; margin: 0;
  opacity: 0; cursor: ew-resize; touch-action: pan-y;
  -webkit-appearance: none; appearance: none;
}
.he-vergleich-regler:focus-visible ~ .he-naht .he-naht-griff,
.he-vergleich:has(.he-vergleich-regler:focus-visible) .he-naht-griff {
  outline: 3px solid var(--ht-fokus); outline-offset: 3px;
}

/* ── Die Vergleichstabelle ── */
.he-vergleichstabelle { margin-top: clamp(4.5rem, 8vw, 8rem); }
.he-tabelle-huelle {
  max-width: 860px; margin-inline: auto; overflow-x: auto;
  border: 1px solid var(--ht-linie); border-radius: 1.25rem; background: #fff;
}
.he-tabelle { width: 100%; border-collapse: collapse; font-size: .95rem; }
.he-tabelle th, .he-tabelle td {
  padding: .95rem 1.1rem; text-align: left; vertical-align: top;
  border-bottom: 1px solid var(--ht-linie);
}
.he-tabelle tbody tr:last-child th, .he-tabelle tbody tr:last-child td { border-bottom: 0; }
.he-tabelle thead th {
  font-size: .76rem; font-weight: 800; letter-spacing: .08em; text-transform: uppercase;
  color: var(--ht-text-2);
}
.he-tabelle tbody th { font-weight: 600; color: var(--ht-text); width: 34%; }
.he-tabelle td { color: var(--ht-text-2); }
.he-tabelle .he-tabelle-wir { color: var(--ht-text); font-weight: 650; background: var(--ht-wir); }
.he-tabelle thead .he-tabelle-wir { color: var(--ht-akzent-text); }
.he-tabelle tbody .he-tabelle-wir::before {
  content: ""; display: inline-block; width: .5rem; height: .5rem; margin-right: .55rem;
  border-radius: 999px; background: var(--ht-naht); vertical-align: .08em;
}
@media (max-width: 700px) {
  .he-tabelle { font-size: .86rem; }
  .he-tabelle th, .he-tabelle td { padding: .75rem .7rem; }
  .he-tabelle tbody th { width: auto; }
}

@media (max-width: 380px) {
  /* 360 px: dieselbe Zeile, eine Stufe kleiner -- abgeschnitten wird
     nur, was auch dann nicht passt. */
  .leiste { gap: 2px; padding-inline: 4px; }
  .lz { font-size: 10.5px; padding-inline: 1px; }
  .leiste #btnExport { padding: 0 10px; }
}

/* ── Die Scan-Linie waehrend der Verarbeitung ──
   Nur ueber dem markierten Bild, nur solange `aria-busy="true"` -- also
   solange die Pipeline wirklich arbeitet. Sie ist Bewegung, keine
   Anzeige: der Stand kommt aus den echten Stufen im Balken darunter, und
   die Linie laeuft gleichmaessig, egal wie weit die Rechnung ist.
   `transform` statt `top`: das rechnet der Compositor, nicht der
   Hauptthread, auf dem gerade die Erkennung laeuft. */
.he-arbeit-bild {
  position: relative; overflow: hidden; margin: 0 auto .85rem;
  width: fit-content; max-width: 100%; border-radius: 10px;
  background: #fff; line-height: 0;
}
.he-arbeit-bild canvas { display: block; max-width: 100%; height: auto; }
.he-scan {
  /* Ein Element in voller Bildhoehe, dessen UNTERKANTE die Linie ist.
     `translateY` in Prozent bezieht sich auf die eigene Hoehe -- also
     genau auf die Bildhoehe. Keine Messung, kein Zustand im Skript: die
     erste Fassung mass die Hoehe, waehrend die Karte noch versteckt war,
     und bekam 0. */
  position: absolute; inset: 0; transform: translateY(-100%);
  border-bottom: 3px solid #f0c26a;
  box-shadow: 0 10px 18px -8px rgba(240, 194, 106, .7);
  opacity: 0; pointer-events: none;
}
/* Bei reduzierter Bewegung gibt es keine Linie -- eine stehende Linie
   am oberen Rand saehe aus wie ein Fehler, und der Balken sagt ohnehin
   alles. */
@media (prefers-reduced-motion: no-preference) {
  .he-arbeit[aria-busy="true"] .he-scan {
    opacity: 1; animation: he-scan 2.4s ease-in-out infinite alternate;
  }
  @keyframes he-scan {
    from { transform: translateY(-100%); }
    to { transform: translateY(0); }
  }
}

/* ── Export ist die Ausnahme vom 30dvh-Deckel ──
   Der Deckel schuetzt das Bild, WAEHREND daran gearbeitet wird. Beim
   Export wird nicht mehr korrigiert -- und bei 30dvh lag "PNG
   herunterladen", die eine Aktion, fuer die das Blatt geoeffnet wurde,
   unter der Kante (live 2026-09-24, 390x844). */
@media (max-width: 959.98px) {
  [data-he-modus="arbeit"] .editor[data-werkzeug="export"] .blatt-inner { max-height: 72dvh; }
}

/* KUK-SHELL:CSS:ANFANG -- ERZEUGT, NICHT VON HAND AENDERN.
   Owner: scripts/ops/sync_webtool_shell.py

   `.tool-weiter` ist die kontextuelle Produktnavigation, die beim Umbau
   aus dem Footer geloest wurde. Sie sieht dem Footer bewusst aehnlich --
   sie steht an derselben Stelle der Seite --, ist aber ein eigener
   Bereich mit eigenem zugaenglichen Namen.

   Sie faellt weg, wenn sie leer ist: ein Werkzeug ohne verwandte
   Werkzeuge bekommt keine leere Leiste. */
/* EIN AUSWAHLFELD IST SO BREIT WIE SEINE LAENGSTE OPTION.
   Das ist Browservorgabe und kein Fehler des Werkzeugs: die
   intrinsische Mindestbreite eines `<select>` kommt aus dem laengsten
   Eintrag, und `min-width: auto` laesst es nicht darunter.

   Am 2026-09-22 ueber 186 Werkzeuge bei 320 CSS px gemessen. Es war
   die haeufigste Einzelursache fuer waagerechtes Seitenscrollen:
   "Windows-1252 / ANSI (ältere Excel-Exporte)" macht ein Feld 331 px
   breit, wo 238 zur Verfuegung stehen -- und die ganze Seite wird
   breiter als das Fenster. WCAG 1.4.10 verlangt 320 CSS px ohne
   zweidimensionales Scrollen; 320 px sind ausdruecklich auch der
   Zoomfall 400 % an einem 1280-px-Bildschirm, also kein Sonderfall
   fuer kleine Telefone.

   Dieselbe Falle steht in `.claude/rules/autonomer-maximum-modus.md`
   schon einmal beschrieben -- damals mit 409 px in einem 390 px
   breiten Bildschirm.

   `max-inline-size` statt `width`: die Felder behalten ihre gesetzte
   Breite, wo Platz ist, und geben nur nach, wenn es eng wird. Die
   Vorfahren brauchen `min-inline-size: 0`, weil ein Flex- oder
   Grid-Element sonst nicht unter seinen Inhalt schrumpft -- ohne das
   verschiebt die Regel den Ueberlauf nur eine Ebene nach oben. */
:where(select, input, textarea) {
  max-inline-size: 100%;
  min-inline-size: 0;
}
:where(.form-field, .option-field, .option-row, .field, .tool-card) {
  min-inline-size: 0;
}

/* UND EIN UNTEILBARES WORT HAELT EINE GANZE SEITE AUSEINANDER.
   `Einzelunternehmen/Personengesellschaft` hat keine Umbruchstelle --
   ein Schraegstrich ohne Leerzeichen ist keine. Der Chip wurde damit
   312 px breit in einer 219 px breiten Gruppe, obwohl sie laengst
   `flex-wrap: wrap` traegt: umbrechen kann nur, was sich teilen
   laesst. Gemessen an `gewerbesteuer`, dieselbe Bauform steht in 235
   Werkzeugen.

   `anywhere` und nicht `break-word`: nur `anywhere` senkt auch die
   INTRINSISCHE Mindestbreite, und genau die verhindert hier das
   Schrumpfen. `break-word` bricht erst beim Zeichnen und aendert an
   der Ueberlaufrechnung nichts.

   Beschraenkt auf Beschriftungen von Bedienelementen: im Fliesstext
   waere ein Umbruch mitten im Wort eine Verschlechterung, hier ist er
   die Alternative zu abgeschnittenem Text. */
:where(.chip, .check-tile, .sn-template-btn) {
  max-inline-size: 100%;
  overflow-wrap: anywhere;
}

/* EINE FLEXZEILE BRICHT NICHT VON ALLEIN UM.
   `display: flex` ohne `flex-wrap` ist `nowrap` -- die Vorgabe des
   Browsers, und in einer Zeile mit drei Auswahlknoepfen ist sie bei
   320 CSS px falsch. `.vz-radio-group` steht in 235 Werkzeugen und
   trug sie ueberall; aufgefallen ist es an `kuendigungsschreiben`
   (+40 px), `mahnung` (+3) und `impressum` (+33).

   Umgebrochen wird nur, wo es sonst nicht passt: solange Platz ist,
   aendert `wrap` nichts an der Darstellung. */
:where(.vz-radio-group, .checkbox-label, .chip-group, .seg-group,
       .diff-mode-group, .json-toolbar, .tool-actions) {
  flex-wrap: wrap;
}
/* Eine Beschriftung, die ein Bedienelement umschliesst, ist selbst ein
   Kasten und muss genauso nachgeben koennen. Bei `camt053-viewer` war
   sie 287 px breit in einem 238 px breiten Feld -- das Dateifeld darin
   bringt seine eigene Mindestbreite mit. */
label { max-inline-size: 100%; min-inline-size: 0; }

/* UND EIN LANGES WORT IM FLIESSTEXT RAGT EINFACH HERAUS.
   "(monatlich/vierteljährlich/befreit)" hat keine Umbruchstelle; der
   Listeneintrag blieb 179 px breit und sein Text lief 63 px darueber
   hinaus. Gemessen an `ust-voranmeldung`, `kuendigungsfrist-schweiz`
   und `buchfuehrungspflicht`.

   `break-word` und nicht `anywhere`: hier ist die Kastenbreite
   richtig, nur der Text passt nicht. `break-word` greift genau dann
   -- und laesst die Mindestbreitenrechnung in Ruhe, damit sich an
   Rastern und Flexzeilen nichts still verschiebt. */
body { overflow-wrap: break-word; }

.tool-weiter {
  border-top: 1px solid var(--line);
  padding: 22px 0 4px;
  margin-top: 40px;
}
.tool-weiter + .site-footer { margin-top: 20px; }
.tool-weiter:empty { display: none; }
/* ── Passend zu diesem Werkzeug: Kacheln wie im Store (2026-10-02) ──
   Mausfirst und fingerfirst: jede Kachel ist ein grosses Ziel (mind.
   60 px), das Gesicht kommt aus dem Store, der Name bricht hoechstens
   zweimal um und wird sonst gekuerzt. */
/* GRAU AUS DER TEXTFARBE, NICHT AUS EINER VARIABLEN DES HELLEN THEMAS
   (2026-10-02). `var(--ink-4)` ist das Grau des hellen Themas; ein Werkzeug
   mit dunklem Thema, das die Variable nicht neu setzt, zeigte den Titel mit
   2,82:1 auf fast schwarzem Grund (gemessen auf hintergrund-entfernen) --
   unter WCAG AA. Aus der Textfarbe gemischt traegt dieselbe Regel beide
   Themen: dunkle Schrift auf hell, helle auf dunkel. */
.weiter-titel {
  margin: 0 0 12px; font-size: 12px; font-weight: 700;
  letter-spacing: .06em; text-transform: uppercase;
  color: color-mix(in srgb, currentColor 72%, transparent);
}
.weiter-liste {
  list-style: none; margin: 0; padding: 0;
  /* minmax(0, ...) und nicht 1fr: ein Rasterfeld mit `1fr` schrumpft nicht
     unter das laengste Wort seines Inhalts -- "Sachbezugswerte-,
     Betriebsveranstaltungs-, ..." machte die Seite auf dem Telefon 463
     statt 390 px breit (gemessen an afa, 2026-10-02). */
  display: grid; grid-template-columns: repeat(auto-fill, minmax(min(230px, 100%), 1fr));
  gap: 10px;
}
.weiter-kachel {
  display: flex; align-items: center; gap: 12px;
  min-height: 60px; padding: 10px 12px; box-sizing: border-box;
  min-width: 0; border-radius: 12px;
  /* Der Rand ebenso aus der Schriftfarbe: `--line` ist in manchen dunklen
     Themen fast weiss und machte aus jeder Kachel einen harten Kasten. */
  border: 1px solid color-mix(in srgb, currentColor 16%, transparent);
  /* Aus der Textfarbe gemischt statt aus `--white`: dieselbe Kachel traegt
     helles und dunkles Thema, auch wo ein Werkzeug `--white` nicht kennt. */
  background: color-mix(in srgb, currentColor 3%, transparent);
  color: inherit; text-decoration: none;
  transition: border-color .15s ease, box-shadow .15s ease, transform .15s ease;
}
.weiter-kachel .kuk-kachel { width: 40px; height: 40px; }
/* Silbentrennung statt Bruch mitten im Wort: `anywhere` machte auf dem
   Telefon "Anlageverzeichni|s" daraus. `hyphens: auto` trennt nach der
   Sprache des Dokuments (lang="de") -- "Anlage-verzeichnis". */
.weiter-name {
  min-width: 0; overflow-wrap: break-word; hyphens: auto; -webkit-hyphens: auto;
  font-size: 14px; font-weight: 600; line-height: 1.3;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden;
}
.weiter-text { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
/* Das Laenderetikett wie im Store: klein, aber ausgesprochen. Wer aus
   einem oesterreichischen Werkzeug kommt, sieht vor dem Klick, dass das
   naechste deutsches Recht rechnet. */
.kuk-land {
  display: inline-block; font-size: 11px; font-weight: 700;
  letter-spacing: .05em; line-height: 1.2;
  color: color-mix(in srgb, currentColor 72%, transparent);
}
.kuk-launcher-text .kuk-land { margin-left: 8px; }
.kuk-vh {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip-path: inset(50%); white-space: nowrap;
}
@media (hover: hover) {
  .weiter-kachel:hover {
    border-color: var(--blue); transform: translateY(-2px);
    box-shadow: 0 10px 18px -12px rgba(18, 54, 64, .45);
  }
}
@media (max-width: 560px) {
  .weiter-liste { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
  .weiter-kachel { gap: 9px; padding: 9px 10px; }
  .weiter-kachel .kuk-kachel { width: 34px; height: 34px; }
  .weiter-name { font-size: 13px; }
}
@media (prefers-reduced-motion: reduce) {
  .weiter-kachel { transition: none; }
  .weiter-kachel:hover { transform: none; }
}

/* ── Die Marke traegt ihre Flaeche (2026-10-02) ──────────────────────
   `mark-onpetrol.svg` ist fuer einen petrolfarbenen Grund gezeichnet.
   Auf den Werkzeugen stand sie ohne ihn auf Weiss und zerfiel in
   verstreute Punkte -- genau der Eindruck eines beliebigen Symbols, den
   eine Marke nicht machen darf. Auf www sitzt sie in einer Kachel
   (styles-v2.css .brand-mark); hier jetzt dieselbe. */
.site-header .brand-mark {
  width: 32px; height: 32px; padding: 4px; box-sizing: border-box;
  border-radius: 9px; background: #1B4965;
}
/* Der Weg zur Buerosoftware im Kopf -- auf breiten Bildschirmen. Auf dem
   Telefon steht er im Launcher und im Werbeband des Fusses; der Kopf
   bleibt dort einzeilig. */
.header-actions { display: flex; align-items: center; gap: 6px; }
.kuk-haus {
  display: inline-flex; align-items: center; min-height: 40px;
  padding: 0 12px; border-radius: 8px;
  font-size: 14px; font-weight: 600; white-space: nowrap;
  color: inherit; text-decoration: none; opacity: .86;
}
.kuk-haus:hover { opacity: 1; background: rgba(27, 73, 101, .08); }
/* Werkzeuge mit dunklem Thema faerben JEDEN Link (z. B.
   `html[data-theme="dark"]:not(...) a`, Spezifitaet 0,2,2). Kopf- und
   Bandlinks gehoeren aber der Marke, nicht dem Werkzeug -- deshalb hier
   eine Stufe spezifischer (0,3,1). */
.site-header .header-actions a.kuk-haus { color: inherit; }
@media (max-width: 840px) { .kuk-haus { display: none; } }

/* ── Fuss: Werbeband und Rechtszeile (2026-10-02) ────────────────────
   Das Band ist auf jedem Werkzeug gleich und in hellem wie dunklem
   Thema dasselbe Petrol -- es ist die Marke, nicht das Werkzeug. */
.kuk-werbung {
  display: grid; grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center; gap: 14px 22px;
  margin: 6px 0 16px; padding: 18px 20px;
  border-radius: 16px; color: #fff;
  background: linear-gradient(135deg, #1B4965 0%, #12344A 100%);
}
.kuk-werbung-marke {
  display: grid; place-items: center; width: 46px; height: 46px;
  border-radius: 12px; background: rgba(255, 255, 255, .08);
  border: 1px solid rgba(255, 255, 255, .18);
}
.kuk-werbung-marke img { display: block; width: 30px; height: 30px; }
.kuk-werbung-text { min-width: 0; }
.kuk-werbung-kicker {
  margin: 0 0 3px; font-size: 11.5px; font-weight: 700;
  letter-spacing: .07em; text-transform: uppercase; color: #A8D4E8;
}
.kuk-werbung-titel { margin: 0; font-size: 16px; font-weight: 700; line-height: 1.35; color: #fff; }
.kuk-werbung-satz { margin: 4px 0 0; font-size: 13.5px; line-height: 1.45; color: #D6E6EE; }
.kuk-werbung-aktionen { display: flex; flex-wrap: wrap; gap: 10px; justify-content: flex-end; }
.kuk-werbung-cta, .kuk-werbung-zweit {
  display: inline-flex; align-items: center; justify-content: center;
  min-height: 44px; padding: 0 18px; border-radius: 10px; box-sizing: border-box;
  font-size: 14.5px; font-weight: 700; text-decoration: none; white-space: nowrap;
}
.site-footer .kuk-werbung a.kuk-werbung-cta { background: #fff; color: #1B4965; }
.site-footer .kuk-werbung a.kuk-werbung-cta:hover { background: #E8F3F8; }
.site-footer .kuk-werbung a.kuk-werbung-zweit { color: #fff; border: 1px solid rgba(255, 255, 255, .5); }
.site-footer .kuk-werbung a.kuk-werbung-zweit:hover { background: rgba(255, 255, 255, .1); }
.kuk-werbung a:focus-visible { outline: 3px solid #A8D4E8; outline-offset: 2px; }
@media (max-width: 840px) {
  .kuk-werbung { grid-template-columns: auto minmax(0, 1fr); align-items: start; padding: 16px; gap: 12px 14px; }
  .kuk-werbung-marke { width: 40px; height: 40px; border-radius: 11px; }
  .kuk-werbung-marke img { width: 26px; height: 26px; }
  .kuk-werbung-aktionen { grid-column: 1 / -1; }
  .kuk-werbung-aktionen a { flex: 1 1 0; }
  .kuk-werbung-titel { font-size: 15px; }
}
.site-footer .ft-row {
  display: flex; flex-wrap: wrap; align-items: center;
  justify-content: space-between; gap: 6px 22px; padding: 4px 0 6px;
}
.site-footer .ft-links { display: flex; flex-wrap: wrap; gap: 0 18px; }

/* ── Volle Fensterbreite fuer Kopf und Fuss ──────────────────────────
   `.container` zentriert auf `--maxw` und setzt 20 px Rand. Fuer den
   Seiteninhalt ist das richtig -- eine Textspalte ueber 1600 px waere
   unlesbar. Fuer die Shell ist es falsch: eine App-Bar, die in der Mitte
   schwebt, sieht aus wie ein Seitenkopf, nicht wie die Leiste einer
   Anwendung. Auf 1440 px begann die Marke erst bei rund 300 px.

   Kopf und Fuss laufen deshalb ueber die volle Breite, und ihr Rand
   waechst stufenlos mit dem Fenster statt in Sprüngen: `clamp` geht von
   14 px auf schmalen Geraeten bis 48 px auf sehr breiten. Der Inhalt
   darunter behaelt seine zentrierte Spalte. */
.site-header > .container,
.site-header .header-lokal > .container,
.site-footer > .container,
.tool-weiter > .container {
  max-width: none;
  width: 100%;
  padding-inline: clamp(14px, 2.4vw, 48px);
}

/* ── App-Bar ─────────────────────────────────────────────────────────
   Eine Zeile, und sie bleibt eine Zeile. Der Werkzeugname darf kuerzen,
   die Marke nicht verschwinden, und der Knopf nicht umbrechen. */
.header-row { flex-wrap: nowrap; min-height: 56px; }
.brand { flex: 0 0 auto; }
/* DIE KOPFZEILE PASSTE BEI 320 PX NICHT INS FENSTER.
   Gemessen am 2026-09-22 an `rechnung` und `stundennachweis`:

     Marke 130 + Trenner 1 + Werkzeugname 64 + Knopf 106 = 301
     plus Abstaende -> rechte Kante bei 383, Fenster 320

   Die Seite scrollte also waagerecht -- und zwar die ganze Seite, nicht
   ein einzelnes Element (WCAG 1.4.10 verlangt 320 CSS px ohne
   zweidimensionales Scrollen). Nachgeben konnte niemand: die Marke steht
   auf `0 0 auto`, der Werkzeugname lag schon auf seiner Mindestbreite
   von 6ch, und der Knopf ist die einzige Bedienung im Kopf.

   Unterhalb von 400 px traegt die Bildmarke allein. Der Schriftzug ist
   dort die einzige Angabe, auf die verzichtet werden kann, ohne dass
   jemand etwas verliert: wo man ist, sagt der Werkzeugname daneben, und
   die Marke bleibt sichtbar. Das spart rund 98 px -- gemessen genug. */
@media (max-width: 400px) {
  .brand-text {
    position: absolute; width: 1px; height: 1px;
    overflow: hidden; clip-path: inset(50%); white-space: nowrap;
  }
}
.kuk-trenner {
  flex: 0 0 auto; width: 1px; height: 22px;
  background: currentColor; opacity: .25; margin: 0 4px;
}
/* Der Werkzeugname darf kuerzen, aber erst spaet: er ist die Antwort auf
   "wo bin ich". Deshalb `flex: 1 1 auto` erst NACH einer Mindestbreite --
   und keine Navigation mehr daneben, die ihn verdraengen koennte. */
.kuk-kontext {
  flex: 1 1 auto; min-width: 6ch;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  text-decoration: none; color: inherit; font-weight: 600;
}
.kuk-kontext:hover { text-decoration: underline; }
/* Blauer Haken (website/PRUEFHAKEN.json): gleich hinter dem Namen, nie von ihm verdraengt. Der Name gibt nur so viel
   Breite her, wie er braucht, damit der Haken daneben steht; der Knopf rechts behaelt seine Stelle ueber margin-left. */
/* Mindestbreite 4ch statt 6ch: der Haken braucht ca. 22 px, und bei 320 px schob er sonst die Kopfzeile 7 px ueber den Rand (gemessen). */
.kuk-kontext:has(+ .kuk-haken) { flex: 0 1 auto; min-width: 4ch; }
.kuk-kontext:has(+ .kuk-haken) ~ .header-actions { margin-left: auto; }
/* Bis 340 px entfaellt der Haken im Kopf: er braucht 22 px, und die Kopfzeile ist dort bei manchen Werkzeugen schon ohne ihn zu breit
   (Vertragsvorlagen: 21 px, mit Haken 41 px, gemessen). !important, weil die Gestalt des Hakens inline im Markup steht. */
@media (max-width: 340px) {
  .kuk-kontext + .kuk-haken { display: none !important; }
  .kuk-kontext:has(+ .kuk-haken) { min-width: 6ch; }
}
.header-actions { flex: 0 0 auto; }

/* Die lokale Ebene einer Werkstatt: eigene Zeile unter der App-Bar,
   nicht darin. Sie existiert nur, wo es sie gibt -- ein Rechner bekommt
   sie nicht. */
.header-lokal {
  border-top: 1px solid var(--line);
  background: var(--white, #fff);
}
.header-lokal .site-nav {
  display: flex; flex-wrap: wrap; gap: 4px 18px;
  padding: 8px 0; font-size: 14px;
}
.kuk-tools {
  font: inherit; font-size: 14px; font-weight: 600;
  color: inherit; background: transparent;
  border: 1px solid currentColor; border-radius: 8px;
  padding: 7px 14px; min-height: 40px; cursor: pointer;
}
.kuk-tools:hover { border-color: var(--blue); color: var(--blue); }
@media (pointer: coarse) { .kuk-tools { min-height: 44px; } }
/* FINGER BRAUCHEN 44 PX, AUCH WO DAS AUGE 32 SIEHT.
   Gemessen am 2026-10-02 auf dem iPhone 13 (WebKit, Projektplan): die
   Marke war 32 x 32 px gross, der Werkzeugname 24 px hoch -- zwei Ziele
   unter dem Produktmass von 44 px, auf allen Werkzeugen. Vergroessert
   wird die Trefferflaeche, nicht das Bild: Marke und Name sehen aus wie
   vorher. `line-height` statt Flexbox beim Namen, weil er mit
   `text-overflow: ellipsis` kuerzt -- in einem Flexcontainer greift das
   nicht. */
@media (pointer: coarse) {
  .site-header .brand { display: inline-flex; align-items: center; min-height: 44px; }
  .site-header .kuk-kontext { line-height: 44px; }
  .site-header .kuk-haus { min-height: 44px; }
}

/* Unterhalb des gemessenen Umbruchpunkts verlaesst die
   Werkstattnavigation den Kopf. Sie wird nicht versteckt -- `kuk-shell.js`
   verschiebt den echten Knoten in den Launcher. Diese Regel ist nur die
   Ruecklage fuer den Fall, dass kein JavaScript laeuft: dann bleibt sie
   sichtbar und bricht um. Ein umgebrochener Kopf ist haesslich; eine
   verschwundene Navigation waere ein Verlust. */
@media (max-width: 840px) {
  .header-lokal { display: none; }
}
.kuk-launcher .site-nav {
  display: flex; flex-direction: column; gap: 2px;
}

/* ── Launcher ────────────────────────────────────────────────────────
   Auf schmalen Breiten ein Blatt am unteren Rand -- dort ist der Daumen.
   Auf breiten ein Popover unter dem Knopf. Dieselbe Information, andere
   Komposition. */
.kuk-launcher {
  position: fixed; inset: 0; z-index: 60;
  background: rgba(16, 24, 32, .38);
  display: flex; align-items: flex-end; justify-content: center;
}
.kuk-launcher[hidden] { display: none; }
.kuk-launcher-blatt {
  width: 100%; max-height: 86vh; overflow-y: auto;
  background: var(--white, #fff);
  border-radius: 16px 16px 0 0;
  padding: 8px 18px 24px;
  box-shadow: 0 -8px 32px rgba(16, 24, 32, .18);
}
.kuk-launcher-kopf {
  display: flex; align-items: center; justify-content: space-between;
  padding: 8px 0 4px;
}
.kuk-launcher-titel { font-weight: 700; }
.kuk-launcher-zu {
  font: inherit; font-size: 24px; line-height: 1;
  background: transparent; border: 0; cursor: pointer;
  min-width: 44px; min-height: 44px; color: inherit;
}
.kuk-launcher-bereich { padding: 8px 0; }
.kuk-launcher-bereich[hidden] { display: none; }
.kuk-launcher-label {
  margin: 0 0 6px; font-size: 12px; letter-spacing: .04em;
  text-transform: uppercase; color: var(--ink-4);
}
.kuk-launcher-ziel, .kuk-launcher .site-nav a {
  display: flex; align-items: center; gap: 11px;
  padding: 7px 0; min-height: 44px;
  text-decoration: none; color: inherit;
}
.kuk-launcher-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.kuk-launcher-ziel:hover, .kuk-launcher .site-nav a:hover {
  color: var(--blue);
}
.kuk-launcher-hinweis { font-size: 12px; color: var(--ink-4); }
/* DASSELBE GESICHT WIE IM STORE.
   Die Zeichnung und die beiden Kachelfarben kommen aus dem Suchindex
   von /webtools -- keine zweite Iconliste, kein zweiter Farbschluessel.
   Ein Werkzeug sieht hier aus wie dort. */
.kuk-kachel {
  display: grid; place-items: center; flex: none;
  width: 34px; height: 34px; border-radius: 28%; corner-shape: squircle;
  border: 1px solid rgba(255,255,255,.24); color: #fff;
  background: linear-gradient(145deg, var(--tile-light), var(--tile-dark));
  box-shadow: inset 0 1px 1px rgba(255,255,255,.35), 0 3px 8px rgba(20,50,60,.16);
}
.kuk-kachel svg { display: block; width: 74%; height: 74%; overflow: visible; }
/* Die kuratierten Marken tragen `stroke="currentColor"`, die
   semantischen Glyphen nicht -- ohne diese Zeile blieben sie
   unsichtbar auf der farbigen Kachel. Derselbe Fall wie im Store. */
.kuk-kachel svg:not([stroke]) { stroke: currentColor; fill: none; stroke-width: 1.7; }
.kuk-kachel .duo { fill: rgba(255,255,255,.22); stroke: none; }
.kuk-launcher-offen { overflow: hidden; }

@media (min-width: 841px) {
  /* Das Popover steht buendig unter dem Knopf -- also am selben
     fliessenden Rand wie die App-Bar darueber. */
  .kuk-launcher {
    background: transparent; inset: 0 0 auto auto;
    padding: 8px clamp(14px, 2.4vw, 48px) 0; justify-content: flex-end;
  }
  .kuk-launcher-blatt {
    width: min(360px, calc(100vw - 36px));
    border-radius: 12px; margin-top: 56px;
    border: 1px solid var(--line);
    box-shadow: 0 12px 32px rgba(16, 24, 32, .16);
  }
}

/* ── Der Kopf tritt beim Lesen zurueck ───────────────────────────────
   Nur auf schmalen Breiten: dort kostet ein dauerhaft klebender Kopf
   68 von 844 Pixeln, also acht Prozent der Hoehe, waehrend jemand
   arbeitet. Verschoben wird mit `transform` -- der Kopf bleibt im
   Fluss, und der Inhalt darunter springt nicht.

   `kuk-kopf-weg` setzt `kuk-shell.js`; ohne JavaScript bleibt der Kopf
   stehen, wie er es immer getan hat. */
@media (max-width: 840px) {
  .site-header { transition: transform .22s ease; will-change: transform; }
  .kuk-kopf-weg .site-header { transform: translateY(-100%); }
}
/* Wer Bewegung reduziert haben will, bekommt den Wechsel ohne Fahrt --
   aber er bekommt ihn: der Platzgewinn ist kein Effekt, sondern der
   Zweck. */
@media (prefers-reduced-motion: reduce) {
  .site-header { transition: none; }
}

/* Ein klebender Kopf verdeckt jedes Sprungziel.
   Der Skip-Link fuehrt zu `#main`, Inhaltsverzeichnisse fuehren zu
   Abschnitten -- landet das Ziel unter der App-Bar, ist der Fokus zwar
   gesetzt, aber nicht zu sehen. W3C nennt Scroll-Padding ausdruecklich
   als Technik dagegen. Der Wert deckt App-Bar und lokale Ebene ab. */
html { scroll-padding-top: 112px; }
@media (max-width: 840px) {
  html { scroll-padding-top: 76px; }
}

/* Der Skip-Link ist im Ruhezustand nicht zu sehen und im Tastaturfokus
   deutlich -- W3C G1. Er darf dabei nicht unter der App-Bar liegen. */
.skip-link {
  position: absolute; left: 8px; top: -60px; z-index: 70;
  background: var(--white, #fff); color: inherit;
  border: 2px solid currentColor; border-radius: 8px;
  padding: 10px 16px; text-decoration: none;
  transition: top .12s ease-out;
}
.skip-link:focus { top: 8px; }
@media (prefers-reduced-motion: reduce) {
  .skip-link { transition: none; }
}
/* Die Zielgroesse gilt, wo grob gezeigt wird -- hier stehen Links eng
   beieinander, und ein Fehlgriff fuehrt auf ein fremdes Werkzeug. */
@media (pointer: coarse) {
  .weiter-row .ft-links a,
  .site-footer .ft-links a {
    display: inline-flex; align-items: center; min-height: 44px;
  }
}
/* KUK-SHELL:CSS:ENDE */

/* ══ V17 · SHELL, THEMA, ARBEITSMODUS ══════════════════════════════════
   Seit der Aufnahme in die gemeinsame Shell stehen Empfehlungen und
   Fuss AUSSERHALB von <main>. Ausgeblendet wird nach Stellung, nicht
   nach Klassennamen -- eine Namensliste waere beim naechsten Block der
   Shell still wieder falsch (Workspace-Vertrag). Der Skip-Link bleibt;
   er nimmt ohnehin keinen Platz. */
[data-he-modus="arbeit"] body > :not(main):not(.skip-link):not(script) { display: none; }

.sr-only {
  position: absolute !important; width: 1px; height: 1px; margin: -1px;
  padding: 0; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
/* Der Umschalter: dasselbe Markup und dieselben Symbole wie auf www. */
.theme-toggle {
  display: inline-grid; place-items: center; width: 44px; height: 44px;
  margin-right: 6px; padding: 0; border: 1px solid var(--line-2);
  border-radius: 999px; background: transparent; color: var(--ink-2); cursor: pointer;
}
.theme-toggle:hover { border-color: var(--blue); color: var(--blue); }
.theme-toggle:focus-visible { outline: 3px solid var(--ht-fokus); outline-offset: 2px; }
.theme-toggle-icon {
  grid-area: 1 / 1; width: 20px; height: 20px; fill: none; stroke: currentColor;
  stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round;
}
.theme-toggle-icon-moon { display: none; }
html[data-theme="dark"] .theme-toggle-icon-sun { display: none; }
html[data-theme="dark"] .theme-toggle-icon-moon { display: block; }
html[data-theme="dark"] .theme-toggle { border-color: var(--pn-linie-2); color: var(--pn-text); }
html[data-theme="dark"] .theme-toggle:hover { border-color: var(--pn-gold-hell); color: var(--pn-gold-hell); }

/* Die Shell-Leisten im dunklen Thema: Werkzeuge-Knopf, Trenner,
   Empfehlungen. */
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .kuk-tools {
  background: transparent; color: var(--pn-text); border-color: var(--pn-linie-2);
}
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .kuk-kontext { color: var(--pn-gold-hell); }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .kuk-trenner { background: var(--pn-linie-2); }
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .tool-weiter {
  background: var(--pn-grund-2); border-color: var(--pn-linie); color: var(--pn-text-2);
}
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .tool-weiter a { color: var(--pn-lagune); }


/* ══ V17 · WERKZEUGSTAPEL STATT REITER (DESKTOP) ═══════════════════════
   Korrigieren, Hintergrund und Gestalten stehen untereinander in einem
   durchgehend scrollbaren Inspector -- er scrollte schon vorher selbst
   (`.blatt-inner`), jetzt traegt er nur alles zugleich. Breite, Andocken
   und Hoehenkette bleiben, wie der Workspace-Vertrag sie festlegt.
   Gilt ab 960 px, der Grenze des Rasters: darunter gibt es keinen Platz
   fuer eine Spalte, und dort fuehrt die Daumenleiste. */
@media (min-width: 960px) {
  .blatt-tabs { display: none; }
  .insp-sektion { padding: 4px 0 22px; border-bottom: 1px solid var(--line); }
  .insp-sektion + .insp-sektion { padding-top: 18px; }
  .insp-sektion:last-child { border-bottom: 0; }
  .insp-sektion-titel {
    margin: 0 0 12px; font-size: 12px; font-weight: 800; letter-spacing: .08em;
    text-transform: uppercase; color: var(--ink-3);
  }
  /* Die Abschnittsueberschrift sagt schon "Korrigieren". */
  .insp-sektion .insp-werkzeug > span { display: none; }
  .insp-sektion .gestalten-wahl { margin-bottom: 14px; }

  /* Ausserhalb des Stapels (Export) braucht es Titel und Rueckweg. */
  .blatt:not([data-ansicht="Werkzeuge"]) .blatt-kopf h2 { display: block; }
  .blatt:not([data-ansicht="Werkzeuge"]) .blatt-zu { display: inline-grid; place-items: center; }
  .blatt[data-ansicht="Werkzeuge"] .blatt-kopf { display: none; }
}
html[data-theme="dark"]:not([data-he-modus="arbeit"]) .brand-sub { color: var(--pn-text-2); }
@media (min-width: 960px) {
  /* DIE SPALTE KENNT IHRE HOEHE -- EINE SCHAETZUNG DAVON NICHT.
     `max-height: min(62vh, 620px)` stammt aus der Zeit des schwebenden
     Blatts. Beim Einzelwerkzeug war der Inhalt kuerzer und es fiel nie
     auf; im Stapel schnitt es bei 1440x900 den Inspector bei 558 von
     792 px ab. */
  [data-he-modus="arbeit"] .blatt-inner { max-height: none; height: 100%; overflow-y: auto; }
}

/* Der Werkzeugname darf auf dem Telefon umbrechen, statt gekuerzt zu
   werden. Mit dem Theme-Umschalter blieben bei 390 px fuer ihn 101 px,
   und "Hintergrund entfernen" wurde zu "Hintergrun..." -- genau der
   Name, an dem sich der Mensch orientiert. Zwei Zeilen kosten keine
   Hoehe: die App-Bar ist 78 px hoch. */
@media (max-width: 480px) {
  .kuk-kontext { white-space: normal; line-height: 1.15; overflow: visible; text-overflow: clip; }
}

