/*
 * BenOS UI — sdílené komponenty `ui-*`
 * ════════════════════════════════════════════════════════════════════════
 * Pojmenované podle ROLE, ne podle modulu (`ui-button--danger`, ne
 * `sd-btn-red`). HTML a přístupnost drží Jinja makra v
 * `templates/ui/components.html`; chování (taby, modal) `static/js/ui/ui.js`.
 * Živý katalog: /ui-kit.
 *
 * Pravidla:
 *   • barvy jen přes sémantické tokeny, rozměry přes `--ui-*` tokeny,
 *   • modifikátor = `ui-x--varianta`, část = `ui-x__cast` (BEM),
 *   • stav přes ARIA atributy, kde existují (`aria-invalid`, `aria-selected`,
 *     `aria-busy`), ne přes vlastní třídy — styl pak nejde rozejít se
 *     sémantikou,
 *   • žádné `!important`.
 *
 * Lišta filtrů uvnitř stránky zůstává `.page-toolbar` (shell.css) — je to
 * hotová sdílená komponenta, `ui-button` do ní patří taky.
 */

/* Atribut `hidden` musí vyhrát nad `display` komponenty (.ui-button je
 * inline-flex, hlavička modalu flex…) — jinak `el.hidden = true` nic neudělá.
 * Jen pro ui-* prvky; legacy CSS se tím nemění. */
[class^="ui-"][hidden],
[class*=" ui-"][hidden] { display: none; }

/* ─── Tlačítko ─────────────────────────────────────────────────────────── */
.ui-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2);
  min-height: var(--ui-control-height);
  padding: 0 var(--space-4);
  border: 1px solid var(--ui-control-border);
  border-radius: var(--ui-control-radius);
  background: var(--ui-control-bg);
  color: var(--color-text-body);
  font: inherit;
  font-size: var(--ui-control-font);
  font-weight: var(--font-weight-medium);
  line-height: 1;
  white-space: nowrap;
  text-decoration: none;
  cursor: pointer;
  transition: background var(--duration-fast) ease, border-color var(--duration-fast) ease,
              color var(--duration-fast) ease;
}
.ui-button:hover:not(:disabled):not([aria-disabled="true"]) {
  border-color: var(--color-primary);
  color: var(--color-primary);
}
.ui-button:disabled,
.ui-button[aria-disabled="true"] { opacity: .5; cursor: not-allowed; }

.ui-button--primary {
  background: var(--color-primary);
  border-color: var(--color-primary);
  color: var(--color-on-primary);
}
.ui-button--primary:hover:not(:disabled):not([aria-disabled="true"]) {
  background: var(--color-primary-hover);
  border-color: var(--color-primary-hover);
  color: var(--color-on-primary);
}
.ui-button--danger {
  background: var(--color-error-600);
  border-color: var(--color-error-600);
  color: var(--color-text-inverse);
}
.ui-button--danger:hover:not(:disabled):not([aria-disabled="true"]) {
  background: var(--color-error-700);
  border-color: var(--color-error-700);
  color: var(--color-text-inverse);
}
/* Nevratná akce na řádku / v liště (Smazat, Zamítnout): červená, ale ne
 * plná — plná --danger je pro potvrzovací tlačítko v dialogu. */
.ui-button--danger-subtle { color: var(--color-error-600); border-color: rgba(239, 68, 68, 0.3); }
.ui-button--danger-subtle:hover:not(:disabled):not([aria-disabled="true"]) {
  background: var(--color-error-50);
  border-color: var(--color-error-500);
  color: var(--color-error-700);
}
.ui-button--success-subtle { color: var(--color-success-600); border-color: var(--color-success-500); background: var(--color-success-50); }
.ui-button--success-subtle:hover:not(:disabled):not([aria-disabled="true"]) {
  border-color: var(--color-success-600);
  color: var(--color-success-700);
}
.ui-button--success {
  background: var(--color-success-600);
  border-color: var(--color-success-600);
  color: var(--color-text-inverse);
}
.ui-button--success:hover:not(:disabled):not([aria-disabled="true"]) {
  background: var(--color-success-700);
  border-color: var(--color-success-700);
  color: var(--color-text-inverse);
}
.ui-button--ghost { background: transparent; border-color: transparent; }
.ui-button--ghost:hover:not(:disabled):not([aria-disabled="true"]) {
  background: var(--color-bg-subtle);
  border-color: transparent;
  color: var(--color-text);
}

