/* HTMLShare — Theming-Variablen.
 * Spiegelt das `homelab.css`-Pattern aus dem Standards-Repo (Std 8.2).
 * App-spezifische Overrides duerfen hier ergaenzt werden.
 */

/* Alpine.js — versteckt Elemente mit `x-cloak`-Attribut bis Alpine initialisiert.
 * Verhindert "Flash of Uncloaked Content" und Fehlbedienung waehrend des Bootings. */
[x-cloak] { display: none !important; }

:root {
  --hl-primary:   #0d6efd;
  --hl-accent:    #6610f2;
  --hl-success:   #198754;
  --hl-warning:   #ffc107;
  --hl-danger:    #dc3545;
  --hl-radius:    0.5rem;
  --hl-shadow:    0 0.5rem 1rem rgba(0, 0, 0, .075);
  --hl-font:      system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
}

html, body {
  font-family: var(--hl-font);
}

.card {
  border-radius: var(--hl-radius);
}

/* Std 8.6.1 — Mobile-Spaltenpriorisierung in Tabellen */
@media (max-width: 575.98px) {
  .table .d-mobile-hide { display: none !important; }
}

/* Std 8.7 — Fokus-Sichtbarkeit fuer Tastaturnavigation */
:focus-visible {
  outline: 2px solid var(--hl-primary);
  outline-offset: 2px;
}

/* Std 13 — Safe-Area-Insets fuer iOS Home-Bildschirm-App.
 *
 * Wichtig: `body { padding-top }` reicht NICHT, wenn eine sticky-Navbar im
 * Spiel ist. `.sticky-top` heftet sich an die Viewport-Top und ignoriert das
 * body-padding. Auf iPhone-PWA wuerde die Navbar dadurch hinter der Statuszeile
 * verschwinden. Loesung: Body bekommt nur bottom-Safe-Area, die Navbar
 * uebernimmt den top-Anteil selbst (siehe Std 13.3 / Issue 2026-05-18).
 */
@supports (padding: env(safe-area-inset-top)) {
  body {
    padding-bottom: env(safe-area-inset-bottom);
  }
  .navbar.sticky-top,
  .navbar.fixed-top {
    padding-top: calc(.5rem + env(safe-area-inset-top));
  }
  /* Routen ohne Navbar (Login, Wizard, expired.html) brauchen das
     top-Padding direkt am Body — sonst klebt der Inhalt unter der Notch. */
  body:not(:has(.navbar.sticky-top)):not(:has(.navbar.fixed-top)) {
    padding-top: env(safe-area-inset-top);
  }

  /* Modals im iPhone-PWA (status-bar-style: black-translucent): Header
     (btn-close) laege sonst hinter der Statuszeile, Footer-Buttons hinter
     dem Home-Indicator. Die Insets sitzen als Padding auf .modal statt als
     margin-top auf .modal-dialog: Bootstraps Prozent-Hoehen
     (.modal-dialog-scrollable height / .modal-dialog-centered min-height
     = calc(100% - 2 * Rand)) beziehen sich auf die Content-Box von .modal
     und schrumpfen so automatisch mit. Ein reines margin-top schob den
     Dialog nur nach unten — bei scrollbaren Modals (z. B. „An Kolleg:innen
     senden“) rutschte die Fusszeile mit den Buttons aus dem Bild
     (Issue 2026-05-18, 2026-10-09). Fullscreen-Modals tragen den Inset im
     Header (unten). */
  .modal:not(:has(.modal-fullscreen, .modal-fullscreen-sm-down, .modal-fullscreen-md-down)) {
    padding-top: env(safe-area-inset-top);
    padding-bottom: env(safe-area-inset-bottom);
  }
  /* Fullscreen-Modals haben kein margin-top — Inset gehoert ins Header-Padding. */
  .modal-fullscreen .modal-header,
  .modal-fullscreen-sm-down .modal-header,
  .modal-fullscreen-md-down .modal-header {
    padding-top: calc(1rem + env(safe-area-inset-top));
  }
  /* Offcanvas von oben + Toast-Container an top-0 muessen den Inset selbst tragen. */
  .offcanvas-top {
    padding-top: env(safe-area-inset-top);
  }
  .toast-container.top-0 {
    padding-top: env(safe-area-inset-top);
  }
  /* Utility fuer eigene fixed/sticky-Top-Elemente:
     <div class="hl-safe-top position-fixed top-0">…</div> ist iOS-sicher. */
  .hl-safe-top {
    padding-top: env(safe-area-inset-top);
  }
}

/* ------------------------------------------------------------------- */
/* Touch- und iPad-Polish (Std 8 / 13)                                 */
/* ------------------------------------------------------------------- */

/* Mindest-Tap-Target 44x44 px (Std 8.1). Bootstraps Default-Buttons sind
 * mit `btn-sm` zu klein fuer Daumen-Bedienung; auf Touch-Geraeten heben
 * wir die Mindesthoehe an. */
