/* ==========================================================================
   UI FORM · components/ui-form.css
   Child-Theme: generatepress-child/assets/css/components/
   ---------------------------------------------------------------------
   STAND 10.09.26 - gebaut nach demselben Muster wie ui-button.css:

   KEIN @layer (siehe ui-button.css für die volle Begründung: @layer
   macht alles darin schwächer als GeneratePress' nicht-layered CSS,
   unabhängig von Spezifität).

   DUAL-LAYER wie bei Buttons: rohe Tag-Selektoren (input/select/
   textarea/label/checkbox/radio) decken Fremd-Markup ab (Gutenberg,
   WP-Core-Formulare, schnell hingeschriebenes Modal-Markup),
   .ui-* Klassen sind die bewusst gesetzte Komponentenversion mit voller
   Kontrolle (Wrapper, Hint/Error-Text, Required-Marker, Icon-Felder,
   Dropdown-Panels). Beide bekommen exakt dieselben Basis-Regeln - keine
   zwei visuellen Wahrheiten für "ein Textfeld"/"eine Checkbox".

   STAND 10.09.26 (2): Autocomplete-Dropdown und Mehrfachauswahl-
   Kombobox ergänzt (Guide, Form Elements: Suchfeld-Autocomplete /
   Branchenselectionmodal.pdf, itschwerpunktechipsfigma_1.pdf:
   Mehrfachauswahl mit Chips + gruppierter Liste). Beide Panels nutzen
   den neuen Token --mp-shadow-popover (in mp-tokens.css ergänzt -
   Guide nennt hier einen eigenen Schatten, der auf keiner der
   bestehenden vier Shadow-Stufen liegt).

   Dafür wurden die Checkbox/Radio-Basis-Regeln (weiter unten) von
   ".ui-checkbox input"/".ui-radio input" auf zusätzlich rohe
   input[type="checkbox"]/[type="radio"] erweitert - die Multiselect-
   Optionszeilen sind volle Klickflächen ohne .ui-checkbox-Wrapper und
   brauchen trotzdem dieselbe Optik.

   Konsumiert AUSSCHLIESSLICH Tokens aus mp-tokens.css (muss vorher
   geladen sein). Eine Ausnahme: --mp-surface-subtle und
   --mp-shadow-popover wurden dafür neu in mp-tokens.css ergänzt (Werte
   aus dem Style Guide, die dort noch nicht als Token vorhanden waren).

   Quelle: style_guide.pdf Abschnitt 09 "Form Elements",
   Branchenselectionmodal.pdf, itschwerpunktechipsfigma_1.pdf.
   Global geladen (nicht an Shortcode/Wrapper gebunden).
   ========================================================================== */


/* ============================================================
 * FELD-WRAPPER
 * Label 8px darüber, Hilfetext/Fehlertext 6px darunter (lt. Guide),
 * Abstand zwischen Feldern 20px (--mp-space-5).
 * ============================================================ */

.ui-form-field {
  display: flex;
  flex-direction: column;
  margin-bottom: var(--mp-space-5);
}
.ui-form-field:last-child { margin-bottom: 0; }

/* Zweispaltiges Formular-Grid, z. B. Vorname/Nachname nebeneinander.
   Nicht explizit im Guide bemaßt, nutzt aber ausschließlich Grid-Gutter
   und bricht am selben Breakpoint wie das Modal (600px, siehe
   mp-modal.css) auf eine Spalte um. */
.ui-form-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: var(--mp-space-4);
}
.ui-form-row .ui-form-field { margin-bottom: var(--mp-space-5); }


/* ============================================================
 * LABEL
 * Feld-Label: Roboto 600 · 14/20 · 8px über dem Feld.
 * ============================================================ */

.ui-form-field label,
.ui-label {
  order: -1;
  margin-bottom: var(--mp-space-2);
  font-family: var(--mp-font-body);
  font-size: var(--mp-fs-field-label);
  line-height: var(--mp-lh-field-label);
  font-weight: 600;
  color: var(--mp-ink-900);
}

/* Pflichtfeld-Markierung: "Pflichtfelder mit * und im Hinweistext
   erklärt" (Accessibility-Kapitel) - deshalb IMMER zusätzlich ein
   ui-form-hint mit Erklärung setzen, der Stern allein reicht nicht. */
.ui-required {
  color: var(--mp-error);
  margin-left: 2px;
}


/* ============================================================
 * BASIS-FELD
 * Höhe 48, Radius 6, Rahmen 1px Ink 300, Text 15px.
 * Padding: Guide nennt hier explizit 14px (Abweichung von der reinen
 * 4px-Skala aus Kapitel 05 - wie schon die border-radius-!important-
 * Ausnahme in ui-button.css wird das hier bewusst und kommentiert
 * gemacht, nicht stillschweigend auf 16px/--mp-space-4 aufgerundet).
 * ============================================================ */

.ui-input,
.ui-select,
input[type="text"],
input[type="email"],
input[type="password"],
input[type="search"],
input[type="tel"],
input[type="url"],
input[type="number"],
input[type="date"],
select {
  display: block;
  width: 100%;
  height: var(--mp-height-input);
  padding: 0 14px; /* Guide-Vorgabe, siehe Kommentar oben */
  border: 1px solid var(--mp-ink-300);
	  background-color: var(--mp-surface);
  border-radius: var(--mp-radius-md);
  font-family: var(--mp-font-body);
  font-size: var(--mp-fs-body-m);
  color: var(--mp-ink-900);
  transition: border-color .15s ease, box-shadow .15s ease, background-color .15s ease;
}

::placeholder { color: var(--mp-ink-400); }

/* ---- Hover: Rahmen dunkelt auf Ink 900, NIE Crimson auf Hover
   ("kein Crimson-Hover auf Feldern, Crimson bleibt für Fokus Ring
   reserviert" - Guide, Form Elements). ---- */
.ui-input:hover,
.ui-select:hover,
input[type="text"]:hover,
input[type="email"]:hover,
input[type="password"]:hover,
input[type="search"]:hover,
input[type="tel"]:hover,
input[type="number"]:hover,
input[type="date"]:hover,
select:hover,
textarea:hover,
.ui-textarea:hover {
  border-color: var(--mp-ink-900);
}

/* ---- Fokus: Rahmen 1px Crimson + Fokus-Ring-Shadow ----
   Steht bewusst NACH :hover, damit Fokus bei gleicher Spezifität
   gewinnt, auch wenn Maus + Fokus gleichzeitig zutreffen. */