.ui-button--sm { min-height: var(--ui-control-height-sm); padding: 0 var(--space-3); font-size: var(--font-size-xs); }
.ui-button--lg { min-height: var(--ui-control-height-lg); padding: 0 var(--space-5); font-size: var(--font-size-base); }
.ui-button--block { display: flex; width: 100%; }
.ui-button--icon { padding: 0; width: var(--ui-control-height); }
.ui-button--icon.ui-button--sm { width: var(--ui-control-height-sm); }

/* Načítání: text zůstane pro čtečky, vizuálně spinner. */
.ui-button[aria-busy="true"] { position: relative; color: transparent; pointer-events: none; }
.ui-button[aria-busy="true"]::after {
  content: '';
  position: absolute;
  width: 14px; height: 14px;
  border: 2px solid currentColor;
  border-color: var(--color-text-muted) transparent var(--color-text-muted) transparent;
  border-radius: 50%;
  animation: ui-spin .8s linear infinite;
}
.ui-button--primary[aria-busy="true"]::after,
.ui-button--danger[aria-busy="true"]::after {
  border-color: var(--color-on-primary) transparent var(--color-on-primary) transparent;
}
@keyframes ui-spin { to { transform: rotate(360deg); } }

/* ─── Formulářové pole ─────────────────────────────────────────────────── */
.ui-field { display: flex; flex-direction: column; gap: 6px; margin-bottom: var(--space-4); }
.ui-field:last-child { margin-bottom: 0; }

.ui-label {
  font-size: var(--ui-label-font);
  font-weight: var(--font-weight-medium);
  color: var(--color-text-muted);
  text-transform: var(--ui-label-transform);
  letter-spacing: var(--ui-label-tracking);
}
.ui-label__required { color: var(--color-error-600); margin-left: 2px; }

.ui-input,
.ui-select,
.ui-textarea {
  width: 100%;
  min-height: var(--ui-control-height-lg);
  padding: 0 14px;
  background: var(--ui-control-bg);
  border: 1px solid var(--ui-control-border);
  border-radius: var(--ui-control-radius);
  color: var(--color-text);
  font: inherit;
  font-size: var(--font-size-base);
  font-feature-settings: var(--font-feature-settings);
  outline: none;
  transition: border-color var(--duration-fast) ease, box-shadow var(--duration-fast) ease;
}
.ui-textarea { min-height: 96px; padding: 10px 14px; resize: vertical; line-height: var(--line-height-normal); }
.ui-select { cursor: pointer; }
.ui-input::placeholder,
.ui-textarea::placeholder { color: var(--color-text-disabled); }
.ui-input:hover, .ui-select:hover, .ui-textarea:hover { border-color: var(--color-border-hover); }
.ui-input:focus, .ui-select:focus, .ui-textarea:focus {
  border-color: var(--color-primary);
  box-shadow: 0 0 0 2px var(--color-primary-ring);
}
.ui-input:disabled, .ui-select:disabled, .ui-textarea:disabled {
  background: var(--color-bg-subtle);
  color: var(--color-text-disabled);
  cursor: not-allowed;
}
.ui-input[aria-invalid="true"],
.ui-select[aria-invalid="true"],
.ui-textarea[aria-invalid="true"] { border-color: var(--color-error-500); }

.ui-help  { font-size: var(--font-size-xs); color: var(--color-text-muted); line-height: 1.4; }
.ui-help--success { color: var(--color-success-600); }
.ui-error { font-size: var(--font-size-xs); color: var(--color-error-600); line-height: 1.4; }

.ui-check {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  font-size: var(--font-size-sm);
  color: var(--color-text-body);
  cursor: pointer;
}
.ui-check input { width: 16px; height: 16px; margin: 0; accent-color: var(--color-primary); }

