/* SZaN — reguły tabel ponad Vuexy core.css. Cel: BRAK poziomego scrolla list.
   Tabela wypełnia 100% szerokości karty; ciaśniejszy padding komórek odzyskuje miejsce; kolumny
   truncate mają twardy limit. Poziomy scroll wrappera .table-responsive = ostateczność, nie domyślnie. */
table.szan-datatable {
  width: 100% !important;
  table-layout: auto;
}
/* DataTables przy autoWidty zapisuje szerokości do inline style="width:…" na <th>/<col> —
   nadpisują table-layout:auto i rozpychają kolumny (np. „Nr umowy" trzyma nadmiar). Zerujemy
   te wymuszenia, by przeglądarka dobrała szerokość każdej kolumny DO TREŚCI. Dotyczy KAŻDEJ
   tabeli szan-datatable w całym serwisie (globalny komponent _table.html). */
table.szan-datatable > thead > tr > th[style*="width"],
table.szan-datatable > tbody > tr > td[style*="width"],
table.szan-datatable > colgroup > col[style*="width"] {
  width: auto !important;
}
table.szan-datatable > thead > tr > th,
table.szan-datatable > tbody > tr > td {
  padding-inline: 0.6rem;
}
/* Kolumny z treścią stałą/krótką (Nr umowy, Status, Typ, Zasób) — dopasuj do zawartości,
   nie rozpychaj. „shrink-to-fit”: szerokość = najszersza komórka, reszta miejsca dla Najemcy. */
table.szan-datatable > tbody > tr > td.szan-col-shrink,
table.szan-datatable > thead > tr > th.szan-col-shrink {
  width: 1%;
  white-space: nowrap;
}
table.szan-datatable .text-truncate {
  max-width: 150px;
}
/* Kolumna avatara (nazwa osoby/encji — główna kolumna identyfikująca rekord) ma szerszy limit
   niż poboczne pola (email/firma). Avatar ~40px + 150px = za mało na pełne nazwiska, ucinało
   „Anastazja Browarcz.". Nazwa i podtytuł dostają osobny, szerszy limit. */
table.szan-datatable .avatar-wrapper .text-truncate,
table.szan-datatable .user-name .text-truncate {
  max-width: 240px;
}
/* Kolumny liczbowe (align right) — zwięzłe, nie rozpychają (np. dużo kolumn KPI w budynkach). */
table.szan-datatable td.text-end,
table.szan-datatable th.text-end {
  white-space: nowrap;
}
/* SLA / badge w komórkach — nie rozpychają tabeli (zawijają etykietę przy ciasnocie). */
table.szan-datatable td .badge {
  white-space: normal;
}

/* Wiersz-powiadomienie (Centrum alertów) — LEWY akcent priorytetu (wzorzec Vuexy notification row).
   NIE używać `border-3` na karcie: w BS5 to border-width:3px na CAŁYM obwodzie + border-{color} koloruje
   cały obwód → gruba ramka dookoła zamiast akcentu. Akcent tylko z lewej. */
.szan-alert-accent-critical,
.szan-alert-accent-warning,
.szan-alert-accent-info {
  border-inline-start-width: 0.1875rem;
  border-inline-start-style: solid;
}
.szan-alert-accent-critical { border-inline-start-color: var(--bs-danger); }
.szan-alert-accent-warning  { border-inline-start-color: var(--bs-warning); }
.szan-alert-accent-info     { border-inline-start-color: var(--bs-info); }

/* Klikalny wiersz tabeli (szan-row-clickable) — cursor + hover. */
.szan-row-clickable { cursor: pointer; }
.szan-row-clickable:hover,
.szan-row-clickable:hover > td,
.szan-row-clickable:hover > th {
  background-color: rgba(var(--bs-primary-rgb, 11, 74, 70), .08) !important;
}

/* Toolbar tabeli POD card-header (CASE 4/14, analytics itp.): Vuexy daje .dt-search
   margines 24px góra/dół — pod card-header (padding 24px) dubluje się w ~50px „lewitującą"
   przerwę. Zwarty rząd: wysokość trzyma py-2 rzędu, nie marginesy searcha.
   Listy TableConfig (tytuł w rzędzie DT, bez card-header) — nietknięte. */