.ui-input:focus,
.ui-select:focus,
input[type="text"]:focus,
input[type="email"]:focus,
input[type="password"]:focus,
input[type="search"]:focus,
input[type="tel"]:focus,
input[type="number"]:focus,
input[type="date"]:focus,
select:focus,
textarea:focus,
.ui-textarea:focus {
  outline: none;
  border-color: var(--mp-primary);
	background-color: var(--mp-surface);
  box-shadow: var(--mp-shadow-focus);
}

/* ---- Fehler: natives aria-invalid statt eigener .is-error-Klasse,
   gleiches Prinzip wie :disabled bei ui-button.css. Rahmen 1.5px. ---- */
.ui-input[aria-invalid="true"],
.ui-select[aria-invalid="true"],
.ui-textarea[aria-invalid="true"],
input[aria-invalid="true"],
select[aria-invalid="true"],
textarea[aria-invalid="true"] {
  border-width: 1.5px;
  border-color: var(--mp-error);
}

/* ---- Deaktiviert ---- */
.ui-input:disabled,
.ui-select:disabled,
.ui-textarea:disabled,
input:disabled,
select:disabled,
textarea:disabled {
  border-color: var(--mp-ink-200);
  background: var(--mp-surface-subtle);
  color: var(--mp-ink-400);
  cursor: not-allowed;
}


/* ============================================================
 * TEXTAREA
 * Mindesthöhe 96px, wächst mit Inhalt statt feste Höhe.
 * ============================================================ */

.ui-textarea,
textarea {
  display: block;
  width: 100%;
  height: auto;
  min-height: 96px;
  padding: var(--mp-space-3) 14px;
  border: 1px solid var(--mp-ink-300);
  border-radius: var(--mp-radius-md);
  background: var(--mp-surface);
  font-family: var(--mp-font-body);
  font-size: var(--mp-fs-body-m);
  line-height: var(--mp-lh-body-m);
  color: var(--mp-ink-900);
  resize: vertical;
  transition: border-color .15s ease, box-shadow .15s ease;
}


/* ============================================================
 * SELECT
 * Eigener Pfeil statt Browser-Default, Klickfläche/Zeile 44px in der
 * geöffneten Liste bleibt nativ (Browser-Dropdown, nicht nachbaubar
 * ohne eigene Listbox-Komponente).
 *
 * !important auf appearance/background-image: GeneratePress stylt
 * native <select>-Elemente selbst mit einem eigenen Pfeil (gleiches
 * Prinzip wie die border-radius-Ausnahme in ui-button.css - bei
 * gleicher Selektor-Spezifität (Tag-Selektor "select" auf beiden
 * Seiten) gewinnt sonst je nach Ladereihenfolge mal GP, mal wir).
 * ============================================================ */

.ui-select,
select {
  appearance: none !important;
  -webkit-appearance: none !important;
  -moz-appearance: none !important;
  padding-right: var(--mp-space-10);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='rgb(106,113,131)' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' d='M4 6l4 4 4-4'/%3E%3C/svg%3E") !important;
  background-repeat: no-repeat;
  background-position: right 14px center;
  background-size: 16px;
  cursor: pointer;
}
.ui-select:disabled,
select:disabled {
  cursor: not-allowed;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='rgb(144,152,168)' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' d='M4 6l4 4 4-4'/%3E%3C/svg%3E") !important;
}


/* ============================================================
 * SUCHFELD MIT ICON
 * Suche 48px, Icon 20px links (Guide, Form Elements).
 * Markup: <div class="ui-form-field ui-form-field--icon">
 *           <i class="ph-bold ph-magnifying-glass" aria-hidden="true"></i>
 *           <input class="ui-input" type="search" ...>
 *         </div>
 * ============================================================ */

.ui-form-field--icon {
  position: relative;
}
.ui-form-field--icon > i {
  position: absolute;
  left: 14px;
  top: 50%;
  transform: translateY(-50%);
  font-size: 20px;
  color: var(--mp-ink-500);
  pointer-events: none;
}
/* Label steht vor dem Icon im Markup, deshalb hier explizit die
   Reihenfolge sichern und dem Input den Platz links freihalten. */
.ui-form-field--icon label { order: -1; }
.ui-form-field--icon .ui-input,
.ui-form-field--icon input {
  padding-left: var(--mp-space-10);
}

/* Browser packen bei type="search" automatisch ein eigenes natives
   "Leeren"-Kreuz rechts ins Feld, sobald Text drinsteht - kein
   Phosphor-Icon, kein Teil unserer Optik, und per CSS nicht umfärbbar
   (nur an/aus). Deshalb hier deaktiviert und durch die eigene
   .ui-form-field__clear-Komponente direkt unten ersetzt - NICHT
   ersatzlos gestrichen. */
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
  display: none;
  -webkit-appearance: none;
}
input[type="search"] {
  appearance: textfield;
  -moz-appearance: textfield;
}

/* ---- Eigenes Leeren-Kreuz (Phosphor ph-x) ----
   Markup: <div class="ui-form-field ui-form-field--icon">
   <i class="ph-bold ph-magnifying-glass" aria-hidden="true"></i>
   <input class="ui-input" type="search" ...>
   <button type="button" class="ui-form-field__clear" aria-label="Eingabe löschen" hidden>
   <i class="ph-bold ph-x" aria-hidden="true"></i>
   </button>
   </div>
   Sichtbarkeit (hidden/nicht hidden) steuert ein kleines Script
   (mp-form-clear.js) abhängig vom Feldinhalt - reiner Anzeige-Zustand,
   kein CSS-Bestandteil. Reserviert automatisch Platz rechts im Input,
   sobald ein .ui-form-field__clear im selben Wrapper existiert -
   Felder ohne Clear-Button (z. B. Select mit Icon) bleiben unangetastet. */
.ui-form-field--icon:has(.ui-form-field__clear) .ui-input,
.ui-form-field--icon:has(.ui-form-field__clear) input {
  padding-right: var(--mp-space-8);
}
.ui-form-field__clear {
  position: absolute;
  right: 12px;
  top: 50%;
  transform: translateY(-50%);
  display: flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  padding: 0;
  border: 0;
  border-radius: var(--mp-radius-sm);
  background: transparent;
  color: var(--mp-ink-500);
  cursor: pointer;
}
.ui-form-field__clear i { font-size: 16px; }
.ui-form-field__clear:hover { color: var(--mp-primary); }
.ui-form-field__clear:focus-visible {
  outline: none;
  box-shadow: var(--mp-shadow-focus);
}
.ui-form-field__clear[hidden] { display: none; }


