/* ============================================================================
   DigiPagina 0.1 — Designsprache der Bürgerseite
   Massgeblich ist DESIGN.md. Wer hier einen Wert aendert, aendert ihn dort mit.

   Kein Framework. Kein JavaScript. Jedes Mass steht einmal, hier oben.
   ============================================================================ */

/* --- 1. Fuss und Verzeichnis ---------------------------------------------- */

:root {
  /* Farben — DESIGN.md 3 */
  --dp-text:          #454549;
  --dp-titlu:         #2e3438;
  --dp-accent:        #2467af;
  --dp-accent-slab:   rgba(91, 178, 226, .18);
  --dp-meta:          #7c6556;
  --dp-tag:           #5a2908;
  /* --dp-mut (#9fa3a6) ist am 26.08.2026 AUSSER DIENST gestellt und steht
     deshalb nicht mehr hier. Er war am laufenden Bild gemessen und getreu
     uebernommen — und er traegt 2.54:1 gegen Weiss. Das reisst WCAG 1.4.3
     (4,5:1) und verfehlt auch die 3:1 fuer grossen Text und fuer
     Zustandszeichen (1.4.11). Er stand an sechs Stellen, fuenf davon mit
     Text: Fusszeile, Datumzeile der Concursuri, Trefferzahl und Trefferzeilen
     der Suche. Alle sechs tragen jetzt --dp-desc (#555555, 7.46:1).
     DESIGN.md 3 und berichte/ZUGAENGLICHKEIT_2026-08-26.md §3.3. Ein Token,
     das niemand benutzt, aber jeder greifen kann, ist eine Falle. */
  --dp-fundal:        #ffffff;
  --dp-fundal-bara:   #f5f6f7;
  --dp-fundal-cauta:  #eff1f2;
  --dp-linie:         rgba(210, 215, 217, .75);

  /* DIE KANTE EINES BEDIENELEMENTS — und sie ist eine andere als die Kante
     einer Karte. `--dp-linie` traegt gegen den Leistengrund 1,22:1; das
     reicht fuer einen Haarstrich zwischen zwei Karten (er trennt, er bedient
     nicht), aber nicht fuer den Rand eines Tastziels: WCAG 2.1 AA 1.4.11
     verlangt dort 3:1, weil dieser Rand SAGT, wo das Ziel aufhoert.
     Gemessen: 3,31:1 auf `--dp-fundal-bara`, 3,58:1 auf `--dp-fundal`. */
  --dp-linie-tinta:   #83888c;

  /* Der Vergroesserungsfaktor des Zugaenglichkeits-Bedienteils. Er steht
     hier auf 1 und wird vom Skript am <html> ueberschrieben. JEDE
     Schriftgroesse rechnet ihn ein — auch die 25, die in px stehen; ohne
     sie waere auf /ro/primaria fast nichts gewachsen, denn dort ist der
     Fliesstext px-gemessen. Eine Variable, eine Stelle, alles zieht mit. */
  --dp-lupe:          1;

  /* Schrift — DESIGN.md 4 */
  --dp-font-text:  "Open Sans", system-ui, -apple-system, sans-serif;
  --dp-font-titlu: "Roboto Slab", Georgia, serif;
  --dp-inaltime:   1.65;   /* Zeilenhoehe des Fliesstextes, einzige */
  --dp-spatiere:   .075em; /* Sperrung der Versalien-Beschriftung */

  /* Abstaende — DESIGN.md 5 */
  --dp-sp-1:  .25rem;
  --dp-sp-2:  .5rem;
  --dp-sp-3:  .75rem;
  --dp-sp-4:  1rem;
  --dp-sp-5:  2rem;
  --dp-sp-6:  1.5rem;
  --dp-sp-7:  2.5rem;
  --dp-sp-8:  3rem;
  --dp-sp-9:  4rem;
  --dp-sp-10: 5rem;

  /* Rahmen, Radien, Hoehen — DESIGN.md 5 */
  --dp-raza:        .375rem;
  --dp-linie-1:     1px;
  --dp-linie-2:     2px;
  --dp-linie-3:     3px;
  --dp-linie-antet: 5px;
  --dp-buton-h:     2.8rem;

  /* Das Zugaenglichkeits-Bedienteil (DESIGN.md 7.17). Vier Masse in px und
     nicht in rem, und das mit Absicht: der Knopf ist ein Tastziel und der
     Rand ein Sicherheitsabstand zur Schirmkante — beides muss stehen
     bleiben, wenn die Schriftstufe waechst. `--dp-acces-knopf` und
     `--dp-acces-w` sind am alten Theme-Widget gemessen (50 px, 320 px),
     `--dp-acces-tinta` ist WCAG 2.5.5, `--dp-acces-rand` ist gesetzt. */
  --dp-acces-knopf: 50px;    /* Kantenlaenge des Auslaesers — gemessen */
  --dp-acces-w:     320px;   /* Panelbreite, hoechstens — gemessen */
  --dp-acces-tinta: 44px;    /* Tastziel-Mindesthoehe im Panel */
  /* Die Luft ueber der sichtbaren Reiterflaeche. 44 - 8 = 36 px sichtbar,
     44 px treffbar. Ein Wert, zwei Bauteile: Reiter und Filterknopf. */
  --dp-fila-luft:   8px;
  --dp-acces-rand:  12px;    /* Abstand des Panels zur Schirmkante */
  --dp-camp-h:      2.75rem;
  --dp-bara-w:      20.7rem;
  --dp-umbra:       0 5px 15px 0 rgba(0, 0, 0, .15);  /* die EINZIGE Schatten-
                                angabe. Kommt genau an einer Stelle vor: der
                                Personenkarte der Startseite, dort gemessen. */
  --dp-bara-em:     .9rem;   /* 14,4px — Schriftgroesse der Leiste; Untermenue
                                und Kontaktliste sind Vielfache davon */

  /* Hoehe des Leisteninhalts. DIE EINZIGE GEMESSENE KONSTANTE in dieser
     Datei — alles andere folgt aus den Massen darueber.
     Sie wird gebraucht, weil CSS die Eigenhoehe eines Kastens nicht kennt
     (siehe Kommentar bei .dp-bara-corp). Auf allen Seitentypen einer
     Gemeinde ist sie gleich (Menue und Kontaktblock sind ueberall dieselben,
     nachgemessen: 1417,59 px auf Liste, Einzelseite und Rubrikseite).
     Sie AENDERT SICH, wenn das Menue laenger wird oder der Kontaktblock
     anders umbricht — dann hier nachtragen.
     Faellt sie falsch aus, bleibt die Leiste ein paar Pixel zu frueh oder
     zu spaet stehen. Nichts bricht. */
  --dp-bara-h: 88.3rem;      /* 1412,8px bei Fuss 16px — gemessen */

  /* Die Groessen, die je Haltepunkt wechseln. Sonst keine.
     Sie wechseln NICHT nur nach unten: oberhalb 1680 px setzt das laufende
     Theme groessere Vielfache (6em statt 5em, 26em statt 23em Leiste). Das
     stand bis zum 24.08. nirgends, weil bei 1440 px beides zusammenfaellt —
     DESIGN.md 2. */
  --dp-inner-x:    var(--dp-sp-10); /* Innenrand des Hauptteils, seitlich */
  --dp-sect-t:     var(--dp-sp-10); /* Abschnitt im Hauptteil, oben */
  --dp-sect-b:     var(--dp-sp-8);  /* Abschnitt im Hauptteil, unten */
  --dp-antet-t:    var(--dp-sp-10); /* Innenrand des Seitenkopfs, oben */
  --dp-bara-pad:   var(--dp-sp-6);  /* Innenrand der Leiste */
  --dp-bara-pad-b: 1.2rem;          /* derselbe, unten — 19,2px, gemessen */
  --dp-bara-luft:  var(--dp-sp-8);  /* Abstand unter dem Suchband */
}

/* Der Fuss. Vier Stufen, DESIGN.md 2. */
html { font-size: calc(13pt * var(--dp-lupe, 1)); }
/* Bei Fuss 13pt bricht der Kontaktblock eine Zeile anders um — nachgemessen */
/* OBERHALB 1680 px setzt das Original groessere Vielfache. Bis zum 24.08.
   stand hier nur die Leistenhoehe, und der Neubau war dort 81 px breiter im
   Inhalt und 47 px schmaler in der Leiste als die laufende Seite. Alle Werte
   am Massstab bei 1920 px gemessen. */
@media (min-width: 1681px) {
  :root {
    --dp-bara-h:     90.86rem;   /* 1574,9px */
    --dp-bara-w:     23.4rem;    /* 26em der Leiste (0,9em) = 405,6px */
    --dp-bara-pad:   2rem;       /* 2,2222em der Leiste = 34,67px */
    --dp-bara-pad-b: 2.2rem;     /* 2,4444em der Leiste = 38,13px */
    --dp-bara-luft:  4rem;       /* 4,4444em der Leiste = 69,33px */
    --dp-inner-x:    6rem;       /* 6em statt 5em = 104px */
    --dp-sect-t:     6rem;
    --dp-sect-b:     4rem;
    --dp-antet-t:    6rem;
  }
}
@media (max-width: 1680px) { html { font-size: calc(12pt * var(--dp-lupe, 1)); } }
@media (max-width: 1280px) { html { font-size: calc(11pt * var(--dp-lupe, 1)); } }
@media (max-width:  360px) { html { font-size: calc(10pt * var(--dp-lupe, 1)); } }

/* border-box direkt, NICHT ueber `box-sizing: inherit`.
   Gemessen 23.08.2026 in Chromium 151: die verbreitete inherit-Schreibweise
   bricht innerhalb von <details>. Der Inhalt haengt dort im UA-Schattenbaum an
   einem <slot>; die Vererbung folgt dem flachen Baum, der author-seitige
   *-Selektor trifft den Slot nicht, und der Slot traegt den Anfangswert
   content-box. Ergebnis: JEDES Kind einer <details> waere content-box —
   auch <summary>. Betrifft nur nicht-vererbte Eigenschaften mit
   ausgeschriebenem `inherit`; color und font gehen normal durch. */
*, *::before, *::after { box-sizing: border-box; }

/* --- 2. Grundstellung ------------------------------------------------------ */

body {
  margin: 0;
  background: var(--dp-fundal);
  color: var(--dp-text);
  font-family: var(--dp-font-text);
  font-size: 1rem;
  font-weight: 400;
  line-height: var(--dp-inaltime);
  -webkit-text-size-adjust: none;
}

h1, h2, h3, h4, h5, h6 {
  margin: 0 0 1em 0;
  color: var(--dp-titlu);
  font-family: var(--dp-font-titlu);
  font-weight: 700;
  line-height: 1.5;
}
h1 { font-size: 3.5rem;  line-height: 1.3; margin-bottom: .5em; }
h2 { font-size: 1.75rem; }
h3 { font-size: 1.25rem; }
h4 { font-size: 1.1rem; }
h5 { font-size: .9rem; }
h6 { font-size: .7rem; }
h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { color: inherit; border-bottom: 0; }

/* Die Ueberschriftenstufen je Haltepunkt — DESIGN.md 4.
   Diese Regeln stehen NACH der Grundregel oben, nicht im Variablenblock:
   bei gleicher Spezifitaet entscheidet die Reihenfolge, und eine
   Haltepunktregel vor der Grundregel verliert stillschweigend. */
@media (min-width: 1681px) { h1 { font-size: 2.5rem; } }
@media (max-width: 980px) { h1 { font-size: 3.25rem; } }
@media (max-width: 736px) {
  h1 { font-size: 2rem; line-height: 1.4; }
  h2 { font-size: 1.5rem; }
}

p  { margin: 0 0 var(--dp-sp-5) 0; }
ul, ol { margin: 0 0 var(--dp-sp-5) 0; }
/* Einrueckung am Original gemessen (24.08.), nicht geschaetzt: ul 16px,
   ol 20px, ol li 4px. Hier stand vorher 24px fuer beide — der erste
   Fliesstext MIT Liste ist die Textseite (M5), dort faellt es auf. */
ul { padding-left: var(--dp-sp-4); }
ol { padding-left: 1.25rem; }
ol li { padding-left: var(--dp-sp-1); }
strong, b { color: var(--dp-titlu); font-weight: 600; }
em, i { font-style: italic; }
img { max-width: 100%; height: auto; }
hr { border: 0; border-bottom: var(--dp-linie-1) solid var(--dp-linie); margin: var(--dp-sp-5) 0; }

blockquote {
  margin: 0 0 var(--dp-sp-5) 0;
  padding: var(--dp-sp-2) 0 var(--dp-sp-2) var(--dp-sp-5);
  border-left: var(--dp-linie-3) solid var(--dp-linie);
  font-style: italic;
}

a {
  color: var(--dp-accent);
  text-decoration: none;
  border-bottom: var(--dp-linie-1) dotted currentColor;
  transition: color .2s ease-in-out, border-bottom-style .2s ease-in-out;
}
a:hover { border-bottom-style: solid; }

/* dp-adresa — EINE Regel fuer alle Verweise, die selbst die Angabe SIND.
   Eine E-Mail-Adresse oder eine Telefonnummer fuehrt nicht woandershin, sie
   IST der Wert. Deshalb traegt sie die Farbe ihres Umfelds; nur der
   gepunktete Unterstrich zeigt an, dass man sie anklicken kann.
   Gemessen: im Kontaktkasten der Seite rgb(0,0,0) (er erbt aus <strong>),
   in der Seitenleiste rgb(69,69,73) — beide Male die Umgebungsfarbe, nie
   der Akzent. Zweimal aufgetaucht, deshalb hier einmal geloest. */
.dp-adresa { color: inherit; }
.dp-adresa:hover { color: var(--dp-accent); }

/* Zustand — DESIGN.md 6. Gilt fuer jedes bedienbare Element. */
a:focus-visible,
button:focus-visible,
summary:focus-visible,
input:focus-visible,
[tabindex]:focus-visible {
  outline: 2px solid var(--dp-accent);
  outline-offset: 2px;
  border-radius: 2px;
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { transition: none !important; animation: none !important; }
}

/* --- 3. dp-pagina — der Rumpf (DESIGN.md 7.1) ------------------------------ */

/* Sprungmarke. Die Leiste steht im Quelltext VOR dem Inhalt — das ist die
   Lesereihenfolge, die ein Screenreader bei einer linken Leiste erwartet.
   Damit die Tastatur nicht jedes Mal durch zehn Menuepunkte muss, steht davor
   dieser Sprung. Er ist sichtbar, sobald er den Fokus hat. */
.dp-sari {
  position: absolute;
  left: var(--dp-sp-2); top: var(--dp-sp-2);
  z-index: 200;
  padding: var(--dp-sp-2) var(--dp-sp-4);
  border: 0;
  border-radius: var(--dp-raza);
  background: var(--dp-accent);
  color: #fff;
  transform: translateY(-200%);
}
.dp-sari:focus { transform: none; }

.dp-pagina {
  display: flex;
  min-height: 100vh;
}

.dp-continut {
  flex: 1 1 auto;
  width: 100%;
  min-width: 0;
}

.dp-continut-inner {
  max-width: 110rem;
  margin: 0 auto;
  padding: 0 var(--dp-inner-x);
}

@media (max-width: 1280px) {
  :root { --dp-inner-x: var(--dp-sp-9); --dp-sect-t: var(--dp-sp-9); --dp-sect-b: var(--dp-sp-5); }
  .dp-pagina { flex-direction: column; }
}
@media (max-width: 736px) {
  :root { --dp-inner-x: var(--dp-sp-5); --dp-sect-t: var(--dp-sp-8); --dp-sect-b: var(--dp-sp-4); }
}

/* --- 4. dp-antet — der Seitenkopf (DESIGN.md 7.2) -------------------------- */

.dp-antet {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--dp-sp-4);
  padding: var(--dp-antet-t) 0 var(--dp-sp-4) 0;
  border-bottom: var(--dp-linie-antet) solid var(--dp-accent);
}

.dp-antet-titlu {
  margin: 0;
  font-family: var(--dp-font-titlu);
  font-size: 2.125rem;
  font-weight: 700;
  line-height: var(--dp-inaltime);
  color: var(--dp-titlu);
}
.dp-antet-titlu a { color: inherit; border-bottom: 0; }

.dp-antet-social {
  display: flex;
  gap: var(--dp-sp-4);
  margin: 0;
  padding: 0;
  list-style: none;
}
.dp-antet-social a {
  color: var(--dp-text);
  border-bottom: 0;
  line-height: 1;
}
.dp-antet-social a:hover { color: var(--dp-accent); }
.dp-antet-social .dp-sim { display: block; width: 1rem; height: 1rem; }

@media (max-width: 736px) {
  .dp-antet { flex-direction: column; align-items: flex-start; gap: var(--dp-sp-4); }
}

/* Grundregel fuer jedes Symbol, das keine eigene bekommt: die HOEHE fuehrt.
   Die Teilstuecke tragen `width="1em" height="1em"` als Attribut; Attribute
   sind die schwaechste Quelle, diese Regel gewinnt. Begruendung bei
   `.dp-contact .dp-sim`. */
.dp-sim { width: auto; height: 1em; }

/* --- 5. dp-bara — die Seitenleiste (DESIGN.md 7.3) ------------------------- */

.dp-bara {
  flex: 0 0 var(--dp-bara-w);
  width: var(--dp-bara-w);
  background: var(--dp-fundal-bara);
  font-size: .9rem;
  line-height: var(--dp-inaltime);
}

.dp-bara-corp { padding: var(--dp-bara-pad); }

/* Der Griff. Ein Kontrollkaestchen, kein <details> — und zwar deshalb:
   die beiden Haltepunkte brauchen die UMGEKEHRTE Grundstellung.
   Am Schirm ist die Leiste offen und der Griff klappt sie WEG (gemessen:
   #main waechst dabei von 1108,8 auf 1440 px). Am Telefon ist sie zu und der
   Griff klappt sie AUF. Ein <details open> kann nur eines von beidem.
   Kaestchen und Griff stehen NEBEN der Leiste, nicht darin, damit
   `:checked ~ .dp-bara` die ganze graue Spalte trifft. */

.dp-bara-comutator {
  position: absolute;
  width: 1px; height: 1px;
  margin: -1px; padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
}

.dp-bara-clapa {
  position: absolute;
  left: var(--dp-bara-w);
  top: 0;
  z-index: 150;
  width: 4.5rem;
  height: 5.625rem;
  line-height: 5.625rem;
  text-align: center;
  color: var(--dp-accent);
  font-size: 1.5rem;                 /* 24px, gemessen */
  cursor: pointer;
  transition: left .5s ease;
}
.dp-bara-clapa > .dp-sim { vertical-align: -.15em; }
.dp-bara-clapa-text { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }
.dp-bara-comutator:focus-visible + .dp-bara-clapa {
  outline: 2px solid var(--dp-accent);
  outline-offset: -4px;
}

/* Die graue Spalte. Sie ist so hoch wie das ganze Dokument — gemessen ist das
   auch im Original so (#sidebar h=9255 auf der langen Liste). Deshalb bleibt
   unter dem Inhalt nie eine helle Luecke. */
.dp-bara {
  flex: 0 0 var(--dp-bara-w);
  width: var(--dp-bara-w);
  background: var(--dp-fundal-bara);
  font-size: var(--dp-bara-em);
  line-height: var(--dp-inaltime);
}