/* Telefon: pole i tlačítka aspoň 40 px a písmo 16 px (iOS jinak přizoomuje). */
@media (max-width: 640px) {
  .ui-button { min-height: var(--touch-target-min); }
  .ui-button--icon { width: var(--touch-target-min); }
  .ui-input, .ui-select, .ui-textarea { font-size: 16px; }
}

/* ─── Karta ────────────────────────────────────────────────────────────── */
.ui-card {
  background: var(--color-surface);
  border: 1px solid var(--ui-card-border);
  border-radius: var(--ui-card-radius);
  box-shadow: var(--ui-card-shadow);
  padding: var(--ui-card-padding);
}
:not(.ui-stack) > .ui-card + .ui-card { margin-top: var(--space-4); }
.ui-card__header {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  margin-bottom: var(--space-4);
}
.ui-card__title {
  font-size: var(--font-size-sm);
  font-weight: var(--font-weight-semibold);
  color: var(--color-text-secondary);
}
.ui-card__actions { margin-left: auto; display: flex; gap: var(--space-2); }
.ui-card__footer {
  display: flex;
  justify-content: flex-end;
  gap: var(--space-2);
  margin-top: var(--space-5);
}

/* ─── KPI ──────────────────────────────────────────────────────────────
 * Jedna definice pro novou komponentu `ui-kpi` i legacy `.kpi-card`
 * (21 šablon + helper yoyCard v base.html). Hodnoty = dnešní vzhled; staré
 * třídy se smažou, až je nikdo nepoužije. */
.kpi-grid,
.ui-kpi-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: var(--space-3);
  margin-bottom: var(--space-5);
}
@media (max-width: 900px) {
  .kpi-grid,
  .ui-kpi-grid { grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); }
}
.kpi-card,
.ui-kpi {
  background: var(--color-surface);
  border: 1px solid var(--ui-card-border);
  border-radius: var(--ui-card-radius);
  padding: 18px var(--space-5);
  box-shadow: var(--ui-card-shadow);
  transition: all .2s ease;
}
.kpi-card:hover,
.ui-kpi:hover {
  box-shadow: var(--shadow-card-hover);
  border-color: var(--color-primary-ring);
}
.kpi-label,
.ui-kpi__label {
  font-size: var(--ui-label-font);
  color: var(--color-text-muted);
  text-transform: var(--ui-label-transform);
  letter-spacing: var(--ui-label-tracking);
  font-weight: var(--font-weight-medium);
  margin-bottom: 10px;
}
.kpi-value,
.ui-kpi__value {
  font-size: var(--font-size-3xl);
  font-weight: var(--font-weight-semibold);
  letter-spacing: -0.5px;
  color: var(--color-text);
  font-feature-settings: "cv01", "tnum";
}
.kpi-sub,
.ui-kpi__sub {
  font-size: var(--font-size-xs);
  color: var(--color-text-muted);
  margin-top: 6px;
  font-weight: var(--font-weight-regular);
}
/* Změna proti srovnání (▲ 8 % vs. loni). */
.kpi-badge,
.ui-kpi__delta {
  display: inline-block;
  padding: 1px 6px;
  border-radius: var(--radius-sm);
  font-size: var(--font-size-2xs);
  font-weight: var(--font-weight-regular);
  margin-top: var(--space-2);
}
.badge-up,
.ui-kpi__delta--up {
  background: rgba(21, 190, 83, 0.12);
  color: var(--color-success-600);
  border: 1px solid rgba(21, 190, 83, 0.25);
}
.badge-down,
.ui-kpi__delta--down {
  background: rgba(239, 68, 68, 0.08);
  color: var(--color-error-600);
  border: 1px solid rgba(239, 68, 68, 0.2);
}

/* Varování (žlutá) — legacy .badge-warn z Přehledu. */
.badge-warn,
.ui-kpi__delta--warn {
  background: rgba(245, 158, 11, 0.12);
  color: var(--color-warning-600);
  border: 1px solid rgba(245, 158, 11, 0.3);
}
/* Stav karty — barevný pruh vlevo (tempo rezervací, plnění cíle). */
.ui-kpi--success { border-left: 3px solid var(--color-success-500); }
.ui-kpi--warning { border-left: 3px solid var(--color-warning-500); }
.ui-kpi--danger  { border-left: 3px solid var(--color-error-500); }

