.settings-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 10px; }
@import url('https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400..600&family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500&display=swap');

/* ---------- Farben ----------

   Zwei Ansichten, eine Regelmenge: unter dieser Stelle steht keine Farbe mehr
   fest, alles greift auf die Tokens hier zu. Eine helle Ansicht ist damit ein
   zweiter Wertesatz und keine zweite Datei.

   Dunkel steht in :root und ist damit der Wert, der ohne Attribut gilt. Hell
   kommt ueber data-theme="light" an <html>.

   Bewusst KEIN @media (prefers-color-scheme): welche Ansicht gilt, entscheidet
   public/js/theme.js - ohne eigene Wahl folgt es der Systemeinstellung, ein
   Klick auf den Umschalter legt sie fest. Stuende die Systemabfrage hier,
   braeuchte sie einen zweiten Block mit denselben 19 Farbwerten, und ein
   geaenderter Hexwert waere an einer der beiden Stellen vergessen. Das Skript
   blockiert ohnehin schon vor dem ersten Zeichnen. */

:root {
  --bg: #14181d;
  --surface: #1b2127;
  --surface-alt: #20272e;
  --border: #2b333b;
  --text: #ece8e1;
  --text-dim: #8b9199;
  --accent: #c1793d;
  --accent-dim: #8c5a2c;
  --success: #6fa37b;
  --danger: #d4766b;
  --warning: #d9a54b;
  --radius: 6px;

  /* Der Akzent traegt zwei Rollen: Schriftfarbe auf dem Untergrund UND
     Flaeche des Hauptknopfes. --on-accent ist die Schrift AUF dieser Flaeche
     und laesst sich nicht aus --text ableiten: im Dunklen ist sie dunkel, im
     Hellen hell. */
  --accent-hover: #d4884c;
  --on-accent: #14181d;

  /* Durchscheinende Flaechen und Schatten brauchen je Ansicht eine eigene
     Deckkraft: 12 % Gruen fallen auf dunklem Grund auf, auf hellem nicht, und
     ein Schatten aus 35 % Schwarz wirkt im Hellen wie ein Fleck. */
  --tint-success: rgba(111, 163, 123, 0.12);
  --tint-danger: rgba(212, 118, 107, 0.12);
  --pulse-ring: rgba(111, 163, 123, 0.5);
  --menu-shadow: 0 10px 24px rgba(0, 0, 0, 0.35);
  --login-glow: rgba(193, 121, 61, 0.08);

  /* Der Pfeil der Auswahlfelder ist eine Bilddatei, seine Farbe steht also in
     der URL und nicht in einer Eigenschaft - er muss als ganzes Token
     ausgetauscht werden. %23 ist das # der Farbe. */
  --select-arrow: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5 6 6.5l5-5' fill='none' stroke='%238b9199' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");

  /* Die aufgeklappte Liste eines <select> zeichnet das Betriebssystem, nicht
     die Seite - ohne diese Zeile ist sie weiss, egal wie das Feld gestylt
     ist. Gilt genauso fuer Scrollbalken und Zahlen-Spinner. */
  color-scheme: dark;
}

/* Nicht Weiss und nicht Schwarz: der dunkle Satz ist warm getoent (#ece8e1
   auf #14181d), ein reines #fff/#000 daneben liesse die helle Ansicht wie ein
   fremdes Programm aussehen. Akzent, Gruen, Rot und Gelb sind abgedunkelt -
   #c1793d auf hellem Grund kommt nur auf 3,2:1 und ist als Schrift unlesbar;
   die Werte hier liegen alle ueber 4,5:1. */
:root[data-theme="light"] {
  --bg: #f5f2ec;
  --surface: #fffefb;
  --surface-alt: #eae5dc;
  --border: #d8d1c5;
  --text: #1c2227;
  --text-dim: #676d74;
  --accent: #9a5d28;
  --accent-dim: #b5834f;
  --accent-hover: #834d1f;
  --on-accent: #fffefb;
  --success: #3d7550;
  --danger: #a4322a;
  --warning: #83600f;

  --tint-success: rgba(61, 117, 80, 0.13);
  --tint-danger: rgba(164, 50, 42, 0.11);
  --pulse-ring: rgba(61, 117, 80, 0.45);
  --menu-shadow: 0 10px 24px rgba(28, 34, 39, 0.14);
  --login-glow: rgba(154, 93, 40, 0.1);

  --select-arrow: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1.5 6 6.5l5-5' fill='none' stroke='%23676d74' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");

  color-scheme: light;
}

* {
  box-sizing: border-box;
}

/* Ohne diese Regel versteckt das Attribut hidden nichts, sobald das Element
   auch eine Klasse mit display traegt: die Browser-Vorgabe fuer [hidden] ist
   eine Regel des Browsers, und Autorenregeln schlagen die unabhaengig von der
   Spezifitaet. .tab-count{display:inline-block} und .pager{display:flex}
   hatten damit gewonnen - die leeren Zaehler in den Einstellungsreitern
   nahmen Platz weg, und ein Seitenwechsler blieb nach einem fehlgeschlagenen
   Aufruf samt Knoepfen stehen.

   !important, weil [hidden] mit 0-1-0 dieselbe Spezifitaet hat wie eine
   Klasse: ohne waere nur die Reihenfolge entscheidend, und jede spaeter
   angefuegte Klassenregel wuerde das Versteckte wieder hervorholen. */
[hidden] {
  display: none !important;
}

body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-family: 'Inter', system-ui, sans-serif;
  font-size: 15px;
  line-height: 1.5;
}

h1, h2, h3 {
  font-family: 'Fraunces', serif;
  font-weight: 500;
  letter-spacing: -0.01em;
  margin: 0;
}

.mono {
  font-family: 'JetBrains Mono', monospace;
  font-size: 0.85em;
}

a {
  color: var(--accent);
  text-decoration: none;
}

/* ---------- Login ---------- */

.login-screen {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
  background:
    radial-gradient(circle at 20% 15%, var(--login-glow), transparent 40%),
    var(--bg);
}

.login-card {
  /* Nicht fest 360px: auf einem 360er-Display bliebe kein Rand, auf einem
     320er wuerde die Karte aus dem Bild laufen. */
  width: min(360px, 100%);
  padding: 40px 36px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
}

.login-eyebrow {
  font-family: 'JetBrains Mono', monospace;
  font-size: 0.72rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 8px;
  display: block;
}

.login-card h1 {
  font-size: 1.7rem;
  margin-bottom: 28px;
}