/* Der Inhalt wandert erst mit und bleibt dann am EIGENEN ENDE stehen —
   wie das Original. Gemessene Bahn des Originals bei 900px Fenster:
       scrollY 0→400  wandert mit (-1,00)
       scrollY 400→600 Uebergang
       scrollY ab 600  steht bei y = -548
   Die Formel dahinter, aus drei Fensterhoehen abgelesen:
       top = min(0, Fensterhoehe - Inhaltshoehe - 30)
   also 0 / -548 / -848 bei 1700 / 900 / 600.

   Das Original rechnet sie per JavaScript. In CSS geht dieselbe Formel
   wortwoertlich — `min()` und `calc()` koennen das —, sie braucht nur die
   Inhaltshoehe. Deshalb --dp-bara-h.

   NICHT gegangen, jeweils nachgemessen und verworfen (Chromium 151, im
   isolierten Kleinstfall: 6000px hoher Elternkasten, 1400px hohes Kind):
     `bottom: 0`                        wandert durch, klebt nie
     `bottom: 30px`                     dito
     `top: 0` und `bottom: 0` zusammen  `top` gewinnt, klebt sofort oben
     Flex-Spalte mit `bottom: 0`        wandert durch
     Flex + `margin-bottom: auto`       wandert durch
     Grid mit `align-content: start`    wandert durch
   `bottom`-Sticky zieht einen Kasten nicht nach unten; es haelt ihn nur
   davon ab, nach oben aus dem Fenster zu wandern, sobald er die Unterkante
   von unten her erreicht hat — was hier nie eintritt. */

.dp-bara-corp {
  position: sticky;
  top: min(0px, calc(100vh - var(--dp-bara-h) - 30px));
  /* unten 19,2px statt 24 — am Original gemessen. Die 4,8px waren der ganze
     Unterschied im Grau unter dem Logo, ueber alle Fensterhoehen konstant. */
  padding: var(--dp-bara-pad) var(--dp-bara-pad) var(--dp-bara-pad-b) var(--dp-bara-pad);

  /* DECKENDER Grund, und das ist kein Schoenheitsfehler:
     `position: sticky` hebt den Kasten auf eine eigene Compositing-Ebene.
     Kennt Chromium deren Grund nicht als deckend, schaltet es von Subpixel-
     auf Graustufen-Kantenglaettung — und Graustufen rendert Text schwerer.
     Gemessen an derselben Stelle, mittlere Pixelabweichung gegen die
     laufende Seite (von 765 moeglichen):
         sticky ohne Grund   4,85
         sticky mit Grund    0,83
         ohne sticky         0,83
     Der Grund steht ohnehin auf .dp-bara; hier wiederholt er sich nur,
     damit die Ebene deckend ist. */
  background: var(--dp-fundal-bara);
}

/* Am Schirm: angehakt = Leiste weg, Inhalt waechst — und zwar WEICH.
   Am Original gemessen (24.08., Bahn alle 50ms abgetastet): die Leiste
   wandert in 500 ms von x=0 auf x=-331,2, der Inhalt waechst im selben Zug
   von 1108,8 auf 1440. Die Eigenschaft ist `margin-left`, die Kurve die
   Vorgabe `ease`:

     #sidebar     { transition: margin-left 0.5s ease, box-shadow 0.5s ease }
     #sidebar.inactive { margin-left: -23em }
     .toggle      { transition: left 0.5s ease }

   Vorher stand hier `display: none` — das kann nichts animieren, weil es den
   Kasten aus dem Fluss nimmt. Mit einem negativen Aussenabstand in Hoehe der
   Leistenbreite bleibt sie im Fluss, schiebt sich genau bis zur Kante hinaus
   und der Inhalt waechst von selbst nach. Weiterhin kein JavaScript.

   `prefers-reduced-motion: reduce` schaltet den Uebergang ab (die Regel dazu
   steht in Abschnitt 2 und gilt fuer jedes Element) — wer Bewegung
   abbestellt hat, bekommt den Sprung. */
.dp-bara { transition: margin-left .5s ease; }
.dp-bara-clapa { transition: left .5s ease; }

@media (min-width: 1281px) {
  .dp-bara-comutator:checked ~ .dp-bara { margin-left: calc(-1 * var(--dp-bara-w)); }
  .dp-bara-comutator:checked ~ .dp-bara-clapa,
  .dp-bara-comutator:checked + .dp-bara-clapa { left: 0; }
}

/* Am Telefon: umgekehrt — zu, bis angehakt. Der Griff ist ein Balken oben,
   und nichts klebt: die Leiste ist dort eine gewoehnliche Schublade. */
@media (max-width: 1280px) {
  .dp-bara-clapa {
    position: static;
    width: 100%;
    height: 3.5rem;
    line-height: 3.5rem;
    padding: 0 var(--dp-sp-6);
    text-align: left;
    background: var(--dp-fundal-bara);
    font-family: var(--dp-font-titlu);
    font-size: var(--dp-bara-em);
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: var(--dp-spatiere);
  }
  .dp-bara-clapa > .dp-sim { margin-right: var(--dp-sp-3); }
  .dp-bara-clapa-text { position: static; width: auto; height: auto; clip-path: none; }
  .dp-bara { display: none; flex: 0 0 auto; width: 100%; }
  .dp-bara-comutator:checked ~ .dp-bara { display: block; }
  .dp-bara-corp { position: static; max-height: none; overflow: visible; }
}

/* Abschnitte der Leiste */
.dp-bara-sectiune {
  margin-bottom: calc(var(--dp-bara-em) * 3.5);   /* 50,4px, gemessen */
  padding-bottom: calc(var(--dp-bara-em) * 3.5);
  border-bottom: var(--dp-linie-2) solid var(--dp-linie);
}
.dp-bara-sectiune:last-child { margin-bottom: 0; padding-bottom: 0; border-bottom: 0; }
.dp-bara-sectiune > :last-child { margin-bottom: 0; }
.dp-bara-sectiune p { margin-bottom: calc(var(--dp-bara-em) * 2); }  /* 28,8px */

.dp-bara-titlu {
  display: inline-block;
  margin: 0 0 var(--dp-sp-7) 0;
  padding: 0 .9375rem .625rem 0;    /* 15px / 10px, gemessen */
  border-bottom: var(--dp-linie-3) solid var(--dp-accent);
  font-family: var(--dp-font-titlu);
  font-size: 1.25rem;
  font-weight: 700;
  line-height: 1.5;
  color: var(--dp-titlu);
}

/* Das Suchband — volle Breite ueber den Innenrand hinaus */
.dp-bara-cauta {
  margin: calc(-1 * var(--dp-bara-pad)) 0 var(--dp-bara-luft) calc(-1 * var(--dp-bara-pad));
  padding: var(--dp-bara-pad);
  width: calc(100% + 2 * var(--dp-bara-pad));
  background: var(--dp-fundal-cauta);
}

/* Die Lupe im Suchfeld — dieselbe Glyphe wie im Original: FA5 solid U+F002,
   21,6px, --dp-text bei Deckkraft 0,325, waagerecht GESPIEGELT (der Griff
   zeigt nach links unten), zentriert in einem 43,19px-Quadrat rechts im Feld.
   Sie zeigt nur an, sie bedient nicht — deshalb aria-hidden und pointer-events
   aus, damit der Klick im Feld landet. */
.dp-cauta-form { position: relative; }
.dp-cauta-form > .dp-sim {
  position: absolute;
  right: 0; top: 0;
  width: 2.7rem; height: 2.7rem;    /* 43,2px, gemessen */
  padding: .675rem;                 /* Glyphe 21,6px mittig im Quadrat */
  color: var(--dp-text);
  opacity: .325;
  transform: scaleX(-1);
  pointer-events: none;
}
.dp-camp-cauta { padding-right: 2.75rem; }   /* 44px, gemessen */

/* --- 6. dp-meniu — die Navigation (DESIGN.md 7.3) -------------------------- */

.dp-meniu, .dp-meniu ul { margin: 0; padding: 0; list-style: none; }

.dp-meniu > li { border-top: var(--dp-linie-1) solid var(--dp-linie); }
.dp-meniu > li:first-child { border-top: 0; }

.dp-meniu a {
  display: block;
  border-bottom: 0;
  color: var(--dp-titlu);
  font-family: var(--dp-font-titlu);
  font-size: .9rem;
  font-weight: 400;
  line-height: 3.5em;
  text-transform: uppercase;
  letter-spacing: var(--dp-spatiere);
}
.dp-meniu a:hover { color: var(--dp-accent); }

/* Untermenue — <details>, kein Aufklapp-Skript */
.dp-meniu-grup > summary {
  display: block;
  color: var(--dp-titlu);
  font-family: var(--dp-font-titlu);
  font-size: .9rem;
  line-height: 3.5em;
  text-transform: uppercase;
  letter-spacing: var(--dp-spatiere);
  cursor: pointer;
  list-style: none;
}
.dp-meniu-grup > summary::-webkit-details-marker { display: none; }
/* Der Pfeil ist dieselbe Glyphe wie die Kontaktsymbole: FA5 solid U+F053
   (chevron-left), 14,4px, --dp-mut, rechtsbuendig, auf der Textzeile.
   ZUSTANDSWECHSEL, gemessen: es gibt keinen. Der Pfeil zeigt offen wie zu
   nach links, `transform: none` in beiden Faellen, dieselbe Glyphe, dieselbe
   Farbe. Uebernommen wie gemessen — den Zustand zeigt das aufgeklappte
   Untermenue selbst, nicht der Pfeil. */
.dp-meniu-grup > summary > .dp-sim {
  float: right;
  width: var(--dp-bara-em);
  height: var(--dp-bara-em);
  margin-top: calc((3.5em - var(--dp-bara-em)) / 2);
  color: var(--dp-desc);
}
.dp-meniu-grup > summary:hover { color: var(--dp-accent); }

/* Untermenue — Geometrie am Original gemessen (23.08.2026, 1440px):
   Einrueckung 14,4px · Zeilenhoehe 16px (eng, damit lange Titel wie
   "STATUTUL UNITATII ADMINISTRATIV-TERITORIALE" dreizeilig kompakt umbrechen)
   · 14,4px Luft ueber, 10px unter einem Eintrag · Verweisfarbe --dp-text.
   Alle Werte sind Vielfache von --dp-bara-em (14,4px), ausser den 10px. */
.dp-meniu .dp-meniu-sub {
  margin: calc(var(--dp-bara-em) * .5) 0 calc(var(--dp-bara-em) * 1.5) 0;
  padding-left: var(--dp-bara-em);
}
.dp-meniu-sub > li {
  padding-top: var(--dp-bara-em);
  margin-bottom: .625rem;
  border-top: 0;
}
.dp-meniu-sub a {
  display: inline-block;
  color: var(--dp-text);
  line-height: 1rem;
}
.dp-meniu-sub a:hover { color: var(--dp-accent); }
/* Der geoeffnete Elternpunkt faerbt sich — wie im Original */
.dp-meniu-grup[open] > summary { color: var(--dp-accent); }

/* --- 7. dp-buton, dp-camp (DESIGN.md 7.4, 7.5) ----------------------------- */

.dp-buton {
  display: inline-block;
  height: var(--dp-buton-h);
  line-height: var(--dp-buton-h);
  padding: 0 2.25em;
  border: 0;
  border-radius: var(--dp-raza);
  box-shadow: inset 0 0 0 2px var(--dp-accent);
  background: transparent;
  color: var(--dp-accent);
  font-family: var(--dp-font-titlu);
  font-size: .8rem;
  font-weight: 700;
  letter-spacing: var(--dp-spatiere);
  text-transform: uppercase;
  text-align: center;
  white-space: nowrap;
  cursor: pointer;
  transition: background-color .2s ease-in-out;
}
.dp-buton:hover, .dp-buton:active { background: var(--dp-accent-slab); }

.dp-camp {
  width: 100%;
  height: var(--dp-camp-h);
  line-height: var(--dp-inaltime);
  padding: 0 var(--dp-sp-4);
  border: var(--dp-linie-1) solid var(--dp-linie);
  border-radius: var(--dp-raza);
  background: var(--dp-fundal);
  color: var(--dp-text);
  font-family: var(--dp-font-text);
  font-size: 1rem;
}

/* --- 8. dp-data, dp-eticheta (DESIGN.md 7.6, 7.7) -------------------------- */

.dp-data {
  margin: 0 0 .9rem 0;              /* 14,4px, gemessen (nicht 16) */
  color: var(--dp-meta);
  font-size: .9rem;
  letter-spacing: var(--dp-spatiere);
}
.dp-data .dp-sim {
  width: .81rem; height: .81rem;     /* 12,96px, gemessen */
  margin-right: var(--dp-sp-1);
}
/* In der Listenkarte traegt dieselbe Zeile WEDER Symbol NOCH Sperrung —
   gemessen am Original: kein <i>, letter-spacing: normal, 14,4px.
   Nur auf der Einzelseite steht die Uhr davor. */
.dp-data-lista { font-size: var(--dp-bara-em); letter-spacing: normal; }

/* Kategorie-Zeile und Teilen-Zeile stehen nebeneinander */
.dp-partaja {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--dp-sp-4);
  margin: 0 0 var(--dp-sp-5) 0;
}

.dp-etichete { margin: 0; }
.dp-etichete > .dp-sim {
  width: 1rem; height: 1rem;         /* 16px, gemessen */
  margin-right: var(--dp-sp-2);
  color: var(--dp-text);
}

.dp-partaja-lista {
  display: flex;
  align-items: center;
  gap: var(--dp-sp-4);
  margin: 0;
  padding: 0;
  list-style: none;
}
.dp-partaja-lista a { color: var(--dp-text); border-bottom: 0; line-height: 1; }
.dp-partaja-lista a:hover { color: var(--dp-accent); }
.dp-partaja-lista svg { display: block; width: 1.25rem; height: 1.25rem; fill: currentColor; }
.dp-eticheta {
  color: var(--dp-tag);
  font-size: .9rem;
  border-bottom: 0;
}
.dp-eticheta:hover { border-bottom: var(--dp-linie-1) solid currentColor; }
.dp-eticheta + .dp-eticheta { margin-left: var(--dp-sp-3); }

/* --- 9. dp-articol — die Einzelseite --------------------------------------- */

.dp-articol { padding: var(--dp-sect-t) 0 var(--dp-sect-b) 0; }
/* Ein Abschnitt, der direkt auf einen Trenner folgt, braucht oben keinen
   zweiten Abstand — der Trenner bringt seinen eigenen mit. */
.dp-articol-anschluss { padding-top: 0; }
.dp-articol > :last-child { margin-bottom: 0; }

/* Der Dokumentblock. Der BETRACHTER ist die Grundstellung, der <iframe> ist
   der Rueckfall — umgekehrt zur ersten Fassung dieses Stylesheets.
   Grund, und er ist keine Geschmacksfrage: auf iPhone und iPad zeigt Safari
   ein PDF in einem eingebetteten Rahmen nur mit der ersten Seite oder gar
   nicht. Der Betrachter der laufenden Seite ist auf Buergerbeschwerden hin
   entstanden. Alle vier Werte hier am Original gemessen. */
.dp-document { margin: 0 0 var(--dp-sp-5) 0; }
.dp-document-titlu { font-size: 1.25rem; margin-bottom: var(--dp-sp-6); }
.dp-vizor {
  border: var(--dp-linie-1) solid #ddd;
  background: #f5f5f5;
  max-height: 80vh;
  overflow: auto;
  -webkit-overflow-scrolling: touch;
}
.dp-vizor-pagini { display: block; }
.dp-vizor canvas {
  display: block;
  width: 100%; height: auto;
  margin: 0 auto 8px auto;
  background: #fff;
  box-shadow: 0 1px 4px rgba(0, 0, 0, .15);
}
.dp-vizor-nota {
  padding: 1em;
  text-align: center;
  color: #666;
  font-size: .95em;
}
.dp-document-cadru {
  width: 100%;
  height: 80vh;
  min-height: 30rem;
  border: var(--dp-linie-1) solid var(--dp-linie);
  border-radius: var(--dp-raza);
  background: var(--dp-fundal-bara);
}
.dp-document-jos { margin: var(--dp-sp-6) 0 0 0; }

/* Weiterblaettern — mittig, wie gemessen */
.dp-navigare {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--dp-sp-2);
  margin: var(--dp-sp-5) 0 0 0;
}

/* --- 10. dp-subsol — die Fusszeile der Leiste ------------------------------ */

/* Kontaktliste — am Original gemessen: Einrueckung 43,2px (3x --dp-bara-em),
   Symbol 21,6px (1,5x), und zwischen zwei Zeilen dieselbe Haarlinie wie im
   Menue, mit 21,6px Luft darueber und darunter. Die erste Zeile ohne Linie. */
.dp-contact { margin: 0; padding: 0; list-style: none; }
.dp-contact li {
  position: relative;
  padding-left: calc(var(--dp-bara-em) * 3);
  margin: 0;
}
.dp-contact li + li {
  margin-top: calc(var(--dp-bara-em) * 1.5);
  padding-top: calc(var(--dp-bara-em) * 1.5);
  border-top: var(--dp-linie-1) solid var(--dp-linie);
}
/* DIE HOEHE FUEHRT, DIE BREITE FOLGT — und das ist kein Schoenheitsdetail.
   Die Font-Awesome-Glyphen liegen alle auf einer Hoehe von 512 Einheiten, aber
   NICHT alle auf einer Breite: fa-home ist 576 breit, fa-truck 640, fa-bars
   448. Steht so eine Glyphe in einem QUADRATISCHEN Kasten, passt der Browser
   sie nach der laengeren Seite ein (`preserveAspectRatio` mit `meet`) und
   verkleinert sie um genau 512/Breite — bei fa-home 11,1 %, bei 640 um 20 %.
   Am 25.08.2026 von Lukas am Bild gesehen und danach gemessen:

     Original (Glyphe im Text, 21,6px)   Umschlag 22x16 · Telefon 23x23 · Haus 25x19
     Neubau vorher (quadratischer Kasten) Umschlag 21,6x16,2 · Telefon 21,6x21,6 · Haus 21,6x16,8

   Im Original ist das Haus das GROESSTE der drei, im Neubau war es das
   kleinste. Dieselbe Klasse wie der `fa-flag`-Fund vom 24.08.: eine Glyphe
   bringt ihre eigene Vorschubbreite mit, und wer 512 annimmt, liegt daneben.
   Die Kacheln (`dp-placa-sim`) waren nie betroffen — dort fuehrt schon immer
   die Hoehe. */
.dp-contact .dp-sim {
  position: absolute;
  left: .34rem;
  top: .12em;
  width: auto;                            /* folgt der Glyphenbreite */
  height: calc(var(--dp-bara-em) * 1.5);  /* 21,6px, gemessen */
  color: var(--dp-accent);
}
.dp-contact li + li .dp-sim { top: calc(var(--dp-bara-em) * 1.5 + .12em); }
.dp-contact a:hover { color: var(--dp-accent); }

/* Foerdererkennzeichnung. Wird NICHT neu gestaltet — 1:1 am Original
   gemessen: Logo 84x84, Abstand 16px, Text 12,96px/21,384px in --dp-mut,
   und der Verweis auf digicomuna.ro traegt DIESELBE Farbe wie der Text,
   nicht die Akzentfarbe. Nur der gepunktete Unterstrich zeigt ihn an. */
.dp-subsol { display: flex; align-items: flex-start; gap: var(--dp-sp-4); }
.dp-subsol img { width: 5.25rem; height: 5.25rem; flex: 0 0 auto; }
.dp-subsol-drept { color: var(--dp-desc); font-size: .81rem; }
.dp-subsol-drept a { color: inherit; }
.dp-subsol-drept a:hover { color: var(--dp-accent); }

/* --- 11. dp-lipici — die Aufkleber am Rand (DESIGN.md 7.9) ----------------- */

.dp-lipici-mol {
  position: fixed;
  right: 0; top: 7.5rem;
  z-index: 100;
  display: flex;
  align-items: center;
  gap: var(--dp-sp-2);
  padding: var(--dp-sp-4) var(--dp-sp-3);
  border: 0;
  border-radius: var(--dp-raza) 0 0 var(--dp-raza);
  flex-direction: column;
  background: var(--dp-accent);
  color: #fff;
  font-size: .75rem;
  font-weight: 600;
  letter-spacing: .06em;
}
/* Die Schrift laeuft von UNTEN NACH OBEN, nicht von oben nach unten:
   `vertical-rl` plus 180-Grad-Drehung. Gemessen am Original — dort steht die
   Drehung als matrix(-1,0,0,-1,0,0) auf dem Label, die Huelle bleibt
   waagerecht. Und der Text ist in VERSALIEN. */