/* Nadpis sekce mezi bloky KPI / grafů (legacy .kpi-section-title v shell.css). */
.ui-section-title {
  font-size: var(--ui-label-font);
  text-transform: var(--ui-label-transform);
  letter-spacing: 0.05em;
  color: var(--color-text-muted);
  font-weight: var(--font-weight-medium);
  margin: 22px 0 10px;
}
.ui-section-title:first-child { margin-top: 0; }
.ui-section-title__note { text-transform: none; letter-spacing: 0; font-weight: var(--font-weight-regular); }

/* ─── Graf ─────────────────────────────────────────────────────────────
 * Obal plátna Chart.js s pevnou výškou (graf s maintainAspectRatio:false
 * ji vyplní). Výška je komponentový token, ne !important ve stránce. */
.ui-chart { position: relative; height: var(--ui-chart-height, 280px); }
.ui-chart--tall { --ui-chart-height: 420px; }
@media (max-width: 900px) {
  .ui-chart { --ui-chart-height: 240px; }
  .ui-chart--tall { --ui-chart-height: 320px; }
}

/* ─── Odznak ───────────────────────────────────────────────────────────── */
.ui-badge {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 1px 7px;
  border-radius: var(--radius-full);
  font-size: var(--font-size-2xs);
  font-weight: var(--font-weight-semibold);
  line-height: 1.6;
  white-space: nowrap;
  background: var(--color-bg-subtle);
  color: var(--color-text-muted);
  border: 1px solid var(--color-border);
  vertical-align: middle;
}
.ui-badge--primary { background: var(--color-primary-tint); color: var(--color-primary); border-color: var(--color-primary-ring); }
.ui-badge--success { background: var(--color-success-50); color: var(--color-success-700); border-color: rgba(21, 190, 83, 0.25); }
.ui-badge--warning { background: var(--color-warning-50); color: var(--color-warning-700); border-color: rgba(245, 158, 11, 0.3); }
.ui-badge--danger  { background: var(--color-error-50);   color: var(--color-error-700);   border-color: rgba(239, 68, 68, 0.25); }
.ui-badge--info    { background: var(--color-info-50);    color: var(--color-info-700);    border-color: rgba(6, 182, 212, 0.25); }

/* ─── Hláška ───────────────────────────────────────────────────────────── */
.ui-alert {
  display: flex;
  gap: var(--space-3);
  padding: 10px 14px;
  border: 1px solid var(--color-border);
  border-radius: var(--ui-control-radius);
  background: var(--color-bg-subtle);
  color: var(--color-text-body);
  font-size: var(--font-size-sm);
  line-height: var(--line-height-normal);
  margin-bottom: var(--space-4);
}
.ui-alert__body { flex: 1; min-width: 0; overflow-wrap: anywhere; }
.ui-alert__title { font-weight: var(--font-weight-semibold); margin-bottom: 2px; }
.ui-alert a { color: inherit; }
.ui-alert--success { background: rgba(21, 190, 83, 0.06); border-color: rgba(21, 190, 83, 0.2); color: var(--color-success-600); }
.ui-alert--warning { background: var(--color-warning-50); border-color: rgba(245, 158, 11, 0.35); color: var(--color-warning-700); }
.ui-alert--danger  { background: rgba(239, 68, 68, 0.06); border-color: rgba(239, 68, 68, 0.2); color: var(--color-error-600); }
.ui-alert--info    { background: var(--color-primary-tint); border-color: var(--color-primary-ring); color: var(--color-text-secondary); }

/* ─── Taby ─────────────────────────────────────────────────────────────── */
.ui-tabs {
  display: flex;
  gap: var(--space-1);
  border-bottom: 1px solid var(--color-border);
  margin-bottom: var(--space-4);
  overflow-x: auto;
  scrollbar-width: none;
}
.ui-tab {
  flex-shrink: 0;
  padding: 10px 14px;
  border: none;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  background: none;
  color: var(--color-text-muted);
  font: inherit;
  font-size: var(--font-size-sm);
  font-weight: var(--font-weight-medium);
  cursor: pointer;
  white-space: nowrap;
}
.ui-tab:hover { color: var(--color-text); }
.ui-tab[aria-selected="true"],
.ui-tab[aria-current="page"] { color: var(--color-primary); border-bottom-color: var(--color-primary); }
/* Záložky jako navigace mezi stránkami (<nav class="ui-tabs"><a class="ui-tab">). */
a.ui-tab { text-decoration: none; display: inline-block; }