.field {
  margin-bottom: 16px;
}

.field label {
  display: block;
  font-size: 0.8rem;
  color: var(--text-dim);
  margin-bottom: 6px;
}

.field input, .field select {
  width: 100%;
  padding: 10px 12px;
  background: var(--surface-alt);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  color: var(--text);
  font-size: 0.95rem;
  font-family: inherit;
}

.field input:focus, .field select:focus {
  outline: 2px solid var(--accent);
  outline-offset: 1px;
}

/* Eigener Pfeil: der systemeigene bringt in jedem Browser eine andere
   Groesse und Farbe mit und sitzt neben den Textfeldern sichtbar daneben.
   Als data-URI, damit kein zusaetzlicher Request faellig wird - die Farbe
   steckt darin und kommt deshalb aus --select-arrow. */
.field select, .property-filters select {
  appearance: none;
  -webkit-appearance: none;
  padding-right: 34px;
  background-image: var(--select-arrow);
  background-repeat: no-repeat;
  background-position: right 12px center;
  cursor: pointer;
}

.field select:hover, .property-filters select:hover { border-color: var(--accent-dim); }

.btn-primary {
  width: 100%;
  padding: 11px;
  margin-top: 8px;
  background: var(--accent);
  border: none;
  border-radius: var(--radius);
  color: var(--on-accent);
  font-weight: 600;
  font-size: 0.95rem;
  cursor: pointer;
  transition: background 0.15s ease;
}

.btn-primary:hover {
  background: var(--accent-hover);
}

.btn-primary:focus-visible {
  outline: 2px solid var(--text);
  outline-offset: 2px;
}

.login-error {
  color: var(--danger);
  font-size: 0.85rem;
  margin-top: 14px;
  min-height: 1.2em;
}

/* ---------- Dashboard ---------- */

.topbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 18px 32px;
  border-bottom: 1px solid var(--border);
}

.topbar .brand {
  display: flex;
  align-items: baseline;
  gap: 10px;
}

.topbar .brand h1 {
  font-size: 1.3rem;
}

/* Die Bildmarke kommt als <img> auf /favicon.svg herein - so steht ihre
   Geometrie genau einmal im Projekt, in scripts/make-icons.js. Deshalb kein
   currentColor: die Farbe ist in der Datei. */
.brand-mark {
  width: 24px;
  height: 24px;
  align-self: center;
  flex: 0 0 auto;
}

.topbar .tenant-name {
  color: var(--text-dim);
  font-size: 0.85rem;
}

/* Das Trennzeichen gehoert zur E-Mail, nicht zum Mandanten: so verschwindet
   es mit ihr, wenn der Platz auf dem Telefon nicht fuer beides reicht. */
.topbar .user-email {
  color: var(--text-dim);
  font-size: 0.85rem;
}

.topbar .user-email::before { content: "· "; }

.logout-btn {
  background: none;
  border: 1px solid var(--border);
  color: var(--text-dim);
  padding: 7px 14px;
  border-radius: var(--radius);
  cursor: pointer;
  font-size: 0.85rem;
  font-family: inherit;
}

.logout-btn:hover {
  border-color: var(--accent);
  color: var(--accent);
}

.topbar-actions {
  display: flex;
  align-items: center;
  gap: 16px;
}

/* Umschalter fuer helle und dunkle Ansicht. Quadratisch und randlos: er steht
   zwischen den Navigationslinks und dem Abmelde-Knopf und soll keinen von
   beiden nachahmen. 34px sind am Schreibtisch genug - auf dem Telefon wird er
   im Mobil-Abschnitt auf 44px gebracht. */
.theme-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  flex: 0 0 auto;
  padding: 0;
  background: none;
  border: none;
  border-radius: var(--radius);
  color: var(--text-dim);
  cursor: pointer;
}

.theme-btn:hover { color: var(--accent); }
.theme-btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* ---------- Hamburger-Knopf ----------
   Am Schreibtisch nicht vorhanden: display:none nimmt ihn auch aus der
   Tabreihenfolge, hidden allein tut das nicht. Sichtbar wird er erst im
   Mobil-Abschnitt am Ende dieser Datei. */
.nav-toggle {
  display: none;
  position: relative;
  width: 42px;
  height: 42px;
  flex: 0 0 auto;
  padding: 0;
  background: none;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  cursor: pointer;
}

.nav-toggle:hover { border-color: var(--accent-dim); }
.nav-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* Drei Balken aus einem Element: der mittlere ist das Element selbst, die
   beiden aeusseren sind seine Pseudo-Elemente. Ein Knopf mit drei leeren
   <span> waere derselbe Strich in mehr Markup. */
.nav-toggle-icon,
.nav-toggle-icon::before,
.nav-toggle-icon::after {
  position: absolute;
  left: 50%;
  width: 20px;
  height: 2px;
  margin-left: -10px;
  background: var(--text);
  transition: transform 0.18s ease, opacity 0.18s ease;
}

.nav-toggle-icon { top: 50%; margin-top: -1px; }
.nav-toggle-icon::before { content: ""; top: -6px; left: 0; margin-left: 0; }
.nav-toggle-icon::after { content: ""; top: 6px; left: 0; margin-left: 0; }

/* Aufgeklappt wird aus den Balken ein Kreuz - der Zustand ist damit auch ohne
   Blick auf das Menue erkennbar. Gesteuert ueber aria-expanded am Knopf, statt
   ueber eine zweite Klasse: der Zustand steht dann genau einmal im DOM. */
