/*
 * app.css — konsolidierte Stylesheets (vormals app.css + map.css).
 *
 * Reihenfolge: zuerst die Karteneditor-Regeln (ehem. map.css), dann die
 * Backend-Regeln (ehem. app.css) — entspricht der frueheren Ladereihenfolge in
 * default.php (map vor app), damit das Backend bei Ueberlappungen weiterhin die
 * app-Regeln gewinnen laesst.
 *
 * Layout-Konflikte: Backend-Regeln (.app-shell/.main-area/.left-sidebar/
 * .r-panel/kbd/.pending-downgrade-banner) sind auf `.app-backend` gescoped
 * (Klasse am <body> des default-Layouts). Der Karteneditor (kein .app-backend)
 * behaelt die ungescopten 3-Spalten-Regeln.
 */

.hidden { display: none !important; }

/* Flaggen-Emoji-Webfont: liefert nur die Regional-Indicator-Glyphen (Länder-
   flaggen). Chrome/Edge unter Windows haben keine Flaggen im System-Emoji-Font
   und zeigen sonst nur die Buchstaben (DE/EN). unicode-range beschränkt die
   Schrift strikt auf die Flaggen-Codepoints, sie beeinflusst keinen anderen Text. */
@font-face {
  font-family: 'Twemoji Country Flags';
  src: url('../font/twemoji-country-flags.woff2') format('woff2');
  unicode-range: U+1F1E6-1F1FF, U+1F3F4, U+E0020-E007F;
  font-display: swap;
}

/* ── DESIGN TOKENS (Wieseneditor Palette) ────────────────────────────────── */
:root {
  --bg:           #f2ede3;
  --ink:          #2c2416;
  --ink-muted:    rgba(44, 36, 22, 0.45);
  --ink-faint:    rgba(44, 36, 22, 0.2);
  --green:        #3a7d44;
  --green-soft:   rgba(58, 125, 68, 0.1);
  --green-mid:    rgba(58, 125, 68, 0.22);
  --blue:         #1e40af;
  --blue-soft:    rgba(30, 64, 175, 0.08);
  --blue-mid:     rgba(30, 64, 175, 0.25);
  --amber:        #b07c1a;
  --red:          #c0392b;
  --red-soft:     rgba(192, 57, 43, 0.08);
  --border:       rgba(160, 140, 100, 0.28);
  --border-strong:rgba(160, 140, 100, 0.45);
  --panel:        rgba(242, 237, 227, 0.98);
  --panel-2:      rgba(235, 228, 214, 0.6);
  --shadow:       0 2px 16px rgba(60, 40, 10, 0.1);
  --shadow-lg:    0 6px 32px rgba(60, 40, 10, 0.13);
  --trans:        cubic-bezier(0.32, 0.72, 0, 1);
  --radius:       18px;
  --radius-sm:    10px;
  --sidebar-left: 312px;
  --nav-rail:     50px;
  --sidebar-right:360px;
}

/* ── RESET ───────────────────────────────────────────────────────────────── */
*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }

html, body {
  width: 100%; height: 100dvh; overflow: hidden;
  background: var(--bg);
  font-family: 'Twemoji Country Flags', 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  color: var(--ink);
  font-size: 16px;
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
}

/* ── LAYOUT ──────────────────────────────────────────────────────────────── */
.app-shell {
  display: grid;
  grid-template-columns: var(--sidebar-left) minmax(0, 1fr) var(--sidebar-right);
  gap: 12px;
  height: 100dvh;
  padding: 12px;
  transition: grid-template-columns 0.2s ease;
}
.app-shell.left-collapsed {
  /* !important nötig, weil theme-red.css `.app-shell.theme-red` mit gleicher
     Specificity (0,2,0) `--sidebar-left: 322px` setzt und in der Lade-
     Reihenfolge SPÄTER kommt — würde sonst gewinnen und die Sidebar
     bliebe trotz Collapsed-Klasse breit. */
  --sidebar-left: var(--nav-rail) !important;
}
.app-shell.left-collapsed .objects-panel {
  display: none;
}

/* Bei schmalen Viewports (z.B. iPad in Landscape mit ~1180px innerhalb des
   Layouts knapp): rechte Leiste mit Hilfetext / Read-/Edit-Panel ausblenden,
   solange nichts selektiert ist. JS toggelt `right-collapsed` je nachdem, ob
   das Hilfe-Panel oder ein konkretes Panel (Read/Edit/Create/Draw) aktiv ist.
   Über 1190px greift die Media-Query nicht — Layout bleibt wie zuvor. */
@media (max-width: 1189px) {
  .app-shell.right-collapsed {
    --sidebar-right: 0px;
  }
  .app-shell.right-collapsed .right-sidebar {
    display: none;
  }
}

.left-sidebar-collapse {
  position: absolute;
  top: 50%;
  right: -11px;
  transform: translateY(-50%);
  width: 22px;
  height: 48px;
  border-radius: 11px;
  background: var(--panel);
  border: 2px solid var(--blue);
  color: var(--blue);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  z-index: 50;
  box-shadow: var(--shadow);
  transition: background .14s;
  padding: 0;
}
.left-sidebar-collapse:hover {
  background: var(--panel-2);
}
.left-sidebar-collapse svg {
  width: 16px;
  height: 16px;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
  transition: transform 0.2s ease;
}
.app-shell.left-collapsed .left-sidebar-collapse svg {
  transform: rotate(180deg);
}

/* ── SIDEBARS ────────────────────────────────────────────────────────────── */
.sidebar {
  display: flex;
  flex-direction: column;
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  overflow: hidden;
  min-height: 0;
}

/* ── LEFT SIDEBAR ────────────────────────────────────────────────────────── */
.left-sidebar {
  position: relative;
  z-index: 40;
  display: grid;
  grid-template-columns: var(--nav-rail) 1fr;
  min-height: 0;
  overflow: visible;
  border-radius: var(--radius) 0 0 var(--radius);
}

.nav-rail {
  position: relative;
  z-index: 10;
  display: flex;
  flex-direction: column;
  gap: 6px;
  /* Padding minimal horizontal, damit das Item bei nur 50px Rail-Breite
     trotzdem groessere Icons aufnehmen kann als das urspruengliche 40px-
     Item mit 8px-Padding. */
  padding: 10px 3px;
  border-right: 1px solid var(--border);
  /* Minimal dunkler als var(--panel-2) — Rail soll sich vom Hauptpanel
     dezent abheben ohne harten Kontrast. */
  background: rgba(228, 220, 206, 0.85);
  align-items: center;
  border-radius: var(--radius) 0 0 var(--radius);
}

.nav-item-wrap {
  position: relative;
}
.nav-item {
  width: 40px; height: 40px;
  display: flex; align-items: center; justify-content: center;
  border-radius: var(--radius-sm);
  border: 1px solid transparent;
  background: transparent;
  color: var(--ink-muted);
  cursor: pointer;
  text-decoration: none;
  transition: background .14s, color .14s, border-color .14s;
  flex-shrink: 0;
}
.nav-item-spacer { flex: 1; }
/* Zarte Trennlinie zwischen Account- und Logout-Button. Schmal (~70 % der
   Rail-Innenbreite), dezent in --border, leichtes vertikales Padding damit
   sie nicht direkt an den Buttons klebt. */
.nav-item-divider {
  width: 70%;
  height: 1px;
  background: var(--border);
  margin: 6px auto;
  flex-shrink: 0;
}
.nav-item svg {
  width: 26px; height: 26px;
  stroke: currentColor; fill: none;
  stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round;
}
/* OSM-Import-Eintrag: monochrome OpenStreetMap-Lupe (gleicher Stroke-Stil wie
   die uebrigen Rail-Icons) mit "OSM"-Label darunter. Vertikaler Stack statt
   einzelnem Icon; Icon und Label erben currentColor und faerben sich daher bei
   Hover/Active wie die uebrigen Eintraege gruen. */
.nav-osm {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 1px;
  line-height: 1;
}
/* Echtes OSM-Logo als CSS-Maske: das (schwarze) Quell-SVG dient nur als Form,
   die Flaeche wird ueber background-color in currentColor gefuellt — so faerbt
   sich das Logo bei Hover/Active automatisch gruen wie die anderen Icons.
   Etwas kleiner als die 26px-Standard-Icons, damit Logo + Label in den 40px
   hohen Eintrag passen. */
.nav-osm .nav-osm-mark {
  width: 22px; height: 22px;
  background-color: currentColor;
  -webkit-mask: url('../img/osm-logo.svg') center / contain no-repeat;
          mask: url('../img/osm-logo.svg') center / contain no-repeat;
}
.nav-osm-label {
  font-size: 7px;
  font-weight: 700;
  letter-spacing: .05em;
}
/* Account-Avatar: Initialen-Kreis statt Personen-Icon. Erbt currentColor wie
   die uebrigen Icons, damit die Hover/Active-Faerbung (--ink-muted -> --green)
   automatisch greift; transparenter Fill passt zum Outline-Look der Nav. */
.nav-avatar {
  width: 28px; height: 28px;
  display: flex; align-items: center; justify-content: center;
  border: 1.6px solid currentColor;
  border-radius: 50%;
  font-size: 11px; font-weight: 700;
  letter-spacing: .03em; line-height: 1;
}
.nav-item:hover       { background: var(--green-soft); color: var(--green); border-color: var(--green-mid); }
.nav-item.is-active   { background: var(--green-soft); color: var(--green); border-color: var(--green-mid); }

/* Bei abgelaufenem Trial gesperrte Rail-Eintraege: ausgegraut und nicht
   anklickbar (als <span> gerendert). Hover hebt sie nicht hervor; das Popout
   bleibt ueber den .nav-item-wrap weiterhin sichtbar. */
.nav-item.is-disabled        { opacity: .4; cursor: not-allowed; }
.nav-item.is-disabled:hover  { background: transparent; color: var(--ink-muted); border-color: transparent; }

/* ── Nav Popout ── */
.nav-popout {
  position: fixed;
  left: 0;
  width: 480px;
  background: #f0e8fa;
  border: 1px solid #c4a3d9;
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow-lg);
  padding: 10px 12px;
  pointer-events: none;
  opacity: 0;
  transform: translateX(-4px);
  transition: opacity .15s, transform .15s;
  z-index: 9999;
}
.nav-popout::before {
  content: '';
  position: absolute;
  left: -6px; top: 14px;
  transform: rotate(45deg);
  width: 10px; height: 10px;
  background: #f0e8fa;
  border-left: 1px solid #c4a3d9;
  border-bottom: 1px solid #c4a3d9;
}
.nav-item-wrap:hover .nav-popout,
.nav-popout.is-visible {
  opacity: 1;
  pointer-events: auto;
  transform: translateX(0);
}
.nav-popout-title {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: .95rem; font-weight: 600; color: #5a2d7a;
  margin-bottom: 4px;
}
.nav-popout-body {
  font-size: .82rem; color: #6b4585;
  line-height: 1.4;
}
.nav-popout-body p { margin: 0 0 8px; }
.nav-popout-video {
  position: relative; width: 100%;
  aspect-ratio: 16/9; border-radius: 6px;
  overflow: hidden; background: #000;
}
.nav-popout-video iframe {
  position: absolute; inset: 0;
  width: 100%; height: 100%; border: none;
}
.nav-popout-footer {
  margin-top: 6px; padding-top: 6px;
  border-top: 1px solid #c4a3d9;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 9px; color: #9a7ab5;
  letter-spacing: .06em; text-transform: uppercase;
}

/* ── HELP-System (Tooltip + Popout) ─────────────────────────────────────── */
/* Singleton-Elemente am Body, position:fixed → unabhaengig von Vorfahren-
   overflow:hidden. JS positioniert beim Hover/Focus, opacity-Transition
   fuer smoothen Auftritt. */

/* Tooltip — kompakte dunkle Bubble (Pendant zur fruehen .has-tooltip::after).
   Nur body-Inhalt, kein title/footer. */
.help-tooltip {
  position: fixed;
  display: none;
  max-width: 280px;
  background: var(--ink, #1f2937);
  color: #fff;
  padding: 8px 12px;
  border-radius: var(--radius-sm);
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 11px;
  line-height: 1.45;
  font-weight: 500;
  box-shadow: 0 6px 18px rgba(0, 0, 0, 0.18);
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.12s ease;
  z-index: 9999;
}
.help-tooltip.is-visible {
  display: block;
  opacity: 1;
}

/* Popout — groesseres Lila-Panel (Pendant zur .nav-popout, jetzt
   wiederverwendbar via data-help). Drei Slots, leere werden via
   .is-empty komplett ausgeblendet (display:none), damit kein Whitespace
   bleibt wenn z.B. footer fehlt. */
.help-popout {
  position: fixed;
  display: none;
  width: 360px;
  max-width: calc(100vw - 24px);
  /* Bordeaux-Schema passend zu Theme-Red. Wash auf cremig-warmem Rosé,
     Bordeaux nur in Border + Akzenten — Body bleibt dunkler Warmton für
     gute Lesbarkeit (statt full-bordeaux-text). */
  background: #fdf3f2;
  border: 2px solid rgba(168, 58, 54, 0.55);
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow-lg);
  padding: 10px 12px;
  pointer-events: none;
  opacity: 0;
  transition: opacity 0.15s ease;
  z-index: 9999;
}
.help-popout.is-visible {
  display: block;
  opacity: 1;
}
.help-popout-title {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: .95rem; font-weight: 600; color: #a83a36;
  margin-bottom: 4px;
}
.help-popout-title.is-empty { display: none; }
.help-popout-body {
  font-size: .85rem; color: #3a1f1d;
  line-height: 1.45;
}
/* Sichtbare Leerzeilen zwischen Absätzen — Browser-Default kollabiert sonst
   die top/bottom-margins so eng, dass mehrere <p> wie zusammengeklebt wirken. */
.help-popout-body p { margin: 0 0 0.7rem 0; }
.help-popout-body p:last-child { margin-bottom: 0; }
.help-popout-body.is-empty { display: none; }
.help-popout-footer {
  margin-top: 6px; padding-top: 6px;
  border-top: 1px solid rgba(168, 58, 54, 0.25);
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 9px; color: rgba(168, 58, 54, 0.7);
  letter-spacing: .06em; text-transform: uppercase;
}
.help-popout-footer.is-empty { display: none; }

/* Fragezeichen-Icon das beim Hover den Help-Tooltip anzeigt. Wird neben
   Form-Labels (font-size 9.5px) platziert (siehe formGroup() / helpIcon()
   in form-helpers.js). Klein gehalten, damit es zur Label-Schrift passt.
   Klasse heisst .help-tip-icon (nicht .help-icon — Letzteres ist schon
   fuer eine andere 32px-Komponente in der Help-Section vergeben). */
.help-tip-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  vertical-align: middle;
  margin-left: 3px;
  width: 13px;
  height: 13px;
  border-radius: 50%;
  color: var(--ink-muted);
  background: transparent;
  cursor: help;
  transition: color 0.12s, background 0.12s;
}
.help-tip-icon:hover,
.help-tip-icon:focus {
  color: #5a2d7a;
  background: #f0e8fa;
  outline: none;
}
.help-tip-icon svg {
  display: block;
  width: 13px;
  height: 13px;
}

/* Print-Wizard: deutlich größere Help-Icons (+~40%) — die print-checkbox-
 * Schrift ist .9rem (deutlich größer als die 9.5px-Form-Labels), 9×9px-
 * Standard-Icons wirken da verloren. */
.print-checkbox .help-tip-icon,
.print-checkbox .help-tip-icon svg {
  width: 13px;
  height: 13px;
}

/* ── OBJECTS PANEL ───────────────────────────────────────────────────────── */
.objects-panel {
  display: flex; flex-direction: column;
  padding: 14px 14px 0;
  min-height: 0; overflow: hidden;
}
.objects-panel > .panel-header {
  margin-top: 6px;
}

.panel-header {
  display: flex; align-items: baseline; gap: 8px;
  margin-bottom: 10px; flex-shrink: 0;
}
.r-panel-header-fixed {
  align-items: center;
  min-height: 52px;
}
.btn-deselect {
  margin-left: auto; flex-shrink: 0;
  height: 30px; padding: 0 10px; font-size: 11px;
}
/* Batch-Einstieg im Read-Panel-Header: rechtsbündig, oben auf der Eyebrow-Zeile,
   kompakt + abgesetzt von den Aktions-Buttons (Bearbeiten/Duplizieren/Löschen). */
#batchFromObjBtn {
  margin-left: auto;
  align-self: flex-start;
  flex-shrink: 0;
  height: 30px;
  padding: 0 10px;
  font-size: 11px;
  white-space: nowrap;
}
.panel-title {
  font-size: 1.15rem; font-weight: 600;
  letter-spacing: -.01em; color: var(--ink);
}
.meta, .hint {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 10px; color: var(--ink-muted);
  letter-spacing: .04em;
}

.search-wrap {
  position: relative; flex-shrink: 0; margin-bottom: 10px;
}
.search-input {
  width: 100%;
  padding: 7px 28px 7px 10px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: rgba(255, 255, 255, 0.5);
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 11px; color: var(--ink);
  outline: none;
  transition: border-color .14s, box-shadow .14s;
}
.search-input::placeholder { color: var(--ink-muted); }
.search-input:focus {
  border-color: var(--green);
  box-shadow: 0 0 0 3px var(--green-soft);
}
.search-clear {
  position: absolute; right: 4px; top: 50%; transform: translateY(-50%);
  width: 24px; height: 24px; padding: 0;
  display: flex; align-items: center; justify-content: center;
  border: none; border-radius: 5px; background: transparent;
  color: var(--ink-muted); cursor: pointer;
  transition: color .12s, background .12s;
}
.search-clear:hover { color: var(--ink); background: rgba(160,140,100,.15); }
.search-clear svg {
  width: 12px; height: 12px;
  stroke: currentColor; fill: none;
  stroke-width: 2.5; stroke-linecap: round;
  pointer-events: none;
}

.object-list {
  flex: 1; overflow-y: auto; overflow-x: hidden;
  padding-bottom: 12px;
  scrollbar-width: thin;
  scrollbar-color: var(--border) transparent;
}

.object-group-header {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding: 14px 8px 10px;
  border-bottom: 1px solid var(--border);
  margin-bottom: 0;
  width: 100%; text-align: left;
  background: var(--bg); border-top: none; border-left: none; border-right: none;
  position: sticky; z-index: 5;
  cursor: default;
  transition: background .15s, padding .15s, opacity .15s;
  border-radius: 0;
}
.object-group-header.stuck-away {
  border-bottom-color: transparent;
  box-shadow: 0 1px 0 0 var(--bg);
  color: var(--ink-muted);
}
.object-group-header.stuck-away .group-label,
.object-group-header.is-collapsed .group-label { opacity: 0.45; cursor: pointer; }
.object-group-header.stuck-away .group-header-right,
.object-group-header.is-collapsed .group-header-right { opacity: 0.3; }

.group-header-right {
  display: flex; align-items: center; gap: 16px;
}
.group-chevron {
  width: 28px; height: 28px;
  stroke: currentColor; fill: none;
  stroke-width: 2.5; stroke-linecap: round; stroke-linejoin: round;
  color: var(--ink-muted);
  transition: transform .2s;
  flex-shrink: 0;
  cursor: pointer;
  padding: 4px;
  border-radius: var(--radius-sm);
}
.group-chevron:hover { background: rgba(0,0,0,.06); }
.group-chevron.collapsed { transform: rotate(-90deg); }

.group-visibility-btn {
  display: flex; align-items: center; justify-content: center;
  width: 28px; height: 28px;
  padding: 4px; border: none; background: none;
  color: var(--ink-muted); cursor: pointer;
  border-radius: var(--radius-sm);
  transition: color .15s, background .15s;
}
.group-visibility-btn:hover { background: rgba(0,0,0,.06); color: var(--ink); }
.group-visibility-btn svg { width: 20px; height: 20px; }
.group-visibility-btn .eye-closed { display: none; }
.group-visibility-btn.hidden-state .eye-open { display: none; }
.group-visibility-btn.hidden-state .eye-closed { display: block; }
.group-visibility-btn.hidden-state { color: var(--red); opacity: 0.7; }
.group-label-btn {
  display: flex; align-items: center; justify-content: center;
  width: 28px; height: 28px; padding: 0; border: none; background: none;
  color: var(--ink-muted); cursor: pointer; border-radius: var(--radius-sm);
  font: 600 10px/1 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; letter-spacing: .03em;
  transition: color .15s, background .15s, opacity .15s;
  opacity: 0.45;
}
.group-label-btn:hover { background: rgba(0,0,0,.06); color: var(--ink); }
.group-label-btn.is-on { opacity: 1; color: var(--ink); }

.object-group-list { display: flex; flex-direction: column; }
.object-group-list.collapsed { display: none; }
.group-label {
  display: flex; align-items: center; gap: 8px; flex: 1;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 1.3rem; font-weight: 600;
  letter-spacing: -.01em; text-transform: none;
  color: var(--ink);
}
.group-dot {
  width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0;
}
.group-count {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 9px; color: var(--ink-muted);
}

.object-item {
  display: flex; align-items: center; gap: 8px;
  width: 100%; text-align: left;
  padding: 8px 8px;
  border: none; border-radius: var(--radius-sm);
  background: transparent; color: var(--ink);
  cursor: pointer;
  transition: background .12s;
}
.object-item {
  cursor: pointer;
}
.object-item:hover  { background: rgba(160, 140, 100, 0.08); }
.object-item.active { background: var(--green-soft); border: 2px solid var(--green); padding: 6px; }

.layer-toggle-label-group {
  display: inline-flex; align-items: center; gap: 8px;
}
.layer-toggle-badge {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 24px; height: 14px;
  padding: 0 5px;
  border-radius: 7px;
  background: #e67e22; color: #fff;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9px; font-weight: 500;
  letter-spacing: 0.02em;
}

.object-zoom-btn {
  flex-shrink: 0;
  width: 26px; height: 26px; padding: 0;
  display: flex; align-items: center; justify-content: center;
  border: 1px solid transparent; border-radius: 6px;
  background: transparent; color: var(--ink-muted);
  cursor: pointer; transition: background .12s, color .12s, border-color .12s;
  margin-left: auto;
}
.object-zoom-btn:hover {
  background: var(--green-soft); color: var(--green); border-color: var(--green-mid);
}
.object-zoom-btn svg {
  width: 13px; height: 13px;
  stroke: currentColor; fill: none;
  stroke-width: 2; stroke-linecap: round; stroke-linejoin: round;
  pointer-events: none;
}

.object-list.is-locked { pointer-events: none; }
.object-list.is-locked .object-item {
  opacity: 0.38;
  cursor: not-allowed;
  pointer-events: auto;
}
.object-list.is-locked .object-item:hover { background: transparent; }
.object-item-dot {
  width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0;
}
.object-item-info { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.object-item-name {
  font-size: .88rem; font-weight: 400;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
  word-break: break-word;
  line-height: 1.3;
  color: var(--ink);
}
.object-item-sub {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9.5px;
  color: var(--ink-muted);
}
.object-no-geo {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9px;
  color: var(--amber); margin-top: 1px;
}

.empty-group {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 10px;
  color: var(--ink-muted); padding: 8px 8px; font-style: italic;
}

/* Statische Gruppe (Gestaltungs-Tab: grass/asphalt/gravel/water) — nicht klappbar. */
.object-group-header--static { cursor: default; }
.object-group-header--static .group-label { cursor: default; opacity: 1; }

/* Drag-Handle (SortableJS) in sortierbaren Items */
.drag-handle {
  display: flex; align-items: center; justify-content: center;
  width: 18px; height: 24px;
  color: var(--ink-muted);
  cursor: grab;
  opacity: 0.4;
  flex-shrink: 0;
  transition: opacity .12s, color .12s;
}
.drag-handle:hover { opacity: 1; color: var(--ink); }
.drag-handle:active { cursor: grabbing; }
.object-item--sortable:hover .drag-handle { opacity: 0.75; }

/* SortableJS Ghost (Original-Platz während Drag) */
.sortable-ghost {
  opacity: 0.35;
  background: var(--green-soft) !important;
  border: 1px dashed var(--green-mid);
}

/* ── MAIN AREA ───────────────────────────────────────────────────────────── */
.main-area {
  display: grid;
  grid-template-rows: auto 1fr;
  gap: 12px;
  min-height: 0;
}
/* Mit anstehendem Downgrade-Banner: drei Reihen (Banner + Topbar + Map),
   damit die Map-Shell weiterhin den Rest der Höhe füllt (1fr). */
.main-area:has(> .pending-downgrade-banner) {
  grid-template-rows: auto auto 1fr;
}

.topbar {
  position: relative; /* Anker für das mittig positionierte „Sammel-Link"-Tool */
  display: flex; align-items: center; justify-content: flex-start; gap: 10px;
  padding: 0 14px;
  min-height: 54px;
  height: 54px;
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  flex-wrap: nowrap;
  overflow: hidden;
}
/* „Sammel-Link"-Tool exakt mittig in der Topbar (unabhängig von links/rechts). */
.topbar-center-tool {
  position: absolute;
  left: 50%; top: 50%;
  transform: translate(-50%, -50%);
  display: flex; align-items: center; gap: 6px;
  white-space: nowrap;
}
.topbar-center-tool.hidden { display: none; }

/* ── Edge length & angle labels ── */
.edge-label {
  background: rgba(44, 36, 22, .45);
  color: #fff;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 10px;
  padding: 2px 6px;
  border-radius: 4px;
  white-space: nowrap;
  pointer-events: none;
}
/* ── New object type chooser ── */
.new-object-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
  gap: 10px;
  padding: 12px 18px;
}
.new-object-card {
  display: flex; flex-direction: column; align-items: center; gap: 8px;
  padding: 18px 12px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--panel);
  cursor: pointer;
  transition: border-color .12s, box-shadow .12s, background .12s;
  text-align: center;
}
.new-object-card:hover {
  border-color: var(--green-mid);
  box-shadow: 0 2px 8px rgba(0,0,0,.08);
  background: var(--green-soft);
}
.new-object-card svg { width: 32px; height: 32px; stroke: var(--ink-muted); fill: none; stroke-width: 1.5; stroke-linecap: round; }
.new-object-card:hover svg { stroke: var(--green); }
.new-object-card-label {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: .92rem; font-weight: 600; color: var(--ink);
}
.new-object-card-hint {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 9px; color: var(--ink-muted);
  text-transform: uppercase; letter-spacing: .04em;
}

/* ── New-Object-Dialog: Sektionen ── */
.new-object-sections {
  display: flex;
  flex-direction: column;
  gap: 16px;
  padding: 12px 18px;
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
}
.new-object-section {
  padding-top: 14px;
  border-top: 1px solid var(--border);
}
.new-object-section:first-child {
  padding-top: 4px;
  border-top: none;
}
.new-object-section-title {
  margin: 0 0 10px;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 1.02rem;
  font-weight: 600;
  color: var(--ink);
}
.new-object-section-examples {
  font-weight: 400;
  color: var(--ink-muted);
}
/* Tile-Layout (neu): pro Option eine Karte mit gestapeltem Inhalt
   (Title / Body / Animation / Button). Tile-Breite ist fix (336 px) — der
   Dialog wird per JS in dialogs.js auf "Anzahl × 336 + Gaps + Padding"
   gesetzt, sodass Tiles bei jeder Typenwahl gleich breit aussehen.
   justify-content:center fängt schmale Viewports ab (1 Tile mittig).
   Wert MUSS mit TILE_W in dialogs.js sizeDialogToTileCount() synchron sein. */
.new-object-tiles {
  display: grid;
  grid-template-columns: repeat(auto-fit, 336px);
  gap: 16px;
  justify-content: center;
}
.new-object-tile {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 16px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: var(--panel);
  /* cursor:default — nur der Button im Tile ist klickbar, Tile-Hover dient
     ausschließlich der GIF-Preview (PNG/GIF-Swap in dialogs.js). */
  cursor: default;
  transition: border-color .15s, box-shadow .15s, background .15s;
}
.new-object-tile:hover {
  border-color: var(--green-mid);
  background: var(--green-soft);
  box-shadow: 0 2px 8px rgba(0,0,0,.06);
}
.new-object-tile-title {
  margin: 0;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 1.05rem;
  font-weight: 600;
  color: var(--ink);
}
.new-object-tile-body {
  font-size: .85rem;
  line-height: 1.45;
  color: var(--ink-muted);
  min-height: 2.6em; /* gleicht Höhen aus, damit GIFs/Buttons nebeneinander fluchten */
}
.new-object-tile-anim {
  position: relative;
  aspect-ratio: 16 / 9;
  background: var(--panel-2);
  border: 1px dashed var(--border);
  border-radius: 6px;
  overflow: hidden;
  display: flex; align-items: center; justify-content: center;
}
.new-object-tile-anim img {
  width: 100%; height: 100%; object-fit: contain; display: block;
}
.new-object-tile-anim.is-missing img { display: none; }
.new-object-tile-anim.is-missing::after {
  content: 'Anleitung folgt …';
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 11px;
  color: var(--ink-muted);
  text-align: center;
  padding: 0 12px;
}
.new-object-tile-anim.is-missing[data-hint]:not([data-hint=""])::after {
  content: 'Anleitung folgt … (' attr(data-hint) ')';
}
.new-object-tile-btn {
  margin-top: auto; /* Button heftet sich an den unteren Rand */
  justify-content: center;
}

/* Way-Tile: zwei nebeneinander gestellte Inline-SVG-Icons (Fussgaenger/Auto)
   statt animiertem GIF — eines davon ggf. mit roter Diagonale ueberlagert. */
.way-tile-icons {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 28px;
  width: 100%;
  height: 100%;
  padding: 8px;
  box-sizing: border-box;
}
.way-tile-icon {
  width: 56px;
  height: 56px;
  color: var(--ink);
}
.way-tile-icon.is-crossed {
  color: var(--ink-muted);
}

/* Zeilenlayout (Legacy, vor Tile-Refactor) — bleibt fürs Erste, falls noch
   irgendwo gerendert. Kann später weg, wenn alle Render-Pfade auf Tiles laufen. */
.new-object-section-rows {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.new-object-row {
  display: grid;
  grid-template-columns: 128px 1fr;
  gap: 14px;
  align-items: center;
}
.new-object-row-explain {
  font-size: .85rem;
  color: var(--ink-muted);
  line-height: 1.45;
}
.new-object-row-explain-title {
  font-size: .9rem;
  font-weight: 600;
  color: var(--ink);
  line-height: 1.3;
  margin-bottom: 3px;
}
.new-object-row-explain-body {
  font-size: .8rem;
  color: var(--ink-muted);
  line-height: 1.4;
}
/* Cards in Sektionen: schlank + dezent grün als Default, Hover verstärkt */
.new-object-sections .new-object-card {
  flex-direction: row;
  justify-content: flex-start;
  align-items: center;
  text-align: left;
  padding: 8px 10px;
  gap: 10px;
  background: var(--green-soft);
  border-color: var(--green-mid);
}
.new-object-sections .new-object-card svg { width: 22px; height: 22px; flex-shrink: 0; }
.new-object-sections .new-object-card-label { font-size: .86rem; }
.new-object-sections .new-object-card:hover {
  background: var(--green-mid);
  border-color: var(--green);
  box-shadow: 0 2px 10px var(--green-mid);
}

@media (max-width: 640px) {
  .new-object-row { grid-template-columns: 1fr; gap: 6px; }
}

.angle-label {
  background: rgba(39, 104, 55, .45);
  color: #fff;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 9px;
  padding: 1px 5px;
  border-radius: 3px;
  white-space: nowrap;
  pointer-events: none;
}

.arrow-hint {
  display: flex; align-items: center; gap: 6px;
  flex-shrink: 0;
}
#rotateHint { display: contents; }
#rotateHint.hidden { display: none !important; }
.arrow-hint.hidden { display: none !important; }

.arrow-keys {
  display: flex; align-items: center; gap: 3px;
}
/* Klickbarer Keycap — mit 3D-Schatten, Hover + Press-Animation */
.kbd-btn {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 28px; height: 28px;
  border-radius: 6px;
  border: 1px solid var(--border-strong);
  background: var(--panel-2);
  box-shadow: 0 2px 0 var(--border-strong);
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 12px; font-weight: 500;
  color: var(--ink); line-height: 1;
  padding: 0 8px; cursor: pointer;
  transition: background .1s, transform .08s, box-shadow .08s;
  /* iPad/Touch: Long-Press auf den Button selektiert sonst den Buchstaben
     (Text-Selection-Highlight). Beides unterdrücken — der Button funktioniert
     auch über Pointer-Events, ohne Selection. */
  user-select: none;
  -webkit-user-select: none;
  -webkit-touch-callout: none;
}

/* Info-Keycap — dezent, flach, nicht klickbar. Markiert eine Taste als Info-Hinweis. */
kbd {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 22px; height: 20px;
  border-radius: 4px;
  border: 1px dashed var(--border);
  background: transparent;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 11px; font-weight: 500;
  color: inherit; line-height: 1;
  padding: 0 6px;
  cursor: default;
  opacity: 0.85;
}
.kbd-btn:hover {
  background: var(--green-soft); color: var(--green);
  border-color: var(--green-mid);
}
.kbd-btn:active {
  transform: translateY(1px);
  box-shadow: 0 1px 0 var(--border-strong);
}
.arrow-hint-text {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 10px;
  color: var(--ink-muted); white-space: nowrap;
}
.arrow-hint-sep {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 10px;
  color: var(--ink-faint);
}

.topbar-right {
  display: flex; align-items: center; gap: 10px;
  margin-left: auto; flex-shrink: 0;
}

.topbar-actions {
  display: flex; gap: 8px; align-items: center; flex-shrink: 0;
}
.topbar-btn {
  height: 30px; padding: 0 12px; font-size: 11px;
}
.topbar-btn svg {
  width: 12px; height: 12px;
  stroke: currentColor; fill: none;
  stroke-width: 2.5; stroke-linecap: round;
  pointer-events: none;
}

.mode-toggle { display: flex; gap: 0; }
.mode-toggle-btn {
  flex: 1;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 10px; font-weight: 500;
  letter-spacing: .04em; text-transform: uppercase;
  padding: 7px 14px; border: 1px solid var(--border);
  background: var(--panel); color: var(--ink-muted);
  cursor: pointer; transition: all .12s;
}
.mode-toggle-btn:first-child { border-radius: var(--radius-sm) 0 0 var(--radius-sm); }
.mode-toggle-btn:last-child { border-radius: 0 var(--radius-sm) var(--radius-sm) 0; border-left: none; }
.mode-toggle-btn.active { background: var(--green); color: #fff; border-color: var(--green); }
.mode-toggle-btn:disabled { opacity: 0.4; cursor: not-allowed; pointer-events: none; }

.help-text {
  display: flex; flex-direction: column; gap: 16px;
  padding: 4px 0;
  font-size: .95rem; color: var(--ink-muted); line-height: 1.6;
}
.help-text > p { font-style: italic; }
.help-section {
  display: flex; gap: 12px; align-items: flex-start;
  padding: 12px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--panel-2);
}
.help-icon {
  flex-shrink: 0; width: 32px; height: 32px;
  display: flex; align-items: center; justify-content: center;
  border-radius: 8px;
  background: var(--green-soft); border: 1px solid var(--green-mid);
  color: var(--green);
}
.help-icon svg {
  width: 15px; height: 15px;
  stroke: currentColor; fill: none;
  stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round;
}
.help-section strong {
  display: block; font-size: .95rem; font-weight: 600;
  color: var(--ink); margin-bottom: 2px;
}
.help-section p { margin: 0; font-size: .88rem; }

/* ── Service-Teaser im Help-Panel (rechte Spalte, Default-Hilfetext) ──
   Visuell wie die .help-section-Boxen darunter — gleiche border, padding,
   typografie — aber ohne Icon-Flex-Layout. */
.help-cta-teaser {
  margin: 4px 0 18px;
  padding: 12px;
  background: var(--panel-2);
  border: 2px solid var(--red);
  border-radius: var(--radius-sm);
}
.help-cta-teaser-title {
  display: block;
  margin: 0 0 2px;
  font-size: .95rem;
  font-weight: 600;
  color: var(--red);
  font-family: inherit;
}
.help-cta-teaser-text {
  margin: 0;
  font-size: .88rem;
  color: var(--ink);
  line-height: 1.45;
}
.help-cta-teaser-text a {
  color: var(--red);
  font-weight: 600;
  word-break: break-word;
}


/* ── MAP ─────────────────────────────────────────────────────────────────── */
.map-shell {
  position: relative; min-height: 0; height: 100%;
}
.map-toolbar {
  position: absolute; top: 12px; left: 50%; transform: translateX(-50%);
  z-index: 30;
  display: flex; flex-direction: column; gap: 6px;
  padding: 8px 16px;
  background: rgba(30, 30, 30, 0.88);
  border-radius: var(--radius);
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
  backdrop-filter: blur(6px);
}
.map-toolbar.hidden { display: none !important; }
.map-toolbar-row {
  display: flex; align-items: center; gap: 8px;
}
.map-toolbar-hints {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 10px;
  color: rgba(255, 255, 255, 0.55);
  gap: 4px; flex-direction: column; align-items: flex-start;
}
.map-toolbar-hints span.hidden { display: none !important; }
.map-toolbar .kbd-btn {
  background: rgba(255, 255, 255, 0.15);
  border-color: rgba(255, 255, 255, 0.25);
  box-shadow: 0 2px 0 rgba(0, 0, 0, 0.3);
  color: #fff;
}
.map-toolbar .kbd-btn:hover {
  background: var(--green); color: #fff;
  border-color: var(--green);
}
.map-toolbar .arrow-hint-text {
  color: rgba(255, 255, 255, 0.7);
}
.map-toolbar kbd {
  background: transparent;
  border: 1px dashed rgba(255, 255, 255, 0.4);
  box-shadow: none;
  color: rgba(255, 255, 255, 0.85);
}
.map-toolbar-sep {
  width: 1px; height: 18px;
  background: rgba(255, 255, 255, 0.2);
}
.map-toolbar-row.hidden { display: none !important; }

/* Snap-Toggle im HUD: breiter als eine Keycap, optisch wie ein Button */
.kbd-btn--toggle {
  padding: 0 12px; min-width: auto;
  font: 500 11px/1 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  letter-spacing: 0.02em;
}
.snap-btn-label { white-space: nowrap; }
.kbd-btn > kbd { margin-left: 8px; }
.kbd-btn--toggle.is-off {
  background: rgba(192, 57, 43, 0.75) !important;
  border-color: rgba(192, 57, 43, 0.9) !important;
}
.kbd-btn--toggle.is-off:hover {
  background: rgba(192, 57, 43, 0.9) !important;
}
.kbd-btn--toggle.is-suspended {
  outline: 1px dashed rgba(255, 255, 255, 0.6);
  outline-offset: 1px;
}
.map-float-col {
  position: absolute; top: 12px; left: 12px;
  z-index: 20; display: flex; flex-direction: column; gap: 7px;
}
.float-btn {
  width: 34px; height: 34px;
  display: flex; align-items: center; justify-content: center;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border-strong);
  background: var(--panel);
  color: var(--ink-muted);
  cursor: pointer;
  box-shadow: var(--shadow);
  transition: background .12s, color .12s, border-color .12s;
}
.float-btn svg {
  width: 15px; height: 15px;
  stroke: currentColor; fill: none;
  stroke-width: 2; stroke-linecap: round; stroke-linejoin: round;
}
.float-btn:hover { background: var(--green-soft); color: var(--green); border-color: var(--green-mid); }
.float-btn.active { background: var(--green-soft); color: var(--green); border-color: var(--green-mid); }