/* ─── Stavy: prázdno / načítám / chyba ─────────────────────────────────── */
.ui-state {
  padding: var(--space-10) var(--space-6);
  text-align: center;
  color: var(--color-text-muted);
  font-size: var(--font-size-sm);
}
.ui-state__title { font-size: var(--font-size-base); font-weight: var(--font-weight-semibold); color: var(--color-text-secondary); margin-bottom: var(--space-1); }
.ui-state__actions { margin-top: var(--space-4); display: flex; justify-content: center; gap: var(--space-2); }
.ui-state--error .ui-state__title { color: var(--color-error-600); }
.ui-state--loading::before {
  content: '';
  display: block;
  width: 20px; height: 20px;
  margin: 0 auto var(--space-3);
  border: 2px solid var(--color-border);
  border-top-color: var(--color-primary);
  border-radius: 50%;
  animation: ui-spin .8s linear infinite;
}

/* Kompaktní stav pro malý panel nebo kartu (bez velkého odsazení). */
.ui-state--compact { padding: var(--space-4) var(--space-3); }
.ui-state--compact.ui-state--loading::before { width: 16px; height: 16px; margin-bottom: var(--space-2); }

/* ─── Načítání ─────────────────────────────────────────────────────────
 * .ui-loading   „Načítám…" kdekoli (buňka, řádek, odstavec, štítek):
 *               tlumený text s malým točítkem před ním. Rozvržení prvku se
 *               nemění — třída se jen přidá ke stávajícím.
 * .ui-spinner   samostatné točítko (vedle textu, v tlačítku)
 * .ui-skeleton  zástupný tvar obsahu, než dorazí data (KPI, řádky, text);
 *               varianty --text, --title, --kpi, --block; .ui-skeleton-rows
 *               = několik řádků pod sebou. Při omezeném pohybu bez animace.
 * .ui-progress  tenký pruh nahoře, když stránka čeká na data (stav.js). */
.ui-loading { color: var(--color-text-muted); }
.ui-loading::before,
.ui-spinner {
  content: '';
  display: inline-block;
  width: 0.9em; height: 0.9em;
  margin-right: 0.45em;
  vertical-align: -0.12em;
  border: 2px solid var(--color-border);
  border-top-color: var(--color-primary);
  border-radius: 50%;
  animation: ui-spin .8s linear infinite;
}
.ui-spinner { margin-right: 0; }
.ui-state--loading.ui-loading::before { display: none; }

.ui-skeleton {
  display: block;
  border-radius: var(--radius-sm);
  /* Podklad = barva rámečku (viditelná na stránce i kartě v obou režimech),
     přejíždějící pruh je o kus blíž ploše. */
  background: linear-gradient(90deg, var(--color-border) 25%,
    color-mix(in srgb, var(--color-border) 40%, var(--color-surface)) 37%, var(--color-border) 63%);
  background-size: 400% 100%;
  animation: ui-skeleton 1.4s ease infinite;
}
.ui-skeleton--text  { height: 0.85em; margin: 0.35em 0; }
.ui-skeleton--title { height: 1.3em; width: 45%; margin-bottom: var(--space-2); }
.ui-skeleton--kpi   { height: 96px; border-radius: var(--ui-card-radius); }
.ui-skeleton--block { height: 160px; border-radius: var(--ui-card-radius); }
.ui-skeleton-rows { display: grid; gap: var(--space-2); padding: var(--space-3) 0; }
.ui-skeleton-rows > .ui-skeleton { height: 14px; }
.ui-skeleton-rows > .ui-skeleton:nth-child(3n+2) { width: 82%; }
.ui-skeleton-rows > .ui-skeleton:nth-child(3n)   { width: 64%; }
@keyframes ui-skeleton { 0% { background-position: 100% 50%; } 100% { background-position: 0 50%; } }