.nav-toggle[aria-expanded="true"] .nav-toggle-icon { background: transparent; }
.nav-toggle[aria-expanded="true"] .nav-toggle-icon::before { transform: translateY(6px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] .nav-toggle-icon::after { transform: translateY(-6px) rotate(-45deg); }

@media (prefers-reduced-motion: reduce) {
  .nav-toggle-icon,
  .nav-toggle-icon::before,
  .nav-toggle-icon::after { transition: none; }
}

.nav-link {
  font-size: 0.85rem;
}

main {
  padding: 32px;
  max-width: 1100px;
  margin: 0 auto;
}

.stat-row {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 16px;
  margin-bottom: 36px;
}

.stat-card {
  display: block;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 18px 20px;
}

/* Die Kacheln sind Links. Sie sollen aber weiter wie Kacheln aussehen -
   also keine Linkfarbe, kein Unterstrich, und der Hinweis auf das Ziel
   erst beim Darueberfahren. */
a.stat-card {
  color: inherit;
  text-decoration: none;
  transition: border-color 0.15s ease;
}
a.stat-card:hover, a.stat-card:focus-visible { border-color: var(--accent-dim); }
.stat-hint {
  display: block;
  margin-top: 8px;
  color: var(--accent);
  font-size: 0.75rem;
  opacity: 0;
  transition: opacity 0.15s ease;
}
a.stat-card:hover .stat-hint, a.stat-card:focus-visible .stat-hint { opacity: 1; }

/* Der Hinweis liegt dauerhaft im Layout und wird nur ein- und ausgeblendet -
   sonst wuerde die Kachel beim Darueberfahren wachsen und die Abschnitte
   darunter verschieben. Ohne Bewegungswunsch bleibt er sichtbar. */
@media (prefers-reduced-motion: reduce) {
  .stat-hint { opacity: 1; }
}

.stat-card .label {
  font-size: 0.75rem;
  color: var(--text-dim);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  margin-bottom: 6px;
}

.stat-card .value {
  font-family: 'Fraunces', serif;
  font-size: 2rem;
}

section {
  margin-bottom: 40px;
}

/* Auch das h2 in .section-heading-row erfassen: als Enkel von <section>
   griff der Kindselektor dort nicht, die Überschrift fiel auf die
   Serifen-Grundregel zurück und sah anders aus als alle anderen. */
section > h2,
.section-heading-row > h2 {
  font-size: 1rem;
  color: var(--text-dim);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-family: 'Inter', sans-serif;
  font-weight: 600;
  margin-bottom: 14px;
  padding-bottom: 10px;
  border-bottom: 1px solid var(--border);
}

.section-heading-row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  border-bottom: 1px solid var(--border);
}

.section-heading-row > h2 { border-bottom: none; margin-bottom: 0; }
.section-note { color: var(--text-dim); font-size: 0.75rem; }
.property-table { overflow-x: auto; }
.property-table-head, .property-table-row { min-width: 780px; display: grid; grid-template-columns: 1.3fr 1.2fr 0.7fr 0.9fr 1fr 40px; gap: 16px; align-items: center; }
.property-table-head { padding: 10px 4px 8px; color: var(--text-dim); font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.06em; }
.property-table-row { padding: 14px 4px; border-bottom: 1px solid var(--border); font-size: 0.88rem; }
.property-table-row strong, .property-meta { display: block; }
.property-meta { color: var(--text-dim); font-size: 0.76rem; margin-top: 2px; }

.ledger {
  display: flex;
  flex-direction: column;
}

.ledger-row {
  display: grid;
  grid-template-columns: 1fr auto auto auto;
  align-items: center;
  gap: 16px;
  padding: 13px 4px;
  border-bottom: 1px solid var(--border);
}

.ledger-row:last-child {
  border-bottom: none;
}

.pulse-dot {
  display: inline-block;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  margin-right: 8px;
}

.pulse-dot.ok {
  background: var(--success);
  box-shadow: 0 0 0 0 var(--pulse-ring);
  animation: pulse 2s infinite;
}

.pulse-dot.fail {
  background: var(--danger);
}

.pulse-dot.pending {
  background: var(--text-dim);
}

/* Der auslaufende Ring endet auf "transparent" statt auf demselben Gruen mit
   Alpha 0: Browser rechnen die Zwischenschritte mit vorgewichtetem Alpha, das
   Ergebnis ist identisch - und es braucht kein zweites Token je Ansicht. */
@keyframes pulse {
  0% { box-shadow: 0 0 0 0 var(--pulse-ring); }
  70% { box-shadow: 0 0 0 6px transparent; }
  100% { box-shadow: 0 0 0 0 transparent; }
}

.format-tag {
  font-family: 'JetBrains Mono', monospace;
  font-size: 0.72rem;
  padding: 3px 8px;
  border-radius: 3px;
  background: var(--surface-alt);
  color: var(--text-dim);
  white-space: nowrap;
}

.empty-state {
  color: var(--text-dim);
  font-size: 0.9rem;
  padding: 20px 4px;
}

.property-filters {
  display: flex;
  gap: 16px;
  margin-bottom: 20px;
}

/* Knopf zum Auf- und Zuklappen der Filterzeile. Am Schreibtisch nicht
   vorhanden: dort ist die Zeile immer sichtbar, und display: none nimmt den
   Knopf auch aus der Tabreihenfolge. */
.filter-toggle {
  display: none;
  align-items: center;
  gap: 8px;
  margin-bottom: 14px;
  padding: 9px 14px;
  background: none;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  color: var(--text-dim);
  font: inherit;
  font-size: 0.85rem;
  cursor: pointer;
}

.filter-toggle:hover { border-color: var(--accent-dim); color: var(--accent); }
.filter-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

/* Ein Dreieck, das sich beim Aufklappen dreht - der Zustand ist damit auch
   ohne Blick auf die Zeile darunter erkennbar. */
.filter-toggle::after {
  content: "";
  width: 0;
  height: 0;
  border-left: 4px solid transparent;
  border-right: 4px solid transparent;
  border-top: 5px solid currentColor;
  transition: transform 0.18s ease;
}

.filter-toggle[aria-expanded="true"]::after { transform: rotate(180deg); }

@media (prefers-reduced-motion: reduce) {
  .filter-toggle::after { transition: none; }
}

.property-filters label {
  display: flex;
  align-items: center;
  gap: 9px;
  color: var(--text-dim);
  font-size: 0.8rem;
}

.property-filters select {
  padding: 8px 30px 8px 10px;
  /* background-color, nicht die Kurzform: die wuerde das oben gesetzte
     Pfeil-Symbol wieder loeschen. */
  background-color: var(--surface-alt);
  background-position: right 10px center;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  color: var(--text);
  font: inherit;
}

.property-directory {
  border-top: 1px solid var(--border);
  overflow-x: auto;
}

.property-directory-scroll { min-width: 850px; width: 100%; }
.property-directory-scroll.no-targets { min-width: 0; width: 100%; }

/* Erzwingt auf dem Telefon einen Zeilenumbruch vor den Exporthaken.
   display: none nimmt das Element am Schreibtisch komplett aus dem Grid -
   sonst hätte die Kopfzeile eine Spalte weniger als die Zeilen darunter. */