.topbar-layer-toggle {
  display: flex;
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-sm);
  overflow: hidden;
  flex-shrink: 0;
}
.map-layer-btn {
  padding: 0 11px;
  height: 30px;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 10px; font-weight: 500;
  background: transparent; border: none;
  color: var(--ink-muted); cursor: pointer;
  white-space: nowrap;
  transition: background .12s, color .12s;
}
.map-layer-btn:hover { background: rgba(160,140,100,.1); color: var(--ink); }
.map-layer-btn.active { background: var(--green-soft); color: var(--green); }

/* Hilfskarte-Dropdown: Toggle-Button mit Chevron + abklappbares Menü.
   Ersetzt die fünf einzelnen Layer-Buttons in der Topbar — spart Breite. */
.hilfskarte-dropdown {
  position: relative;
  flex-shrink: 0;
}
.hilfskarte-toggle {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-sm);
}
/* Wenn die Dropdown in einem .btn-with-help-Wrapper sitzt (Toggle + Info-Icon
   gemeinsam gerahmt), liefert der Wrapper den Rahmen — der eigene Border vom
   Toggle entfällt, sonst entsteht ein doppelter Rahmen. */
.btn-with-help .hilfskarte-toggle {
  border: none;
  border-radius: 0;
}
.hilfskarte-chevron {
  transition: transform .15s;
  flex-shrink: 0;
}
.hilfskarte-toggle[aria-expanded="true"] .hilfskarte-chevron {
  transform: rotate(180deg);
}
.hilfskarte-menu {
  /* fixed statt absolute: die .topbar hat overflow: hidden, sonst wird das
     darunter aufgehende Menü abgeschnitten. Positionierung erfolgt aus dem
     JS via Toggle-Bounding-Rect beim Öffnen. */
  position: fixed;
  z-index: 1500;
  display: flex;
  flex-direction: column;
  background: var(--panel);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow-lg);
  overflow: hidden;
}
.hilfskarte-menu.hidden {
  display: none;
}
.hilfskarte-menu .map-layer-btn {
  border-right: none;
  border-bottom: 1px solid var(--border);
  text-align: left;
  width: 100%;
}
.hilfskarte-menu .map-layer-btn:last-child {
  border-bottom: none;
}

/* Kombiniertes "Hilfskarte + Hintergrund"-Pulldown: zwei Sektionen mit
   Section-Titles + ein Footer-Block für den Opacity-Slider. Section-Title
   sitzt in einem leicht abgesetzten Header-Streifen, Buttons darunter ohne
   eigenen Top-Border (sonst doppelte Trennlinie). Schriftgröße hier etwas
   größer als der Default (11.5 statt 9 px), damit das Info-Icon daneben
   Luft hat. */
.map-layers-menu .layer-toggle-section-title {
  padding: 12px 14px 8px;
  font-size: 11.5px;
  background: var(--panel-2);
  border-top: 1px solid var(--border);
}
/* Bottom-Border vom Title weg, wenn KEIN Help-Block folgt — Items darunter
   setzen den Trenner via Background-Wechsel. Wenn Help folgt, bringt der
   Help-Block selbst den Bottom-Border mit. */
.map-layers-menu .layer-toggle-section-title:not(:has(+ .layer-toggle-section-help)) {
  border-bottom: 1px solid var(--border);
}
.map-layers-menu .layer-toggle-section-title:first-child {
  border-top: none;
  padding-top: 10px;
}
/* Beschreibungstext direkt unter einem Section-Title. Sitzt im selben
   abgesetzten Header-Streifen wie der Title — ohne Top-Border (sonst Doppel-
   Trennlinie), dafür Bottom-Border um sich klar von den Items darunter
   abzusetzen. */
.map-layers-menu .layer-toggle-section-help {
  padding: 0 14px 10px;
  background: var(--panel-2);
  border-bottom: 1px solid var(--border);
  font-size: 12.5px;
  line-height: 1.45;
  color: var(--ink-muted);
}
/* Mehrere Absätze: sichtbare Leerzeile zwischen den <p>-Blöcken; letzter
   Absatz ohne Bottom-Margin damit der Padding-Reset des Containers wirkt. */
.map-layers-menu .layer-toggle-section-help p {
  margin: 0 0 0.6rem 0;
}
.map-layers-menu .layer-toggle-section-help p:last-child {
  margin-bottom: 0;
}
/* Inline-Links im Hilfetext: bordeauxrot + dezent unterstrichen, damit sie
   sich klar vom gedämpften Fließtext (--ink-muted) abheben. */
.map-layers-menu .layer-toggle-section-help a {
  color: var(--green);
  text-decoration: underline;
  text-underline-offset: 2px;
}
.map-layers-menu .layer-toggle-section-help a:hover {
  color: #7a2a28;
}
/* Section-Title mit Info-Icon: Text links, Icon rechts. Icon ist ein
   kleiner Bordeaux-Kreis mit "i" — title-Attribut liefert den Hover-Text. */
.section-title-with-info {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
}
.section-info-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 16px;
  height: 16px;
  border-radius: 50%;
  background: var(--green);
  color: #fff;
  font: 600 10px/1 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-style: italic;
  text-transform: none;
  letter-spacing: 0;
  cursor: help;
  flex-shrink: 0;
}
.section-info-icon:hover {
  background: #7a2a28;
}
/* Letzter Item-Button vor einer Section-Title oder vor dem Footer braucht
   keinen eigenen Border (der Section-Title bringt seinen Top-Border mit). */
.map-layers-menu .map-layer-btn + .layer-toggle-section-title { border-top: none; }
.map-layers-menu-footer {
  padding: 8px 14px;
  border-top: 1px solid var(--border);
  background: var(--panel-2);
}

/* Topbar-Pulldown "Hintergrundbild wechseln" — wiederverwendet das Hilfskarte-
   Menu-Pattern, mit Check-Icon links für den aktuell aktivierten Eintrag.
   Hoehe gegenueber den uebrigen .map-layer-btn-Eintraegen verdoppelt, damit
   der Stilname + die Datum-Zweitzeile lockerer sitzen. */

/* Pulldown nie höher als der Viewport — sonst rutscht der Transparenz-Slider
   (Footer) bei langer Bild-Liste nach unten aus dem sichtbaren Bereich. Das
   Menü ist bereits flex-column; nur die Bild-Liste (#overlayBgMenu) scrollt,
   Titel/Hilfe/Footer bleiben fest sichtbar. 64 px Reserve = Topbar + Luft. */
#mapLayersMenu.hilfskarte-menu {
  max-height: calc(100vh - 64px);
}
#mapLayersMenu #bgSection {
  display: flex;
  flex-direction: column;
  min-height: 0;       /* erlaubt der Liste darin zu schrumpfen/scrollen */
  flex: 1 1 auto;
}
#overlayBgMenu {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
}

.overlay-bg-item {
  display: flex !important;
  align-items: center;
  gap: 8px;
  padding: 10px 11px 10px 28px !important;
  height: auto !important;
  min-height: 60px;
  position: relative;
}
.overlay-bg-item .overlay-bg-check {
  position: absolute;
  left: 8px;
  top: 50%;
  transform: translateY(-50%);
  width: 14px;
  height: 14px;
  color: var(--green);
  display: none;
}
.overlay-bg-item.is-active .overlay-bg-check {
  display: inline-flex;
}
.overlay-bg-item.is-active {
  background: var(--green-soft);
  color: var(--green);
}
/* Zwei separate Marker im Preview-Only-Picker:
   - .is-live  = was die Live-Karte (Frontend + Widget) tatsächlich zeigt;
                 markiert ausschließlich über das Text-Suffix "(Live-Karte)".
   - .is-editor = was der User aktuell im Editor sieht (Preview-Auswahl);
                 zartrosa Hintergrund + bordeauxroter Text, einheitlich mit
                 dem aktiven Hilfskarte-Item (.map-layer-btn.active). */
.overlay-bg-item.is-editor {
  background: var(--green-soft);
  color: var(--green);
}
.overlay-bg-live-suffix {
  color: var(--green);
  font-weight: 600;
  margin-left: 6px;
  font-size: 10px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
/* Klartext-Suffix beim aktiven Pulldown-Eintrag — dezent, damit der Stil-
   name optisch dominant bleibt aber der Live-Karte-Hinweis sofort lesbar ist. */
.overlay-bg-active-suffix {
  color: var(--ink-muted);
  font-weight: 400;
  margin-left: 4px;
}

/* Zweizeiliger Pulldown-Eintrag: Stilname oben, Generierungs-Datum klein
   darunter. Brichst die Single-Span-Annahme von .map-layer-btn auf, daher
   eigener flex-column-Container. Datum nur im aufgeklappten Zustand —
   das Toggle-Label oben bleibt einzeilig (style_name only). */
.overlay-bg-content {
  display: flex;
  flex-direction: column;
  gap: 1px;
  flex: 1;
  min-width: 0;
}
.overlay-bg-name {
  display: block;
}
.overlay-bg-date {
  display: block;
  font-size: 10px;
  color: var(--ink-muted);
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-weight: 400;
}

/* Activate-Overlay-Button neben dem Pulldown — Status-Button mit zwei States:
   disabled  = das angezeigte Bild ist auch das in der Live-Karte verwendete
               (gegraut, kein Hover, neutraler Text)
   enabled   = ein anderes Bild wird gerade nur lokal angezeigt → Klick
               persistiert es als neues Live-Bild (grüne Akzentfarbe). */
#btnActivateOverlay {
  /* Override für .map-layer-btn — soll als handlungsoffene Button-Form wirken,
     nicht wie ein Tab/Layer-Switcher. */
  white-space: nowrap;
}
#btnActivateOverlay:disabled {
  cursor: default;
  opacity: 0.55;
  background: transparent !important;
  color: var(--ink-muted);
}
#btnActivateOverlay:not(:disabled) {
  background: var(--green-soft);
  color: var(--green);
  font-weight: 600;
}
#btnActivateOverlay:not(:disabled):hover {
  background: var(--green-mid);
}

/* Hilfe-Pattern: kleines Fragezeichen-Icon-Button + ausklappbare Hilfe-Bubble.
   Wiederverwendbar überall im Admin via data-help-target="<bubbleId>".
   Blaue Konvention (--blue-soft / --blue-mid) — passt zu .draw-hint. */
.help-icon-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  border: 1px solid var(--blue-mid);
  background: var(--blue-soft);
  color: var(--blue);
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 12px;
  font-weight: 600;
  cursor: pointer;
  flex-shrink: 0;
  margin-left: 6px;
  padding: 0;
  transition: background .14s, border-color .14s, color .14s;
}
.help-icon-btn:hover {
  background: rgba(30, 64, 175, 0.15);
  border-color: var(--blue);
}
.help-icon-btn[aria-expanded="true"] {
  background: var(--blue);
  color: #fff;
  border-color: var(--blue);
}

/* Wrapper, der einen Button + sein Hilfe-Icon visuell als eine Einheit
   darstellt: gemeinsamer Rahmen, das ?-Icon liegt INNERHALB des Rahmens.
   Beide Kinder verlieren ihre eigenen Rahmen/Margins. */
.btn-with-help {
  display: inline-flex;
  align-items: center;
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-sm);
  margin-left: 6px;
  overflow: hidden;
  flex-shrink: 0;
}
.btn-with-help .map-layer-btn {
  margin-left: 0;
  /* knapper rechts: das Icon sitzt direkt daneben — die Pipe (border-left
     auf .help-icon-btn) trennt visuell. */
  padding-right: 8px;
}
.btn-with-help .help-icon-btn {
  margin-left: 0;
  width: 22px;
  height: 28px;
  border: none;
  /* Pipe als interner Trennstrich zwischen Button-Text und Info-Icon. */
  border-left: 1px solid var(--border-strong);
  border-radius: 0;
  /* Default-Hintergrund = vorheriger Hover-Tint, hebt das Icon im Wrapper hervor. */
  background: var(--blue-soft);
  color: var(--blue);
  /* Kursiv damit das "i" als Info-Glyph erkennbar ist (statt nur Buchstabe). */
  font-style: italic;
  font-weight: 700;
  font-size: 13px;
}
.btn-with-help .help-icon-btn:hover {
  background: rgba(30, 64, 175, 0.18);
}
.btn-with-help .help-icon-btn[aria-expanded="true"] {
  background: var(--blue);
  color: #fff;
}
.help-bubble {
  /* fixed: escape jeglichem ancestor overflow:hidden (z.B. .topbar). Position
     wird beim Öffnen aus dem Trigger-Bounding-Rect berechnet (siehe
     setupHelpToggles in app.js). */
  position: fixed;
  z-index: 1500;
  max-width: 360px;
  padding: 14px 16px;
  /* Layer: blauer Tint über opakem Panel-Background. --blue-soft alleine wäre
     nur 8% opacity, dann scheint die Karte durch und macht den Text unlesbar.
     So wirkt das Bubble blau-getönt, bleibt aber definitiv deckend. */
  background: linear-gradient(var(--blue-soft), var(--blue-soft)), var(--panel);
  border: 1px solid var(--blue-mid);
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow-lg);
  font-size: .92rem;
  line-height: 1.55;
  color: var(--ink);
  font-weight: 500;
  /* Texte können \n / Absätze enthalten — pre-line rendert sie als sichtbare
     Absätze ohne dass im HTML <br>/<p> stehen muss. */
  white-space: pre-line;
}
/* Pfeil-Indikator nach oben, zeigt zum Trigger-Icon. Trick: gedrehtes Quadrat
   mit den gleichen oberen Ecken wie das Bubble (Border + Tint-Background), die
   untere Hälfte sitzt unter dem Bubble und ist verdeckt. CSS-Variable
   --arrow-left wird in JS gesetzt, damit der Pfeil exakt unter dem Trigger sitzt. */
.help-bubble::after {
  content: '';
  position: absolute;
  top: -7px;
  left: var(--arrow-left, 50%);
  width: 12px;
  height: 12px;
  transform: translateX(-50%) rotate(45deg);
  background: linear-gradient(var(--blue-soft), var(--blue-soft)), var(--panel);
  border-top: 1px solid var(--blue-mid);
  border-left: 1px solid var(--blue-mid);
}
.help-bubble.hidden {
  display: none;
}
/* Optionale Headline am Anfang des Hilfe-Texts. Im Markup direkt als erstes
   Kind setzen — keine Whitespace-/Newline davor (wegen pre-line). */
.help-bubble-title {
  display: block;
  margin: 0 0 8px;
  padding: 0 0 6px;
  border-bottom: 1px solid var(--blue-mid);
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 1.05rem;
  font-weight: 700;
  color: var(--blue);
  line-height: 1.3;
}

.compass-btn { margin-top: 4px; }
.compass-btn svg { transition: transform .25s cubic-bezier(0.32,0.72,0,1); }

.map {
  width: 100%; height: 100%;
  border-radius: var(--radius);
  overflow: hidden;
  border: 1px solid var(--border);
  background: var(--panel-2);
  box-shadow: var(--shadow-lg);
}

/* OpenLayers overrides */
.ol-viewport, .ol-layers, .ol-layer, .ol-canvas { border-radius: var(--radius); }
.ol-control {
  background: var(--panel) !important;
  border-radius: 10px !important;
  border: 1px solid var(--border) !important;
  box-shadow: var(--shadow) !important;
}
.ol-control button {
  background: transparent !important;
  color: var(--ink-muted) !important;
  border-radius: 7px !important;
  width: 28px !important; height: 28px !important;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif !important;
  font-size: 14px !important;
  transition: background .12s, color .12s !important;
}
.ol-control button:hover { background: var(--green-soft) !important; color: var(--green) !important; }
.ol-attribution { font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif !important; font-size: 9px !important; }

/* ── RIGHT SIDEBAR ───────────────────────────────────────────────────────── */
.right-sidebar {
  display: flex; flex-direction: column;
  position: relative;
}

.r-panel {
  display: flex; flex-direction: column;
  flex: 1; padding: 16px; gap: 12px;
  min-height: 0; overflow-y: auto;
  scrollbar-width: thin; scrollbar-color: var(--border) transparent;
}
.r-panel.hidden { display: none !important; }

/* Kurzes Hintergrund-Flash beim Eintritt in den Edit-Mode — visuelles
   Feedback fürs Aktivieren via Click-Again-to-Edit. --green-mid ist
   theme-aware (im Theme-Red zur Bordeaux-Variante gemapped). Klasse wird
   in panels.js nach showPanel('panelEdit') gesetzt + per animationend
   wieder entfernt. */
@keyframes rPanelFlash {
  0%   { background-color: var(--green-mid); }
  100% { background-color: transparent; }
}
.r-panel.panel-flash-edit {
  animation: rPanelFlash 2s ease-out;
}

.r-scroll {
  flex: 1; overflow-y: auto; overflow-x: hidden;
  min-height: 0;
  padding-right: 10px;
  display: flex; flex-direction: column; gap: 13px;
  scrollbar-width: thin; scrollbar-color: var(--border) transparent;
}

.form-error {
  display: none;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 10.5px;
  color: var(--red); background: var(--red-soft);
  border: 1px solid rgba(192,57,43,.25);
  border-radius: var(--radius-sm);
  padding: 7px 10px; flex-shrink: 0;
  line-height: 1.5;
}
.form-error:not(.hidden) { display: block; }

.r-panel-footer {
  display: flex; gap: 8px; flex-shrink: 0;
  padding-top: 4px;
  border-top: 1px solid var(--border);
}
.r-panel-footer .btn { flex: 1; }

/* ── BUTTONS ─────────────────────────────────────────────────────────────── */
.btn {
  height: 34px; padding: 0 14px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border);
  background: transparent;
  color: var(--ink-muted);
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 11px; font-weight: 500;
  cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center; gap: 5px;
  transition: background .14s, color .14s, border-color .14s, transform .08s;
  white-space: nowrap;
  /* Wenn .btn auf einem <a> sitzt, sonst greift home.css's globaler
     `a { text-decoration: underline }` und der Anchor-Button bekommt einen
     Underline den der <button>-Variante nicht hat. */
  text-decoration: none;
}
.btn:hover   { background: rgba(160,140,100,.1); color: var(--ink); border-color: var(--border-strong); }
.btn:active  { transform: scale(0.97); }
.btn:disabled { opacity: .35; cursor: not-allowed; pointer-events: none; }

.btn.primary  { background: var(--green); border-color: var(--green); color: #fff; font-weight: 600; }
.btn.primary:hover { background: #2e6636; border-color: #2e6636; }

/* Dezente Variante: Outline statt Vollfläche — grüner Rahmen + grüne Schrift,
   innen die Panel-Sandfarbe. Ursprünglich für die zwei Topbar-Neu-Buttons,
   jetzt auch für die Tile-Action-Buttons in den New-Object-Dialogen, damit
   sie nicht mit den dort sowieso hover-grünen Tiles konkurrieren.
   font-weight 500 (statt der primary-600), sonst wirkt grüne Schrift auf
   hellem Untergrund verschmiert. */
#btnNewObject.btn.primary,
#btnNewDesign.btn.primary,
.new-object-tile-btn.btn.primary,
.print-step2-toolbar .btn.primary:not(#btnSavePrintmap) {
  background: var(--panel);
  color: var(--green);
  font-weight: 500;
}
#btnNewObject.btn.primary:hover,
#btnNewDesign.btn.primary:hover,
.new-object-tile-btn.btn.primary:hover,
.new-object-tile:hover .new-object-tile-btn.btn.primary,
.print-step2-toolbar .btn.primary:not(#btnSavePrintmap):hover {
  background: var(--green-soft);
  border-color: var(--green);
  color: var(--green);
}

.btn.secondary { background: var(--panel-2); color: var(--ink); border-color: var(--border-strong); }
.btn.secondary:hover { background: rgba(160,140,100,.18); }

.btn.ghost { background: transparent; color: var(--ink-muted); }

.btn.danger { color: var(--red); border-color: rgba(192,57,43,.22); }
.btn.danger:hover { background: var(--red-soft); border-color: rgba(192,57,43,.45); }

/* Outline-Variante in Gruen — Pendant zu .btn.danger fuer "constructive"
   Aktionen (Bearbeiten o.ae.). Nicht so dominant wie .btn.primary
   (vollflaechig), passt aber visuell in dieselbe Aktions-Reihe wie .danger. */
.btn.success { color: var(--green); border-color: rgba(46,102,54,.22); }
.btn.success:hover { background: var(--green-soft); border-color: rgba(46,102,54,.45); }

/* ── ACTION ROW ─────────────────────────────────────────────────────────── */
.action-row {
  display: flex; gap: 8px; flex-shrink: 0;
}
.action-row .btn { flex: 1; }

/* ── EYEBROW / STATE PILL ────────────────────────────────────────────────── */
.eyebrow {
  display: block; margin-bottom: 2px;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9px;
  letter-spacing: .12em; text-transform: uppercase; color: var(--green);
}
/* „Link zum Objekt"-Text unter dem Namen — Trigger fürs Deeplink-Popover im
   Read-Panel des Karten-Editors, im Eyebrow-Stil (9px, uppercase, grün). */
.obj-link-text {
  display: inline-flex; align-items: center; gap: 4px;
  margin-top: 3px; padding: 0; border: none; background: none; cursor: pointer;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9px;
  letter-spacing: .12em; text-transform: uppercase; color: var(--green); line-height: 1.1;
}
.obj-link-text:hover { text-decoration: underline; }
.obj-link-text.hidden { display: none; }
.state-pill {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9.5px;
  padding: 3px 8px; border-radius: 999px;
  border: 1px solid var(--border);
  color: var(--ink-muted); white-space: nowrap; align-self: flex-start;
}
.state-pill.saving { color: var(--amber); border-color: rgba(176,124,26,.35); }
.state-pill.saved  { color: var(--green); border-color: var(--green-mid); }
.state-pill.error  { color: var(--red);   border-color: rgba(192,57,43,.35); }

/* ── READ VIEW ITEMS ─────────────────────────────────────────────────────── */
.read-section {
  display: flex; flex-direction: column; gap: 6px;
  background: var(--panel-2); padding: 12px;
  border-radius: var(--radius-sm); border: 1px solid var(--border);
}
.read-section-title {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 1.2rem; font-weight: 600;
  letter-spacing: -.01em; color: var(--ink);
  padding-bottom: 5px; border-bottom: none;
}
.read-item {
  padding: 4px 0;
}
.read-item-label {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9.5px;
  color: var(--ink-muted); margin-bottom: 3px;
}
.read-item-value {
  font-size: .95rem; color: var(--ink); word-break: break-word; line-height: 1.45;
  /* Zeilenumbrüche aus mehrzeiligen Textarea-Werten (z.B. Beschreibung)
     bei der Anzeige beibehalten. */
  white-space: pre-wrap;
}
.read-item-value.empty { color: var(--ink-muted); font-style: italic; font-size: .88rem; }
.read-empty { color: var(--ink-muted); font-style: italic; font-size: .88rem; padding: 8px 0; }

/* Read-Panel Toggle-Items (Ausstattung/Eigenschaften: aktiv vs. inaktiv).
   Aktiv = grüner Haken + normaler Text; inaktiv = X + gedämpft (Ausstattung
   zusätzlich durchgestrichen). white-space:normal überschreibt das pre-wrap
   der read-item-value, damit Icon + Text auf einer Zeile flexen. */
.read-toggle { display: flex; align-items: center; gap: 7px; white-space: normal; }
.read-toggle-ic { width: 14px; height: 14px; flex-shrink: 0; }
.read-toggle.on .read-toggle-ic { color: var(--green); }
.read-toggle.off { color: var(--ink-muted); }
.read-toggle.off .read-toggle-ic { color: var(--ink-muted); }
.read-struck { text-decoration: line-through; }
.read-prop-none { font-style: italic; color: var(--ink-muted); }

/* ── Locale tabs ── */
.locale-tabs { display: flex; gap: 2px; margin-bottom: 8px; }
.locale-tab {
  font-family: 'Twemoji Country Flags', 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 10px; font-weight: 500;
  letter-spacing: .06em; text-transform: uppercase;
  padding: 4px 10px; border-radius: var(--radius-sm) var(--radius-sm) 0 0;
  border: 1px solid var(--border); border-bottom: none;
  background: var(--panel-2); color: var(--ink-muted);
  cursor: pointer; transition: background .12s, color .12s;
}
.locale-tab:hover { color: var(--ink); }
.locale-tab.active { background: var(--panel); color: var(--green); font-weight: 600; border-color: var(--green-mid); }
.locale-pane { display: none; }
.locale-pane.active { display: flex; flex-direction: column; gap: 12px; }

/* ── Übersetzbar-Karte (Objekt-Create/Edit-Form) ──
   Umrandete Box, deren Kopf (Globus + „Übersetzbar" + Sprach-Tabs) sichtbar
   macht, dass NUR Bezeichnung+Beschreibung übersetzbar sind und wo die Gruppe
   endet. Scoped unter .locale-card → die geteilten .locale-tab-Basisstile der
   Settings-Forms (Kategorien/Ausstattung) bleiben unberührt. */
.locale-card {
  border: 1px solid var(--border); border-radius: var(--radius-sm);
  background: var(--panel); margin-bottom: 12px; overflow: hidden;
}
.locale-card-head {
  display: flex; align-items: center; gap: 8px;
  padding: 6px 8px 6px 10px;
  background: var(--panel-2); border-bottom: 1px solid var(--border);
}
.locale-card-title {
  display: inline-flex; align-items: center; gap: 5px; white-space: nowrap;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 10px; font-weight: 600; letter-spacing: .06em; text-transform: uppercase;
  color: var(--ink-muted);
}
.locale-card-title svg { width: 13px; height: 13px; flex-shrink: 0; }
.locale-card-body { padding: 10px; }
/* Sprach-Tabs rechtsbündig im Kopf, als Pills (nicht Ordner-Reiter). */
.locale-card-head .locale-tabs { margin: 0 0 0 auto; gap: 3px; }
.locale-card .locale-tab {
  padding: 3px 9px; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: transparent;
}
.locale-card .locale-tab.active { background: var(--panel); border-color: var(--green-mid); }

/* ── Translation badges ── */
.trans-badges { display: flex; gap: 3px; flex-shrink: 0; }
.trans-badge {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9px; font-weight: 500;
  letter-spacing: .04em; padding: 1px 4px; border-radius: 3px;
  border: 1px solid var(--border); color: var(--ink-muted); opacity: 0.8;
}
.trans-badge.missing { text-decoration: line-through; }
.trans-badge.has { opacity: 1; color: var(--green); border-color: var(--green-mid); background: var(--green-soft); }

/* ── Confirm dialog ── */
/* z-index hoch genug um ueber slide-in-Panels (z. B. Intro-Screen-Translation
   bei 9100, Add-Locale-Picker 9200) zu landen — sonst sitzt das Confirm hinter
   dem Panel und seine Buttons werden vom Panel-Backdrop geblockt. */
.confirm-overlay {
  position: fixed; inset: 0; z-index: 9300;
  background: rgba(44,36,22,0.45); backdrop-filter: blur(4px);
  display: flex; align-items: center; justify-content: center;
  opacity: 0; pointer-events: none; transition: opacity .2s;
}
.confirm-overlay.open { opacity: 1; pointer-events: all; }
.confirm-box {
  background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius);
  box-shadow: var(--shadow-lg); padding: 28px; width: 400px; max-width: 90vw;
}
.confirm-title { font-size: 18px; font-weight: 600; margin-bottom: 8px; }
.confirm-body { font-size: 14px; color: var(--ink-muted); line-height: 1.6; margin-bottom: 20px; }
.confirm-body strong { color: var(--ink); }
.confirm-actions { display: flex; gap: 8px; justify-content: flex-end; }

.cat-tag {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 3px 8px; border-radius: 999px;
  border: 1px solid var(--border);
  background: var(--panel-2);
  font-size: .9rem;
}
.cat-dot { width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; }

/* Amenity chips */
.amenity-group-title {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9px;
  color: var(--ink-muted); letter-spacing: .07em; text-transform: uppercase;
  margin-bottom: 4px; margin-top: 6px;
}
.amenity-chips { display: flex; flex-wrap: wrap; gap: 5px; }
.amenity-chip {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 3px 8px; border-radius: 999px;
  border: 1px solid var(--border);
  background: var(--green-soft);
  border-color: var(--green-mid);
  font-size: .88rem; color: var(--ink);
}

/* Property options */
.prop-item { margin-bottom: 4px; }
.prop-label { font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9.5px; color: var(--ink-muted); margin-bottom: 3px; }
.prop-option-selected {
  display: inline-block; padding: 2px 8px; border-radius: 999px;
  border: 1px solid var(--border-strong);
  background: var(--panel-2); font-size: .9rem; color: var(--ink);
}

/* Image list */
.image-item, .pdf-item {
  display: flex; align-items: flex-start; gap: 8px;
  padding: 8px 10px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--panel-2);
}
.image-thumb-link {
  flex-shrink: 0; display: block;
  width: 72px; height: 72px;
  border-radius: 7px; overflow: hidden;
  border: 1px solid var(--border);
  background: rgba(160,140,100,.12);
  transition: border-color .14s;
  cursor: pointer;
}
.image-thumb-link:hover { border-color: var(--green); }
.image-thumb-img {
  width: 100%; height: 100%;
  object-fit: cover; display: block;
}
.image-info, .pdf-info { flex: 1; min-width: 0; }
.image-name, .pdf-name { font-size: .9rem; font-weight: 600; color: var(--ink); word-break: break-word; text-decoration: none; }
a.pdf-name:hover { text-decoration: underline; }
.image-meta, .pdf-meta { font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9.5px; color: var(--ink-muted); margin-top: 2px; }
.pdf-icon {
  flex-shrink: 0; display: flex; align-items: center; justify-content: center;
  width: 36px; height: 36px; border-radius: 7px;
  background: rgba(192,57,43,.08); color: #c0392b;
  text-decoration: none; transition: background .12s;
}
.pdf-icon:hover { background: rgba(192,57,43,.16); }
.pdf-open {
  flex-shrink: 0; display: flex; align-items: center; justify-content: center;
  width: 28px; height: 28px; border-radius: 6px;
  color: var(--ink-muted); text-decoration: none; transition: color .12s, background .12s;
}
.pdf-open:hover { color: var(--ink); background: var(--panel-2); }

/* ── Language badges ── */
.lang-badge {
  display: inline-block;
  font-family: 'Twemoji Country Flags', 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9px;
  padding: 1px 5px; border-radius: 4px;
  background: var(--panel-2); color: var(--ink-muted);
  border: 1px solid var(--border);
}

/* ── Edit PDF preview ── */
.edit-pdf-preview { display: flex; flex-direction: column; gap: 4px; }
.edit-pdf-item {
  display: flex; align-items: center; gap: 6px;
  padding: 6px 8px; border-radius: 6px;
  background: var(--panel-2); border: 1px solid var(--border);
}
.edit-pdf-name { font-size: .85rem; color: var(--ink); flex: 1; min-width: 0; word-break: break-word; }

/* ── PDF Picker cards ── */
.pdfpicker-assigned-card {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 10px; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--panel);
  position: relative;
  transition: border-color .12s, box-shadow .12s;
}
.pdfpicker-assigned-card:hover { border-color: var(--green-mid); }
/* PDF-Card-Handle nutzt das generische .drag-handle-Styling (oben in dieser
   Datei). Auf Touch-Geräten Opacity hoch ziehen (kein Hover). */
@media (hover: none) {
  .pdfpicker-assigned-card .drag-handle { opacity: 1; }
}
/* Remove-Button mit Label "Zuordnung entfernen ×" — Ghost-Style (heller
   Hintergrund, roter Text + rotes ×) damit das längere Label nicht knallig
   wirkt. Inline am Zeilenende. */