/* ============================================================
 * DROPDOWN (custom Select-Ersatz)
 * Natives <select> kann seine geöffnete Options-Liste NICHT per CSS
 * gestylt bekommen - das rendert der Browser/das Betriebssystem
 * außerhalb des DOM, immer in dessen eigenen Farben (siehe .ui-select
 * oben: die 48px/Radius/Pfeil-Optik gilt nur für das GESCHLOSSENE
 * Feld). Wo die geöffnete Liste ebenfalls exakt ins Design passen
 * muss, ersetzt diese Komponente das native <select> komplett -
 * gleiches Popover-Pattern wie .ui-autocomplete/.ui-multiselect__panel
 * (gleicher Radius/Shadow/Zeilenhöhe), nur für genau einen Wert.
 *
 * Markup:
 * <div class="ui-form-field">
 *   <label for="anrede-trigger">Titel / Anrede</label>
 *   <div class="ui-dropdown is-open">
 *     <button type="button" class="ui-dropdown__trigger" id="anrede-trigger"
 *             aria-haspopup="listbox" aria-expanded="true">
 *       <span class="ui-dropdown__value">Keine Angabe</span>
 *       <i class="ph-bold ph-caret-down" aria-hidden="true"></i>
 *     </button>
 *     <ul class="ui-dropdown__panel" role="listbox">
 *       <li class="ui-dropdown__option" role="option" aria-selected="true">Keine Angabe</li>
 *       <li class="ui-dropdown__option" role="option">Herr</li>
 *       <li class="ui-dropdown__option" role="option">Frau</li>
 *       <li class="ui-dropdown__option" role="option">Divers</li>
 *     </ul>
 *     <input type="hidden" name="anrede" value="">
 *   </div>
 * </div>
 *
 * Wie bei .ui-autocomplete: ".is-open" ist nur der CSS-Zustands-Hook.
 * Öffnen/Schließen, Tastatur-Navigation (Pfeiltasten/Enter/Escape) und
 * das Befüllen des versteckten <input> beim Auswählen sind JS-Logik,
 * NICHT Teil dieser Datei - braucht ein kleines eigenes Script, wie
 * mp-modal.js fürs Modal.
 * ============================================================ */

.ui-dropdown {
  position: relative;
}

/* Wird von mp-select-enhance.js auf ein <select> gesetzt, NACHDEM es
   automatisch zu .ui-dropdown umgebaut wurde - das <select> bleibt im
   DOM (trägt weiter den echten Formular-Wert), verschwindet aber
   optisch komplett. display:none ist hier bewusst okay: versteckte
   <select>-Elemente werden beim Formular-Submit trotzdem mitgesendet,
   solange sie nicht zusätzlich disabled sind (Standard-HTML-Verhalten,
   kein WordPress-Sonderfall). */
.ui-select--enhanced {
  display: none;
}

/* Genestet unter .ui-dropdown (Spezifität 0,2,0) statt nur
   .ui-dropdown__trigger (0,1,0) - GeneratePress stylt native
   <button>-Elemente selbst mit einer eigenen, oft stärker
   spezifischen Regel (z. B. ".entry-content button"), die sonst
   Hintergrund/Schrift auf GPs Akzentfarbe zieht (Crimson-Fläche,
   fette weiße Schrift). Gleiches Prinzip wie schon beim Select-Pfeil,
   hier aber ohne !important lösbar, weil das genestete Elternteil-
   Präfix bereits genug Spezifität bringt. */
.ui-dropdown .ui-dropdown__trigger {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--mp-space-2);
  width: 100%;
  height: var(--mp-height-input);
  padding: 0 14px;
  border: 1px solid var(--mp-ink-300);
  border-radius: var(--mp-radius-md);
  background: var(--mp-surface);
  font-family: var(--mp-font-body);
  font-size: var(--mp-fs-body-m);
  font-weight: 400;
  color: var(--mp-ink-900);
  text-align: left;
  cursor: pointer;
  transition: border-color .15s ease, box-shadow .15s ease;
}
.ui-dropdown__trigger i {
  flex-shrink: 0;
  font-size: 16px;
  color: var(--mp-ink-500);
  transition: transform .15s ease;
}
.ui-dropdown .ui-dropdown__trigger:hover { border-color: var(--mp-ink-900); }
.ui-dropdown .ui-dropdown__trigger:focus-visible {
  outline: none;
  border-color: var(--mp-primary);
  box-shadow: var(--mp-shadow-focus);
}
.ui-dropdown.is-open .ui-dropdown__trigger {
  border-color: var(--mp-ink-900);
}
.ui-dropdown.is-open .ui-dropdown__trigger i {
  transform: rotate(180deg);
}

.ui-dropdown__panel {
  position: absolute;
  top: calc(100% + var(--mp-space-1));
  left: 0;
  right: 0;
  z-index: 20;
  margin: 0;
  padding: var(--mp-space-1) 0;
  max-height: 280px;
  overflow-y: auto;
  list-style: none;
  background: var(--mp-surface);
  border: 1px solid var(--mp-ink-200);
  border-radius: var(--mp-radius-lg);
  box-shadow: var(--mp-shadow-popover);
}
.ui-dropdown:not(.is-open) .ui-dropdown__panel {
  display: none;
}

/* Auswahl Zeile 44px, Klickfläche voll (Guide, Form Elements) */
.ui-dropdown__option {
  display: flex;
  align-items: center;
  height: 44px;
  padding: 0 14px;
  font-family: var(--mp-font-body);
  font-size: var(--mp-fs-body-m);
  color: var(--mp-ink-900);
  cursor: pointer;
}
.ui-dropdown__option:hover {
  background: var(--mp-surface-subtle);
}
/* Ausgewählt: NICHT die native Browser-Blau-Markierung, sondern
   dieselbe helle Rosa-Tönung wie Secondary-Button-Hover - eine
   visuelle Sprache fürs "aktiv/ausgewählt" im ganzen System. */
.ui-dropdown__option[aria-selected="true"] {
  background: var(--mp-btn-secondary-bg-hover);
  color: var(--mp-primary);
  font-weight: 600;
}


/* ============================================================
 * AUTOCOMPLETE-DROPDOWN
 * "Suche 48px, Icon 20px links, Autocomplete-Dropdown direkt unter
 * dem Feld. Rahmen im geöffneten Zustand #14161C (wie Eintippen),
 * Trefferzeile 40px, Hover/erste Zeile #F6F7FA, gleicher Radius/
 * Shadow wie das Datum-Popover." (Guide, Form Elements)
 *
 * Markup:
 * <div class="ui-form-field ui-form-field--icon ui-autocomplete-wrap is-open">
 *   <label for="...">...</label>
 *   <i class="ph-bold ph-magnifying-glass" aria-hidden="true"></i>
 *   <input class="ui-input" type="search" role="combobox"
 *          aria-expanded="true" aria-controls="...-list">
 *   <ul class="ui-autocomplete" role="listbox" id="...-list">
 *     <li class="ui-autocomplete__item" role="option" aria-selected="true">Anna Weber</li>
 *     <li class="ui-autocomplete__item" role="option">Andreas Wendt</li>
 *   </ul>
 * </div>
 *
 * ".is-open" ist reiner Zustands-Hook fürs CSS - das tatsächliche
 * Öffnen/Schließen/Filtern beim Tippen ist JS-Logik und NICHT Teil
 * dieser Datei (analog zu mp-modal.js für das Modal-Öffnen/Schließen).
 * ============================================================ */