.dp-lipici-mol span {
  writing-mode: vertical-rl;
  text-orientation: mixed;
  transform: rotate(180deg);
  text-transform: uppercase;
}
.dp-lipici-mol .dp-sim { width: 1.125rem; height: 1.125rem; }  /* 18px, gemessen */

@media (max-width: 736px) { .dp-lipici-mol { display: none; } }

/* --- 11b. Symbole ----------------------------------------------------------
   Die Umrisse stammen 1:1 aus Font Awesome 5.9.0 — derselbe Satz und dieselbe
   Fassung, die das laufende Theme laedt. Gemessen am Bild, nicht geglaubt:
   das Theme laedt fa-solid-900.woff2 (HTTP 200) und rendert die Kontakt-
   Symbole mit Gewicht 900 = SOLID; nur die Uhr der Datumszeile ist REGULAR.
   Erzeugt mit werkzeug/glyphen_bauen.mjs, ausgeliefert als Pfad im Markup —
   kein Webfont, kein Netzabruf, 9 Symbole statt 78 KB Schriftdatei. */
.dp-sim { display: inline-block; width: 1em; height: 1em; fill: currentColor; vertical-align: -.125em; }

/* --- 12. Hilfsklasse ------------------------------------------------------- */

/* Nur fuer Screenreader. Nicht display:none — das nimmt es ihnen auch weg. */
.dp-ascuns {
  position: absolute;
  width: 1px; height: 1px;
  margin: -1px; padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* --- 13. dp-lista — die Listenansicht (DESIGN.md 7.8, LISTE.md) ------------ */

/* Keine Blaetterleiste. Gemessen: 137 Eintraege stehen heute auf einer Seite.
   Begruendung und Messung: LISTE.md 1. */

.dp-lista-antet { padding: var(--dp-sect-t) 0 0 0; }
/* Der Seitentitel der Liste ist heute 28px — gemessen. Die Ebene bleibt h1
   (die laufende Seite hat dort gar keine h1), die Groesse folgt dem Bild. */
.dp-lista-antet h1 { font-size: 1.75rem; line-height: 1.5; }
@media (max-width: 736px) { .dp-lista-antet h1 { font-size: 1.5rem; } }
.dp-lista-antet > :last-child { margin-bottom: 0; }

/* Die Zahl vor der Liste: sagt vor dem Scrollen, was kommt. */
.dp-numar {
  margin: var(--dp-sp-6) 0 0 0;
  color: var(--dp-meta);
  font-size: .9rem;
  letter-spacing: var(--dp-spatiere);
}

/* --- 13c. Die Reiterleiste und der Filter — DESIGN.md 7.8e --------------
   27.08.2026, am 28.08. zur Reiterreihe und am selben Abend zu KARTEIREITERN
   auf der blauen Linie umgebaut (Skizze Lukas). Weg (c) aus dem Zuschnitt:
   Anker statt Blaetterung.

   Alles darin sind gewoehnliche `<a>` und ein `<details>` — mit der Tastatur
   erreichbar, ohne dass dafuer etwas gebaut wird, und ohne eine Zeile
   JavaScript. Das ist der Grund fuer diesen Weg: eine Blaetterung haette
   `Strg+F` gekostet, und der MOL ist die Pflichtseite, auf der genau das der
   teuerste Posten waere. LISTE.md 1 bleibt stehen.

   ZWEI BAUTEILE, NICHT EINS:

     1. `.dp-bara-file` — die Reiter UND ihre Grundlinie. Sie kleben
        GEMEINSAM am oberen Rand. Die Linie ist nicht Zierat: sie ist die
        Kante, auf der ein Karteireiter aufsitzt, und ohne sie waere ein
        klebender Reiter ein schwebender Knopf.
     2. `.dp-filtre` — der Aufklapper `Rubrici`, rechts UNTER der Linie. Er
        klebt NICHT: er ist ein Einstiegswerkzeug und kein Dauerbegleiter.

   WARUM SIE KLEBEN KANN. Gemessen an der Vorfahrenkette (`main`,
   `.dp-continut-inner`, `.dp-continut`, `.dp-pagina`, `body`, `html`): kein
   einziger fuehrt `overflow` != visible, `transform`, `filter` oder
   `contain` — jedes davon haette `position: sticky` still an einen anderen
   Kasten gebunden. Und nichts sitzt fest am oberen Rand.

   WARUM ERST DIE KURZFORM DAS KLEBEN MOEGLICH MACHT: als Aufzaehlung war die
   Leiste 93 px hoch bei 1280 und 171 px bei 390. Das klebt man einem Leser
   nicht an den oberen Rand. Als Reiterreihe ist sie EINE Zeile. */
.dp-bara-file {
  position: sticky;
  top: 0;
  /* Das Jahr LINKS, die Reiter daneben — auf derselben Grundlinie.
     `flex-end` richtet die Unterkanten aus, und weil Jahr und Reiter dieselbe
     Hoehe und dieselbe obere Luft tragen, sitzt auch die SCHRIFT auf einer
     Linie und nicht nur der Kasten.
     Der Abstand dazwischen ist ein Wert der Designsprache und keine Zufalls-
     zahl: `--dp-sp-5` (2rem), derselbe Sprung, den die Karte zwischen Teaser
     und Knopf traegt. */
  display: flex;
  align-items: flex-end;
  gap: var(--dp-sp-5);
  /* Unter den beiden Aufklebern am Rand (z-index 100), ueber der Liste. */
  z-index: 90;
  margin: 0;
  padding: 0;
  /* DIE GRUNDLINIE. Dieselbe Linie wie unter der Monatsmarke `.dp-an` und
     unter dem Seitenkopf — 3 px in `--dp-accent`. Sie gehoert zum klebenden
     Bauteil und wandert deshalb mit. */
  border-bottom: var(--dp-linie-3) solid var(--dp-accent);
  /* DECKEND, sonst scheint die Liste beim Scrollen durch. Derselbe Grund wie
     bei `.dp-bara-corp`: eine klebende Ebene ohne deckenden Grund laesst
     Chromium ausserdem von Subpixel- auf Graustufen-Kantenglaettung
     umschalten. */
  background: var(--dp-fundal);
}

/* Die Reiter scrollen WAAGERECHT in ihrem eigenen Kasten, sobald sie nicht
   mehr nebeneinander passen — auf dem Telefon der Regelfall. Das `overflow`
   sitzt hier und NICHT an `.dp-bara-file`: am klebenden Kasten wuerde es das
   Kleben brechen (ein scrollender Vorfahr bindet `sticky` an sich).
   `overflow-y: hidden` waere falsch — es schnitte die Reiter oben ab;
   `visible` in einer Achse wird neben `auto` ohnehin zu `auto`. Deshalb
   traegt der Kasten unten den Platz fuer die Rollleiste statt eines
   Beschnitts. */
.dp-luni {
  flex: 1 1 auto;
  min-width: 0;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scrollbar-width: thin;
}
/* DIE REIHE STARTET IMMER AN IHREM JUENGSTEN ENDE — also rechts.
   Bei Kalenderordnung steht der juengste vorhandene Monat am rechten Ende,
   und bei 390 px rollt die Reihe waagerecht: ohne Zutun saehe der Buerger
   `Ian`, `Feb`, `Mar` und nicht das, was gerade passiert ist.

   Die Anfangs-Scrollposition laesst sich ohne JavaScript nur ueber die
   SCHREIBRICHTUNG setzen: in `rtl` liegt der Anfang der Rolle rechts, also
   startet der Kasten am rechten Ende seines Inhalts. Die Liste darin steht
   wieder auf `ltr`, damit die Reiter Ian -> Dec von links nach rechts bleiben.

   ⚠ SIE HING BIS ZUM 28.08.2026 AN DER MARKE (`.dp-luni-dreapta`, gesetzt nur
   wenn der hervorgehobene Reiter der letzte war). Als der Rueckfall entfiel,
   verloren 25 von 42 Listenseiten ihre Marke — und mit ihr die Rollung: dort
   startete die Reihe bei `Mar`, waehrend die juengeren Monate rechts ausserhalb
   lagen. **Der Grund fuer den Kniff hing nie an der Marke, er hing am
   juengsten Ende.** Die Kopplung ist deshalb ersatzlos weg; die Reihe rollt
   jetzt immer nach rechts, ob eine Marke steht oder nicht.

   SICHTBARE POSITION IST KEINE TATSACHENBEHAUPTUNG. Sie darf sich am Bestand
   ausrichten; `aria-current` darf es nicht. Das ist der ganze Unterschied
   zwischen dieser Zeile und dem, was am 28.08. an `jahre()` entfiel.

   DIE EINE GRENZE, benannt: traegt eine Gemeinde Eintraege NACH dem laufenden
   Monat, ist der markierte Reiter nicht mehr der letzte und kann links aus dem
   Bild rollen. Gezaehlt am 28.08.2026: 0 von 635 Eintraegen liegen in der
   Zukunft. */
.dp-luni { direction: rtl; }
.dp-luni > .dp-luni-lista { direction: ltr; }
/* `min-width: 100%` ist der zweite Teil des Kniffs und nicht Zierat: ohne ihn
   hat der Kasten bei breitem Schirm Luft uebrig, und in `rtl` sammelt sich
   die Luft LINKS — die Reiter klebten bei 1280 am rechten Rand, weit weg vom
   Jahr. Mit `min-width: 100%` ist die Liste mindestens so breit wie ihr
   Kasten, es bleibt keine Luft, und die Reiter stehen wieder links beim Jahr.
   Laeuft sie ueber, greift wieder `rtl` und die Rolle startet rechts. */
.dp-luni-lista { min-width: 100%; }

.dp-luni-lista {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-wrap: nowrap;
  /* ENG, wie in der Skizze: Karteireiter beruehren sich fast. Ein Reiter,
     der weit von seinem Nachbarn steht, liest sich als Knopf und nicht als
     Register. */
  gap: 2px;
  width: max-content;
  align-items: flex-end;
}

/* DER KARTEIREITER. Unten OHNE Radius und OHNE Kante: er muendet in die
   Grundlinie, statt auf ihr zu schweben. Das ist der ganze Unterschied
   zwischen einem Register und einer Reihe Pillen. */
.dp-luna-fila {
  position: relative;
  display: flex; align-items: center; gap: var(--dp-sp-2);
  /* DAS TASTZIEL BLEIBT 44 PX, DER REITER SIEHT ABER FLACHER AUS.
     WCAG 2.2 verlangt 24 x 24 (2.5.8); 44 ist die Zahl aus 2.5.5 und die, die
     ein Finger wirklich trifft — dieselbe wie im Bedienteil.
     Das `<a>` ist volle 44 px hoch und damit MESSBAR 44 px; sichtbar gezeichnet
     wird nur der untere Teil, durch ein `::before`, das `--dp-fila-luft` vom
     oberen Rand einrueckt. Die Luft liegt OBEN und nicht unten: unten sitzt
     die Grundlinie, und ein Tastziel, das ueber sie hinausragte, waere ein
     unsichtbarer Knopf im Fliesstext. */
  min-height: var(--dp-acces-tinta);
  padding: var(--dp-fila-luft) var(--dp-sp-3) 0 var(--dp-sp-3);
  color: var(--dp-titlu);
  font-family: var(--dp-font-titlu);
  font-size: .8rem;
  font-weight: 700;
  white-space: nowrap;
}
/* Die sichtbare Reiterflaeche. `z-index: -1` haelt sie hinter der Beschriftung
   und trotzdem ueber dem Grund der Leiste: ein absolut gesetztes `::before`
   ohne negativen Wert laege UEBER dem Text seines eigenen Elternteils. */
.dp-luna-fila::before {
  content: "";
  position: absolute;
  inset: var(--dp-fila-luft) 0 0 0;
  z-index: -1;
  border: var(--dp-linie-1) solid var(--dp-linie-tinta);
  border-bottom: 0;
  border-radius: var(--dp-raza) var(--dp-raza) 0 0;
  background: var(--dp-fundal-bara);
}

/* DER LAUFENDE KALENDERMONAT. Beim BAU gesetzt, nicht beim Scrollen — die
   Aussage ist „dieser Monat laeuft gerade" und nicht „diesen Abschnitt siehst
   du gerade". Voll gefuellt, Beschriftung weiss und fett, die Zahl mit.
   Gerechnet: Weiss auf Akzent 5,78:1 (1.4.3), Akzent auf dem Leistengrund
   5,34:1 (1.4.11, die Flaeche ist der Zustand). */
.dp-luna-activa { color: var(--dp-fundal); }
.dp-luna-activa::before {
  background: var(--dp-accent);
  border-color: var(--dp-accent);
}
.dp-luna-activa .dp-bara-nr { color: var(--dp-fundal); }

/* DER REITER SITZT AUF, WEIL NICHTS DAZWISCHEN STEHT. Ein erster Anlauf zog
   ihn mit `margin-bottom: -3px` ueber die Linie — das haette der Kasten mit
   `overflow-x: auto` unten abgeschnitten, denn `overflow` in einer Achse
   macht die andere ebenfalls zum Kasten. Stattdessen traegt weder `.dp-luni`
   noch `.dp-luni-lista` einen unteren Abstand, und die Linie von
   `.dp-bara-file` liegt unmittelbar darunter. */
.dp-luni, .dp-luni-lista { margin-bottom: 0; }

/* Der angefasste Reiter fuellt sich und betont seine Oberkante — beides aus
   der Skizze. Einen DAUERHAFT aktiven Reiter gibt es nicht: welcher Monat
   gerade im Bild steht, wuesste nur ein Scroll-Spy, und der braeuchte
   JavaScript. Das ist so beauftragt und hier nur festgehalten, damit es
   niemand fuer ein Versehen haelt. */
/* DIE FUELLUNG SAGT DEN ZUSTAND, DIE OBERKANTE SAGTE IHN NOCHMAL. Ein erster
   Anlauf legte zusaetzlich eine betonte Oberkante in `--dp-accent-adanc` auf
   die Fuellung — `kontrast_pruefen.mjs` rechnete sie mit 1,37:1 gegen die
   Fuellung aus. Sie ist ersatzlos weg und nicht aufgeweicht worden: der
   gefuellte Reiter traegt 5,78:1 gegen seine Nachbarn und sagt damit alles,
   was zu sagen ist. Eine zweite Andeutung, die man nicht sieht, macht einen
   Zustand nicht deutlicher — sie macht die Rechnung nur laenger. */
.dp-luna-fila:hover,
.dp-luna-fila:focus-visible { color: var(--dp-fundal); }
.dp-luna-fila:hover::before,
.dp-luna-fila:focus-visible::before {
  background: var(--dp-accent);
  border-color: var(--dp-accent);
}
.dp-luna-fila:hover .dp-bara-nr,
.dp-luna-fila:focus-visible .dp-bara-nr { color: var(--dp-fundal); }
.dp-luna-fila:focus-visible { outline: 2px solid var(--dp-accent); outline-offset: 2px; }

/* --- Das Jahr, links auf der Linie ---------------------------------------
   Es steht EINMAL neben der Reihe statt an jedem Reiter. Genau deshalb faellt
   die Jahreszahl aus der Reiterbeschriftung: `Aug` statt `Aug 26`, und die
   Reihe traegt bei zwoelf Reitern auf 1280 UND 1920 (gemessen; `August 26`
   scrollt dort um 195 bzw. 287 px ueber).

   Es sitzt auf derselben Grundlinie wie die Reiter und ist KEIN Reiter: es
   fuehrt nirgends hin, es sagt, WO man ist. Deshalb keine Kante zu den Seiten,
   keine Kachelform — nur die Schrift des Hauses in Titelgroesse. */
.dp-an-eticheta {
  /* AUF DERSELBEN GRUNDLINIE WIE DIE REITER, nicht nur oben buendig.
     Der Reiter ist 44 px hoch, sichtbar ab `--dp-fila-luft`; das Jahr steht
     ohne Flaeche und traegt deshalb dieselbe Hoehe und dieselbe obere Luft,
     damit seine Schrift auf derselben Linie sitzt wie die der Reiter.
     Vorher stand hier ein `padding-bottom: --dp-sp-3` — eine Zahl ohne
     Verhaeltnis zu irgendetwas, und der Block wirkte dadurch unruhig. */
  margin: 0;
  display: flex;
  align-items: center;
  min-height: var(--dp-acces-tinta);
  padding: var(--dp-fila-luft) 0 0 0;
  color: var(--dp-titlu);
  font-family: var(--dp-font-titlu);
  font-size: 1.25rem;
  font-weight: 700;
  letter-spacing: var(--dp-spatiere);
  white-space: nowrap;
}

/* DIE WEICHE HAT EINE ZWEITE GESTALT, und sie entsteht nur, wenn der Bestand
   mehr als ein Jahr traegt. Heute tut das keine der vierzehn Instanzen; der
   Zweig ist mit `werkzeug/pruefling_ani.mjs` an einem eigens gebauten
   Zwei-Jahres-Bestand belegt und nicht bloss geschrieben.

   Ein Bedienelement mit einer einzigen Option waere eine Attrappe — deshalb
   wird aus dem Element erst dann ein Aufklapper, wenn es etwas zu waehlen
   gibt. Die Bauart ist dieselbe wie beim Filter: `<details>`, ohne eine Zeile
   JavaScript. */
.dp-ani { position: relative; flex: 0 0 auto; }
.dp-an-clapa {
  display: flex; align-items: center; gap: var(--dp-sp-2);
  min-height: var(--dp-acces-tinta);
  padding: 0 var(--dp-sp-3);
  border: var(--dp-linie-1) solid var(--dp-linie-tinta);
  border-bottom: 0;
  border-radius: var(--dp-raza) var(--dp-raza) 0 0;
  background: var(--dp-fundal-bara);
  cursor: pointer;
  list-style: none;
}
.dp-an-clapa::-webkit-details-marker { display: none; }
.dp-an-clapa::after {
  content: "";
  width: .4em; height: .4em;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: translateY(-.15em) rotate(45deg);
  transition: transform .15s ease;
}
.dp-ani[open] > .dp-an-clapa::after { transform: translateY(.1em) rotate(-135deg); }
.dp-an-clapa:hover { border-color: var(--dp-accent); color: var(--dp-accent); }
.dp-an-clapa:focus-visible { outline: 2px solid var(--dp-accent); outline-offset: 2px; }

/* Das Panel HAENGT unter dem Jahr, linksbuendig — der Knopf steht links. */
.dp-ani-panou {
  position: absolute;
  top: calc(100% + var(--dp-linie-3) + var(--dp-sp-2));
  left: 0;
  z-index: 10;
  width: max-content;
  padding: var(--dp-sp-3);
  border: var(--dp-linie-1) solid var(--dp-linie);
  border-radius: var(--dp-raza);
  background: var(--dp-fundal);
  box-shadow: 0 6px 18px rgba(0, 0, 0, .12);
}
.dp-ani-lista {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; gap: var(--dp-sp-2);
}
.dp-ani-lista a {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--dp-sp-4);
  min-height: var(--dp-acces-tinta);
  padding: 0 var(--dp-sp-3);
  border: var(--dp-linie-1) solid var(--dp-linie-tinta);
  border-radius: var(--dp-raza);
  background: var(--dp-fundal-bara);
  color: var(--dp-titlu);
  font-family: var(--dp-font-titlu);
  font-weight: 700;
  font-size: .9rem;
}
.dp-ani-lista a:hover { background: var(--dp-accent-clar); border-color: var(--dp-accent); }
.dp-ani-lista a:focus-visible { outline: 2px solid var(--dp-accent); outline-offset: 2px; }