.pdfpicker-assigned-card .imgpicker-remove {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 4px 8px;
  border-radius: 4px;
  border: 1px solid rgba(192,57,43,.28);
  background: transparent;
  color: var(--red, #c0392b);
  cursor: pointer;
  font-size: 12px; font-weight: 500; line-height: 1;
  flex-shrink: 0;
  transition: background .12s, border-color .12s;
}
.pdfpicker-assigned-card .imgpicker-remove:hover {
  background: var(--red-soft, rgba(192,57,43,.08));
  border-color: rgba(192,57,43,.5);
}
.pdfpicker-assigned-card .imgpicker-remove-x {
  font-size: 15px; line-height: 1; color: var(--red, #c0392b);
}
.pdfpicker-card-name { flex: 1; font-size: .88rem; color: var(--ink); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

#pdfPickerPool {
  display: block;
}

/* ── PDF Picker Table ── */
.pdfpicker-table {
  width: 100%; border-collapse: collapse;
  font-size: .92rem;
}
.pdfpicker-table thead th {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 11px; font-weight: 500;
  color: var(--ink-muted); letter-spacing: .04em; text-transform: uppercase;
  text-align: left; padding: 6px 8px;
  border-bottom: 1px solid var(--border);
}
.pdfpicker-th-name { width: auto; }
.pdfpicker-th-size { width: 60px; }
.pdfpicker-th-langs { width: 100px; }
.pdfpicker-th-action { width: 32px; }
.pdfpicker-row {
  cursor: pointer; transition: background .1s;
}
.pdfpicker-row:hover { background: var(--green-soft); }
.pdfpicker-row.assigned { background: var(--green-soft); }
.pdfpicker-row td {
  padding: 7px 8px; border-bottom: 1px solid var(--border);
  vertical-align: middle;
}
.pdfpicker-cell-name {
  color: var(--ink); font-weight: 500;
  word-break: break-word;
}
.pdfpicker-row.assigned .pdfpicker-cell-name { color: var(--green); }
.pdfpicker-cell-size {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 11px;
  color: var(--ink-muted); white-space: nowrap;
}
.pdfpicker-cell-langs { white-space: nowrap; }
.pdfpicker-open {
  display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; border-radius: 6px;
  color: var(--ink-muted); transition: color .12s, background .12s;
}
.pdfpicker-open:hover { color: var(--green); background: var(--green-soft); }
.pdfpicker-upload-preview {
  flex-direction: column;
  align-items: stretch;
  padding: 10px; background: var(--panel-2); border-radius: 8px;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 12px;
  gap: 10px;
  transition: outline-color 0.15s;
  outline: 2px dashed transparent;
  outline-offset: -2px;
}
.pdfpicker-upload-preview.drag-over {
  outline-color: var(--green);
}
.lang-check { display: flex; align-items: center; gap: 4px; font-size: .88rem; cursor: pointer; }
.lang-check input { accent-color: var(--green); }

/* ── CREATE MENU ─────────────────────────────────────────────────────────── */
.create-menu { display: flex; flex-direction: column; gap: 10px; flex-shrink: 0; }
.create-section {
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  overflow: hidden;
  background: var(--panel-2);
  flex-shrink: 0;
}
.create-section-title {
  display: flex; align-items: center; gap: 7px;
  padding: 9px 12px;
  border-bottom: 1px solid var(--border);
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9.5px; font-weight: 500;
  letter-spacing: .1em; text-transform: uppercase; color: var(--ink-muted);
}
.create-type-btn {
  display: flex; align-items: center; gap: 8px;
  width: 100%; text-align: left;
  padding: 9px 12px;
  border: none; border-radius: 0;
  background: transparent; color: var(--ink);
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: .95rem;
  cursor: pointer;
  transition: background .12s;
  border-bottom: 1px solid rgba(160,140,100,.1);
}
.create-type-btn:last-child { border-bottom: none; }
.create-type-btn:hover { background: var(--green-soft); }
.create-type-btn .cat-dot { border: 1px solid var(--border); }

/* ── EDIT FORM ───────────────────────────────────────────────────────────── */
/* ── Entrance Read-Panel Badge ───────────────────────────────────── */
.entrance-read-row { display: flex; align-items: center; gap: 8px; }
.entrance-badge {
  display: inline-flex; align-items: center; justify-content: center;
  width: 20px; height: 20px; border-radius: 50%;
  background: #e67e22; color: #fff; font-weight: 700; font-size: 11px;
  border: 1.5px solid #fff; box-shadow: 0 0 0 1px rgba(0,0,0,0.12);
  flex-shrink: 0;
}

/* ── Entrance Draw Hint ──────────────────────────────────────────── */
#entranceDrawHint { max-width: 520px; }
#entranceDrawHint .map-toolbar-row { flex-wrap: wrap; gap: 10px; align-items: center; }
#entranceDrawHint .arrow-hint-text { flex: 1 1 240px; min-width: 0; white-space: normal; line-height: 1.4; }
#cancelEntranceDrawBtn {
  flex-shrink: 0;
  padding: 6px 14px;
  border-radius: 6px;
  border: 1px solid rgba(255,255,255,0.25);
  background: rgba(255,255,255,0.12);
  color: #fff;
  font-size: 12px;
  font-weight: 600;
  cursor: pointer;
}
#cancelEntranceDrawBtn:hover { background: rgba(255,255,255,0.22); }

/* ── Entrances Section ────────────────────────────────────────────── */
.entrances-list { display: flex; flex-direction: column; gap: 6px; }
.entrances-empty { font-size: 12px; color: var(--muted, #999); font-style: italic; padding: 4px 0; }
.entrance-row {
  display: grid; grid-template-columns: 24px 1fr 28px; align-items: center; gap: 8px;
  padding: 6px 8px; border: 1px solid var(--border, rgba(0,0,0,0.1)); border-radius: 6px;
  background: var(--panel-1, #fff);
}
.entrance-badge-inline { justify-self: center; }
.entrance-label { border: 1px solid var(--border, rgba(0,0,0,0.15)); border-radius: 4px; padding: 4px 8px; font-size: 12px; background: transparent; }
.entrance-delete { border: none; background: transparent; color: var(--danger, #c0392b); cursor: pointer; font-size: 18px; line-height: 1; padding: 0; width: 24px; height: 24px; border-radius: 4px; }
.entrance-delete:hover { background: rgba(192, 57, 43, 0.1); }
.entrances-add { margin-top: 6px; }

/* ── URLs Section ───────────────────────────────────────────────────── */
.urls-list { display: flex; flex-direction: column; gap: 8px; }
.urls-empty { font-size: 12px; color: var(--muted, #999); font-style: italic; padding: 4px 0; }
.url-row {
  display: flex; flex-direction: column; gap: 6px;
  padding: 8px; border: 1px solid var(--border, rgba(0,0,0,0.1)); border-radius: 6px;
  background: var(--panel-1, #fff);
}
.url-row-head { display: flex; align-items: center; gap: 6px; }
.url-row-head .url-input { flex: 1; }
.url-input.is-invalid {
  border-color: var(--danger, #c0392b);
  box-shadow: 0 0 0 3px rgba(192, 57, 43, 0.12);
}
.url-delete {
  border: none; background: transparent; color: var(--danger, #c0392b);
  cursor: pointer; font-size: 18px; line-height: 1; padding: 0;
  width: 28px; height: 28px; border-radius: 4px; flex-shrink: 0;
}
.url-delete:hover { background: rgba(192, 57, 43, 0.1); }
.urls-add { margin-top: 6px; }

.url-item {
  display: flex; flex-direction: column; gap: 2px;
  padding: 8px 10px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--panel-2);
}
.url-item .url-name {
  font-size: .9rem; font-weight: 600; color: var(--ink);
  word-break: break-word; text-decoration: none;
}
.url-item .url-name:hover { text-decoration: underline; }
.url-item .url-meta {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 10.5px;
  color: var(--ink-muted); margin-top: 2px; white-space: pre-wrap;
}

.form-section {
  display: flex; flex-direction: column; gap: 8px;
  background: var(--panel-2); padding: 12px;
  border-radius: var(--radius-sm); border: 1px solid var(--border);
}
.form-section-title {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 1.2rem; font-weight: 600;
  letter-spacing: -.01em; color: var(--ink);
  padding-bottom: 5px; border-bottom: none;
}
.form-group { display: flex; flex-direction: column; gap: 4px; }
.form-label {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 11px;
  color: rgba(44, 36, 22, 0.7); letter-spacing: .06em;
}
/* Pflichtfeld-Markierung am Label (z.B. Bezeichnung in der Erfassungssprache). */
.required-mark { color: var(--red); font-weight: 700; margin-left: 1px; cursor: help; }
.form-input, .form-select, .form-textarea {
  width: 100%;
  padding: 7px 10px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: #fff;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: .95rem; color: var(--ink);
  outline: none;
  transition: border-color .14s, box-shadow .14s;
  -webkit-appearance: none;
}
.form-input:focus, .form-select:focus, .form-textarea:focus {
  border-color: var(--green);
  box-shadow: 0 0 0 3px var(--green-soft);
}
.form-textarea { resize: vertical; min-height: 70px; }
.smooth-slider-wrap { display: flex; align-items: center; gap: 10px; }
.form-range { flex: 1; accent-color: var(--green); height: 6px; cursor: pointer; }
.smooth-value { font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 12px; min-width: 2.5em; text-align: right; color: var(--ink-muted); }
.form-select {
  cursor: pointer;
  padding-right: 28px;
  background-image: 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.5L6 6.5L11 1.5' fill='none' stroke='%23666' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 10px center;
}
.cat-radio-table { border-collapse: collapse; width: 100%; font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 11px; color: var(--ink); }
.cat-radio-table td { padding: 5px 6px; cursor: pointer; }
.cat-radio-table tr:hover { background: var(--bg-hover, rgba(0,0,0,.03)); }
.cat-radio-table input[type="radio"] { margin: 0; accent-color: var(--green); }
.cat-radio-table .cat-dot { display: inline-block; }
.cat-radio-desc { color: var(--ink-muted); font-size: 10px; }
.cat-select-wrap { display: flex; align-items: center; gap: 8px; }
.cat-select-wrap .form-select { flex: 1; }
.cat-select-dot {
  width: 16px; height: 16px; border-radius: 50%; flex-shrink: 0;
  border: 1px solid rgba(0,0,0,.15);
}

/* Oneway toggle */
.oneway-toggle { display: flex; gap: 4px; }
.oneway-btn {
  flex: 1; display: flex; align-items: center; justify-content: center; gap: 5px;
  padding: 7px 6px; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--bg);
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 10px; color: var(--ink-muted);
  cursor: pointer; transition: all .14s; white-space: nowrap;
}
.oneway-btn:hover { border-color: var(--ink-muted); background: var(--panel); color: var(--ink); }
.oneway-btn.active { border-color: var(--ink); background: var(--panel); color: var(--ink); font-weight: 500; }
.oneway-btn svg { flex-shrink: 0; }

/* Edit form image preview */
.edit-image-preview {
  display: flex; gap: 6px; flex-wrap: wrap;
}
.edit-image-thumb {
  width: 56px; height: 42px; border-radius: 4px; overflow: hidden;
  border: 1px solid var(--border); background: var(--panel-2);
}
.edit-image-thumb img {
  width: 100%; height: 100%; object-fit: cover; display: block;
}
.edit-image-empty {
  font-size: .85rem; color: var(--ink-muted); padding: 4px 0;
}

/* Checkbox groups (amenities, properties) */
.check-group { display: flex; flex-direction: column; gap: 6px; }
.check-subgroup-title {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9px;
  color: var(--ink-muted); text-transform: uppercase; letter-spacing: .07em;
  margin-top: 4px; margin-bottom: 2px;
}
.check-item {
  display: flex; align-items: center; gap: 8px;
  padding: 5px 8px; border-radius: 7px; cursor: pointer;
  transition: background .1s;
}
.check-item:hover { background: rgba(160,140,100,.07); }
.check-item input[type="checkbox"],
.check-item input[type="radio"] {
  width: 14px; height: 14px; accent-color: var(--green); cursor: pointer; flex-shrink: 0;
}
.check-item-label.muted { color: var(--ink-muted); font-style: italic; }
.check-item-label { font-size: .92rem; color: var(--ink); }

/* Geometry edit row */
.geo-edit-row {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 10px; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--panel-2);
}
.geo-status {
  flex: 1; font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 10px;
  color: var(--ink-muted);
}
.geo-status.has-geo { color: var(--green); }

/* ── DRAW HINT ───────────────────────────────────────────────────────────── */
/* Hilfetext-Konvention: blau-soft Hintergrund + blauer Border, dunkler Text
   und etwas kräftigeres Gewicht — nicht Italic, damit Anweisungen aus dem
   Drawing-Flow markant lesbar sind. */
.draw-hint {
  font-size: .95rem; color: var(--ink); font-weight: 500;
  line-height: 1.6; padding: 12px 14px;
  border: 1px solid var(--blue-mid);
  border-radius: var(--radius-sm);
  background: var(--blue-soft);
  /* Texte aus default.po enthalten \n-Linebreaks (Schritt-Liste) — pre-line
     rendert sie als sichtbare Absätze ohne weitere HTML-Markups. */
  white-space: pre-line;
}

/* Inhalte die nur mit Tastatur Sinn machen (Tasten-Shortcuts wie S/Q) auf
   primären Touch-Devices (iPad, Phones) ausblenden. Desktops mit Touchscreen
   bleiben unberührt — sie matchen `pointer: coarse` nicht. */
@media (hover: none) and (pointer: coarse) {
  .kbd-only {
    display: none;
  }
}

/* ── IMAGE PICKER DIALOG ────────────────────────────────────────────────────── */
.imgpicker {
  /* Lokaler Override: --ink-muted ist global rgba(…, .45) — im Dialog zu
     blass für die kleinen Mono-Labels. Hier dunkler scopen, propagiert in
     alle Picker-Kindregeln (img + pdf, beide nutzen .imgpicker als Wrapper). */
  --ink-muted: rgba(44, 36, 22, 0.78);
  position: fixed; inset: 0; z-index: 950;
  display: none; align-items: flex-start; justify-content: center;
  padding-top: 24px;
}
.imgpicker:not(.hidden) { display: flex; }

.imgpicker-backdrop {
  position: absolute; inset: 0;
  background: rgba(44, 36, 22, 0.72);
  backdrop-filter: blur(4px);
}

.imgpicker-box {
  position: relative; z-index: 1;
  display: flex; flex-direction: column;
  /* Breite-Algorithmus:
     - Mindestens 860px (auf Viewports wo das passt) — historischer Default
     - Bei groesseren Bildschirmen: 75vw → mehr Pool-Cards nebeneinander
     - Bei sehr schmalen Viewports: max 92vw → Padding bleibt sichtbar */
  width: min(92vw, max(860px, 75vw));
  max-height: 88vh;
  background: var(--panel);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius);
  box-shadow: var(--shadow-lg);
  /* overflow-y:auto als Fallback: bei sehr niedrigem Viewport (Edge-Case)
     reicht der innere Pool-Scroll nicht aus — die Action-Buttons im Footer
     waeren sonst abgeschnitten. Mit auto kann der User notfalls die ganze
     Box scrollen. Footer ist sticky (siehe unten), bleibt damit sichtbar. */
  overflow-y: auto;
  overflow-x: hidden;
}

/* PDF-Picker etwas höher: Mindesthöhe für die Box, und im Upload-Modus füllt
   das Upload-Formular den Platz (sonst schrumpft der Dialog auf die kurze
   Formularhöhe, da die flexende Pool-Section dann ausgeblendet ist). */
#pdfPickerDialog .imgpicker-box {
  min-height: min(620px, 85vh);
}
#pdfPickerDialog .imgpicker-upload {
  flex: 1 1 auto;
}

.imgpicker-header {
  display: flex; align-items: center; justify-content: space-between;
  padding: 14px 18px; border-bottom: 1px solid var(--border);
  flex-shrink: 0;
}
.imgpicker-title {
  font-size: 1.1rem; font-weight: 600; margin: 0;
}

/* ── Assigned images (top section, sortable) ── */
.imgpicker-assigned-wrap {
  padding: 10px 18px; flex-shrink: 0;
}
.imgpicker-section-title {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 11px; font-weight: 500;
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--ink-muted); margin-bottom: 8px;
}
.imgpicker-count {
  background: var(--green-mid); color: #fff;
  padding: 1px 7px; border-radius: 999px;
  font-size: 11px;
}
.imgpicker-assigned {
  display: flex; gap: 8px; flex-wrap: wrap;
  min-height: 68px; padding: 8px;
  /* max-height + scroll: bei vielen zugewiesenen Bildern (>24) wuerde der
     Bereich sonst unbegrenzt wachsen und den Pool/Upload-Bereich aus dem
     Viewport draengen. ~2 Card-Reihen bei normalem Viewport, bei kleiner
     Browser-Hoehe automatisch kleiner (vh-Anteil), damit Pool + Footer
     immer sichtbar bleiben. */
  max-height: min(280px, 30vh);
  overflow-y: auto;
  border: 1px dashed var(--border);
  border-radius: var(--radius-sm);
  background: var(--panel-2);
  align-items: flex-start;
  scrollbar-width: thin;
  scrollbar-color: var(--border) transparent;
}
/* Image-Picker: Grid-Layout für die thumbnail-Cards (gleiche Spaltengröße
   wie Pool unten). PDF-Picker stapelt vertikal, weil seine Cards horizontale
   Listenzeilen sind. */
#imgPickerAssigned {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
}
#pdfPickerAssigned {
  flex-direction: column;
  flex-wrap: nowrap;
  align-items: stretch;
}
.imgpicker-empty {
  color: var(--ink-muted); font-size: .92rem;
  padding: 18px 8px; width: 100%; text-align: center;
  /* Icon + Text vertikal stapeln, beide zentriert. flex-grow:1 statt height,
     damit der Empty-State den ganzen .imgpicker-assigned-Container fuellt
     (= dashed Border umrahmt sichtbar das Empty-Visual). */
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 6px;
  flex: 1;
  min-height: 52px;
  /* In CSS Grid (= #imgPickerAssigned ist Grid mit auto-fill-Spalten):
     ueber alle Spalten spannen, sonst sitzt das Empty in Spalte 1 und ist
     nur ~120px breit. In flex-column-Container (= #pdfPickerAssigned) hat
     diese Property keinen Effekt — sicher zu setzen. */
  grid-column: 1 / -1;
}
.imgpicker-empty svg {
  opacity: 0.45;
}

.imgpicker-assigned-card {
  position: relative;
  user-select: none;
  border-radius: 6px; overflow: hidden;
  border: 2px solid var(--green);
  background: var(--panel);
  transition: box-shadow .12s;
  /* Layout-Kollaps-Schutz analog zu .imgpicker-pool-card. Image (~90px 4:3)
     + Footer (~28px). */
  min-height: 118px;
}
.imgpicker-assigned-card:hover { box-shadow: 0 2px 8px rgba(0,0,0,.12); }
.imgpicker-assigned-card img {
  width: 100%; aspect-ratio: 4/3; object-fit: cover; display: block;
  min-height: 80px;
  background: var(--panel-2);
}
.imgpicker-assigned-card .imgpicker-remove {
  position: absolute; top: 4px; right: 4px;
  width: 22px; height: 22px;
  display: flex; align-items: center; justify-content: center;
  border-radius: 4px; border: none;
  background: rgba(192,57,43,.92); color: #fff;
  cursor: pointer; font-size: 13px; line-height: 1;
  z-index: 1;
}
/* Footer unter dem Bild: Drag-Handle links, Reihenfolge-Badge rechts.
   Beide dauerhaft sichtbar — Touch-tauglich. */
.imgpicker-assigned-footer {
  display: flex; align-items: center; justify-content: space-between;
  padding: 4px 6px;
}
.imgpicker-assigned-footer .drag-handle { opacity: 1; }
.imgpicker-assigned-order {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 11px;
  color: var(--ink-muted);
}

.imgpicker-divider {
  height: 1px; background: var(--border); margin: 0 18px;
}

/* ── Pool (all images grid) ── */
.imgpicker-pool-wrap {
  flex: 1; min-height: 0;
  display: flex; flex-direction: column;
  overflow: hidden;
}
.imgpicker-pool-header {
  display: flex; align-items: center;
  padding: 10px 18px; flex-shrink: 0; gap: 10px;
}
.imgpicker-pool-actions {
  display: flex; gap: 8px; align-items: center; margin-left: auto;
}
.imgpicker-search {
  width: 180px; padding: 5px 10px; font-size: .92rem;
}
.imgpicker-pool {
  flex: 1; overflow-y: auto; padding: 0 18px 12px;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
  gap: 10px; align-content: start;
  scrollbar-width: thin; scrollbar-color: var(--border) transparent;
}
.imgpicker-pool-group-title {
  grid-column: 1 / -1;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 12px; font-weight: 500;
  letter-spacing: .08em; text-transform: uppercase;
  color: var(--ink-muted);
  padding: 8px 0 2px;
  border-bottom: 1px solid var(--border);
}
.imgpicker-pool-group-title:first-child { padding-top: 0; }

.imgpicker-pool-card {
  border-radius: 6px; overflow: hidden;
  border: 2px solid var(--border);
  background: var(--panel);
  cursor: pointer; transition: border-color .12s, box-shadow .12s;
  /* min-height schuetzt vor Layout-Kollaps wenn aspect-ratio des <img>
     bei sehr vielen lazy-loaded Bildern nicht zuverlaessig greift —
     ohne diesen Anker werden alle Karten zu ~5px duennen Strichen.
     Wert = ~90px image (4:3 bei 120px Spalte) + ~28px info-Text. */
  min-height: 118px;
}
.imgpicker-pool-card:hover { border-color: var(--green-mid); box-shadow: 0 2px 6px rgba(0,0,0,.08); }
.imgpicker-pool-card.assigned { border-color: var(--green); background: var(--green-soft); }
.imgpicker-pool-card img {
  width: 100%; aspect-ratio: 4/3; object-fit: cover; display: block;
  /* min-height + dezenter Hintergrund: falls das Bild nicht (sofort) laedt,
     bleibt der Image-Slot sichtbar als Platzhalter statt zu kollabieren. */
  min-height: 80px;
  background: var(--panel-2);
}
.imgpicker-pool-card-info {
  padding: 4px 6px;
}
.imgpicker-pool-card-name {
  font-size: .88rem; font-weight: 600; color: var(--ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.imgpicker-pool-card-meta {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 11px;
  color: var(--ink-muted);
}

/* ── Inline upload ── */
.imgpicker-upload {
  border-top: 1px solid var(--border);
  padding: 12px 18px; flex-shrink: 0;
  background: var(--panel-2);
}
.imgpicker-upload-inner {
  display: flex; flex-direction: column; gap: 12px;
  max-width: 400px; margin: 0 auto;
}
.imgpicker-upload-inner .dropzone {
  border: 2px dashed var(--border-strong); border-radius: var(--radius);
  padding: 18px; font-size: .88rem;
  text-align: center; display: flex; flex-direction: column; align-items: center;
  cursor: pointer; transition: border-color .15s, background .15s;
  color: var(--ink-muted);
}
.imgpicker-upload-inner .dropzone svg {
  width: 28px; height: 28px; stroke: currentColor; fill: none;
  stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round;
  margin-bottom: 4px;
}
.imgpicker-upload-inner .dropzone p {
  font-size: .82rem; margin: 4px 0 0;
}
.imgpicker-upload-preview-wrap {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
  padding: 10px;
  border-radius: var(--radius-sm);
  background: var(--panel-2);
  text-align: center;
  transition: outline-color 0.15s;
  outline: 2px dashed transparent;
  outline-offset: -2px;
}
.imgpicker-upload-preview-wrap.drag-over {
  outline-color: var(--green);
}
.imgpicker-upload-preview-wrap img {
  max-width: 100%; max-height: 160px; object-fit: contain;
}

/* Gemeinsame Bausteine für Upload-Vorschauen (Bild- und PDF-Picker).
   Identische Regeln stehen in app.css; hier dupliziert, weil die Map-Seite
   kein Standard-Layout nutzt und app.css nicht lädt. */
.upload-preview-pdf-row {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  text-align: left;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 12px;
  color: var(--ink);
}
.upload-preview-pdf-row svg {
  width: 28px;
  height: 28px;
  flex-shrink: 0;
  color: #c0392b;
}
.upload-preview-meta {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 11px;
  color: var(--ink-muted);
  word-break: break-all;
  text-align: center;
}
.upload-preview-replace {
  align-self: center;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  background: var(--panel);
  color: var(--ink);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 5px 12px;
  font-family: inherit;
  font-size: 0.82rem;
  cursor: pointer;
  transition: background 0.15s, border-color 0.15s;
}
.upload-preview-replace:hover {
  background: var(--panel-2);
  border-color: var(--border-strong);
}
.upload-preview-replace svg {
  width: 14px;
  height: 14px;
  stroke: currentColor;
  fill: none;
  flex-shrink: 0;
}

.imgpicker-upload-inner .form-group { display: flex; flex-direction: column; gap: 4px; }
/* Blaue Hinweis-Box in den Picker-Upload-Formularen (Bild + PDF): erklärt,
   wann der Hochladen-Button aktiv wird. Gleicher Stil wie die anderen Info-Boxen. */
.upload-hint-box {
  background: #eaf3fb;
  border: 1px solid #cfe2f3;
  border-radius: 4px;
  padding: 8px 10px;
  font-size: 11px;
  line-height: 1.45;
  color: #2c5777;
}
.imgpicker-upload-actions {
  display: flex; gap: 8px; justify-content: flex-end;
}

/* ── Footer ── */
.imgpicker-footer {
  display: flex; justify-content: flex-end; gap: 8px;
  padding: 10px 18px; border-top: 1px solid var(--border);
  flex-shrink: 0;
  /* sticky am Boden der scrollbaren Box: bei niedrigem Viewport (Edge-Case)
     scrollt die ganze Box, der Footer mit den Action-Buttons soll dabei
     immer sichtbar am Box-Rand kleben. background + z-index, damit der
     Inhalt drueber durchscrollt ohne durch den Footer hindurchzuscheinen. */
  position: sticky;
  bottom: 0;
  background: var(--panel);
  z-index: 10;
}

/* ── Drag-over placeholder ── */
.imgpicker-drag-placeholder {
  width: 72px; min-height: 56px;
  border: 2px dashed var(--green-mid);
  border-radius: 6px;
  background: var(--green-soft);
}

/* ── IMAGE MODAL ─────────────────────────────────────────────────────────────── */
.img-modal {
  position: fixed; inset: 0; z-index: 900;
  display: none;
  align-items: center; justify-content: center;
}
.img-modal:not(.hidden) { display: flex; }

.img-modal-backdrop {
  position: absolute; inset: 0;
  background: rgba(44, 36, 22, 0.72);
  backdrop-filter: blur(4px);
  cursor: pointer;
}

.img-modal-box {
  position: relative; z-index: 1;
  display: flex; flex-direction: column;
  width: min(90vw, calc(50vh * 1.8));
  height: 50vh;
  background: var(--panel);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius);
  box-shadow: var(--shadow-lg);
  overflow: hidden;
}

.img-modal-close {
  position: absolute; top: 10px; right: 10px; z-index: 10;
  width: 28px; height: 28px; padding: 0;
  display: flex; align-items: center; justify-content: center;
  border-radius: 7px; border: 1px solid var(--border-strong);
  background: var(--panel); color: var(--ink-muted);
  cursor: pointer; transition: background .12s, color .12s;
}
.img-modal-close:hover { background: var(--red-soft); color: var(--red); border-color: rgba(192,57,43,.4); }
.img-modal-close svg {
  width: 12px; height: 12px; stroke: currentColor; fill: none;
  stroke-width: 2.5; stroke-linecap: round; pointer-events: none;
}

.img-modal-thumbs {
  display: flex; gap: 6px; align-items: center;
  padding: 8px 10px; flex-shrink: 0;
  border-bottom: 1px solid var(--border);
  overflow-x: auto; overflow-y: hidden;
  scrollbar-width: thin; scrollbar-color: var(--border) transparent;
  background: var(--panel-2);
}

.img-modal-thumb {
  width: 44px; height: 44px; flex-shrink: 0;
  border-radius: 6px; overflow: hidden;
  border: 2px solid transparent;
  cursor: pointer; transition: border-color .12s;
  background: rgba(160,140,100,.12);
  padding: 0;
}
.img-modal-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.img-modal-thumb:hover { border-color: var(--border-strong); }
.img-modal-thumb.active { border-color: var(--green); }

.img-modal-main {
  flex: 1; min-height: 0;
  display: flex; flex-direction: row;
  align-items: center; justify-content: center;
  padding: 10px; gap: 6px;
  position: relative;
}

.img-modal-img {
  max-width: 100%; max-height: 100%;
  object-fit: contain; border-radius: 8px;
  flex: 1; min-width: 0; min-height: 0; align-self: stretch;
  object-position: center;
}

.img-modal-nav {
  flex-shrink: 0;
  width: 32px; height: 32px; padding: 0;
  display: flex; align-items: center; justify-content: center;
  border-radius: 8px;
  border: 1px solid var(--border-strong);
  background: var(--panel);
  color: var(--ink-muted);
  cursor: pointer;
  transition: background .12s, color .12s, border-color .12s;
  align-self: center;
}
.img-modal-nav:hover { background: var(--green-soft); color: var(--green); border-color: var(--green-mid); }
.img-modal-nav svg {
  width: 16px; height: 16px;
  stroke: currentColor; fill: none;
  stroke-width: 2.5; stroke-linecap: round; stroke-linejoin: round;
  pointer-events: none;
}
.img-modal-nav:disabled { opacity: .25; cursor: default; }

.img-modal-caption {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9px;
  color: var(--ink-muted); text-align: center;
  padding: 8px 12px 10px; flex-shrink: 0;
  background: var(--panel);
}

/* ── LOADING OVERLAY ─────────────────────────────────────────────────────── */
.loading-overlay {
  position: fixed; inset: 0; z-index: 1000;
  background: var(--bg);
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 14px;
  transition: opacity .3s;
}
.loading-overlay.fade-out { opacity: 0; pointer-events: none; }
.loading-spinner {
  width: 32px; height: 32px;
  border: 2.5px solid var(--border);
  border-top-color: var(--green);
  border-radius: 50%;
  animation: spin .7s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }
.loading-text {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 11px; color: var(--ink-muted);
}

/* ── TOAST ───────────────────────────────────────────────────────────────── */
.toast {
  position: fixed; top: 20px; left: 50%; transform: translateX(-50%);
  z-index: 999;
  padding: 8px 18px; border-radius: 999px;
  border: 1px solid var(--border-strong);
  background: var(--panel); box-shadow: var(--shadow-lg);
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 11px; color: var(--ink);
  opacity: 0; transition: opacity .2s;
  pointer-events: none; white-space: nowrap;
}
.toast.show { opacity: 1; }
.toast.show.info { pointer-events: auto; }
/* Schließen-X: einziges klickbares Element im Toast (der Toast selbst lässt
   Klicks durch). Erbt die Toast-Farbe, fällt nicht auf, bis man's braucht. */
.toast-close {
  pointer-events: auto;
  margin-left: 12px;
  padding: 0 2px;
  background: none;
  border: none;
  cursor: pointer;
  color: inherit;
  opacity: 0.65;
  font-size: 15px;
  line-height: 1;
  vertical-align: middle;
}
.toast-close:hover { opacity: 1; }
/* Erfolgs-Toast: deckendes Grün + weiße Schrift — vorher war nur die
   Schrift grün auf weißem Panel-Hintergrund, das ging in der Wahrnehmung unter. */
.toast.success { color: #fff; background: #16a34a; border-color: #15803d; }
/* Fehler-Toast: invertiert (roter Fill + weiße Schrift) + 2× Größe.
   Vorher gingen Fehler regelmäßig unter, weil sie sich optisch nur durch
   rote Schrift auf weißem Panel von Info/Erfolg unterschieden. */
.toast.error   {
  color: #fff;
  background: #c0392b;
  border: 2px solid #962b20;
  font-size: 16px;
  padding: 12px 24px;
}
.toast.info    { color: #5a4000; background: #fff8e1; border: 2px solid #f0b800; }
.toast.toast-warn-far { color: #fff; background: #c0392b; border: 2px solid #962b20; }
.toast-action  { color: inherit; text-decoration: underline; cursor: pointer; font-weight: 600; }

/* ── SCROLLBAR ───────────────────────────────────────────────────────────── */
::-webkit-scrollbar { width: 6px; }
::-webkit-scrollbar-thumb { background: var(--border); border-radius: 999px; }
::-webkit-scrollbar-track { background: transparent; }

/* ── ILLUSTRATION ICON PICKER ────────────────────────────────────────────── */
.icon-picker-grid {
  display: flex; flex-wrap: wrap; gap: 6px;
  margin-bottom: 6px;
}
.icon-picker-category {
  width: 100%;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9.5px; font-weight: 600;
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--ink-muted); margin: 6px 0 2px;
}
.icon-picker-btn {
  width: 64px; padding: 6px 4px 4px;
  border-radius: 9px; border: 1.5px solid var(--border);
  background: var(--panel-2); cursor: pointer;
  display: flex; flex-direction: column; align-items: center; gap: 3px;
  transition: border-color .14s, background .14s;
}
.icon-picker-btn svg { width: 40px; height: 40px; }
.icon-picker-btn:hover { border-color: var(--border-strong); background: rgba(160,140,100,.1); }
.icon-picker-btn.selected { border-color: var(--green); background: var(--green-soft); }
.icon-picker-label {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 8.5px;
  color: var(--ink-muted); text-align: center; line-height: 1.2;
  white-space: normal; word-break: break-word;
}
.icon-picker-btn.selected .icon-picker-label { color: var(--green); }

/* ── POI ICON PICKER ────────────────────────────────────────────────── */
.poi-icon-picker-grid {
  display: flex; flex-wrap: wrap; gap: 6px;
  margin-bottom: 6px;
}
.poi-icon-picker-category {
  width: 100%;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9.5px; font-weight: 600;
  letter-spacing: .1em; text-transform: uppercase;
  color: var(--ink-muted); margin: 6px 0 2px;
}
.poi-icon-picker-btn {
  width: 64px; padding: 6px 4px 4px;
  border-radius: 9px; border: 1.5px solid var(--border);
  background: rgba(120,105,80,.12); cursor: pointer;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px;
  transition: border-color .14s, background .14s;
}
.poi-icon-picker-btn svg { width: 28px; height: 28px; }
.poi-icon-picker-btn:hover { border-color: var(--border-strong); background: rgba(120,105,80,.2); }
.poi-icon-picker-btn.selected { border-color: var(--green); background: var(--green-soft); }
.poi-icon-picker-label {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 8.5px;
  color: var(--ink-muted); text-align: center; line-height: 1.2;
  white-space: normal; word-break: break-word;
  max-width: 58px;
}
.poi-icon-picker-btn.selected .poi-icon-picker-label { color: var(--green); }
.poi-icon-picker-btn.none-btn { background: var(--panel); }
.poi-icon-picker-btn.none-btn svg { opacity: .5; }

.slider-form-row {
  display: flex; align-items: center; gap: 8px;
}
.slider-form-row input[type=range] { flex: 1; }
.slider-val {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 11px;
  color: var(--ink); min-width: 36px; text-align: right;
}
.btn-sm { height: 26px; padding: 0 8px; font-size: 11px; }

/* ── SCALE LINE ────────────────────────────────────────────────────────────── */
#scaleLineContainer { position: absolute; bottom: 12px; left: 12px; z-index: 20; }
#scaleLineContainer .ol-scale-bar {
  background: rgba(242,237,227,0.92);
  border-radius: 6px;
  padding: 4px 8px;
  border: 1px solid var(--border);
  box-shadow: var(--shadow-sm);
}
#scaleLineContainer .ol-scale-bar-inner { border: 2px solid var(--ink); }
#scaleLineContainer .ol-scale-step-marker { background: var(--ink); }
#scaleLineContainer .ol-scale-text {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 10px;
  color: var(--ink);
}

/* ── Layer-Toggle-Panel (schwebend auf der Karte, rechts oben) ─────────────── */
.map-toggle-panel {
  position: absolute; top: 12px; right: 12px;
  z-index: 20;
  min-width: 180px;
  background: var(--panel);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow);
  overflow: hidden;
  display: flex; flex-direction: column;
}
.map-toggle-panel.is-collapsed .layer-toggle-body { display: none; }
.map-toggle-panel.is-collapsed .layer-toggle-chev { transform: rotate(-90deg); }

/* Bild-Korrektur-Panel sitzt links neben dem Layer-Panel (gleiche Optik). */
/* 180px (layer-min-width) + 12px Gap + 12px Right-Offset = 204px */
/* max-width verhindert dass langer Hilfetext (Mask-Editor) das Panel über
   den ganzen Screen aufzieht — sonst gibt's keinen Wrap-Anker upstream. */
#overlayCorrectionPanel { right: 204px; max-width: 320px; }

/* Mask-Editing-Lock: solange der User die Außengrenze bearbeitet, kann das
   Panel nicht mehr collapsed werden (Speichern/Abbrechen-Buttons müssen
   sichtbar bleiben). Header zeigt das visuell durch deaktivierten Cursor +
   keinem Hover-Effekt. JS-Toggle in initMaskEditorUI.refresh(). */
#overlayCorrectionPanel.mask-editing-lock .layer-toggle-header {
  cursor: default;
}
#overlayCorrectionPanel.mask-editing-lock .layer-toggle-header:hover {
  background: transparent;
  color: var(--ink-muted);
}
#overlayCorrectionPanel.mask-editing-lock .layer-toggle-chev {
  visibility: hidden;
}

.layer-toggle-header {
  display: flex; align-items: center; justify-content: space-between;
  padding: 8px 12px;
  border: none; background: transparent;
  color: var(--ink-muted);
  cursor: pointer;
  font: 600 11px/1 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  transition: background .15s, color .15s;
}
.layer-toggle-header:hover { background: rgba(0,0,0,0.04); color: var(--ink); }
.layer-toggle-chev {
  width: 14px; height: 14px;
  fill: none; stroke: currentColor; stroke-width: 2;
  stroke-linecap: round; stroke-linejoin: round;
  transition: transform .2s;
}

.layer-toggle-body {
  display: flex; flex-direction: column;
  padding: 4px 6px 6px;
  border-top: 1px solid var(--border-strong);
}
.layer-toggle-section-title {
  font: 600 9px/1 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-muted);
  padding: 10px 6px 4px;
}
.layer-toggle-section-title:first-child { padding-top: 4px; }
.layer-toggle-row {
  display: flex; align-items: center; gap: 6px;
  padding: 3px 6px;
  border-radius: var(--radius-sm);
  transition: background .15s;
}
.layer-toggle-row:hover { background: rgba(0,0,0,0.03); }
.layer-toggle-label {
  flex: 1;
  font-size: 13px;
  color: var(--ink);
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
}

.layer-toggle-btn {
  display: flex; align-items: center; justify-content: center;
  width: 28px; height: 28px;
  padding: 4px; border: none; background: none;
  color: var(--ink-muted); cursor: pointer;
  border-radius: var(--radius-sm);
  transition: color .15s, background .15s, opacity .15s;
}
.layer-toggle-btn:hover { background: rgba(0,0,0,.06); color: var(--ink); }
.layer-toggle-btn.eye-btn svg { width: 18px; height: 18px; }
.layer-toggle-btn.eye-btn.is-off { color: var(--red); opacity: 0.7; }
.layer-toggle-btn.abc-btn {
  font: 600 10px/1 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; letter-spacing: .03em;
  opacity: 0.45;
}
.layer-toggle-btn.abc-btn.is-on { opacity: 1; color: var(--ink); }

/* ── Inline Button Spinner (withSpinner-Helper) ─────────────────────────── */
.btn-spinner {
  display: inline-block;
  width: 12px;
  height: 12px;
  border: 2px solid currentColor;
  border-right-color: transparent;
  border-radius: 50%;
  animation: btnSpin 0.7s linear infinite;
  vertical-align: -2px;
  margin-right: 6px;
}
@keyframes btnSpin { to { transform: rotate(360deg); } }

/* ── PRINT-EDITOR (Druckkarten-Wizard, Phase B) ───────────────────────────
   Layout für /print-maps/edit/{id} — Step 1 (Karten-Auswahl) + Step 2
   (Layout-Editor, Phase C). Beide leben in derselben Page als 2 DIVs, JS
   togglet Sichtbarkeit. Design folgt der Camply-UI: beige Panels, schmale
   Mono-Labels, grüne Akzente. */

.printmap-step {
  display: flex;
  height: calc(100vh - 200px); /* Topbar + Settings-Toolbar abziehen */
  min-height: 600px;
  background: var(--panel-2);
}
.printmap-step.hidden { display: none; }

/* ── Step1 → Step2 Übergangs-Overlay ───────────────────────────────────────
   Karten-Export + Konva-Init dauern zusammen tlw. mehrere Sekunden — User
   braucht klares Loading-Feedback, sonst wirkt das UI eingefroren.
   Fullscreen-Backdrop mit halbtransparentem Schwarz + zentrierte Pill mit
   Spinner und Text. */
.print-transition-overlay {
  position: fixed;
  inset: 0;
  z-index: 9500;
  background: rgba(20, 18, 14, 0.55);
  -webkit-backdrop-filter: blur(2px);
  backdrop-filter: blur(2px);
  display: flex;
  align-items: center;
  justify-content: center;
  pointer-events: all;
}
.print-transition-overlay.hidden { display: none; }
.print-transition-box {
  background: #fff;
  border-radius: 14px;
  padding: 28px 36px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 18px;
  box-shadow: 0 8px 28px rgba(0, 0, 0, 0.35);
  min-width: 280px;
}
.print-transition-spinner {
  width: 56px;
  height: 56px;
  border: 5px solid rgba(192, 57, 43, 0.18);
  border-top-color: #c0392b;
  border-radius: 50%;
  animation: printTransitionSpin 0.9s linear infinite;
}
.print-transition-label {
  font-size: 14px;
  font-weight: 500;
  color: #2c3e50;
  letter-spacing: 0.01em;
  text-align: center;
}
.print-transition-hint {
  font-size: 12px;
  font-weight: 400;
  color: #7f8c8d;
  text-align: center;
  margin-top: -6px;
}
@keyframes printTransitionSpin {
  to { transform: rotate(360deg); }
}