@media (pointer: coarse) {
  .dropdown-item {
    min-height: 44px;
    padding-top: .65rem;
    padding-bottom: .65rem;
  }
  .btn-sm, .btn {
    min-height: 38px;
  }
  .form-check-input {
    min-width: 22px;
    min-height: 22px;
  }
}

/* iPad-Landscape (1024 px) und groesser: 3 Spalten fuer Page-Karten, etwas
 * breitere Sidebar — sonst wird das Grid optisch unausgewogen. */
@media (min-width: 1024px) and (max-width: 1366px) {
  .container-fluid > .row > .col-12.col-lg-3 {
    flex: 0 0 auto;
    width: 22%;
  }
  .container-fluid > .row > .col-12.col-lg-9 {
    flex: 0 0 auto;
    width: 78%;
  }
}

/* Dashboard-Seitenleiste als Offcanvas-Schublade unter lg (iPad Split View,
 * Handy). Die <aside> ist zugleich Grid-Spalte (.row > *): deren Gutter-
 * margin-top wuerde die fixe Schublade nach unten versetzen. Header traegt
 * den iOS-Safe-Area-Inset selbst (analog .offcanvas-top oben). */
@media (max-width: 991.98px) {
  .hl-sidebar {
    margin-top: 0;
    padding-left: env(safe-area-inset-left, 0px);
  }
  .hl-sidebar .offcanvas-header {
    padding-top: calc(1rem + env(safe-area-inset-top, 0px));
  }
}

/* Einklappbare Dashboard-Seitenleiste (ab lg). Zustand pro User in der DB
 * (users.sidebar_collapsed); die Klasse sitzt auf der .row. Unter lg ist die
 * Seitenleiste ohnehin eine Schublade — dort greift nichts davon. */
.hl-sidebar-expand {
  display: none;
}
@media (min-width: 992px) {
  .container-fluid > .row.hl-sidebar-collapsed > .hl-sidebar {
    display: none !important;
  }
  .container-fluid > .row.hl-sidebar-collapsed > .hl-main {
    flex: 0 0 auto;
    width: 100% !important;
  }
  .row.hl-sidebar-collapsed .hl-sidebar-expand {
    display: inline-block;
  }
}

/* Floating-Action-Button (FAB) fuer Upload — sticky unten rechts auf
 * Touch-Geraeten. Std 8.4: "wichtige Aktionen unten zentriert (sticky)". */
.hl-fab {
  position: fixed;
  right: calc(1rem + env(safe-area-inset-right, 0px));
  bottom: calc(1rem + env(safe-area-inset-bottom, 0px));
  width: 56px;
  height: 56px;
  border-radius: 50%;
  box-shadow: 0 .5rem 1.5rem rgba(0, 0, 0, 0.25);
  z-index: 1030;
  display: none;
}
@media (pointer: coarse), (max-width: 991.98px) {
  .hl-fab { display: inline-flex; align-items: center; justify-content: center; }
}

/* Kartenkomfort auf Touch: leichtere Hover-Effekte (waeren auf Touch
 * unangenehm "klebrig"). */
@media (pointer: coarse) {
  .card-hover-effect:hover { box-shadow: none; transform: none; }
}

/* iOS-spezifisch: WebKit-Smooth-Scrolling fuer interne Scroll-Container */
.modal-body, .table-responsive {
  -webkit-overflow-scrolling: touch;
}

/* Folder-Bulk-Select-Checkbox: dezent auf Maus (nur on hover),
 * permanent sichtbar auf Touch (kein Hover-Konzept). Wenn die
 * Checkbox bereits gesetzt ist, ist sie immer sichtbar. */
.hl-folder-check {
  opacity: 0;
  transition: opacity 120ms ease-in-out;
}
@media (hover: hover) {
  .hl-folder-row:hover .hl-folder-check { opacity: 1; }
}
@media (hover: none) {
  .hl-folder-check { opacity: 1; }
}
.hl-folder-check:checked,
.hl-folder-check.is-checked {
  opacity: 1;
}