/* --- Der Filter `Rubrici` — rechts ueber der Linie, und er klebt nicht --- */

/* `<details>` und kein nachgebauter Knopf: es oeffnet ohne alles, `<summary>`
   ist von Haus aus fokussierbar und schaltet mit Enter UND Leertaste, und der
   Browser meldet den Zustand selbst an die Hilfsmittel. `aria-expanded` von
   Hand zu setzen waere hier ein Rueckschritt mit mehr Teilen. */
.dp-filtre {
  position: relative;
  width: max-content;
  /* RECHTSBUENDIG, mit EXAKT definiertem Abstand ueber der Leiste.
     Der Auftrag bot zwei Fassungen an — „auf dieselbe Linie" und „klebt
     weiterhin nicht mit" schliessen sich aber aus: dieselbe Linie hiesse
     dasselbe klebende Element. Gewaehlt ist die zweite Fassung. Damit der
     Block trotzdem als ein Stueck liest, traegt der Knopf denselben flachen
     Koerper wie ein Reiter, und der Abstand ist `--dp-sp-6` nach oben und
     NULL nach unten: die Leiste bringt ihre eigene Luft mit. */
  margin: var(--dp-sp-6) 0 0 auto;
}

/* DERSELBE FLACHE KOERPER WIE EIN REITER — 44 px treffbar, 36 px sichtbar,
   dieselbe Schriftgroesse. Der Block liest sich dadurch als ein Stueck, auch
   wenn der Knopf ueber der Linie steht und nicht auf ihr. */
.dp-filtre-buton {
  position: relative;
  display: flex;
  align-items: center;
  gap: var(--dp-sp-2);
  min-height: var(--dp-acces-tinta);
  padding: var(--dp-fila-luft) var(--dp-sp-3) 0 var(--dp-sp-3);
  color: var(--dp-titlu);
  font-family: var(--dp-font-titlu);
  font-size: .8rem;
  font-weight: 700;
  letter-spacing: var(--dp-spatiere);
  cursor: pointer;
  white-space: nowrap;
  list-style: none;                    /* der eigene Marker des Browsers … */
}
.dp-filtre-buton::before {
  content: "";
  position: absolute;
  inset: var(--dp-fila-luft) 0 0 0;
  z-index: -1;
  border: var(--dp-linie-1) solid var(--dp-linie-tinta);
  border-radius: var(--dp-raza);
  background: var(--dp-fundal-bara);
}
.dp-filtre-buton:hover::before { border-color: var(--dp-accent); }
.dp-filtre-buton::-webkit-details-marker { display: none; }   /* … und in WebKit */
.dp-filtre-buton:hover { color: var(--dp-accent); }
.dp-filtre-buton:focus-visible { outline: 2px solid var(--dp-accent); outline-offset: 2px; }

/* Der Pfeil ist CSS und kein Symbol aus `glyphen.json`: er dreht sich mit
   `[open]` und braucht dafuer weder eine zweite Datei noch einen Umriss. */
.dp-filtre-buton::after {
  content: "";
  width: .45em; height: .45em;
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  transform: translateY(-.15em) rotate(45deg);
  transition: transform .15s ease;
}
.dp-filtre[open] > .dp-filtre-buton::after { transform: translateY(.1em) rotate(-135deg); }

/* Das Panel HAENGT, es schiebt nicht — und es haengt RECHTSBUENDIG unter dem
   Knopf, weil der Knopf rechts steht. Schoebe es, wanderte die ganze Liste
   beim Oeffnen nach unten und der Leser verloere die Stelle, an der er war. */
.dp-filtre-panou {
  position: absolute;
  top: calc(100% + var(--dp-sp-2));
  right: 0;
  z-index: 10;
  width: max-content;
  max-width: min(30rem, calc(100vw - 2 * var(--dp-sp-4)));
  padding: var(--dp-sp-4);
  border: var(--dp-linie-1) solid var(--dp-linie);
  border-radius: var(--dp-raza);
  background: var(--dp-fundal);
  box-shadow: 0 6px 18px rgba(0, 0, 0, .12);
}
.dp-filtre-lista {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-wrap: wrap; gap: var(--dp-sp-2);
}
/* Die Kachelform des Bedienteil-Panels (7.17), nur einzeilig. */
.dp-filtre-lista a {
  display: flex; align-items: center; gap: var(--dp-sp-2);
  min-height: var(--dp-acces-tinta);
  padding: 0 var(--dp-sp-3);
  border: var(--dp-linie-1) solid var(--dp-linie-tinta);
  border-radius: var(--dp-raza);
  background: var(--dp-fundal-bara);
  color: var(--dp-titlu);
  font-size: .85rem;
}
.dp-filtre-lista a:hover { background: var(--dp-accent-clar); border-color: var(--dp-accent); }
.dp-filtre-lista a:focus-visible { outline: 2px solid var(--dp-accent); outline-offset: 2px; }

/* DIE RUBRIK, AUF DER MAN STEHT. Seit dem 06.09.2026 steht die Leiste auch auf
   den Rubrikseiten; ohne Marke saehen dort elf gleiche Knoepfe aus, von denen
   einer auf die eigene Seite zeigt.

   Dieselbe Behandlung wie beim laufenden Monat (`.dp-luna-activa`, 7.9): voll
   gefuellt, Beschriftung in der Grundfarbe, die Zahl mit. Zwei Traeger, nicht
   einer — `aria-current="page"` fuer die Hilfsmittel, die Flaeche fuer das
   Auge; Farbe allein traegt hier nichts (1.4.1), weil der Unterschied eine
   gefuellte gegen eine leere Flaeche ist und nicht zwei Farbtoene. */
.dp-filtre-lista a[aria-current="page"] {
  background: var(--dp-accent);
  border-color: var(--dp-accent);
  color: var(--dp-fundal);
}
.dp-filtre-lista a[aria-current="page"]:hover { background: var(--dp-accent); }
.dp-filtre-lista a[aria-current="page"] .dp-bara-nr { color: var(--dp-fundal); }

/* Die Zahl neben der Beschriftung — in Reiter, Knopf und Panel dieselbe. */
.dp-bara-nr { color: var(--dp-meta); font-size: .85em; font-weight: 400; }

/* Auf dem Telefon nimmt der Filter die volle Zeile und bleibt rechtsbuendig —
   so steht es in der Skizze. Die Reiter scrollen daneben weiter waagerecht. */
@media (max-width: 736px) {
  .dp-filtre { width: 100%; }
  .dp-filtre-buton { justify-content: flex-end; }
}

/* Das Sprungziel darf nicht UNTER der klebenden Leiste verschwinden. Der
   Abstand ist deshalb ihre Hoehe plus Luft und nicht mehr `--dp-sp-6`: die
   Leiste ist ein Tastziel (44 px) plus ihr Innenrand, und wer springt, soll
   die Marke SEHEN und nicht die Karten darunter. */
.dp-an[id] {
  scroll-margin-top: calc(var(--dp-acces-tinta) + 2 * var(--dp-sp-2) + var(--dp-sp-4));
}

/* Monatsmarke — Landmarke in einer langen Liste, nimmt nichts weg.
   Bis zum 27.08.2026 war es die JAHRESmarke; gemessen tragen aber alle 635
   Eintraege der sechzehn Instanzen dasselbe Jahr, und damit stand auf jeder
   Seite genau EINE Marke ueber der ganzen Wand. LISTE.md 1, Nachtrag. */
.dp-an {
  margin: var(--dp-sp-9) 0 var(--dp-sp-6) 0;
  padding-bottom: var(--dp-sp-2);
  border-bottom: var(--dp-linie-3) solid var(--dp-accent);
  font-family: var(--dp-font-titlu);
  font-size: 1.25rem;
  font-weight: 700;
  color: var(--dp-titlu);
}
.dp-an:first-child { margin-top: var(--dp-sp-6); }

/* Zwischenraum und Haarstriche wie im Original: der Abstand ist ein
   RASTERZWISCHENRAUM, die Striche sind Pseudoelemente und nehmen keinen Platz.
   Vorher trug die Karte Innenrand und `border-right`; der Rahmen nahm 1px von
   der Textbreite, und bei DREI Spalten (oberhalb 1680) wurden daraus drei
   ungleich breite Karten — 408 / 382 / 409 statt dreimal 400,8. Am 24.08.
   gemessen und umgestellt. */
.dp-lista {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--dp-sp-8);                 /* 48px, wie im Original 3em */
  margin: 0 0 var(--dp-sp-5) 0;
}

.dp-carte {
  position: relative;
  /* Spalte, damit der Knopf am FUSS der Karte sitzt und nicht direkt unter
     dem Text: `margin-top: auto` schiebt ihn nach unten, und alle Karten
     einer Reihe fluchten. Im Original steht dafuer
     `.posts article { display:flex; flex-direction:column }` mit
     `.posts article .actions { margin-top:auto }`. Ohne das standen die drei
     juengsten Anuntzuri auf der Startseite ungleich und versetzt. */
  display: flex;
  flex-direction: column;
}
.dp-carte > :last-child { margin-bottom: 0; }
.dp-carte-jos { margin-top: auto; }
.dp-carte::before, .dp-carte::after {
  content: "";
  position: absolute;
  background: var(--dp-linie);
}
/* senkrecht, links neben der Karte, mittig im Zwischenraum */
.dp-carte::before {
  top: 0; left: calc(-1 * var(--dp-sp-6));
  width: 1px; height: calc(100% + var(--dp-sp-8));
}
/* waagerecht, unter der Karte */
.dp-carte::after {
  right: 0; bottom: calc(-1 * var(--dp-sp-6));
  height: 1px; width: calc(100% + var(--dp-sp-8));
}
.dp-carte:nth-child(2n+1)::before { display: none; }
.dp-carte:nth-child(2n+1)::after  { width: 100%; }
.dp-carte:nth-last-child(-n+2)::after  { display: none; }
.dp-carte:nth-last-child(-n+2)::before { height: 100%; }

/* Abstand unter dem Kartentitel: 1em der eigenen Schrift, nicht --dp-sp-6.
   Hier stand 24px; am Original gemessen sind es 28px (= 1em von 1,75rem).
   Der Unterschied ist klein und ADDIERT SICH: ueber die 24 Reihen der
   MOL-Liste waren es 96px. Mit 1em stimmt derselbe Baustein auch dort,
   wo er kleiner gesetzt ist — auf der Startseite 20px, ebenfalls gemessen. */
.dp-carte-titlu { margin: 0 0 1em 0; font-size: 1.75rem; }
.dp-carte-titlu a { color: inherit; border-bottom: 0; }
.dp-carte-titlu a:hover { color: var(--dp-accent); }
.dp-carte-rezumat { margin: 0 0 var(--dp-sp-5) 0; }

/* --- 13b. DIE FESTE KARTENGEOMETRIE — DESIGN.md 7.8d ----------------------
   27.08.2026, berichte/ZUSCHNITT_mol_uebersicht_2026-08-27.md.

   ZWEI Zeilen Titel, DREI Zeilen Teaser, beide RESERVIERT. Das Reservieren
   ist der Punkt, nicht das Kappen: die Karten EINER Reihe waren schon vorher
   pixelgleich (das Raster steht auf `stretch`, gemessen: 0 ungleiche Reihen,
   groesster Unterschied 0,00 px an 15 Laeufen). Ungleich waren die REIHEN
   untereinander, und zwar um genau ein bis zwei Teaserzeilen — die Spanne bei
   1280 war 48,4 px = 2 x 24,2 px. Ein blosses `line-clamp` haette daran
   nichts geaendert: eine Karte mit einzeiligem Teaser bliebe kurz. Erst
   `min-height` macht jede Karte gleich hoch.

   WARUM ZWEI ZEILEN TITEL UND NICHT EINE. Bei 1280 kostet der Einzeiler fast
   nichts (6 von 406 Karten). Aber das Bedienteil vergroessert bis 1,45, und
   die `Declaratie de accesibilitate` sagt WCAG 2.1 AA zu — 1.4.4 verlangt
   200 % OHNE Verlust von Inhalt. Gemessen bei `--dp-lupe: 1.45`:

       1280   128 von 406 Titel verloeren ihren Rest   (31,5 %)
        390   259 von 406                              (63,8 %)
       1920   342 von 406                              (84,2 %)

   Mit zwei Zeilen sind es 8 / 55 / 120. Bei 1280 und 1,00 sind es NULL —
   und der Teaser ebenfalls null, weil er in den Daten schon bei 220 Zeichen
   endet und drei Zeilen dort die tatsaechliche Obergrenze sind. Bei der
   Referenzbreite wird die Geometrie also fest, ohne dass ein Zeichen
   verschwindet.

   DIE MASSE STEHEN IN `em` DER EIGENEN SCHRIFT, nicht in px: 2 x 1,5 = 3em
   fuer den Titel (h3-Zeilenhoehe), 3 x 1,65 = 4,95em fuer den Teaser
   (--dp-inaltime). Damit waechst der Kasten mit der Lupe MIT, statt den Text
   bei jeder Stufe weiter abzuschneiden. Ein px-Wert waere hier genau der
   Fehler, den 1.4.4 meint.

   NUR DIE MOL-LISTE. `.dp-lista-recente` auf der Startseite traegt dieselben
   Bausteine bei anderer Schriftgroesse und steht nicht in diesem Auftrag —
   sie bleibt, wie sie ist. Benannter Folgepunkt, kein Versehen. */
/* EIN LANGES WORT ZOG DAS GANZE RASTER BREIT. Ein Rasterfeld traegt von Haus
   aus `min-width: auto`, also mindestens seine Mindestinhaltsbreite — und die
   ist so breit wie das laengste Wort, das nicht umbrechen kann. Im Bestand
   gibt es NEUN Woerter ab 26 Zeichen, das laengste mit 59:

       Aplicarea_HCL_nr.36_din_29.07.2026_privind_preturile_la_apa

   Ein einziger Eintrag auf Balta Alba. Gemessen bei 390 px: die Seite lief auf
   496 px hinaus, die Karte wurde 467 statt 331 px breit — und damit war die
   Geometrie nicht mehr fest, sondern haing an einem Dateinamen. Nach der
   Umstellung auf Monatsraster wurde es nicht besser, nur ungleichmaessiger:
   nur noch das Raster mit diesem Eintrag lief ueber, die anderen fuenf nicht.
   Vier verschiedene Kartenbreiten auf einer Seite.

   `min-width: 0` erlaubt dem Feld, unter die Mindestinhaltsbreite zu gehen;
   `overflow-wrap: anywhere` gibt dem Wort eine Bruchstelle — und `anywhere`
   und nicht `break-word`, weil nur `anywhere` auch in die Berechnung der
   Mindestinhaltsbreite eingeht. Beides zusammen, sonst wirkt keines. */
/* WO DER RESERVIERTE PLATZ SITZT, UND WARUM NICHT AM TEXT.
   Die erste Fassung reservierte an den Bausteinen selbst — `min-height: 3em`
   am Titel, `4.95em` am Teaser. Die Karten waren damit gleich hoch, aber im
   Schirmbild standen ZWEI Loecher in jeder Karte: eins zwischen Titel und
   Datum, eins zwischen Teaser und Knopf. Auf Balta Alba, wo fast jeder Titel
   einzeilig und fast jeder Teaser einzeilig ist, betraf das JEDE Karte.

   Die Reservierung sitzt deshalb an der KARTE. Der Ueberschuss sammelt sich
   dann an einer Stelle statt an zweien — und zwar ueber dem Knopf, weil
   `.dp-carte-jos { margin-top: auto }` ihn an den Fuss zieht. Das ist die
   Stelle, an der Freiraum in einer Karte hingehoert.

   Die Hoehe ist ZUSAMMENGESETZT und nicht abgemessen: jeder Summand nennt
   sein Bauteil und greift dessen Token. Eine abgelesene Zahl (19,133rem)
   waere still falsch geworden, sobald jemand einen Abstand aendert; diese
   Summe waechst mit. Gegengemessen: 280,61 px bei 1280 und 331,63 px bei
   1920 — dieselbe Zahl, die der Bau ohne `min-height` fuer seine hoechste
   Karte ergibt. `werkzeug/geometrie_pruefen.mjs` haelt beides gegeneinander. */
.dp-lista:not(.dp-lista-recente) .dp-carte {
  min-width: 0;
  min-height: calc(
      2 * 1.5 * 1.75rem                        /* Titel, zwei Zeilen (h3 1,5) */
    + 1.75rem                                  /* Abstand darunter: 1em davon */
    + var(--dp-bara-em) * var(--dp-inaltime)   /* die Datumszeile */
    + .9rem                                    /* Abstand darunter (dp-data)  */
    + 3 * var(--dp-inaltime) * 1rem            /* Teaser, drei Zeilen         */
    + var(--dp-sp-5)                           /* Abstand darunter            */
    + var(--dp-buton-h)                        /* die Knopfzeile              */
  );
}

.dp-lista:not(.dp-lista-recente) .dp-carte-titlu,
.dp-lista:not(.dp-lista-recente) .dp-carte-rezumat {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  overflow: hidden;
  overflow-wrap: anywhere;
}
.dp-lista:not(.dp-lista-recente) .dp-carte-titlu { -webkit-line-clamp: 2; line-clamp: 2; }
.dp-lista:not(.dp-lista-recente) .dp-carte-rezumat { -webkit-line-clamp: 3; line-clamp: 3; }

/* DREI Spalten oberhalb 1680 px — so haelt es das Original (`.posts` traegt
   dort `repeat(3, 1fr)`). Der Neubau blieb bis zum 24.08. bei zwei und zeigte
   auf einem grossen Schirm 400,8 px breite Karten als 693,94 px breite.
   Die Haarstriche folgen mit: senkrecht zwischen den Spalten, waagerecht
   zwischen den Reihen — dieselbe Regel, nur mit 3n statt 2n. */
@media (min-width: 1681px) {
  .dp-lista { grid-template-columns: repeat(3, 1fr); }
  .dp-carte:nth-child(2n+1)::before { display: block; }
  .dp-carte:nth-child(2n+1)::after  { width: calc(100% + var(--dp-sp-8)); }
  .dp-carte:nth-last-child(-n+2)::after  { display: block; }
  .dp-carte:nth-last-child(-n+2)::before { height: calc(100% + var(--dp-sp-8)); }
  .dp-carte:nth-child(3n+1)::before { display: none; }
  .dp-carte:nth-child(3n+1)::after  { width: 100%; }
  .dp-carte:nth-last-child(-n+3)::after  { display: none; }
  .dp-carte:nth-last-child(-n+3)::before { height: 100%; }
}

/* Eine Spalte, sobald zwei nicht mehr lesbar sind */
@media (max-width: 980px) {
  .dp-lista { grid-template-columns: 1fr; }
  .dp-carte::before { display: none; }
  .dp-carte::after  { display: block; width: 100%; }
  .dp-carte:last-child::after { display: none; }
}

/* --- 14. dp-gol — der Leerzustand (LISTE.md 2) ----------------------------- */

/* Eine Anzeige muss sagen, was sie nicht hat.
   Auf den RUBRIKSEITEN gibt es diesen Kasten im Original bereits
   (`.empty-state`) — die Werte hier sind von dort gemessen:
   Grund #f8f9fa, linke Kante 3px #ccc, Radius 4px, Text #6c757d,
   15,2px/22,8px, Innenrand 20px/24px.
   Auf der MOL-LISTE gibt es ihn im Original NICHT (dort steht weisse
   Flaeche, siehe LISTE.md 2) — derselbe Baustein, dort als Zusatz. */