.ui-autocomplete-wrap {
  position: relative;
}
.ui-autocomplete-wrap.is-open .ui-input,
.ui-autocomplete-wrap.is-open input {
  border-color: var(--mp-ink-900);
  box-shadow: none;
}
/* Panel nur sichtbar, solange der Wrapper .is-open trägt - das
   setzt/entfernt mp-autocomplete.js abhängig vom Feldinhalt. Ohne
   diese Regel würde die Liste immer angezeigt, sobald sie im Markup
   steht, unabhängig vom Tippen. */
.ui-autocomplete-wrap:not(.is-open) .ui-autocomplete {
  display: none;
}

.ui-autocomplete {
  position: absolute;
  top: calc(100% + var(--mp-space-1));
  left: 0;
  right: 0;
  z-index: 20;
  margin: 0;
  padding: var(--mp-space-1) 0;
  max-height: 280px;
  overflow-y: auto;
  list-style: none;
  background: var(--mp-surface);
  border: 1px solid var(--mp-ink-200);
  border-radius: var(--mp-radius-lg);
  box-shadow: var(--mp-shadow-popover);
}

.ui-autocomplete__item {
  display: flex;
  align-items: center;
  height: 40px;
  padding: 0 14px;
  font-family: var(--mp-font-body);
  font-size: var(--mp-fs-body-m);
  color: var(--mp-ink-900);
  cursor: pointer;
}
.ui-autocomplete__item:hover,
.ui-autocomplete__item[aria-selected="true"] {
  background: var(--mp-surface-subtle);
}
/* .ui-autocomplete__item setzt oben eigenes display:flex (Autoren-CSS
   schlägt die Browser-Standardbehandlung von [hidden]) - deshalb hier
   explizit erzwungen, sonst bleiben clientseitig gefilterte, nicht
   passende Treffer trotz [hidden]-Attribut sichtbar. */
.ui-autocomplete__item[hidden] {
  display: none;
}
.ui-autocomplete__empty {
  padding: var(--mp-space-3) 14px;
  font-size: var(--mp-fs-caption);
  color: var(--mp-ink-500);
}


/* ============================================================
 * MEHRFACHAUSWAHL (MULTI-SELECT)
 * Chips für gewählte Werte + Filter-Suchfeld + gruppiertes Panel mit
 * Zeilen à 44px, volle Klickfläche (Guide: "Auswahl Zeile 44 px,
 * Klickfläche voll"). Nicht-verfügbare Optionen bleiben sichtbar,
 * aber deaktiviert (siehe Branchenselectionmodal.pdf,
 * itschwerpunktechipsfigma_1.pdf).
 *
 * Markup:
 * <div class="ui-form-field">
 *   <label>Branchen auswählen</label>
 *   <span class="ui-form-hint">Mehrfachauswahl möglich, maximal 3.</span>
 *
 *   <div class="ui-multiselect is-open">
 *     <div class="ui-multiselect__chips">
 *       <span class="ui-chip ui-chip--removable">IT &amp; Software
 *         <button type="button" class="ui-chip__remove" aria-label="Entfernen">
 *           <i class="ph-bold ph-x" aria-hidden="true"></i>
 *         </button>
 *       </span>
 *     </div>
 *
 *     <div class="ui-form-field--icon">
 *       <i class="ph-bold ph-magnifying-glass" aria-hidden="true"></i>
 *       <input class="ui-input" type="search" placeholder="Branche filtern …">
 *     </div>
 *
 *     <div class="ui-multiselect__panel" role="listbox" aria-multiselectable="true">
 *       <div class="ui-multiselect__group">
 *         <p class="ui-multiselect__group-label">Gesundheitswesen</p>
 *         <label class="ui-multiselect__option">
 *           <input type="checkbox" checked> Gesundheitswesen
 *         </label>
 *         <label class="ui-multiselect__option">
 *           <input type="checkbox" disabled> Pharma &amp; Life Sciences (nicht verfügbar)
 *         </label>
 *       </div>
 *     </div>
 *
 *     <div class="ui-multiselect__footer">
 *       <span class="ui-multiselect__counter">2 / 3 ausgewählt</span>
 *       <button type="button" class="ui-multiselect__clear-all">Alle entfernen</button>
 *     </div>
 *   </div>
 * </div>
 *
 * Chips nutzen bewusst die bestehende .ui-chip/.ui-chip--removable-
 * Komponente aus ui-button.css statt eigener Chip-Styles - eine
 * visuelle Wahrheit für "entfernbarer Tag" im ganzen System.
 * ============================================================ */

.ui-multiselect {
  border: 1px solid var(--mp-ink-300);
  border-radius: var(--mp-radius-lg);
  padding: var(--mp-space-3);
  background: var(--mp-surface);
}
.ui-multiselect.is-open {
  border-color: var(--mp-ink-900);
}

.ui-multiselect__chips {
  display: flex;
  flex-wrap: wrap;
  gap: var(--mp-space-2);
  margin-bottom: var(--mp-space-3);
}
.ui-multiselect__chips:empty { display: none; }

.ui-multiselect__chips .ui-chip {
	background: var(--mp-primary-tint);
	color: var(--mp-primary);
}

/* Filter-Suchfeld innerhalb der Multiselect-Box: bleibt wie jedes
   andere Feld auf surface (weiß) - KEIN surface-subtle. Braucht
   trotzdem einen sichtbaren, wenn auch leichten Rahmen (Ink 200 statt
   Ink 300), sonst verschwimmt es optisch mit der ebenfalls weißen
   Box drumherum. */
.ui-multiselect .ui-form-field--icon .ui-input,
.ui-multiselect .ui-form-field--icon input {
  border-color: var(--mp-ink-200);
  background: var(--mp-surface);
}
.ui-multiselect .ui-form-field--icon .ui-input:focus,
.ui-multiselect .ui-form-field--icon input:focus {
  border-color: var(--mp-primary);
  box-shadow: var(--mp-shadow-focus);
  background: var(--mp-surface);
}

.ui-multiselect__panel {
  margin-top: var(--mp-space-3);
  max-height: 280px;
  overflow-y: auto;
  border-top: 1px solid var(--mp-ink-200);
}