.directory-break { display: none; }
.directory-head, .directory-row { display: grid; grid-template-columns: 1.35fr 1.35fr 0.75fr 0.95fr 0.55fr repeat(4, minmax(105px, 0.8fr)); gap: 14px; align-items: center; }
.directory-head { padding: 10px 4px 8px; color: var(--text-dim); font-size: 0.7rem; text-transform: uppercase; letter-spacing: 0.06em; }
.directory-row { padding: 13px 4px; border-bottom: 1px solid var(--border); font-size: 0.84rem; }
.directory-row.is-disabled { opacity: 0.5; }

/* Sortierbare Spaltenkoepfe sollen wie die uebrigen Kopfzeilen-Labels
   aussehen, nicht wie Buttons - deshalb erben sie Schrift und Farbe. */
.sort-header {
  display: flex;
  align-items: center;
  gap: 4px;
  min-width: 0;
  padding: 0;
  border: 0;
  background: none;
  color: inherit;
  font: inherit;
  text-transform: inherit;
  letter-spacing: inherit;
  text-align: left;
  cursor: pointer;
}
.sort-header:hover, .sort-header:focus-visible { color: var(--accent); }
.sort-header.is-sorted { color: var(--text); }
/* Feste Breite, damit die Kopfzeile beim Wechsel der Spalte nicht springt. */
.sort-arrow { width: 0.8em; color: var(--accent); }
/* Beschriftung und Haken einer Exportspalte müssen dieselbe Ausrichtung
   haben, sonst stehen sie bei einer 105px breiten Spalte gut fünfzig Pixel
   auseinander. Mittig statt links, weil ein 17px-Kästchen am linken Rand
   einer breiten Spalte aussieht, als hätte es sich verlaufen. */
.directory-target-head, .target-toggle-cell { text-align: center; }
.directory-area, .directory-price { text-align: right; }
.sort-header.directory-area, .sort-header.directory-price { justify-content: flex-end; }
.target-toggle-cell input { width: 17px; height: 17px; accent-color: var(--accent); cursor: pointer; }
.property-view { color: var(--accent); font-size: 1.15rem; text-align: center; opacity: 0; transition: opacity 0.15s ease; }
.directory-row:hover .property-view, .property-table-row:hover .property-view, .property-view:focus-visible { opacity: 1; }
.back-link { display: inline-block; margin-bottom: 24px; font-size: 0.85rem; }
.property-detail-main { max-width: 960px; }
.detail-hero { display: flex; align-items: flex-start; justify-content: space-between; gap: 20px; margin-bottom: 24px; }
.detail-hero h2 { font-size: 2.3rem; margin-bottom: 6px; }
.detail-hero p { color: var(--text-dim); margin: 0; }
.detail-status { border-radius: 3px; padding: 5px 9px; font-size: 0.75rem; }
.detail-status.active, .included { color: var(--success); background: var(--tint-success); }
.detail-status.disabled, .excluded { color: var(--danger); background: var(--tint-danger); }
.detail-summary { display: grid; grid-template-columns: repeat(6, 1fr); gap: 1px; background: var(--border); border: 1px solid var(--border); margin-bottom: 36px; }
.detail-field { display: flex; flex-direction: column; gap: 4px; min-width: 0; padding: 14px; background: var(--surface); }
.detail-field span { color: var(--text-dim); font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.05em; }
.detail-field strong { overflow-wrap: anywhere; font-weight: 500; }
.detail-rich-field { grid-column: 1 / -1; }
.rich-text { overflow-wrap: anywhere; }
/* Gekuerzte Ansicht: drei Zeilen, den Rest holt der Umschalter. */
.rich-text.is-clamped { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden; }
.rich-toggle { align-self: flex-start; margin-top: 2px; }
.rich-toggle:hover { text-decoration: underline; }
.rich-text p { margin: 0 0 8px; }
.rich-text p:last-child { margin-bottom: 0; }
.rich-text ul, .rich-text ol { margin: 0; padding-left: 20px; }
.detail-section { margin-bottom: 32px; }
.detail-section h3 { margin-bottom: 14px; font-size: 1.1rem; }
.detail-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1px; background: var(--border); border: 1px solid var(--border); }
.photo-list { display: flex; flex-wrap: wrap; gap: 8px; }
.photo-status { color: var(--text-dim); font-size: 0.8rem; margin-bottom: 12px; }
.photo-gallery { display: flex; flex-wrap: wrap; gap: 12px; }
.photo-preview, .photo-missing { display: flex; flex-direction: column; gap: 6px; width: 150px; color: var(--text-dim); font-size: 0.72rem; overflow-wrap: anywhere; }
.photo-preview img { width: 150px; height: 105px; object-fit: cover; background: var(--surface-alt); border: 1px solid var(--border); }
.photo-preview:hover img { border-color: var(--accent); }
.photo-missing { padding: 12px; background: var(--surface-alt); border: 1px dashed var(--border); }
.photo-missing small { color: var(--danger); }
.photo-lightbox[hidden] { display: none; }
.photo-lightbox { position: fixed; inset: 0; z-index: 100; display: grid; place-items: center; padding: 28px; background: rgb(0 0 0 / 0.82); cursor: zoom-out; }
.photo-lightbox-image { max-width: min(1100px, 94vw); max-height: 88vh; object-fit: contain; box-shadow: 0 18px 60px rgb(0 0 0 / 0.45); cursor: default; }
.photo-lightbox-close { position: absolute; top: 18px; right: 22px; width: 42px; height: 42px; border: 1px solid rgb(255 255 255 / 0.55); border-radius: 50%; background: rgb(0 0 0 / 0.35); color: white; font-size: 1.7rem; line-height: 1; cursor: pointer; }
.photo-lightbox-close:hover, .photo-lightbox-close:focus-visible { border-color: white; background: rgb(0 0 0 / 0.7); }
.lightbox-open { overflow: hidden; }
.export-list { border-top: 1px solid var(--border); }
.export-state { display: flex; justify-content: space-between; gap: 16px; padding: 12px 4px; border-bottom: 1px solid var(--border); }
.export-state small { color: var(--text-dim); margin-left: 6px; }

/* ---------- Settings ---------- */

.settings-main {
  max-width: 760px;
}

.settings-header {
  margin-bottom: 28px;
}

.settings-header h2 {
  font-size: 2.2rem;
  margin-bottom: 8px;
}

.settings-header p {
  color: var(--text-dim);
  margin: 0;
}

.form-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 16px;
}

.settings-footer {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 14px 20px;
  border-top: 1px solid var(--border);
  margin-top: 8px;
  padding-top: 24px;
}