.card-header + .card-datatable .dt-search,
.card-header + .card-datatable .dt-buttons {
  margin-top: 0.25rem;
  margin-bottom: 0.25rem;
}

/* Wyszukiwarka tabeli jako OSOBNY szeroki wiersz pod nagłówkiem (kanon Vuexy). Search jest
   częsta → eksponowana na całą szerokość rzędu, nie wciśnięta w róg. Ikona lupy wstrzykiwana
   w JS (szan-datatable.js) jako <i class="ti tabler-search"> — pewny font, bez zgadywania
   codepointu. Look = input-group-merge Vuexy. */
/* DT owija search w .dt-layout-full col-md (flex justify-between) → rozciągamy na całą szerokość. */
.szan-dt-search-row .dt-layout-full { width: 100%; flex: 1 1 auto; }
.szan-dt-search-row .dt-search {
  position: relative;
  width: 100%;
  margin: 0;
}
.szan-dt-search-row .dt-search label { display: none; }   /* pusta etykieta DT — chowamy */
.szan-dt-search-row .dt-search input[type="search"] {     /* DT daje .form-control-sm (nie .dt-input) */
  width: 100% !important;                                  /* nadpisz stałą szerokość DT/Vuexy */
  margin: 0;
  /* DT wymusza .form-control-sm (font 13px/wys.30px/radius 4px) — search siedzi w panelu Filtry
     obok .form-select (38px/15px/6px), więc dopasowujemy rozmiar, by estetyka była spójna. */
  font-size: 15px;                                          /* jak .form-select filtrów */
  line-height: 1.53;
  min-height: 38px;                                         /* równa wysokość z selectami */
  border-radius: 6px;                                       /* jak .form-select */
  padding-top: 0.422rem;
  padding-bottom: 0.422rem;
  padding-left: 2.5rem;                                     /* miejsce na lupę */
}
.szan-dt-search-row .szan-dt-search-icon {
  position: absolute;
  left: 0.9rem;
  top: 50%;
  transform: translateY(-50%);
  color: var(--bs-secondary-color, #a1acb8);
  pointer-events: none;
  z-index: 2;
}

/* Szerokości pól kontekstu/formularzy GET (ZAKAZ inline style="max-width:…") */
.szan-input-26rem { max-width: 26rem; }

/* Skip-link (WCAG 2.4.1) — widoczny tylko przy fokusie klawiaturą */
.szan-skip-link { z-index: 1100; }

/* Komórka truncate (kolumny Opis/Lokalizacja) — jedna linia z wielokropkiem, pełny tekst w title */
.szan-cell-truncate { max-width: 160px; }

/* ── Klasy zastępujące statyczne inline style (ZAKAZ style="" w panelu) ── */
.szan-pre-line { white-space: pre-line; }
.szan-pointer { cursor: pointer; }
.szan-cursor-disabled { cursor: not-allowed; }
.szan-input-10rem { width: 10rem; }
.szan-input-28rem { max-width: 28rem; }
.szan-minw-8rem { min-width: 8rem; }
.szan-minw-18rem { min-width: 18rem; }
.szan-z-toast { z-index: 1090; }
.szan-tracking-wide { letter-spacing: .4em; }
.szan-progress-6 { height: 6px; }
.szan-scroll-18 { max-height: 18rem; overflow-y: auto; }

/* Dark mode: brandowy primary (#0B4A46) jest CIEMNY — tekst etykiet bg-label-primary
   był nieczytelny (ciemny-na-ciemnym, LIVE 2026-07-03). W dark tekst = jaśniejszy teal. */
[data-bs-theme="dark"] .bg-label-primary,
[data-bs-theme="dark"] .btn-label-primary { color: #5ecfc5 !important; }
[data-bs-theme="dark"] .text-primary { color: #5ecfc5 !important; }

/* Szerokości pól (globalne — przeniesione z szan-finance.css 2026-07-03) */
.szan-input-5rem  { width: 5rem; }
.szan-input-6rem  { width: 6rem; }
.szan-input-7rem  { width: 7rem; }
.szan-input-8rem  { width: 8rem; }
.szan-input-9rem  { width: 9rem; }
.szan-input-12rem { width: 12rem; }
.szan-input-14rem { width: 14rem; }

/* ── Spotlight — globalna wyszukiwarka (przeniesione z legacy main.css .gs__*) ── */
.gs__dropdown { display: none; position: absolute; top: calc(100% + 6px); left: 0; right: 0;
  min-width: 340px; z-index: 1060; max-height: 420px; overflow-y: auto;
  background: var(--bs-body-bg); border: 1px solid var(--bs-border-color);
  border-radius: .5rem; box-shadow: 0 .5rem 1.5rem rgba(0,0,0,.15); }
.gs__dropdown--open { display: block; }
.gs__item { display: flex; align-items: center; gap: .75rem; padding: .625rem 1rem;
  border-bottom: 1px solid var(--bs-border-color); text-decoration: none; color: var(--bs-body-color); }
.gs__item:last-child { border-bottom: 0; }
.gs__item:hover, .gs__item--active { background: var(--bs-primary-bg-subtle); color: var(--bs-primary); }
.gs__item-icon { flex: 0 0 auto; display: inline-flex; align-items: center; justify-content: center;
  width: 30px; height: 30px; border-radius: .375rem; background: var(--bs-secondary-bg); color: var(--bs-secondary); }
.gs__item-icon--tenant { background: var(--bs-primary-bg-subtle); color: var(--bs-primary); }
.gs__item-icon--room { background: var(--bs-info-bg-subtle); color: var(--bs-info); }
.gs__item-icon--contract { background: var(--bs-success-bg-subtle); color: var(--bs-success); }
.gs__item-icon--page { background: var(--bs-warning-bg-subtle); color: var(--bs-warning); }
.gs__item-body { min-width: 0; flex: 1 1 auto; display: flex; flex-direction: column; }
.gs__item-label { font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.gs__item-sub { font-size: .75rem; color: var(--bs-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.gs__item-type { flex: 0 0 auto; font-size: .65rem; text-transform: uppercase; color: var(--bs-secondary); }
.gs__item--cat-hint .gs__item-label { font-family: var(--bs-font-monospace); }
.gs__empty { padding: 1rem; text-align: center; color: var(--bs-secondary); font-size: .875rem; }
.gs__footer { display: block; padding: .625rem 1rem; text-align: right; font-size: .8125rem;
  color: var(--bs-primary); text-decoration: none; font-weight: 600; }
.gs__footer:hover { text-decoration: underline; }
.gs__group-label { padding: .375rem 1rem; font-size: .65rem; text-transform: uppercase;
  color: var(--bs-secondary); background: var(--bs-tertiary-bg); pointer-events: none; }
.gs__filter-badge { padding: .5rem 1rem; font-size: .8125rem; background: var(--bs-tertiary-bg); }
.gs__filter-clear { margin-left: .5rem; color: var(--bs-danger); text-decoration: none; font-weight: 700; }
.gs__history-remove { flex: 0 0 auto; padding: 0 .5rem; color: var(--bs-secondary); font-weight: 700; }
.gs__history-remove:hover { color: var(--bs-danger); }
.gs__hover-card { position: fixed; width: 210px; z-index: 1080; padding: .75rem;
  background: var(--bs-body-bg); border: 1px solid var(--bs-border-color); border-radius: .5rem;
  box-shadow: 0 .5rem 1.5rem rgba(0,0,0,.18); pointer-events: none; font-size: .8125rem; }
.gs__hc-name { font-weight: 600; margin-bottom: .25rem; }
.gs__hc-nip, .gs__hc-meta { color: var(--bs-secondary); margin-top: .25rem; }
@media (prefers-reduced-motion: reduce) { .gs__item { transition: none; } }