.ui-progress {
  position: fixed; top: 0; left: 0; right: 0; height: 2px;
  z-index: var(--z-toast);
  pointer-events: none;
  opacity: 0;
  transition: opacity var(--duration-base) var(--easing-standard);
}
.ui-progress::before {
  content: '';
  position: absolute; inset: 0 auto 0 0;
  width: var(--ui-progress, 0%);
  background: var(--color-primary);
  transition: width var(--duration-base) var(--easing-standard);
}
.ui-progress[data-active] { opacity: 1; }

/* ─── Modal (nativní <dialog>) ─────────────────────────────────────────── */
.ui-modal {
  width: 520px;
  max-width: calc(100vw - 32px);
  max-height: 88vh;
  margin: auto;
  padding: 0;
  border: none;
  border-radius: var(--ui-modal-radius);
  background: var(--color-surface);
  color: var(--color-text);
  box-shadow: var(--shadow-elevated);
}
.ui-modal::backdrop { background: var(--color-overlay); }
/* Dlouhé okno: hlavička a patička zůstávají, posouvá se jen tělo (i když
   tělo a patičku obaluje <form>). */
.ui-modal[open] { display: flex; flex-direction: column; }
.ui-modal > form { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
.ui-modal__header, .ui-modal__footer { flex-shrink: 0; }
.ui-modal__body { flex: 1 1 auto; min-height: 0; }
.ui-modal__header {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-5) var(--space-6) 0;
}
.ui-modal__title { font-size: var(--font-size-lg); font-weight: var(--font-weight-semibold); }
.ui-modal__close { margin-left: auto; }
.ui-modal__body {
  padding: var(--space-4) var(--space-6);
  font-size: var(--font-size-sm);
  color: var(--color-text-body);
  line-height: 1.55;
  overflow-y: auto;
}
.ui-modal__footer {
  display: flex;
  justify-content: flex-end;
  gap: var(--space-2);
  padding: 0 var(--space-6) var(--space-5);
}
.ui-modal--wide { width: 760px; }

/* Boční panel (detail záznamu vedle seznamu) — nativní <dialog>, otevírá se
 * BenUI.openModal(id). Esc, fokus a návrat fokusu jako u modalu. */
.ui-drawer {
  position: fixed;
  inset: 0 0 0 auto;
  width: 700px;
  max-width: 90vw;
  height: 100vh;
  max-height: none;
  margin: 0;
  padding: var(--space-6);
  border: none;
  border-left: 1px solid var(--color-border);
  background: var(--color-surface);
  color: var(--color-text);
  box-shadow: -4px 0 24px rgba(0, 0, 0, .1);
  overflow-y: auto;
}
.ui-drawer[open] { animation: ui-drawer-in var(--duration-base) var(--easing-standard); }
.ui-drawer::backdrop { background: rgba(0, 0, 0, .25); }
.ui-drawer__close { float: right; }
@keyframes ui-drawer-in { from { transform: translateX(40px); opacity: 0; } }
@media (max-width: 640px) {
  .ui-drawer { width: 100vw; max-width: 100vw; padding: var(--space-4); }
}
/* Pracovní plocha přes celou obrazovku (review řádků, editor). Tělo scrolluje,
 * hlavička a patička zůstávají. */
.ui-modal--full {
  width: calc(100vw - 8%);
  height: calc(100vh - 8%);
  max-width: none;
  max-height: none;
}
.ui-modal--full[open] { display: flex; flex-direction: column; }
.ui-modal--full .ui-modal__header { padding-bottom: var(--space-4); border-bottom: 1px solid var(--color-border); }
.ui-modal--full .ui-modal__body { flex: 1; min-height: 0; }
.ui-modal--full .ui-modal__footer { padding-top: var(--space-3); border-top: 1px solid var(--color-border); background: var(--color-bg-subtle); }
@media (max-width: 640px) {
  .ui-modal--full { width: 100vw; height: 100dvh; max-width: 100vw; border-radius: 0; }
  .ui-modal__body { padding: var(--space-4); }
  .ui-modal__header, .ui-modal__footer { padding-left: var(--space-4); padding-right: var(--space-4); }
  .ui-modal__footer { flex-wrap: wrap; }
}