.ui-multiselect__group {
  padding-top: var(--mp-space-2);
}
.ui-multiselect__group-label {
  margin: 0;
  padding: var(--mp-space-2) 14px 4px;
  font-family: var(--mp-font-body);
  font-size: var(--mp-fs-label);
  line-height: var(--mp-lh-label);
  font-weight: 600;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: var(--mp-ink-500);
}

.ui-multiselect__option {
  display: flex;
  align-items: center;
  gap: var(--mp-space-2);
  min-height: 44px;
  padding: 0 14px;
  cursor: pointer;
  font-family: var(--mp-font-body);
  font-size: var(--mp-fs-body-m);
  color: var(--mp-ink-900);
}
.ui-multiselect__option:hover {
  background: var(--mp-surface-subtle);
}
.ui-multiselect__option:has(input:disabled) {
  cursor: not-allowed;
  color: var(--mp-ink-400);
}
.ui-multiselect__option:has(input:disabled):hover {
  background: transparent;
}
/* .ui-multiselect__option setzt eigenes display:flex, .ui-multiselect__group
   wird von mp-multiselect.js beim Filtern ebenfalls über [hidden]
   ein-/ausgeblendet - Autoren-CSS schlägt sonst die
   Browser-Standardbehandlung von [hidden] (siehe .ui-autocomplete__item
   weiter oben für dieselbe Problematik). */
.ui-multiselect__option[hidden],
.ui-multiselect__group[hidden] {
  display: none;
}

/* Fester Bestandteil der Komponente, nicht optional: Zähler links,
   "Alle entfernen" rechts, erscheint automatisch sobald etwas gewählt
   ist (siehe mp-multiselect.js). */
.ui-multiselect__footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--mp-space-2);
  margin-top: var(--mp-space-2);
}
.ui-multiselect__counter {
  font-family: var(--mp-font-body);
  font-size: var(--mp-fs-caption);
  line-height: var(--mp-lh-caption);
  color: var(--mp-ink-500);
}
.ui-multiselect__clear-all {
  border: 0;
  background: transparent;
  padding: 0;
  margin: 0;
  font-family: var(--mp-font-body);
  font-size: var(--mp-fs-caption);
  line-height: var(--mp-lh-caption);
  font-weight: 600;
  color: var(--mp-primary);
  cursor: pointer;
}
.ui-multiselect__clear-all:hover { text-decoration: underline; }
.ui-multiselect__clear-all:focus-visible {
  outline: none;
  box-shadow: var(--mp-shadow-focus);
  border-radius: var(--mp-radius-sm);
}
.ui-multiselect__clear-all[hidden] { display: none; }


/* ============================================================
 * CHECKBOX & RADIO
 * Klickfläche ≥44×44 (Accessibility-Kapitel) über Padding am Label,
 * sichtbare Box bleibt kompakt. Radius 4px für Checkbox (Kapitel
 * "Border Radius": "4px Kleine Elemente, Checkbox, Progress").
 *
 * Dual-Layer: neben .ui-checkbox/.ui-radio (kompaktes Einzelfeld mit
 * eigener 44px-Klickfläche) wird auch roher input[type="checkbox"]/
 * [type="radio"] gestylt, damit Zeilen wie .ui-multiselect__option
 * (die ihre 44px-Klickfläche selbst mitbringen) dieselbe Optik ohne
 * zusätzlichen Wrapper bekommen.
 * ============================================================ */

.ui-checkbox,
.ui-radio {
  display: inline-flex;
  align-items: flex-start;
  gap: var(--mp-space-2);
  padding: var(--mp-space-2) 0;
  min-height: 44px;
  cursor: pointer;
  font-family: var(--mp-font-body);
  font-size: var(--mp-fs-body-m);
  color: var(--mp-ink-900);
}

.ui-checkbox input,
.ui-radio input,
input[type="checkbox"],
input[type="radio"] {
  appearance: none;
  -webkit-appearance: none;
  flex-shrink: 0;
  width: 20px;
  height: 20px;
  margin-top: 2px; /* optische Ausrichtung zur ersten Textzeile */
  border: 1px solid var(--mp-ink-300);
  background: var(--mp-surface);
  cursor: pointer;
  transition: border-color .15s ease, background-color .15s ease;
}
.ui-checkbox input,
input[type="checkbox"] { border-radius: var(--mp-radius-sm); }
.ui-radio input,
input[type="radio"] { border-radius: var(--mp-radius-pill); }

.ui-checkbox input:hover,
.ui-radio input:hover,
input[type="checkbox"]:hover,
input[type="radio"]:hover {
  border-color: var(--mp-ink-900);
}
.ui-checkbox input:focus-visible,
.ui-radio input:focus-visible,
input[type="checkbox"]:focus-visible,
input[type="radio"]:focus-visible {
  outline: none;
  box-shadow: var(--mp-shadow-focus);
}

.ui-checkbox input:checked,
input[type="checkbox"]:checked {
  border-color: var(--mp-primary);
  background-color: var(--mp-primary);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='white' stroke-width='2' stroke-linecap='round' stroke-linejoin='round' d='M3.5 8.3l2.8 2.8 6-6.2'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: center;
  background-size: 13px;
}
.ui-radio input:checked,
input[type="radio"]:checked {
  border-color: var(--mp-primary);
  background-image: radial-gradient(circle, var(--mp-primary) 0 4px, transparent 4.5px);
}

.ui-checkbox input:disabled,
.ui-radio input:disabled,
input[type="checkbox"]:disabled,
input[type="radio"]:disabled {
  border-color: var(--mp-ink-200);
  background-color: var(--mp-surface-subtle);
  cursor: not-allowed;
}
.ui-checkbox:has(input:disabled),
.ui-radio:has(input:disabled) {
  color: var(--mp-ink-400);
  cursor: not-allowed;
}

/* Gruppen von Checkboxen/Radios: eigenes Fieldset statt <div>, damit
   Screenreader die Gruppe ansagen. Legend bekommt dieselbe Typografie
   wie ein normales Feld-Label. */
.ui-form-fieldset {
  margin: 0 0 var(--mp-space-5);
  padding: 0;
  border: 0;
}
.ui-form-fieldset legend {
  margin-bottom: var(--mp-space-2);
  padding: 0;
  font-family: var(--mp-font-body);
  font-size: var(--mp-fs-field-label);
  line-height: var(--mp-lh-field-label);
  font-weight: 600;
  color: var(--mp-ink-900);
}
.ui-form-fieldset .ui-checkbox,
.ui-form-fieldset .ui-radio {
  display: flex;
}