.print-step-heading {
  margin: 0 0 12px;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 1.1rem;
  font-weight: 600;
  color: var(--ink);
}

/* ── Step 1: linke Sidebar mit Form-Inputs ── */
.print-step1-sidebar {
  width: 476px;
  flex-shrink: 0;
  background: var(--panel);
  border-right: 1px solid var(--border);
  display: flex;
  flex-direction: column;
  /* Kein overflow am Aussen-Container — Scroll passiert im inneren
     .print-step1-sidebar-scroll, damit der Übernehmen-Footer immer
     sichtbar bleibt und nicht mit ans Ende des Accordeons rutscht. */
  overflow: hidden;
  min-height: 0;
}
.print-step1-sidebar-scroll {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  padding: 16px 18px;
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.print-step1-sidebar-footer {
  flex-shrink: 0;
  padding: 12px 18px;
  background: var(--panel);
  border-top: 1px solid var(--border);
}
.print-field {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
/* Zwei (oder mehr) .print-field nebeneinander, gleichmäßig verteilt — wird
 * z.B. für Papierformat + Orientierung in Step 1 verwendet. */
.print-field-row {
  display: flex;
  gap: 12px;
}
.print-field-row > .print-field {
  flex: 1;
  min-width: 0;
}
.print-field-label {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 9.5px;
  color: var(--ink-muted);
  letter-spacing: .06em;
  text-transform: uppercase;
}
.print-input {
  width: 100%;
  padding: 7px 10px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: rgba(255, 255, 255, 0.5);
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: .95rem;
  color: var(--ink);
  outline: none;
  transition: border-color .14s, box-shadow .14s;
  -webkit-appearance: none;
}
/* Selects: -webkit-appearance:none entfernt den nativen Dropdown-Pfeil.
 * Wir setzen einen eigenen Chevron als SVG-Background, plus rechts
 * Padding-Space dafür. */
select.print-input {
  appearance: none;
  -moz-appearance: none;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%235a4a30' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>");
  background-repeat: no-repeat;
  background-position: right 10px center;
  background-size: 12px 12px;
  padding-right: 30px;
  cursor: pointer;
}
select.print-input:disabled {
  cursor: not-allowed;
  opacity: 0.6;
}
.print-input:focus {
  border-color: var(--green);
  box-shadow: 0 0 0 3px var(--green-soft);
}
/* Inline-Validation: Input mit Fehler wird rot umrandet, Focus gibt einen
   roten Halo statt dem grünen. Der Hint darunter blendet sich ein. */
.print-input.has-error {
  border-color: var(--red);
}
.print-input.has-error:focus {
  border-color: var(--red);
  box-shadow: 0 0 0 3px var(--red-soft);
}
.print-field-hint {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: .82rem;
  color: var(--ink-muted);
  display: none;
  margin-top: 2px;
}
.print-field-hint.is-visible {
  display: block;
}
.print-field-hint-error.is-visible {
  color: var(--red);
}
/* Info-Variante: immer sichtbar (kein .is-visible-Toggle), dezent grau,
   leichte Hintergrundtoenung damit der Hinweis nicht im Layout untergeht.
   Wird z.B. unter den disabled Format-Pulldowns angezeigt. */
.print-field-hint-info {
  display: block;
  margin-top: 6px;
  padding: 6px 10px;
  background: rgba(80, 140, 220, 0.08);
  border-left: 2px solid rgba(40, 90, 160, 0.30);
  border-radius: 2px;
  color: var(--ink);
  line-height: 1.4;
}
.print-fieldset {
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 10px 12px;
  margin: 0;
  background: rgba(255, 255, 255, 0.3);
  display: flex;
  flex-direction: column;
  gap: 6px;
}

/* ── Auswahl-Accordion (Kategorien + Items pro Layer-Typ) ──
 * Top-Level: <details> pro Layer-Typ (POIs/Wege/Unterkünfte).
 * Innen: <details> pro Kategorie mit Tristate-Checkbox + Color-Dot.
 * Items als <ul>-Liste, jeder mit Icon + Checkbox. */
.print-accordion {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.print-accordion-section {
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: rgba(255, 255, 255, 0.3);
  overflow: hidden;
}
.print-accordion-summary {
  list-style: none;
  cursor: pointer;
  padding: 8px 12px;
  display: flex;
  align-items: center;
  gap: 8px;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 10px;
  letter-spacing: .06em;
  text-transform: uppercase;
  color: var(--ink-muted);
  user-select: none;
}
.print-accordion-summary::-webkit-details-marker { display: none; }
.print-accordion-summary::before {
  content: '\25B6';
  font-size: 9px;
  width: 12px;
  transition: transform .14s ease;
}
.print-accordion-section[open] > .print-accordion-summary::before {
  transform: rotate(90deg);
}
.print-accordion-title {
  flex: 1;
  font-weight: 600;
}
.print-accordion-count {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 12px;
  color: var(--ink-muted);
  text-transform: none;
  letter-spacing: 0;
}
.print-accordion-body {
  /* Linkes Padding größer (24 statt 10), damit die Kategorie-Items unter
   * dem Sektion-Title eingerückt sitzen statt links vom Header zu starten —
   * macht die Hierarchie visuell klar. */
  padding: 4px 10px 10px 24px;
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.print-accordion-cat {
  border-radius: 4px;
  background: rgba(255, 255, 255, 0.4);
}
.print-accordion-cat-summary {
  list-style: none;
  cursor: pointer;
  padding: 6px 8px;
  display: flex;
  align-items: center;
  gap: 8px;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 13.5px;
  color: var(--ink);
  user-select: none;
}
.print-accordion-cat-summary::-webkit-details-marker { display: none; }
/* Auf-/Zu-Dreieck VOR der Kategorie — selbes Pattern wie Top-Section-Header
 * (::before mit ▶, rotiert 90° wenn open). */
.print-accordion-cat-summary::before {
  content: '\25B6';
  font-size: 9px;
  width: 12px;
  color: var(--ink-muted);
  transition: transform .14s ease;
  flex-shrink: 0;
}
.print-accordion-cat[open] > .print-accordion-cat-summary::before {
  transform: rotate(90deg);
}
.print-accordion-cat-cb {
  flex-shrink: 0;
  cursor: pointer;
}
.print-accordion-cat-dot {
  width: 12px; height: 12px;
  border-radius: 50%;
  flex-shrink: 0;
  border: 1px solid rgba(0,0,0,0.15);
}
.print-accordion-cat-name {
  flex: 1;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.print-accordion-cat-count {
  font-size: 11px;
  color: var(--ink-muted);
  font-variant-numeric: tabular-nums;
  flex-shrink: 0;
}

.print-accordion-item-list {
  list-style: none;
  margin: 0;
  /* Linkes Padding 36 statt 24 px: damit Einzel-Items deutlich unter den
   * Kategorie-Headern eingerückt sitzen (Kategorie sitzt bei ~32 px, Items
   * starten bei ~36 px innerhalb der Liste → klar sichtbare Hierarchie). */
  padding: 4px 0 6px 36px;
  display: flex;
  flex-direction: column;
  gap: 3px;
  max-height: 240px;
  overflow-y: auto;
}
.print-accordion-item {
  margin: 0;
}
.print-accordion-item-label {
  display: flex;
  align-items: center;
  gap: 8px;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 12.5px;
  color: var(--ink);
  cursor: pointer;
  padding: 2px 4px;
  border-radius: 3px;
}
.print-accordion-item-label:hover {
  background: rgba(0,0,0,0.04);
}
.print-accordion-item-cb {
  flex-shrink: 0;
  cursor: pointer;
}
.print-accordion-item-icon {
  width: 16px; height: 16px;
  flex-shrink: 0;
}
.print-accordion-item-icon-empty {
  width: 16px; height: 16px;
  flex-shrink: 0;
}
.print-accordion-item-name {
  flex: 1;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
/* POI-Items im Step-1-Selektor haben einen 3-State-Mode-Selector statt einer
   einfachen Checkbox: 3 kleine Icon-Buttons vor dem POI-Namen (X / Farbpunkt
   / POI-Icon). Aktiver Mode ist optisch hervorgehoben. */
.print-accordion-item-poi {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 2px 4px;
  border-radius: 3px;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 12.5px;
  color: var(--ink);
}
.print-accordion-item-poi:hover {
  background: rgba(0, 0, 0, 0.04);
}
.print-poi-mode-group {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  flex-shrink: 0;
}
.print-poi-mode-btn {
  width: 22px;
  height: 22px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  background: transparent;
  border: 1px solid transparent;
  border-radius: 3px;
  cursor: pointer;
  color: var(--ink-muted);
  opacity: 0.45;
  transition: opacity .12s, background-color .12s, border-color .12s;
}
.print-poi-mode-btn:hover {
  opacity: 1;
  background: rgba(0, 0, 0, 0.05);
}
.print-poi-mode-btn.is-active {
  opacity: 1;
  background: var(--green-soft, rgba(46, 102, 54, 0.12));
  border-color: var(--green, #2e6636);
  color: var(--green, #2e6636);
}
.print-poi-mode-btn img {
  width: 14px;
  height: 14px;
  pointer-events: none;
}
.print-poi-mode-dot {
  display: inline-block;
  width: 12px;
  height: 12px;
  border-radius: 50%;
  border: 1px solid rgba(0, 0, 0, 0.18);
  pointer-events: none;
}
.print-fieldset legend {
  padding: 0 6px;
}
.print-checkbox {
  display: flex;
  align-items: center;
  gap: 8px;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: .9rem;
  color: var(--ink);
  cursor: pointer;
}
.print-checkbox input[type="checkbox"] {
  accent-color: var(--green);
  cursor: pointer;
}
.print-btn-accept {
  width: 100%;
  justify-content: center;
}

/* ── Step 1: Karten-Container + Druckrahmen-Overlay ──
 * .print-step1-map-wrap ist jetzt ein Spalten-Flex: oben eine Toolbar (blaue
 * Info-Box + Zoom-Buttons), darunter der eigentliche Karten-Container.
 * .print-step1-map-inner trägt das `position:relative` für das absolute
 * positionierte Druckrahmen-Overlay. */
.print-step1-map-wrap {
  flex: 1;
  display: flex;
  flex-direction: column;
  background: #1a1a1a;
  overflow: hidden;
}
.print-step1-map-toolbar {
  flex-shrink: 0;
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 8px;
  padding: 10px 12px;
  background: var(--panel);
  border-bottom: 1px solid var(--border);
}
.print-step1-map-toolbar-row {
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
}
.print-step1-zoom-buttons {
  display: flex;
  gap: 6px;
  flex-shrink: 0;
}
.print-step1-zoom-buttons .btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.print-step1-map-inner {
  flex: 1;
  position: relative;
  overflow: hidden;
}
.print-step1-map {
  width: 100%;
  height: 100%;
}
/* Karten-Frame: frei resizable per 8 Handles. .print-frame selbst hat
   pointer-events:none, damit Map-Pan im Inneren weiter geht; nur die Handles
   haben pointer-events:auto. Position wird per left/top/width/height vom JS
   gesetzt (initFreeFrame + onFrameDrag), KEIN translate(-50%) mehr — das JS
   rechnet absolut. Außenbereich abdimmen via großem rgba-shadow nach außen. */
.print-frame {
  position: absolute;
  border: 2px dashed rgba(255, 255, 255, .85);
  box-shadow: 0 0 0 9999px rgba(0, 0, 0, .35);
  pointer-events: none;
  border-radius: 2px;
}
.print-frame-handle {
  position: absolute;
  width: 14px;
  height: 14px;
  background: #fff;
  border: 1.5px solid rgba(0, 0, 0, .85);
  border-radius: 3px;
  box-shadow: 0 1px 3px rgba(0, 0, 0, .35);
  pointer-events: auto;
  touch-action: none;
  box-sizing: border-box;
}
/* Kanten-Handles: jeweils Mitte der Seite */
.print-frame-handle.is-edge.is-n {
  top: -7px;
  left: 50%;
  transform: translateX(-50%);
  cursor: ns-resize;
}
.print-frame-handle.is-edge.is-s {
  bottom: -7px;
  left: 50%;
  transform: translateX(-50%);
  cursor: ns-resize;
}
.print-frame-handle.is-edge.is-e {
  right: -7px;
  top: 50%;
  transform: translateY(-50%);
  cursor: ew-resize;
}
.print-frame-handle.is-edge.is-w {
  left: -7px;
  top: 50%;
  transform: translateY(-50%);
  cursor: ew-resize;
}
/* Ecken-Handles */
.print-frame-handle.is-corner.is-nw {
  top: -7px;
  left: -7px;
  cursor: nwse-resize;
}
.print-frame-handle.is-corner.is-ne {
  top: -7px;
  right: -7px;
  cursor: nesw-resize;
}
.print-frame-handle.is-corner.is-sw {
  bottom: -7px;
  left: -7px;
  cursor: nesw-resize;
}
.print-frame-handle.is-corner.is-se {
  bottom: -7px;
  right: -7px;
  cursor: nwse-resize;
}
/* Locked-State: nach erstem Save (#formatLocked) — Handles unsichtbar +
   nicht-interaktiv. .print-frame bekommt die Klasse vom JS gesetzt. */
.print-frame.is-locked .print-frame-handle {
  display: none;
}

/* ── Step 2: Konva-Editor (Phase C) ─────────────────────────────────────── */
/* Toolbar oben, Stage zentral, Properties-Panel rechts. Stage-Wrap hat dunklen
   Hintergrund damit das weiße Papier sich abhebt; bei Bedarf scrollbar. */

#stepWrap2.printmap-step {
  flex-direction: column;
}
.print-step2-toolbar {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 18px;
  background: var(--panel);
  border-bottom: 1px solid var(--border);
  flex-shrink: 0;
  flex-wrap: wrap;
}
.print-toolbar-divider {
  width: 1px;
  height: 22px;
  background: var(--border);
  margin: 0 4px;
}
/* Display-Zoom-Buttons in der Step-2-Toolbar — kompakte Gruppe (− [Fit %] +).
   Der Fit-Button zeigt das aktuelle Zoom-Level als Label, Klick setzt
   isFitMode → auto-fit beim Window-Resize. */
.print-step2-zoom-controls {
  display: inline-flex;
  align-items: center;
  gap: 2px;
}
.print-step2-zoom-controls .btn {
  padding: 4px 8px;
  min-width: 28px;
}
.print-step2-zoom-controls #btnZoomFit {
  min-width: 56px;
  font-variant-numeric: tabular-nums;
  font-size: 12px;
}
/* Save-Button-State: oranger Punkt vor dem Label wenn ungespeicherte Änderungen
   da sind. Disabled (clean state) übernimmt der .btn:disabled-Style oben. */
#btnSavePrintmap.is-dirty::before {
  content: '●';
  margin-right: 6px;
  color: #e67e22; /* orange — bewusst nicht green/red, signalisiert "Aufmerksamkeit" */
  font-size: 14px;
  line-height: 1;
}
/* Während Save läuft, wird die Tile-Hover-Anim-Tendenz gedämpft. */
#btnSavePrintmap.is-busy {
  opacity: .65;
}
.print-step2-main {
  flex: 1;
  display: flex;
  min-height: 0;
}
.print-step2-stage-wrap {
  flex: 1;
  /* Kein Hintergrund — der Wrap ist transparent, damit der parent-Beige
     (var(--panel-2) aus .printmap-step) durchschimmert und das Konva-
     Rotationshandle (das oberhalb der Stage ragt) optisch sichtbar bleibt. */
  background: transparent;
  display: flex;
  /* safe center: zentriert solange die Stage ins Wrap passt, fällt aber auf
     start zurück sobald sie überlauft. Sonst clippt Flexbox die obere/linke
     Hälfte UNERREICHBAR — overflow:auto kann nicht zu negativen Positionen
     scrollen. Tritt im Hochformat regelmäßig auf (Stage ~1513 px hoch). */
  align-items: safe center;
  justify-content: safe center;
  overflow: auto;
  padding: 24px;
}
.print-step2-stage {
  /* Kein eigenes Background/Shadow mehr — das weiße Papier wird von Konva als
     Konva.Rect mit Schatten gerendert (siehe print-wizard-step2.js → bgLayer).
     Vorteil: das Margin um die Page liegt INNERHALB der Stage und gibt den
     Konva-Transformer-Handles (insb. Rotation) Platz. */
}
/* Right-Panel mit Tab-Bar — feste Breite, scrollbar pro Tab-Panel */
.print-step2-props {
  width: 300px;
  flex-shrink: 0;
  background: var(--panel);
  border-left: 1px solid var(--border);
  display: flex;
  flex-direction: column;
  min-height: 0; /* damit overflow:auto im Tab-Panel greift */
}
.print-tabs {
  display: flex;
  border-bottom: 1px solid var(--border);
  background: var(--panel-2);
  flex-shrink: 0;
}
.print-tab {
  flex: 1;
  padding: 10px 12px;
  background: transparent;
  border: none;
  border-bottom: 2px solid transparent;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--ink-muted);
  cursor: pointer;
  transition: color .14s, border-color .14s, background .14s;
}
.print-tab:hover {
  color: var(--ink);
}
.print-tab.is-active {
  color: var(--green);
  border-bottom-color: var(--green);
  background: var(--panel);
}
.print-tab-panel {
  display: none;
  flex: 1;
  overflow-y: auto;
  padding: 16px 18px;
  flex-direction: column;
  gap: 12px;
  min-height: 0;
}
.print-tab-panel.is-active {
  display: flex;
}

/* Layer-Liste — oben = vorderster Layer (Photoshop-Konvention).
   .is-selected hebt das aktuell selektierte Item visuell hervor. */
.print-layer-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.print-layer-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 10px;
  background: var(--panel-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  cursor: pointer; /* Klick auf Item-Body = Selektion. Nur Drag-Handle ist grab. */
  transition: border-color .12s, background .12s;
}
/* 6-Punkt-Grip vor jedem Item — SortableJS reagiert ausschließlich darauf
   (handle:'.print-layer-drag-handle'), damit Klick auf Item-Body nicht
   versehentlich einen Drag startet. */
.print-layer-drag-handle {
  width: 14px;
  height: 18px;
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: grab;
  color: var(--ink-muted);
  opacity: .55;
  transition: opacity .12s, color .12s;
}
.print-layer-drag-handle:hover {
  opacity: 1;
  color: var(--ink);
}
.print-layer-drag-handle:active {
  cursor: grabbing;
}
.print-layer-drag-handle svg {
  width: 14px;
  height: 14px;
}
.print-layer-item:hover {
  border-color: var(--border-strong);
  background: rgba(160, 140, 100, .12);
}
.print-layer-item.is-selected {
  border-color: var(--green);
  background: var(--green-soft);
}
.print-layer-item.is-dragging {
  opacity: .5;
}
/* Background-Layer ist gepinnt — kein Drag-Handle, kein Hover-Cursor zum
   Verschieben. Klick auf Item-Body wählt ihn weiterhin aus, deshalb bleibt
   cursor:pointer. Drag-Handle-Slot wird als Platzhalter beibehalten damit
   Icon/Name in einer Linie mit den anderen Einträgen stehen. */
.print-layer-item.is-pinned {
  cursor: pointer;
}
.print-layer-drag-handle.is-disabled {
  cursor: default;
  opacity: 0;
  pointer-events: none;
}
/* Edit-Icon (Bleistift) zwischen Drag-Handle und Element-Icon — einziger
   Klick-Punkt der in den Eigenschaften-Tab springt. Layer-Zeilen-Body-Klick
   selektiert nur. Als <button> für Tastatur-Accessibility. */
.print-layer-edit-icon {
  width: 22px;
  height: 22px;
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  background: transparent;
  border: 1px solid transparent;
  border-radius: var(--radius-sm);
  cursor: pointer;
  color: var(--ink-muted);
  opacity: 0.55;
  transition: opacity .15s, background-color .15s, color .15s;
}
.print-layer-edit-icon:hover,
.print-layer-edit-icon:focus-visible {
  opacity: 1;
  color: var(--green);
  background: var(--green-soft);
  outline: none;
}
.print-layer-edit-icon svg {
  width: 13px;
  height: 13px;
}
.print-layer-item.is-selected .print-layer-edit-icon {
  opacity: 1;
  color: var(--green);
}
/* Background-Gradient-Richtungs-Picker — 3×3-Grid mit 8 Pfeil-Buttons (center
   ist Spacer, weil "kein Verlauf" über den Toggle oben gesteuert wird). */
.print-bg-dir-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 4px;
  max-width: 132px;
}
.print-bg-dir-btn {
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--panel-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  cursor: pointer;
  font-size: 1.15rem;
  line-height: 1;
  color: var(--ink);
  padding: 0;
}
.print-bg-dir-btn:hover {
  background: rgba(160, 140, 100, .12);
}
.print-bg-dir-btn.is-active {
  background: var(--green-soft);
  border-color: var(--green);
  color: var(--green);
}
.print-bg-dir-spacer {
  display: block;
}
/* QR-Code: Readonly-URL-Anzeige beim Mobile-Karten-QR. Deutlich abgesetzt
   vom editierbaren Custom-URL-Input — der User soll sofort sehen dass die
   URL nicht änderbar ist. */
.print-input-readonly {
  background: var(--panel-2);
  color: var(--ink-muted);
  cursor: not-allowed;
  border-style: dashed;
}
.print-input-readonly:focus {
  outline: none;
  box-shadow: none;
  border-color: var(--border);
}
.print-field-label-locked {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: var(--ink-muted);
}
/* Legenden-Kategorien-Selektor — Checkbox-Liste mit Swatch + Name pro Eintrag.
   User toggelt welche Kategorien aus dem Snapshot in DIESER Legende erscheinen,
   damit man eine lange Liste auf mehrere Legenden aufteilen kann. */
.print-legend-cats-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  margin-bottom: 6px;
}
.print-legend-cats-bulk {
  display: inline-flex;
  gap: 4px;
}
.print-legend-cats-list {
  display: flex;
  flex-direction: column;
  gap: 2px;
  max-height: 220px;
  overflow-y: auto;
  padding: 4px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--panel-2);
}
.print-legend-cat-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 4px 6px;
  cursor: pointer;
  border-radius: var(--radius-sm);
  user-select: none;
}
.print-legend-cat-item:hover {
  background: rgba(160, 140, 100, .1);
}
.print-legend-cat-swatch {
  width: 14px;
  height: 14px;
  flex-shrink: 0;
  border-radius: 50%;
  border: 1px solid rgba(0, 0, 0, 0.15);
  position: relative;
  overflow: hidden;
}
.print-legend-cat-icon {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 80%;
  height: 80%;
  transform: translate(-50%, -50%);
  pointer-events: none;
  filter: drop-shadow(0 0 1px rgba(255, 255, 255, 0.6));
}
.print-legend-cat-name {
  flex: 1;
  min-width: 0;
  font-size: .9rem;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.print-legend-cats-empty {
  padding: 8px;
  text-align: center;
  color: var(--ink-muted);
  font-style: italic;
  font-size: .85rem;
}
/* Einzel-POIs liegen in einer eigenen Liste unter den Kategorien — visuell
   etwas kompakter (kürzere max-height), damit beide Listen gleichzeitig
   sichtbar bleiben ohne dass das Properties-Panel ewig lang wird. */
.print-legend-cats-list-pois {
  max-height: 160px;
}
/* Spalten-Picker à la MS Word: 4 kleine Icon-Buttons in einer Reihe, jeweils
   ein Rechteck mit (n-1) vertikalen Strichen. Aktiver Button ist grün
   hervorgehoben, inaktive sind gedimmt. */
.print-legend-col-group {
  display: inline-flex;
  gap: 4px;
}
.print-legend-col-btn {
  width: 36px;
  height: 26px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  background: var(--panel-2);
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  cursor: pointer;
  color: var(--ink-muted);
  transition: background-color .12s, border-color .12s, color .12s;
}
.print-legend-col-btn:hover {
  background: rgba(160, 140, 100, .12);
  color: var(--ink);
}
.print-legend-col-btn.is-active {
  background: var(--green-soft);
  border-color: var(--green);
  color: var(--green);
}
.print-legend-col-btn svg {
  width: 24px;
  height: 16px;
}
.print-layer-icon {
  width: 18px;
  height: 18px;
  flex-shrink: 0;
  color: var(--ink-muted);
}
.print-layer-item.is-selected .print-layer-icon {
  color: var(--green);
}
.print-layer-name {
  flex: 1;
  min-width: 0;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: .9rem;
  color: var(--ink);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.print-layer-empty {
  padding: 16px 0;
  text-align: center;
  color: var(--ink-muted);
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: .9rem;
  font-style: italic;
}
/* Hint unter der Liste — Text wird vom JS gesetzt (1 Layer vs n Layer). */
.print-layer-hint {
  padding: 12px 4px 4px;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: .82rem;
  line-height: 1.45;
  color: var(--ink-muted);
  border-top: 1px dashed var(--border);
  margin-top: 4px;
}
.print-layer-hint:empty {
  display: none;
}
.print-props-empty {
  color: var(--ink-muted);
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: .9rem;
  font-style: italic;
  padding: 16px 0;
  text-align: center;
}
.print-props-section-title {
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 1rem;
  font-weight: 600;
  color: var(--ink);
  margin: 0 0 4px;
  padding-bottom: 6px;
  border-bottom: 1px solid var(--border);
}
/* Properties-Panel-Container: flex-column mit großzügigem Abstand zwischen
   Property-Zeilen, damit klar ist welche Label zu welchem Input gehören. */
#propsPanel {
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.print-props-row {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.print-props-row-inline {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
}
.print-props-delete {
  margin-top: 8px;
  width: 100%;
  justify-content: center;
}
/* ⊖/⊕ Skalierungs-Buttons im Properties-Panel — gleichgroße Buttons in einer
   Reihe mit Symbol + Text-Label. */
.print-props-scale-buttons {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 6px;
}
.print-props-scale-buttons .btn {
  width: 100%;
  justify-content: center;
}

/* ───────────────────────────────────────────────────────────────────────────
   AREA-SPLIT — Mehrere Plätze in einer Wege-umschlossenen Fläche anlegen
   modules/area-split/* — Picker → Grid-Tool → Confirm → Batch-Create
   ─────────────────────────────────────────────────────────────────────────── */

/* Loading-Hint direkt am Cursor (statt globaler Top-Center-Toast).
   Hervorhebung über Karte + Schatten, pointer-events:none damit er weder
   Klicks blockiert noch Hover-Effekte stört. */
.areasplit-searching-hint {
  position: fixed;
  z-index: 1300;
  background: rgba(44, 62, 80, 0.94);
  color: #fff;
  padding: 6px 12px;
  border-radius: 4px;
  font-size: 13px;
  pointer-events: none;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  box-shadow: 0 2px 8px rgba(0,0,0,0.35);
  white-space: nowrap;
}
.areasplit-searching-hint.hidden {
  display: none;
}

/* Trenner zwischen Standard-„Neu" und „Mehrere Plätze" im Topbar-Pulldown */
.newobj-menu-sep {
  border: 0;
  border-top: 2px solid var(--border-strong);
  margin: 0;
}
/* Der Eintrag direkt über dem Trenner hat selbst einen Bottom-Border — der
   würde mit dem Trenner eine doppelte Linie ergeben. Hier unterdrücken, damit
   genau EINE (etwas kräftigere) Trennlinie bleibt. */
.hilfskarte-menu .map-layer-btn:has(+ .newobj-menu-sep) {
  border-bottom: none;
}

/* Status-Bar: schwebt oben mittig, gibt den User Anweisungen im aktiven Modus.
   Im Hybrid-UX hat sie zusätzlich Action-Buttons (Verwenden, Manuell zeichnen,
   Abbrechen) — daher pointer-events: auto und ein gap für die Button-Reihe. */
.areasplit-status-bar {
  position: fixed;
  top: 70px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 1200;
  background: #2c3e50;
  color: #fff;
  padding: 8px 14px;
  border-radius: 20px;
  font-size: 14px;
  box-shadow: 0 4px 12px rgba(0,0,0,0.25);
  display: flex;
  align-items: center;
  gap: 12px;
}
.areasplit-status-bar.hidden {
  display: none;
}
.areasplit-status-text {
  font-size: 14px;
}
.areasplit-status-btn {
  font-size: 12px;
  padding: 5px 10px;
  border-radius: 12px;
  border: 1px solid rgba(255,255,255,0.35);
  background: rgba(255,255,255,0.08);
  color: #fff;
  cursor: pointer;
  white-space: nowrap;
}
.areasplit-status-btn:hover:not(:disabled) {
  background: rgba(255,255,255,0.18);
}
.areasplit-status-btn.primary {
  background: #27ae60;
  border-color: #27ae60;
}
.areasplit-status-btn.primary:hover:not(:disabled) {
  background: #229954;
}
.areasplit-status-btn.ghost {
  background: transparent;
  border-color: rgba(255,255,255,0.25);
  color: rgba(255,255,255,0.75);
}
/* "Fläche trotzdem verwenden" — orange-warnend zwischen Primary und Ghost,
   damit klar ist dass die Aktion erlaubt aber bewusst ist. */
.areasplit-force-btn {
  background: rgba(230, 126, 34, 0.85);
  border-color: rgba(230, 126, 34, 0.95);
}
.areasplit-force-btn:hover:not(:disabled) {
  background: rgba(230, 126, 34, 1);
}
.areasplit-status-btn:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}
.areasplit-snap-btn { display: inline-flex; align-items: center; gap: 6px; }
.areasplit-snap-btn kbd {
  font: 600 10px/1 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  padding: 2px 5px;
  border-radius: 4px;
  background: rgba(0,0,0,0.35);
  border: 1px solid rgba(255,255,255,0.25);
  color: #fff;
}
.areasplit-snap-btn.is-off {
  background: rgba(192, 57, 43, 0.75);
  border-color: rgba(192, 57, 43, 0.9);
}
.areasplit-snap-btn.is-off:hover:not(:disabled) {
  background: rgba(192, 57, 43, 0.9);
}

/* Tool-Panel: sitzt rechts oben IN DER KARTE (innerhalb .map-shell), unter
   dem Layer-Toggle-Panel (das bei top:12px right:12px sitzt). Vorher links
   unten als position:fixed — war zu leicht zu übersehen weil weit weg vom
   Map-Fokus. Position:absolute weil .map-shell position:relative ist. */
.areasplit-tool-panel {
  position: absolute;
  right: 12px;
  top: 60px;
  z-index: 25;
  background: #fff;
  border-radius: 8px;
  box-shadow: 0 4px 16px rgba(0,0,0,0.18);
  padding: 12px;
  /* Feste Breite — verhindert, dass das Panel beim Tool-Wechsel (Trennlinien ↔
     Raster) in der Breite springt. */
  width: 340px;
  box-sizing: border-box;
  font-size: 13px;
}
.areasplit-tool-panel.hidden {
  display: none;
}

/* ── Batch-Assign-Werkzeug (Medien zu mehreren Objekten zuweisen) ────────── */
/* ── Batch-Assign (lebt im rechten r-panel #panelBatch) ──────────────────── */
/* Permanente blaue Hilfetext-Box oben im Panel (zwei Absätze via pre-line). */
.batch-info-box {
  background: #eaf3fb;
  border: 1px solid #cfe2f3;
  border-radius: 4px;
  padding: 9px 11px;
  margin-bottom: 8px;
  font-size: 12px;
  line-height: 1.5;
  color: #2c5777;
  white-space: pre-line;
}
.batch-section-title {
  font-weight: 600;
  margin-bottom: 6px;
}
/* Ziele-Sektion: durch eine dünne Linie von der Inhaltswahl abgesetzt. */
.batch-targets {
  border-top: 1px solid var(--border);
  padding-top: 10px;
}
/* Modus-Wahl (Anhängen/Ersetzen) — gleiche Trennlinie wie die Ziele-Sektion. */
.batch-mode {
  border-top: 1px solid var(--border);
  padding-top: 10px;
}
.batch-mode-opt {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 2px 0;
  cursor: pointer;
}
.batch-mode-opt input[type="radio"] {
  accent-color: var(--green);
}
.batch-media-group {
  margin-bottom: 8px;
}
.batch-media-grouphead {
  font-size: 18px;
  color: var(--green);
  font-weight: 700;
  margin: 18px 0 6px;
  padding-bottom: 4px;
  border-bottom: 1px solid var(--green-mid);
  display: flex;
  align-items: baseline;
  gap: 8px;
}
/* „alle | keine"-Toggle in Medien-Sektion-Headern — rechtsbündig, dezent. */
.batch-media-toggles {
  margin-left: auto;
  font-size: 12px;
  font-weight: 400;
}
.batch-media-toggle-link {
  background: none;
  border: none;
  color: var(--green);
  text-decoration: underline;
  cursor: pointer;
  padding: 0 4px;
  font: inherit;
}
.batch-media-toggle-link:hover {
  color: #2a5d33;
}
.batch-media-toggle-sep {
  color: #bbb;
}
.batch-media-groupcount {
  font-size: 12px;
  color: var(--ink-muted);
  font-weight: 400;
}
/* Sub-Gruppen-Überschrift innerhalb von Ausstattung/Eigenschaften (z.B.
   Amenitygroup-Titel oder Property-Titel). Optisch dezenter als die Hauptgruppe. */
.batch-media-subhead {
  font-size: 12px;
  color: var(--ink-muted);
  font-weight: 600;
  margin: 8px 0 2px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
/* Kategorie-Sektion nutzt ein Select statt Checkbox: voll-breit, eigene Zeile. */
/* Kategorie-Listbox (atomar, kein Modus). Mehrzeilig via size-Attribut,
   damit alle Optionen ohne Aufklappen sichtbar sind. */
.batch-category-select {
  width: 100%;
  margin-top: 4px;
  padding: 4px;
  border: 1px solid var(--border);
  border-radius: 4px;
  background: #fff;
  font-size: 13px;
  color: var(--ink);
}
.batch-category-select option {
  padding: 4px 6px;
  cursor: pointer;
}

/* Container für eine Inhaltsgruppe (Medien bzw. Merkmale) — die jeweilige
   append/replace-Steuerung sitzt INNERHALB der Gruppe direkt unter ihren
   Items, damit räumlich klar ist, wofür der Modus gilt. */
.batch-content-group {
  display: flex;
  flex-direction: column;
}

/* Optische Trennung zwischen den zwei Gruppen (Medien vs. Merkmale) — Linie
   mit zentriertem Label „Merkmale", damit der Zweck selbsterklärend ist. */
.batch-group-divider {
  display: flex;
  align-items: center;
  margin: 26px 0;
  color: var(--green);
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 10px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase;
}
.batch-group-divider::before,
.batch-group-divider::after {
  content: "";
  flex: 1 1 auto;
  border-top: 1px solid var(--green);
  opacity: 0.5;
}
.batch-group-divider span {
  padding: 0 12px;
  white-space: nowrap;
}

/* Inline-Mode-Block: append/replace direkt unter der jeweiligen Gruppe.
   Etwas eingerückt + getöntem Hintergrund, damit der Block als „Steuerung
   für diese Gruppe" erkennbar ist und nicht wie ein weiteres Item aussieht. */
/* 3-Wege-Schalter pro Tags-Sektion (Ausstattung/Eigenschaften): sitzt direkt
   unter dem Section-Heading, über dem Picker. Klar abgehoben, damit der User
   sieht „diese drei Optionen entscheiden, was mit dieser Sektion passiert". */
.batch-tags-mode {
  display: flex;
  flex-direction: column;
  gap: 4px;
  margin: 6px 0 10px;
  padding: 8px 10px;
  background: var(--green-soft);
  border-left: 3px solid var(--green);
  border-radius: 0 4px 4px 0;
}
.batch-tags-mode-opt {
  display: flex;
  align-items: flex-start;
  gap: 6px;
  font-size: 13px;
  cursor: pointer;
  line-height: 1.35;
}
/* Warn-Suffix bei „Ziele bekommen genau …" (Replace-Modus für Medien): kleiner
   Hinweis dass leere Auswahl + replace alle bestehenden Medien am Ziel löscht. */
.batch-mode-warn {
  display: inline-block;
  margin-top: 2px;
  color: #b94a48;
  font-size: 12px;
  font-style: italic;
}

/* Picker-Items werden disabled gerendert, wenn die zugehörige Tags-Sektion
   auf „keine Änderungen" steht — gedämpft, nicht klickbar, aber sichtbar
   (Vorlage-Items bleiben pre-checked, damit der User beim Umschalten auf
   replace/append seine Auswahl wiederfindet). */
.batch-media-row.is-disabled {
  opacity: 0.45;
  pointer-events: none;
}
/* „Keine Auswahl"/Skip-Label in den Property-Radio-Gruppen optisch zurücknehmen. */
.batch-media-name.batch-muted {
  color: #888;
  font-style: italic;
}
.batch-prop-set-head {
  margin: 4px 0 2px;
  font-size: 12px;
  color: #555;
}
/* „Alle Ziele setzen auf"-Options optisch eingerückt — visualisiert die
   Sub-Hierarchie zur ersten „Ziele nicht ändern"-Option. */
.batch-prop-set-row {
  padding-left: 14px;
}
.batch-media-row {
  display: flex;
  align-items: center;
  gap: 7px;
  padding: 3px 2px;
  cursor: pointer;
  border-radius: 4px;
}
.batch-media-row:hover {
  background: var(--green-soft);
}
.batch-media-row input[type="checkbox"] {
  flex: 0 0 auto;
  accent-color: var(--green);
}
.batch-media-thumb {
  flex: 0 0 auto;
  width: 34px;
  height: 26px;
  object-fit: cover;
  border-radius: 3px;
  background: #f0f0f0;
}
/* Klickbares Thumbnail = Bild-Vorschau (Lightbox). */
.batch-media-thumb[data-preview] {
  cursor: zoom-in;
}
.batch-media-thumb-ph {
  display: inline-block;
}
/* Icon-Vorschau (POI-Symbol) in der Batch-„Vorlage übernehmen"-Zeile. SVG erbt
   die Kategoriefarbe (currentColor) wie im POI-Icon-Picker. */
.batch-icon-prev {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
}
.batch-icon-prev svg {
  width: 24px;
  height: 24px;
}
/* Vorschau-Button für PDFs/URLs (ersetzt die früheren rein dekorativen Tags):
   öffnet das PDF bzw. die URL im neuen Tab. */
.batch-media-preview-btn {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 22px;
  padding: 0;
  border: 1px solid var(--border);
  border-radius: 3px;
  background: rgba(255, 255, 255, 0.5);
  color: var(--green);
  cursor: pointer;
}
.batch-media-preview-btn:hover {
  background: var(--green-soft);
  border-color: var(--green-mid);
}
.batch-media-name {
  flex: 1 1 auto;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.batch-template {
  background: var(--green-soft);
  border: 1px solid var(--green-mid);
  border-radius: 4px;
  padding: 5px 8px;
  margin-bottom: 8px;
  color: var(--green);
}
.batch-hint {
  color: var(--ink-muted);
  margin-bottom: 10px;
  line-height: 1.4;
}
.batch-count {
  font-weight: 600;
  color: var(--green);
  margin-bottom: 10px;
}
/* „Auswahl leeren" als dezenter Text-Link unter dem Ziele-Zähler. */
.batch-clear-link {
  border: none;
  background: none;
  color: var(--green);
  cursor: pointer;
  font-size: 12px;
  padding: 0;
  text-decoration: underline;
}
.batch-clear-link:hover {
  color: var(--ink);
}
/* Sidebar im Batch-Modus: Checkbox + Markierung der gewählten Ziele. Die Box
   ist rein visuell (pointer-events:none) — getoggelt wird über das ganze Item. */
.object-item-check {
  margin-right: 2px;
  flex: 0 0 auto;
  pointer-events: none;
  accent-color: var(--green);
}
.object-item.batch-selected {
  background: var(--green-soft);
}
/* Sammel-Modus „Link aus Auswahl": gewählter Stellplatz in der Liste. */
.object-item.link-selected {
  background: var(--green-soft);
}
/* Aktionsleiste „Link aus Auswahl" — mittig in der Topbar (gleiche Position wie
   das Start-Tool, schließt sich mit ihm gegenseitig aus). Kein Karten-Look mehr,
   da jetzt Teil der Topbar. */
.link-select-bar {
  position: absolute;
  left: 50%; top: 50%;
  transform: translate(-50%, -50%);
  display: flex;
  align-items: center;
  gap: 10px;
  white-space: nowrap;
}
.link-select-bar.hidden {
  display: none;
}
.link-select-count {
  font-weight: 600;
  font-size: 13px;
  margin-right: 4px;
  white-space: nowrap;
}
/* Vorlage-Objekt in der Liste: Badge statt Checkbox, dezent hervorgehoben. */
.object-item.batch-template {
  background: var(--green-soft);
}
.object-item-tplbadge {
  flex: 0 0 auto;
  font-size: 9px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: var(--green);
  background: var(--green-mid);
  border-radius: 3px;
  padding: 2px 5px;
}

.areasplit-toolbar-row {
  display: flex;
  gap: 6px;
  align-items: center;
  border-bottom: 1px solid #eef1f4;
  padding-bottom: 8px;
  margin-bottom: 8px;
}
/* Tool-Label (statisch, kein Klick-Verhalten) — zeigt nur an welches Sub-Tool
   im Panel gerade aktiv ist. Vorher als Button-Toggle gedacht für mehrere Tools
   (Grid/Parallel/Einzellinie), aber in MVP nur Grid → Button → Label downgraded. */
.areasplit-tool-label {
  padding: 6px 10px;
  font-size: 13px;
  font-weight: 600;
  color: #2c3e50;
}
/* Tool-Tabs (Raster ↔ Trennlinien) — ersetzen das frühere statische Label,
   sobald mehr als ein Sub-Tool verfügbar ist. */
.areasplit-tool-tabs {
  display: flex;
  gap: 4px;
  flex: 1;
}
.areasplit-tool-tab {
  flex: 1;
  text-align: center;
  padding: 5px 10px;
  border: 1px solid #d0d7de;
  background: #fff;
  border-radius: 4px;
  cursor: pointer;
  font-size: 12px;
  font-weight: 600;
  color: #555;
}
.areasplit-tool-tab:hover:not(.is-active) {
  background: #f6f8fa;
}
.areasplit-tool-tab.is-active {
  background: #2c3e50;
  color: #fff;
  border-color: #2c3e50;
}
.areasplit-confirm-btn,
.areasplit-cancel-btn {
  padding: 6px 10px;
  border-radius: 4px;
  cursor: pointer;
  font-size: 12px;
  border: 1px solid transparent;
}
.areasplit-confirm-btn {
  background: #27ae60;
  color: #fff;
  border-color: #27ae60;
}
.areasplit-confirm-btn:hover {
  background: #229954;
}
/* Cancel sitzt jetzt allein rechts in der Tab-Reihe (Anlegen ist ans Panel-Ende
   gewandert) → per auto-Margin nach rechts schieben. */
.areasplit-cancel-btn {
  margin-left: auto;
  background: #fff;
  color: #c0392b;
  border-color: #e6b8b3;
}
.areasplit-cancel-btn:hover {
  background: #fdf2f1;
}
/* „Anlegen" am Panel-Ende: Trennlinie darüber (nach dem „X Trennlinien · Y
   Plätze"-Zähler), Button volle Breite als primäre Aktion. */
.areasplit-confirm-row {
  margin-top: 8px;
  padding-top: 8px;
  border-top: 1px solid #e3e7eb;
}
.areasplit-confirm-row .areasplit-confirm-btn {
  width: 100%;
  padding: 8px 10px;
  font-size: 13px;
}
.areasplit-confirm-hint {
  margin: 6px 2px 0;
  font-size: 11px;
  font-style: italic;
  color: #888;
  line-height: 1.4;
}

/* Maße-Toggle — sitzt in beiden Tool-Panels direkt unter dem Padding-Feld. */
.areasplit-measure-toggle {
  display: flex;
  align-items: center;
  gap: 6px;
  margin-bottom: 8px;
  font-size: 12px;
  color: #555;
  cursor: pointer;
  user-select: none;
}
/* Im Grid-Tool sitzt der Toggle im 2-Spalten-Grid → über beide Spalten ziehen;
   der Grid-`gap` übernimmt den Abstand. flex-direction:row überschreibt das
   column-Layout der generischen `.areasplit-grid-inputs label`-Regel (sonst
   stünde die Checkbox oben und das Label darunter). */
.areasplit-grid-inputs .areasplit-measure-toggle {
  grid-column: 1 / -1;
  flex-direction: row;
  align-items: center;
  margin-bottom: 0;
}
/* Langes Padding-Label („Abstand zwischen Stellplätzen (m)") über beide Spalten
   ziehen, sonst bricht der Text in der schmalen Spalte um. */
.areasplit-grid-inputs .areasplit-grid-fullrow {
  grid-column: 1 / -1;
}
/* Padding-Input schmal halten (wie im Trennlinien-Tool, ~80px) statt volle
   Spaltenbreite. */
.areasplit-grid-inputs .areasplit-grid-fullrow input[type="number"] {
  width: 80px;
}
.areasplit-measure-toggle input {
  cursor: pointer;
  margin: 0;
}

.areasplit-tool-content {
  padding-top: 4px;
}
/* Blaue Erklär-Box oben in jedem Tool-Panel. */
.areasplit-info-box {
  background: #eaf3fb;
  border: 1px solid #cfe2f3;
  border-radius: 4px;
  padding: 8px 10px;
  margin-bottom: 10px;
  font-size: 11px;
  line-height: 1.45;
  color: #2c5777;
}
.areasplit-grid-inputs {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
  align-items: center;
}
.areasplit-grid-inputs label {
  display: flex;
  flex-direction: column;
  font-size: 12px;
  color: #555;
  gap: 2px;
}
.areasplit-grid-inputs input[type="number"] {
  width: 100%;
  padding: 4px 6px;
  border: 1px solid #d0d7de;
  border-radius: 3px;
  font-size: 13px;
}
/* Numerierungs-Toggle (Zeilen-/Spaltenweise) — 2 Icon-Buttons, einer active.
   Label volle Breite (flex-basis:100%), die beiden Icons brechen darunter um. */
.areasplit-numbering-order {
  display: inline-flex;
  gap: 4px;
}
.areasplit-numbering-btn {
  padding: 4px 6px;
  border: 1px solid #d0d7de;
  background: #fff;
  border-radius: 3px;
  cursor: pointer;
  color: #555;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.areasplit-numbering-btn:hover:not(.is-active) {
  background: #f6f8fa;
}
.areasplit-numbering-btn.is-active {
  background: #2c3e50;
  color: #fff;
  border-color: #2c3e50;
}

.areasplit-grid-count {
  grid-column: 1 / -1;
  text-align: right;
  color: #1a73e8;
  font-size: 14px;
  font-weight: 600;
}
/* Wenn Geometrie weniger Cells zulässt als geplant: orange/warn statt blau. */
.areasplit-grid-count.is-limited {
  color: #d35400;
  font-weight: 500;
  font-size: 12px;
}

/* Handover-Button "Linien ins Trennlinien-Tool uebernehmen": volle Breite,
   dezent (kein Primary-Look — die Anlege-Aktion bleibt der grosse Footer-
   Button). Nimmt die Grid-Linien einmalig als Startwert ins Linien-Tool, wo
   der User sie verfeinern kann. */
.areasplit-handover-btn {
  grid-column: 1 / -1;
  margin-top: 6px;
  padding: 8px 12px;
  border: 1px solid #c5d4ef;
  background: #f5f9ff;
  color: #1a4ea0;
  border-radius: 6px;
  cursor: pointer;
  font-size: 12.5px;
  font-weight: 500;
  text-align: center;
  transition: background 0.15s, border-color 0.15s;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
}
.areasplit-handover-btn:hover {
  background: #e8f0fc;
  border-color: #99b4dc;
}
.areasplit-handover-arrow {
  flex-shrink: 0;
  transition: transform 0.15s;
}
.areasplit-handover-btn:hover .areasplit-handover-arrow {
  transform: translateX(2px);
}

/* ── Trennlinien-Tool (freie Teil-Trenner) ───────────────────────────────── */
.areasplit-lines-modes {
  margin-bottom: 8px;
}
/* Segment-Control (Zeichnen | Bearbeiten | Löschen): ein zusammenhängender
   Button aus 3 Teilen, immer alle sichtbar, einer aktiv. Klick aktiviert das
   Segment direkt. Aktives Segment farbcodiert je Modus. */
.areasplit-seg {
  display: flex;
  width: 100%;
  border: 1px solid #d0d7de;
  border-radius: 5px;
  overflow: hidden;
}
.areasplit-seg-btn {
  flex: 1;
  padding: 6px 8px;
  border: none;
  border-left: 1px solid #d0d7de;
  background: #fff;
  color: #555;
  cursor: pointer;
  font-size: 12px;
  font-weight: 600;
}
.areasplit-seg-btn:first-child {
  border-left: none;
}
.areasplit-seg-btn:hover:not(.is-active) {
  background: #f6f8fa;
}
.areasplit-seg-btn.is-active {
  color: #fff;
  background: #3498db;
}
.areasplit-seg-btn.is-active[data-mode="edit"] {
  background: #2c3e50;
}
.areasplit-seg-btn.is-active[data-mode="delete"] {
  background: #c0392b;
}
.areasplit-lines-hint {
  font-size: 11px;
  color: #777;
  line-height: 1.4;
  margin-bottom: 8px;
}
/* Trennlinien-Liste (nur im Löschen-Modus): laufende Nummer + Löschen-Button. */
.areasplit-lines-list {
  margin-bottom: 8px;
  max-height: 180px;
  overflow-y: auto;
}
.areasplit-lines-list.hidden {
  display: none;
}
.areasplit-lines-list-num {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 22px;
  height: 22px;
  padding: 0 4px;
  border: 1px solid currentColor;
  border-radius: 11px;
  font-size: 12px;
  font-weight: 700;
  flex-shrink: 0;
}
.areasplit-lines-list-del {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  padding: 6px 10px;
  margin: 2px 0;
  border: 1px solid #e6b8b3;
  background: #fff;
  color: #c0392b;
  border-radius: 6px;
  cursor: pointer;
  font-size: 12px;
  text-align: left;
}
.areasplit-lines-list-del:hover {
  background: #c0392b;
  border-color: #c0392b;
  color: #fff;
}
.areasplit-lines-list-del-text {
  flex: 1;
}
.areasplit-lines-list-empty {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 4px;
  font-size: 12px;
  color: #999;
  padding: 4px 0;
}
.areasplit-lines-list-link {
  border: none;
  background: none;
  padding: 0;
  color: #2980b9;
  font-size: 12px;
  text-align: left;
  text-decoration: underline;
  cursor: pointer;
}
.areasplit-lines-list-link:hover {
  color: #1c6298;
}
.areasplit-lines-padding {
  display: flex;
  flex-direction: column;
  font-size: 12px;
  color: #555;
  gap: 2px;
  margin-bottom: 8px;
}
.areasplit-lines-padding input[type="number"] {
  width: 80px;
  padding: 4px 6px;
  border: 1px solid #d0d7de;
  border-radius: 3px;
  font-size: 13px;
}
.areasplit-lines-footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  border-top: 1px solid #eef1f4;
  padding-top: 8px;
}
/* Count rechtsbündig halten, auch wenn der „Alle löschen"-Button ausgeblendet
   ist (dann ist der Count das einzige Flex-Kind). */
.areasplit-lines-footer .areasplit-grid-count {
  margin-left: auto;
}
.areasplit-lines-clear {
  padding: 5px 8px;
  border: 1px solid #e6b8b3;
  background: #fff;
  color: #c0392b;
  border-radius: 4px;
  cursor: pointer;
  font-size: 12px;
}
.areasplit-lines-clear:hover {
  background: #fdf2f1;
}

/* Anlege-Dialog — sitzt rechts AN DER STELLE des Tool-Panels (kein full-screen-
   Modal/Backdrop), damit die Karte mit der Vorschau sichtbar bleibt. Position
   relativ zur .map-shell (wie das Tool-Panel). pointer-events:none am Container,
   nur die Box fängt Klicks → der Rest des rechten Streifens bleibt klick-
   durchlässig zur Karte. */
.areasplit-confirm-overlay {
  position: absolute;
  right: 12px;
  top: 60px;
  bottom: 12px;
  z-index: 26;
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  pointer-events: none;
}
.areasplit-confirm-overlay.hidden {
  display: none;
}
.areasplit-confirm-box {
  pointer-events: auto;
  background: #fff;
  border-radius: 8px;
  padding: 14px;
  width: 420px;
  max-width: calc(100vw - 24px);
  max-height: 100%;
  overflow-y: auto;
  box-shadow: 0 4px 16px rgba(0,0,0,0.22);
}
.areasplit-confirm-box h3 {
  margin: 0 0 12px;
  font-size: 15px;
}
.areasplit-form-row {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-bottom: 12px;
}
.areasplit-form-row label {
  min-width: 110px;
  font-size: 13px;
  color: #555;
}
.areasplit-form-row select,
.areasplit-form-row input[type="text"],
.areasplit-form-row input[type="number"] {
  padding: 6px 8px;
  border: 1px solid #d0d7de;
  border-radius: 4px;
  font-size: 13px;
}
.areasplit-form-row select {
  flex: 1;
}
.areasplit-numbering-row {
  align-items: flex-start;
}
.areasplit-numbering-inputs {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}
/* Präfix-Input mit Clear-X rechts innen — Wrapper hat position:relative
   damit der Button absolut darin sitzen kann. Input bekommt padding-right
   damit der Text nicht unter dem X verschwindet. */
.areasplit-prefix-wrap {
  position: relative;
  display: inline-flex;
  align-items: center;
}
.areasplit-prefix-wrap input {
  padding-right: 22px;
}
.areasplit-prefix-clear {
  position: absolute;
  right: 4px;
  top: 50%;
  transform: translateY(-50%);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  padding: 0;
  border: 0;
  background: transparent;
  color: #888;
  border-radius: 50%;
  cursor: pointer;
}
.areasplit-prefix-clear:hover {
  background: #eee;
  color: #c0392b;
}
.areasplit-numbering-preview {
  font-size: 12px;
  color: #555;
}
.areasplit-numbering-preview strong {
  color: #2c3e50;
}
/* „Automatische Benennung neu generieren" — bei den Prefix/Start-Feldern. */
.areasplit-regen-names {
  border: 1px solid #d0d7de;
  background: #fff;
  border-radius: 4px;
  padding: 4px 8px;
  font-size: 11px;
  color: #555;
  cursor: pointer;
}
.areasplit-regen-names:hover {
  background: #f6f8fa;
}
.areasplit-area-summary {
  display: flex;
  gap: 12px;
  padding: 8px 12px;
  background: #f6f8fa;
  border-radius: 4px;
  font-size: 12px;
  color: #555;
  margin-bottom: 12px;
}
.areasplit-area-summary .as-stat {
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.areasplit-area-summary .as-stat-label {
  color: #888;
}
.areasplit-area-summary strong {
  color: #2c3e50;
}
.areasplit-cells-preview {
  border: 1px solid #eef1f4;
  border-radius: 4px;
  margin-bottom: 12px;
}
.areasplit-cells-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  padding: 6px 10px;
  background: #f6f8fa;
  font-size: 12px;
  color: #555;
  border-bottom: 1px solid #eef1f4;
}
.areasplit-deselect-outliers {
  border: none;
  background: none;
  padding: 0;
  color: #2980b9;
  font-size: 11px;
  text-decoration: underline;
  cursor: pointer;
}
.areasplit-deselect-outliers:hover {
  color: #1c6298;
}
.areasplit-cells-preview ul {
  margin: 0;
  padding: 4px 10px;
  max-height: 200px;
  overflow-y: auto;
  list-style: none;
}
.areasplit-cells-preview li {
  padding: 0;
  font-size: 12px;
  border-bottom: 1px dashed #eef1f4;
}
.areasplit-cells-preview li:last-child {
  border-bottom: 0;
}
/* Hover-Tönung der Zeile (Violett wie der Highlight-Stroke der Karten-Zelle) —
   macht sichtbar, welche Zeile die hervorgehobene Fläche steuert. */
.areasplit-cells-preview li:hover {
  background: rgba(124, 58, 237, 0.07);
}
/* Klickbare Zeile: Checkbox + Label + Fläche (+ Klein-Badge). */
.as-cell-row {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 3px 2px;
}
.as-cell-check {
  flex: 0 0 16px;
  margin: 0;
  cursor: pointer;
}
/* Kategorie-Farbpunkt pro Cell-Row — Click öffnet Popover mit Kategorie-Strip.
   Slot ist breiter (28px) damit der „Kat."-Header darüber Platz hat; der Dot
   selbst bleibt 14px-Kreis, zentriert im Slot. */
.as-cell-catslot {
  flex: 0 0 28px;
  display: inline-flex;
  justify-content: center;
}
.as-cell-catdot {
  width: 14px;
  height: 14px;
  padding: 0;
  border-radius: 50%;
  border: 1px solid rgba(0,0,0,0.18);
  cursor: pointer;
  transition: transform 0.1s, box-shadow 0.1s;
}
.as-cell-catdot:hover:not(:disabled) {
  transform: scale(1.2);
  box-shadow: 0 0 0 2px rgba(255,255,255,0.9), 0 0 0 3px rgba(0,0,0,0.2);
}
.as-cell-catdot:disabled {
  opacity: 0.35;
  cursor: not-allowed;
}
/* Custom-Tooltip (modules/tooltip.js) — sofort sichtbar, kein Browser-Delay.
   z-index muss über allen Overlays/Popovern liegen. */
.camply-tooltip {
  position: fixed;
  z-index: 12000;
  padding: 4px 8px;
  background: rgba(20, 20, 20, 0.94);
  color: #fff;
  font-size: 11.5px;
  font-weight: 500;
  line-height: 1.3;
  border-radius: 4px;
  pointer-events: none;
  white-space: nowrap;
  box-shadow: 0 2px 6px rgba(0,0,0,0.25);
}
.camply-tooltip.hidden {
  display: none;
}

/* Popover mit allen Kategorien als horizontaler Swatch-Strip. position:fixed
   damit's nicht vom Overlay-Scroll abgeschnitten wird. z-index über dem
   Confirm-Overlay (~10000). */
.as-cat-popover {
  position: fixed;
  z-index: 11000;
  display: flex;
  gap: 6px;
  padding: 8px;
  background: #fff;
  border: 1px solid #d0d7de;
  border-radius: 6px;
  box-shadow: 0 4px 12px rgba(0,0,0,0.15);
}
.as-cat-popover-swatch {
  width: 22px;
  height: 22px;
  padding: 0;
  border-radius: 50%;
  border: 2px solid rgba(0,0,0,0.15);
  cursor: pointer;
  transition: transform 0.1s, border-color 0.1s;
}
.as-cat-popover-swatch:hover {
  transform: scale(1.15);
  border-color: rgba(0,0,0,0.4);
}
.as-cat-popover-swatch.is-current {
  border-color: #222;
  border-width: 3px;
}
/* Editierbare Bezeichner-Felder. Spaltenbreiten via flex — müssen mit der
   Header-Zeile (.as-cell-colhead) übereinstimmen. Bezeichnung kleiner als
   Kurzbezeichnung. */
.as-cell-label {
  min-width: 0;
  padding: 2px 6px;
  border: 1px solid #d0d7de;
  border-radius: 3px;
  font-size: 12px;
  color: #333;
}
.as-cell-bez {
  flex: 1 1 0;
}
.as-cell-short {
  flex: 1 1 0;
}
/* Fixer Slot für das „klein"-Badge — immer reserviert (auch wenn leer), damit
   die m²-Spalte zeilenübergreifend bündig bleibt. Badge rechtsbündig, direkt
   vor der Fläche. */
.as-cell-badgeslot {
  flex: 0 0 46px;
  display: flex;
  justify-content: flex-end;
}
.as-cell-label:disabled {
  border-color: transparent;
  background: transparent;
  color: #bbb;
}
/* Leeres Pflichtfeld (Bezeichnung) einer ausgewählten Zelle → rot, „Anlegen"
   ist dann deaktiviert. */
.as-cell-label.is-invalid {
  border-color: #c0392b;
  background: #fdf2f1;
}
/* Spalten-Header über den beiden Eingabefeldern (gleiche flex-Spalten wie .as-cell-row). */
.as-cell-colhead {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 6px 2px 2px;
  font-size: 11px;
  font-weight: 600;
  color: #777;
}
.as-col-spacer {
  flex: 0 0 16px;
}
.as-col-cat {
  flex: 0 0 28px;
  text-align: center;
  font-size: 10px;
}
.as-col-bez {
  flex: 1 1 0;
}
.as-col-short {
  flex: 1 1 0;
}
.as-col-badgeslot {
  flex: 0 0 46px;
}
.as-col-areaspacer {
  flex: 0 0 56px;
}
.areasplit-cells-preview .cell-id {
  flex: 1;
  font-weight: 600;
  color: #1a73e8;
}
.areasplit-cells-preview .cell-area {
  flex: 0 0 56px;
  text-align: right;
  color: #666;
}
/* Ausreißer (klein): zarte Warnfarbe + Badge. */
.areasplit-cells-preview li.is-outlier {
  background: #fff7ed;
}
.cell-outlier-badge {
  font-size: 10px;
  color: #d35400;
  background: #fdebd0;
  border-radius: 8px;
  padding: 0 6px;
}
/* Abgewählt: ausgegraut. */
.areasplit-cells-preview li.is-excluded .cell-id,
.areasplit-cells-preview li.is-excluded .cell-area {
  color: #bbb;
  font-weight: 400;
}
.areasplit-progress {
  margin-bottom: 12px;
}
.areasplit-progress.hidden {
  display: none;
}
.areasplit-progress-label {
  font-size: 12px;
  color: #555;
  margin-bottom: 4px;
}
.areasplit-progress-bar {
  height: 6px;
  background: #eef1f4;
  border-radius: 3px;
  overflow: hidden;
}
.areasplit-progress-bar > div {
  height: 100%;
  background: #1a73e8;
  transition: width 0.2s ease;
}
.areasplit-confirm-buttons {
  display: flex;
  justify-content: flex-end;
  gap: 8px;
}
.areasplit-confirm-buttons button {
  padding: 8px 16px;
  border-radius: 4px;
  border: 1px solid #d0d7de;
  background: #fff;
  cursor: pointer;
  font-size: 13px;
}
.areasplit-confirm-buttons button.primary {
  background: #27ae60;
  color: #fff;
  border-color: #27ae60;
}
.areasplit-confirm-buttons button.primary:hover:not(:disabled) {
  background: #229954;
}
.areasplit-confirm-buttons button:disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

/* ── Banner für anstehenden Tarif-Downgrade (auch im Map-Editor sichtbar; in
   app.css gleichlautend für das Standard-Layout, hier dupliziert weil die Map-
   SPA app.css nicht lädt). Optik 1:1 wie im Standard-Layout. */
.pending-downgrade-banner {
  margin: 0;
  padding: 10px 16px;
  border: 1px solid rgba(217, 119, 6, 0.45);
  border-radius: var(--radius-sm);
  background: rgba(254, 243, 199, 0.85);
  color: #92400e;
  font-size: 0.9rem;
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
  flex-shrink: 0;
}
.pending-downgrade-text {
  flex: 1 1 auto;
  min-width: 0;
  line-height: 1.4;
}
.pending-downgrade-banner-cta {
  margin-left: auto;
  color: #92400e;
  text-decoration: underline;
  font-weight: 500;
  flex-shrink: 0;
}
.pending-downgrade-banner-cta:hover {
  text-decoration: none;
}
/* Dringlicher Banner (Kulanzfrist läuft ab bzw. Abo gekündigt → Sperre): rotes
   statt des gelben Standard-Banners. Feste Literale (theme-unabhängig). */
.pending-downgrade-banner.is-urgent {
  border-color: rgba(192, 57, 43, 0.45);
  background: rgba(192, 57, 43, 0.10);
  color: #c0392b;
}
.pending-downgrade-banner.is-urgent .pending-downgrade-banner-cta {
  color: #c0392b;
}

/* ── 360°-Foto-Support (Karten-Editor) ──────────────────────────────────────
   Duplikat aus app.css. Der Karten-Editor lädt app.css bewusst NICHT
   (Shell-Layout-Konflikt, siehe Map/index.php). Pool-spezifische Regeln
   (.pool-nav-panorama, .pool-detail-pano-stage, .pano-checkbox-row,
   .pano-edit-controls) bleiben app.css-only — sie greifen nur auf der
   /images-Seite, nicht im Karten-Editor. */
.image-thumb-link,
.imgpicker-pool-card { position: relative; }
.img-card-pill {
  position: absolute;
  top: 6px;
  right: 6px;
  padding: 2px 6px;
  border-radius: 10px;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.04em;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25);
  pointer-events: none;
}
.img-card-pill-panorama {
  background: var(--green);
  color: #fff;
}

/* Vollbild-Pano-Modal — über alle Karten-UI-Schichten, dunkles Backdrop. */
.panorama-modal-overlay {
  position: fixed;
  inset: 0;
  z-index: 10500;
  background: rgba(0, 0, 0, 0.85);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
}
.panorama-modal-box {
  position: relative;
  width: 100%;
  max-width: 1200px;
  height: 100%;
  max-height: 800px;
  background: #1c1e22;
  border-radius: var(--radius);
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);
  overflow: hidden;
  display: flex;
  flex-direction: column;
}
.panorama-modal-stage {
  flex: 1;
  min-height: 0;
}
.panorama-modal-actions {
  position: absolute;
  top: 12px;
  right: 12px;
  display: flex;
  gap: 8px;
  z-index: 2;
}
.panorama-modal-set-default {
  padding: 8px 14px;
  border-radius: var(--radius-sm);
  border: none;
  background: var(--green);
  color: #fff;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.04em;
  cursor: pointer;
}
.panorama-modal-set-default[hidden] { display: none; }
.panorama-modal-close {
  width: 36px;
  height: 36px;
  border-radius: 50%;
  border: none;
  background: rgba(0, 0, 0, 0.6);
  color: #fff;
  font-size: 22px;
  line-height: 1;
  cursor: pointer;
}
.panorama-modal-close:hover { background: rgba(0, 0, 0, 0.8); }

/* PSV im normalen Image-Modal (image-modal.js, lazy injiziert). */
.img-modal-pano-stage {
  width: 100%;
  height: 100%;
  min-height: 400px;
  background: #1c1e22;
}

/* Lightbox-Hinweis nur bei 360°-Bildern — sagt dem User wo er die
   Default-Rotation ändern kann (im Pool-Detail, nicht im Lightbox). */
.img-modal-pano-hint {
  margin-top: 3px;
  font-size: 9px;
  color: var(--ink-muted);
  font-style: italic;
}

/* 360°-Marker (Phase 2) — Duplikat aus app.css, weil der Karten-Editor
   app.css nicht laedt (siehe feedback_karteneditor_keine_appcss). */
.pano-marker {
  pointer-events: auto;
  cursor: pointer;
  user-select: none;
  transform-origin: center center;
  transition: transform 0.12s ease, box-shadow 0.12s ease;
}
.pano-marker:hover { transform: scale(1.08); }
.pano-marker-label {
  padding: 4px 10px;
  border-radius: 14px;
  font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
  font-size: 11px;
  font-weight: 600;
  color: #1c1e22;
  background: #fff;
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.4);
  white-space: nowrap;
  max-width: 220px;
  overflow: hidden;
  text-overflow: ellipsis;
}
/* Link-Indikator bei reinen Icon-Markern: kleines ↗ als Eck-Chip (innen unten
   rechts, weil .pano-marker-badge overflow:hidden hat → aussen würde geclippt). */