/* Ein Kontrollkaestchen mit erklaerender Beschriftung und daneben drei Knoepfe
   passen in keine Zeile. Das Kaestchen bekommt deshalb immer eine eigene Zeile
   darueber - besser als Knoepfe, die auf zwei Zeilen umbrechen und dabei ihre
   Reihenfolge verlieren. Ein Kaestchen kommt in dieser Leiste ohnehin nur
   zusammen mit .settings-actions vor. */
.settings-footer .toggle-field { flex: 1 1 100%; }

/* Damit die Knopfgruppe in ihrer eigenen Zeile rechts bleibt: sie ist dann
   das einzige Element, und space-between allein wuerde sie nach links legen. */
.settings-footer .settings-actions { margin-left: auto; }

.toggle-field {
  display: flex;
  align-items: center;
  gap: 9px;
  color: var(--text-dim);
  font-size: 0.9rem;
  cursor: pointer;
}

.toggle-field input {
  accent-color: var(--accent);
  width: 16px;
  height: 16px;
}

.settings-submit {
  width: auto;
  min-width: 140px;
  margin-top: 0;
}

.settings-submit:disabled {
  cursor: wait;
  opacity: 0.6;
}

.form-status {
  min-height: 1.4em;
  margin-top: 18px;
  color: var(--text-dim);
  font-size: 0.85rem;
}

.form-status.success { color: var(--success); }
.form-status.error { color: var(--danger); }
.field-hint { display: block; margin-top: 6px; color: var(--text-dim); font-size: 0.75rem; }

/* Nie umbrechen, notfalls seitlich schieben. Eine Reiterleiste, die beim
   Erscheinen eines Zaehlers auf zwei Zeilen geht, verschiebt alles darunter -
   und der Zaehler kommt erst, wenn der Reiter einmal geoeffnet wurde. Der
   Scrollbalken bleibt weg: der angeschnittene Reiter am Rand ist der Hinweis
   und kostet keine Zeile Hoehe. */
.settings-tabs {
  display: flex;
  flex-wrap: nowrap;
  gap: 22px;
  overflow-x: auto;
  scrollbar-width: none;
  border-bottom: 1px solid var(--border);
  margin-bottom: 24px;
}

.settings-tabs::-webkit-scrollbar { display: none; }

.settings-tabs a {
  flex: 0 0 auto;
  white-space: nowrap;
}

/* Zaehler im Reiter: nur die Zahl. Den Sinn traegt das title-Attribut -
   "(195 offen)" waere in drei Sprachen drei verschiedene Laengen, und die
   Leiste ist bei sieben Reitern ohnehin knapp. */
.tab-count {
  display: inline-block;
  min-width: 1.5em;
  padding: 1px 5px;
  border-radius: 9px;
  background: var(--surface-alt);
  color: var(--text-dim);
  font-size: 0.72rem;
  font-variant-numeric: tabular-nums;
  text-align: center;
}

/* Offene Uebersetzungen sind eine Arbeitsliste - die soll auffallen. */
.tab-count.is-open { background: var(--accent-dim); color: var(--text); }

.settings-tabs a {
  padding: 0 2px 11px;
  color: var(--text-dim);
  border-bottom: 2px solid transparent;
}

.settings-tabs a.active {
  color: var(--text);
  border-color: var(--accent);
}

.settings-panel {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 28px;
}

.panel-heading, .form-heading {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 16px;
  margin-bottom: 24px;
}

.panel-heading h3, .form-heading h3 {
  font-size: 1.1rem;
  margin-bottom: 4px;
}

.config-state {
  color: var(--success);
  font-family: 'JetBrains Mono', monospace;
  font-size: 0.75rem;
  white-space: nowrap;
}
.config-state.is-not-configured { color: var(--danger); }

.btn-secondary, .text-button, .icon-button {
  font: inherit;
  cursor: pointer;
}

.btn-secondary {
  background: transparent;
  border: 1px solid var(--accent);
  color: var(--accent);
  border-radius: var(--radius);
  padding: 8px 12px;
}

.target-list { display: flex; flex-direction: column; }

.target-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 18px;
  padding: 16px 0;
  border-bottom: 1px solid var(--border);
}

.target-row:last-child { border-bottom: none; }
.target-main { display: flex; align-items: center; gap: 9px; min-width: 0; }
.target-main strong, .target-meta { display: block; }
.target-meta { color: var(--text-dim); font-size: 0.8rem; margin-top: 2px; }
.target-actions { display: flex; gap: 12px; white-space: nowrap; }
.text-button { background: none; border: 0; color: var(--accent); padding: 2px 0; font-size: 0.8rem; }
.danger-button { color: var(--danger); }
.target-form { border-top: 1px solid var(--border); margin-top: 18px; padding-top: 24px; }
/* Anbieterangaben im FTP-Formular. Als eigener, abgesetzter Abschnitt: sie
   erscheinen nur bei OpenImmo, und ohne Trennlinie sieht das Umschalten des
   Exportformats aus, als tauchten wahllos Felder auf. */
#target-provider { margin: 24px 0 18px; padding-top: 20px; border-top: 1px solid var(--border); }
.provider-intro { margin: 0 0 16px; }
/* Knoepfe in Abschnittskoepfen nicht umbrechen - "+ Neuer Benutzer" und
   "Bestand pruefen" wurden sonst zweizeilig. */
.panel-heading .btn-secondary { white-space: nowrap; }

/* Ergebnis des Export-Probelaufs. Die Zeile ist ein Flex-Container mit
   Name und Aktionen - das Ergebnis soll darunter ueber die ganze Breite
   stehen, deshalb umbrechen und volle Basis. */
.target-row { flex-wrap: wrap; }
/* width statt flex-basis: unter 720px wird .target-row zur Spalte, dort
   waere eine Basis von 100% eine Hoehen- und keine Breitenangabe. */
.target-result { width: 100%; margin-top: 14px; font-size: 0.82rem; }
.result-note { color: var(--text-dim); margin: 0 0 10px; }
.result-warn { color: var(--danger); margin: 0 0 10px; overflow-wrap: anywhere; }
/* Feste 3 Spalten statt auto-fit: es sind immer genau sechs Werte, damit
   gehen 3x2 auf. Bei auto-fit bleibt je nach Breite eine Zelle leer, und
   die faellt als Loch in der Rasterlinie auf. */