/* ------------------------------------------------------------------- */
/* Geführter Rundgang (driver.js, static/js/tour.js)                   */
/* Farben aus Bootstrap-Variablen → Dark Mode ohne Extra-Regeln.       */
/* Selektoren mit .driver-popover.hl-tour, damit sie das später        */
/* geladene driver.css schlagen.                                       */
/* ------------------------------------------------------------------- */
.driver-popover.hl-tour {
  font-family: var(--hl-font, var(--bs-body-font-family));
  color: var(--bs-body-color);
  background-color: var(--bs-body-bg);
  border: 1px solid var(--bs-border-color);
  border-radius: var(--hl-radius, .5rem);
  box-shadow: var(--bs-box-shadow);
  max-width: min(340px, calc(100vw - 2rem));
  padding: 1rem;
}
.driver-popover.hl-tour .driver-popover-title { font-size: 1.1rem; }
.driver-popover.hl-tour .driver-popover-description { font-size: 1rem; }
.driver-popover.hl-tour .driver-popover-progress-text { color: var(--bs-secondary-color); font-size: .875rem; }
.driver-popover.hl-tour .driver-popover-close-btn {
  color: var(--bs-secondary-color);
  width: 44px; height: 44px; font-size: 1.4rem;
}
.driver-popover.hl-tour .driver-popover-close-btn:hover,
.driver-popover.hl-tour .driver-popover-close-btn:focus { color: var(--bs-body-color); }
/* Tap-Targets ≥ 44 px (Std 8.1) */
.driver-popover.hl-tour .driver-popover-footer-btn {
  min-height: 44px;
  padding: .375rem .9rem;
  font-size: 1rem;
  text-shadow: none;
  color: var(--bs-body-color);
  background-color: var(--bs-body-bg);
  border: 1px solid var(--bs-border-color);
  border-radius: var(--bs-border-radius);
}
.driver-popover.hl-tour .driver-popover-footer-btn:hover { background-color: var(--bs-tertiary-bg); }
.driver-popover.hl-tour .driver-popover-footer-btn:focus-visible {
  outline: 2px solid var(--bs-primary); outline-offset: 2px;
}
.driver-popover.hl-tour .driver-popover-next-btn {
  color: #fff; background-color: var(--bs-primary); border-color: var(--bs-primary);
}
.driver-popover.hl-tour .driver-popover-next-btn:hover { background-color: var(--bs-primary); filter: brightness(.9); }
.driver-popover.hl-tour .driver-popover-arrow { border-color: var(--bs-body-bg); }
.driver-popover.hl-tour .driver-popover-arrow-side-left   { border-color: transparent transparent transparent var(--bs-body-bg); }
.driver-popover.hl-tour .driver-popover-arrow-side-right  { border-color: transparent var(--bs-body-bg) transparent transparent; }
.driver-popover.hl-tour .driver-popover-arrow-side-top    { border-color: var(--bs-body-bg) transparent transparent transparent; }
.driver-popover.hl-tour .driver-popover-arrow-side-bottom { border-color: transparent transparent var(--bs-body-bg) transparent; }
/* Der schwebende Upload-Knopf läge über dem Overlay und verdeckte Ziele. */
body.driver-active .hl-fab { display: none !important; }

/* ------------------------------------------------------------------- */
/* Postkorb-Knopf als Ablagefläche (dashboard.js _bindPostkorbDrop)     */
/* Nur während ein Kachel-/Ordner-Drag läuft (body.hs-dragging-items).  */
/* ------------------------------------------------------------------- */
body.hs-dragging-items [data-hs-drop="postkorb"] {
  position: relative;
  outline: 2px dashed var(--bs-primary);
  outline-offset: 2px;
  border-radius: var(--bs-border-radius);
  color: var(--bs-primary);
}
body.hs-dragging-items [data-hs-drop="postkorb"]::after {
  content: "Zum Senden ablegen";
  position: absolute;
  top: calc(100% + .4rem);
  left: 50%;
  transform: translateX(-50%);
  white-space: nowrap;
  font-size: .8rem;
  padding: .15rem .5rem;
  color: var(--bs-body-color);
  background-color: var(--bs-body-bg);
  border: 1px solid var(--bs-border-color);
  border-radius: var(--bs-border-radius);
  box-shadow: var(--bs-box-shadow-sm);
  pointer-events: none;
  z-index: 1030;
}
/* Im Rundgang erklärt die Sprechblase; das Etikett läge sonst darunter. */
body.driver-active [data-hs-drop="postkorb"]::after { display: none; }
body.hs-dragging-items [data-hs-drop="postkorb"].hs-drop-over {
  outline-style: solid;
  color: #fff !important;
  background-color: var(--bs-primary);
}
.hs-people-list { max-height: 14rem; overflow-y: auto; }

/* Bildfläche der Dashboard-Kacheln: Titelbild von Hand oder automatische
 * Vorschau (services/previews.py), sonst Platzhalter. Abschaltbar pro Konto
 * (users.show_previews). */
.hl-tile-preview {
  display: block;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  background: var(--bs-tertiary-bg, #f4f5f7);
  border-bottom: 1px solid var(--bs-border-color-translucent);
  border-top-left-radius: var(--bs-card-inner-border-radius, .5rem);
  border-top-right-radius: var(--bs-card-inner-border-radius, .5rem);
}
.hl-tile-preview img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
/* Bildschirmfotos zeigen den Seitenanfang — oben ausrichten, nicht mittig. */
.hl-tile-preview img.hl-tile-preview-top { object-position: top center; }
.hl-tile-preview-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: .25rem;
  height: 100%;
  color: var(--bs-secondary-color);
  font-size: .8rem;
}
.hl-tile-preview-empty .bi { font-size: 1.75rem; opacity: .6; }