.pano-marker-linkarrow {
  position: absolute;
  right: 0;
  bottom: 0;
  font-size: 10px;
  line-height: 1;
  font-weight: 700;
  color: #1c1e22;
  background: rgba(255, 255, 255, 0.95);
  border-top-left-radius: 7px;
  padding: 1px 1px 0 2px;
  pointer-events: none;
}
.pano-marker-badge {
  position: relative;
  width: 31px;
  height: 31px;
  border-radius: 50%;
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.4);
  display: flex;
  align-items: center;
  justify-content: center;
  /* Default-BG weiss — die meisten poi_icons.svg bringen ihren eigenen
     farbigen Background-Circle mit. */
  background: #ffffff;
  overflow: hidden;
}
.pano-marker-badge svg,
.pano-marker-badge img {
  width: 100%;
  height: 100%;
  pointer-events: none;
  display: block;
}
/* Ohne Ring: kein Background, kein Schatten, kein Clipping — nur das nackte
   Icon (sinnvoll fuer poi_icons mit eigenem Background-Circle). */
.pano-marker-badge--no-ring {
  background: transparent !important;
  box-shadow: none;
  overflow: visible;
}
.pano-marker-badge-dot {
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: #fff;
}

/* 360°-Checkbox-Row im Picker-Upload (.imgpicker-upload .form-group). Die
   form-input/select-Defaults im Picker sind nicht ganz so aggressiv wie auf
   der /images-Seite — daher reicht ein einfacher Style ohne den
   High-Specificity-Override aus app.css. */
.pano-checkbox-row {
  display: flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  font-size: 14px;
  font-family: inherit;
  color: inherit;
  margin: 0;
}
.pano-checkbox-row input[type="checkbox"] {
  width: 16px;
  height: 16px;
  padding: 0;
  border: 1px solid var(--border);
  background: #fff;
  accent-color: var(--green);
  cursor: pointer;
  flex-shrink: 0;
}

/* 2-spaltige Zeile im Picker-Upload (Titel + Fotograf nebeneinander). Bei
   sehr schmalem Modal-Viewport bricht sie auf 1 Spalte um. */
.imgpicker-upload-row2 {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
}
@media (max-width: 520px) {
  .imgpicker-upload-row2 { grid-template-columns: 1fr; }
}

/* ===== Ende Karteneditor-Regeln (ehem. map.css) / Beginn Backend-Regeln (ehem. app.css) ===== */

/* ── CSS Variables ──────────────────────────────────────────── */

/* Theme-Red-Block in webroot/css/theme-red.css ausgelagert, damit die Map-Seite
   nur das schmale Theme-File lädt (nicht das ganze app.css, dessen .app-shell-
   Regel mit der 3-Spalten-Variante in map.css kollidiert). */

/* ── Login: Split Layout ───────────────────────────────────── */
.login-shell {
    display: grid;
    grid-template-columns: 1fr 1fr;
    height: 100dvh;
}