.result-facts { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1px; margin: 0 0 12px; background: var(--border); border: 1px solid var(--border); }
.result-facts > div { display: flex; flex-direction: column; gap: 3px; padding: 10px 12px; background: var(--surface); }
.result-facts dt { color: var(--text-dim); font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.05em; }
.result-facts dd { margin: 0; overflow-wrap: anywhere; }
.result-actions { display: flex; flex-wrap: wrap; gap: 14px; margin-bottom: 12px; }
.result-actions a { text-decoration: none; }
.result-actions a:hover { text-decoration: underline; }
.result-xml summary { color: var(--text-dim); cursor: pointer; }
/* Die XML ist breiter als die Spalte - lieber scrollen als die Seite sprengen. */
.result-xml pre { max-height: 320px; margin: 10px 0 0; padding: 12px; overflow: auto; background: var(--surface-alt); border: 1px solid var(--border); font-size: 0.75rem; line-height: 1.5; }
.icon-button { background: none; border: 0; color: var(--text-dim); font-size: 1.4rem; line-height: 1; }
.icon-button:hover { color: var(--text); }

@media (prefers-reduced-motion: reduce) {
  .pulse-dot.ok {
    animation: none;
  }
}

@media (max-width: 640px) {
  main { padding: 20px; }
  .topbar { padding: 16px 20px; }
  .ledger-row { grid-template-columns: 1fr auto; row-gap: 6px; }
  .topbar-actions { gap: 10px; }
  .form-grid { grid-template-columns: 1fr; gap: 0; }
  .settings-footer { align-items: stretch; flex-direction: column; }
  .settings-submit { width: 100%; }
  .result-facts { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .panel-heading, .target-row { align-items: flex-start; flex-direction: column; }
  .target-actions { flex-wrap: wrap; }
  .detail-grid { grid-template-columns: 1fr; }
  .property-view { opacity: 1; }
  .settings-actions { flex-direction: column; }
  .settings-actions .btn-secondary { width: 100%; }
}

/* Suchfeld in der Filterzeile - optisch gleich wie die Selects daneben */
.property-filters input[type="search"] {
  padding: 8px 10px;
  min-width: 240px;
  background: var(--surface-alt);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  color: var(--text);
  font: inherit;
}
.property-filters input[type="search"]::placeholder { color: var(--text-dim); }
.property-filters input[type="search"]:focus-visible,
.property-filters select:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }

/* Blätter-Leiste unter der Immobilienliste */
.pager {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
  margin-top: 18px;
  padding-top: 16px;
  border-top: 1px solid var(--border);
}
.pager-pages { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
.pager-step, .pager-page {
  background: var(--surface-alt);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  color: var(--text);
  font: inherit;
  font-size: 0.82rem;
  padding: 7px 12px;
  cursor: pointer;
}
.pager-page { min-width: 38px; text-align: center; }
.pager-step:hover:not(:disabled), .pager-page:hover:not(.is-current) { border-color: var(--accent-dim); color: var(--accent); }
.pager-step:disabled { opacity: 0.35; cursor: default; }
.pager-page.is-current { background: var(--accent); border-color: var(--accent); color: var(--bg); font-weight: 600; }
.pager-gap { color: var(--text-dim); padding: 0 4px; }

@media (max-width: 720px) {
  .property-filters input[type="search"] { min-width: 0; width: 100%; }
  .pager { justify-content: center; }
}

/* Fehlgeschlagene Importe in der Dateiliste sichtbar machen */
.ledger-row.is-failed { border-left: 2px solid var(--danger); padding-left: 8px; }
.ledger-error { display: block; margin-top: 3px; color: var(--danger); font-size: 0.75rem; white-space: normal; }
.format-tag.tag-failed { background: var(--danger); color: var(--bg); }

/* Zwischenüberschrift innerhalb eines Formulars */
.subform-heading { margin: 0 0 14px; font-family: 'Fraunces', serif; font-size: 1.05rem; font-weight: 500; }
#notify-form { margin-bottom: 34px; padding-bottom: 26px; border-bottom: 1px solid var(--border); }
#notify-form .toggle-field { align-items: flex-start; margin-bottom: 10px; }
#notify-form .toggle-field span { line-height: 1.45; }

/* Passwort vergessen / neu setzen */
.reset-link { display: block; margin-top: 18px; color: var(--accent); font-size: 0.82rem; }
.reset-intro { margin: 0 0 20px; color: var(--text-dim); font-size: 0.85rem; line-height: 1.5; }
.reset-back { display: inline-block; margin-top: 18px; font-size: 0.82rem; }
#forgot-form { margin-top: 18px; padding-top: 18px; border-top: 1px solid var(--border); }

/* Benutzer eines Mandanten */
.user-row { display: grid; grid-template-columns: minmax(0, 1fr) auto auto; gap: 18px; align-items: center; padding: 14px 0; border-bottom: 1px solid var(--border); }
.user-row:last-child { border-bottom: none; }
.user-main { min-width: 0; }
.user-main strong { display: block; overflow-wrap: anywhere; }
.user-meta { display: block; margin-top: 2px; color: var(--text-dim); font-size: 0.8rem; }
.user-actions { display: flex; gap: 12px; white-space: nowrap; }
/* Das Formular steht in der Zeile des Benutzers, ueber die ganze Breite -
   sonst waere beim Tippen nicht sichtbar, um wessen Passwort es geht.
   .user-row ist ein Grid, deshalb reicht grid-column. */
.user-reset { grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: center; gap: 12px; margin-top: 12px; padding: 12px; background: var(--surface-alt); border: 1px solid var(--border); border-radius: var(--radius); }
/* Beschriftung auf eigener Zeile: Adresse, Eingabefeld und zwei Knoepfe
   passen sonst nicht nebeneinander und brechen unschoen um. */
.user-reset label { flex: 1 1 100%; color: var(--text-dim); font-size: 0.78rem; }
.user-reset input { flex: 1 1 220px; min-width: 0; padding: 8px 10px; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); color: var(--text); font: inherit; font-size: 0.86rem; }
.user-reset input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
.role-tag { border: 1px solid var(--border); border-radius: 3px; padding: 3px 8px; color: var(--text-dim); font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.05em; }
.role-tag.is-admin { border-color: var(--accent-dim); color: var(--accent); }

@media (max-width: 720px) {
  .user-row { grid-template-columns: 1fr; gap: 8px; }
  .user-actions { flex-wrap: wrap; }
}