.dp-gol {
  margin: 0 0 var(--dp-sp-5) 0;
  padding: 20px 24px;
  border-left: var(--dp-linie-3) solid var(--dp-linie);
  border-radius: 4px;
  background: var(--dp-gol-fundal);
  color: var(--dp-desc);
  font-size: calc(15.2px * var(--dp-lupe, 1));
  line-height: 1.5;
}
.dp-gol > :last-child { margin-bottom: 0; }
.dp-gol p { margin-bottom: var(--dp-sp-3); }
.dp-gol-titlu {
  margin: 0 0 var(--dp-sp-2) 0;
  font-family: var(--dp-font-titlu);
  font-size: calc(17.6px * var(--dp-lupe, 1));
  font-weight: 700;
  color: var(--dp-titlu);
}
.dp-gol .dp-buton { margin-top: var(--dp-sp-3); }

/* --- 15. dp-vorschau — Streifen der Vorschau-Instanz ----------------------- */

/* NUR auf der Vorschau unter preg.ro. Gehoert NICHT auf eine Gemeindeseite. */
.dp-vorschau {
  position: relative;
  z-index: 300;
  padding: var(--dp-sp-3) var(--dp-sp-6);
  background: #7c2d12;
  color: #fff;
  font-size: .85rem;
  /* GANZE Pixel: 12 + 20 + 12 = 44. Mit line-height 1.5 waeren es 44,4 px,
     und die halbe Pixelphase verschiebt JEDE 1px-Linie darunter um eine
     Zeile. Beim Bildvergleich gegen die laufende Seite sah das aus wie ein
     Designfehler und war der Streifen selbst. */
  line-height: 1.25rem;
  text-align: center;
}
.dp-vorschau strong { color: #fff; }
.dp-vorschau a { color: #fff; border-bottom-color: rgba(255,255,255,.6); }

/* --- 16. Das Rubrik-Muster (DESIGN.md 7.10) --------------------------------
   EIN Muster, drei Seiten: Informatii (9 Rubriken), Transparenta (5 aus der
   Maske + 2, die das System selbst fuellt), Integritate (3).
   Alle Werte am Massstab gemessen, 1440px. */

/* Zusaetzliche Farben, jede mit genau einer Aufgabe */
:root {
  --dp-desc:         #555555;   /* Beschreibungstext unter einer Ueberschrift */
  --dp-titlu-tare:   #1a1a1a;   /* Rubriktitel — dunkler als --dp-titlu */
  --dp-gol-fundal:   #f8f9fa;   /* Grund des Leerzustands */
  /* --dp-gol-text (#6c757d) ist am 26.08.2026 ebenfalls AUSSER DIENST — und
     gefunden hat ihn nicht das Auge, sondern werkzeug/kontrast_pruefen.mjs
     beim ersten Lauf. Von Hand gegen Weiss gerechnet besteht er (4.69:1);
     auf der Leiste traegt er 4.33:1 und auf seinem EIGENEN Grund
     (--dp-gol-fundal) 4.45:1 — beides unter 1.4.3. Genau dafuer gibt es das
     Pruefmittel. Seine zwei Stellen (Leerzustand, abgeschaltetes Formular)
     tragen jetzt --dp-desc. */
  --dp-accent-adanc: #1d5290;   /* Unterrubrik-Titel, Querverweis */
  --dp-accent-clar:  #eaf1f9;   /* Grund des Querverweises */
  --dp-incheiat:     #1d7a4d;   /* abgeschlossener Concurs — am Original
                                   gemessen: `cariera-badge--done` traegt
                                   genau dieses Gruen als Schriftfarbe */
}

/* 16.1 Der Kopf einer Rubrikseite */
.dp-hero { margin: 0 0 48px 0; }
.dp-hero-imagine {
  display: block;
  width: 100%;
  max-height: 310px;
  object-fit: cover;
  border-radius: 8px;
  margin-bottom: 32px;
}
.dp-hero-titlu {
  margin: 0 0 12px 0;                              /* fest */
  font-size: 1.75rem; line-height: 1.5;            /* waechst mit: h2 des Themes */
}
.dp-hero-desc {
  margin: 0;
  color: var(--dp-desc);
  font-size: calc(15.2px * var(--dp-lupe, 1)); line-height: 1.6;             /* 15,2/24,32 */
}
.dp-hero-desc + .dp-hero-desc { margin-top: 0; }

/* 16.2 Gefuellter Knopf — die zweite Knopfform, nur fuer Verweise nach aussen */
.dp-cta-rand {
  display: flex; flex-wrap: wrap;
  justify-content: flex-end;
  gap: 12px;
  margin-top: 16px;
}
.dp-cta {
  display: inline-block;
  padding: 10px 22px;
  border: 0; border-radius: 4px;
  background: var(--dp-accent);
  color: #fff;
  font-family: var(--dp-font-text);
  font-size: calc(16px * var(--dp-lupe, 1)); font-weight: 500;   /* gemessen; Open Sans v44 ist variabel */
  text-decoration: none;
  transition: background-color .2s ease-in-out;
}
.dp-cta:hover { background: var(--dp-accent-adanc); color: #fff; }

/* 16.3 Die Rubrik */
.dp-rubrica { margin: 0 0 32px 0; }
.dp-rubrica-titlu {
  margin: 0 0 8px 0;                               /* fest */
  font-size: 1.25rem; line-height: 1.5;            /* waechst mit */
  font-weight: 600;
  color: var(--dp-titlu-tare);
}
.dp-desc {
  margin: 0 0 20px 0;
  color: var(--dp-desc);
  font-size: calc(15.2px * var(--dp-lupe, 1)); line-height: 1.55;            /* 15,2/23,56 */
}
.dp-subrubrica { margin-bottom: 22.4px; }          /* 1,4rem des Originals */
/* Innerhalb einer Rubrik traegt der Leerzustand keinen eigenen Abstand —
   den Abstand macht die Rubrik. Gemessen: margin-bottom 0. */
.dp-rubrica > .dp-gol, .dp-subrubrica > .dp-gol { margin-bottom: 0; }
.dp-subrubrica-titlu {
  margin: 0 0 5.6px 0;
  font-size: calc(16px * var(--dp-lupe, 1)); line-height: 1.5;               /* 16/24 */
  font-weight: 700;
  color: var(--dp-accent-adanc);
}

/* 16.4 Die Tabelle: Denumire | Data | Acces */
.dp-tabel-huelle { overflow-x: auto; margin: 0 0 25px 0; }
.dp-tabel { width: 100%; border-collapse: collapse; }
.dp-tabel th {
  padding: 10px;                                   /* fest */
  border-bottom: var(--dp-linie-2) solid var(--dp-linie);
  color: var(--dp-titlu);
  font-size: .9rem; font-weight: 600;              /* waechst mit */
  text-align: left;
  white-space: nowrap;
}
.dp-tabel td {
  padding: 10px;
  border-bottom: var(--dp-linie-1) solid var(--dp-linie);
  vertical-align: top;
}
.dp-tabel-data { white-space: nowrap; }
.dp-tabel-acces { white-space: nowrap; }

/* 16.5 Querverweis — wenn eine Rubrik auf eine andere Seite zeigt */
.dp-legaturi { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 10px; }
.dp-legatura {
  display: inline-block;
  padding: 9px 16px;
  /* 6px FEST, nicht --dp-raza: der Querverweis gehoert zur festen Skala des
     Originals (`.iip-reflink { border-radius: 6px }`), waehrend --dp-raza mit
     dem Fuss waechst wie der Knopf, dessen Radius im Theme in `em` steht. */
  border: 0; border-radius: 6px;
  background: var(--dp-accent-clar);
  color: var(--dp-accent-adanc);
  font-size: calc(14.72px * var(--dp-lupe, 1)); font-weight: 600;
  text-decoration: none;
}
/* 1px Rahmen wie im Original gemessen (rgb(214,227,240)).
   Der Pfeil ist Dekoration, keine Inhaltsangabe — im Original haengt ihn das
   Twig-Template an den Text, hier steht er im CSS. So bleibt der Text in den
   Daten der reine Titel. */
.dp-legatura { border: var(--dp-linie-1) solid #d6e3f0; }
.dp-legatura::after { content: " \2192"; }
.dp-legatura:hover { background: var(--dp-accent); color: #fff; }

@media (max-width: 736px) {
  .dp-cta-rand { justify-content: flex-start; }
  .dp-legatura { display: block; width: 100%; }
}

/* --- 17. dp-contact — die Kontaktseite (DESIGN.md 7.11) --------------------
   Gemessen an /ro/sesizari-contact, 1440px. */

/* Die Karte ist im Original ein SEITENVERHAELTNIS, kein fester Kasten:
   `.map-responsive { padding-bottom: 40.25%; height: 0 }` mit einem <iframe>,
   das 90% davon fuellt. Also 40,25 x 0,9 = 36,225% der eigenen Breite.
   Vorher stand hier eine feste Hoehe von 21,5rem; bei 1440px traf sie auf
   0,3px genau und bei 1920px um 100px daneben. Am 24.08. nachgemessen. */
.dp-harta {
  display: block;
  width: 100%;
  aspect-ratio: 1000 / 362.25;        /* = 36,225% der Breite */
  height: auto;
  border: 0;
  border-radius: 10px;
  margin-bottom: var(--dp-sp-5);
}

.dp-contact-caseta { padding-top: var(--dp-sp-6); }   /* 40px oben, s.u. */
.dp-contact-raster {
  display: flex; flex-wrap: wrap;
  align-items: flex-start;            /* Kaesten so hoch wie ihr Inhalt */
  gap: 40px;
}
/* Der Textblock ist im Symbol ZENTRIERT, nicht oben ausgerichtet.
   Gemessen: Zeile 82,5px hoch, Text 72px, Versatz 5,3px = (82,5-72)/2. Ist
   der Text hoeher als 82,5, waechst die Zeile und der Versatz wird 0 —
   beides mit `center` getroffen. Am Original nachgemessen (1440px):

       Zeile 1  289,59 x 82,5   Text 72 bei dy 5,25
       Zeile 2  289,61 x 82,5   Text 72 bei dy 5,25
       Zeile 3  289,61 x 96     Text 96 bei dy 0

   DIE 82,5 STEHEN SEIT 25.08.2026 HIER und nicht mehr am Symbol. Vorher
   hielt `min-height` am `.dp-sim` die Zeile — als Nebenwirkung. Sobald das
   Symbol seine eigene Hoehe bekam (50px, wie im Original), fiel die Zeile
   auf 72 und alles darunter rueckte 10,5px hoch. Gemessen, nicht vermutet:
   die Kastenpruefung ueber sechs Haltepunkte hat es gezeigt.
   Eine Hoehe, die einem Kind gehoert und eine Zeile haelt, haelt sie nur
   so lange, wie niemand das Kind anfasst. */
.dp-contact-teil {
  display: flex;
  align-items: center;
  gap: 15px;
  flex: 1 1 250px;                    /* min-width: 250px im Original */
  min-height: 82.5px;                 /* die Zeilenhoehe, gemessen */
}
.dp-contact-teil > .dp-sim {
  /* HOEHE FUEHRT, BREITE FOLGT — am Original gemessen, 25.08.2026 (web-v4).
     Die drei Zellen sind dort NICHT gleich breit: `.map-contact__icon` traegt
     `flex: 0 0 auto`, und die Glyphe bestimmt die Breite ueber ihre
     Vorschubbreite. An allen sechs Haltepunkten identisch:

         fa-house         vb 576   Zelle 56 x 82,5   Glyphe 56 x 50
         fa-calendar-days vb 448   Zelle 44 x 82,5   Glyphe 44 x 50
         fa-comment-dots  vb 512   Zelle 50 x 82,5   Glyphe 50 x 50

     `flex: 0 0 56px` war deshalb ZWEIMAL falsch: es quetschte das Haus
     (576 in 56 statt 56,25 -> 11,1 % zu klein, der sichtbare Fund) UND es
     machte Kalender und Sprechblase um 12 bzw. 6 px zu breit.

     `width: 50px; height: 50px` bestimmte den Kasten dabei GAR NICHT —
     die Flex-Basis und `min-height` ueberschrieben beide. Ein Tausch auf
     `width: auto` allein haette nichts geaendert; nachgemessen. */
  flex: 0 0 auto;
  width: auto; height: 50px;          /* Glyphe 50px hoch, Breite frei */
  align-self: flex-start;
  margin-top: 14px;                   /* Versatz der Glyphe in der Zelle */
  color: #1e3050;                     /* eigene, dunklere Blaustufe */
}
.dp-contact-teil > div { flex: 1 1 auto; min-width: 0; }
/* Der Seitentitel der Kontaktseite traegt 28px Abstand, nicht 12 wie auf den
   Rubrikseiten — gemessen. */
.dp-contact-titlu { margin-bottom: var(--dp-sp-5); }
.dp-contact-text {
  margin: 0;
  color: #1b1b1b;
  font-size: calc(15px * var(--dp-lupe, 1)); line-height: 1.6;       /* 15/24 */
}
/* Im Kontaktkasten sind die WERTE schwarz — die Beschriftungen wie die
   Adressen. Gemessen: strong #000, und der E-Mail-Verweis ebenfalls #000. */
.dp-contact-text strong,
.dp-contact-text .dp-adresa { color: #000; }
.dp-contact-text strong { font-weight: 600; }

/* Formular. Feld und Knopf sind schon da (dp-camp, dp-buton) — hier nur
   Beschriftung, Abstand und das mehrzeilige Feld. */
.dp-formular { margin: 0 0 var(--dp-sp-5) 0; }
.dp-camp-grup { margin-bottom: var(--dp-sp-4); }
.dp-eticheta-camp {
  display: block;
  margin: 15px 0 5px 0;
  color: var(--dp-titlu);
  font-size: calc(15px * var(--dp-lupe, 1)); line-height: 1.65;
  font-weight: 600;
}
.dp-camp-lung {
  height: auto; min-height: 78.8px;
  padding: 12px 16px;
  resize: vertical;
}
.dp-camp-nota {
  margin: var(--dp-sp-2) 0 0 0;
  color: var(--dp-desc);
  font-size: .9rem;
}

/* Auswahlfeld und Ankreuzfeld — dieselbe Feldhoehe wie dp-camp */
select.dp-camp { appearance: none; padding-right: var(--dp-sp-7); cursor: pointer;
  background-image: linear-gradient(45deg, transparent 50%, var(--dp-text) 50%),
                    linear-gradient(135deg, var(--dp-text) 50%, transparent 50%);
  background-position: calc(100% - 1.15rem) 50%, calc(100% - .8rem) 50%;
  background-size: .35rem .35rem, .35rem .35rem; background-repeat: no-repeat; }
.dp-bifa { display: flex; gap: var(--dp-sp-3); align-items: flex-start;
  margin-top: var(--dp-sp-4); font-size: .9375rem; line-height: 1.65; cursor: pointer; }
.dp-bifa input { margin-top: .35em; flex: 0 0 auto; }

/* dp-nota — ein Hinweis, der KEIN Leerzustand ist.
   dp-gol sagt "hier ist nichts". dp-nota sagt "das hier geht noch nicht".
   Zwei verschiedene Aussagen, deshalb zwei Bausteine und zwei Farben. */
.dp-nota {
  margin: 0 0 var(--dp-sp-5) 0;
  padding: 1.25rem 1.5rem;
  border-left: var(--dp-linie-3) solid var(--dp-accent);
  border-radius: .25rem;
  background: var(--dp-accent-clar);
  color: var(--dp-text);
  font-size: .95rem;
  line-height: 1.55;
}
.dp-nota > :last-child { margin-bottom: 0; }
.dp-nota p { margin-bottom: var(--dp-sp-3); }
.dp-nota-titlu {
  margin: 0 0 var(--dp-sp-2) 0;
  font-family: var(--dp-font-titlu);
  font-size: 1rem; font-weight: 700;
  color: var(--dp-accent-adanc);
}

/* Ein Formular ohne Empfaenger zeigt das. Die Felder bleiben sichtbar — sie
   sind der Entwurf dessen, was kommt — aber sie nehmen nichts an, und der
   Knopf ist kein toter Knopf, sondern der Weg, der heute funktioniert. */
.dp-formular-aus .dp-camp,
.dp-formular-aus .dp-bifa input { background: var(--dp-gol-fundal); color: var(--dp-desc); cursor: not-allowed; }
.dp-formular-aus .dp-eticheta-camp,
.dp-formular-aus .dp-bifa { color: var(--dp-desc); }

/* Abschlussblock am Fuss einer Rubrikseite (Documente & Servicii) */
.dp-incheiere { margin: 0 0 var(--dp-sp-5) 0; }
.dp-incheiere-titlu {
  margin: .9375rem 0 1.375rem 0;      /* 15px / 22px, gemessen */
  font-size: 1.375rem; line-height: 1.5;   /* 22/33 */
  font-weight: 700;
  color: var(--dp-titlu);
}

/* Documente & Servicii traegt drei Masse, die von den uebrigen Rubrikseiten
   abweichen. Sie sind AM ORIGINAL GEMESSEN und werden reproduziert, weil
   Angleichen eine sichtbare Aenderung waere (Entscheidung C, 24.08.).
   Ob sie spaeter angeglichen werden, ist eine Entscheidung, kein Versehen. */
.dp-servicii .dp-hero-imagine { margin-bottom: .9375rem; }   /* 15px statt 32 */
.dp-servicii .dp-hero-titlu   { margin-bottom: 1.75rem; }        /* 28px statt 12 */
.dp-servicii .dp-hero-desc    { color: #333; font-size: .9375rem; line-height: 1.6;
                                margin-bottom: 1.5625rem; }  /* #333/15/24 statt #555/15,2/24,32 */
.dp-servicii .dp-tabel-huelle { margin-bottom: 1.5625rem; }  /* 25px */

/* SCHICHT 1 des Spam-Schutzes: das Koederfeld.
   NICHT `display: none` allein — das erkennen Bots. Weggeschoben statt
   ausgeblendet; `aria-hidden` und `tabindex="-1"` im Markup halten es aus
   Screenreader und Tastaturfolge heraus. */
.dp-capcana {
  position: absolute;
  left: -9999px;
  width: 1px; height: 1px;
  overflow: hidden;
}

/* --- 18. Primăria: drei Formen, die es nur hier gibt (DESIGN.md 7.12) ------
   Gemessen an /ro/primaria, 1440px. */

/* 18.1 dp-persoana — die Personenkarte. NICHT dp-carte: die Listenkarte sitzt
   im Zweispaltenraster mit Haarlinien, diese hier ist ein eigener Kasten mit
   Bild links. Zwei Formen, nicht eine (MUSTER.md, Vorschlag B). */
/* DREI Karten in einer Reihe — Entscheidung von Lukas, DESIGN.md 8, 14.
   Die laufende Seite zeigt heute zwei oben und den Secretar darunter: die
   Karte ist dort 525px breit und die dritte bricht um. Genommen wird die
   KOMPAKTE Form, die dasselbe Theme fuer schmale Spalten schon mitbringt —
   Bild oben (100% breit, 250px hoch), Text darunter, Innenrand 15px. */
.dp-persoane {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
  /* GESTRECKT, nicht `start`: alle Karten einer Reihe schliessen gleich hoch
     ab. Zusammen mit dem festen Seitenverhaeltnis des Bildes und dem
     reservierten CV-Platz steht die Reihe damit gerade. */
  align-items: stretch;
  padding: var(--dp-sp-4) 0;
}
.dp-persoana {
  display: flex;
  flex-direction: column;
  width: 100%;
  height: auto;
  border: var(--dp-linie-1) solid var(--dp-linie);
  border-radius: 10px;
  background: #f9fafa;
  overflow: hidden;
}
/* Das Bild traegt ein FESTES SEITENVERHAELTNIS — DESIGN.md 8, 17.
   Warum ueberhaupt eines: die Gemeinden schicken ueberwiegend HOCHFORMAT,
   oft kleine Portraets. `cover` + `object-position: top` schneidet unten weg
   — der Kopf bleibt drin, Brust und Hintergrund fallen heraus.

   WELCHES: das des Originals, 200 x 228 = 0,877. Am Massstab gemessen, und
   zwar ueber alle sechs Haltepunkte — es steht dort bei jeder Breite gleich.
   Der Kasten ist damit HOCHKANT, nicht quer.

   Vorher stand hier 6/5 (1,2, also quer). Das schnitt zu viel weg: bei einer
   Bilddatei von 0,741 (der Viceprimar) fielen 38,2% der Hoehe heraus statt
   der 15,5% des Originals — dem Buergermeister fuellte das Gesicht den
   ganzen Rahmen, dem Viceprimar war der Kopf oben angeschnitten.
   Gemessen, nicht geschaetzt: die drei Bilddateien tragen 0,795 / 0,741 /
   0,747 — alle drei hochkant. */
/* Das Seitenverhaeltnis traegt der KASTEN, nicht das Bild — sonst faellt die
   Hoehe weg, sobald kein Foto da ist, und die Reihe steht schief. */
.dp-persoana-bild {
  position: relative;               /* das Bild liegt DARIN, nicht darunter */
  flex: 0 0 auto;
  width: 100%;
  aspect-ratio: 200 / 228;          /* = 0,877, am Original gemessen */
  padding: 0;
  overflow: hidden;
  border-bottom: 1px solid #eee;
  background: #eef0f1;              /* traegt, solange kein Bild da ist */
}
/* Absolut gesetzt, damit die Eigenhoehe des Bildes den Kasten NICHT
   auseinandertreibt: mit `height: 100%` gegen einen Kasten ohne feste Hoehe
   faellt ein Bild auf seine eigene Hoehe zurueck, und drei verschieden hohe
   Portraets ergaben drei verschieden hohe Kaesten (382,9 / 410,9 / 407,5 —
   nachgemessen, bevor es so dastand). */
.dp-persoana-bild img {
  position: absolute;
  inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  object-position: top;
}

/* 18.1a Der PLATZHALTER, wo kein Foto vorliegt — DESIGN.md 8, 17.
   Ein Wappen ist kein Portraet. Es hat keinen Rand, den man wegschneiden
   darf, und keine Mitte, die einen Kreis fuellt. Deshalb eine GEZIELTE
   VARIANTE und keine geaenderte Grundregel: die Bestandsfotos bleiben, wie
   sie sind, und nur der gekennzeichnete Platz wechselt die Behandlung.

   Gekennzeichnet wird beim BAU (`fara_foto` aus den Lesern), nicht hier:
   welche Datei ein Platzhalter ist, steht in werkzeug/instanta.py an einer
   Stelle, und die Vorlage kann nichts nachschlagen.

   GEMESSEN, was cover mit dem Wappen macht (Budesti, 30.08.2026):
   bei 1440 px fallen 5,2 % heraus, bei 736 px — wo der Kasten 675 x 250
   flach wird — 65,8 % der Bildhoehe. Es ist also kein Schoenheitsfehler an
   einem Haltepunkt, sondern an dem, der die Datei am meisten beschneidet.

   GEWICHT: die Grundregel steht als `.dp-persoana-bild img` (0,2,1) da.
   Eine einzelne Klasse (0,1,0) verlaere gegen sie — deshalb beide Klassen
   im Selektor (0,3,1). Derselbe Fehler ist am 28.08. schon einmal passiert
   (Hochkontrast-Ausnahme, 0,2,1 gegen 0,3,1). */
.dp-persoana-bild.dp-bild-platzhalter img {
  object-fit: contain;
  /* Und MITTIG statt oben. `object-position: top` gehoert zum Zuschnitt —
     es haelt den Kopf im Bild, wenn unten weggeschnitten wird. Ohne
     Zuschnitt haengt das Wappen damit an der Oberkante und der ganze
     Leerraum sammelt sich unten: gemessen 18,1 px bei 1440 px, weil
     romania.png (0,928) breiter liegt als der Kasten (0,877). */
  object-position: center;
}
/* Die Startseiten-Karte schneidet NICHT ueber `object-fit`: mit
   `height:125px; width:auto` ist der Kasten das Bild, und `contain` haette
   dort nichts zu tun. Geschnitten wird allein ueber den Radius — also wird
   allein der weggenommen. */
.dp-echipa-bild.dp-bild-platzhalter { border-radius: 0; }
.dp-persoana-text {
  flex: 1 1 auto; min-width: 0; padding: 15px;
  display: flex; flex-direction: column;
}
/* Der leere CV-Platz: eine Zeile hoch, damit die Karten gleich schliessen. */
.dp-persoana-luecke { height: 21px; margin-bottom: 0; }
.dp-persoana-nume {
  margin: 0 0 4px 0;               /* 4px */
  font-family: var(--dp-font-text);
  font-size: calc(17px * var(--dp-lupe, 1)); line-height: 1.65;   /* 17/28,05 */
  font-weight: 400; color: #444;
  /* ZWEI Zeilen reserviert, wie beim CV-Platz. Gemessen ueber die
     Haltepunkte: "Valerica Lăcrămioara HRIȚULEAC" — der laengste Name im
     Bestand — bricht bei 981, 1000 und 1281px um, die beiden Nachbarn nicht.
     Die Karten blieben zwar gleich hoch (das Raster streckt sie), aber die
     Textzeilen darunter standen versetzt. Der Preis sind 28px Weissraum,
     wo alle Namen kurz sind; der Gewinn ist eine gerade Reihe. */
  min-height: 3.3em;               /* 2 x 1,65 = 56,1px */
}
.dp-persoana-rol {
  margin: 0 0 20px 0;              /* 20px */
  font-size: calc(15px * var(--dp-lupe, 1)); line-height: 1.65;    /* 15/24,75 */
  font-weight: 600; color: #222;
}
.dp-persoana-rand {
  margin: 0 0 6px 0;              /* 6px */
  font-size: calc(15px * var(--dp-lupe, 1)); line-height: 1.4;     /* 15/21 */
  color: #555;
}
.dp-persoana-rand:last-child { margin-bottom: 0; }

/* 18.2 dp-consiliu — Namen nach Partei. Bewusst KEINE Karten:
   dreizehn Ratsmitglieder ohne Foto bekaemen dreizehn leere Bildplaetze,
   und eine Leerstelle sieht aus wie fehlende Daten (MUSTER.md, Vorschlag D). */
.dp-consiliu {
  padding: var(--dp-sp-4) var(--dp-sp-6) var(--dp-sp-6) var(--dp-sp-6);
  border: var(--dp-linie-1) solid var(--dp-linie);
  border-radius: 10px;
  background: #f9fafa;
}
/* Symbol LINKS, die Parteien daneben — im Original `.primaria-council-inner`
   mit Innenrand 20px links und 40px Abstand zum Bild. */
.dp-consiliu-inner {
  display: flex; align-items: flex-start; flex-wrap: wrap;
  gap: 40px; padding-left: 20px;
}
.dp-consiliu-simbol { flex: 0 0 auto; width: 220px; height: auto; object-fit: contain; }
.dp-consiliu-coloane { display: flex; flex-wrap: wrap; gap: 60px; }   /* 60px */
/* Die Spalte richtet sich nach ihrem Inhalt, mit 180px als Untergrenze.
   Fest auf 180px brachen lange Namen um ("Gheorghe-Danut DUMITRAS"), im
   Original tun sie das nicht. */
.dp-consiliu-partid { flex: 0 1 auto; min-width: 180px; }
.dp-consiliu-partid > strong { display: block; margin-bottom: var(--dp-sp-2);
  font-size: calc(16px * var(--dp-lupe, 1)); line-height: 1.5; color: var(--dp-titlu); }   /* 16/24, mb 8 */
.dp-consiliu-partid ul { margin: 0 0 32px 0; padding-left: 18px; }  /* mb 32, pl 18 */
.dp-consiliu-partid li { font-size: calc(15px * var(--dp-lupe, 1)); line-height: 1.2; color: #333; margin-bottom: 3px; }  /* 3px, gemessen */
/* Der erklaerende Satz steht ZENTRIERT unter dem Kasteninhalt, nicht links.
   Gemessen: `.primaria-council-description { text-align:center; font-size:15px;
   color:#666; margin-bottom:20px }`. */
.dp-consiliu-nota {
  margin: 32px 0 20px 0;
  font-size: calc(15px * var(--dp-lupe, 1)); line-height: 1.5; color: #666;
  text-align: center;
}

/* 18.3 dp-cariera — zwei Kaesten nebeneinander */
.dp-cariera { display: grid; grid-template-columns: 1fr 1.75fr; gap: var(--dp-sp-4); }
.dp-cariera-kasten {
  padding: 17.6px 20px;            /* 17,6 / 20 */
  border: var(--dp-linie-1) solid var(--dp-linie);
  border-radius: 12px;              /* 12px */
  background: #f4f5f7;
}
.dp-cariera-kopf {
  display: flex; align-items: center; gap: var(--dp-sp-2);
  margin-bottom: var(--dp-sp-3);
  font-family: var(--dp-font-titlu); font-weight: 700; color: var(--dp-titlu);
}
.dp-cariera-kopf .dp-sim { width: 17.6px; height: 17.6px; color: var(--dp-accent); }
.dp-cariera-kasten p { font-size: calc(15.2px * var(--dp-lupe, 1)); line-height: 1.55; }
.dp-cariera-kasten > :last-child { margin-bottom: 0; }

/* Die Concursuri im zweiten Kasten. Form am Original abgelesen
   (`cariera-item` / `-meta` / `-links`): Titel, darunter eine Zeile aus
   Marke, Art und Datum, darunter die Dokumente. Die Klassennamen sind eigene
   — uebernommen ist die FORM, nicht der Code. */
.dp-cariera-posten + .dp-cariera-posten {
  margin-top: var(--dp-sp-4);
  padding-top: var(--dp-sp-4);
  border-top: var(--dp-linie-1) solid var(--dp-linie);
}
.dp-cariera-titlu {
  margin: 0 0 var(--dp-sp-2) 0;
  font-weight: 700; color: var(--dp-titlu);
}
.dp-cariera-meta {
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--dp-sp-2);
  margin: 0 0 var(--dp-sp-3) 0;
}
/* Die Marke sagt, WO das Verfahren steht. Sie ist die einzige Farbflaeche im
   Kasten und deshalb bewusst ruhig — kein Signalton fuer einen Zustand, der
   meistens "abgeschlossen" heisst. */
.dp-cariera-marca {
  padding: 2px 10px;
  border-radius: 999px;
  background: var(--dp-accent); color: #fff;
  font-size: calc(12.8px * var(--dp-lupe, 1)); font-weight: 700; line-height: 1.6;
}
.dp-cariera-tip {
  padding: 2px 10px;
  border: var(--dp-linie-1) solid var(--dp-linie);
  border-radius: 999px;
  font-size: calc(12.8px * var(--dp-lupe, 1)); line-height: 1.6; color: var(--dp-desc);
}
/* `finalizat` traegt im Original eine andere Farbe als die Zwischenstaende
   (`cariera-badge--done` gruen gegen `--proc` blau). Die Unterscheidung ist
   uebernommen, die Farben kommen aus der Designsprache und nicht aus dem
   Theme-Hex. */
.dp-cariera-marca-incheiat { background: var(--dp-incheiat); }
/* "Înscrieri închise" ist keine Zustandsmarke, sondern eine Absage. Sie steht
   nur, wo gar keine Marke steht, und bleibt deshalb ohne Farbflaeche —
   sonst haette der haeufigste Fall den lautesten Ton. */
.dp-cariera-marca-inchis {
  background: none; color: var(--dp-desc);
  border: var(--dp-linie-1) solid var(--dp-linie);
}
/* Die Frist. Im Original eine gefuellte Pille links von der Marke; sie traegt
   hier das Datum statt eines Countdowns (Begruendung im Leser). */
.dp-cariera-pastila {
  padding: 2px 10px;
  border-radius: 999px;
  background: var(--dp-accent); color: #fff;
  font-size: calc(12.8px * var(--dp-lupe, 1)); font-weight: 700; line-height: 1.6;
}
.dp-cariera-datum { font-size: calc(12.8px * var(--dp-lupe, 1)); color: var(--dp-desc); }
/* Der Vermerk — Aufhebung oder Abbruch. Er steht UNTER den Dokumenten, weil
   er sich auf den ganzen Vorgang bezieht und nicht auf eine Zeile davon. Die
   Kante links ist die Form, die das Original der `nota` gibt.

   KEINE EIGENE FARBE FUER DIE AUFHEBUNG, und das ist Absicht: das Original
   kennt die Aufhebung nicht (sie ist juenger als das Theme), es gibt also
   nichts zu messen. Die Unterscheidung traegt die fette Beschriftung
   ("Anulat la …"). Die Klasse `dp-cariera-vermerk-anulat` steht trotzdem im
   Erzeugnis — wer ihr einen Ton geben will, gibt ihn in DESIGN.md und nicht
   hier. */
.dp-cariera-vermerk {
  margin: var(--dp-sp-3) 0 0 0;
  padding-left: var(--dp-sp-3);
  border-left: 3px solid var(--dp-linie);
  font-size: calc(13.7px * var(--dp-lupe, 1)); line-height: 1.55; color: var(--dp-desc);
}
.dp-cariera-vermerk strong { color: var(--dp-titlu); }
/* Am Original abgelesen (`cariera-nota`): Kante links, gedaempfte Schrift. */
.dp-cariera-nota {
  margin: var(--dp-sp-2) 0 0 0;
  padding-left: var(--dp-sp-3);
  border-left: 3px solid var(--dp-linie);
  font-size: calc(13.7px * var(--dp-lupe, 1)); line-height: 1.55; color: var(--dp-desc);
}
/* Untereinander, nicht nebeneinander: die Beschriftungen sind ganze Saetze
   ("Rezultat selecție dosare"), und nebeneinander bricht das in eine Wand. */
.dp-cariera-verweise { display: flex; flex-direction: column; gap: var(--dp-sp-2); margin: 0; }
.dp-cariera-verweise a {
  display: flex; align-items: center; gap: var(--dp-sp-2);
  font-size: calc(14.4px * var(--dp-lupe, 1)); line-height: 1.5;
}
.dp-cariera-verweise .dp-sim { color: var(--dp-accent); flex: 0 0 auto; }

/* 18.4 dp-acces — das Zugaenglichkeits-Bedienteil ---------------------------

   DIE GESTALT IST DIE DES ORIGINALS, am alten Theme-Widget gemessen
   (`assets/accessibility/accessibility.css`):

     Auslaeser   50 x 50 px, quadratisch, rechter Rand, Symbol allein
                 (`.acc-btn-float`: width/height 50px, left -51px, top 50%)
     Lage        senkrecht bei 55 % — das haelt Abstand zur MOL-Lasche bei
                 `top: 7.5rem`. Im alten Theme stand der Grund als Kommentar
                 daneben ("schafft Luecke zum MOL-Sticker")
     Panel       320 px breit, faehrt nach LINKS auf, 0,4 s
                 cubic-bezier(.25,.8,.25,1) (`.acc-panel`)
     Kacheln     zwei Spalten, Symbol UEBER der Beschriftung, Abstand 8 px
                 (`.acc-grid` / `.acc-option`)

   WAS AM 26.08. HIER STAND UND ZURUECKGENOMMEN IST: eine senkrechte Lasche
   mit gedrehten Versalien, der MOL-Lasche nachgebildet. Sie war eine eigene
   Erfindung — das Original hat sie nie gehabt —, und sie war als Bedienteil
   nicht zu erkennen: zwei gleich aussehende Laschen am selben Rand, von
   denen die eine ein Verweis und die andere ein Schalter ist.

   DREI ABWEICHUNGEN VOM ORIGINAL, alle benannt (DESIGN.md 8, Nummer 20;
   die dritte — der gedrueckte Schalter traegt --dp-accent statt #3d4449 —
   steht weiter unten bei den Schaltern):
     - Der Knopf traegt den Radius der MOL-Lasche
       (`var(--dp-raza) 0 0 var(--dp-raza)`) statt `border-radius: 0`. Am
       selben Rand, in derselben Farbe, mit derselben Kante — sonst waeren es
       zwei Formensprachen uebereinander.
     - Die Kachelbeschriftung traegt .8rem statt der 10 px des Originals.
       Zehn Pixel fett ist die Schriftgroesse, gegen die dieses Bauteil
       eigentlich hilft.

   KEIN `transform` AUF `.dp-acces`: ein transformierter Vorfahr wird zum
   Bezugsrahmen fuer `position: fixed` seiner Kinder, und das Panel misst sich
   am SCHIRM (dazu unten). Deshalb sitzt die Mitte hier in `top` und nicht in
   einer Verschiebung. */
.dp-acces {
  position: fixed;
  right: 0;
  top: calc(55% - var(--dp-acces-knopf) / 2);
  z-index: 100;
}
.dp-acces[hidden] { display: none; }

.dp-acces-clapa {
  display: flex; align-items: center; justify-content: center;
  width: var(--dp-acces-knopf); height: var(--dp-acces-knopf);
  padding: 0;
  border: 0;
  border-radius: var(--dp-raza) 0 0 var(--dp-raza);
  background: var(--dp-accent);
  color: #fff;
  cursor: pointer;
}
/* 24 px, am Original gemessen (`font-size: 24px` auf `.acc-btn-float`).
   In px und nicht in rem: der Knopf ist ein TASTZIEL und waechst nicht mit
   der Schriftstufe mit — sonst schoebe die groesste Stufe ihn ueber den
   Inhalt, den sie gerade lesbar machen soll. */
.dp-acces-clapa .dp-sim { width: 24px; height: 24px; }

/* Das Panel misst sich am SCHIRM, nicht am Knopf.
   `left` und `right` spannen es zwischen Sicherheitsrand und Knopf auf,
   `max-width` gibt ihm die 320 px des Originals, und `margin-left: auto`
   schiebt den Rest nach links. Eine Regel, kein Haltepunkt:

     1280 px   Breite 320, rechte Kante 58 px vom Rand, linke bei 902
      390 px   Breite 320 passt nicht -> 320 px bleiben zwischen Rand und
               Knopf uebrig, das Panel nimmt sie und traegt links den Rand

   `top`/`translateY(-50%)` setzen die Mitte auf dieselben 55 % wie den Knopf.
   Die HOEHE ist so begrenzt, dass beide Enden im Bild bleiben: bei einer
   Mitte auf 55 % ist die knappere Haelfte 45 vh, also 90 vh minus zweimal
   Rand. */
.dp-acces-panou {
  position: fixed;
  top: 55%;
  left: var(--dp-acces-rand);
  right: calc(var(--dp-acces-knopf) + var(--dp-sp-2));
  width: auto;
  max-width: var(--dp-acces-w);
  margin-left: auto;
  max-height: calc(90vh - 2 * var(--dp-acces-rand));
  display: flex;
  flex-direction: column;
  padding: var(--dp-sp-4);
  background: var(--dp-fundal);
  border: var(--dp-linie-1) solid var(--dp-linie);
  border-radius: var(--dp-raza);
  box-shadow: -4px 4px 16px rgba(0, 0, 0, .14);
  /* Zu: nach rechts aus dem Bild geschoben, hinter dem Knopf. Auf ist
     `translateX(0)`. Die Dauer und die Kurve sind die des Originals.
     `prefers-reduced-motion: reduce` schaltet den Uebergang ab — die Regel
     dazu steht in Abschnitt 2 und gilt fuer jedes Element; ebenso der
     Schalter „Fără animații" weiter unten. Das Skript liest die gemessene
     Dauer aus `getComputedStyle` und setzt `hidden` danach; ist sie 0,
     setzt es `hidden` sofort. */
  transform: translateY(-50%) translateX(calc(100% + var(--dp-acces-knopf)));
  opacity: 0;
  transition: transform .4s cubic-bezier(.25, .8, .25, 1),
              opacity   .4s cubic-bezier(.25, .8, .25, 1);
}
.dp-acces-panou-deschis { transform: translateY(-50%) translateX(0); opacity: 1; }
.dp-acces-panou[hidden] { display: none; }

.dp-acces-titlu {
  margin: 0 0 var(--dp-sp-3) 0;
  font-family: var(--dp-font-titlu);
  font-size: 1rem;
  font-weight: 700; color: var(--dp-titlu);
}

/* Was scrollen darf, wenn es eng wird. `.dp-acces-jos` steht DANEBEN und
   nicht darin — `Închide` ist der Ausgang und ein Ausgang, den man erst
   herbeiscrollen muss, ist keiner. `min-height: 0` ist noetig, weil ein
   Flex-Kind sonst nicht unter seine Inhaltshoehe schrumpft. */
.dp-acces-corp { overflow-y: auto; min-height: 0; }

.dp-acces-grila { display: grid; grid-template-columns: 1fr 1fr; gap: var(--dp-sp-2); }
.dp-acces-marime { display: grid; grid-template-columns: 1fr 1fr; gap: var(--dp-sp-2); }
.dp-acces-jos {
  display: grid; grid-template-columns: 1fr 1fr; gap: var(--dp-sp-2);
  flex: 0 0 auto;
  margin-top: var(--dp-sp-3);
}
.dp-acces-marime-eticheta {
  display: flex; align-items: center; gap: var(--dp-sp-2);
  margin: var(--dp-sp-3) 0 var(--dp-sp-2) 0;
  font-size: .8rem; color: var(--dp-desc);
}
.dp-acces-marime-eticheta .dp-sim { width: 1rem; height: 1rem; color: var(--dp-accent); }

/* KEIN `* var(--dp-lupe)` AN EINEM rem-MASS, und das ist eine Behebung.
   `html { font-size: calc(13pt * var(--dp-lupe, 1)) }` — die Schriftstufe
   steckt also schon IN jedem rem. Die vier rem-Masse, die hier am 26.08.
   zusaetzlich mit `--dp-lupe` multipliziert wurden, trugen den Faktor
   deshalb ZWEIMAL: gemessen 14,67 px -> 30,84 px bei Stufe 3 statt
   21,27 px, also 1,45 hoch zwei. Das ist auch die Ursache dafuer, dass die
   Klappe bei der groessten Stufe aus dem Bild lief.
   Die Regel, kurz: px-Masse multiplizieren mit `--dp-lupe`, rem-Masse
   NICHT. DESIGN.md 4. */
.dp-acces-optiune {
  border: var(--dp-linie-1) solid var(--dp-linie);
  border-radius: var(--dp-raza);
  background: var(--dp-fundal-bara);
  color: var(--dp-titlu);
  font-family: inherit;
  font-weight: 700;
  font-size: .8rem; line-height: 1.3;
  cursor: pointer;
  /* Tastziel. WCAG 2.2 verlangt 24 x 24 (2.5.8); 44 ist die Zahl aus 2.5.5
     und die, die ein Finger wirklich trifft. */
  min-height: var(--dp-acces-tinta);
}
/* Die Kachel: Symbol UEBER der Beschriftung, mittig. Die Form des Originals. */
.dp-acces-placa {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: var(--dp-sp-1);
  padding: var(--dp-sp-3) var(--dp-sp-1);
  text-align: center;
}
.dp-acces-placa .dp-sim { width: 1.25rem; height: 1.25rem; color: var(--dp-accent); }
/* Die Reihe: Symbol NEBEN der Beschriftung. Fuer die Knoepfe, die etwas TUN
   statt etwas zu schalten — die Schriftstufe, Resetare, Închide. */
.dp-acces-sir {
  display: flex; align-items: center; justify-content: center;
  gap: var(--dp-sp-2);
  padding: var(--dp-sp-2) var(--dp-sp-2);
  text-align: center;
}
.dp-acces-sir .dp-sim { width: 1rem; height: 1rem; color: var(--dp-accent); flex: 0 0 auto; }

.dp-acces-optiune:hover { background: var(--dp-accent-clar); }
/* Der Zustand steht NICHT nur in der Farbe — `aria-pressed` sagt ihn an, und
   die gefuellte Flaeche zeigt ihn. Farbe allein waere WCAG 1.4.1. */
.dp-acces-optiune[aria-pressed="true"] {
  background: var(--dp-accent); color: #fff; border-color: var(--dp-accent);
}
.dp-acces-optiune[aria-pressed="true"] .dp-sim { color: inherit; }
/* Abgeschaltet — an der Grenze der Schriftstufen. `opacity` mischt die Farbe
   auf rund 2,6:1 herunter, und das ist BENANNT und nicht uebersehen: WCAG 2.1
   nimmt inaktive Bedienelemente von 1.4.3 aus, und der Zustand steht im
   `disabled`-Attribut, das ein Screenreader ansagt — nicht nur in der Farbe.
   `kontrast_pruefen.mjs` fuehrt das Paar deshalb ausdruecklich NICHT. */
.dp-acces-optiune:disabled { color: var(--dp-desc); opacity: .55; cursor: default; }
.dp-acces-optiune:disabled .dp-sim { color: inherit; }

/* Die Lesehilfe. Sie wird vom Skript angelegt und wieder entfernt. */
.dp-acces-linie {
  position: fixed; left: 0; right: 0; top: 0;
  height: 4px; background: var(--dp-accent);
  pointer-events: none; z-index: 9999;
}

/* --- Die Schalter selbst -------------------------------------------------- */

/* Hochkontrast: Schwarz auf Gelb. Die Kombination ist aus dem alten Theme
   uebernommen und keine eigene Wahl — sie ist die verbreitete Konvention und
   traegt 19.56:1. `!important` ist hier kein Versaeumnis, sondern der Zweck:
   der Schalter soll JEDE Farbe der Seite ueberschreiben. */
html.dp-acces-contrast, html.dp-acces-contrast body { background: #000 !important; color: #ff0 !important; }
html.dp-acces-contrast *:not(.dp-acces-optiune):not(.dp-acces-clapa) {
  background-color: transparent !important;
  color: #ff0 !important;
  border-color: #ff0 !important;
}
html.dp-acces-contrast a { color: #ff0 !important; text-decoration: underline !important; }
html.dp-acces-contrast .dp-acces-panou { background: #000 !important; border: 2px solid #ff0 !important; }
/* DIE KLEBENDE LEISTE UND IHR PANEL BRAUCHEN EINEN DECKENDEN GRUND — auch
   und gerade hier. Die Blankettregel oben setzt JEDEN Grund auf
   `transparent`; fuer eine Flaeche, unter der etwas DURCHSCROLLT, ist das
   kein Farbwechsel, sondern ein Ausfall: die Liste liefe durch die Leiste
   hindurch und das Panel stuende ueber fremdem Text. Dieselbe Ausnahme, die
   `.dp-acces-panou` eine Zeile hoeher schon hat, und aus demselben Grund.
   Am 27.08. war der Hochkontrast an zwei Stellen Gelb auf Gelb; dies hier
   waere Gelb auf Gelb auf Gelb gewesen.

   UND SIE MUSS DEUTLICH GEWINNEN, nicht knapp — dieselbe Lehre wie unten:
   die Blankettregel traegt (0,3,1), ein `html.dp-acces-contrast
   .dp-bara-file` nur (0,2,1) und verlore. Gemessen mit `getComputedStyle`:
   der erste Anlauf meldete weiter `rgba(0, 0, 0, 0)`. Deshalb der WIRKLICHE
   Pfad durch den Rumpf statt einer wiederholten Klasse — (0,4,1), und er
   sagt zugleich, wo das Bauteil sitzt. */
html.dp-acces-contrast .dp-pagina .dp-continut .dp-bara-file {
  background: #000 !important;
}
html.dp-acces-contrast .dp-pagina .dp-filtre .dp-filtre-panou {
  background: #000 !important;
  border: 2px solid #ff0 !important;
}
/* DIE AKTIVE RUBRIK AUCH IM HOCHKONTRAST. Ohne diese Zeilen faellt die Marke
   hier ersatzlos aus: die Blankettregel oben traegt (0,3,1) mit `!important`
   und setzt JEDEN Grund transparent — `.dp-filtre-lista a[aria-current]`
   traegt (0,2,1) und verlore. Dann stuenden im Panel elf gleich aussehende
   gelbe Verweise, und ausgerechnet im Modus fuer schlechtes Sehen waere die
   einzige Auskunft, wo man ist, das `aria-current` allein.

   Umgekehrte Belegung wie sonst — Gelb gefuellt, Schrift schwarz. Das ist
   NICHT neu erfunden, sondern die Form, die der eingeschaltete Knopf des
   Bedienteils hier schon hat (`.dp-acces-optiune[aria-pressed="true"]`, eine
   Zeile weiter unten): ein Zustand ist im Hochkontrast eine umgedrehte
   Flaeche. Der Pfad geht durch den Rumpf (0,5,1), aus demselben Grund wie
   beim Panel darueber. */
html.dp-acces-contrast .dp-pagina .dp-filtre .dp-filtre-lista a[aria-current="page"],
html.dp-acces-contrast .dp-pagina .dp-filtre .dp-filtre-lista a[aria-current="page"] .dp-bara-nr {
  background: #ff0 !important;
  color: #000 !important;
  border-color: #ff0 !important;
}
/* DIE FUNDSTELLE IM AUSSCHNITT, im Hochkontrast — und sie waere ohne diese
   Zeile UNSICHTBAR. Die Blankettregel oben traegt (0,3,1) mit `!important`
   und setzt jeden Grund auf `transparent` und jede Farbe auf #ff0: ein
   <mark> saehe dann genau aus wie der Text um ihn herum, und die Suche
   verlaere ihre einzige Aussage darueber, WO das Wort steht — ausgerechnet
   im Modus fuer schlechtes Sehen. Dieselbe Falle wie bei der Marke der
   aktiven Rubrik (`pruefling_rubrikmarke.mjs`), derselbe Weg heraus: die
   Kette `.dp-pagina .dp-cautare-extras mark` traegt (0,3,2) und gewinnt.
   Umgekehrte Belegung wie beim gedrueckten Knopf: gelber Grund, schwarze
   Schrift — 19,56:1 und damit der hoechste Kontrast, den diese Palette hat. */
html.dp-acces-contrast .dp-pagina .dp-cautare-extras mark {
  background: #ff0 !important; color: #000 !important; }
html.dp-acces-contrast .dp-acces-clapa,
html.dp-acces-contrast .dp-acces-optiune[aria-pressed="true"] { background: #ff0 !important; color: #000 !important; }
html.dp-acces-contrast .dp-acces-optiune { background: #000 !important; color: #ff0 !important; border: 2px solid #ff0 !important; }
/* DAS INNERE DES BEDIENTEILS ERBT, ES WIRD NICHT GEFAERBT — und das braucht
   mehr Gewicht als die Blankettregel oben. Die traegt `*` plus zwei `:not()`
   mit je einer Klasse, also (0,2,1); ein `.dp-sim` allein waere (0,1,0) und
   verloere. Deshalb der Weg ueber `.dp-acces`: (0,3,1).

   GEMESSEN, 27.08.2026: ohne diese Regel bekam das Symbol IM Knopf `#ff0`
   auf `#ff0` und die Beschriftung IM gedrueckten Schalter ebenso — Gelb auf
   Gelb, unsichtbar, ausgerechnet im Hochkontrast. Die alte Fassung
   (`html.dp-acces-contrast .dp-sim`, (0,2,1)) hat das nie behoben; sichtbar
   wurde es erst, als die Beschriftung am 27.08. in ein `<span>` wanderte.
   Eine Regel, die von der Blankettregel geschlagen wird, ist keine Regel.

   UND SIE MUSS DEUTLICH GEWINNEN, nicht knapp. Der erste Anlauf schrieb
   `.dp-acces span` — (0,2,2) gegen (0,3,1) —, und Klassen zaehlen vor
   Elementen: das Symbol wurde schwarz, die Beschriftung blieb gelb auf gelb.
   Gemessen mit `getComputedStyle`, nicht am Bild geraten. Deshalb hier drei
   Klassen im Pfad, (0,4,1).

   UND DER `<path>` STEHT MIT DABEI, nicht nur das `<svg>`. `.dp-sim` traegt
   `fill: currentColor`; `currentcolor` wird aber je Element aufgeloest, und
   der `<path>` ist selbst ein `*` und bekam von der Blankettregel `#ff0`.
   Das Symbol im gedrueckten Schalter blieb deshalb gelb auf gelb, obwohl
   `getComputedStyle` am `<svg>` schon `rgb(0,0,0)` meldete — die Messung am
   Elternknoten hat den Fehler NICHT gezeigt, erst das Bild. */
html.dp-acces-contrast .dp-acces .dp-acces-clapa .dp-sim,
html.dp-acces-contrast .dp-acces .dp-acces-clapa .dp-sim *,
html.dp-acces-contrast .dp-acces .dp-acces-optiune .dp-sim,
html.dp-acces-contrast .dp-acces .dp-acces-optiune .dp-sim *,
html.dp-acces-contrast .dp-acces .dp-acces-optiune span { color: inherit !important; }

html.dp-acces-monocrom { filter: grayscale(100%); }

body.dp-acces-legaturi a {
  background: #ff0 !important; color: #000 !important;
  font-weight: 700 !important; text-decoration: underline !important;
}

/* Der grosse Zeiger als `data:`-SVG — kein Bild, keine Anforderung. */
body.dp-acces-cursor, body.dp-acces-cursor * {
  cursor: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48' viewBox='0 0 32 32'%3E%3Cpolygon points='2,2 2,28 10,20 16,30 20,28 14,18 24,18' fill='black' stroke='white' stroke-width='2' stroke-linejoin='round'/%3E%3C/svg%3E") 2 2, auto !important;
}

/* Der Schalter ERGAENZT `prefers-reduced-motion` (Abschnitt oben) und
   ersetzt es nicht: jenes greift nur, wenn es im Betriebssystem gesetzt ist,
   und das weiss ein Buerger am fremden Rechner nicht. */
body.dp-acces-animatii *, body.dp-acces-animatii *::before, body.dp-acces-animatii *::after {
  animation: none !important; transition: none !important; scroll-behavior: auto !important;
}

/* Die Logoleiste am Seitenende — Consiliul Judetean, APIA, MAI DSU, 112.
   Am Original gemessen: Innenrand 25px oben und unten, Abstand 50px,
   Bildhoehe 100px, Breite nach Verhaeltnis, mittig.
   Das Wappen des Kreisrats ist je Kreis ein anderes und kommt aus den
   Daten — Dersca: Botosani, Balta Alba: Buzau. */
.dp-sigle {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 50px;
  padding: 25px 0;
}
.dp-sigle a { border-bottom: 0; line-height: 0; }
.dp-sigla { display: block; height: 100px; width: auto; }
@media (max-width: 736px) { .dp-sigle { gap: 30px; } .dp-sigla { height: 70px; } }

/* Der kurze blaue Trenner zwischen den Abschnitten. Im Original
   `.primaria-hr { border: 2px solid #2467AF; width: 25% }` — ein Anteil, kein
   fester Wert. Hier stand 237,2px; das ist 25% von 948,81 und stimmte
   deshalb nur bei 1440px. Er steht auf FUENF Seiten, nicht auf zweien:
   Informatii (14x), Transparenta (9x), Integritate (5x), Primaria (5x),
   Kontakt (1x) — jeweils ZWISCHEN zwei Abschnitten. */
.dp-taietura {
  width: 25%; height: 4px;
  margin: var(--dp-sp-5) 0;
  border: 0; border-top: 2px solid var(--dp-accent); border-bottom: 2px solid var(--dp-accent);
}

/* Primăria traegt zwei eigene Masse gegenueber den Rubrikseiten — am
   Original gemessen, wie bei .dp-servicii (DESIGN.md 8, 4c). */
.dp-primaria .dp-hero-titlu { margin-bottom: 5px; }        /* 5px */
.dp-primaria > .dp-articol > .dp-desc {
  color: var(--dp-text);                                         /* nicht #555 */
  font-size: calc(15px * var(--dp-lupe, 1)); line-height: 1.6;                         /* 15/24 */
  margin-bottom: 25px;                                      /* 25px */
}

/* Unterhalb 981px wird die Karte breiter, und ein hochkantes Verhaeltnis an
   voller Kartenbreite ergibt ein sehr hohes Bild (bei 736px waeren es 770px).
   Ab hier gilt deshalb die feste Hoehe, die das Original in seiner kompakten
   Form selbst benutzt: 250px, volle Breite. Der Zuschnitt wird dort staerker
   — genau wie im Original. */
@media (max-width: 980px) {
  .dp-persoane { grid-template-columns: repeat(2, 1fr); }
  .dp-persoana-bild { aspect-ratio: auto; height: 250px; }
}
@media (max-width: 736px) {
  .dp-persoane { grid-template-columns: 1fr; }
  .dp-cariera { grid-template-columns: 1fr; }
  .dp-consiliu-inner { padding-left: 0; gap: 20px; }
  .dp-consiliu-simbol { width: 100%; }
}

/* --- 19. dp-galerie — M4, Bildkacheln (DESIGN.md 7.13) ---------------------
   Gemessen an der LAUFENDEN Seite, nicht am Abzug: die Galeriebilder sind
   Grav-Bildderivate, die im Abzug fehlen (Ursache A im Befund). */

.dp-galerie {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--dp-sp-6);                 /* 24px -> Spalte 300,3 */
  margin: var(--dp-sp-4) 0;
}
.dp-galerie-zelle { text-align: center; }

/* Die Kachel ist schmaler als die Zelle: 268,3 in 300,3, also 16px je Seite. */
.dp-galerie-kachel {
  position: relative;
  display: block;
  margin: var(--dp-sp-4) var(--dp-sp-4) var(--dp-sp-2) var(--dp-sp-4);
  border-radius: var(--dp-raza);
  overflow: hidden;
  border-bottom: 0;
}
.dp-galerie-bild {
  display: block; width: 100%;
  aspect-ratio: 3 / 2;                 /* 268,3 x 178,4 gemessen */
  object-fit: cover;
}

/* Die Ueberlagerung erscheint erst bei Beruehrung — im Ruhezustand ist sie
   unsichtbar (opacity 0), gemessen. Sie ist Zugabe, keine Information:
   Titel und Text stehen auch darunter bzw. im alt-Text. */
.dp-galerie-schleier,
.dp-galerie-details {
  position: absolute; inset: 0;
  opacity: 0;
  transition: opacity .3s ease-in-out;
}
.dp-galerie-schleier { background: rgba(0, 0, 0, .7); }
.dp-galerie-details {
  display: flex; flex-direction: column; justify-content: center;
  padding: 0 var(--dp-sp-4);
  color: #fff;
}
.dp-galerie-kachel:hover .dp-galerie-schleier,
.dp-galerie-kachel:hover .dp-galerie-details,
.dp-galerie-kachel:focus-visible .dp-galerie-schleier,
.dp-galerie-kachel:focus-visible .dp-galerie-details { opacity: 1; }

.dp-galerie-titlu {
  margin: 0 0 .625rem 0;               /* 10px */
  font-family: var(--dp-font-titlu);
  font-size: 1.25rem; line-height: 1.5;   /* 20/30 */
  font-weight: 500; color: #fff;
}
.dp-galerie-text { margin: 0; font-size: .9rem; line-height: 1.45; color: #fff; }

/* Die Beschriftung UNTER der Kachel — sie traegt die Information, nicht die
   Ueberlagerung. 18px/27 Gewicht 700, gemessen. */
.dp-galerie-eticheta {
  margin: 0 0 .625rem 0;
  font-family: var(--dp-font-titlu);
  font-size: 1.125rem; line-height: 1.5;
  font-weight: 700; color: var(--dp-titlu-tare);
}

@media (max-width: 980px) { .dp-galerie { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 736px) { .dp-galerie { grid-template-columns: 1fr; } }

/* --- 20. dp-sectiune — die Abschnitts-Ueberschrift des Hauptteils ----------
   Dieselbe FORM wie dp-bara-titlu und dp-an (Zeile mit 3px-Akzentstrich
   darunter), aber in der Groesse des Hauptteils. Im Original ist das kein
   Sonderfall, sondern eine allgemeine Regel:

     header.major > :last-child { border-bottom: 3px solid #2467af;
       display:inline-block; margin: 0 0 2em 0; padding: 0 .75em .5em 0 }

   Alle drei Masse stehen in `em` der Ueberschrift — die eine Ausnahme, die
   DESIGN.md 1 zulaesst. Gemessen bei 1440px: 28px/42, pr 21, pb 14, mb 56. */

.dp-sectiune { margin: 0 0 var(--dp-sp-5) 0; }
.dp-sectiune > :last-child { margin-bottom: 0; }

.dp-sectiune-titlu {
  display: inline-block;
  margin: 0 0 2em 0;                  /* 56px bei 28px Schrift */
  padding: 0 .75em .5em 0;            /* 21px / 14px */
  border-bottom: var(--dp-linie-3) solid var(--dp-accent);
  font-size: 1.75rem;                 /* = h2, hier ausgeschrieben */
}

/* --- 21. Die Startseite (M7) ----------------------------------------------
   Fuenf Teilstuecke, am Original bei 1440px gemessen:
   Kopfbild · Kasten mit Text und Karte · Kacheln · die drei juengsten
   Anuntzuri · die Amtstraeger.

   ZWEI der fuenf brauchen GAR KEINEN neuen Baustein:
   die Anuntzuri sind dp-lista + dp-carte (dasselbe Raster wie die
   Listenseite — 450,41 + 48 + 450,41, nachgerechnet identisch), und der
   Abschnittskopf ist dp-sectiune aus 20. Neu sind drei: Kopfbild, Kasten,
   Kacheln, dazu die Personenkarten. */

.dp-acasa { padding: var(--dp-sect-t) 0 var(--dp-sect-b) 0; }

/* 21.1 Das Kopfbild.
   Im Original steckt es in einem inline-block-Kasten; darunter bleiben
   gemessene 7,39px stehen — das ist die Unterlaenge der Zeilenschachtel
   (Open Sans, 16px in 26,4px Zeile), nicht ein Abstand, den jemand gesetzt
   hat. Hier entsteht sie durch DENSELBEN Mechanismus: das Bild bleibt
   inline. Damit stimmt sie auch bei jedem anderen Fuss von selbst. */
.dp-erou { margin: 0 0 var(--dp-sp-5) 0; }
.dp-erou-imagine { width: 100%; border-radius: var(--dp-raza); }

/* 21.2 Der Kasten — im Original `.box` bzw. `.box.light`, eine allgemeine
   Form des Themes: Radius 6px, 1px Linie, Innenrand 24px, Abstand 32px.
   Alle vier Werte sind bereits DigiPagina-Werte, nur zusammengesetzt. */
.dp-caseta {
  margin: 0 0 var(--dp-sp-5) 0;
  padding: var(--dp-sp-6);
  border: var(--dp-linie-1) solid var(--dp-linie);
  border-radius: var(--dp-raza);
}
.dp-caseta > :last-child { margin-bottom: 0; }
/* `.light`: heller Grund, und der Text wird zur Ueberschriftenfarbe.
   Gemessen: der Absatz im Kasten ist rgb(46,52,56), nicht rgb(69,69,73). */
.dp-caseta-clara { background: rgba(230, 235, 237, .25); color: var(--dp-titlu); }

/* Text und Karte nebeneinander, 70/30. Gemessen 606,77 zu 260,05 — das ist
   genau 70:30 der Innenbreite ohne den 32px-Zwischenraum. */
.dp-despre { display: flex; gap: 32px; justify-content: space-between; }  /* 2rem des Originals — fest */
.dp-despre-text  { width: 70%; }
.dp-despre-harta { width: 30%; }
/* Die Ueberschrift im Kasten ist im Original ein <h4> — 17,6px. Die GROESSE
   bleibt, die EBENE wird h2: eine h4 unter einer h1 ueberspringt zwei
   Stufen. Dieselbe Korrektur wie beim Dokumentblock, DESIGN.md 7.8b. */
.dp-despre-titlu { font-size: 1.1rem; }
/* Die Karte fuellt ihre Spalte in der Hoehe — sie ist so hoch wie der Text
   daneben, nicht hoeher. Im Original per height="100%" am <iframe>. */
.dp-despre-harta iframe { display: block; width: 100%; height: 100%; border: 0; }

/* 21.3 Die Kacheln — der letzte fehlende Baustein aus MUSTER.md.
   Raster: zwei Spalten, 48px Zwischenraum. Im Original ueber negative
   Aussenabstaende gebaut (-3em am Kasten, +3em/-1.5em je Kachel); das Netz
   davon ist genau dieses Raster, nachgerechnet: 450,41 + 48 + 450,41 =
   948,81 = die Inhaltsbreite. Dasselbe Raster wie dp-lista. */
.dp-placi {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--dp-sp-8);                /* 48px, waagerecht wie senkrecht */
  /* Die Zellen strecken sich NICHT: eine kuerzere Kachel bleibt so hoch wie
     ihr Inhalt, sonst saesse ihr mittig gesetzter Inhalt tiefer als im
     Original. Dort steht dafuer `align-items: start` am Kachelkasten. */
  align-items: start;
  margin: 0 0 var(--dp-sp-5) 0;
}
.dp-placa { display: flex; align-items: center; }

/* Der Symbolkasten: 10rem im Quadrat, darin eine RAUTE — ein um 45 Grad
   gedrehtes Quadrat von 7rem mit 2px Linie und 4px Radius. Die Raute stand
   in keiner Messung, sondern im Bild: sie ist ein ::after, das ohne
   Bildschuss unsichtbar bleibt. */
.dp-placa-sim {
  position: relative;
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 10rem; height: 10rem;
  margin-right: var(--dp-sp-5);
  color: var(--dp-accent);
}
.dp-placa-sim::after {
  content: "";
  position: absolute;
  left: 50%; top: 50%;
  width: 7rem; height: 7rem;
  margin: -3.5rem 0 0 -3.5rem;
  border: var(--dp-linie-2) solid var(--dp-linie);
  border-radius: 4px;
  transform: rotate(45deg);
}
/* Die Glyphe wird ueber die HOEHE bemessen, nicht ueber die Breite:
   fa-money-bill-alt ist 640 von 512 Einheiten breit, und ein 1em-Quadrat
   wuerde sie um ein Fuenftel schrumpfen. Mit height + width:auto trifft sie
   dieselbe Groesse wie der Webfont bei 2,75rem. */
.dp-placa-sim .dp-sim {
  width: auto;
  height: 44px;                       /* 2,75rem des Originals — fest */
  position: relative;
  top: 2.2px;                         /* = .05em der 44px-Glyphe, gemessen */
  vertical-align: baseline;
}
.dp-placa-corp { flex: 1 1 auto; min-width: 0; }
.dp-placa-corp > :last-child { margin-bottom: 0; }

/* 21.4 Die Amtstraeger der Startseite.
   NICHT dp-persoana: das ist die querliegende Karte auf /primaria
   (525x250, Bild links, grauer Grund). Hier steht das Bild ueber dem Text,
   die Karte traegt einen Schatten und keinen Rahmen, und die Angaben sind
   andere — dieselben drei Personen aus einer ANDEREN Datenquelle.
   MUSTER.md B: Daten zusammenlegen ja, Darstellung nein. */
.dp-echipa {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 2.25rem;                       /* 36px, gemessen */
  margin: 0 0 var(--dp-sp-5) 0;
  /* Im Original traegt JEDE Karte 36px Abstand nach unten, auch die der
     letzten Reihe. Das Raster hier kennt nur Zwischenraeume — die 36px am
     Fuss stehen deshalb hier, sonst endet die Seite 36px zu frueh. */
  padding-bottom: 2.25rem;
}
.dp-echipa-membru {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 30px;
  box-shadow: var(--dp-umbra);
}
.dp-echipa-text {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
}
.dp-echipa-bild {
  height: 125px;
  width: auto;
  border-radius: 50%;
  margin-bottom: 10px;
}
.dp-echipa-nume { margin-bottom: 1em; }              /* 20px, = h3-Vorgabe */
.dp-echipa-rol {
  margin: -5px 0 var(--dp-sp-5) 0;    /* -5px fest, 2em darunter waechst mit */
  color: var(--dp-accent);
}
.dp-echipa-desc { margin: 10px; width: 90%; }

/* 21.5 Die drei juengsten Anuntzuri — dp-lista/dp-carte, nur der Titel ist
   kleiner: im Original h3 20/30 statt h2 28/42 auf der Listenseite.
   Ein Modifikator am Behaelter, wie .dp-servicii und .dp-primaria. */
.dp-lista-recente .dp-carte-titlu { font-size: 1.25rem; }

/* DREI Spalten, nicht zwei — Entscheidung von Lukas, DESIGN.md 8, 15.
   Das Original zeigt hier unterhalb 1681px zwei Karten und die dritte
   darunter; der Block traegt aber immer genau drei Eintraege (`limit: 3`),
   und drei nebeneinander sind gleich hoch und symmetrisch. Oberhalb 1681px
   tut das Original ohnehin dasselbe. */
@media (min-width: 981px) {
  .dp-lista-recente { grid-template-columns: repeat(3, 1fr); }
  .dp-lista-recente .dp-carte:nth-child(2n+1)::before { display: block; }
  .dp-lista-recente .dp-carte:nth-child(2n+1)::after  { width: calc(100% + var(--dp-sp-8)); }
  .dp-lista-recente .dp-carte:nth-last-child(-n+2)::after  { display: block; }
  .dp-lista-recente .dp-carte:nth-last-child(-n+2)::before { height: calc(100% + var(--dp-sp-8)); }
  .dp-lista-recente .dp-carte:nth-child(3n+1)::before { display: none; }
  .dp-lista-recente .dp-carte:nth-child(3n+1)::after  { width: 100%; }
  .dp-lista-recente .dp-carte:nth-last-child(-n+3)::after  { display: none; }
  .dp-lista-recente .dp-carte:nth-last-child(-n+3)::before { height: 100%; }
}

/* Haltepunkte. Die Kacheln stapeln im Original erst bei 480px — dieser
   Haltepunkt gehoert DigiPagina nicht (DESIGN.md 2 kennt fuenf, und jeder
   tut etwas). Er wird deshalb auf `s` (736) gezogen; siehe DESIGN.md 8. */
@media (max-width: 980px) {
  .dp-placi { grid-template-columns: 1fr; }
  .dp-placa-sim { width: 8rem; height: 8rem; }
  .dp-placa-sim::after { width: 6rem; height: 6rem; margin: -3rem 0 0 -3rem; }
  .dp-placa-sim .dp-sim { height: 36px; top: 1.8px; }
  .dp-echipa { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 736px) {
  .dp-despre { flex-direction: column; gap: 0; }
  .dp-despre-text, .dp-despre-harta { width: 100%; }
  /* Untereinander hat die Karte keinen Nachbarn mehr, an dessen Hoehe sie
     sich haelt: `height: 100%` gegen einen Kasten ohne eigene Hoehe faellt
     auf die Vorgabehoehe eines <iframe> zurueck — 150px. Gemessen im
     Original: Karte 150, Kasten 156,2 (die 6,2 sind wieder die Unterlaenge
     der Zeilenschachtel). Hier entsteht dieselbe Zahl aus demselben
     Mechanismus; sie wird NICHT als Wert hingeschrieben. */
  .dp-placa { flex-direction: column; align-items: flex-start; }
  .dp-placa-sim {
    width: 6rem; height: 6rem;
    margin: 0 0 var(--dp-sp-6) 0;
  }
  .dp-placa-sim::after { width: 4rem; height: 4rem; margin: -2rem 0 0 -2rem; }
  .dp-placa-sim .dp-sim { height: 20px; top: 1px; }
  .dp-echipa { grid-template-columns: 1fr; }
}

/* --- 22. dp-text — M5, die Textseite --------------------------------------
   Politica de confidentialitate und die Fehlerseite. Titel, Fliesstext,
   sonst nichts. Der einzige eigene Wert ist der Abstand unter der h1:
   1em statt der ueblichen 0,5em. Ursache benannt und gemessen — im Original
   steht der Titel dieser Seiten in `header.main`, und dort gilt
   `header.main > :last-child { margin: 0 0 1em 0 }`. Auf der Anunt-Seite
   steht er in einem nackten <header> und traegt 0,5em (28px). */

.dp-text-titlu { margin-bottom: 1em; }               /* 56px, gemessen */
.dp-text-corp > :last-child { margin-bottom: 0; }

/* Der Knopf der eigenen MOL-Seite (Conop). Er steht LINKS unter dem Text und
   nicht rechts wie `.dp-cta-rand` im Hero — dort ordnet er sich neben einer
   Ueberschrift ein, hier folgt er einem Absatz. Der Abstand ist der des
   Bestands: `margin-top:1.5rem` stand in der Inline-Gestaltung, die beim
   Zerlegen weggefallen ist. Die Knopfform selbst ist `dp-cta`, unveraendert. */
.dp-mol-actiune { margin: 24px 0 0 0; }

/* --- 23. dp-ip-ref — der Querverweis auf die Intreprinderi publice --------
   Eine Zeile zwischen Carieră und der Logoleiste, im Theme ohne Bedingung.
   Am Original gemessen: 15,2px/24,32, Farbe wie der Fliesstext. */
.dp-ip-ref { margin: 0; }
.dp-ip-ref p { margin: 0; font-size: calc(15.2px * var(--dp-lupe, 1)); line-height: 1.6; }

/* --- Die Suchseite (Stufe A) ---------------------------------------------
   Sie hat kein Gegenstueck im Original: die laufende Seite hat SimpleSearch
   als Grav-Plugin, das statisch nicht existieren kann. Die Masse folgen
   deshalb der Rubrikliste (`dp-rubrica`), nicht einem gemessenen Vorbild —
   und das steht hier, damit niemand spaeter eine Messung dazu sucht. */
.dp-cautare-form { display: flex; gap: var(--dp-sp-3); flex-wrap: wrap;
  align-items: center; margin-bottom: var(--dp-sp-3); }
.dp-cautare-form .dp-camp-cauta { flex: 1 1 18rem; }
.dp-cautare-zahl { margin: var(--dp-sp-4) 0 var(--dp-sp-2);
  font-weight: 600; color: var(--dp-desc); }
.dp-cautare-rezultate { list-style: none; padding: 0; margin: 0; }
.dp-cautare-rezultate > li { padding: var(--dp-sp-3) 0;
  border-top: 1px solid var(--dp-linie); }
.dp-cautare-rezultate > li > a { font-weight: 600; }
.dp-cautare-meta, .dp-cautare-anexa { margin: 0.25rem 0 0;
  font-size: 0.9rem; color: var(--dp-desc); }
.dp-cautare-anexa { overflow-wrap: anywhere; }
/* Der Ausschnitt aus dem Dokument — nur Stufe B, und nur wo der Fund darin
   steht (`cauta-b.mjs`: ohne Marke im Ausschnitt stand das Wort nicht im
   Text). Der Text kommt aus der Erkennung gescannter Amtsdokumente: er bricht
   an beliebiger Stelle ab, traegt Zeilenreste und lange Zeichenketten ohne
   Leerzeichen. Deshalb `overflow-wrap` wie beim Anhangsnamen — sonst schiebt
   ein einziger OCR-Wurm die Spalte auf dem Handy auseinander.
   Die Hervorhebung ist ein <mark> und kein Fettdruck: sie sagt „hier stand
   das gesuchte Wort", und das ist eine Auszeichnung, keine Betonung. */
.dp-cautare-extras { margin: 0.35rem 0 0; font-size: 0.95rem;
  line-height: 1.55; color: var(--dp-text); overflow-wrap: anywhere; }
.dp-cautare-extras mark { background: var(--dp-accent-slab); color: inherit;
  padding: 0 0.1em; }
.dp-cautare-rubrici { margin-top: var(--dp-sp-5); }
.dp-cautare-rubrici-lista { margin: 0; padding-left: 1.2rem; }
.dp-cautare-rubrici-lista > li { margin: 0.2rem 0; }

/* --- Die Empfangsseite nach einer Sesizare -------------------------------
   Kein Gegenstueck im Original: die laufende Seite hat diesen Weg nicht, sie
   bestaetigt im Formular selbst. Die Masse folgen dem Hinweiskasten des
   gesperrten Formulars (`.dp-nota`), damit der Buerger dieselbe Sprache
   sieht wie zwei Klicks vorher. */
.dp-primire-kasten {
  border-left: var(--dp-linie-3) solid var(--dp-accent);
  background: var(--dp-accent-slab);
  padding: var(--dp-sp-4) var(--dp-sp-6);
  border-radius: 0 var(--dp-raza) var(--dp-raza) 0;
  margin: var(--dp-sp-4) 0 var(--dp-sp-5);
}
.dp-primire-satz { margin: 0; font-weight: 600; color: var(--dp-titlu); }
.dp-primire-kasten p + p { margin: var(--dp-sp-2) 0 0; }
.dp-primire-weiter { display: flex; gap: var(--dp-sp-4);
  align-items: center; flex-wrap: wrap; }

/* --- Die Pruefung am Formularfeld ----------------------------------------
   OHNE JAVASCRIPT. `:user-invalid` greift erst, nachdem der Buerger das Feld
   angefasst und wieder verlassen hat — `:invalid` allein wuerde beim Laden
   jedes leere Pflichtfeld rot anstreichen, bevor jemand etwas falsch gemacht
   hat. Das ist der ganze Unterschied zwischen einem Hinweis und einem Vorwurf.

   Browser ohne `:user-invalid` sehen den Hinweis nie und behalten die
   eingebaute Pruefung des Browsers — die Blase beim Absenden. Das ist der
   Rueckfall, und er ist stumm, aber nicht tot: abgeschickt wird trotzdem
   nichts Unvollstaendiges. */
.dp-camp-fehler {
  display: none;
  margin: var(--dp-sp-2) 0 0;
  font-size: .9rem;
  color: #a4262c;                     /* eigener Rotton, nur hier */
}
.dp-camp:user-invalid, .dp-bifa input:user-invalid {
  border-color: #a4262c;
  outline-color: #a4262c;
}
.dp-camp:user-invalid ~ .dp-camp-fehler,
.dp-bifa:has(input:user-invalid) ~ .dp-camp-fehler {
  display: block;
}
/* Das Skript darf denselben Hinweis auch OHNE `:user-invalid` zeigen —
   beim Klick auf einen Knopf, der noch nicht abschicken kann. */
.dp-camp-grup[data-fehler] .dp-camp-fehler { display: block; }
.dp-camp-grup[data-fehler] .dp-camp,
.dp-camp-grup[data-fehler] .dp-bifa input { border-color: #a4262c; outline-color: #a4262c; }
/* Das Kaestchen selbst zeichnet der Browser; ein Rahmen allein traegt dort
   nicht. Der Umriss macht es sichtbar, ohne die Zeichnung zu ersetzen. */
.dp-camp-grup[data-fehler] .dp-bifa input,
.dp-bifa input:user-invalid { outline: 2px solid #a4262c; outline-offset: 2px; }

/* Der Absendeknopf, solange Pflichtfelder fehlen. `aria-disabled` statt
   `disabled`: der Knopf bleibt erreichbar und wird angesagt, und ein Klick
   fuehrt zu den Fehlern statt ins Nichts. Ein wirklich abgeschalteter Knopf
   sagt einem Screenreader nur "nicht verfuegbar" und nie, warum. */
.dp-buton[aria-disabled="true"] {
  opacity: .55;
  cursor: not-allowed;
}