.ui-form-fieldset--columns {
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: var(--mp-space-4);
}
@media (max-width: 480px) {
  .ui-form-fieldset--columns {
    grid-template-columns: 1fr;
  }
}
/* ============================================================
 * TOGGLE / SWITCH
 * Aus eigenständigem mp_toggle-Snippet integriert (Stand 14.09.26) -
 * vorher eigener wp_head-Inline-<style>-Block im Snippet selbst, lief
 * unabhängig von jeder anderen Form-Komponente. Ab jetzt ganz normaler
 * Teil von ui-form.css, Markup-Funktion mp_toggle_markup() liegt in
 * components.php neben den anderen Render-Funktionen.
 *
 * Für binäre An/Aus-Einstellungen mit sofortiger Wirkung (z. B.
 * Benachrichtigungen) - NICHT als Ersatz für Checkbox in Formularen
 * mit "Absenden"-Button gedacht.
 *
 * Keine neuen Tokens - nutzt ausschließlich bereits vorhandene
 * (--mp-space-10/-6/-5/-4 aus dem Spacing-System, --mp-radius-pill,
 * --mp-shadow-xs/-focus, --mp-ink-*, --mp-surface, --mp-primary).
 * ============================================================ */

.ui-toggle {
  display: inline-flex;
  align-items: center;
  gap: var(--mp-space-3);
  cursor: pointer;
  font-family: var(--mp-font-body);
  font-size: var(--mp-fs-body-m);
  color: var(--mp-ink-900);
}
.ui-toggle__body {
  display: flex;
  flex-direction: column;
}

/* Visuell versteckt, aber weiterhin fokussierbar/screenreader-lesbar -
   Track + Thumb sind das komplette visuelle Ersatz-Element, deshalb
   hier vollständig unsichtbar statt appearance:none wie bei Checkbox/
   Radio oben. */
.ui-toggle__input {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

.ui-toggle__track {
  flex-shrink: 0;
  position: relative;
  width: var(--mp-space-10);
  height: var(--mp-space-6);
  border-radius: var(--mp-radius-pill);
  background: var(--mp-ink-300);
  transition: background-color .15s ease;
}
.ui-toggle__thumb {
  position: absolute;
  top: 2px;
  left: 2px;
  width: var(--mp-space-5);
  height: var(--mp-space-5);
  border-radius: var(--mp-radius-pill);
  background: var(--mp-surface);
  box-shadow: var(--mp-shadow-xs);
  transition: transform .15s ease;
}
.ui-toggle__input:checked ~ .ui-toggle__track {
  background: var(--mp-primary);
}
.ui-toggle__input:checked ~ .ui-toggle__track .ui-toggle__thumb {
  transform: translateX(var(--mp-space-4));
}
.ui-toggle__input:focus-visible ~ .ui-toggle__track {
  outline: none;
  box-shadow: var(--mp-shadow-focus);
}
.ui-toggle__input:disabled ~ .ui-toggle__track {
  background: var(--mp-ink-100);
}
.ui-toggle:has(.ui-toggle__input:disabled) {
  cursor: not-allowed;
  color: var(--mp-ink-400);
}
/* ============================================================
 * HILFETEXT / FEHLERTEXT
 * 6px unter dem Feld (Guide-Vorgabe, keine 4px-Skalen-Stufe -
 * bewusst wie beim Feld-Padding, siehe Kommentar oben).
 * ============================================================ */

.ui-form-hint,
.ui-form-error {
  margin-top: 6px;
  font-family: var(--mp-font-body);
  font-size: var(--mp-fs-caption);
  line-height: var(--mp-lh-caption);
}
.ui-form-hint { color: var(--mp-ink-500); }
.ui-form-error {
  color: var(--mp-error);
  display: flex;
  align-items: center;
  gap: 4px;
}
.ui-form-error i { font-size: 14px; }
/* KORREKTUR: hidden-Attribut muss IMMER gewinnen, auch wenn die Klasse
   selbst display:flex setzt - ohne das bleibt ein per JS auf hidden
   gesetztes .ui-form-error trotzdem sichtbar (z. B. beim Datepicker,
   der es dynamisch ein-/ausblendet statt es bedingt per PHP zu
   rendern). */
.ui-form-error[hidden] {
	display: none;
}

/* ============================================================
 * ZEICHENZÄHLER (opt-in)
 * NICHT automatisch auf jedem Feld - nur wo im Markup explizit über
 * [data-ui-counter] + maxlength angefordert (siehe mp-form-counter.js,
 * das Script baut die Anzeige selbst, wenn sie im Markup fehlt).
 *
 * Sitzt standardmäßig in derselben Zeile wie Hilfe-/Fehlertext,
 * rechtsbündig ("300 / 500"), damit nicht für jedes Feld mit Zähler
 * zusätzliche vertikale Höhe entsteht. .ui-form-field__meta ist der
 * Zeilen-Wrapper dafür - übernimmt das 6px-Abstand-zum-Feld selbst,
 * Hint/Error darin verlieren deshalb ihren eigenen margin-top.
 *
 * Markup (Minimum, Zähler wird automatisch erzeugt):
 * <textarea class="ui-textarea" maxlength="500" data-ui-counter></textarea>
 *
 * Markup mit Hilfetext in derselben Zeile:
 * <textarea class="ui-textarea" maxlength="500" data-ui-counter></textarea>
 * <div class="ui-form-field__meta">
 *   <span class="ui-form-hint">Kurz und prägnant.</span>
 * </div>
 * (der Zähler wird als zweites Kind in .ui-form-field__meta ergänzt)
 *
 * Optionales Mindestmaß, z. B. "mindestens 50 Zeichen":
 * <textarea data-ui-counter data-ui-counter-min="50" maxlength="500"></textarea>
 * ============================================================ */

.ui-form-field__meta {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--mp-space-2);
  margin-top: 6px;
}
.ui-form-field__meta .ui-form-hint,
.ui-form-field__meta .ui-form-error {
  margin-top: 0;
}

.ui-form-field__counter {
  flex-shrink: 0;
  margin-left: auto;
  font-family: var(--mp-font-body);
  font-size: var(--mp-fs-caption);
  line-height: var(--mp-lh-caption);
  color: var(--mp-ink-500);
  white-space: nowrap;
}
/* Unter dem geforderten Minimum (data-ui-counter-min) ODER kurz vor
   dem Maximum (letzte 10%, mind. 10 Zeichen Puffer). */
.ui-form-field__counter--warning {
  color: var(--mp-warning);
}
/* Maximum erreicht - kein Fehler (ist ja erlaubt bis dahin), aber
   deutlich sichtbar, dass kein Platz mehr ist. */
.ui-form-field__counter--limit {
  color: var(--mp-ink-900);
  font-weight: 600;
}