/* Wertuebersetzungen je Exportformat */
.inline-field { display: flex; align-items: center; gap: 9px; color: var(--text-dim); font-size: 0.8rem; white-space: nowrap; }
.inline-field select { padding: 8px 30px 8px 10px; background-color: var(--surface-alt); background-position: right 10px center; border: 1px solid var(--border); border-radius: var(--radius); color: var(--text); font: inherit; }

.translation-field + .translation-field { margin-top: 34px; padding-top: 26px; border-top: 1px solid var(--border); }
.translation-summary { margin: 0 0 16px; color: var(--text-dim); font-size: 0.82rem; }

/* Eine Zeile pro Wertepaar: Quellwert, Pfeil, Zielfeld, Loeschen. Der
   Quellwert darf umbrechen statt abgeschnitten zu werden - Gemeindenamen
   wie "Appiano sulla strada del vino" sind lang und muessen lesbar sein. */
.translation-row { display: grid; grid-template-columns: minmax(0, 1fr) 18px minmax(0, 1fr) auto; gap: 12px; align-items: center; padding: 9px 0; border-bottom: 1px solid var(--border); }
.translation-from { overflow-wrap: anywhere; font-size: 0.86rem; }
.translation-arrow { color: var(--text-dim); text-align: center; }
.translation-to { width: 100%; padding: 8px 10px; background: var(--surface-alt); border: 1px solid var(--border); border-radius: var(--radius); color: var(--text); font: inherit; font-size: 0.86rem; }
.translation-to:focus { outline: 2px solid var(--accent); outline-offset: 1px; }
.translation-to::placeholder { color: var(--warning); }

/* Offene Eintraege sind die Arbeitsliste - sie sollen ins Auge fallen,
   ohne wie ein Fehler auszusehen. */
.translation-row.is-open .translation-to { border-color: var(--warning); }

.translation-add { display: grid; grid-template-columns: minmax(0, 1fr) 18px minmax(0, 1fr) auto; gap: 12px; align-items: center; margin-top: 18px; }
.translation-add input { padding: 8px 10px; background: var(--surface-alt); border: 1px solid var(--border); border-radius: var(--radius); color: var(--text); font: inherit; font-size: 0.86rem; }
.translation-add input:focus { outline: 2px solid var(--accent); outline-offset: 1px; }

@media (max-width: 720px) {
  /* Pfeilspalte weglassen und untereinander stapeln - vier Spalten sind
     auf einem Telefon nicht mehr lesbar. */
  .translation-row, .translation-add { grid-template-columns: 1fr; gap: 6px; }
  .translation-arrow { display: none; }
}

/* Aktive Seite in der gemeinsamen Kopfzeile markieren */
.nav-link.is-current { color: var(--accent); font-weight: 600; }

/* "Alle anzeigen" neben einer Abschnittsüberschrift.
   Bewusst vollständig gesetzt statt geerbt: der Link sitzt in einem h2,
   das je nach Abschnitt Versalien und Sperrsatz vorgibt - ohne die
   Rücksetzer sähe derselbe Link an zwei Stellen unterschiedlich aus. */
.section-link {
  margin-left: 12px;
  font-family: 'Inter', sans-serif;
  font-size: 0.78rem;
  font-weight: 500;
  text-transform: none;
  letter-spacing: normal;
  color: var(--accent);
  text-decoration: none;
}
.section-link:hover { text-decoration: underline; }

/* Aktivitätsprotokoll auf eigener Seite */
.activity-row {
  display: grid;
  grid-template-columns: 165px 1fr;
  gap: 16px;
  align-items: baseline;
  padding: 12px 4px;
  border-bottom: 1px solid var(--border);
  font-size: 0.85rem;
}
.activity-row.is-failed { border-left: 2px solid var(--danger); padding-left: 8px; }
.activity-row.is-failed strong { color: var(--danger); }
.activity-when { color: var(--text-dim); font-size: 0.78rem; white-space: nowrap; }
.activity-what { display: flex; flex-direction: column; gap: 3px; }
.activity-detail { color: var(--text-dim); font-size: 0.8rem; word-break: break-word; }

@media (max-width: 720px) {
  .activity-row { grid-template-columns: 1fr; gap: 4px; }
}

/* ---------------------------------------------------------------------------
 * Mobil
 *
 * Die Seite war für den Schreibtisch gebaut: Kopfzeile, Reiterreihe und die
 * beiden Immobilienlisten setzen alle auf eine Zeilenbreite, die es auf einem
 * Telefon nicht gibt. Alles, was sich unterwegs ändert, steht bewusst hier
 * am Ende und an EINER Stelle - so sieht man beim Ändern einer Grundregel
 * sofort, ob es mobil eine Ausnahme dazu gibt.
 *
 * 720px trennt Telefon und hochkant gehaltenes Tablet von allem Größeren,
 * 480px fängt die schmalen Telefone ab. Die älteren Blöcke bei 640px und
 * 720px weiter oben gelten weiter; wo sich etwas widerspricht, gewinnt
 * dieser Abschnitt, weil er später kommt.
 * ------------------------------------------------------------------------- */