/* ─── Rozložení ────────────────────────────────────────────────────────── */
.ui-stack   { display: flex; flex-direction: column; gap: var(--space-4); }
.ui-cluster { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); }
.ui-grid    { display: grid; gap: var(--space-4); grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); }
.ui-num     { font-variant-numeric: tabular-nums; white-space: nowrap; }
.ui-muted   { color: var(--color-text-muted); }
/* Vysvětlující odstavec pod nadpisem karty / grafu. */
.ui-note    { font-size: var(--font-size-xs); color: var(--color-text-muted); line-height: 1.5; margin: 4px 0 12px; }
.ui-narrow  { max-width: 480px; }

/* ─── Ikona ────────────────────────────────────────────────────────────
 * Sprite static/ui/icons.svg; tah se dědí do <use>, barva = currentColor.
 * Velikost = 1em (roste s písmem okolí), `--lg` pro samostatné ikony. */
.ui-icon {
  width: 1.15em;
  height: 1.15em;
  flex-shrink: 0;
  vertical-align: -0.2em;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-linejoin: round;
}
.ui-icon--lg { width: 20px; height: 20px; }
/* Barva ikony podle významu (náhrada barevných emoji ⚠ ✅ ❌ 🟢 🔴…).
 * Ikona jinak bere barvu textu kolem sebe. */
.ui-icon--success { color: var(--color-success-600); }
.ui-icon--warning { color: var(--color-warning-500); }
.ui-icon--danger  { color: var(--color-error-600); }
.ui-icon--info    { color: var(--color-info-600); }
.ui-icon--muted   { color: var(--color-text-muted); }
.ui-icon--primary { color: var(--color-primary-600); }

/* ─── Toast (BenUI.toast) ───────────────────────────────────────────────
 * Krátké potvrzení akce, které nic neblokuje. Chyba, na kterou musí člověk
 * reagovat, patří do benAlert nebo ui-alert, ne do mizícího toastu. */
.ui-toasts {
  position: fixed;
  right: var(--space-4);
  bottom: var(--space-4);
  z-index: var(--z-toast);
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: var(--space-2);
  pointer-events: none;
}
/* Popover reset (UA styl dává popoveru rámeček, padding a střed obrazovky). */
.ui-toasts[popover] {
  inset: auto var(--space-4) var(--space-4) auto;
  margin: 0;
  padding: 0;
  border: 0;
  background: transparent;
  overflow: visible;
}
@media (max-width: 640px) {
  .ui-toasts[popover] { inset: auto var(--space-3) var(--space-3) var(--space-3); }
}
.ui-toast {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  max-width: min(420px, calc(100vw - 32px));
  padding: 10px 14px;
  border-radius: var(--radius-md);
  background: var(--color-text);
  color: var(--color-text-inverse);
  box-shadow: var(--shadow-elevated);
  font-size: var(--font-size-sm);
  line-height: 1.4;
  pointer-events: auto;
  animation: ui-toast-in var(--duration-base) var(--easing-standard);
}
.ui-toast--success .ui-icon { color: var(--color-success-500); }
.ui-toast--warning .ui-icon { color: var(--color-warning-500); }
.ui-toast--danger  .ui-icon { color: var(--color-error-500); }
.ui-toast__close {
  margin-left: var(--space-2);
  background: none;
  border: none;
  color: inherit;
  opacity: .7;
  cursor: pointer;
  padding: 2px;
  line-height: 0;
}
.ui-toast__close:hover { opacity: 1; }
@keyframes ui-toast-in { from { opacity: 0; transform: translateY(8px); } }
@media (max-width: 640px) {
  .ui-toasts { left: var(--space-3); right: var(--space-3); bottom: var(--space-3); align-items: stretch; }
  .ui-toast { max-width: none; }
}

/* ─── Sdílené dialogy benAlert / benConfirm / benPrompt / benChoose ─────
 * static/js/ui/dialogs.js — nativní <dialog class="ui-modal ui-dialog">. */