/* ============================================================
 * GROSSE SEARCH BAR (.ui-form-field--icon-lg)
 * ---------------------------------------------------------------------
 * Aus eigenständigem mp_search_bar-Snippet integriert. Präsente Suche
 * für Verzeichnis-/Glossar-Seiten (und später ggf. Homepage) - fachlich
 * dieselbe .ui-form-field--icon-Familie wie das normale Suchfeld,
 * nur größer + optional mit echtem Such-Button statt Leeren-Kreuz.
 *
 * Kombinierbar mit .ui-autocomplete-wrap (siehe AUTOCOMPLETE-DROPDOWN
 * weiter oben in dieser Datei) - KEINE neue JS-Logik nötig,
 * mp-autocomplete.js reagiert bereits generisch auf jedes
 * .ui-autocomplete-wrap, unabhängig von der Feldgröße.
 *
 * Fallback-Werte aus der Ursprungsversion entfernt (Tokens immer
 * geladen).
 * ============================================================ */

.ui-form-field--icon-lg .ui-input,
.ui-form-field--icon-lg input {
	height: var(--mp-btn-height-lg);
	font-size: var(--mp-fs-body-l);
	padding-left: var(--mp-space-12);
}
.ui-form-field--icon-lg > i {
	left: var(--mp-space-4);
	font-size: 24px;
}

/* Such-Button rechts im Feld statt Leeren-Kreuz (via show_button-Param
   in mp_search_bar_markup(), siehe components.php) */
.ui-form-field--icon-lg .ui-form-field__submit {
	position: absolute;
	top: var(--mp-space-1);
	right: var(--mp-space-2);
	height: var(--mp-btn-height-md);
}
.ui-form-field--icon-lg:has(.ui-form-field__submit) .ui-input,
.ui-form-field--icon-lg:has(.ui-form-field__submit) input {
	padding-right: var(--mp-space-16);
}
/* Gruppen-Überschrift im Autocomplete-Panel (z. B. "Anbieter" / "Lösungen") -
   nur bei mehreren kombinierten autocomplete_sources UND gesetzten
   autocomplete_group_labels aktiv, siehe mp-autocomplete.js. Gleiche
   Typografie wie .ui-multiselect__group-label, konsistente Label-Optik
   im ganzen Formular-System. */
.ui-autocomplete__group-label {
	margin: 0;
	padding: var(--mp-space-2) 14px 4px;
	font-family: var(--mp-font-body);
	font-size: var(--mp-fs-label);
	line-height: var(--mp-lh-label);
	font-weight: 600;
	letter-spacing: .08em;
	text-transform: uppercase;
	color: var(--mp-ink-500);
	pointer-events: none;
	list-style: none;
}
.ui-autocomplete__group-label:not(:first-child) {
	border-top: 1px solid var(--mp-ink-200);
	margin-top: var(--mp-space-1);
}
/* ============================================================
 * MOBILE
 * ============================================================ */

@media (max-width: 600px) {
  .ui-form-row {
    grid-template-columns: 1fr;
  }
}
/* ============================================================
 * DATEPICKER (.ui-datepicker) - date / year / range
 * ---------------------------------------------------------------------
 * Aus eigenständigem mp_datepicker-Snippet integriert + um Modus
 * "range" erweitert (übernimmt Zwei-Monats-Ansicht + Schnellauswahl
 * aus der alten DualCalendarV-Implementierung in der Veranstaltungen-
 * Verwaltung, aber mit Tokens statt hartcodierten Hex-Werten/!important).
 *
 * Baut auf .ui-dropdown auf (siehe "DROPDOWN"-Abschnitt oben) - alle
 * drei Modi sind technisch ein .ui-dropdown mit eigenem Panel-Inhalt,
 * kein separates Overlay/Modal-System wie bei DualCalendarV.
 *
 * Fallback-Hex-Werte aus der Ursprungsversion entfernt (Tokens sind
 * ohnehin immer geladen).
 * ============================================================ */

.ui-datepicker.is-open .ui-datepicker__trigger-icon {
	transform: none; /* kein Chevron-Drehen wie beim normalen Dropdown - Kalender-Icon bleibt fix */
}

/* ---- Trigger als tippbares Eingabefeld statt Button ----
   NEU: der Trigger ist jetzt ein echtes <input type="text"> statt eines
   <button> - direktes Überschreiben eines Teils (z. B. nur die Jahreszahl
   in einem Zeitraum) ist damit ohne Klicken durch den Kalender möglich.
   Ein <input> kann keine Kind-Elemente haben, deshalb liegt das
   Kalender-Icon als eigenes, absolut positioniertes Geschwister-Element
   daneben (gleiches Prinzip wie .ui-form-field--icon), mit
   pointer-events:none, damit Klicks auf die Icon-Fläche trotzdem am
   Input ankommen (und so von mp-dropdown.js als Trigger-Klick erkannt
   werden - .ui-dropdown__trigger sitzt jetzt auf dem <input>, nicht auf
   einem Wrapper). ---- */
.ui-datepicker__trigger-field {
	position: relative;
}
.ui-datepicker .ui-dropdown__trigger {
	width: 100%;
	padding-right: var(--mp-space-10);
	cursor: text;
}
.ui-datepicker__trigger-icon {
	position: absolute;
	top: 50%;
	right: var(--mp-space-3);
	transform: translateY(-50%);
	color: var(--mp-ink-500);
	pointer-events: none;
}

.ui-datepicker__panel {
	width: max-content;
	max-height: none;
	padding: var(--mp-space-4);
}

/* ---- date / year: eine Monats-/Jahres-Ansicht ---- */
.ui-datepicker__nav {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: var(--mp-space-2);
	margin-bottom: var(--mp-space-3);
}
.ui-datepicker__nav-label {
	font-family: var(--mp-font-body);
	font-size: var(--mp-fs-body-m);
	font-weight: 600;
	color: var(--mp-ink-900);
}
.ui-datepicker__grid {
	display: grid;
	grid-template-columns: repeat(7, var(--mp-space-8));
	gap: 2px;
}
.ui-datepicker[data-mode="year"] .ui-datepicker__grid {
	grid-template-columns: repeat(4, var(--mp-space-10));
	gap: var(--mp-space-2);
}
.ui-datepicker__weekday {
	display: flex;
	align-items: center;
	justify-content: center;
	width: var(--mp-space-8);
	height: var(--mp-space-8);
	font-size: var(--mp-fs-caption);
	font-weight: 600;
	color: var(--mp-ink-500);
}
.ui-datepicker__day,
.ui-datepicker__year {
	display: flex;
	align-items: center;
	justify-content: center;
	width: var(--mp-space-8);
	height: var(--mp-space-8);
	border: none;
	border-radius: var(--mp-radius-sm);
	background: transparent;
	font-family: var(--mp-font-body);
	font-size: var(--mp-fs-body-s);
	color: var(--mp-ink-900);
	cursor: pointer;
}
.ui-datepicker__year {
	width: var(--mp-space-10);
	height: var(--mp-space-10);
}
.ui-datepicker__day:hover,
.ui-datepicker__year:hover {
	background: var(--mp-surface-subtle);
}
.ui-datepicker__day:focus-visible,
.ui-datepicker__year:focus-visible {
	outline: none;
	box-shadow: var(--mp-shadow-focus);
}
.ui-datepicker__day--muted {
	color: var(--mp-ink-300);
}
.ui-datepicker__day--today {
	font-weight: 600;
	color: var(--mp-primary);
}
.ui-datepicker__day[aria-selected="true"],
.ui-datepicker__year[aria-selected="true"] {
	background: var(--mp-primary);
	color: var(--mp-surface);
	font-weight: 600;
}
.ui-datepicker__day:disabled {
	color: var(--mp-ink-300);
	cursor: not-allowed;
}