@media (max-width: 720px) {

  /* ---- Kopfzeile: Marke und Hamburger in einer Zeile ----
     position: relative, weil das Menü darunter absolut positioniert hängt. */
  .topbar { position: relative; gap: 12px; padding: 12px 16px; }
  /* Die Marke nimmt den Rest der Zeile und darf innen umbrechen, wenn der
     Mandantenname lang ist - min-width: 0 erlaubt ihr, kleiner als ihr Inhalt
     zu werden, sonst schiebt sie den Knopf aus dem Bild. */
  .topbar .brand { flex: 1 1 auto; min-width: 0; flex-wrap: wrap; }
  .nav-toggle { display: block; }
  /* Die Bildmarke weglassen: neben Mandantenname und Hamburger ist sie das
     Element, das am wenigsten sagt - der Schriftzug steht ja daneben. */
  .brand-mark { display: none; }

  /* Das Menü legt sich ÜBER den Seiteninhalt statt ihn nach unten zu
     schieben: beim Auf- und Zuklappen soll die Seite nicht springen.
     Geschlossen ist es display:none und damit auch aus der Tabreihenfolge -
     ein Menü, in das man hineintabbt, ohne es zu sehen, ist eine Falle. */
  .topbar-actions {
    display: none;
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    z-index: 20;
    flex-direction: column;
    align-items: stretch;
    gap: 0;
    padding: 4px 16px 14px;
    background: var(--surface);
    border-bottom: 1px solid var(--border);
    box-shadow: var(--menu-shadow);
  }

  .topbar-actions.is-open { display: flex; }

  /* Eine Zeile pro Ziel, über die ganze Breite antippbar - 44px hoch ist das
     Maß, unter dem ein Daumen daneben trifft. */
  .nav-link {
    display: block;
    padding: 13px 0;
    border-bottom: 1px solid var(--border);
  }

  .nav-link:last-of-type { border-bottom: none; }

  /* Im aufgeklappten Menue steht alles untereinander in voller Breite - ein
     34px-Quadrat mittendrin waere weder zu treffen noch als Zeile zu lesen.
     Deshalb hier mit Beschriftung aus dem title-Attribut und 44px hoch. */
  .topbar-actions .theme-btn {
    width: 100%;
    height: auto;
    justify-content: flex-start;
    gap: 10px;
    padding: 13px 0;
    border-bottom: 1px solid var(--border);
    font-family: inherit;
    font-size: 1rem;
    color: var(--text);
  }

  .topbar-actions .theme-btn::after { content: attr(title); }

  .topbar-actions .logout-btn { width: 100%; margin-top: 12px; padding: 11px; }

  /* ---- Reiterreihe der Einstellungen ----
     Seitlich schiebbar ist sie schon in der Grundregel; hier wird nur der
     Abstand enger, damit mehr Reiter gleichzeitig zu sehen sind. */
  .settings-tabs { gap: 18px; }

  /* ---- Flächen und Überschriften ---- */
  main { padding: 20px 16px; }
  .settings-panel { padding: 18px; }
  .settings-header h2 { font-size: 1.7rem; }
  .detail-hero { flex-wrap: wrap; gap: 12px; }
  .detail-hero h2 { font-size: 1.6rem; }
  .stat-card .value { font-size: 1.6rem; }
  /* Bei mehrzeiligen Beschriftungen gehört das Kästchen an den Anfang der
     ersten Zeile, nicht in die Mitte des Absatzes. */
  .toggle-field { align-items: flex-start; }
  .toggle-field input { margin-top: 2px; }

  /* Filterzeile und Kurzuebersicht stapeln - beide standen bisher erst ab
     640px untereinander, was zwischen 641 und 720px zu sechs sehr engen
     Spalten bzw. einer gequetschten Filterzeile fuehrte. */
  /* Zugeklappt starten: gestapelt nimmt die Filterzeile fast eine Bildhöhe
     ein, und man scrollt an ihr vorbei, bevor die erste Zeile zu sehen ist.
     Welche Filter greifen, steht ohnehin in der Zeile über der Liste. */
  .filter-toggle { display: inline-flex; }
  .property-filters { display: none; align-items: stretch; flex-direction: column; }
  .property-filters.is-open { display: flex; }
  .property-filters label { justify-content: space-between; }
  .detail-summary { grid-template-columns: repeat(2, 1fr); }

  /* ---- Immobilienlisten als Karten statt als Tabelle ----
     Beide Listen (Dashboard und Immobilienseite) tragen dieselben
     Zellenklassen, deshalb genügt ein Regelsatz.

     Die Spaltenbreiten stehen in der Immobilienliste als Inline-Style in
     jeder Zeile - properties.js setzt sie je nach Anzahl der Exportziele.
     Inline-Styles ließen sich hier nur mit !important überschreiben;
     "display: flex" macht sie stattdessen einfach wirkungslos. */
  .property-table, .property-directory { overflow-x: visible; }
  .property-directory-scroll { min-width: 0; }
  .property-table-head, .directory-head { display: none; }
  .property-table-row, .directory-row {
    position: relative;
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: 4px 10px;
    min-width: 0;
    /* Rechts Platz für das Auge, das absolut positioniert darüber liegt. */
    padding: 14px 30px 14px 2px;
  }
  .directory-object, .directory-location { flex: 1 1 100%; }
  /* Die Exporthaken bekommen eine eigene Zeile - zwischen den Zahlen stehend
     sieht man nicht, wo die Angaben aufhören und die Schalter anfangen. */
  .directory-break { display: block; flex: 1 1 100%; height: 2px; }
  .directory-fact { color: var(--text-dim); font-size: 0.8rem; }
  /* Punkt zwischen den Zahlen, die am Schreibtisch eigene Spalten sind. */
  .directory-fact + .directory-fact::before { content: "· "; }
  /* Das Auge bleibt oben rechts, statt hinter den Exporthaken zu landen. */
  .property-view { position: absolute; top: 12px; right: 0; opacity: 1; }
  /* Ohne Kopfzeile wären die Haken namenlos - der Name kommt aus data-label,
     das properties.js mitgibt. */
  .target-toggle-cell {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    color: var(--text-dim);
    font-size: 0.78rem;
    text-align: left;
  }
  .target-toggle-cell::after { content: attr(data-label); }

}

/* ---------------------------------------------------------------------------
 * Nur mit dem Finger
 *
 * Diese Regeln machen Dinge GRÖSSER. Sie hängen deshalb nicht an der Breite,
 * sondern an pointer: coarse - also daran, dass wirklich ein Finger tippt.
 * Ein halbiertes Laptop-Fenster ist schmal, hat aber eine Maus: dort wären
 * 16px-Felder und fingerbreite Knöpfe einfach zu grosse Schrift.
 *
 * Der Grund für die 16px steht nur hier: unter 16px zoomt iOS Safari beim
 * Antippen eines Feldes in die Seite hinein und kommt nicht mehr heraus. Das
 * ist ein Touch-Problem und hat mit der Fensterbreite nichts zu tun.
 * ------------------------------------------------------------------------- */

@media (max-width: 720px) and (pointer: coarse) {
  .field input, .field select,
  .property-filters select, .property-filters input[type="search"],
  .translation-to, .translation-add input, .user-reset input { font-size: 16px; }

  .pager-step, .pager-page { padding: 10px 14px; }
  .target-actions .text-button, .user-actions .text-button { padding: 8px 0; }
  .target-toggle-cell input { width: 20px; height: 20px; }
}

@media (max-width: 480px) {
  /* Die eigene Adresse steht auch unter "Mein Konto"; in der Kopfzeile ist
     der Mandant die Angabe, die man wirklich braucht. */
  .topbar .user-email { display: none; }
  main { padding: 18px 14px; }
  .settings-panel { padding: 16px 14px; }
  .settings-header h2 { font-size: 1.5rem; }
  .detail-hero h2 { font-size: 1.4rem; }
  .result-facts { grid-template-columns: 1fr; }
}