.ui-dialog { width: 460px; }
.ui-dialog .ui-modal__header:empty { display: none; }
.ui-dialog__msg {
  white-space: pre-wrap;
  word-break: break-word;
}
.ui-dialog__choices { display: flex; flex-direction: column; gap: 6px; margin-top: var(--space-3); }
.ui-dialog__choice {
  text-align: left;
  padding: 9px 12px;
  border-radius: var(--radius-md);
  border: 1px solid var(--color-border);
  background: var(--color-bg-subtle);
  font: inherit;
  font-size: var(--font-size-sm);
  color: var(--color-text);
  cursor: pointer;
}
.ui-dialog__choice:hover,
.ui-dialog__choice:focus-visible { border-color: var(--color-primary); background: var(--color-surface); outline: none; }
.ui-dialog .ui-input { margin-top: var(--space-3); }
.ui-dialog .ui-modal__body { padding-top: var(--space-5); }
.ui-dialog .ui-modal__header + .ui-modal__body { padding-top: var(--space-3); }

/* ─── Tabulka: explicitní mobilní strategie ─────────────────────────────
 * Každá nová tabulka říká, co s ní na telefonu (≤ 640 px):
 *   data-ui-mobile="scroll"    přirozená šířka + vodorovný scroll (výchozí)
 *   data-ui-mobile="cards"     řádky jako karty „popisek: hodnota"
 *                              (popisky doplní ui.js z hlavičky)
 *   data-ui-mobile="priority"  sloupce s data-priority="low" se schovají
 * Obal `.ui-table-wrap` drží scroll uvnitř, ne na celé stránce. */
.ui-table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
@media (max-width: 640px) {
  .ui-table-wrap > table[data-ui-mobile="scroll"],
  .ui-table-wrap > table:not([data-ui-mobile]) { width: max-content; min-width: 100%; }
  table[data-ui-mobile="priority"] [data-priority="low"] { display: none; }
}

/* ─── Tabulka: komponenta ─────────────────────────────────────────────────
 * <div class="ui-table-wrap ui-table-wrap--card">
 *   <table class="ui-table" data-ui-mobile="scroll|cards|priority">
 * Vzhled bere z tokenů --ui-table-* (stejné jako holé <table> v shell.css).
 * Modifikátory:
 *   ui-table--compact     hustší řádky pro široké přehledy (mzdy, uzávěrky)
 *   ui-table--sticky      hlavička drží nahoře (obal dostane max-height)
 *   ui-table--sticky-col  první sloupec drží vlevo při vodorovném scrollu
 *   ui-table-wrap--card   rámeček a zaoblení jako karta
 * Buňky: .ui-num (číslo vpravo, stejně široké číslice), .ui-table__actions
 * (tlačítka vpravo, nezalamovat), .ui-table__empty (prázdný stav přes řádek). */
.ui-table { width: 100%; border-collapse: collapse; }
.ui-table th, .ui-table td { text-align: left; vertical-align: middle; }
.ui-table th.ui-num, .ui-table td.ui-num { text-align: right; }
.ui-table thead th { white-space: nowrap; }
.ui-table--compact { --ui-table-pad-y: 6px; --ui-table-pad-x: var(--space-2); --ui-table-font: var(--font-size-xs); }
.ui-table__actions { text-align: right; white-space: nowrap; width: 1%; }
.ui-table__actions .ui-button + .ui-button { margin-left: var(--space-1); }
.ui-table__empty { text-align: center !important; color: var(--color-text-muted); padding: var(--space-6) var(--space-3) !important; }
.ui-table__empty--error { color: var(--color-error-600); }
.ui-table-wrap--card {
  border: 1px solid var(--color-border);
  border-radius: var(--radius-lg);
  background: var(--color-surface);
}
.ui-table-wrap--card > .ui-table tr:last-child td { border-bottom: 0; }
.ui-table-wrap:has(> .ui-table--sticky) { max-height: 75vh; overflow-y: auto; }
.ui-table--sticky thead th { position: sticky; top: 0; z-index: 2; background: var(--color-surface); }
.ui-table--sticky-col th:first-child,
.ui-table--sticky-col td:first-child { position: sticky; left: 0; z-index: 1; background: var(--color-surface); }
.ui-table--sticky-col thead th:first-child { z-index: 3; }
.ui-table--sticky-col tr:hover td:first-child { background: var(--ui-table-hover); }