/* ── Login: Left Promo ─────────────────────────────────────── */
.login-promo {
    background: linear-gradient(160deg, #2c4a2e 0%, #1a3520 100%);
    color: #e8e2d6;
    display: flex;
    flex-direction: column;
    justify-content: center;
    padding: 64px 56px;
    position: relative;
    overflow: hidden;
}
.login-promo::before {
    content: '';
    position: absolute; inset: 0;
    background:
        radial-gradient(ellipse 80% 60% at 20% 80%, rgba(58,125,68,0.25), transparent),
        radial-gradient(ellipse 60% 50% at 80% 20%, rgba(176,124,26,0.12), transparent);
    pointer-events: none;
}

.promo-badge {
    display: inline-flex; align-items: center; gap: 8px;
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase;
    color: rgba(232,226,214,0.6);
    margin-bottom: 32px;
    position: relative;
}
.promo-badge::before {
    content: '';
    width: 8px; height: 8px; border-radius: 50%;
    background: #5cb85c;
    box-shadow: 0 0 8px rgba(92,184,92,0.5);
}

.promo-title {
    font-size: 2.6rem;
    font-weight: 600;
    line-height: 1.2;
    margin-bottom: 20px;
    position: relative;
}

.promo-subtitle {
    font-size: 1.1rem;
    line-height: 1.7;
    color: rgba(232,226,214,0.7);
    max-width: 420px;
    margin-bottom: 48px;
    position: relative;
}

/* Feature Cards */
.promo-features {
    display: flex;
    flex-direction: column;
    gap: 16px;
    position: relative;
}

.promo-feature {
    display: flex;
    align-items: flex-start;
    gap: 16px;
    padding: 18px 20px;
    background: rgba(255,255,255,0.06);
    border: 1px solid rgba(255,255,255,0.08);
    border-radius: var(--radius-sm);
    transition: background 0.15s;
}
.promo-feature:hover {
    background: rgba(255,255,255,0.1);
}

.promo-feature-icon {
    width: 40px; height: 40px;
    border-radius: 10px;
    display: flex; align-items: center; justify-content: center;
    flex-shrink: 0;
}
.promo-feature-icon svg {
    width: 20px; height: 20px;
    stroke: currentColor; fill: none;
    stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round;
}
.promo-feature-icon.map    { background: rgba(59,130,246,0.2); color: #60a5fa; }
.promo-feature-icon.edit   { background: rgba(58,125,68,0.2); color: #6fcf7c; }
.promo-feature-icon.widget { background: rgba(168,85,247,0.2); color: #c084fc; }
.promo-feature-icon.globe  { background: rgba(245,158,11,0.2); color: #fbbf24; }

.promo-feature-text h3 {
    font-size: 15px; font-weight: 600; margin-bottom: 2px;
    color: rgba(232,226,214,0.9);
}
.promo-feature-text p {
    font-size: 13px; line-height: 1.5;
    color: rgba(232,226,214,0.5);
}

.promo-signup {
    margin-top: 48px;
    font-size: 14px;
    color: rgba(232,226,214,0.45);
    position: relative;
}
.promo-signup a {
    color: rgba(232,226,214,0.7);
    text-decoration: underline;
    text-underline-offset: 3px;
    transition: color 0.12s;
}
.promo-signup a:hover { color: #e8e2d6; }

/* ── Login: Right Form ─────────────────────────────────────── */
.login-form-side {
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 48px;
}

.login-card {
    width: 100%;
    max-width: 380px;
}

.login-logo {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 22px;
    font-weight: 500;
    letter-spacing: -0.02em;
    color: var(--ink);
    margin-bottom: 8px;
}
/* Logo: "camply." (im <span>) rot, "guide" (nach dem span) erbt das ink-color
   vom .login-logo-Parent. */
.login-logo span { color: var(--red); }

.login-welcome {
    font-size: 14px;
    color: var(--ink-muted);
    margin-bottom: 36px;
}

/* Sprachumschalter (Interface-Sprache de/en) oben rechts in der Login-Card */
.login-lang {
    display: flex;
    justify-content: flex-end;
    gap: 4px;
    margin-bottom: 16px;
}
.login-lang-opt {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 12px;
    color: var(--ink-muted);
    text-decoration: none;
    padding: 4px 10px;
    border-radius: 6px;
    border: 1px solid transparent;
    transition: color 0.15s, background 0.15s, border-color 0.15s;
}
.login-lang-flag {
    font-family: 'Twemoji Country Flags', 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 18px;
    line-height: 1;
    flex-shrink: 0;
}
.login-lang-opt:hover {
    color: var(--ink);
    border-color: var(--border);
}
.login-lang-opt.is-active {
    color: var(--green);
    background: var(--green-soft);
    border-color: var(--green-mid);
}

/* Login-Form (im .login-card-Scope, damit map.css's .form-group woanders gewinnt) */
.login-card .form-group {
    display: block;
    margin-bottom: 20px;
}
.login-card .form-group label {
    display: block;
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 11px;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--ink-muted);
    margin-bottom: 6px;
}
.login-card .form-group input:not(.form-color-input),
.login-card .form-group select {
    width: 100%;
    padding: 12px 14px;
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 16px;
    color: var(--ink);
    background: #fff;
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    outline: none;
    transition: border-color 0.12s, box-shadow 0.12s;
}
.login-card .form-group input:focus,
.login-card .form-group select:focus {
    border-color: var(--green);
    box-shadow: 0 0 0 3px rgba(58,125,68,0.12);
}

/* ── Passwort sichtbar/verbergen Toggle ──────────────────────── */
.password-field {
    position: relative;
}
/* Platz für den Toggle-Button rechts im Feld freihalten */
.password-field input {
    padding-right: 44px !important;
}
.password-toggle {
    position: absolute;
    top: 0;
    bottom: 0;
    right: 4px;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    padding: 0;
    border: none;
    background: none;
    color: var(--ink-muted);
    cursor: pointer;
    border-radius: var(--radius-sm);
    transition: color 0.12s;
}
.password-toggle:hover:not(:disabled),
.password-toggle:focus-visible {
    color: var(--ink);
    outline: none;
}
.password-toggle:disabled {
    cursor: not-allowed;
    opacity: 0.5;
}
/* Standard: „offenes Auge" sichtbar, „durchgestrichenes" versteckt.
   Bei sichtbarem Passwort (.is-visible) wird umgeschaltet. */
.password-toggle .password-toggle-eye-off {
    display: none;
}
.password-toggle.is-visible .password-toggle-eye {
    display: none;
}
.password-toggle.is-visible .password-toggle-eye-off {
    display: block;
}

.login-error {
    font-size: 13px;
    color: var(--red);
    margin-bottom: 16px;
    padding: 10px 14px;
    background: rgba(192,57,43,0.06);
    border-radius: var(--radius-sm);
}

.login-maintenance-notice {
    font-size: 13px;
    color: #8a5b00;
    margin-bottom: 16px;
    padding: 10px 14px;
    background: rgba(255,193,7,0.12);
    border: 1px solid rgba(255,193,7,0.45);
    border-radius: var(--radius-sm);
}

.login-maintenance-notice strong {
    display: block;
    margin-bottom: 4px;
}

.login-btn {
    width: 100%;
    padding: 13px;
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 14px;
    font-weight: 500;
    color: #fff;
    background: var(--green);
    border: none;
    border-radius: var(--radius-sm);
    cursor: pointer;
    transition: background 0.12s, transform 0.1s;
}
.login-btn:hover:not(:disabled) { background: #327a3b; }
.login-btn:active:not(:disabled) { transform: scale(0.985); }

/* ── Disabled State (Lockout) ──────────────────────────────── */
.login-card .form-group input:disabled,
.login-card .form-group select:disabled {
    opacity: 0.5;
    cursor: not-allowed;
}
.login-btn:disabled {
    opacity: 0.5;
    cursor: not-allowed;
}

/* ── Responsive ────────────────────────────────────────────── */
@media (max-width: 900px) {
    .login-shell { grid-template-columns: 1fr; }
    .login-promo { display: none; }
}

/* ══════════════════════════════════════════════════════════════
   APP SHELL LAYOUT
   ══════════════════════════════════════════════════════════════ */
.app-backend .app-shell {
    display: grid;
    grid-template-columns: auto 1fr;
    gap: 12px;
    height: 100dvh;
    padding: 12px;
}

/* .sidebar, .left-sidebar (Layout), .nav-rail, .nav-item* — kommen aus map.css */

/* .nav-item (inkl. text-decoration: none) kommt vollständig aus den
   Karteneditor-Regeln oben (ehem. map.css) — hier kein eigenes Override mehr. */

.app-backend .left-sidebar {
    width: var(--sidebar-left);
}
.app-backend .left-sidebar.no-panel {
    width: var(--nav-rail);
}

/* .objects-panel und .panel-header kommen aus map.css (padding 14px 14px 0,
 * panel-header als flex-Container ohne Border). */

/* ── Settings Nav Items ──────────────────────────────────── */
.settings-nav-item {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 9px 10px;
    border-radius: var(--radius-sm);
    border: 1px solid transparent;
    text-decoration: none;
    color: var(--ink-muted);
    cursor: pointer;
    transition: background 0.12s, color 0.12s, border-color 0.12s;
    font-size: 14px;
}
.settings-nav-item svg {
    width: 15px;
    height: 15px;
    stroke: currentColor;
    fill: none;
    stroke-width: 1.8;
    stroke-linecap: round;
    flex-shrink: 0;
}
.settings-nav-item:hover {
    background: var(--green-soft);
    color: var(--green);
    border-color: var(--green-mid);
}
.settings-nav-item.is-active {
    background: var(--green-soft);
    color: var(--green);
    border-color: var(--green-mid);
    font-weight: 600;
}

/* ── Main Area ───────────────────────────────────────────── */
.app-backend .main-area {
    overflow-y: auto;
    padding: 0;
}
/* Seiten mit eigenem internen Scroll-Layout (Pool, Settings, Setup) — der äußere
 * Scroll-Container würde sonst die Toolbar mit-scrollen. Im Prototyp lagen diese
 * Layouts direkt als Grid-Spalte in .app-shell, hier sind sie in .main-area
 * eingebettet — daher der Override. */
.app-backend .main-area:has(> .pool-main),
.app-backend .main-area:has(> .settings-main),
.app-backend .main-area:has(> .setup-layout) { overflow: hidden; padding: 0; display: flex; flex-direction: column; }
.app-backend .main-area > .pool-main,
.app-backend .main-area > .settings-main { flex: 1; min-height: 0; }

/* ══════════════════════════════════════════════════════════════
   HOME PAGE
   ══════════════════════════════════════════════════════════════ */
.home-main {
    overflow-y: auto;
    padding: 0;
}

.home-hero {
    padding: 10px 40px 36px;
    border-bottom: 1px solid var(--border);
}
.home-hero h1 {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 2rem;
    font-weight: 600;
    color: var(--ink);
    margin: 0 0 8px;
}
.home-hero p {
    font-size: 15px;
    color: rgba(44, 36, 22, 0.75);
    line-height: 1.6;
    max-width: 640px;
    margin: 0;
}

/* ── Tabs ─────────────────────────────────────────────────── */
.home-tabs {
    display: flex;
    gap: 0;
    padding: 0 40px;
    border-bottom: 2px solid var(--border);
}
.home-tab {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 12px 20px;
    cursor: pointer;
    font-size: 14px;
    font-weight: 500;
    color: var(--ink-muted);
    border: none;
    background: none;
    border-bottom: 2px solid transparent;
    margin-bottom: -2px;
    transition: color 0.12s, border-color 0.12s;
}
.home-tab:hover { color: var(--ink); }
.home-tab.active {
    color: var(--green);
    border-bottom-color: var(--green);
    font-weight: 600;
}
.home-tab svg {
    width: 16px;
    height: 16px;
    stroke: currentColor;
    fill: none;
    stroke-width: 1.8;
    stroke-linecap: round;
    stroke-linejoin: round;
}

.home-tab-icon {
    width: 28px;
    height: 28px;
    border-radius: var(--radius-sm);
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    border: 1px solid var(--border);
    box-shadow: var(--shadow-lg);
}
.home-tab-icon svg { width: 15px; height: 15px; }
.home-tab-icon.setup  { background: var(--green-soft); color: var(--green); }
.home-tab-icon.map    { background: rgba(59, 130, 246, 0.1); color: #3b82f6; }
.home-tab-icon.mobile { background: rgba(168, 85, 247, 0.1); color: #a855f7; }
.home-tab-icon.embed  { background: rgba(245, 158, 11, 0.1); color: #f59e0b; }

/* ── Tab Panels ──────────────────────────────────────────── */
.home-tab-panel {
    display: none;
    padding: 32px 40px 60px;
}
/* Media-Spalte rechts wurde entfernt — Tab-Panel füllt nur noch eine
   Spalte. max-width verhindert dass lange Zeilen quer über den Bildschirm
   laufen, wenn die Hauptbreite (1800px laut Layout-Vorgabe) ausgereizt wird. */
.home-tab-panel.active {
    display: block;
    max-width: 760px;
}

/* ── 2-Spalten-Layout (links Tabs+Panels, rechts Service-Teaser) ────── */
/* Grid statt Flex damit die rechte Spalte eine fixe Min-/Max-Breite hat
   und die linke flexibel den Rest fuellt. Auf engen Viewports stackt der
   Teaser unter die Tabs. */
.home-cols {
    display: grid;
    /* Beide Spalten content-width-bemessen — 1fr links wuerde sonst ueber den
       ganzen Viewport spreizen, und der Teaser klebt ganz rechts mit Luecke
       dazwischen. So sitzen Inhalt + Teaser linksbuendig nebeneinander,
       leerer Whitespace bleibt rechts vom Teaser. */
    grid-template-columns: minmax(0, 760px) minmax(280px, 360px);
    gap: 32px;
    align-items: start;
}
.home-col-left {
    min-width: 0;
}
.home-col-right {
    padding: 32px 0 60px;
}
/* Innerhalb der Spalten erben Tabs + Panels ihre bisherigen Paddings —
   nichts dran zu drehen, da die Spalten den vollen Hero-Padding-Block
   nutzen und die rechte Spalte nur ihr eigenes Padding setzt. */
.home-teaser {
    padding: 24px 28px;
    margin-top: 14px; /* vertikal grob auf Hoehe der Tab-Leiste */
    background: var(--green-soft);
    border: 1px solid var(--green-mid);
    border-radius: 12px;
    box-shadow: var(--shadow-md, 0 2px 8px rgba(0,0,0,.06));
    position: sticky;
    top: 16px;
}
.home-teaser-eyebrow {
    font-size: 13px;
    font-weight: 500;
    color: var(--green);
    opacity: 0.85;
    margin-bottom: 4px;
}
.home-teaser-title {
    margin: 0 0 14px;
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 1.35rem;
    font-weight: 600;
    color: var(--green);
}
.home-teaser-para {
    margin: 0 0 12px;
    font-size: 14px;
    line-height: 1.55;
    color: var(--ink);
}
.home-teaser-para:last-child {
    margin-bottom: 0;
}
.home-teaser-cta {
    margin: 14px 0 0;
    padding-top: 12px;
    border-top: 1px solid var(--green-mid);
    font-size: 14px;
    line-height: 1.5;
    color: var(--ink);
    font-weight: 500;
}
.home-teaser-cta a {
    color: var(--green);
    font-weight: 600;
    word-break: break-word;
}
/* `.help-cta-teaser` lebt in map.css — der Karten-Editor laedt app.css nicht. */
@media (max-width: 1100px) {
    .home-cols {
        grid-template-columns: 1fr;
    }
    .home-col-right {
        padding: 0 40px 40px;
    }
    .home-teaser {
        position: static;
        margin-top: 0;
    }
}

/* ── Media Column (left) ─────────────────────────────────── */
.home-media {
    border: 1px solid var(--border);
    border-radius: var(--radius);
    background: var(--panel-2);
    overflow: hidden;
    aspect-ratio: 16/10;
    display: flex;
    align-items: center;
    justify-content: center;
    position: sticky;
    top: 32px;
}
.home-media iframe {
    width: 100%;
    height: 100%;
    border: none;
}
.home-media-placeholder {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 12px;
    color: var(--ink-muted);
    font-size: 13px;
}
.home-media-placeholder svg {
    width: 48px;
    height: 48px;
    stroke: currentColor;
    fill: none;
    stroke-width: 1;
    stroke-linecap: round;
    opacity: 0.4;
}

/* ── Content Column (right) ──────────────────────────────── */
.home-section-body {
    display: flex;
    flex-direction: column;
    gap: 14px;
}
.home-section-body p {
    font-size: 14px;
    color: rgba(44, 36, 22, 0.75);
    line-height: 1.65;
    margin: 0;
}
.home-section-body strong { color: var(--ink); }
.home-section-title {
    font-size: 1.25rem;
    font-weight: 600;
    color: var(--ink);
    margin: 0 0 4px;
}

/* ── Steps ───────────────────────────────────────────────── */
.home-steps {
    display: flex;
    flex-direction: column;
    gap: 10px;
    padding: 0;
    margin: 0;
    list-style: none;
}
.home-step {
    display: flex;
    gap: 12px;
    align-items: flex-start;
}
.home-step-num {
    width: 22px;
    height: 22px;
    border-radius: 50%;
    flex-shrink: 0;
    background: var(--green-soft);
    border: 1.5px solid var(--green-mid);
    color: var(--green);
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 10px;
    font-weight: 600;
    display: flex;
    align-items: center;
    justify-content: center;
    margin-top: 2px;
}
.home-step p {
    font-size: 13px;
    color: rgba(44, 36, 22, 0.75);
    line-height: 1.5;
    margin: 0;
}
.home-step a {
    color: var(--green);
    text-decoration: none;
    font-weight: 600;
}
.home-step a:hover { text-decoration: underline; }

/* ── Links & Buttons ─────────────────────────────────────── */
.home-link-row {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
}
.home-link {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 6px 14px;
    border-radius: var(--radius-sm);
    border: 1px solid var(--green-mid);
    background: var(--green-soft);
    color: var(--green);
    font-size: 13px;
    font-weight: 600;
    text-decoration: none;
    transition: background 0.12s, color 0.12s;
}
.home-link:hover {
    background: var(--green);
    color: #fff;
}
.home-link svg {
    width: 14px;
    height: 14px;
    stroke: currentColor;
    fill: none;
    stroke-width: 2;
    stroke-linecap: round;
}

/* ── URL Box ─────────────────────────────────────────────── */
.home-url-box {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 12px;
    background: var(--panel-2);
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    padding: 10px 14px;
    color: var(--ink);
    word-break: break-all;
    line-height: 1.5;
}
.home-url-label {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--ink-muted);
    margin-bottom: 6px;
}
/* URL-Box + Copy-Button nebeneinander. Box nimmt den Restplatz, Button
   bleibt rechts stehen. Auf engen Viewports wickelt der Button um. */
.home-url-row {
    display: flex;
    flex-wrap: wrap;
    align-items: stretch;
    gap: 8px;
}
.home-url-row .home-url-box {
    flex: 1 1 320px;
    min-width: 0;
}
.home-url-copy {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 8px 14px;
    border-radius: var(--radius-sm);
    border: 1px solid var(--border);
    background: var(--panel);
    color: var(--ink);
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 11px;
    letter-spacing: 0.04em;
    cursor: pointer;
    transition: background 0.12s, border-color 0.12s, color 0.12s;
    flex: 0 0 auto;
}
.home-url-copy:hover {
    background: var(--panel-2);
    border-color: var(--border-strong);
}
.home-url-copy.is-copied {
    background: var(--green);
    border-color: var(--green);
    color: #fff;
}

/* ── Code Block ──────────────────────────────────────────── */
.home-code-block {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 13px;
    background: #1e1e1e;
    color: #d4d4d4;
    border-radius: var(--radius-sm);
    padding: 14px 16px;
    overflow-x: auto;
    line-height: 1.6;
}
.home-code-block .tag  { color: #569cd6; }
.home-code-block .attr { color: #9cdcfe; }
.home-code-block .str  { color: #ce9178; }
.home-code-block .cmt  { color: #6a9955; }

/* ── Tip Box ─────────────────────────────────────────────── */
.home-tip {
    display: flex;
    gap: 10px;
    align-items: flex-start;
    padding: 12px 16px;
    border-radius: var(--radius-sm);
    background: rgba(0, 0, 0, 0.03);
    border: 1px solid var(--border);
}
.home-tip-icon {
    flex-shrink: 0;
    font-size: 16px;
    margin-top: 1px;
}
.home-tip p {
    font-size: 13px;
    color: rgba(44, 36, 22, 0.75);
    line-height: 1.5;
    margin: 0;
}

/* SHARED FORM STYLES (.form-label, .form-input, .form-select, .form-textarea) — kommen aus map.css */

/* ══════════════════════════════════════════════════════════════
   BILDERPOOL (Image Pool)
   ══════════════════════════════════════════════════════════════ */

/* ── Pool Navigation (Sidebar) ──────────────────────────────── */
.pool-nav-section {
    padding: 0 4px;
    overflow-y: auto;
    flex: 1;
}
.pool-section-title {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 9.5px;
    font-weight: 500;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: var(--ink-muted);
    padding: 16px 18px 6px;
}
.pool-nav {
    padding: 12px;
    display: flex;
    flex-direction: column;
    gap: 4px;
}
.pool-nav-item {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 8px 12px;
    border-radius: var(--radius-sm);
    border: 1px solid transparent;
    cursor: pointer;
    font-size: 14px;
    color: var(--ink-muted);
    transition: background 0.12s, color 0.12s, border-color 0.12s;
}
.pool-nav-item:hover {
    background: var(--green-soft);
    color: var(--green);
    border-color: var(--green-mid);
}
.pool-nav-item.active {
    background: var(--green-soft);
    color: var(--green);
    border-color: var(--green-mid);
    font-weight: 600;
}
.pool-nav-count {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 10px;
    background: var(--panel-2);
    padding: 2px 6px;
    border-radius: 999px;
    color: var(--ink-muted);
}
.pool-nav-item.active .pool-nav-count {
    /* Solides --green (im Theme-Red Bordeaux) statt --green-mid mit Alpha —
       sonst landet die Pille im Theme-Red bei ~22%-Bordeaux ≈ Rosa, und
       weißer Text darauf wird unlesbar. */
    background: var(--green);
    color: #fff;
}
.pool-nav-actions {
    padding: 8px 12px;
}

/* ── Pool Main Grid ─────────────────────────────────────────── */
.pool-main {
    display: flex;
    flex-direction: column;
    overflow: hidden;
    transition: margin-right 0.2s ease;
}
.pool-toolbar {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 12px 18px;
    border-bottom: 1px solid var(--border);
    background: var(--panel);
}
.pool-toolbar .pool-count {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 11px;
    color: var(--ink-muted);
}
/* Kompakte Speicher-Auslastung rechts in der Pool-Toolbar (Bilder + PDFs).
   Nutzt die Fill-Farblogik der Account-Auslastung (.account-usage-fill). */
.pool-storage {
    margin-left: auto;
    display: flex;
    align-items: center;
    gap: 8px;
}
.pool-storage-label {
    font-size: 11px;
    color: var(--ink-muted);
}
.pool-storage-count {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 11px;
    color: var(--ink-muted);
    white-space: nowrap;
}
.pool-storage-bar {
    width: 90px;
    height: 8px;
    background: rgba(44, 36, 22, 0.1);
    border-radius: 999px;
    overflow: hidden;
    display: inline-block;
}
.pool-grid-wrap {
    flex: 1;
    overflow-y: auto;
    scrollbar-width: thin;
    scrollbar-color: var(--border) transparent;
}
.pool-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
    gap: 14px;
    padding: 18px;
}

/* ── Image Card ─────────────────────────────────────────────── */
.img-card {
    background: var(--panel);
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    overflow: hidden;
    cursor: pointer;
    transition: border-color 0.12s, box-shadow 0.12s;
}
.img-card:hover {
    border-color: var(--green-mid);
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.img-card.selected {
    border-color: var(--green);
    box-shadow: 0 0 0 2px var(--green-soft);
}
.img-card-thumb {
    aspect-ratio: 4/3;
    overflow: hidden;
    background: var(--panel-2);
}
.img-card-thumb img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}
.img-card-info {
    padding: 8px 10px;
}
.img-card-name {
    font-size: 0.88rem;
    font-weight: 600;
    color: var(--ink);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.img-card-meta {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 9px;
    color: var(--ink-muted);
    margin-top: 2px;
}

/* ── Detail Sidebar (Right) ─────────────────────────────────── */
.pool-detail {
    position: fixed;
    right: 0;
    top: 0;
    bottom: 0;
    width: 360px;
    background: var(--panel);
    border-left: 1px solid var(--border);
    box-shadow: -4px 0 20px rgba(0, 0, 0, 0.08);
    z-index: 100;
    transform: translateX(100%);
    transition: transform 0.2s ease;
    display: flex;
    flex-direction: column;
    overflow-y: auto;
}
.pool-detail.open {
    transform: translateX(0);
}
/* Pano-Modus: deutlich breiterer Drawer (Marker-Editor mit Link-Picker
   braucht Platz). max-width verhindert Overflow auf dem Admin-Mindest-
   Viewport (1024px) — dort cappt 96vw statt 1400px. */
.pool-detail--wide {
    width: 1400px;
    max-width: 96vw;
}
@media (max-width: 800px) {
    .pool-detail--wide { width: 100vw; max-width: none; }
}
/* 2-Spalten oben im Pano-Modus: Preview links, Pano-Settings + Marker rechts.
   Visuell als eigene Karte abgesetzt + Trennlinie nach unten, damit klar
   erkennbar ist, dass die Form-Felder darunter ein separater Block sind. */
.pool-detail-pano-grid {
    display: grid;
    grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr) minmax(0, 1fr);
    gap: 16px;
    align-items: start;
    padding: 12px;
    background: var(--panel-2);
    border-radius: var(--radius-sm);
    border: 1px solid var(--border);
    margin-bottom: 4px;
}
.pool-detail-pano-side {
    display: flex;
    flex-direction: column;
    gap: 14px;
}
/* Preview-Spalte = Bild + Zoom-Hinweis darunter. */
.pool-detail-preview-col {
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.pool-detail-pano-hint {
    font-size: 11px;
    color: var(--ink-muted);
    font-style: italic;
    line-height: 1.3;
}
.pool-detail-pano-hint[hidden] { display: none; }
/* 3. Spalte: Marker-Editor (selektierter Marker). */
.pool-detail-pano-editor-col {
    display: flex;
    flex-direction: column;
}
.pool-detail-pano-editor-col[hidden] { display: none; }
.pano-marker-editor-placeholder {
    font-size: 12px;
    color: var(--ink-muted);
    padding: 8px 4px;
    line-height: 1.4;
}
/* Schmaler: Editor-Spalte unter Preview+Liste klappen (2-spaltig). */
@media (max-width: 1180px) {
    .pool-detail-pano-grid { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
}
/* Sehr schmal: alles einspaltig. */
@media (max-width: 720px) {
    .pool-detail-pano-grid { grid-template-columns: 1fr; }
}

/* Untere Sektion (Pano): Felder 1/3 links, Verwendung 2/3 rechts → gewinnt
   Hoehe, schmalere Inputs. Nicht-Pano nutzt diese Klassen nicht (gestapelt). */
.pool-detail-meta-grid {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(0, 2fr);
    gap: 16px;
    align-items: start;
}
.pool-detail-meta-fields {
    display: flex;
    flex-direction: column;
    gap: 14px;
}
@media (max-width: 1180px) {
    .pool-detail-meta-grid { grid-template-columns: 1fr; }
}
/* Geteilte Bausteine (Pano + Nicht-Pano), ersetzen die alten Inline-Styles. */
.pool-detail-dims {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 10px;
    color: var(--ink-muted);
}
.pool-detail-usage-list {
    font-size: .88rem;
    margin-top: 4px;
}
.pool-detail-usage-list > div { break-inside: avoid; }
.pool-detail-usage-empty {
    font-size: .88rem;
    color: var(--ink-muted);
    font-style: italic;
}

/* Section-Heading „Metadaten" vor dem Form-Block — markiert visuell, dass
   unterhalb des Pano-Bereichs noch die Basis-Bildmetadaten kommen. */
.pool-detail-section-head {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 10px;
    font-weight: 600;
    letter-spacing: 0.08em;
    text-transform: uppercase;
    color: var(--ink-muted);
    padding-top: 12px;
    border-top: 1px solid var(--border);
    margin: 4px 0 -4px 0;
}
.pool-detail-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 14px 18px;
    border-bottom: 1px solid var(--border);
}
.pool-detail-header h2 {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 1.1rem;
    font-weight: 600;
    margin: 0;
}
.pool-detail-close {
    background: none;
    border: none;
    cursor: pointer;
    color: var(--ink-muted);
    padding: 4px;
    border-radius: var(--radius-sm);
}
.pool-detail-close:hover {
    background: var(--panel-2);
}
.pool-detail-body {
    padding: 16px 18px;
    display: flex;
    flex-direction: column;
    gap: 14px;
}
.pool-detail-preview {
    width: 100%;
    border-radius: var(--radius-sm);
    overflow: hidden;
    background: var(--panel-2);
}
.pool-detail-preview img {
    max-width: 100%;
    max-height: 280px;
    display: block;
    object-fit: contain;
}

/* ── Pool Buttons ───────────────────────────────────────────── */
.pool-btn {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 7px 14px;
    border-radius: var(--radius-sm);
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 0.9rem;
    font-weight: 600;
    cursor: pointer;
    border: 1px solid;
    transition: all 0.12s;
}
.pool-btn svg {
    width: 14px;
    height: 14px;
    stroke: currentColor;
    fill: none;
    stroke-width: 2;
    stroke-linecap: round;
}
.pool-btn.primary {
    background: var(--green);
    color: #fff;
    border-color: var(--green);
}
.pool-btn.primary:hover {
    background: #327a3b;
}
.pool-btn.primary:disabled {
    background: var(--border);
    border-color: var(--border);
    color: var(--ink-muted);
    cursor: not-allowed;
    opacity: 0.6;
}
.pool-btn.secondary {
    background: var(--panel-2);
    color: var(--ink);
    border-color: var(--border-strong);
}
.pool-btn.secondary:hover {
    background: var(--green-soft);
    color: var(--green);
    border-color: var(--green-mid);
}
/* Markante CTA-Outline: weisser Fill, dunkler 2px-Rahmen, Invert beim Hover.
   Fuer Buttons, die staerker auffallen sollen (Marker-Toggle, „Startwert
   setzen"). Greift nur im secondary-State — wird der Button primary (aktiv),
   gilt die gruene Fuellung. Nach .secondary definiert → gewinnt bei gleicher
   Spezifitaet. */
.pool-btn--cta.secondary {
    background: #fff;
    color: var(--ink);
    border-color: var(--ink);
    border-width: 2px;
}
.pool-btn--cta.secondary:hover {
    background: var(--ink);
    color: #fff;
    border-color: var(--ink);
}
.pool-btn.danger {
    background: transparent;
    color: var(--red);
    border-color: var(--red);
}
.pool-btn.danger:hover {
    background: var(--red);
    color: #fff;
}

/* ── Upload Dialog / Dropzone ───────────────────────────────── */
.upload-overlay {
    position: fixed;
    inset: 0;
    z-index: 200;
    background: rgba(0, 0, 0, 0.5);
    backdrop-filter: blur(3px);
    display: flex;
    align-items: center;
    justify-content: center;
}
.upload-overlay.hidden {
    display: none;
}
.upload-dialog {
    background: var(--panel);
    border-radius: var(--radius);
    padding: 24px;
    width: 440px;
    max-width: 90vw;
    /* Bei wachsendem Inhalt (z.B. lange Kategorie-Liste im catManagerOverlay,
       oder Upload-Dialog auf schmalem Fenster) darf der Dialog nicht aus dem
       Viewport laufen. overflow-y:auto sorgt für outer-scroll im Upload-
       Dialog (Form-Groups stack vertikal, kein dedizierter Inner-Scroller).
       Im catManagerOverlay greift parallel der inner-scroll auf
       #catManagerList — Header/Footer bleiben dort pinned via flex. */
    max-height: 90vh;
    overflow-y: auto;
    box-shadow: 0 12px 40px rgba(0, 0, 0, 0.2);
    display: flex;
    flex-direction: column;
    gap: 16px;
}
/* Kategorie-Liste im Image-/PDF-Pool nimmt den verfügbaren Platz im
   gedeckelten Dialog und scrollt bei Überlauf. min-height:0 ist Pflicht,
   sonst respektiert flex-child die overflow-Vorgabe nicht. */
#catManagerList {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
}
.upload-dialog h2 {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 1.2rem;
    font-weight: 600;
    margin: 0;
}
.upload-dialog .form-label {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 11px;
    font-weight: 500;
    text-transform: uppercase;
    color: var(--ink);
    letter-spacing: 0.06em;
}
.pool-detail .form-label {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 11px;
    font-weight: 500;
    text-transform: uppercase;
    color: var(--ink);
    letter-spacing: 0.06em;
}
.pool-detail .form-group,
.upload-dialog .form-group {
    display: flex;
    flex-direction: column;
    gap: 4px;
    margin-bottom: 0;
}
.pool-detail .form-group input,
.upload-dialog .form-group input {
    width: 100%;
    padding: 7px 10px;
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 0.95rem;
    color: var(--ink);
    background: rgba(255, 255, 255, 0.5);
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    outline: none;
    transition: border-color 0.14s, box-shadow 0.14s;
}
.pool-detail .form-group label,
.upload-dialog .form-group label {
    display: flex;
    font-family: inherit;
    font-size: .88rem;
    font-weight: normal;
    text-transform: none;
    letter-spacing: normal;
    color: inherit;
    margin-bottom: 0;
}
.upload-preview {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 10px;
    padding: 12px;
    border-radius: var(--radius-sm);
    overflow: hidden;
    background: var(--panel-2);
    text-align: center;
    transition: outline-color 0.15s;
    outline: 2px dashed transparent;
    outline-offset: -2px;
}
.upload-preview.drag-over {
    outline-color: var(--green);
}
.upload-preview img {
    max-width: 100%;
    max-height: 200px;
    object-fit: contain;
}

/* Blaue Hinweis-Box im Upload-Dialog: erklärt, wann der Hochladen-Button aktiv
   wird (Bild gewählt + alle Pflichtfelder ausgefüllt). */
.upload-info-box {
    background: #eaf3fb;
    border: 1px solid #cfe2f3;
    border-radius: 4px;
    padding: 9px 11px;
    margin-bottom: 14px;
    font-size: .85rem;
    line-height: 1.45;
    color: #2c5777;
}

.upload-actions {
    display: flex;
    gap: 8px;
    justify-content: flex-end;
}

.dropzone {
    border: 2px dashed var(--border-strong);
    border-radius: var(--radius);
    padding: 32px;
    text-align: center;
    cursor: pointer;
    transition: border-color 0.15s, background 0.15s;
    color: var(--ink-muted);
}
.dropzone:hover,
.dropzone.drag-over {
    border-color: var(--green);
    background: var(--green-soft);
    color: var(--green);
}
.dropzone svg {
    width: 36px;
    height: 36px;
    stroke: currentColor;
    fill: none;
    stroke-width: 1.5;
    margin-bottom: 8px;
}
.dropzone p {
    margin: 4px 0 0;
    font-size: 0.9rem;
}

/* ── Category Management Table ──────────────────────────────── */
.cat-manage-table {
    width: 100%;
    border-collapse: collapse;
}
.cat-manage-table th {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 10px;
    font-weight: 500;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: var(--ink-muted);
    text-align: left;
    padding: 6px 10px;
    border-bottom: 1px solid var(--border);
}
.cat-manage-table td {
    padding: 6px 10px;
    border-bottom: 1px solid var(--border);
    vertical-align: middle;
}
.cat-manage-table td:nth-child(2),
.cat-manage-table td:nth-child(3) {
    width: 1%;
    white-space: nowrap;
}
.cat-manage-table td:nth-child(3) {
    text-align: center;
}
.cat-manage-input {
    width: 100%;
    border: 1px solid var(--border);
    background: rgba(255, 255, 255, 0.5);
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 0.95rem;
    color: var(--ink);
    outline: none;
    padding: 7px 10px;
    border-radius: var(--radius-sm);
    box-sizing: border-box;
    transition: border-color 0.14s, box-shadow 0.14s;
}
.cat-manage-input:focus {
    border-color: var(--green);
    box-shadow: 0 0 0 3px var(--green-soft);
}

/* ── File Table (Dateibereich) ──────────────────────────────── */
.file-table {
    width: 100%;
    border-collapse: collapse;
}
.file-table th {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 10px;
    font-weight: 500;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: var(--ink-muted);
    text-align: left;
    padding: 10px 12px;
    border-bottom: 1px solid var(--border);
    position: sticky;
    top: 0;
    background: var(--panel);
    z-index: 1;
}
.file-table th.col-size,
.file-table td.col-size {
    text-align: right;
    white-space: nowrap;
}
.file-table th.col-langs,
.file-table td.col-langs {
    white-space: nowrap;
}
.file-table td.col-langs .lang-badge + .lang-badge {
    margin-left: 4px;
}
.file-table th.col-open,
.file-table td.col-open {
    width: 36px;
    text-align: center;
}
.file-table tr.file-row {
    cursor: pointer;
    transition: background 0.1s;
}
.file-table tr.file-row:hover {
    background: var(--green-soft);
}
.file-table tr.file-row.selected {
    background: var(--green-soft);
}
/* Printmaps-Liste: die Zeile ist nicht direkt klickbar (nur Title-Link +
   Action-Buttons sind interaktiv). Hover-Highlight wird trotzdem gezeigt —
   wie in der PDF-Liste — als visuelle Orientierungshilfe (welche Zeile bin
   ich gerade auf). Cursor bleibt default, weil der Klick aufs leere Feld
   wirklich nichts tut; nur Title/Buttons zeigen pointer. */
.file-table.printmaps-table tr.file-row {
    cursor: default;
}
/* Aktiver Titel-Link in der Druckkarten-Liste: themed Look statt
   Browser-Default-blau-mit-Unterstrich. Brand-Akzent beim Hover. */
.file-table.printmaps-table tr.file-row td a:not(.btn) {
    color: var(--ink);
    text-decoration: none;
    transition: color 0.12s;
}
.file-table.printmaps-table tr.file-row td a:not(.btn):hover {
    color: var(--green);
}

/* Disabled-Look fuer Spans/Anchors die wie ein Button aussehen sollen aber
   nicht klickbar sind — analog zu .btn:disabled, aber funktioniert auch
   fuer non-button-Elemente (z.B. <span class="btn ghost btn-sm is-disabled">).
   Opacity dezent abgesenkt (nicht so stark wie .btn:disabled-Default), damit
   die Schrift noch klar lesbar bleibt. */
.btn.is-disabled {
    opacity: 0.65;
    cursor: not-allowed;
    pointer-events: auto; /* damit der :hover des umgebenden .has-tooltip greift */
}
.btn.is-disabled:hover {
    background: transparent;
    color: var(--ink-muted);
    border-color: var(--border);
}

/* Pure-CSS-Tooltip mit position:fixed — damit der Tooltip nicht von
   overflow:hidden-Vorfahren (z.B. .settings-main) geclippt wird, was bei
   position:absolute der Fall waere. Die Koordinaten werden via Custom-
   Properties --tip-x / --tip-y gesetzt; ein winziges JS in
   webroot/js/tooltip-positioner.js sorgt dafuer beim Hover/Focus. Ohne JS
   ist der Tooltip mangels Koordinaten unsichtbar (Default 0/0 + Opacity 0). */
.has-tooltip {
    position: relative;
}
.has-tooltip::after {
    content: attr(data-tooltip);
    position: fixed;
    left: var(--tip-x, 0);
    top: var(--tip-y, 0);
    transform: translate(-50%, -100%) translateY(4px);
    background: var(--ink, #1f2937);
    color: #fff;
    padding: 8px 12px;
    border-radius: var(--radius-sm);
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 11px;
    line-height: 1.45;
    font-weight: 500;
    white-space: normal;
    width: 240px;
    text-align: left;
    box-shadow: 0 6px 18px rgba(0, 0, 0, 0.18);
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.12s ease, transform 0.12s ease;
    z-index: 9999;
}
.has-tooltip:hover::after,
.has-tooltip:focus-within::after {
    opacity: 1;
    transform: translate(-50%, -100%) translateY(0);
}
.file-table td {
    padding: 8px 12px;
    border-bottom: 1px solid var(--border);
    font-size: 0.88rem;
    color: var(--ink);
    vertical-align: middle;
}
.file-row-name {
    font-weight: 600;
}
.file-row-meta {
    font-size: 0.88rem;
    color: var(--ink-muted);
}
.file-row-open {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 28px;
    height: 28px;
    border-radius: 6px;
    color: var(--ink-muted);
    text-decoration: none;
    transition: color 0.12s, background 0.12s;
}
.file-row-open:hover {
    color: var(--ink);
    background: var(--panel-2);
}

/* ── Settings > Map > Jobs-Liste ───────────────────────────────── */
/* Job-Liste der KI-Hintergrund-Renders. Wiederverwendet `.file-table` aus
   dem PDFs-Bereich für konsistentes Look-and-Feel mit dem Rest der Admin-App. */
.settings-jobs-section {
    border-bottom: 1px solid var(--border);
    background: var(--panel);
}
.settings-jobs-header {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 12px 18px;
    border-bottom: 1px solid var(--border);
}
.settings-jobs-header .panel-title { margin: 0; font-size: 14px; }
.settings-jobs-header .meta {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 10px;
    color: var(--ink-muted);
    letter-spacing: 0.05em;
}
/* Eigene Scrollbox für die Jobs-Tabelle — Karte unten bleibt stabil sichtbar.
   Sticky-Header (siehe `.file-table th`) klebt automatisch oben in dieser Box. */
.jobs-scroll {
    max-height: 320px;
    overflow-y: auto;
    scrollbar-width: thin;
    scrollbar-color: var(--border) transparent;
}

/* Refresh-Button im Jobs-Header — fixe Mindestbreite damit kein Layout-Shift
   beim Wechsel zwischen den drei Label-States ("aktualisieren" /
   "wird geladen" / "ist aktuell"). Während Loading dreht sich das Icon. */
.btn-refresh-jobs {
    min-width: 240px;
    justify-content: center;
}
.btn-refresh-jobs.is-loading svg {
    animation: spin 0.9s linear infinite;
}

/* ── Stil-Auswahl-Dialog ──────────────────────────────────────── */
/* Großzügig dimensioniert für 2-Spalten-Layout mit großer Vorschau.
   Fixe 90vh-Höhe damit das große Vorschaubild rechts den maximalen Platz
   nutzt — Tabelle links scrollt eigenständig wenn länger als Dialog. */
.upload-dialog.style-dialog {
    width: 1430px;
    max-width: 95vw;
    height: 90vh;
    max-height: 90vh;
}
/* Im Stil-Dialog die InfoBar entkoppeln vom 18px-Settings-Margin —
   sie soll links buendig mit dem H2-Titel sitzen und nur den Flex-Gap
   des Dialogs als Abstand zum Titel haben (kein zusaetzliches margin-top). */
.upload-dialog.style-dialog .settings-info-bar {
    margin: 0;
}
/* Versteckte Radios (Selektion läuft visuell über .check-icon + .is-active). */
.visually-hidden {
    position: absolute;
    width: 1px; height: 1px;
    padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0,0,0,0);
    white-space: nowrap; border: 0;
}

/* 2-Spalten-Grid: links Tabelle (auto-Breite anhand Inhalt), rechts großes
   Preview-Pane (1fr — schluckt den ganzen Restplatz).
   flex:1 + min-height:0 lässt das Grid die volle Resthöhe des 90vh-Dialogs
   einnehmen (Header, Intro, Action-Bar bleiben fix oben/unten). */
.style-dialog-grid {
    flex: 1;
    min-height: 0;
    display: grid;
    grid-template-columns: auto 1fr;
    gap: 16px;
}

/* Linke Spalte — Tabelle in eigener Scrollbox die ihre Grid-Zelle ausfüllt. */
.style-table-wrap {
    overflow-y: auto;
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    scrollbar-width: thin;
    scrollbar-color: var(--border) transparent;
    min-height: 0;
}
.style-table { font-size: 13px; }
.style-table th.col-check,
.style-table td.col-check {
    width: 32px;
    padding-left: 12px;
    padding-right: 0;
    text-align: center;
}
.style-table th.col-style-thumb,
.style-table td.col-style-thumb {
    width: 220px;
    padding: 8px 12px;
}
.style-table tr.style-row {
    cursor: pointer;
}
.style-table tr.style-row.is-active {
    background: var(--green-soft);
}
.style-table tr.style-row .check-icon {
    color: transparent;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 18px; height: 18px;
    transition: color 0.12s;
}
.style-table tr.style-row.is-active .check-icon {
    color: var(--green);
}
.style-thumb {
    display: block;
    width: 202px;
    height: 126px;
    /* cover statt contain — füllt die Box komplett aus, damit die runden Ecken
       am Bild sichtbar werden (bei contain hätten ungenutzte Ränder die Ecken
       transparent gelassen). Minimaler Crop ist als Thumb-Indikator OK. */
    object-fit: cover;
    border-radius: 8px;
}

/* Streifen-Placeholder wenn Vorschaubild fehlt (onerror setzt is-missing).
   Gilt für Thumbnail UND große Vorschau. */
.style-thumb.is-missing,
.style-preview-image.is-missing {
    background:
        repeating-linear-gradient(45deg,
            var(--panel-2) 0 6px,
            var(--border) 6px 7px);
    color: transparent;
}

/* Rechte Spalte — Beschreibung oben, große Vorschau drunter (Querformat). */
.style-preview-pane {
    display: flex;
    flex-direction: column;
    gap: 10px;
    min-width: 0;
}
/* Stilname + Erlaeuterung in einer Zeile mit Em-Dash-Trenner. Beide
   inline, damit sie bei zu wenig Platz natuerlich umbrechen. Schrift-
   wechsel (Serif → Sans) bleibt erhalten und gibt visuellen Kontrast. */
.style-preview-header {
    display: block;
    color: var(--ink);
    line-height: 1.45;
}
.style-preview-name {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 1.25rem;
    font-weight: 600;
    color: var(--ink);
}
.style-preview-name::after {
    content: " — ";
    color: var(--ink-muted);
    font-weight: 400;
}
.style-preview-desc {
    font-size: 15px;
    line-height: 1.55;
    color: var(--ink);
}
/* Container ist nur ein Centering-Helper — keine eigene Optik mehr.
   min-height:0 + flex:1 lassen ihn auf die Resthöhe des Pane schrumpfen,
   max-height kappt zusätzlich, damit das Bild die Action-Bar drunter nicht
   verdrängt. */
.style-preview-image-wrap {
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 0;
    max-height: 60vh;
}
/* Rundungen direkt am Bild — kein sichtbarer Container drumrum. Natürliches
   Aspect-Ratio (kein width/height-Override), nur max-* zur Größenkappung. */
.style-preview-image {
    display: block;
    max-width: 100%;
    max-height: 100%;
    object-fit: contain;
    border-radius: 8px;
}
.file-table th.col-thumb,
.file-table td.col-thumb {
    width: 56px;
    padding: 6px 8px 6px 18px;
}
.file-table th.col-action,
.file-table td.col-action {
    text-align: right;
    white-space: nowrap;
    padding-right: 18px;
}
.file-table td.empty {
    text-align: center;
    color: var(--ink-muted);
    font-style: italic;
    padding: 24px 12px;
}
.job-thumb {
    display: block;
    width: 40px;
    height: 40px;
    object-fit: cover;
    border-radius: 4px;
    border: 1px solid var(--border);
    background: var(--panel-2);
}
.job-thumb.is-source { opacity: 0.5; }
.job-style {
    font-size: 12px;
    font-weight: 500;
    color: var(--ink);
    padding: 2px 8px;
    border-radius: 3px;
    background: var(--panel-2);
    border: 1px solid var(--border);
    white-space: nowrap;
}
.job-status {
    display: inline-block;
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 10px;
    font-weight: 500;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    padding: 2px 8px;
    border-radius: 999px;
    color: var(--ink-muted);
    background: var(--panel-2);
    border: 1px solid var(--border);
}
.job-status.is-pending {
    color: rgba(160, 100, 20, 0.95);
    background: rgba(255, 200, 100, 0.18);
    border-color: rgba(160, 100, 20, 0.3);
}
.job-status.is-processing {
    color: rgba(40, 90, 160, 0.95);
    background: rgba(80, 140, 220, 0.18);
    border-color: rgba(40, 90, 160, 0.3);
}
.job-status.is-completed {
    color: var(--green);
    background: var(--green-soft);
    border-color: var(--green-mid);
}
.job-status.is-failed {
    color: var(--red, #b03a2e);
    background: rgba(176, 58, 46, 0.1);
    border-color: rgba(176, 58, 46, 0.3);
}
.job-stale {
    display: inline-block;
    margin-left: 6px;
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 10px;
    padding: 2px 6px;
    border-radius: 999px;
    color: rgba(160, 100, 20, 0.95);
    background: rgba(255, 200, 100, 0.18);
    border: 1px solid rgba(160, 100, 20, 0.3);
    cursor: help;
}
.job-active-mark {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    color: var(--green);
    font-weight: 600;
    font-size: 12px;
}
.job-error-meta {
    color: var(--red, #b03a2e);
    font-size: 11px;
    cursor: help;
    max-width: 240px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    display: inline-block;
    vertical-align: middle;
}

/* ── Language Badges & Checkboxes ──────────────────────────────── */
/* .lang-badge kommt aus map.css */
.lang-checks {
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.lang-checks .lang-check {
    display: flex;
    align-items: center;
    gap: 4px;
    font-size: 0.88rem;
    cursor: pointer;
    font-family: inherit;
    font-weight: normal;
    text-transform: none;
    letter-spacing: normal;
    color: var(--ink);
    margin-bottom: 0;
}
.lang-checks .lang-check input {
    accent-color: var(--green);
    width: auto;
    padding: 0;
    border: none;
    background: none;
    font-size: inherit;
}

/* ── Confirm Dialog (.confirm-*) — kommt aus map.css ─────────────────── */

/* ══════════════════════════════════════════════════════════════
   EINSTELLUNGEN (Settings)
   ══════════════════════════════════════════════════════════════ */

/* ── Settings-Nav (Sidebar) ─────────────────────────────────── */
.settings-nav-item {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 9px 10px;
    border-radius: var(--radius-sm);
    border: 1px solid transparent;
    text-decoration: none;
    color: var(--ink-muted);
    cursor: pointer;
    transition: background 0.12s, color 0.12s, border-color 0.12s;
    font-size: 14px;
}
.settings-nav-item svg {
    width: 15px;
    height: 15px;
    stroke: currentColor;
    fill: none;
    stroke-width: 1.8;
    stroke-linecap: round;
    flex-shrink: 0;
}
.settings-nav-item:hover {
    background: var(--green-soft);
    color: var(--green);
    border-color: var(--green-mid);
}
.settings-nav-item.is-active {
    background: var(--green-soft);
    color: var(--green);
    border-color: var(--green-mid);
    font-weight: 600;
}
.settings-nav-section {
    padding: 0 4px;
    flex-shrink: 0;
}

/* ── Settings-Main ──────────────────────────────────────────── */
.settings-main {
    display: flex;
    flex-direction: column;
    overflow: hidden;
}
.settings-toolbar {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 12px 18px;
    border-bottom: 1px solid var(--border);
    background: var(--panel);
}
.settings-toolbar .panel-title { margin: 0; }
.settings-toolbar .meta { margin-left: 4px; }
/* Druckkarten-Verbrauchszähler (#pmCount): neutrale Pille mit Verbrauch/Cap
   ("X von max. Y"); .is-full färbt sie rot, sobald das Tarif-Limit erreicht ist
   — gleiche Optik wie der Kartenobjekt-Zähler im Karten-Editor. */
#pmCount {
    display: inline-flex;
    align-items: center;
    padding: 0 8px;
    height: 24px;
    font-size: 12px;
    font-weight: 600;
    color: var(--ink-muted);
    background: rgba(0, 0, 0, 0.04);
    border-radius: 6px;
}
#pmCount.is-full {
    color: #fff;
    background: var(--red, #dc2626);
}
.settings-info-bar {
    margin: 18px 18px 0;
    padding: 12px 16px;
    font-size: 13px;
    color: var(--ink-muted);
    line-height: 1.5;
    background: rgba(0, 0, 0, 0.04);
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
}
/* Stärker lesbare Variante — wird zum Tweaken nur auf einzelnen Settings-
   Seiten angewendet (Modifier-Klasse). Bei Erfolg in den Default überführen. */
.settings-info-bar.is-strong {
    color: #15315c;
    background: rgba(80, 140, 220, 0.10);
    border: 1px solid rgba(40, 90, 160, 0.30);
    font-size: 14px;
    font-weight: 500;
    line-height: 1.55;
}
.settings-content {
    flex: 1;
    overflow-y: auto;
    padding: 18px;
    display: flex;
    flex-direction: column;
    gap: 12px;
}

/* ── Category cards ─────────────────────────────────────────── */
.cat-card {
    display: flex;
    align-items: center;
    gap: 14px;
    padding: 12px 16px;
    border-radius: var(--radius-sm);
    border: 1px solid var(--border);
    background: var(--panel);
    cursor: pointer;
    transition: border-color 0.12s, box-shadow 0.12s;
}
.cat-card:hover {
    border-color: var(--green-mid);
    box-shadow: 0 1px 4px rgba(0, 0, 0, 0.06);
}
.cat-card.is-active {
    border-color: var(--green);
    box-shadow: 0 0 0 2px var(--green-soft);
}
.cat-color {
    width: 20px;
    height: 20px;
    border-radius: 4px;
    flex-shrink: 0;
    border: 1px solid rgba(0, 0, 0, 0.12);
}
.cat-info { flex: 1; min-width: 0; }
.cat-title { font-weight: 600; font-size: 14px; }
.cat-desc {
    font-size: 12px;
    color: var(--ink-muted);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    margin-top: 2px;
}
.cat-count {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 10px;
    background: var(--panel-2);
    padding: 2px 8px;
    border-radius: 999px;
    color: var(--ink-muted);
    flex-shrink: 0;
}

/* ── Translation badges ─────────────────────────────────────── */
/* .trans-badges, .trans-badge, .trans-badge.has — kommen aus map.css */

/* ── Detail panel (Settings) ────────────────────────────────── */
.detail-panel {
    position: fixed;
    top: 0;
    right: 0;
    bottom: 0;
    width: 480px;
    max-width: 90vw;
    background: var(--panel);
    border-left: 1px solid var(--border);
    box-shadow: var(--shadow-lg);
    z-index: 100;
    transform: translateX(100%);
    transition: transform 0.2s ease;
    display: flex;
    flex-direction: column;
}
.detail-panel.open { transform: translateX(0); }
.detail-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 16px 20px;
    border-bottom: 1px solid var(--border);
}
.detail-header h3 { margin: 0; font-size: 16px; }
.detail-body {
    flex: 1;
    overflow-y: auto;
    padding: 20px;
    display: flex;
    flex-direction: column;
    gap: 16px;
}
.detail-footer {
    padding: 14px 20px;
    border-top: 1px solid var(--border);
    display: flex;
    gap: 8px;
    justify-content: flex-end;
}

/* ── Detail panel form overrides ────────────────────────────── */
.detail-body .form-group {
    display: flex;
    flex-direction: column;
    gap: 4px;
    margin-bottom: 0;
}
.detail-body .form-group label {
    display: block;
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 11px;
    font-weight: 500;
    letter-spacing: 0.06em;
    text-transform: uppercase;
    color: var(--ink);
    margin-bottom: 0;
}
.detail-body .form-group input:not(.form-color-input),
.detail-body .form-group textarea {
    width: 100%;
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    padding: 8px 10px;
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 14px;
    color: var(--ink);
    background: rgba(255, 255, 255, 0.5);
    outline: none;
    transition: border-color 0.14s;
    -webkit-appearance: none;
}
.detail-body .form-group input:focus,
.detail-body .form-group textarea:focus {
    border-color: var(--green);
    box-shadow: 0 0 0 2px var(--green-soft);
    background: rgba(255, 255, 255, 0.7);
}
.detail-body .form-group textarea {
    min-height: 60px;
    resize: vertical;
}

/* ── Color picker ───────────────────────────────────────────── */
.form-color-wrap { display: flex; align-items: center; gap: 10px; }
.form-color-input {
    width: 40px;
    height: 34px;
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    padding: 2px;
    cursor: pointer;
    background: var(--bg);
}
.form-color-hex {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 12px;
    color: var(--ink-muted);
}

/* .locale-tabs, .locale-tab, .locale-pane — kommen aus map.css */

/* .btn und Varianten — kommen aus map.css */

/* ── Icon button ────────────────────────────────────────────── */
.btn-icon {
    width: 32px;
    height: 32px;
    border-radius: var(--radius-sm);
    border: 1px solid var(--border);
    background: var(--panel);
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--ink-muted);
    transition: background 0.12s, color 0.12s;
}
.btn-icon:hover { background: var(--panel-2); color: var(--ink); }

/* .toast und Varianten — kommen aus map.css */

/* Setup-Toast (dark, rounded corner, slide-from-top) — überschreibt den hellen
 * Pill-Toast aus map.css. Im Prototyp ist diese Variante in setup/index.php +
 * setup/osm.php als seiten-lokaler Style definiert. */
body:has(.setup-layout) .toast {
    top: 20px; left: 50%; transform: translateX(-50%) translateY(-8px);
    background: var(--ink); color: var(--bg);
    padding: 9px 18px; border-radius: var(--radius-sm);
    border: none; box-shadow: none;
    transition: opacity .2s, transform .2s;
    z-index: 300;
}
body:has(.setup-layout) .toast.show {
    transform: translateX(-50%) translateY(0);
}
body:has(.setup-layout) .toast.success {
    background: var(--green); color: white; border: none;
}
body:has(.setup-layout) .toast.error {
    background: var(--red); color: white; border: none;
}

/* ── Amenities: group cards & amenity rows ──────────────────── */
.amenities-content { gap: 0; }

.group-card {
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    background: var(--panel);
    margin-bottom: 12px;
}
.group-header {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px 14px;
    cursor: pointer;
    border-bottom: 1px solid transparent;
    transition: background 0.12s;
}
.group-header:hover { background: rgba(0, 0, 0, 0.02); }
.group-card.open .group-header { border-bottom-color: var(--border); }
.group-drag-handle {
    cursor: grab;
    color: var(--ink-muted);
    flex-shrink: 0;
    display: flex;
    align-items: center;
}
.group-drag-handle:active { cursor: grabbing; }
/* Settings-Variante des Chevrons innerhalb einer .group-card (kleiner, ohne Padding) */
.group-card .group-chevron {
    width: 18px;
    height: 18px;
    padding: 0;
    cursor: default;
    border-radius: 0;
}
.group-card.open .group-chevron { transform: rotate(90deg); }
.group-title { font-weight: 600; font-size: 14px; flex: 1; min-width: 0; }
/* Settings-Variante des Counts innerhalb einer .group-card (Pill statt Mini-Text) */
.group-card .group-count {
    font-size: 10px;
    background: var(--panel-2);
    padding: 2px 8px;
    border-radius: 999px;
    flex-shrink: 0;
}
.group-actions { display: flex; gap: 4px; flex-shrink: 0; }

.group-body { display: none; padding: 0; }
.group-card.open .group-body { display: block; }
.amenity-list { min-height: 4px; }
.amenity-row {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px 14px 8px 38px;
    border-bottom: 1px solid rgba(0, 0, 0, 0.04);
    transition: background 0.08s;
}
.amenity-row:hover { background: rgba(0, 0, 0, 0.02); }
.amenity-row:last-child { border-bottom: none; }
.amenity-drag-handle {
    cursor: grab;
    color: var(--ink-muted);
    flex-shrink: 0;
    display: flex;
    align-items: center;
}
.amenity-drag-handle:active { cursor: grabbing; }
.amenity-title { flex: 1; font-size: 14px; min-width: 0; }
.amenity-actions { display: flex; gap: 4px; flex-shrink: 0; }
.group-add-row {
    padding: 8px 14px 10px 38px;
    border-top: 1px solid var(--border);
}

/* .sortable-ghost — kommt aus map.css */
.sortable-drag { box-shadow: var(--shadow-lg); }

.act-btn {
    width: 28px;
    height: 28px;
    border-radius: var(--radius-sm);
    border: 1px solid transparent;
    background: transparent;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--ink-muted);
    transition: background 0.12s, color 0.12s, border-color 0.12s;
}
.act-btn svg { width: 14px; height: 14px; stroke: currentColor; fill: none; stroke-width: 2; stroke-linecap: round; }
.act-btn:hover { background: var(--panel-2); border-color: var(--border); color: var(--ink); }
.act-btn.danger:hover { color: var(--red); border-color: var(--red); background: rgba(180, 40, 40, 0.06); }

/* .btn-spinner und @keyframes btnSpin — kommen aus map.css */
.btn:disabled, .btn[disabled],
.pool-btn:disabled, .pool-btn[disabled] { opacity: 0.6; cursor: wait; pointer-events: none; }

.amenity-empty {
    padding: 12px 14px 12px 38px;
    font-size: 13px;
    color: var(--ink-muted);
    font-style: italic;
}

/* ── Setup / Arbeitsbereich ──────────────────────────────────── */
.setup-nav-item {
    display: flex; align-items: center; gap: 10px;
    padding: 9px 10px; border-radius: var(--radius-sm);
    border: 1px solid transparent; text-decoration: none;
    color: var(--ink-muted); cursor: pointer;
    transition: background 0.12s, color 0.12s, border-color 0.12s;
    font-size: 14px;
}
.setup-nav-item svg { width: 15px; height: 15px; stroke: currentColor; fill: none; stroke-width: 1.8; stroke-linecap: round; flex-shrink: 0; }
.setup-nav-item:hover    { background: var(--green-soft); color: var(--green); border-color: var(--green-mid); }
.setup-nav-item.is-active { background: var(--green-soft); color: var(--green); border-color: var(--green-mid); font-weight: 600; }
.setup-nav-section { padding: 0 4px; flex-shrink: 0; }
.setup-nav-title { font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9.5px; font-weight: 500; letter-spacing: .12em; text-transform: uppercase; color: var(--ink-muted); margin-bottom: 10px; }
.setup-step-num {
    width: 24px; height: 24px; border-radius: 50%; flex-shrink: 0;
    background: var(--green-soft); border: 1.5px solid var(--green-mid);
    color: var(--green); font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 11px; font-weight: 600;
    display: flex; align-items: center; justify-content: center; margin-top: 2px;
}
/* Tastatur-Tasten in Anleitungstexten (Prototyp Setup verwendet diesen Look inline) */
.app-backend kbd {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 10px;
    padding: 1px 5px;
    border: 1px solid var(--border);
    border-radius: 4px;
    background: var(--panel-2);
    color: var(--ink);
}

/* Setup layout: map links, info rechts (.main-area-Override oben gesetzt) */
.setup-layout { display: flex; flex: 1; min-width: 0; min-height: 0; gap: 12px; align-items: stretch; }
.app-backend .r-panel {
    /* Override gegen map.css's `.r-panel` (das für Map-Edit-Panels gedacht ist
     * mit padding/gap/flex:1). Setup-Right-Sidebar nutzt die volle Breite ohne
     * inneres Padding — die .sb-section-Children haben ihr eigenes Padding. */
    flex: none;
    width: clamp(320px, 35vw, 640px);
    padding: 0;
    gap: 0;
}

/* Setup map — analog zur Prototyp-Struktur:
 * .setup-main ist 2-row grid (topbar als auto-row, map-shell als 1fr-row, gap 12px).
 * .topbar bekommt seinen Karten-Look (border + radius + shadow) aus map.css. */
.setup-main {
    flex: 1 1 0;
    min-width: 0;
    height: 100%;
    display: grid;
    grid-template-rows: auto 1fr;
    gap: 12px;
}

.map:not(.promo-feature-icon):not(.home-tab-icon) { position: absolute; inset: 0; }

.map-search-wrap { position: absolute; top: 12px; left: 56px; z-index: 20; width: 260px; }
.map-search-row { display: flex; gap: 6px; }
.map-search-input {
    flex: 1; height: 34px; padding: 0 10px; border-radius: var(--radius-sm);
    border: 1px solid var(--border-strong); background: var(--panel);
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 13px; color: var(--ink);
    outline: none; box-shadow: var(--shadow); transition: border-color 0.14s;
}
.map-search-input:focus { border-color: var(--green); box-shadow: 0 0 0 3px var(--green-soft); }
.map-search-btn {
    width: 34px; height: 34px; border-radius: var(--radius-sm);
    border: 1px solid var(--border-strong); background: var(--panel);
    cursor: pointer; display: flex; align-items: center; justify-content: center;
    box-shadow: var(--shadow); transition: background 0.12s, color 0.12s; color: var(--ink-muted);
    flex-shrink: 0;
}
.map-search-btn:hover { background: var(--green-soft); color: var(--green); }
.map-search-btn svg { width: 14px; height: 14px; stroke: currentColor; fill: none; stroke-width: 2.2; stroke-linecap: round; }
.map-search-results {
    margin-top: 4px; background: var(--panel); border: 1px solid var(--border);
    border-radius: var(--radius-sm); box-shadow: var(--shadow-lg); overflow: hidden; display: none;
}
.map-search-result {
    padding: 8px 12px; cursor: pointer; font-size: 13px;
    border-bottom: 1px solid rgba(160, 140, 100, 0.1); transition: background 0.12s;
}
.map-search-result:last-child { border-bottom: none; }
.map-search-result:hover { background: var(--green-soft); }
.map-search-result-name { font-weight: 600; color: var(--ink); }
.map-search-result-sub { font-size: 11px; color: var(--ink-muted); margin-top: 1px; }

/* Right-sidebar sections */
.sb-section { padding: 14px 16px; border-bottom: 1px solid var(--border); flex-shrink: 0; }
.sb-label { font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9.5px; font-weight: 500; letter-spacing: .12em; text-transform: uppercase; color: var(--ink-muted); margin-bottom: 10px; }
.bbox-mono { font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 11px; background: var(--panel-2); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 10px 12px; color: var(--ink); line-height: 1.7; min-height: 48px; }
.bbox-mono.empty { color: var(--ink-muted); font-style: italic; }
.saved-bbox { padding: 10px 12px; border-radius: var(--radius-sm); background: var(--green-soft); border: 1px solid var(--green-mid); font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 11px; color: var(--green); line-height: 1.7; }
.saved-bbox .lbl { font-size: 9px; text-transform: uppercase; letter-spacing: .1em; color: var(--ink-muted); margin-bottom: 3px; }
.btn-row { display: flex; gap: 8px; }
.btn-row .btn.primary { flex: 1; }

.sidebar-statusbar {
    flex-shrink: 0; height: 30px; border-top: 1px solid var(--border);
    padding: 0 16px; display: flex; align-items: center; gap: 12px;
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 10px; color: var(--ink-muted);
    margin-top: auto;
}
.st-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--ink-muted); flex-shrink: 0; }
.st-dot.green { background: var(--green); }
.st-dot.amber { background: var(--amber); }
.st-dot.red { background: var(--red); }

/* Modal */
.modal-overlay {
    position: fixed; inset: 0; z-index: 200;
    background: rgba(44, 36, 22, 0.45); backdrop-filter: blur(4px);
    display: flex; align-items: center; justify-content: center;
    opacity: 0; pointer-events: none; transition: opacity 0.2s;
}
.modal-overlay.open { opacity: 1; pointer-events: all; }
.modal-box {
    background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius);
    box-shadow: var(--shadow-lg); padding: 28px; width: 400px; max-width: 90vw;
}
.modal-title { font-size: 18px; font-weight: 600; margin-bottom: 8px; }
.modal-body { font-size: 14px; color: var(--ink-muted); line-height: 1.6; margin-bottom: 20px; }
.modal-body strong { color: var(--ink); }
.modal-actions { display: flex; flex-direction: column; gap: 8px; }
.modal-actions .btn { justify-content: center; }

/* ── Setup OSM ─────────────────────────────────────────────── */
.no-area-banner {
    display: none; position: absolute; inset: 0; z-index: 30;
    background: rgba(242, 237, 227, 0.92); backdrop-filter: blur(4px);
    flex-direction: column; align-items: center; justify-content: center;
    gap: 16px; padding: 32px; text-align: center;
}
.no-area-banner.visible { display: flex; }

/* ── Intro-Screen Block-Editor ───────────────────────────── */
/* Phone-Frame als visuelle Hülle für die Live-Preview links — vermittelt
   sofort dass das Ergebnis auf einem Smartphone gesehen wird. */
.intro-phone-frame {
    width: 100%;
    max-width: 380px;
    margin: 0 auto;
    aspect-ratio: 9 / 19;
    background: #1a1a1a;
    border-radius: 36px;
    padding: 14px;
    box-shadow: 0 8px 30px rgba(0, 0, 0, 0.18);
    box-sizing: border-box;
    position: sticky;
    top: 16px;
}
.intro-phone-screen {
    width: 100%;
    height: 100%;
    background: #fff;
    border-radius: 22px;
    overflow-y: auto;
    overflow-x: hidden;
    padding: 18px 16px 24px;
    box-sizing: border-box;
    -webkit-overflow-scrolling: touch;
}
.intro-preview-empty {
    color: var(--ink-muted);
    text-align: center;
    padding: 60px 16px;
    font-size: 13px;
    line-height: 1.5;
}

/* Preview-Bausteine — sollen visuell dem Frontend-Render nahe kommen,
   müssen aber nicht 1:1 identisch sein (wir wollen Lesbarkeit + Geschwindigkeit). */
.intro-preview-image,
.intro-preview-image-placeholder {
    display: block;
    width: 100%;
    max-height: 220px;
    object-fit: cover;
    border-radius: 8px;
    margin-bottom: 16px;
}
.intro-preview-image-placeholder {
    height: 140px;
    background: #f1f1f1;
    color: #999;
    font-size: 32px;
    display: flex;
    align-items: center;
    justify-content: center;
}
/* --intro-font wird von intro-screen-editor.js auf .intro-phone-screen gesetzt
   (basierend auf dem Font-Dropdown). Headline behält Syne als Fallback wenn
   noch keine Variable gesetzt ist (Initial-Render vor JS-Bootstrap). */
.intro-preview-headline {
    font-family: var(--intro-font, 'Syne', sans-serif);
    font-size: 22px;
    font-weight: 700;
    line-height: 1.2;
    color: #1a1a17;
    margin: 0 0 12px;
}
.intro-preview-text,
.intro-preview-list {
    font-family: var(--intro-font, inherit);
    font-size: 14px;
    line-height: 1.55;
    color: #2c2416;
    margin: 0 0 14px;
}
.intro-preview-button {
    /* Tab-Switcher-Look — Werte gespiegelt aus frontend.css (.intro-block-button).
       inline-block damit mehrere Buttons nebeneinander fließen können.
       border-radius 12px = "fast rechteckig mit runden Ecken" wie im
       Parktipps-Screenshot. */
    display: inline-block;
    vertical-align: top;
    text-align: center;
    text-decoration: none;
    padding: 8px 16px;
    border-radius: 10px;
    font-weight: 600;
    font-size: 13.5px;
    font-family: var(--intro-font, inherit);
    margin: 5px 6px 6px 0;
    border: 2px solid transparent;
    box-sizing: border-box;
    box-shadow: 0 2px 6px rgba(0,0,0,0.08);
    transition: transform .12s ease, box-shadow .18s ease, background .18s ease;
    cursor: pointer;
}
.intro-preview-button:hover {
    box-shadow: 0 4px 14px rgba(0,0,0,0.14);
    transform: translateY(-1px);
}
.intro-preview-button:active {
    transform: translateY(0) scale(0.98);
    box-shadow: 0 1px 3px rgba(0,0,0,0.10);
}
/* Button-Farb-Varianten — Werte gespiegelt in frontend.css (.intro-block-button--*)
   damit Preview und Map-Frontend identisch aussehen. */
/* Alle Varianten: konstanter leicht abgedunkelter-Weiß-Hintergrund.
   Variant-Farbe setzt NUR Border + Text — gespiegelt aus frontend.css. */
/* Primary = gefüllt (Standard-CTA-Look), die übrigen Varianten = Outline auf
   cremigem Hintergrund. Trennung Primary ↔ Outline sonst unsichtbar. */
.intro-preview-button--secondary,
.intro-preview-button--outline,
.intro-preview-button--dark {
    background: #f4f2ea;
}
.intro-preview-button--primary {
    background: #15803d;
    color: #fff;
    border-color: #15803d;
}
.intro-preview-button--secondary {
    color: #1d4ed8;
    border-color: #1d4ed8;
}
.intro-preview-button--outline {
    color: #15803d;
    border-color: #15803d;
}
.intro-preview-button--dark {
    color: #1f2937;
    border-color: #1f2937;
}

/* Block-Card rechts — Header (Drag-Handle + Type-Label + Delete) + Body. */
.intro-blocks-list {
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.intro-block-card {
    border: 1px solid var(--border);
    border-radius: 8px;
    background: var(--panel);
    overflow: hidden;
}
.intro-block-header {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 12px;
    background: rgba(0, 0, 0, 0.02);
    border-bottom: 1px solid var(--border);
}
.intro-block-handle {
    cursor: grab;
    color: var(--ink-muted);
    display: inline-flex;
    align-items: center;
    padding: 2px;
}
.intro-block-handle:active {
    cursor: grabbing;
}
.intro-block-type {
    flex: 1;
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    color: var(--ink-muted);
}
.intro-block-delete {
    padding: 2px 10px;
    line-height: 1;
    font-size: 18px;
}
.intro-block-body {
    padding: 12px;
}
.intro-block-image-body {
    display: flex;
    align-items: center;
    gap: 12px;
}
.intro-block-image-thumb {
    width: 80px;
    height: 60px;
    object-fit: cover;
    border-radius: 4px;
    border: 1px solid var(--border);
}

/* Auf engen Viewports (< 1100px): Stack statt Split. */
@media (max-width: 1100px) {
    .intro-editor-split {
        grid-template-columns: 1fr !important;
    }
    .intro-phone-frame {
        position: static;
    }
}

/* ── Editor.js Host (Settings → Intro-Screen) ─────────────── */
/* Editor.js bringt seine eigenen Block-/Toolbar-Styles mit, wir setzen nur
   den Hintergrund-Container + ein bisschen Whitespace damit's nicht direkt
   am Card-Rand klebt. Custom Image/Button-Plugins haben eigene Klassen. */
.intro-editorjs-host {
    border: 1px solid var(--border);
    border-radius: 8px;
    background: var(--panel);
    padding: 16px 20px;
    min-height: 300px;
}
.intro-editorjs-host .ce-block__content,
.intro-editorjs-host .ce-toolbar__content {
    max-width: 100%; /* override Editor.js' default 650px */
}
.intro-editorjs-host .codex-editor__redactor {
    padding-bottom: 80px !important; /* Platz für die "+"-Toolbox am letzten Block */
}
.intro-editorjs-host .camply-image-block {
    padding: 8px 0;
}
.intro-editorjs-host .camply-button-block input {
    width: 100%;
    padding: 6px 10px;
    border: 1px solid var(--border);
    border-radius: 4px;
    font-size: 13px;
}

/* ── Intro-Screen: Locale-Chip-Bar (Multilang) ─────────────── */
/* Eine Reihe Chips unter der Settings-Toolbar. Source-Chip ist nicht klickbar
   (Pseudo-Tab), Translation-Chips sind <button> + öffnen das Übersetzungs-
   Panel. Status-Farben aus dem App-Theme (green/amber/red). */
.intro-locale-bar {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    padding: 10px 24px;
    border-bottom: 1px solid var(--border);
    background: var(--panel);
}
.intro-locale-chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 4px 10px;
    border-radius: 14px;
    border: 1px solid var(--border-strong);
    background: var(--panel-2);
    font-size: 12px;
    line-height: 1;
    cursor: pointer;
    color: var(--ink);
    font-family: inherit;
}
button.intro-locale-chip:hover {
    background: var(--panel-3, var(--panel-2));
    border-color: var(--green-mid);
}
.intro-locale-chip.is-source {
    cursor: default;
    background: transparent;
    border-style: dashed;
}
/* Status-Farben sind semantisch (grün = fertig, rot = veraltet) und müssen feste
   Literale sein — NICHT var(--green*)/var(--red*): theme-red mappt --green auf
   Bordeaux, wodurch beide Zustände sonst rot und ununterscheidbar würden. */
.intro-locale-chip.is-complete {
    background: rgba(58, 125, 68, 0.10);
    border-color: rgba(58, 125, 68, 0.45);
    color: #3a7d44;
}
.intro-locale-chip.is-stale {
    background: rgba(192, 57, 43, 0.10);
    border-color: rgba(192, 57, 43, 0.45);
    color: #c0392b;
}
.intro-locale-chip.is-partial {
    background: rgba(245, 158, 11, 0.10);
    border-color: rgba(217, 119, 6, 0.45);
    color: #b45309;
}
.intro-locale-chip.is-empty {
    color: var(--ink-muted);
}
.intro-locale-chip-label {
    font-weight: 600;
}
.intro-locale-chip-count {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 11px;
    opacity: 0.8;
}
.intro-locale-chip-status {
    font-size: 11px;
    opacity: 0.7;
}
.intro-locale-chip-stale {
    color: #d97706;
    font-weight: 700;
}
.intro-locale-add-btn {
    padding: 4px 12px;
    border-radius: 14px;
    border: 1px dashed var(--border-strong);
    background: transparent;
    color: var(--ink-muted);
    font-size: 12px;
    cursor: pointer;
    font-family: inherit;
}
.intro-locale-add-btn:hover {
    background: var(--green-soft);
    color: var(--green);
    border-color: var(--green-mid);
    border-style: solid;
}

/* ── Übersetzungs-Panel (slide-in von rechts) ──────────────── */
.intro-translation-panel {
    position: fixed;
    inset: 0;
    z-index: 9100;
    display: none;
}
.intro-translation-panel.is-visible {
    display: block;
}
.intro-translation-panel-backdrop {
    position: absolute;
    inset: 0;
    background: rgba(0, 0, 0, 0.4);
}
.intro-translation-panel-box {
    position: absolute;
    top: 0; right: 0; bottom: 0;
    width: min(640px, 95vw);
    background: var(--panel);
    box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);
    display: flex;
    flex-direction: column;
}
.intro-translation-panel-header {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 16px 20px;
    border-bottom: 1px solid var(--border);
}
.intro-translation-panel-title {
    margin: 0;
    flex: 1;
    font-size: 18px;
    font-weight: 600;
}
.intro-translation-panel-intro {
    padding: 12px 20px;
    font-size: 13px;
    color: var(--ink-muted);
}
.intro-translation-panel-status {
    padding: 0 20px 8px;
    font-size: 13px;
}
.intro-translation-progress {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    color: var(--ink-muted);
}
.intro-translation-stale {
    margin-top: 6px;
    padding: 6px 10px;
    background: rgba(245, 158, 11, 0.12);
    border-left: 3px solid #d97706;
    color: #92400e;
    font-size: 12px;
    border-radius: 4px;
}
.intro-translation-panel-body {
    flex: 1;
    overflow-y: auto;
    padding: 8px 20px 20px;
}
.intro-translation-group {
    margin-bottom: 18px;
    padding-bottom: 12px;
    border-bottom: 1px dashed var(--border);
}
.intro-translation-group:last-child {
    border-bottom: none;
}
.intro-translation-group-title {
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--ink-muted);
    margin-bottom: 8px;
}
.intro-translation-subtitle {
    font-size: 11px;
    color: var(--ink-muted);
    margin: 8px 0 4px;
}
.intro-translation-row {
    margin-bottom: 10px;
}
.intro-translation-source {
    display: flex;
    flex-direction: column;
    gap: 2px;
    font-size: 12px;
    color: var(--ink-muted);
    padding: 4px 8px;
    background: var(--panel-2);
    border-radius: 4px 4px 0 0;
}
.intro-translation-source-label {
    font-size: 10px;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    opacity: 0.7;
}
.intro-translation-source-text {
    color: var(--ink);
    line-height: 1.4;
}
.intro-translation-input-wrap {
    border-radius: 0 0 4px 4px;
    border: 1px solid var(--border);
    border-top: none;
    background: var(--panel);
    overflow: hidden;
}
.intro-translation-toolbar {
    display: flex;
    gap: 2px;
    padding: 4px 6px;
    background: var(--panel-2);
    border-bottom: 1px solid var(--border);
}
.intro-translation-tool {
    width: 26px;
    height: 24px;
    border: 1px solid var(--border-strong);
    background: var(--panel);
    cursor: pointer;
    border-radius: 3px;
    color: var(--ink);
    font-size: 12px;
    line-height: 1;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0;
}
.intro-translation-tool:hover {
    background: var(--green-soft);
    border-color: var(--green-mid);
    color: var(--green);
}
.intro-translation-tool:active {
    transform: translateY(1px);
}
.intro-translation-tool mark {
    background: rgba(245, 230, 130, 0.6);
    color: inherit;
    padding: 0 2px;
    border-radius: 2px;
}
.intro-translation-input {
    width: 100%;
    min-height: 32px;
    padding: 6px 8px;
    border: none !important;
    outline: none;
    background: var(--panel);
    line-height: 1.4;
    /* Inline-Formatierung im contenteditable rendern wir mit den Tag-Defaults
       (b/strong/i/em/mark/u) — kein zusaetzliches CSS noetig. */
}
.intro-translation-input:empty::before {
    content: attr(data-placeholder);
    color: var(--ink-muted);
    pointer-events: none;
}
.intro-translation-input:focus {
    background: var(--green-soft, var(--panel));
}
.intro-translation-input mark {
    background: rgba(245, 230, 130, 0.6);
    padding: 0 1px;
}
.intro-translation-empty,
.intro-translation-error {
    padding: 20px;
    text-align: center;
    color: var(--ink-muted);
    font-style: italic;
}
.intro-translation-error {
    color: var(--red);
}
.intro-translation-panel-footer {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 12px 20px;
    border-top: 1px solid var(--border);
    background: var(--panel-2);
}

/* ── Add-Locale-Dialog ─────────────────────────────────────── */
.intro-addlocale-dialog {
    position: fixed;
    inset: 0;
    z-index: 9200;
    display: none;
}
.intro-addlocale-dialog.is-visible {
    display: block;
}
.intro-addlocale-backdrop {
    position: absolute;
    inset: 0;
    background: rgba(0, 0, 0, 0.5);
}
.intro-addlocale-box {
    position: absolute;
    top: 50%; left: 50%;
    transform: translate(-50%, -50%);
    width: min(440px, 92vw);
    max-height: 80vh;
    background: var(--panel);
    border-radius: 12px;
    box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
    display: flex;
    flex-direction: column;
}
.intro-addlocale-header {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 16px 20px;
    border-bottom: 1px solid var(--border);
}
.intro-addlocale-title {
    margin: 0;
    flex: 1;
    font-size: 16px;
    font-weight: 600;
}
.intro-addlocale-list {
    overflow-y: auto;
    padding: 12px 20px;
    display: flex;
    flex-direction: column;
    gap: 6px;
}
.intro-addlocale-item {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 10px 14px;
    border: 1px solid var(--border);
    border-radius: 8px;
    background: var(--panel-2);
    cursor: pointer;
    text-align: left;
    font-family: inherit;
}
.intro-addlocale-item:hover {
    background: var(--green-soft);
    border-color: var(--green-mid);
}
.intro-addlocale-item-label {
    flex: 1;
    font-weight: 500;
}
.intro-addlocale-item-code {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 11px;
    color: var(--ink-muted);
}
.intro-addlocale-empty {
    text-align: center;
    color: var(--ink-muted);
    font-style: italic;
    padding: 24px;
}

.no-area-banner svg { width: 48px; height: 48px; stroke: var(--amber); fill: none; stroke-width: 1.5; stroke-linecap: round; opacity: 0.8; }
.no-area-banner h3 { font-size: 18px; font-weight: 600; color: var(--ink); }
.no-area-banner p { font-size: 14px; color: var(--ink-muted); line-height: 1.6; max-width: 280px; }

.osm-panel { position: relative; }
.osm-empty-hint { padding: 24px 16px; text-align: center; color: var(--ink-muted); font-style: italic; font-size: 13px; }

.type-row {
    display: flex; align-items: center; gap: 8px;
    padding: 6px 8px; border-radius: 8px; cursor: pointer; user-select: none;
    /* Zarter Akzent-Wash (Theme-Akzent, in Theme-Red = Bordeaux), damit die
       Checkbox-Reihe visuell klar als interaktive Auswahl-Zone wirkt. */
    background: var(--green-soft);
    transition: background 0.12s;
}
.type-row:hover { background: var(--green-mid); }
.type-row .type-check {
    width: 18px; height: 18px; border-radius: 5px; flex-shrink: 0;
    border: 1.5px solid rgba(160, 140, 100, 0.5);
    display: flex; align-items: center; justify-content: center;
    transition: background 0.12s, border-color 0.12s;
}
.type-row .type-check svg { width: 10px; height: 10px; opacity: 0; transition: opacity 0.12s; }
.type-row.checked .type-check { background: var(--green); border-color: var(--green); }
.type-row.checked .type-check svg { opacity: 1; }
.type-row span { font-size: 14px; flex: 1; }
.type-row .type-count { font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 10px; color: var(--ink-muted); flex: none; }

.result-item {
    display: flex; flex-direction: column; align-items: stretch; gap: 3px;
    padding: 7px 16px; border-bottom: 1px solid rgba(160, 140, 100, 0.1);
    font-size: 13px; cursor: pointer; transition: background 0.12s;
}
.result-item:hover { background: rgba(160, 140, 100, 0.07); }
.result-item.dupe { opacity: 0.45; }
.result-item.active { background: rgba(37, 99, 235, 0.05); border-left: 3px solid #2563eb; padding-left: 13px; }
.result-item.selected { background: rgba(192, 57, 43, 0.07); border-left: 3px solid var(--red); padding-left: 13px; }
.ri-row { display: flex; align-items: center; gap: 8px; }
.ri-tags {
    display: flex; flex-wrap: wrap; gap: 2px 10px;
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 10px; color: var(--ink-muted);
    padding-left: 32px; line-height: 1.5; word-break: break-word;
}
.ri-tags .ri-tag { white-space: nowrap; }
.ri-tags .ri-tag-key { color: var(--ink-muted); }
.ri-tags .ri-tag-value { color: var(--ink); }
.ri-title { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ri-title-input {
    flex: 1; min-width: 0; font-family: inherit; font-size: 13px;
    padding: 1px 4px; border-radius: 4px; border: 1px solid var(--border);
    background: var(--panel); color: var(--ink);
}
.ri-cat-select {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 10px; padding: 1px 4px;
    border-radius: 4px; border: 1px solid var(--border); background: var(--panel);
    color: var(--ink); max-width: 120px; cursor: pointer;
}
.ri-check {
    width: 16px; height: 16px; border-radius: 4px; flex-shrink: 0;
    border: 1.5px solid rgba(160, 140, 100, 0.5);
    display: flex; align-items: center; justify-content: center;
    cursor: pointer; transition: background 0.12s, border-color 0.12s;
}
.ri-check svg { width: 9px; height: 9px; opacity: 0; transition: opacity 0.12s; }
.ri-check.on { background: var(--green); border-color: var(--green); }
.ri-check.on svg { opacity: 1; }
.ri-dupe { font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9px; color: var(--amber); white-space: nowrap; }

.osm-group-header {
    display: flex; align-items: center; justify-content: space-between;
    padding: 7px 16px 5px; background: rgba(160, 140, 100, 0.07);
    border-bottom: 1px solid var(--border); cursor: pointer; user-select: none;
}
.osm-group-header:hover { background: rgba(160, 140, 100, 0.12); }
.osm-group-title {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 10px; font-weight: 500;
    letter-spacing: .08em; text-transform: uppercase; color: var(--ink);
    display: flex; align-items: center; gap: 7px; flex: 1;
}
/* OSM-Setup-Variante: kompakter Chevron-Inline-SVG (map.css's .group-chevron ist 28x28 für die Map-Sidebar) */
.osm-group-header .group-chevron { width: auto; height: auto; padding: 0; cursor: default; border-radius: 0; }
.osm-group-header .group-chevron.open { transform: rotate(90deg); }
.group-body { display: none; }
.group-body.open { display: block; }
.group-badges { display: flex; align-items: center; gap: 4px; }
.group-badge { font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9px; padding: 1px 6px; border-radius: 4px; border: 1px solid var(--border); }
.group-badge.new- { background: rgba(58, 125, 68, 0.1); border-color: rgba(58, 125, 68, 0.3); color: var(--green); }
.group-badge.dupe- { background: rgba(176, 124, 26, 0.1); border-color: rgba(176, 124, 26, 0.3); color: var(--amber); }
.group-toggle {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif; font-size: 9px; padding: 2px 7px;
    border-radius: 4px; border: 1px solid var(--border); background: transparent;
    cursor: pointer; color: var(--ink-muted); transition: background 0.12s;
}
.group-toggle:hover { background: rgba(160, 140, 100, 0.12); color: var(--ink); }
.group-toggle.eye-on { background: rgba(37, 99, 235, 0.12); border-color: rgba(37, 99, 235, 0.4); color: #2563eb; }
.group-toggle.eye-on:hover { background: rgba(37, 99, 235, 0.2); }

/* ── Switch-Toggle (iOS-Style) ──────────────────────────────────
   Wiederverwendbares Markup:
       <label class="switch" for="myToggle" aria-label="...">
           <input type="checkbox" id="myToggle">
           <span class="switch-slider"></span>
       </label>
   Größe + Position via inline style oder Override-Klasse.
   :checked-Pseudo erfordert Stylesheet (geht nicht inline). */
.switch .switch-slider::before {
    position: absolute;
    content: "";
    height: 18px;
    width: 18px;
    left: 3px;
    top: 3px;
    background: #fff;
    border-radius: 50%;
    transition: transform 0.2s;
    box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
}
.switch input:checked + .switch-slider {
    background: var(--green) !important;
}
.switch input:checked + .switch-slider::before {
    transform: translateX(20px);
}
.switch input:focus-visible + .switch-slider {
    outline: 2px solid #2563eb;
    outline-offset: 2px;
}

/* ── Sign-up ──────────────────────────────────────────────────────────────── */

.signup-shell {
    min-height: 100vh;
    display: flex;
    align-items: flex-start;
    justify-content: center;
    padding: 48px 16px;
    background: var(--page-bg, #f6f3ee);
}

.signup-card {
    width: 100%;
    max-width: 540px;
    /* Höhe auf den Viewport begrenzen (96px = 48px Padding oben + unten der
       .login-form-side), damit das 40px-Padding oben/unten immer sichtbar und
       gleich bleibt und stattdessen die Felder intern scrollen. */
    max-height: calc(100dvh - 96px);
    display: flex;
    flex-direction: column;
    background: #fff;
    border-radius: var(--radius-md, 12px);
    box-shadow: 0 2px 16px rgba(0,0,0,0.06);
    padding: 40px 36px;
}

/* Header, Button und Zurück-Link behalten ihre Höhe; nur die Felder scrollen. */
.signup-card > .login-logo,
.signup-card > .signup-headline,
.signup-card > .signup-intro,
.signup-card > .signup-error-block,
.signup-card > .signup-back {
    flex: 0 0 auto;
}

/* Das Formular füllt den verbleibenden Platz und ordnet Scroll-Container und
   Button als Flex-Column an (Button bleibt unten fixiert). */
.signup-card #signup-form {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
}

/* Scroll-Container für die Formularfelder vor dem Registrieren-Button. */
.signup-fields {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    /* 4px Innenabstand, damit der Fokus-Ring der Felder nicht vom
       Scroll-Container abgeschnitten wird; per negativem Margin bleibt die
       optische Ausrichtung zu Logo/Überschrift erhalten. */
    padding: 4px;
    margin: -4px -4px 0;
}

.signup-card-narrow {
    max-width: 460px;
    text-align: center;
}

.signup-headline {
    font-size: 22px;
    font-weight: 600;
    margin: 16px 0 8px;
    color: #2a2118;
}

.signup-intro {
    font-size: 14px;
    color: #6b5e4d;
    line-height: 1.55;
    margin-bottom: 24px;
}

.signup-error-block {
    background: rgba(192,57,43,0.08);
    border: 1px solid rgba(192,57,43,0.35);
    border-radius: var(--radius-sm, 6px);
    padding: 12px 14px;
    margin-bottom: 20px;
    font-size: 13px;
    color: var(--red, #c0392b);
}

.signup-error-block strong {
    display: block;
    margin-bottom: 6px;
}

.signup-error-block ul {
    margin: 0;
    padding-left: 18px;
}

.signup-card .form-group {
    margin-bottom: 16px;
}

.signup-card .form-group label {
    display: block;
    font-size: 13px;
    font-weight: 500;
    color: #4a3f33;
    margin-bottom: 6px;
}

.signup-card .form-group.has-error label {
    color: var(--red, #c0392b);
}

.signup-card .form-control {
    width: 100%;
    padding: 10px 12px;
    font-size: 14px;
    border: 1px solid #d8cfc0;
    border-radius: var(--radius-sm, 6px);
    background: #fff;
    color: #2a2118;
}

.signup-card .form-control:focus {
    outline: none;
    border-color: var(--accent, #3a7d44);
    box-shadow: 0 0 0 3px rgba(58,125,68,0.12);
}

.signup-card .form-control.is-invalid {
    border-color: var(--red, #c0392b);
    background-color: rgba(192,57,43,0.03);
}

.signup-card .form-control.is-invalid:focus {
    box-shadow: 0 0 0 3px rgba(192,57,43,0.15);
}

/* Slug-Input mit angehaengtem Domain-Suffix als visuelle Vorschau der
   spaeteren Map-URL. Input schrumpft, Suffix bekommt feste Breite via
   white-space:nowrap. Beide teilen sich den Rahmen (rechte Border des
   Inputs raus, linke Border des Suffix raus → wirkt wie ein Feld). */
.signup-slug-input {
    display: flex;
    align-items: stretch;
}
.signup-slug-input .form-control {
    flex: 1 1 0%;
    min-width: 0;
    border-top-right-radius: 0;
    border-bottom-right-radius: 0;
    border-right: none;
}
.signup-slug-suffix {
    display: inline-flex;
    align-items: center;
    padding: 0 12px;
    background: #f4eee2;
    border: 1px solid #d8cfc0;
    border-left: none;
    border-top-right-radius: var(--radius-sm, 6px);
    border-bottom-right-radius: var(--radius-sm, 6px);
    color: #6b5e4d;
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 13px;
    white-space: nowrap;
}
.signup-slug-input .form-control:focus + .signup-slug-suffix {
    border-color: var(--accent, #3a7d44);
}
.signup-slug-input .form-control.is-invalid + .signup-slug-suffix {
    border-color: var(--red, #c0392b);
}

.signup-card .form-row {
    display: grid;
    grid-template-columns: 1fr 2fr;
    gap: 14px;
}

.signup-card .form-hint {
    display: block;
    font-size: 12px;
    color: #8a7e6a;
    margin-top: 4px;
}

.signup-card .login-btn {
    flex: 0 0 auto;
    margin-top: 16px;
}

.signup-back {
    text-align: center;
    margin-top: 20px;
    font-size: 13px;
}

.signup-back a {
    color: var(--accent, #3a7d44);
    text-decoration: none;
}

.signup-back a:hover {
    text-decoration: underline;
}

/* "Passwort vergessen?"-Link unter dem Login-Button. */
.login-forgot {
    text-align: center;
    margin-top: 16px;
    font-size: 13px;
}

.login-forgot a {
    color: var(--accent, #3a7d44);
    text-decoration: none;
}

.login-forgot a:hover {
    text-decoration: underline;
}

/* "Noch kein Account?"-Zeile unter "Passwort vergessen" — gleiches Styling,
   nur mit zusaetzlichem Top-Abstand der die optische Leerzeile schafft. */
.login-signup {
    text-align: center;
    margin-top: 24px;
    font-size: 13px;
}
.login-signup a {
    color: var(--accent, #3a7d44);
    text-decoration: none;
}
.login-signup a:hover {
    text-decoration: underline;
}

.signup-icon {
    width: 64px;
    height: 64px;
    margin: 0 auto 16px;
    color: var(--accent, #3a7d44);
}

.signup-icon-success {
    color: var(--accent, #3a7d44);
}

.signup-icon svg {
    width: 100%;
    height: 100%;
}

/* ══════════════════════════════════════════════════════════════
   ACCOUNT (Benutzeraccount-Bereich) — verwendet die bestehenden
   Drawer-/Read-Panel-Klassen (form-section, form-section-title,
   form-group, form-label, form-input, read-item-value, read-empty),
   damit der Look mit Bilder-Bibliothek + Karten-Drawer konsistent
   ist. Hier nur noch zwei reine Layout-Helfer.
   ══════════════════════════════════════════════════════════════ */
.account-content {
    max-width: 720px;
}
/* Mehr Luft zwischen den Formular-Zeilen — nur im Account-Bereich (die
   Karten-Drawer bleiben mit ihrem .form-section gap:8px kompakt). */
.account-content .form-section {
    gap: 16px;
}
/* Das Edit-Formular liegt als ein Kind in der .form-section, daher greift deren
   gap nicht auf die einzelnen Zeilen — selber als Flex-Column mit gleichem
   Rhythmus auslegen (sonst klebt u. a. der Button am letzten Feld). */
.account-content .account-edit-form {
    display: flex;
    flex-direction: column;
    gap: 16px;
}
/* PLZ + Ort nebeneinander; PLZ deutlich schmäler, Ort füllt den Rest. */
.account-field-row {
    display: flex;
    gap: 12px;
}
.account-field-row .account-zip {
    flex: 0 0 110px;
}
.account-field-row .account-city {
    flex: 1;
}
/* Auslastungs-/Kontingent-Balken (Account-Info). Track + farbiger Fill;
   Farbe nach Schwellwert (grün < 80 % < amber < 100 % ≤ rot). */
.account-usage-head {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
    gap: 8px;
}
.account-usage-count {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 11px;
    color: var(--ink-muted);
    white-space: nowrap;
}
.account-usage-bar {
    height: 8px;
    background: rgba(44, 36, 22, 0.1);
    border-radius: 999px;
    overflow: hidden;
}
.account-usage-fill {
    height: 100%;
    border-radius: 999px;
    background: var(--green);
    transition: width 0.3s var(--trans);
}
.account-usage-fill.is-warn { background: var(--amber); }
.account-usage-fill.is-over { background: var(--red); }
/* Tarif-Auswahl (Abrechnung, kein Abo) — 3 Karten nebeneinander. */
.account-plans {
    display: flex;
    flex-wrap: wrap;
    gap: 12px;
}
.account-plan-card {
    flex: 1 1 200px;
    background: var(--panel);
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    padding: 16px;
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.account-plan-name {
    /* So groß wie der Card-Header ".form-section-title" (Crimson Pro 1.2rem). */
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 1.2rem;
    font-weight: 600;
    color: var(--ink);
}
.account-plan-features {
    list-style: none;
    margin: 4px 0 0;
    padding: 10px 0 0;
    border-top: 1px solid var(--border);
    display: flex;
    flex-direction: column;
    gap: 6px;
    font-size: 13px;
    color: var(--ink-muted);
}
.account-plan-features strong {
    color: var(--ink);
    font-weight: 600;
}
/* Zwei CTAs je Tarif (monatlich + jährlich) → 6 Buttons gesamt. */
.account-plan-ctas {
    margin-top: auto;
    display: flex;
    flex-direction: column;
    gap: 6px;
    padding-top: 10px;
}

/* ── Palette-aus-KI-Bild Dialog (Settings/AccommodationCategories) ────
   Eigenes Modal-Pattern: liegt im gleichen .confirm-overlay-Container wie
   die Lösch-Bestätigung, ist aber spürbar breiter und nutzt eine Tabelle
   plus eine Bild-Vorschau. Layout: header / body (scrollt) / footer.
   Theme-Tokens werden vererbt (`theme-red` mappt --green auf Bordeaux). */
.palette-dialog {
    background: var(--panel);
    border-radius: var(--radius);
    width: 760px;
    max-width: 95vw;
    max-height: 90vh;
    box-shadow: 0 12px 40px rgba(0, 0, 0, 0.2);
    display: flex;
    flex-direction: column;
}
.palette-dialog-header {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 16px 20px 12px 20px;
    border-bottom: 1px solid var(--border);
}
.palette-dialog-header h2 {
    flex: 1;
    margin: 0;
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 1.2rem;
    font-weight: 600;
}
.palette-dialog-body {
    flex: 1;
    overflow-y: auto;
    padding: 16px 20px;
    display: flex;
    flex-direction: column;
    gap: 14px;
}
.palette-dialog-footer {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 12px 20px;
    border-top: 1px solid var(--border);
}

/* Bild-Vorschau + Strip nebeneinander */
.palette-intro {
    display: flex;
    gap: 16px;
    padding: 12px;
    background: var(--panel-2);
    border-radius: var(--radius-sm);
}
.palette-preview-img {
    width: 180px;
    height: 130px;
    object-fit: cover;
    border-radius: var(--radius-sm);
    flex-shrink: 0;
    background: #fff;
}
.palette-intro-right {
    flex: 1;
    display: flex;
    flex-direction: column;
    gap: 10px;
    min-width: 0;
}
.palette-intro-text {
    margin: 0;
    font-size: 13px;
    color: var(--ink-muted);
    line-height: 1.4;
}
.palette-strip {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
}
.palette-strip-swatch {
    width: 28px;
    height: 28px;
    border-radius: 6px;
    border: 1px solid rgba(0, 0, 0, 0.12);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2);
}

/* Tabelle pro Kategorie */
.palette-table {
    width: 100%;
    border-collapse: separate;
    border-spacing: 0;
}
.palette-table th {
    text-align: left;
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 11px;
    font-weight: 500;
    text-transform: uppercase;
    letter-spacing: 0.06em;
    color: var(--ink-muted);
    padding: 6px 8px;
    border-bottom: 1px solid var(--border);
}
.palette-table td {
    padding: 8px;
    border-bottom: 1px solid var(--border);
    vertical-align: middle;
}
.palette-table tr:last-child td {
    border-bottom: none;
}
.palette-row-title {
    font-weight: 600;
    color: var(--ink);
}
.palette-arrow {
    color: var(--ink-muted);
    font-size: 16px;
    text-align: center;
    padding: 0 4px;
    width: 24px;
}
.palette-swatch-wrap {
    display: inline-flex;
    align-items: center;
    gap: 8px;
}
.palette-swatch {
    width: 22px;
    height: 22px;
    border-radius: 5px;
    border: 1px solid rgba(0, 0, 0, 0.15);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2);
    flex-shrink: 0;
}
.palette-hex {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 12px;
    color: var(--ink);
}
.palette-suggested {
    cursor: pointer;
    padding: 4px 8px;
    border-radius: var(--radius-sm);
    transition: background 0.12s;
}
.palette-suggested:hover {
    background: var(--panel-2);
}
.palette-swap-icon {
    color: var(--ink-muted);
    opacity: 0.7;
}
/* Badge für mehrfach verwendete Vorschlags-Farbe — auffällig (Bordeaux/
   --green-Token im theme-red), aber kompakt. Tooltip nennt die Zahl. */
.palette-dup-badge {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 26px;
    height: 18px;
    padding: 0 6px;
    background: var(--green);
    color: #fff;
    border-radius: 9px;
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 11px;
    font-weight: 700;
    line-height: 1;
    letter-spacing: 0.02em;
}
.palette-toggle-cell {
    width: 60px;
    text-align: center;
}

/* Switch mit fester Größe — der globale .switch hat selbst keine
   Dimensionen, die werden sonst inline gesetzt (siehe MapSettings).
   Hier als eigene Klasse, damit das Markup sauber bleibt. */
.palette-switch {
    position: relative;
    display: inline-block;
    width: 44px;
    height: 24px;
    flex-shrink: 0;
}
.palette-switch input {
    opacity: 0;
    width: 0;
    height: 0;
}
.palette-switch .switch-slider {
    position: absolute;
    cursor: pointer;
    inset: 0;
    background: #ccc;
    border-radius: 24px;
    transition: 0.2s;
}

/* Hinweis wenn kein KI-Bild aktiv */
.palette-no-overlay {
    padding: 32px 16px;
    text-align: center;
    color: var(--ink-muted);
    line-height: 1.5;
}
.palette-no-overlay p {
    margin: 4px 0;
}
.palette-no-overlay a {
    color: var(--green);
    font-weight: 600;
}

/* Inline-Popover für Farbtausch — als plain DOM in <body>, damit es
   den Modal-Overflow nicht clippt. position:fixed; positioniert per JS. */
.palette-popover {
    position: fixed;
    z-index: 10000;
    background: var(--panel);
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    box-shadow: 0 6px 20px rgba(0, 0, 0, 0.2);
    padding: 8px;
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    max-width: 220px;
}
.palette-popover-swatch {
    width: 26px;
    height: 26px;
    border-radius: 5px;
    border: 1px solid rgba(0, 0, 0, 0.15);
    cursor: pointer;
    transition: transform 0.1s;
}
.palette-popover-swatch:hover {
    transform: scale(1.1);
}
/* Aktuell zugewiesene Farbe — dunkler Rahmen + dezenter Inner-Ring,
   damit sie auch bei sehr ähnlichen Nachbar-Swatches deutlich heraussticht. */
.palette-popover-swatch.is-current {
    border: 2px solid var(--ink);
    box-shadow: inset 0 0 0 2px #fff;
}

/* ── POI-Kategorien Inline-Palette-Picker im Detail-Panel ─────────
   2-Spalten-Grid unter dem Color-Input. Jedes Item: Swatch + sichtbares
   Label (Tooltip-only war bei 11 Slots unpraktikabel). Klick übernimmt
   die Farbe in den Color-Input, manuelle Hex-Eingabe bleibt parallel
   möglich. Aktuelle Auswahl bekommt einen kräftigen Rahmen. */
.poi-palette-group {
    margin-top: -4px;
}
.poi-palette-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 6px 10px;
}
.poi-palette-item {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 5px 9px;
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    background: var(--panel);
    cursor: pointer;
    text-align: left;
    font-family: inherit;
    transition: background 0.12s, border-color 0.12s;
}
.poi-palette-item:hover {
    background: var(--panel-2);
}
/* Aktive Auswahl: 2px-Border + Padding kompensieren, damit das Item
   nicht um 1px springt. */
.poi-palette-item.is-current {
    border: 2px solid var(--ink);
    padding: 4px 8px;
}
.poi-palette-swatch {
    width: 18px;
    height: 18px;
    border-radius: 4px;
    border: 1px solid rgba(0, 0, 0, 0.15);
    box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2);
    flex-shrink: 0;
}

/* ── 360°-Foto-Support (Phase 1, siehe Memory project_panorama_360.md) ───── */

/* Pille oben rechts auf dem Pano-Thumbnail im Bilder-Pool +
   im Karten-Editor-Detail-Panel + im Image-Picker (Bilder-Modal).
   Container brauchen position:relative damit die absolute Pille
   nicht aus dem Element fliegt. */
.img-card-thumb,
.image-thumb-link,
.imgpicker-pool-card { position: relative; }

/* Pool-Sidebar: "Nur 360°-Fotos"-Filter sitzt OBEN über der Kategorie-Liste,
   mit dezenter Abgrenzung. */
.pool-nav-panorama {
    border-bottom: 1px solid var(--border);
    margin-bottom: 8px;
    padding-bottom: 8px;
}
.pool-nav-item.is-disabled {
    opacity: 0.4;
    cursor: not-allowed;
}

/* Pool-Detail-Panel: Pano-Stage für den Inline-Viewer beim Bearbeiten.
   Feste Höhe ist Pflicht — PSV braucht einen sized Container. */
.pool-detail-pano-stage {
    width: 100%;
    height: 320px;
    background: #1c1e22;
    border-radius: var(--radius-sm);
    overflow: hidden;
}

/* Pano-Checkbox-Row (Upload + Edit) und Edit-Controls.
   Höher-spezifische Selektoren (zusätzlich `.upload-dialog`/`.pool-detail`
   im Pfad) sind nötig damit die `.upload-dialog .form-group input { width:
   100% }`-Regel das Checkbox-Element nicht auf 100 % Breite streckt und das
   `.upload-dialog .form-group label { display:flex; … }` die Pano-Row nicht
   umstilt. */
.pano-checkbox-row,
.upload-dialog .form-group label.pano-checkbox-row,
.pool-detail .form-group label.pano-checkbox-row {
    display: flex;
    align-items: center;
    gap: 8px;
    cursor: pointer;
    font-size: 14px;
    font-family: inherit;
    text-transform: none;
    letter-spacing: normal;
    color: inherit;
    margin: 0;
}
.pano-checkbox-row input[type="checkbox"],
.upload-dialog .form-group .pano-checkbox-row input[type="checkbox"],
.pool-detail .form-group .pano-checkbox-row input[type="checkbox"] {
    width: 16px;
    height: 16px;
    padding: 0;
    border: 1px solid var(--border);
    background: #fff;
    accent-color: var(--green);
    cursor: pointer;
    flex-shrink: 0;
}
.pano-edit-controls {
    display: flex;
    flex-direction: column;
    gap: 6px;
    margin-top: 8px;
    padding: 10px;
    background: var(--panel-2);
    border-radius: var(--radius-sm);
    border-left: 3px solid var(--green);
}
.pano-edit-current {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 10.5px;
    color: var(--ink-muted);
}
/* „Startwert setzen"-Button: 2-zeilig, zweite Zeile (Klammer-Hinweis) leicht
   und nicht fett. */
.pano-set-default-btn {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 1px;
    padding: 6px 12px;
    font-size: .85rem;
    line-height: 1.25;
    text-align: left;
}
.pano-set-default-hint {
    font-weight: 400;
    font-size: .76rem;
    opacity: .85;
}

/* Vollbild-Pano-Modal — über alle anderen UI-Schichten, dunkles Backdrop. */

/* PSV-Container im normalen Image-Modal (image-modal.js, lazy injiziert). */

/* 360°-Marker (Phase 2). Werden vom PSV-Markers-Plugin als HTML-Marker
   im Viewer-Overlay gerendert. */

/* Link-Indikator bei reinen Icon-Markern: kleines ↗ als Eck-Chip (innen unten
   rechts, weil .pano-marker-badge overflow:hidden hat → aussen würde geclippt). */

/* Ohne Ring: kein Background, kein Schatten, kein Clipping — nur das nackte
   Icon (sinnvoll fuer poi_icons mit eigenem Background-Circle). */

/* Marker-Block im Pool-Detail-Panel (Phase 2). */
.pano-marker-group {
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding: 10px;
    background: var(--panel-2);
    border-radius: var(--radius-sm);
    border-left: 3px solid var(--green);
}
.pano-marker-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
}
.pano-marker-hint {
    font-size: 11px;
    color: var(--ink-muted);
    font-style: italic;
    line-height: 1.3;
}
.pano-marker-list {
    display: flex;
    flex-direction: column;
    gap: 4px;
}
.pano-marker-list-empty {
    font-size: 12px;
    color: var(--ink-muted);
    font-style: italic;
    padding: 4px 0;
}
.pano-marker-list-item {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 4px 8px;
    border-radius: var(--radius-sm);
    cursor: pointer;
    border: 1px solid transparent;
    background: var(--panel);
    transition: border-color .12s, background .12s;
}
.pano-marker-list-item:hover { border-color: var(--green-mid); }
.pano-marker-list-item.selected {
    border-color: var(--green);
    background: var(--green-soft);
}
/* Ausserhalb des Edit-Modus: Liste nur Anzeige, nicht klickbar. */
.pano-marker-list--readonly .pano-marker-list-item {
    cursor: default;
}
.pano-marker-list--readonly .pano-marker-list-item:hover {
    border-color: transparent;
}
.pano-marker-list-type {
    font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
    font-size: 14px;
    color: var(--ink-muted);
    width: 16px;
    text-align: center;
}
.pano-marker-list-label {
    flex: 1;
    min-width: 0;          /* erlaubt Schrumpfen im Flex → Ellipse greift */
    font-size: 12px;
    color: var(--ink);
    display: flex;
    flex-direction: column;
    gap: 1px;
}
.pano-marker-list-label-main {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;
}
.pano-marker-list-del {
    width: 22px;
    height: 22px;
    border: none;
    background: transparent;
    color: var(--ink-muted);
    cursor: pointer;
    border-radius: 50%;
    font-size: 16px;
    line-height: 1;
}
.pano-marker-list-del:hover { background: var(--red); color: #fff; }
/* Link-Indikator in der Marker-Liste (🔗 Zieltitel) — neutrale Schriftfarbe
   (volles var(--ink); var(--green-mid) war nur 22% deckend und kaum lesbar).
   Keine Akzentfarbe, das 🔗 markiert es als Link. */
.pano-marker-list-link {
    display: block;
    font-size: 11px;
    color: var(--ink);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;
}
/* Ziel-Picker im Marker-Editor: Suchfeld + scrollbare Listbox. */
.pano-marker-link-pick #mLinkTarget {
    margin-top: 4px;
    max-height: 140px;
}

.pano-marker-editor {
    display: flex;
    flex-direction: column;
    gap: 6px;
    padding: 10px;
    background: var(--panel);
    border-radius: var(--radius-sm);
    border: 1px dashed var(--border);
}
.pano-marker-editor[hidden] { display: none; }
.pano-marker-editor-row {
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.pano-marker-editor-row.pano-marker-editor-color {
    flex-direction: row;
    align-items: center;
    gap: 8px;
}
.pano-marker-editor-row input[type="color"] {
    width: 40px;
    height: 28px;
    padding: 0;
    border: 1px solid var(--border);
    border-radius: var(--radius-sm);
    cursor: pointer;
}
.pano-marker-editor-actions {
    display: flex;
    gap: 8px;
    margin-top: 6px;
    padding-top: 8px;
    border-top: 1px solid var(--border);
}
.pano-marker-editor-actions .pool-btn {
    padding: 6px 14px;
    font-size: .85rem;
}
.pano-marker-editor-actions .pool-btn.primary {
    flex: 1;
}

.poi-palette-label {
    font-size: 13px;
    color: var(--ink);
    line-height: 1.2;
}
/* Grüne Outline + cremeweißer Innen-Hintergrund (kein Vollflächen-primary). */
.account-plan-cta {
    width: 100%;
    justify-content: center;
    background: rgba(255, 255, 255, 0.35);
    border-color: var(--green);
    color: var(--green);
    font-weight: 400;
}
.account-plan-cta:hover {
    background: rgba(255, 255, 255, 0.85);
    border-color: var(--green);
    color: var(--green);
}
/* Nicht buchbarer Tarif (aktueller Bestand übersteigt ein Limit). */
.account-plan-cta:disabled,
.account-plan-cta:disabled:hover {
    background: var(--panel);
    border-color: var(--border);
    color: var(--ink-muted);
    cursor: not-allowed;
}
.account-plan-card.is-blocked {
    opacity: 0.7;
}
.account-plan-blocked {
    font-size: 12px;
    color: var(--red);
    padding-top: 2px;
}
.account-plans-note {
    margin-top: 4px;
}

/* ── Flash-Messages (FlashComponent → templates/element/flash/*) ──────────
   Liegen als direkte Kinder von .main-area über dem Content. cake.css wird
   im Layout nicht geladen, daher hier mit den App-Tokens gestylt. */
.message {
    margin: 16px 24px 0;
    padding: 12px 16px;
    border: 1px solid var(--border-strong);
    border-radius: var(--radius-sm);
    background: #fff;
    color: var(--ink);
    box-shadow: var(--shadow);
    font-size: 0.95rem;
    line-height: 1.4;
    cursor: pointer;
}
.message.hidden {
    display: none;
}
.message.success {
    background: var(--green-soft);
    border-color: var(--green-mid);
    color: var(--green);
}
.message.warning {
    background: rgba(176, 124, 26, 0.1);
    border-color: rgba(176, 124, 26, 0.35);
    color: var(--amber);
}
.message.error {
    background: var(--red-soft);
    border-color: rgba(192, 57, 43, 0.35);
    color: var(--red);
}

/* ── Formular-Validierung (Konvention: Fehler-Block oben + rote Labels +
   markierte Felder), App-Shell-Variante zur Bootstrap-Server-Side-Validation. */
.form-error-block {
    margin-bottom: 14px;
    padding: 10px 14px;
    border: 1px solid rgba(192, 57, 43, 0.35);
    border-radius: var(--radius-sm);
    background: var(--red-soft);
    color: var(--red);
    font-size: 0.9rem;
}
.form-error-block ul {
    margin: 6px 0 0;
    padding-left: 18px;
}
.form-group.has-error .form-label {
    color: var(--red);
}
.form-input.is-invalid {
    border-color: var(--red);
    background: var(--red-soft);
}
.form-input.is-invalid:focus {
    border-color: var(--red);
    box-shadow: 0 0 0 3px var(--red-soft);
}

/* ── Banner für anstehenden Tarif-Downgrade (globaler Hinweis im default-Layout) */
.app-backend .pending-downgrade-banner {
    margin: 0 0 12px;
    padding: 10px 16px;
    border: 1px solid rgba(217, 119, 6, 0.45);
    border-radius: var(--radius-sm);
    background: rgba(254, 243, 199, 0.85);
    color: #92400e;
    font-size: 0.9rem;
    display: flex;
    align-items: center;
    gap: 12px;
    flex-wrap: wrap;
}

/* Dringlicher Banner (Kulanzfrist läuft ab bzw. Abo gekündigt → Sperre): rotes
   statt des gelben Standard-Banners. Feste Literale (theme-unabhängig). */

/* ── Downgrade-Hinweis auf der Abrechnungsseite (Info-Box im Tarif-Wechsel-Abschnitt) */
.account-downgrade-notice {
    margin: 0 0 12px;
    padding: 10px 14px;
    border-left: 3px solid rgba(217, 119, 6, 0.65);
    background: rgba(254, 243, 199, 0.55);
    color: #92400e;
    font-size: 0.88rem;
    line-height: 1.45;
    border-radius: 4px;
}