/* ---- range: Schnellauswahl + zwei Monate + Anwenden/Abbrechen ---- */
.ui-datepicker__panel--range {
	padding: 0; /* eigenes Innen-Padding pro Bereich statt einheitlich */
}
.ui-datepicker__range-body {
	display: flex;
}
.ui-datepicker__quick {
	display: flex;
	flex-direction: column;
	gap: 2px;
	padding: var(--mp-space-4) var(--mp-space-3);
	border-right: 1px solid var(--mp-ink-200);
	min-width: 150px;
}
.ui-datepicker__quick-item {
	padding: var(--mp-space-2) var(--mp-space-3);
	border: none;
	border-radius: var(--mp-radius-sm);
	background: transparent;
	font-family: var(--mp-font-body);
	font-size: var(--mp-fs-body-s);
	color: var(--mp-ink-900);
	text-align: left;
	white-space: nowrap;
	cursor: pointer;
}
.ui-datepicker__quick-item:hover {
	background: var(--mp-surface-subtle);
}
.ui-datepicker__quick-item[aria-pressed="true"] {
	background: transparent;
	font-weight: 600;
}

.ui-datepicker__months {
	display: flex;
	gap: 0;
	padding: var(--mp-space-4) var(--mp-space-5);
}
.ui-datepicker__month + .ui-datepicker__month {
	margin-left: var(--mp-space-5);
	padding-left: var(--mp-space-5);
	border-left: 1px solid var(--mp-ink-200);
}

/* Range-Zwischenzustände - nutzen dieselbe Basis-Klasse .ui-datepicker__day
   wie der Einzel-Modus, nur zusätzliche Zustands-Modifier */
.ui-datepicker__day--in-range {
	background: var(--mp-primary-tint, #FBE9EF);
	border-radius: 0;
	color: var(--mp-primary);
}
.ui-datepicker__day--range-start {
	background: var(--mp-primary);
	color: var(--mp-surface);
	border-radius: var(--mp-radius-sm) 0 0 var(--mp-radius-sm);
}
.ui-datepicker__day--range-end {
	background: var(--mp-primary);
	color: var(--mp-surface);
	border-radius: 0 var(--mp-radius-sm) var(--mp-radius-sm) 0;
}
.ui-datepicker__day--range-start.ui-datepicker__day--range-end {
	border-radius: var(--mp-radius-sm);
}

.ui-datepicker__range-footer {
	display: flex;
	justify-content: flex-end;
	gap: var(--mp-space-3);
	padding: var(--mp-space-3) var(--mp-space-5);
	border-top: 1px solid var(--mp-ink-200);
}

/* Sicherheitsnetz: falls das Panel trotz allem breiter wäre als der
   verfügbare Platz (z. B. sehr schmales Fenster knapp über dem
   Breakpoint) - horizontal scrollbar statt die Seite zu sprengen. */
.ui-datepicker__panel--range {
	max-width: calc(100vw - 32px);
	overflow-x: auto;
}

/* KORREKTUR: Breakpoint von 680px auf 820px angehoben - bei 680px
   blieb die Zwei-Monats-Ansicht + Quick-Sidebar auf Tablets (768px,
   z. B. iPad Portrait) nebeneinander stehen (~700-750px reine
   Panel-Breite, zu knapp kalkuliert). */
@media (max-width: 820px) {
	.ui-datepicker__range-body {
		flex-direction: column;
	}
	.ui-datepicker__quick {
		flex-direction: row;
		flex-wrap: wrap;
		border-right: none;
		border-bottom: 1px solid var(--mp-ink-200);
		min-width: unset;
	}
	.ui-datepicker__months {
		flex-direction: column;
		padding: var(--mp-space-4);
	}
	.ui-datepicker__month + .ui-datepicker__month {
		margin-left: 0;
		padding-left: 0;
		border-left: none;
		border-top: 1px solid var(--mp-ink-200);
		padding-top: var(--mp-space-4);
		margin-top: var(--mp-space-4);
	}
}
/* Zähler in Klammern neben Filter-Optionen (z. B. "IT-Sicherheit (42)") -
   IMMER dabei, wenn eine Filter-Option auf eine gezählte Ergebnismenge
   verweist. Wert kommt aus einer echten COUNT()-Abfrage gegen die
   AKTUELLE Ergebnisliste (inkl. bereits aktiver anderer Filter), NICHT
   aus der Gesamtzahl aller Einträge - sonst zeigt der Zähler eine
   falsche, zu hohe Erwartung an, wie viele Treffer man nach dem Klick
   tatsächlich bekommt. */
.mp-filter-count {
	margin-left: var(--mp-space-1);
	font-size: var(--mp-fs-caption);
	color: var(--mp-ink-500);
}

/* Fieldset-Variante INLINE: kurze Checkbox-/Radio-Gruppen (z. B. Service) stehen
   nebeneinander (Raster, bricht bei Platzmangel um). Legend bleibt oben.
   Raster statt Flex, damit das Layout unabhängig vom display der einzelnen
   Labels funktioniert.
   Nutzung: <fieldset class="ui-form-fieldset ui-form-fieldset--inline"> */
.ui-form-fieldset.ui-form-fieldset--inline {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr));
  column-gap: var(--mp-space-4);
}
.ui-form-fieldset.ui-form-fieldset--inline .ui-checkbox,
.ui-form-fieldset.ui-form-fieldset--inline .ui-radio {
  margin: 0; /* hebt den Label-Abstand von .ui-form-field label auf */
}

/* ---- Profil-Adresse (URL)-Vorschau unter dem Namensfeld (Komponente "MP Profil-Adresse") ---- */
.ui-form-hint--slug [data-mp-slug-text] {
  display: block;
  font-weight: 600;
  color: var(--mp-ink-700);
  overflow-wrap: anywhere;
}