/*
 * Eurodach IS — Dashboard/reporty (krok 7 BUILD_PLAN).
 * Stejná paleta jako admin branding (viz static/admin/css/eurodach_theme.css,
 * pravidlo 60-30-10) — barvy vědomě zopakované tady, ne @import, ať appka
 * nezávisí na admin staticfiles.
 */

/* Carlito (metricky kompatibilní náhrada Calibri) VYZKOUŠENO a VRÁCENO
ZPĚT (Michal, 2026-09-07: "ten font není dobrý... dělá různě velká
čísla") - v prohlížeči (na rozdíl od WeasyPrint/PDF, kde Carlito
zůstává) dělal nekonzistentní vzhled čísel, nejspíš problém s fallbackem
na tučný řez. `table.list`/`table.report`/`.form-row` teď zase dědí
běžný systémový font ze `body`. Fonty v `dashboard/static/dashboard/fonts/carlito/`
zůstávají na disku (nezávadné, nic je teď needeklaruje) pro případ
budoucího opakovaného pokusu. */

:root {
    /* Redesign 2026-09-15 (Michal poslal mockupy login-design.html/
    uvod-redesign.html/priprava-vyroba-redesign.html) - paleta sjednocená
    s login stránkou (teplý amber + tmavě šedá místo dřívější syté
    oranžové + skoro černé). HODNOTY proměnných se mění, NÁZVY ne - grid/
    status-pill/badge apod. napříč appkou je používají přes `var(--x)`,
    žádná šablona/JS na konkrétní hex nespoléhá. */
    --primary: #e8963c;
    --primary-dark: #c97a2e;
    --secondary: #26292f;
    /* Teplejší krémové pozadí + odpovídající okraj (mockup --bg/--border)
    místo dřívější studené šedé - karty (--surface-bg zůstává čistě bílá)
    díky tomu líp "vystoupí" bez nutnosti sytější stín. */
    --body-bg: #f6f4ef;
    --surface-bg: #ffffff;
    /* "Ink" paleta z mockupu - jemně namodralá tmavá/šedá místo čistě
    neutrální #212529/#6C757D, sjednoceno s login stránkou (.login-page__brand
    barva). --ink-faint je NOVÁ (dřív appka nejjemnější úroveň textu
    neměla jako token, řešilo se to ad-hoc inline stylem). */
    --body-fg: #16233a;
    --muted-fg: #67748c;
    --ink-faint: #98a2b5;
    --border-color: #e7e3d9;
    --success: #198754;
    --success-bg: #BDECB6;
    --warning: #FFC107;
    --error: #DC3545;
    --error-bg: #F8D7DA;

    /* Redesign 2026-09-15 - 210px (dřívější zúžení kvůli "Výzva k úhradě
    přijatá" na jeden řádek, viz komentář u `.sidebar__sublink`) přestalo
    stačit s novým bočním paddingem sidebaru + podtitulkem "VAZNÍKY · CNC
    · DŘEVOSTAVBY" (Michal - "v novém designu se vlezou ty tři slova
    vedle sebe... rozšiř o pár mm"). Širší hodnota jen POMÁHÁ i té
    dřívější podmínce (víc místa, ne míň), žádný konflikt. */
    --sidebar-width: 232px;
    --topbar-height: 56px;
    --sidebar-active-bg: #fbead6;
    --radius-sm: 6px;
    --radius-md: 10px;
    --radius-lg: 14px;
    /* Formulářová pole (input/select/textarea) - design-instrukce-komentare.md,
    Michal: pole dnes všude dědí `--radius-sm` (6-7px), což vedle
    zaoblenějších karet/tlačítek/sidebar chipů z redesignu 2026-09-15
    působí "hranatě". Tři úrovně místo jedné - textarea o něco méně
    kulatá než jednořádkové pole (na víc řádků textu velký poloměr
    opticky "uřezává" roh vedle prvního/posledního řádku textu). */
    --radius-field: 16px;
    --radius-field-textarea: 12px;
    /* Dvouvrstvý stín (jemná blízká vrstva + širší měkká vrstva) - běžný
    trik pro "vystupující kartu" (viz komentář u --body-bg výš), jedna
    ostrá vrstva vždycky vypadá plošeji. */
    --shadow-sm: 0 1px 3px rgba(33,37,41,.09), 0 4px 10px rgba(33,37,41,.05);
    --shadow-md: 0 2px 6px rgba(33,37,41,.10), 0 10px 24px rgba(33,37,41,.10);
    /* Vrstvený stín z mockupu (jemná ostrá linka + širší rozostřená
    vrstva) - o něco výraznější než --shadow-md, pro karty na krémovém
    pozadí (viz .card níž). */
    --shadow-card: 0 1px 1px rgba(16,23,41,.03), 0 20px 34px -18px rgba(16,23,41,.18);

    --accent-blue-bg: #eaf0fe;   --accent-blue-fg: #2f6fed;
    --accent-green-bg: #e6f5ef;  --accent-green-fg: #1f9d75;
    --accent-amber-bg: #fbead6;  --accent-amber-fg: #c97a2e;
    --accent-red-bg: #fdeaec;    --accent-red-fg: #e2555f;
    --accent-purple-bg: #efe9fe; --accent-purple-fg: #7c5cf0;
    /* Nové 2026-09-15 (mockup stav-dropdown.html) - neutrální "šedá"
    varianta chyběla, potřebná pro Stav "Nová" a "Neměří se" v nové
    roletce (core/_status_dropdown.html). */
    --accent-gray-bg: #eef0f3;   --accent-gray-fg: #67748c;

    /* "Měkký" tón v půli mezi -bg (moc bledý na kolečku - "hrozně
    světlé jakoby vybledlé") a -fg (moc syté - "ostré") - přesný
    aritmetický průměr obou, ne nová paleta. Feedback od Michala -
    "přijde mi to moc světlé, trochu bych to ztmavil" + "ty kolečka
    vedle textu K úhradě a Po splatnosti bych obarvil analogicky
    stejně" (viz dashboard.css .donut-segment/.donut-legend__dot). */
    --accent-blue-soft: #97b7f7;
    --accent-red-soft: #f0a0a7;
}

/* Manrope (UI text) + JetBrains Mono (čísla/kódy) - self-hosted (Michal,
2026-09-15: appka nemá za běhu záviset na Google Fonts CDN, viz README/
CLAUDE.md důraz na výkon a spolehlivost v ostrém provozu). Jen latin +
latin-ext podmnožiny (čeština) - stažené přímo z fonts.gstatic.com, ne
celá znaková sada. Manrope v20 je proměnný font (jeden soubor pokrývá
celou váhovou osu) - `font-weight: 400 800` rozsah místo 5 kopií pravidla. */
@font-face {
    font-family: 'Manrope';
    font-style: normal;
    font-weight: 400 800;
    font-display: swap;
    src: url("fonts/manrope-latin.938c6e8019b6.woff2") format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122;
}
@font-face {
    font-family: 'Manrope';
    font-style: normal;
    font-weight: 400 800;
    font-display: swap;
    src: url("fonts/manrope-latin-ext.6d36d5bdedfa.woff2") format('woff2');
    unicode-range: U+0100-024F, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1E00-1EFF;
}
@font-face {
    font-family: 'JetBrains Mono';
    font-style: normal;
    font-weight: 500;
    font-display: swap;
    src: url("fonts/jetbrains-mono-500-latin.a21e038a03f7.woff2") format('woff2');
    unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+20AC, U+2122;
}
@font-face {
    font-family: 'JetBrains Mono';
    font-style: normal;
    font-weight: 500;
    font-display: swap;
    src: url("fonts/jetbrains-mono-500-latin-ext.311b1217e9b0.woff2") format('woff2');
    unicode-range: U+0100-024F, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1E00-1EFF;
}
/* Utilita pro čísla/kódy ve sloupcích (mockup - Manrope pro text, JetBrains
Mono pro číselné/tabulkové hodnoty), volitelná - ne plošná přestavba
existujících tabulek. */
.font-mono { font-family: 'JetBrains Mono', ui-monospace, monospace; font-variant-numeric: tabular-nums; }

* { box-sizing: border-box; }

body {
    margin: 0;
    font-family: 'Manrope', -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
    background: var(--body-bg);
    color: var(--body-fg);
}

/* Michal, 2026-09-16 - "udělej nové ikonky pro checkboxy... podle nového
konceptu designu": nativní checkbox/radio byl VŠUDE v appce natívní
prohlížečová modrá, neladil s jantarovou paletou appky. `accent-color`
(podporováno všemi moderními prohlížeči) přebarví natívní vzhled bez
nutnosti kreslit vlastní SVG náhradu - jedno pravidlo pro CELOU appku
(dřív byl per-místo `accent-color` jen na pár izolovaných místech, např.
`.grid-panel__col-row input[type=checkbox]` výš). */
input[type=checkbox], input[type=radio] { accent-color: var(--primary-dark); }

/* --- Shell (sidebar + hlavní obsah) ---------------------------------- */

.shell { display: flex; min-height: 100vh; }

.sidebar {
    width: var(--sidebar-width);
    flex: 0 0 var(--sidebar-width);
    /* `position: sticky; left: 0` - když je grid (table.list) širší než
    okno a stránka se kvůli tomu scrolluje vodorovně (viz `.table-scroll`
    výš), sidebar by jinak odjel z obrazovky spolu se zbytkem `.shell`
    flex řádku (Michalův bugreport - "vodorovný scrollbar by neměl
    odrolovat i levé menu"). Sticky ho drží na místě, `z-index` ať
    zůstane NAD obsahem, co se pod ním posouvá (má vlastní neprůhledné
    pozadí, takže nic nesvítí skrz). */
    position: sticky;
    left: 0;
    z-index: 20;
    background: var(--secondary);
    color: #DEE2E6;
    display: flex;
    flex-direction: column;
    /* Redesign 2026-09-15 (mockup priprava-vyroba-redesign.html/
    uvod-redesign.html `.sidebar`) - boční "gutter" (dřív 0) je NUTNÝ, aby
    položky menu níž mohly vypadat jako zaoblené "čipy" s viditelnou
    mezerou od okraje panelu - Michal po hard reload správně poznal, že
    předchozí verze byla "ostrohraná" (položky sahaly ke krajům, žádný
    prostor pro zaoblení se neprojevil). */
    padding: 20px 12px;
}
.sidebar__brand {
    font-weight: 700;
    letter-spacing: .03em;
    color: #fff;
    /* Boční padding přesunutý na `.sidebar` výš - dřívějších 20px tady by
    teď zdvojilo odsazení. */
    padding: 0 8px 2px;
}
.sidebar__brand span { color: var(--primary); }
/* Podtitulek pod brandem (mockup + login stránka - stejná "VAZNÍKY · CNC
· DŘEVOSTAVBY" značka na obou místech, ať appka a přihlašovací obrazovka
působí jako jeden celek). JetBrains Mono - stejná konvence jako
`.login-page__brand-sub`. */
.sidebar__brand-tag {
    font-family: 'JetBrains Mono', monospace;
    font-size: .6rem;
    letter-spacing: .09em;
    color: #7c8898;
    padding: 0 8px 16px;
    white-space: nowrap;
}

.sidebar__nav { flex: 1; overflow-y: auto; }

.sidebar__link, .sidebar__group-header {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 9px 14px;
    color: #DEE2E6;
    text-decoration: none;
    font-size: .87rem;
    cursor: pointer;
    user-select: none;
    /* Mockup `.nav-item` - zaoblený "čip", ne plný obdélník od kraje ke
    kraji (viz `.sidebar` padding výš, proč se to teď vůbec projeví). */
    border-radius: 8px;
    margin-bottom: 2px;
}
/* Odstín hoveru VĚDOMĚ jiný/silnější než dřívější .06 (Michalův
feedback + konkurenční IS screenshot - "trochu jiný odstín aby
podbarvili řádek jako hover efekt") - musí být znát i vedle aktivního
oranžového řádku, ne skoro neviditelný. */
.sidebar__link:hover, .sidebar__group-header:hover { background: rgba(255,255,255,.10); color: #fff; }
/* Michal, 2026-09-15 - "aktivní položka je taková zaoblená" + "na řádku
Banka je vidět hover efekt před kliknutím": ani jedno není náš styl -
BEZ vlastního `:focus` pravidla prohlížeč kreslí NATIVNÍ obrys (zaoblený,
obarvený podle systémového akcentu Windows), co navíc zůstává viditelný
i PO kliknutí, dokud focus nepřejde jinam (vypadá jako "zaseklý hover").
`:focus-visible` (ne obyčejné `:focus`) - moderní prohlížeče ho na rozdíl
od `:focus` NEukážou po prostém kliknutí myší, jen při navigaci
klávesnicí (Tab), takže "zaseklý" vzhled po kliknutí zmizí úplně, ne jen
se přebarví. */
.sidebar__link:focus-visible, .sidebar__group-header:focus-visible {
    outline: none;
    background: rgba(255,255,255,.10);
    color: #fff;
}
/* Redesign 2026-09-15 - dřívější plný oranžový blok (bg: var(--primary),
tmavý text) nahrazen jemným gradientem + levým amber pruhem (mockup
`.nav-item.active`) - konzistentní s tmavým sidebarem, text zůstává
světlý místo přepínání na tmavý. */
.sidebar__link.is-active {
    background: linear-gradient(90deg, rgba(232,150,60,.18), rgba(232,150,60,.02));
    color: #fff;
    font-weight: 600;
    box-shadow: inset 2px 0 0 var(--primary);
}
.sidebar__icon { width: 17px; height: 17px; flex: 0 0 17px; }
/* Počet čekajících položek u odkazu (Docházka - žádosti ke schválení). */
.sidebar__count { margin-left: auto; font: 500 10.5px 'JetBrains Mono', monospace; color: #e0913c; }

.sidebar__group-header span { flex: 1; min-width: 0; }
.sidebar__chevron { width: 14px; height: 14px; transition: transform .15s; flex: 0 0 14px; }

.sidebar__toggle { position: absolute; opacity: 0; pointer-events: none; }
.sidebar__toggle:checked ~ .sidebar__group-header .sidebar__chevron { transform: rotate(90deg); }
.sidebar__submenu {
    max-height: 0;
    overflow: hidden;
    transition: max-height .18s ease;
}
/* 600px, ne přesně napočítaná hodnota - Doklady má teď 11 položek
(Výzvy/DDPP/Faktury rozdělené na vydané/přijaté, viz split_by_direction)
a dřívějších 240px je ořezávalo (Dobropisy a další skoro neviditelné) -
generózní strop ať to nespadne znovu, až přibude další typ dokladu. */
.sidebar__toggle:checked ~ .sidebar__submenu { max-height: 600px; }

.sidebar__sublink {
    display: block;
    /* Mělčí odsazení než dřívějších 48px (Michalův bugreport - "Výzva k
    úhradě přijatá by se měla vlézt na jeden řádek", `--sidebar-width`
    zúžená na 210px) + `nowrap` místo default zalomení - dlouhý název
    typu dokladu se už nezalomí na 2 řádky. */
    padding: 7px 14px 7px 30px;
    color: #ADB5BD;
    text-decoration: none;
    font-size: .8rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    border-radius: 8px;
}
.sidebar__sublink:hover { background: rgba(255,255,255,.08); color: #fff; }
.sidebar__sublink:focus-visible { outline: none; background: rgba(255,255,255,.08); color: #fff; }
.sidebar__sublink.is-active {
    background: rgba(232, 150, 60, .18); /* var(--primary) #e8963c s průhledností */
    color: var(--primary);
    font-weight: 600;
}

/* Menu Dokladů po druzích (handoff 9a, kap. 3): nadpisy oddílů Vydané ·
Přijaté · Ostatní a počty vpravo, jako v prototypu. */
.sidebar__toggle:checked ~ .sidebar__submenu--doklady { max-height: 1100px; }
.sidebar__subhead {
    font: 600 9.5px 'JetBrains Mono', monospace;
    letter-spacing: .1em;
    text-transform: uppercase;
    color: rgba(255,255,255,.42);
    padding: 9px 14px 3px 30px;
}
.sidebar__subsep { height: 1px; background: rgba(255,255,255,.08); margin: 6px 14px 4px 30px; }
.sidebar__sublink--count { display: flex; align-items: center; gap: 8px; }
.sidebar__sublink-text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.sidebar__subcount { font: 500 10.5px 'JetBrains Mono', monospace; color: rgba(255,255,255,.4); flex: none; }
.sidebar__subcount--alert { color: #e08a72; }
.sidebar__sublink.is-active .sidebar__subcount { color: #e0913c; }

.sidebar__footer { border-top: 1px solid rgba(255,255,255,.08); padding-top: 8px; }

.sidebar-backdrop { display: none; }

/* --- Hlavní panel + úzký topbar (jen mobil-toggle a uživatel) -------- */

.shell__main { flex: 1; min-width: 0; }

/* Topbar + Rychlé záložky sdílí JEDNU tmavou lištu (feedback od Michala -
dřív byl nad černou lištou zbytečný prázdný bílý pruh jen pro
admin/Odhlásit). `.quicklinks` (viz níž) je teď flex potomek TÉHLE
lišty, ne samostatný blok pod ní. */
.topbar {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 16px;
    background: var(--secondary);
    padding: 6px 24px;
    min-height: var(--topbar-height);
}
.topbar__menu-toggle {
    display: none;
    align-items: center;
    justify-content: center;
    background: none;
    border: none;
    cursor: pointer;
    color: #DEE2E6;
    padding: 6px;
}
.topbar__menu-icon { width: 22px; height: 22px; }

.topbar__user {
    display: flex;
    align-items: center;
    gap: 10px;
    font-size: .85rem;
    white-space: nowrap;
    color: #DEE2E6;
    margin-left: auto;
}
.topbar__logout { margin: 0; }
/* Redesign 2026-09-15 - amber obrys místo neutrálně bílého (mockup
`.logout-btn`), ať odhlášení vizuálně ladí se zbytkem amber akcentů. */
.topbar__logout button {
    background: none;
    border: 1px solid rgba(232,150,60,.4);
    color: var(--primary);
    border-radius: var(--radius-sm);
    padding: 5px 12px;
    cursor: pointer;
    font-size: .82rem;
    font-weight: 700;
}
.topbar__logout button:hover { background: rgba(232,150,60,.1); }

/* --- Rychlé záložky (core.models.QuickLink, dashboard/_quick_links.html) */

.quicklinks {
    display: flex;
    align-items: center;
    gap: 4px;
    flex-wrap: wrap;
}
.quicklinks__tab {
    display: inline-flex;
    align-items: center;
    background: rgba(255,255,255,.08);
    border-radius: var(--radius-sm) var(--radius-sm) 0 0;
    max-width: 90px;
}
/* Redesign 2026-09-15 - dřívější plný amber blok (tmavý text) nahrazen
subtilnějším "current tab" vzhledem z mockupu (`.tab.current`) - jen
světlejší podklad + amber spodní linka, text zůstává světlý jako u
neaktivních tabů. */
.quicklinks__tab.is-active { background: rgba(255,255,255,.14); box-shadow: inset 0 -2px 0 var(--primary); }
.quicklinks__tab a {
    color: #DEE2E6;
    text-decoration: none;
    font-size: .78rem;
    padding: 5px 4px 5px 10px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
.quicklinks__tab.is-active a { color: #fff; font-weight: 600; }
.quicklinks__remove-form { display: contents; }
.quicklinks__remove-form button {
    background: none; border: none; cursor: pointer;
    color: #ADB5BD; padding: 4px 8px 4px 2px; font-size: .85rem; line-height: 1;
}
.quicklinks__tab.is-active .quicklinks__remove-form button { color: #DEE2E6; }
.quicklinks__remove-form button:hover { color: #fff; }

.quicklinks__add { position: relative; }
.quicklinks__add summary {
    list-style: none; cursor: pointer;
    color: #DEE2E6; font-size: .9rem; font-weight: 700;
    padding: 5px 10px; border-radius: var(--radius-sm);
}
.quicklinks__add summary::-webkit-details-marker { display: none; }
.quicklinks__add summary:hover { background: rgba(255,255,255,.08); }
.quicklinks__add-form {
    position: absolute; top: calc(100% + 4px); left: 0; z-index: 20;
    display: flex; gap: 6px;
    background: var(--surface-bg);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-md);
    padding: 10px;
}
.quicklinks__add-form input {
    border: 1px solid var(--border-color); border-radius: var(--radius-sm);
    padding: 5px 8px; font-size: .85rem; width: 140px;
}

@media (max-width: 900px) {
    .sidebar {
        position: fixed;
        inset: 0 auto 0 0;
        z-index: 40;
        transform: translateX(-100%);
        transition: transform .2s ease;
    }
    body.sidebar-open .sidebar { transform: translateX(0); box-shadow: var(--shadow-md); }
    body.sidebar-open .sidebar-backdrop {
        display: block;
        position: fixed;
        inset: 0;
        background: rgba(0,0,0,.3);
        z-index: 30;
    }
    .topbar__menu-toggle { display: inline-flex; }
}

.page {
    /* Bez max-width/centrování (feedback od Michala - zbytečná prázdná
    mezera na širších monitorech) - je to gridový/tabulkový systém se
    seznamy až s 26 sloupci, ať mají kde být. */
    padding: 24px;
}

/* DRUHÝ POKUS o vodorovné scrollování širokého gridu (`core/_list_base.html`
obaluje `{% block list_table %}` `.table-scroll` divem) - PRVNÍ pokus
(`overflow-x: auto` přímo na tomhle divu) byl špatně: scrollbar se
objevil až úplně DOLE POD VŠEMI ŘÁDKY tabulky, takže u delšího gridu
nebyl vůbec k nalezení bez scrollování stránky až na konec (Michalův
bugreport - "vodorovnej scrollbar vůbec nevidím"). `.table-scroll` je
teď JEN neutrální wrapper (bez overflow) - scrolluje se rovnou CELÉ
OKNO (nativní scrollbar dole v prohlížeči, spolehlivě viditelný a
"nezanořený"), sidebar zůstává na místě přes `position: sticky` NÍŽE
u `.sidebar`, ne přes zadržení scrollu uvnitř malého boxu. */
.table-scroll { }
.breadcrumb {
    display: flex; align-items: center; gap: 6px;
    font-size: .82rem; color: var(--muted-fg);
    margin-bottom: 6px;
}
.breadcrumb__sep { color: var(--border-color); }
.breadcrumb__item.is-current { color: var(--body-fg); font-weight: 600; }

.page__title {
    font-size: 1.4rem;
    margin: 0 0 20px;
    /* `display:flex` sem, ne na zvláštní wrapper div - `.page__title` je
    JEDINÝ obalující element z base.html, takže "Filtrováno" pilulka
    (`.filtered-pill`) jde přímo dovnitř jako druhý řádkový prvek.
    Jednořádkový titulek beze změny (jediné dítě = stejné chování jako
    dřív). */
    display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
}
/* core/_list_base.html - "Realizace (90)" (Michal, 2026-09-15: starý IS
tohle měl za názvem seznamu, "je to šikovné"). Muted/lehčí váha, ať
vizuálně nesoupeří s hlavním titulkem. */
.page__count { color: var(--muted-fg); font-weight: 400; font-size: .85em; }

/* Indikace aktivních filtrů (mockup filtr-indikator.html, design-
instrukce-stav-filtry.md) - varianta B (souhrnný pruh se štítky) +
C (badge u nadpisu + přepočet položek), Michal 2026-09-15 - staré IS
mělo obojí, "abychom věděli, že se nedíváme na kompletní seznam". */
.filtered-pill {
    display: inline-flex; align-items: center; gap: 5px;
    background: var(--accent-amber-bg); color: var(--accent-amber-fg);
    font-size: .72rem; font-weight: 700;
    padding: 3px 10px; border-radius: 20px;
}
.filtered-pill svg { width: 11px; height: 11px; }
.page-sub { font-size: .82rem; color: var(--muted-fg); margin: -12px 0 20px; }
.page-sub__num { font-family: 'JetBrains Mono', monospace; color: var(--body-fg); font-weight: 700; }

/* Stav v titulku (Michal, 2026-09-19, mockup Detail realizace) - pilulka
vedle jména, stejný tvar jako `.filtered-pill` výš, jiné barvy/obecnější
jméno (použitelné i mimo grid-filtr kontext). */
.status-pill {
    display: inline-flex; align-items: center; font-size: .72rem; font-weight: 700;
    padding: 3px 10px; border-radius: 20px; white-space: nowrap;
}
.status-pill--info { background: var(--accent-blue-bg); color: var(--accent-blue-fg); }
.status-pill--muted { background: var(--accent-gray-bg); color: var(--accent-gray-fg); }
/* Typ "M" - jen montáž, bez vlastní výroby (Michal, 2026-09-18 - "nemáme
ikonku pro pouze montáž... potřebujeme třeba u rekonstrukce"), odlišná
barva od V (`--muted`) i V+M (`--info`), viz Realizace.production_type_badge. */
.status-pill--purple { background: var(--accent-purple-bg); color: var(--accent-purple-fg); }

.filter-bar {
    display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
    margin: -8px 0 16px;
    padding: 9px 14px;
    background: var(--accent-amber-bg);
    border: 1px solid rgba(232,150,60,.35);
    border-radius: var(--radius-md);
    font-size: .82rem;
}
.filter-bar__funnel { width: 15px; height: 15px; color: var(--accent-amber-fg); flex-shrink: 0; }
.filter-bar__lead { font-weight: 700; color: var(--accent-amber-fg); white-space: nowrap; }
.filter-bar__chips { display: flex; gap: 6px; flex-wrap: wrap; flex: 1; }
.filter-bar__chip {
    display: inline-flex; align-items: center; gap: 6px;
    background: var(--surface-bg); border: 1px solid rgba(232,150,60,.4);
    color: var(--body-fg); font-weight: 600; font-size: .78rem;
    padding: 4px 8px 4px 10px; border-radius: 20px;
    text-decoration: none;
}
.filter-bar__chip:hover { border-color: var(--accent-amber-fg); }
.filter-bar__chip-x {
    display: inline-flex; align-items: center; justify-content: center;
    width: 14px; height: 14px; border-radius: 50%;
    color: var(--muted-fg); font-size: .7rem;
}
.filter-bar__chip:hover .filter-bar__chip-x { color: var(--accent-amber-fg); }
.filter-bar__clear {
    font-weight: 700; color: var(--muted-fg); white-space: nowrap;
    text-decoration: none;
}
.filter-bar__clear:hover { color: var(--accent-amber-fg); }

.card {
    background: var(--surface-bg);
    /* Skoro neviditelný okraj (ne var(--border-color), ten byl proti
    tmavšímu pozadí najednou vidět moc ostře a rušil "vystupující" efekt
    stínu, viz komentář u --body-bg) - jemné vymezení hrany dělá hlavně
    stín. */
    border: 1px solid rgba(33,37,41,.05);
    /* Redesign 2026-09-15 - větší roh + vrstvený stín z mockupu
    (--shadow-card), o něco výraznější "vystupující" efekt na novém
    krémovém pozadí než dřívější --radius-md/--shadow-sm. */
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-card);
    padding: 20px;
    margin-bottom: 20px;
}
/* Nadpis karty + akční tlačítko vedle sebe (např. "Položky" + "+ Přidat
položku" na documents/document_detail.html) - tlačítko VLEVO (feedback
od Michala), nadpis za ním. */
.card__header-row { display: flex; gap: 16px; align-items: center; margin-bottom: 12px; }
.card__header-row h2 { margin: 0; }

/* Karta, jejíž hlavní obsah je tabulka bez vlastního rámečku (mockup
uvod-redesign.html - "Vaše faktury po splatnosti"/"Moje probíhající
realizace"/"Moje poptávky" widgety). Michal, 2026-09-15 (porovnání
screenshotů): vodorovné linky tabulky mají sahat AŽ ke krajům widgetu
(ne zůstat zaražené uvnitř `.card` paddingu), a `table.list` (na rozdíl
od `table.report`, co je vždycky flush) svým VLASTNÍM rámečkem/stínem
"přelézal ven z widgetu" - dělal vizuálně kartu v kartě. `.card--table`
zruší boční padding karty (tabulka jde přes celou šířku) a přesune ho na
nadpis/prázdný stav zvlášť + odstraní `table.list` vlastní box vzhled,
když je takhle vnořená v kartě (na SAMOSTATNÝCH stránkách gridů
`table.list` svůj rámeček/stín pořád má, tohle je jen pro widgety na
Úvodu). */
.card--table { padding: 20px 0 6px; }
.card--table > h2 { padding: 0 20px; margin: 0 0 4px; }
.card--table > .empty-state { padding: 0 20px; margin-top: 0; }
.card--table table.list { background: transparent; border: none; box-shadow: none; }
.card--table table.list th, .card--table table.list td,
.card--table table.report th, .card--table table.report td { padding: 10px 20px; }
/* Michal, 2026-09-15 - "pokud jezdím kurzorem po řádku... pozadí taky
takové krémové" (mockup `.mini-table tbody tr:hover td`). `table.list`
tohle už dostává plošně (`table.list tbody tr:hover` výš, od Michalova
"dej to klidně přes celou appku") - tady doplňuje jen `table.report`
(žádné vlastní hover pravidlo jinde nemá). */
.card--table table.report tbody tr:hover td { background: #fbf9f4; }

/* banking/_account_header.html - "Účet" přepínač nad Bankovními pohyby/
Importem (Michalův screenshot starého IS) - karta se stavem účtu pod
selectem. */
.banking-account-card { max-width: 700px; margin-bottom: 16px; }
.banking-account-card__info { display: flex; gap: 32px; flex-wrap: wrap; margin-top: 4px; }

/* banking/bankimport_detail.html - log importu (banking.models.BankImport.log) */
.log-view {
    background: var(--body-bg); border: 1px solid var(--border-color); border-radius: 8px;
    padding: 12px 16px; font-family: monospace; font-size: .82rem; white-space: pre-wrap;
    max-height: 500px; overflow-y: auto;
}
/* Karty s klíč/hodnota detailem (Detail/Kategorizace/Dokumenty) NEmají
roztahovat hodnoty přes celou širokou stránku (feedback od Michala) -
na rozdíl od karet s opravdovou tabulkou dat (položky dokladu, Vyhodnocení
Realizace...), ty zůstávají přes `.card` bez modifikátoru na plnou šířku,
ať mají sloupce kde být. */
.card--narrow { max-width: 900px; }
/* Checklist vedle formuláře Detailu Realizace (feedback od Michala -
"dej ten checklist napravo... šířku dej poloviční než je nyní") -
poloviční šířka `.card--narrow` (900px), viz .detail-with-checklist. */
.card--checklist { max-width: 450px; flex: 1 1 320px; }
.detail-with-checklist { display: flex; gap: 20px; align-items: flex-start; flex-wrap: wrap; }
/* Levý sloupec Detailu Realizace (Průchod zakázkou, formulář) - obyčejný
blok, ne flex (mezery mezi kartami dělá jejich vlastní `.card`
margin-bottom, ne `gap`). `flex`/`max-width` tady řídí šířku CELÉHO
sloupce v `.detail-with-checklist` řádku - jednotlivé karty uvnitř mají
svoje `.card--narrow` navíc jen kvůli max-width v jiném kontextu (mimo
tenhle sloupec), tady je to neaktivní. */
.detail-main-column { flex: 1 1 500px; max-width: 900px; min-width: 0; }
/* Pravý sloupec (Checklist + Aktivita, Michal 2026-09-19) - stejný
princip jako `.detail-main-column`, jen užší (odpovídá `.card--checklist`
šířce). `.card--checklist` uvnitř nechává vlastní max-width beze změny -
neaktivní tady, sloupec sám je užší. */
.detail-side-column { display: flex; flex-direction: column; flex: 1 1 320px; max-width: 450px; min-width: 0; }

/* Průchod zakázkou (Michal, 2026-09-17, mockup Detail realizace) - pásek
segmentů nad formulářem Detailu, stejný vizuální jazyk jako mockup
(barevný segment = aktuální krok), přebarvený na stávající světlé téma
(--primary místo mockupové oranžové, --ink-faint/--border-color na
hotové/budoucí kroky). */
.production-stage { margin-bottom: 20px; }
.production-stage__head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 14px; }
.production-stage__head h2 { margin: 0; }
.production-stage__deadline { font-size: .78rem; color: var(--muted-fg); }
.production-stage__track { display: flex; gap: 7px; }
.production-stage__segment { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 7px; }
.production-stage__bar { height: 5px; border-radius: 3px; background: var(--border-color); }
.production-stage__segment--done .production-stage__bar { background: var(--ink-faint); }
.production-stage__segment--current .production-stage__bar { background: var(--primary); }
.production-stage__label {
    font-family: 'JetBrains Mono', monospace; font-size: .68rem; color: var(--ink-faint);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.production-stage__segment--done .production-stage__label { color: var(--muted-fg); }
.production-stage__segment--current .production-stage__label { color: var(--primary-dark); font-weight: 600; }

/* Vysvětlivky pod Seznamem realizací (Michal, 2026-09-19 - "udělal bych
na ten grid i ty vysvětlivky... umožnilo by nám to zkrátit ten pásek jen
na ty zkratky"), core/_list_base.html `list_footer` blok. Průchod
(core_extras.production_stage_legend) + Typ skupina se roztáhnou na
opačné konce řádku (`:last-child { margin-left: auto }`), jako v
mockupu. */
.stage-legend {
    display: flex; align-items: center; gap: 22px; flex-wrap: wrap;
    padding-top: 14px; margin-top: 10px; border-top: 1px solid var(--border-color);
    font-size: .78rem; color: var(--muted-fg);
}
.stage-legend__group { display: flex; align-items: center; gap: 13px; flex-wrap: wrap; }
.stage-legend__group:last-child { margin-left: auto; }
.stage-legend__title {
    font-family: 'JetBrains Mono', monospace; font-size: .68rem; letter-spacing: .08em;
    text-transform: uppercase; color: var(--muted-fg);
}
.stage-legend__swatch { display: inline-flex; align-items: center; gap: 6px; }
.stage-legend__dot { width: 16px; height: 5px; border-radius: 2px; display: inline-block; }
.stage-legend__dot--done { background: var(--ink-faint); }
.stage-legend__dot--current { background: var(--primary); height: 9px; }
.stage-legend__dot--future { background: var(--border-color); }

/* Pruh plnění u sloupce Požadovat na Seznamu realizací (Michal,
2026-09-19 - "vizuálně znázornit kolik ještě se má Požadovat"), mockup
RealizaceSeznam.dc.html "Zbývá fakt." - modrý pruh, 100 % přebarví na
šedou (ať plně vyfakturované zakázky "nekřičí" barvou). */
.grid-money-progress__value--done { color: var(--ink-faint); }
.grid-money-progress__meta { display: flex; align-items: center; gap: 6px; margin-top: 3px; font-size: .72rem; color: var(--muted-fg); }
.grid-money-progress__bar { width: 44px; height: 4px; border-radius: 2px; background: var(--border-color); overflow: hidden; flex: none; }
.grid-money-progress__fill { height: 100%; border-radius: 2px; background: var(--accent-blue-fg); }
.grid-money-progress__fill--done { background: var(--ink-faint); }

/* Aktivita - trvalý panel Události/Komentáře (Michal, 2026-09-19, viz
core_extras.events_panel docstring), nahradil dřívější mizející kartu
"Čeká na potvrzení". */
.events-panel__head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 12px; }
.events-panel__head h2 { margin: 0; }
.events-panel__list { display: flex; flex-direction: column; gap: 12px; }
.events-panel__item { padding-bottom: 12px; border-bottom: 1px solid var(--border-color); }
.events-panel__item:last-child { border-bottom: none; padding-bottom: 0; }
.events-panel__item--resolved { opacity: .6; }
.events-panel__item-meta { display: flex; align-items: center; gap: 7px; font-size: .85rem; }
.events-panel__dot { width: 7px; height: 7px; border-radius: 50%; flex: none; }
.events-panel__dot--task { background: var(--primary); }
.events-panel__dot--info { background: var(--accent-blue-fg); }
.events-panel__dot--done { background: var(--border-color); }
.events-panel__item-body { margin: 5px 0 0; font-size: .85rem; color: var(--body-fg); line-height: 1.5; }
.events-panel__item-actions { display: flex; align-items: center; gap: 12px; margin-top: 8px; }
.events-panel__item-actions form { display: inline; }
.card h2 {
    font-size: 1.05rem;
    margin: 0 0 14px;
}

.tiles {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
    gap: 12px;
    margin-bottom: 24px;
}
.tile {
    display: block;
    background: var(--surface-bg);
    /* Stejné zjemnění jako .card výš - klidový okraj skoro neviditelný,
    hover pořád přepíná na plnou var(--primary) beze změny. */
    border: 1px solid rgba(33,37,41,.05);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-sm);
    padding: 16px;
    text-decoration: none;
    color: var(--body-fg);
    font-weight: 600;
    transition: border-color .15s;
}
.tile:hover { border-color: var(--primary); }

/* --- Stat-card dlaždice (dashboard/home.html) ------------------------ */

.stat-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
    gap: 14px;
    margin-bottom: 24px;
}
.stat-card {
    display: flex;
    align-items: center;
    gap: 14px;
    background: var(--surface-bg);
    border: 1px solid rgba(33,37,41,.05);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-sm);
    padding: 16px;
    text-decoration: none;
    color: var(--body-fg);
    transition: box-shadow .15s, border-color .15s;
}
.stat-card:hover { border-color: var(--primary); box-shadow: var(--shadow-md); }
.stat-card__icon {
    flex: 0 0 40px;
    width: 40px;
    height: 40px;
    border-radius: var(--radius-md);
    display: flex;
    align-items: center;
    justify-content: center;
}
.stat-card__icon svg { width: 20px; height: 20px; }
.stat-card__icon--blue   { background: var(--accent-blue-bg);   color: var(--accent-blue-fg); }
.stat-card__icon--green  { background: var(--accent-green-bg);  color: var(--accent-green-fg); }
.stat-card__icon--amber  { background: var(--accent-amber-bg);  color: var(--accent-amber-fg); }
.stat-card__icon--red    { background: var(--accent-red-bg);    color: var(--accent-red-fg); }
.stat-card__icon--purple { background: var(--accent-purple-bg); color: var(--accent-purple-fg); }
.stat-card__body { min-width: 0; }
.stat-card__value { font-size: 1.15rem; font-weight: 700; line-height: 1.2; }
.stat-card__label { font-size: .82rem; color: var(--muted-fg); }

.quick-actions { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 20px; }

.badge {
    display: inline-block;
    min-width: 20px;
    text-align: center;
    background: var(--error);
    color: #fff;
    border-radius: 10px;
    padding: 1px 7px;
    font-size: .75rem;
    font-weight: 700;
}
.badge--success { background: var(--success); }
.badge--warning { background: var(--warning); color: var(--secondary); }
.badge--muted { background: var(--border-color); color: var(--body-fg); }

/* "Zapnout Windows oznámení" - jen zvoneček vedle badge počtu v nadpisu
"Aktivní události" (core/dashboard/home.html, Michal 2026-09-15 - "můžeš
nechat zobrazen jen zvoneček... ušetříme tím řádek místa"), dřív
samostatné tlačítko s textem na vlastním řádku. SVG (dashboard/_icons/bell.html,
stejný vzor jako .row-action-icon), ne emoji - PŮVODNĚ emoji s opacity/
grayscale ("Michal, 2026-09-15 - udělej jednotnou barvu, ten přechod do
ztracena je moc jemný"), `currentColor` na SVG jde obarvit ostře přímo,
bez rozostřovacích triků. Netlačené = plná (ne vybledlá) `--muted-fg`
"klikni na mě", zapnuté (`--enabled` zapíná JS v dashboard/base.html) =
plná `--primary`, ať je stav vidět i bez najetí myší. */
.push-bell-btn {
    display: inline-flex;
    vertical-align: middle;
    margin-left: 6px;
    background: none;
    border: none;
    padding: 0;
    cursor: pointer;
    color: var(--muted-fg);
}
.push-bell-btn__svg { width: 17px; height: 17px; display: block; }
.push-bell-btn:hover { color: var(--body-fg); }
.push-bell-btn--enabled, .push-bell-btn--enabled:hover { color: var(--primary); cursor: default; }

table.report {
    /* ŽÁDNÉ `width: 100%` - reportové tabulky (na rozdíl od table.list,
    hlavní grid s přepínatelnými sloupci, ten širokou stránku vědomě
    využívá) mívají málo/krátkých sloupců a stretch je jen zbytečně
    roztahoval přes celou širokou stránku (feedback od Michala - "obecně
    bys asi neměl tabulky roztahovat na celou stránku, ale dávat jim jen
    nějaké rozumné rozestupy mezi sloupci a cpát je doleva", "lidi mají
    34" monitory, tak potom jen kroutí hlavou zprava doleva zbytečně").
    Bez `width` se tabulka sama zúží na šířku obsahu a zůstane zarovnaná
    doleva (výchozí chování, žádné auto-centrování). */
    border-collapse: collapse;
    font-size: .9rem;
}
table.report th, table.report td {
    padding: 8px 10px;
    border-bottom: 1px solid var(--border-color);
    text-align: right;
}
table.report th:first-child, table.report td:first-child { text-align: left; }
table.report thead th {
    color: var(--muted-fg);
    font-weight: 600;
    font-size: .8rem;
    text-transform: uppercase;
    letter-spacing: .02em;
}
table.report tbody tr:last-child td { border-bottom: none; }
table.report tr.total td { font-weight: 700; border-top: 2px solid var(--secondary); }
/* PŮVODNĚ tmavá hlavička jako hlavní gridy (feedback od Michala na
widgetu "Vaše faktury vydané po splatnosti" - "hlavičku opět obarvi
tmavou jak hlavních gridech"). Redesign 2026-09-15 (Michal, porovnání se
uvod-redesign.html screenshotem - "widgety jsou čistší") - `table.list`
samo teď má taky světlou hlavičku (viz komentář tam), takže tenhle
modifikátor sleduje STEJNOU změnu: jemný krémový tón místo tmavého bloku
(mockup `.mini-table thead th`), ať headline řádek pořád vizuálně
odděluje od dat, i když karta/tabulka jsou obě bílé. Jen modifikátor, ne
výchozí `table.report` chování - report tabulky se používají i jinde
(Vyhodnocení realizace apod.), kde tenhle tón nebyl vyžádaný. */
table.report--dark-header thead th { background: #fbfaf7; color: var(--ink-faint); }

/* Hustší varianta (Položky dokladu - feedback od Michala "plýtváme
místem"/"pořád jsou extrémně velké mezery mezi řádky") - STEJNÝ padding
a line-height jako hlavní grid (table.list výš), ne jen o něco menší
než výchozí .report. Zarovnání DOLEVA na VŠECH sloupcích (na rozdíl od
výchozí .report, co má čísla doprava) - stejná konvence jako hlavní
grid (table.list, taky vše doleva), feedback od Michala "sjednoť to" po
tom, co Množství (doprava) a Jednotka (doleva) vedle sebe působily
nekonzistentně. */
table.report--dense { font-size: .82rem; }
table.report--dense th, table.report--dense td { padding: 5px 10px; line-height: 1.3; text-align: left; }
/* `font-size: .82rem` NA TABULCE (ne jen th/td), přesně jako
`table.list { font-size: .82rem }` výš - našlo se, proč to i po
sjednocení paddingu/line-height pořád vypadalo větší: `.report--dense`
bez VLASTNÍHO font-size zdědilo `.9rem` z `table.report` (základní,
ne-hustá varianta), ne .82rem z table.list, jak bylo cílem (feedback od
Michala - "to písmo v položkách je stále větší než písmo na hlavním
gridu", ověřeno přímo v běžící appce přes computed CSS). */

/* Pruhované řádky, stejně jako hlavní grid (table.list - feedback od
Michala "opět to rozlišuj podbarvením jako u hlavního gridu"). */
table.report--dense tbody tr:nth-child(even) { background: var(--body-bg); }
table.report--dense tbody tr:hover { background: var(--sidebar-active-bg); }

.overdue { color: var(--error); font-weight: 600; }
/* Odpočet dní u Termínu expedice na Seznamu realizací (Michal,
2026-09-19 - "líbí se mi jak v návrhu designu se u termínů ukazuje i
dopočet kolik dní zbývá"), mockup RealizaceSeznam.dc.html. `.overdue`
výš (barva + tučně) se kombinuje, když je záporné. */
.grid-days-until { display: block; font-size: .72rem; color: var(--muted-fg); }
.ok { color: var(--success); font-weight: 600; }

.filter-form {
    display: flex;
    gap: 12px;
    align-items: end;
    margin-bottom: 20px;
    flex-wrap: wrap;
}
.filter-form label {
    display: block;
    font-size: .8rem;
    color: var(--muted-fg);
    margin-bottom: 4px;
}
.filter-form input, .filter-form select {
    border: 1px solid var(--border-color);
    border-radius: var(--radius-md);
    padding: 6px 8px;
    font-size: .9rem;
    font-family: inherit;
}
.filter-form button {
    background: var(--primary);
    border: none;
    color: var(--secondary);
    font-weight: 600;
    border-radius: 6px;
    padding: 7px 16px;
    cursor: pointer;
}
.filter-form button:hover { background: var(--primary-dark); }

.empty-state {
    color: var(--muted-fg);
    padding: 20px 0;
}

.link-quiet { color: var(--muted-fg); font-size: .85rem; text-decoration: none; }
.link-quiet:hover { text-decoration: underline; }

/* Button vypadající jako link-quiet - core/_attachments.html "Nastavit
jako úvodní" (uvnitř `.tag-chip__remove-form`, proto se natvrdo neopakuje
display:inline). */
.link-button {
    background: none; border: none; padding: 0; cursor: pointer;
    color: var(--muted-fg); font-size: .85rem; text-decoration: none;
}
.link-button:hover { text-decoration: underline; }

/* --- Seznamy (core.views.SearchableSortableListMixin) --------------- */

.list-toolbar {
    display: flex;
    justify-content: flex-start;
    align-items: center;
    gap: 12px;
    margin-bottom: 16px;
    flex-wrap: wrap;
}
.list-toolbar__search {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
}
.list-toolbar__actions {
    /* Akční tlačítka (+ Nová realizace apod.) drží pohromadě jako JEDEN
    blok, hned vedle Hledat/Zobrazení (feedback od Michala - úplně
    vpravo na širší stránce bez max-width to působilo odhozeně/nelogicky,
    "pohromadě" mělo znamenat spolu s hledáním/filtrem, ne daleko od nich). */
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
}
.list-toolbar__search input,
.list-toolbar__search select {
    /* Michal, 2026-09-14 - "Zobrazení a kolonka pro hledání teď vypadají,
    jakoby tam nepatřily" - jediné prvky v panelu bez stínu/zjemněného
    okraje, co dostaly ostatní tlačítka vedle nich (viz .btn--secondary).
    Sjednoceno na stejnou konvenci. */
    border: 1px solid rgba(33,37,41,.08);
    border-radius: var(--radius-md);
    padding: 7px 10px;
    font-size: .9rem;
    background: var(--surface-bg);
    box-shadow: var(--shadow-sm);
}
.list-toolbar__search input[name="q"] {
    min-width: 220px;
}
.list-toolbar__filter select,
.list-toolbar__filter input {
    min-width: 140px;
}
.btn {
    display: inline-block;
    /* Redesign 2026-09-15 - jemný gradient místo ploché výplně (mockup
    .btn-primary), ale VĚDOMĚ beze změny měřítka stínu (var(--shadow-sm)/
    --shadow-md beze změny) - Michal, 2026-09-14 (3. kolo): příliš velký
    stín dělal opticky větší "půdorys" tlačítka, tenhle poznatek pořád
    platí, mění se jen výplň/okraj, ne stín. */
    background: linear-gradient(180deg, #edaa54, var(--primary-dark));
    border: 1px solid var(--primary-dark);
    color: var(--secondary);
    font-weight: 600;
    border-radius: 6px;
    padding: 7px 16px;
    cursor: pointer;
    text-decoration: none;
    font-size: .9rem;
    box-shadow: var(--shadow-sm);
    transition: box-shadow .15s, transform .15s, filter .15s;
}
.btn:hover {
    filter: brightness(1.05);
    box-shadow: var(--shadow-md);
    transform: translateY(-1px);
}
.btn:active { transform: translateY(0); box-shadow: var(--shadow-sm); }
/* Ikonka PDF (documents/_pdf_icon.html) - klasický "červená stránka"
symbol místo dřívějšího emoji 📄 (Michal). `.btn--pdf` jen přepíná na
flex kvůli zarovnání ikony+textu, `.pdf-icon` řídí velikost - vlastní
barvy má NATVRDO v SVG (červená/bílá), ať vypadá stejně bez ohledu na
světlé/tmavé téma nebo kontext (tlačítko na kartě dokladu i sloupec v
gridu sdílí tutéž ikonku). */
.btn--pdf { display: inline-flex; align-items: center; gap: 6px; }
.pdf-icon { width: 15px; height: auto; flex: 0 0 auto; }
a.pdf-link { display: inline-flex; }
a.pdf-link .pdf-icon { width: 20px; }
.btn--secondary {
    background: var(--surface-bg);
    /* Michal, 2026-09-14: bílá tlačítka opticky vystupovala VÍC než
    oranžová hlavní CTA - tvrdý šedý okraj (`var(--border-color)`,
    plná neprůhledná barva) kolem BÍLÉHO tlačítka na SVĚTLE ŠEDÉM
    pozadí dělal ostřejší "vyříznutý" tvar než teplý stín pod oranžovým
    tlačítkem, i když měla obě STEJNÝ stín. Stejné zjemnění okraje jako
    .card/.tile/.stat-card výš - stín (var(--shadow-sm), zdědí se z
    .btn) teď nese vizuální váhu sám, oranžové CTA díky svému barevnému
    stínu (viz .btn výš) zůstává jasně "nejvíc vepředu". */
    border: 1px solid rgba(33,37,41,.08);
    color: var(--body-fg);
}
.btn--secondary:hover { border-color: var(--primary); background: var(--body-bg); }
/* Zvýrazněná akce, co na něco upozorňuje (feedback od Michala + starý IS
screenshot - "Z výzvy / DDPP" tlačítko je červené, když má zákazník
nevyúčtovanou zálohu/DDPP čekající na odečet, jinak obyčejné). */
.btn--danger { background: var(--error); color: #fff; }
.btn--danger:hover { background: #c22836; }

table.list {
    width: 100%;
    /* `separate` + `border-spacing: 0` MÍSTO `collapse` (bývalo) -
    `border-radius` na jednotlivých buňkách (viz níž) se v "collapsing
    border modelu" podle CSS specifikace VŽDY počítá jako 0 (prohlížeče
    ho tiše ignorují), takže by zaoblení rohů jinak vůbec nefungovalo.
    `border-spacing: 0` drží buňky vizuálně slepené stejně jako předtím -
    tabulka používá jen `border-bottom` na buňkách (ne plné ohraničení
    z každé strany), takže se dřívější vzhled tímhle přepnutím nemění. */
    border-collapse: separate;
    border-spacing: 0;
    background: var(--surface-bg);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-sm);
    font-size: .82rem;
}
/* Zaoblené rohy BEZ `overflow: hidden` na celé tabulce (mělo to tam
bývalo, ořízlo to ale i cokoliv, co z tabulky vizuálně přečnívá -
Michalův bugreport 2026-09-14: hover menu bubliny Události/Komentáře u
spodních řádků "nejde vidět", protože ho `overflow: hidden` usekl). Roh
se zaobluje přímo na rohových buňkách - vizuálně stejný výsledek, jen
nic neklipuje. */
table.list thead tr:first-child th:first-child { border-top-left-radius: var(--radius-md); }
table.list thead tr:first-child th:last-child { border-top-right-radius: var(--radius-md); }
table.list tbody tr:last-child td:first-child { border-bottom-left-radius: var(--radius-md); }
table.list tbody tr:last-child td:last-child { border-bottom-right-radius: var(--radius-md); }
/* Michal, 2026-09-18 - "ta lemovací linka nectí to zaoblení" / "to bílé
pozadí toho spodního řádku překrývá ten zaoblený roh a leze jakoby ven":
zebra pruhování (`tr:nth-child(even)` níž) i zvýraznění řádku barví CELÝ
`<tr>`, ne jednotlivé buňky - na poslední řádce tak ten čtvercový podklad
"prosvítal" skrz zaoblenou buňku (border-radius zaobluje jen VLASTNÍ
podklad buňky, ne to, co skrz její průhledné pozadí prosvítá zezadu).
PRVNÍ pokus (`background-color: inherit`) nestačil - liché řádky (bez
zebry) mají `<tr>` taky průhledný, takže se "zdědila" jen průhlednost a
skrz ni bylo dál vidět hranaté bílé pozadí SAMOTNÉ `<table>` (ta žádné
zaoblení nemá, `border-radius: 0`, viz `.preparer-panel table.list`).
Řešení - EXPLICITNÍ barva na buňce (ne zděděná): výchozí `--surface-bg`
(stejná bílá jako `table.list` samo, takže liché řádky vypadají stejně
jako dřív), přebitá `--body-bg` jen když je poslední řádek zároveň sudý
(zebra). Nenápadné na tabulce samotné (nic kontrastního hned vedle), ale
zjevné na `.preparer-panel`, kde tabulka sedí uvnitř vlastního
orámovaného rohu. */
table.list tbody tr:last-child td { background-color: var(--surface-bg); }
table.list tbody tr:last-child:nth-child(even) td { background-color: var(--body-bg); }
table.list th, table.list td {
    /* PŮVODNĚ 4px (feedback od Michala - starý IS ukázal na monitor ~18
    řádků, "u starého se mi tam vleze všechno, u nového ne"). Redesign
    2026-09-15 - po vyzkoušení vyššího řádkování na Přípravě výroby
    (`.list--roomy`, 10px) Michal usoudil, že s tím tehdejším 4px "to
    trochu přehnal" - kompromis 7px jako NOVÝ výchozí pro všechny hlavní
    gridy (o něco vzdušnější, pořád ne tak vysoké jako `.list--roomy`). */
    padding: 7px 8px;
    text-align: left;
    border-bottom: 1px solid var(--border-color);
    line-height: 1.3;
}
/* Kompaktní tlačítko PRO ŘÁDKOVOU AKCI V GRIDU (např. "Rozpoložkovat")
- `.btn`/`.btn--secondary` samotné mají padding/font-size laděné na
  samostatná tlačítka nad tabulkou (7px 16px, .9rem), v úzké buňce
  gridu to zbytečně nafukuje šířku sloupce. */
.btn--row { padding: 2px 8px; font-size: .78rem; }
/* DEFAULT pro VŠECHNY hlavní gridy: jeden řádek = jeden text řádek, ne
víc (Michalův bugreport na gridu Banky - "řádky jsou opět hodně vysoké,
používej stejnou výšku jako třeba v realizacích... to si někde ulož jako
default"). Dlouhý text (jméno protistrany, poznámka...) sloupec radši
rozšíří (`table.list` nemá `overflow-x` wrapper, viz komentář u
list_table výš v šablonách) než aby se zalomil na 2 řádky a nafoukl
výšku CELÉHO řádku - stejná filozofie jako `.price-cell div` níž, teď
jen jako univerzální výchozí chování místo řešení případ od případu.
Vlastní vícořádkové komponenty (`.price-cell` apod.) jsou `flex`
kontejnery UVNITŘ buňky, tímhle nedotčené - `white-space` se týká jen
textového obsahu, ne flex stackování potomků.

PLATÍ I PRO `th` (ne jen `td`) - dvouslovné záhlaví jako "Datum platby"
se v užším sloupci lámalo na 2 řádky, což nafouklo výšku CELÉHO
záhlaví (Michalův opakovaný bugreport na Bance - vypadalo to jako
"zase velký padding", i když šlo o zalomený text, ne o padding). */
table.list th, table.list td { white-space: nowrap; }
table.list thead th {
    /* PŮVODNĚ tmavá (stejná barva jako boční panel) - feedback od
    Michala 2026-09-14, "hlavička... má stejnou barvu jak pozadí a
    zaniká", `--body-bg` tehdy bylo skoro nerozeznatelné od `--surface-bg`
    karty. Redesign 2026-09-15 (Michal, porovnání se
    priprava-vyroba-redesign.html screenshotem - "nový design nemá tu
    hlavičku hlavní tabulky černou") - `table.list` samo o sobě je teď
    vlastní "karta" (`background: var(--surface-bg)` výš) na teplém
    krémovém `--body-bg`, takže i světlá hlavička s jen spodní linkou
    zůstává jasně čitelná, původní problém řeší kontrast stránka/karta,
    ne tmavá výplň hlavičky. */
    background: var(--surface-bg);
    color: var(--ink-faint);
    font-weight: 700;
    font-size: .72rem;
    text-transform: uppercase;
    letter-spacing: .05em;
    border-bottom: 1px solid var(--border-color);
}
/* Střídání barvy řádků (feedback od Michala - přehlednější čtení) +
zvýraznění řádku po kliknutí, ať je vidět, se kterým se pracuje - JS
přepínač viz dashboard/base.html (klik kamkoliv do řádku), `.is-selected`
zůstává silně zvýrazněný (--sidebar-active-bg).
PŮVODNĚ (Michal, 2026-09-14) prostý HOVER bez kliknutí žádné vlastní
podbarvení řádku neměl ("trochu tahá za oko ten hover efekt... radši jen
dobarvit název") - hover signalizoval jen link (`tbody a:hover` níž).
Redesign 2026-09-15 (Michal - "dej to klidně přes celou appku", po
vyzkoušení na Přípravě výroby) tohle vědomě obrátil zpět na podbarvení
CELÉHO řádku, napříč všemi hlavními gridy - `:not(.list-group-row)`, ať
se netýká seskupovacích řádků (Přípravář: Jméno apod.), ty žádný
"pracovní" obsah nemají. */
table.list tbody tr:nth-child(even) { background: var(--body-bg); }
table.list tbody tr:not(.list-group-row):hover { background: #fbf9f4; }
table.list tbody tr.is-selected,
table.list tbody tr.is-selected:hover { background: var(--sidebar-active-bg); }
table.list tbody tr:last-child td { border-bottom: none; }
/* Poslední řádek má od výš EXPLICITNÍ barvu přímo na buňce (kvůli
zaoblení rohu, viz komentář nahoře) - dětský `<td>` podklad by jinak
napořád zakrýval hover/výběr `<tr>` (rodičovské pozadí je vidět jen tam,
kde ho potomek nepřekryje vlastním, bez ohledu na specificitu). Tenhle
override musí mít vyšší specificitu než ten základní `tr:last-child td`
pravidlo výš, aby hover/výběr na posledním řádku pořád fungoval. */
table.list tbody tr:not(.list-group-row):last-child:hover td { background-color: #fbf9f4; }
table.list tbody tr.is-selected:last-child td,
table.list tbody tr.is-selected:last-child:hover td { background-color: var(--sidebar-active-bg); }

/* Řádkové seskupení podle přípraváře (inquiries/preparer_grid.html -
"Příprava výroby", Michal 2026-09-13: replikace seskupení ze starého
MS Listu "Přehled zakázek", každá skupina má nadpis "Přípravář: Jméno (N)").
`:nth-child(even)` výš by na téhle řádce vypadalo nekonzistentně (jednou
světlá/tmavá podle pozice v tabulce, ne podle obsahu) - vlastní pevná
barva místo zdědění zebry. */
/* Redesign 2026-09-15 - dřívější tmavý blok (stejná barva jako sidebar)
nahrazen jemným světlým podkladem podle mockupu (`.group-row`) - lépe
ladí s teplým krémovým pozadím appky, dost odlišené od běžných řádků i
bez tmavého kontrastu. */
table.list tr.list-group-row td {
    background: #fbfaf7;
    color: var(--body-fg);
    font-weight: 700;
    padding: 8px 14px;
    border-top: 1px solid var(--border-color);
    border-bottom: 1px solid var(--border-color);
}

/* Inline "Dnešní čas" vstup přímo v buňce gridu (inquiries/preparer_grid.html,
inquiries/inquiry_list.html) - klik, napsat přidané hodiny, Enter (Michal,
2026-09-13). `.inline-hours-form` bez marginu, ať nerozbíjí výšku řádku
table.list, input úzký (jen pár znaků, "4,5" typicky stačí). */
.inline-hours-form { margin: 0; }
.inline-hours-input {
    width: 56px;
    border: 1px solid var(--border-color);
    border-radius: 4px;
    padding: 3px 5px;
    font-size: .82rem;
}

/* Stejný princip pro Stav/Zaměření - <select> rovnou v buňce gridu,
uloží se při změně (Michal, 2026-09-13 - "myslel jsem, že to půjde měnit
rovnou na tom hlavním gridu"), žádná karta se nemusí otevírat. */
.inline-status-select {
    border: 1px solid var(--border-color);
    border-radius: 4px;
    padding: 3px 5px;
    font-size: .82rem;
    max-width: 130px;
}

/* Zakulacené barevné "pilulky" pro Stav/Zaměřeno (Michal, 2026-09-13 -
"bude to přehlednější", podle screenshotu starého MS Listu) - pořád je
to funkční <select> (inline editace při změně), jen obarvený podle
AKTUÁLNÍ hodnoty přes modifikátor `--<hodnota>` (viz core_extras
`status_choices`/`survey_status_choices` hodnoty PrepStatus/SurveyStatus).
`appearance: none` schová nativní šipku (rozbíjela kulatý tvar pilulky) -
klik kamkoliv do pilulky dropdown pořád otevře. */
.status-pill {
    appearance: none;
    -webkit-appearance: none;
    border: none;
    border-radius: 999px;
    padding: 3px 10px;
    font-size: .78rem;
    font-weight: 600;
    cursor: pointer;
    max-width: 130px;
}
/* Stejné třídy se navíc dávají i na jednotlivé <option> uvnitř selectu
(Michal, 2026-09-14 - "aby měl v roletce každý stav svou vlastní barvu,
takto je to zmatečné") - obyčejné class selectory bez omezení na
element, takže fungují na <select> i na <option> beze změny CSS. */
/* PŮVODNĚ (Michal, 2026-09-14): Nová->modrá, V přípravě->oranžová,
Připraveno->fialová, Nabídka odeslána->zelená. Redesign 2026-09-15
(mockup stav-dropdown.html, Michal - "sjednotit podle mockupu") - nová
paleta čte se jako logičtější postup stavu: Nová (zatím nic se
nestalo)->šedá, V přípravě->jantarová, Připraveno->zelená (kladný
výsledek), Nabídka odeslána->modrá (odesláno pryč, finální krok). Platí
VŠUDE, kde se tenhle stav zobrazuje (grid Přípravy výroby, seznam
Poptávek, detail popupy), ne jen v nové roletce. */
.status-pill--nova { background: var(--accent-gray-bg); color: var(--accent-gray-fg); }
.status-pill--v_priprave { background: var(--accent-amber-bg); color: var(--accent-amber-fg); }
.status-pill--pripraveno { background: var(--accent-green-bg); color: var(--accent-green-fg); }
.status-pill--nabidka_odeslana { background: var(--accent-blue-bg); color: var(--accent-blue-fg); }
.status-pill--zamereno { background: var(--accent-green-bg); color: var(--accent-green-fg); }
.status-pill--nezamereno { background: var(--accent-red-bg); color: var(--accent-red-fg); }
.status-pill--nemeri_se { background: var(--accent-gray-bg); color: var(--accent-gray-fg); }
/* core.EventStatus (Událost/Komentář, core/_event_form.html Stav pole,
core/_status_dropdown.html reuse - design-instrukce-komentare.md). */
.status-pill--new { background: var(--accent-gray-bg); color: var(--accent-gray-fg); }
.status-pill--in_progress { background: var(--accent-amber-bg); color: var(--accent-amber-fg); }
.status-pill--resolved { background: var(--accent-green-bg); color: var(--accent-green-fg); }

/* core/_status_dropdown.html - vlastní roletka Stavu (mockup
stav-dropdown.html), Michal 2026-09-15. Trigger vypadá přesně jako
dosavadní `.status-pill` odznak (stejné třídy `status-pill--*`), jen s
šipkou navíc - v gridu tak vypadá stejně zavřený jako dřívější <select>. */
.status-dropdown { position: relative; display: inline-block; }
.status-dropdown__trigger {
    display: flex; align-items: center; gap: 6px;
    border: 1px solid transparent;
    cursor: pointer;
    font-family: inherit;
}
.status-dropdown__trigger:hover { filter: brightness(.97); }
.status-dropdown__chev { width: 12px; height: 12px; opacity: .75; transition: transform .15s; flex: 0 0 12px; }
.status-dropdown__menu[hidden] { display: none; }
.status-dropdown__menu {
    position: absolute; top: calc(100% + 4px); left: 0; z-index: 20;
    width: max-content; min-width: 170px;
    background: var(--surface-bg);
    border: 1px solid rgba(231,227,217,.7);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-card);
    padding: 6px;
}
.status-dropdown__item {
    display: flex; align-items: center; gap: 9px;
    padding: 8px 10px; border-radius: 8px;
    font-size: .82rem; font-weight: 600;
    color: var(--body-fg);
    cursor: pointer;
    white-space: nowrap;
}
.status-dropdown__item:hover { background: #fbf9f4; }
/* Barevná tečka - stejné `status-pill--*` třídy jako trigger/dosavadní
odznaky, jen aplikované na malé kolečko místo pilulky s textem (fg barva
jako výplň tečky) - jeden zdroj pravdy pro barvu stavu, žádná
zdvojená paleta navíc k `.status-pill--*` výš. */
.status-dropdown__dot { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; background: currentColor; }
.status-dropdown__dot.status-pill--nova { color: var(--accent-gray-fg); }
.status-dropdown__dot.status-pill--v_priprave { color: var(--accent-amber-fg); }
.status-dropdown__dot.status-pill--pripraveno { color: var(--accent-green-fg); }
.status-dropdown__dot.status-pill--nabidka_odeslana { color: var(--accent-blue-fg); }
.status-dropdown__dot.status-pill--zamereno { color: var(--accent-green-fg); }
.status-dropdown__dot.status-pill--nezamereno { color: var(--accent-red-fg); }
.status-dropdown__dot.status-pill--nemeri_se { color: var(--accent-gray-fg); }
.status-dropdown__dot.status-pill--new { color: var(--accent-gray-fg); }
.status-dropdown__dot.status-pill--in_progress { color: var(--accent-amber-fg); }
.status-dropdown__dot.status-pill--resolved { color: var(--accent-green-fg); }
.status-dropdown__item.is-selected { background: var(--accent-blue-bg); color: var(--accent-blue-fg); }
.status-dropdown__check { margin-left: auto; width: 14px; height: 14px; opacity: 0; flex: 0 0 14px; }
.status-dropdown__item.is-selected .status-dropdown__check { opacity: 1; }
/* Klávesová navigace (šipky) - core.js zvýrazní `.is-focused` na aktuální
položce, oddělené od `.is-selected` (myší lze mít najetou jinou položku,
než která je právě "vybraná" v předchozím stavu). */
.status-dropdown__item.is-focused { background: #fbf9f4; }
/* "Nabídka odeslána" je jiná kategorie než pracovní stavy (Michal -
design-instrukce-stav-filtry.md, "vedlejší akce obchodníka, ne postup
přípraváře") - `divider_before` v core/_status_dropdown.html. */
.status-dropdown__divider { height: 1px; background: var(--border-color); margin: 4px 2px; }
.status-dropdown__trigger:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
.status-dropdown__item:focus-visible { outline: none; }

/* Sloupec Cena na seznamu dokladů - tři řádky (bez DPH/DPH/celkem s
DPH), jako starý IS (feedback od Michala). Přenesená daňová povinnost
zvýrazněná jemným oranžovým nádechem (--accent-amber-bg) - starý IS
tam měl modrou, ale ta nesedí do zavedené černo-oranžové palety
(stejný důvod jako u odkazů v gridu výš). */
/* Bez vlastního vertikálního paddingu - td uvnitř tabulky už padding má
(feedback od Michala "šetřit místem", zdvojený padding dělal zbytečně
vysoký řádek). Jen vodorovný, ať zvýraznění (--accent-amber-bg) trochu
přesahuje přes text. */
.price-cell { display: flex; flex-direction: column; gap: 0; padding: 0 4px; border-radius: var(--radius-sm); }
/* Bez tohohle se "Kč" v úzkém sloupci zalamovalo na vlastní řádek
(feedback od Michala - "aby se to Kč tak blbě neoddělovalo dolů") -
`nowrap` drží každou částku na jednom řádku, sloupec se radši rozšíří
(tabulka má `overflow-x: auto` wrapper) než aby se text lámal. */
.price-cell div { white-space: nowrap; }
.price-cell__total { font-weight: 700; }
.price-cell--reverse-charge { background: var(--accent-amber-bg); }
/* Odkazy v gridu musí vypadat jako odkazy i BEZ hoveru (feedback od
Michala - "mělo by být poznat, že se má kliknout na název"), ale modrá
nesedí do zavedené černo-oranžové palety (další feedback) - text
zůstává černý, klikatelnost signalizuje tenké oranžové podtržení
(--primary, stejná oranžová jako tlačítka/aktivní stavy). `tbody a`, ne
`table.list a` - záhlaví (.sort-link v <thead>) má zůstat černé, tohle
se ho nemá týkat. Hover používá STEJNÝ odstín jako to podtržení
(--primary), ne tmavší odstín jako dřív - "ať to vypadá, že se jen
dobarví název taky na oranžovo". */
table.list tbody a {
    color: var(--body-fg);
    text-decoration: none;
    border-bottom: 1px solid var(--primary);
    padding-bottom: 1px;
}
table.list tbody a:hover { color: var(--primary); border-bottom-color: var(--primary); }

.sort-link { color: inherit; text-decoration: none; }
/* Tmavá `--secondary` teď žije i na pozadí hlavičky (viz table.list
thead th výš) - aktivní řazení proto zvýrazněné oranžovou (--primary),
ne stejnou tmavou barvou, co by na tmavém pozadí zmizela. */
.sort-link.is-active { color: var(--primary); font-weight: 700; }
.sort-link:hover { text-decoration: underline; }

.pagination {
    display: flex;
    gap: 6px;
    margin-top: 16px;
    font-size: .85rem;
}
.pagination a, .pagination span {
    padding: 5px 10px;
    border-radius: 6px;
    text-decoration: none;
    color: var(--body-fg);
}
.pagination a:hover { background: var(--surface-bg); border: 1px solid var(--border-color); }
.pagination .is-current { background: var(--primary); color: var(--secondary); font-weight: 700; }

/* --- Ovládací panel gridu (core/_grid_panel.html) --------------------
Redesign 2026-09-15 (mockup filtr-panel-universal.html) - stejná
details/summary + CSS radio taby mechanika jako dřív, jen nový vzhled:
zaoblenější "kartový" panel s odděleným záhlavím/taby/tělem, štítky NAD
poli (ne vedle), počet aktivních filtrů jako číslo v odznaku na tlačítku
(místo jen barevného zvýraznění). --------------------------------- */

.grid-panel__toggle-group { display: inline-flex; align-items: center; gap: 6px; }
/* Samostatné čtvercové tlačítko "Zrušit filtry" vedle triggeru (mockup
`.clear-btn`) - dřív jen tenký text odkaz. */
.grid-panel__clear {
    display: inline-flex; align-items: center; justify-content: center;
    width: 32px; height: 32px;
    border: 1px solid var(--border-color); border-radius: var(--radius-md);
    background: var(--surface-bg);
    color: var(--ink-faint, var(--muted-fg)); text-decoration: none; font-size: .85rem; line-height: 1;
}
.grid-panel__clear:hover { color: var(--body-fg); border-color: var(--ink-faint, var(--muted-fg)); }

.grid-panel { position: relative; }
.grid-panel__icon { width: 15px; height: 15px; flex: 0 0 15px; }
.grid-panel__toggle {
    display: flex; align-items: center; gap: 7px;
    border: 1px solid rgba(33,37,41,.08);
    box-shadow: var(--shadow-sm);
    border-radius: var(--radius-md);
    padding: 8px 12px 8px 10px;
    font-size: .82rem;
    font-weight: 700;
    cursor: pointer;
    background: var(--surface-bg);
    color: var(--body-fg);
    list-style: none;
    user-select: none;
}
.grid-panel__toggle::-webkit-details-marker { display: none; }
.grid-panel[open] .grid-panel__toggle { border-color: var(--primary); }
/* Michal, 2026-09-14 - starý IS měl tlačítko filtru graficky odlišené,
když je nějaký filtr/hledání aktivní ("abychom věděli, že se nedíváme
na kompletní seznam") - amber, stejný jazyk jako `.row-action-icon--active`
jinde v appce. Redesign 2026-09-15 - navíc `.grid-panel__count` s
POČTEM aktivních filtrů, ne jen barva. */
.grid-panel__toggle--active {
    background: var(--accent-amber-bg);
    border-color: rgba(232,150,60,.4);
    color: var(--accent-amber-fg);
}
.grid-panel__count {
    display: inline-flex; align-items: center; justify-content: center;
    min-width: 17px; height: 17px; padding: 0 4px;
    background: var(--accent-amber-fg); color: #fff;
    font-size: .68rem; font-weight: 800; border-radius: 20px;
}

.grid-panel__body {
    position: absolute;
    top: calc(100% + 8px);
    left: 0;
    z-index: 20;
    width: min(420px, 90vw);
    background: var(--surface-bg);
    border: 1px solid rgba(231,227,217,.7);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-card);
    overflow: hidden;
}

.grid-panel__top { padding: 14px 18px 0; }
.grid-panel__per-page {
    display: flex; align-items: center; gap: 8px;
    font-size: .78rem; font-weight: 600; color: var(--muted-fg);
}
.grid-panel__per-page select {
    border: 1px solid var(--border-color); border-radius: var(--radius-md); padding: 5px 8px;
    font-weight: 700; color: var(--body-fg);
    appearance: none; -webkit-appearance: none; background: var(--surface-bg) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%238a8578' stroke-width='1.4' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat right 8px center;
    padding-right: 24px; box-shadow: none;
}

.grid-panel__tabs input[type="radio"] { position: absolute; opacity: 0; pointer-events: none; }
.grid-panel__tab-labels {
    display: flex; gap: 16px; border-bottom: 1px solid var(--border-color);
    padding: 14px 18px 0;
}
.grid-panel__tab-labels label {
    cursor: pointer; padding: 0 0 10px; font-size: .78rem; font-weight: 700; color: var(--ink-faint);
    border-bottom: 2px solid transparent; margin-bottom: -1px;
}
#tab-sloupce:checked ~ .grid-panel__tab-labels label[for="tab-sloupce"],
#tab-filtry:checked ~ .grid-panel__tab-labels label[for="tab-filtry"],
#tab-razeni:checked ~ .grid-panel__tab-labels label[for="tab-razeni"] {
    color: var(--body-fg); border-bottom-color: var(--primary-dark);
}
.grid-panel__panes { padding: 14px 18px 4px; }
.grid-panel__pane { display: none; flex-direction: column; gap: 14px; max-height: 320px; overflow-y: auto; }
#tab-sloupce:checked ~ .grid-panel__panes .grid-panel__pane--sloupce,
#tab-filtry:checked ~ .grid-panel__panes .grid-panel__pane--filtry,
#tab-razeni:checked ~ .grid-panel__panes .grid-panel__pane--razeni { display: flex; }

.grid-panel__col-row, .grid-panel__sort-row {
    display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: .82rem;
    padding: 4px; border-radius: 7px;
}
.grid-panel__col-row:hover, .grid-panel__sort-row:hover { background: #fbf9f4; }
.grid-panel__col-row input[type="checkbox"], .grid-panel__sort-row input[type="checkbox"] { accent-color: var(--primary-dark); }
.grid-panel__col-row input[type="number"], .grid-panel__sort-row input[type="number"] {
    width: 56px; border: 1px solid var(--border-color); border-radius: 7px; padding: 3px 6px;
}
.grid-panel__sort-row { flex-wrap: wrap; cursor: grab; }
.grid-panel__sort-desc { font-size: .76rem; color: var(--muted-fg); white-space: nowrap; }

/* Přetahovatelné Řazení (Michal, 2026-09-19 - "podle těch čísel to
nejde moc poznat co kam se vlastně dá"), viz core/_grid_panel.html a JS
v dashboard/base.html. Zaškrtnuté (aktivní v řazení) řádky zvýrazněné,
ať je vidět, které z nich se vůbec počítají - nezaškrtnuté jde pořád
přetahovat/zaškrtnout později, jen se v řazení neuplatní. */
.grid-panel__sort-list { display: flex; flex-direction: column; gap: 2px; }
.grid-panel__sort-row.is-active { background: var(--accent-amber-bg); }
.grid-panel__sort-row.is-dragging { opacity: .4; }
.grid-panel__sort-handle { color: var(--ink-faint); cursor: grab; font-size: .95rem; line-height: 1; }
.grid-panel__sort-check { display: flex; align-items: center; gap: 6px; flex: 1; min-width: 0; cursor: pointer; }

/* Michal, 2026-09-15 - "v zájmu úspory místa dej název a kolonky vedle
sebe" (screenshot) - label a pole ZPĚT na jeden řádek (ne pod sebou jako
v prvním kole redesignu podle mockupu) - hodně filtrů na výšku panelu se
jinak moc roluje. Label má pevnou šířku, pole/rozsah zabere zbytek. */
.grid-panel__filter-row { display: flex; flex-direction: row; align-items: center; gap: 10px; font-size: .82rem; }
.grid-panel__filter-label { flex: 0 0 108px; font-size: .8rem; font-weight: 700; color: var(--muted-fg); }
.grid-panel__filter-row > select,
.grid-panel__filter-row > input,
.grid-panel__filter-row > .grid-panel__daterange { flex: 1 1 auto; min-width: 0; }
.grid-panel__filter-row input, .grid-panel__filter-row select {
    /* Michal, 2026-09-15 - zaoblení "jako pilulky se stínem" na tak
    nízkých polích (screenshot) - `--radius-field` (16px, pro prostornější
    modalová pole) je na tuhle hustou lištu moc, `--radius-md` (10px)
    pořád vypadá měkčeji než původních 7px, ale nebalí se do pilulky. */
    border: 1px solid var(--border-color); border-radius: var(--radius-md); padding: 7px 10px; font-size: .8rem;
    width: 100%; color: var(--body-fg); font-family: inherit;
    /* Michal, 2026-09-16 - "mám mít jednoduché zakulacené kolonky, ty
    máš teď stínované": na Windows 11 kreslí Chromium select/date/number
    natívně přes vlastní "Fluent" styl (jemný stín/gradient navíc k
    naší border/radius výš) - `appearance: none` to natívní kreslení
    vypne, zbyde jen náš plochý vzhled. `background` explicitně, ať
    appearance:none nesundá i barvu pozadí. */
    appearance: none; -webkit-appearance: none; background: var(--surface-bg); box-shadow: none;
}
.grid-panel__filter-row select {
    /* appearance:none výš sundá i nativní šipku - vlastní plochá SVG
    šipka místo ní (stejný princip jako `.status-pill` výš, jen bez
    obarvení podle hodnoty). */
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%238a8578' stroke-width='1.4' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
    background-repeat: no-repeat; background-position: right 10px center; padding-right: 28px;
}
.grid-panel__daterange { display: flex; align-items: center; gap: 8px; }
.grid-panel__daterange-sep { color: var(--ink-faint); font-size: .8rem; }
.grid-panel__daterange input[type="number"] { width: 100%; }
.grid-panel__date-input { position: relative; flex: 1; display: flex; align-items: center; min-width: 0; }
.grid-panel__date-input input { padding-right: 30px; }
/* Nativní kalendářní ikonka input[type=date] (Chromium) je i po
appearance:none pořád vykreslená a v ní se dřív "stínovaný" vzhled
projevoval nejvíc - `opacity: 0` ji schová, ale nechá klikatelnou
(potřebné, protože vlastní ikonka pod ní má `pointer-events: none`,
klik tak musí propadnout právě na tenhle skrytý nativní prvek).

Michal, 2026-09-16 - "ty ikonky jsou hluché": v Chromiu `appearance: none`
na `input[type=date]`/`[type=datetime-local]` VYPÍNÁ i klikatelnost té
schované nativní ikonky pod touhle vlastní SVG (ne jen její vzhled) -
propad kliku skrz `pointer-events:none` tak neměl na co dopadnout.
Oprava (dashboard/base.html) - vlastní ikonka je teď SAMA klikatelná
(`pointer-events: auto`) a JS na klik zavolá `input.showPicker()`
(moderní API), místo spoléhání na mrtvý nativní prvek pod ní. */
.grid-panel__date-input input::-webkit-calendar-picker-indicator { opacity: 0; }
.grid-panel__cal-icon {
    position: absolute; right: 9px; width: 14px; height: 14px; color: var(--ink-faint);
    cursor: pointer;
}
/* Michal, 2026-09-16 - "ikonka kalkulačky má oranžový hover efekt, to by
mohla mít i ikonka na datumových inputech" - stejná barva jako
`.calc-input__trigger:hover` výš. */
.grid-panel__date-input:hover .grid-panel__cal-icon,
.datetime-field:hover .grid-panel__cal-icon { color: var(--primary-dark); }

.grid-panel__apply { padding: 4px 18px 16px; }
.grid-panel__apply .btn { width: 100%; text-align: center; }

/* Tinted "kartička" na spodku panelu, ať se vizuálně odliší od filtrů
nad ní (mockup `.views-footer`). */
.grid-panel__saved-views {
    border-top: 1px solid var(--border-color); background: #fbfaf7;
    padding: 12px 18px; display: flex; flex-direction: column; gap: 8px;
}
.grid-panel__saved-views-label {
    font-size: .68rem; font-weight: 700; letter-spacing: .05em; text-transform: uppercase;
    color: var(--ink-faint);
}
.grid-panel__saved-views-list { display: flex; flex-wrap: wrap; gap: 6px; }
.grid-panel__saved-view {
    display: inline-flex; align-items: center; gap: 4px;
    background: var(--surface-bg); border: 1px solid var(--border-color); border-radius: 999px;
    padding: 4px 5px 4px 11px; font-size: .78rem; font-weight: 600;
}
.grid-panel__saved-view a { color: var(--body-fg); text-decoration: none; }
.grid-panel__saved-view a:hover { color: var(--primary-dark); }
.grid-panel__saved-view button {
    border: none; background: none; color: var(--ink-faint); cursor: pointer; font-size: .9rem; line-height: 1; padding: 2px 5px;
}
.grid-panel__saved-view button:hover { color: var(--error); }
.grid-panel__save-as { display: flex; gap: 6px; }
.grid-panel__save-as input {
    flex: 1; border: 1px solid var(--border-color); border-radius: var(--radius-md); padding: 6px 10px; font-size: .78rem;
    appearance: none; -webkit-appearance: none; background: var(--surface-bg); box-shadow: none;
}
.grid-panel__hidden-form { display: none; }

/* --- Formuláře --- */

.form-card {
    background: var(--surface-bg);
    border: 1px solid var(--border-color);
    border-radius: 10px;
    padding: 24px;
    max-width: 640px;
}
/* Nadpis oddílu uvnitř delšího formuláře (core.NumberSeriesForm -
"Připojené texty", core.DocumentPrintSettingForm - "Nastavení tisku") -
stejný vzor jako "Editovat záznam" ve starém IS (collapsible sekce,
tady vědomě bez collapse, jen vizuální oddělení nadpisem). */
.form-section-heading {
    margin: 24px 0 4px;
    padding-top: 16px;
    border-top: 1px solid var(--border-color);
    font-size: .95rem;
}
/* Záložka Nastavení tisku (documents/document_detail.html) - checkboxy
vlevo + klikatelná ikonka PDF vpravo (otevře PDF, Michalův bugreport
"nejde na ni kliknout" - dřív jen dekorativní jako ve starém IS).
`width: 32px` - normální velikost ikony, ne přes celou kartu (SVG bez
vlastního width/height v `<svg>` atributu spoléhá čistě na CSS, a bez
shody selektoru "spadne" na intrinzitní výchozí 300x150px - proto
selektor musí být specifičtější než obecné `a.pdf-link .pdf-icon`
níž).

`.print-setting-card` - Michalův bugreport "udělej užší ten celý box,
zprava ho ukonči za roletkama": `.card--narrow` (900px) je sdílená se
záložkou Detail (širší pole - Zákazník/Realizace autocomplete), tady je
vlastní užší max-width JEN pro tenhle box (label 130px + gap 10px +
select max-width 220px + padding karty 2×20px = 380px, +40px rezerva). */
.print-setting-card { max-width: 420px; }
.print-setting-top {
    display: flex;
    align-items: center;
    /* PŮVODNĚ `justify-content: space-between` - v širší kartě (form-card
    max-width 640px) roztáhlo ikonku až k pravému okraji, daleko od
    checkboxů (Michalův bugreport "mrkni na tu díru mezi ikonkou a
    checkboxy"). `flex-start` + `gap` drží ikonku hned vedle checkboxů,
    přesně jako na Michalově screenshotu starého IS. */
    justify-content: flex-start;
    gap: 24px;
    background: var(--body-bg);
    border-radius: var(--radius-sm);
    padding: 12px 16px;
    margin-bottom: 8px;
}
.print-setting-checkboxes .form-row { margin-bottom: 8px; }
.print-setting-top a.pdf-link .pdf-icon { width: 32px; height: auto; flex: 0 0 auto; }
/* Michal (2026-09-07): "cílem je v apce co nejméně scrolovat a hledat
věci... co nejméně prázdných ploch" + přímé srovnání se starým IS
("vyhovuje mi velikost old IS") - zmenšeno napříč CELOU apkou (`.form-row`
je sdílená přes core/_form_field.html, ne per-obrazovka), ne jen na
Nastavení tisku, kde si toho všiml. Font `.82rem`/padding `3px 8px`
sedí na stejnou hustotu jako `table.list` (hlavní gridy). `font-family`
BEZ vlastního přepisu (dědí systémový font z `body`) - krátký pokus s
Carlito po Michalově zpětné vazbě "ten font není dobrý... dělá různě
velká čísla" vrácen. */
.form-row { margin-bottom: 10px; }
.form-row label {
    display: block;
    font-size: .8rem;
    font-weight: 600;
    margin-bottom: 2px;
}
.form-row input[type=text], .form-row input[type=email], .form-row input[type=url],
.form-row input[type=number], .form-row input[type=date], .form-row input[type=password],
.form-row input[type=datetime-local],
.form-row textarea, .form-row select,
/* "Živé buňky" v popup kartách Poptávky/Výroby (Michal, 2026-09-19 -
"Grafiku inputů sjednoť s naším konceptem") - `_inquiry_detail_modal.html`/
`_production_detail_modal.html` mají pole rovnou v `<table class="report">`
buňkách, ne v `.form-row`, takže jim tahle společná pravidla scházela a
zůstávala na čistě nativním vzhledu prohlížeče. */
.modal-form__body table.report input[type=text], .modal-form__body table.report input[type=email],
.modal-form__body table.report input[type=url], .modal-form__body table.report input[type=number],
.modal-form__body table.report input[type=date], .modal-form__body table.report input[type=password],
.modal-form__body table.report input[type=datetime-local],
.modal-form__body table.report textarea, .modal-form__body table.report select {
    width: 100%;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-field);
    padding: 3px 8px;
    font-size: .82rem;
    font-family: inherit;
}
/* Michal, 2026-09-16 - "Upozornění" (core.event_forms.EventCreateForm.
reminder_at, `<input type="datetime-local">`) "nezapadá" mezi ostatní
zaoblená pole (core/_event_form.html screenshot) - chybělo v seznamu
výš, takže zůstávalo čistě na nativním vzhledu prohlížeče (jiná výška/
zaoblení než okolní pole). `appearance: none` navíc odstraní stejný
Windows 11 "Fluent" stín/rámeček jako u `.grid-panel__filter-row`
polí výš. */
.form-row input[type=datetime-local] { appearance: none; -webkit-appearance: none; }
/* core/_form_field.html datetime-local větev výš - stejný vzor jako
`.grid-panel__date-input` ve filtr panelu: vlastní plochá ikonka navrch,
nativní schovaná (`opacity:0`), klik pořád propadne skrz na ni. */
.datetime-field { position: relative; display: flex; align-items: center; }
.datetime-field input[type=datetime-local] { padding-right: 30px; }
.datetime-field input[type=datetime-local]::-webkit-calendar-picker-indicator { opacity: 0; }
/* Michal, 2026-09-16 - "mně se ten hover na kalendářní ikonce neukazuje":
tohle je OBECNÉ `type=date` pole mimo filtr panel/Faktura/`.datetime-field`
(ty mají vlastní specifičtější pravidlo jinde) - typicky HR pole na
záložce Zaměstnanec (Datum narození/nástupu/ukončení). Stejná plochá
SVG ikonka + jantarový hover jako všude jinde, čistě CSS (background-
image na holém inputu, žádná šablona navíc) - `.document-form--faktury`/
`.grid-panel__date-input`/`.datetime-field` pravidla mají vyšší
specificitu, takže tam, kde JSOU, tohle obecné pravidlo přebijí beze
změny chování. */
.form-row input[type=date], .modal-form__body table.report input[type=date] {
    appearance: none; -webkit-appearance: none;
    padding-right: 28px;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2398a2b5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='16' rx='2'/%3E%3Cpath d='M8 3v4M16 3v4M3 10h18'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 8px center;
    background-size: 13px;
}
.form-row input[type=date]::-webkit-calendar-picker-indicator,
.modal-form__body table.report input[type=date]::-webkit-calendar-picker-indicator { opacity: 0; }
.form-row input[type=date]:hover, .modal-form__body table.report input[type=date]:hover {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23c97a2e' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='16' rx='2'/%3E%3Cpath d='M8 3v4M16 3v4M3 10h18'/%3E%3C/svg%3E");
}
.form-row textarea, .modal-form__body table.report textarea { border-radius: var(--radius-field-textarea); }
/* Label vlevo (pevná šířka) + pole vpravo, MÍSTO výchozího label-nahoře -
core/_form_field.html `row_class="form-row--inline"` (design-instrukce-
komentare.md, core/_event_form.html Nadpis/Upozornění/Stav/Pro uživatele/
Typ) - stejný vzor jako `.grid-panel__filter-row`/`.grid-panel__filter-label`
(108px), volitelný modifikátor NEMĚNÍ výchozí chování ostatních formulářů. */
.form-row--inline { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 10px; }
.form-row--inline > label { flex: 0 0 108px; margin-bottom: 0; }
.form-row--inline > select, .form-row--inline > input, .form-row--inline > textarea,
.form-row--inline > .calc-input, .form-row--inline > .ac, .form-row--inline > .field-with-add,
.form-row--inline > .chip-multiselect, .form-row--inline > .status-dropdown {
    flex: 1 1 auto; min-width: 0;
}
.form-row--inline > .help-text, .form-row--inline > .errorlist { flex-basis: 100%; margin-left: 118px; }
.form-row .checkbox-row { display: flex; align-items: center; gap: 8px; }
.form-row .checkbox-row input { width: auto; }
.form-row .help-text { color: var(--muted-fg); font-size: .8rem; margin-top: 4px; }
/* Potvrzení po "Uložit a další" (documents/_document_line_form_modal.html) -
mimo `.form-row`, proto vlastní barva místo dědění z pravidla výš. */
.help-text--success { color: var(--success-fg, #1a7f37); font-weight: 600; margin-bottom: 10px; }
.form-row .errorlist {
    list-style: none;
    color: var(--error);
    font-size: .8rem;
    margin: 4px 0 0;
    padding: 0;
}
.form-actions { display: flex; gap: 10px; margin-top: 20px; }
.checkbox-group { display: flex; gap: 16px; flex-wrap: wrap; }

/* --- Popup formuláře (core.views.ModalFormMixin, dashboard/base.html) --- */

dialog.app-modal {
    /* Explicitní fixed + transform střed - Michalův bug (popup utíká přes
    horní okraj okna) - spoléhat na výchozí `dialog:modal { inset-block:0;
    margin:auto }` centrování prohlížeče u vysokého obsahu je křehké,
    tohle je odolnější varianta nezávislá na výšce obsahu. */
    position: fixed;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    margin: 0;
    padding: 0;
    border: none;
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-md);
    width: min(640px, 92vw);
    max-height: 88vh;
    /* Dialog SÁM nescrolluje - viz #app-modal-content níž. `position:
    sticky` hlavička/patička uvnitř scrollovaného <dialog> byla nespolehlivá
    (Michalův bug - pole utíkalo nad okraj okna při scrollování) - tohle
    je odolnější vzor: header/footer jsou MIMO scrollovanou oblast, ne
    "přilepené" uvnitř ní. */
    overflow: hidden;
}
dialog.app-modal::backdrop { background: rgba(0,0,0,.45); }
/* Menší varianta pro krátké potvrzovací dialogy (#unsaved-changes-dialog) -
neroztahovat na 640px, když je uvnitř jen pár vět + tlačítka. Vlastní
`.confirm-dialog__*` třídy (ne `.modal-form__*`, viz komentář v
dashboard/base.html) - vizuálně stejné, jen jiné jméno. */
dialog.app-modal--small { width: min(420px, 90vw); }
/* "Přidat komentář/úkol" (core/_event_form.html) - Michal, 2026-09-16
(mockup): štítky NAD poli výš ho udělaly vyšší, ale sdílený `#app-modal`
dialog zůstával na výchozí 640px šířce, takže pole zbytečně natažená
přes celou šířku pořád vypadala "na šířku". Obsah je vyměňovaný přes
HTMX BEZ přidání vlastní třídy na `<dialog>` (jen `#app-modal-content`
uvnitř se mění) - `:has()` proto cílí podle toho, CO uvnitř momentálně
je, stejný princip jako `.event-form:has(input...)` níž, jen tady na
úrovni celého dialogu. */
dialog.app-modal:has(.event-form) { width: min(420px, 92vw); }
/* "Seznam Výzev k úhradě / DDPP" (documents/invoice_deduction_pick.html
`.deduction-pick`) - Michal, 2026-09-16: tabulka má 9 sloupců (Vybrat/
Doklad č./Typ/Zákazník.../Cena/Zaplaceno/Zbývá/Vystaveno/Splatnost),
výchozích 640px stačilo jen s vodorovným rolováním - širší, ať se
vejde bez scrollu. */
dialog.app-modal:has(.deduction-pick) { width: min(920px, 95vw); }

/* Lightbox pro miniaturu "Logo" na gridu (inventory.part_list.html,
core.templatetags.core_extras) - `<dialog>` PŘEDRENDEROVANÝ per řádek
(žádné HTMX), stejný princip jako documents/document_detail.html
"line-assign-{{ line.pk }}". Vlastní varianta, ne `.modal-form__*` -
žádná hlavička/patička, jen obrázek + zavírací × v rohu. */
dialog.app-modal--image {
    width: auto; max-width: 92vw; background: transparent; box-shadow: none;
    /* Základní `dialog.app-modal` má `overflow: hidden` (potřeba pro
    scrollovaná těla formulářů) - tady by ale ořízlo zavírací × ležící
    kousek MIMO obrázek (Michalův bug - křížek byl skoro neviditelný,
    schovaný pod okrajem dialogu). */
    overflow: visible;
}
.image-lightbox { position: relative; line-height: 0; }
.image-lightbox img { max-width: 92vw; max-height: 88vh; border-radius: var(--radius-md); display: block; }
.image-lightbox__close {
    position: absolute; top: -14px; right: -14px;
    width: 32px; height: 32px; border-radius: 50%;
    background: var(--secondary); color: #fff; border: none;
    font-size: 1.1rem; line-height: 1; cursor: pointer;
}

/* Miniatura v gridu (sloupec "Logo") - malý čtverec, ostříznuté podle
poměru stran, kurzor prstu (otevírá lightbox výš). */
.grid-thumb {
    width: 40px; height: 40px; object-fit: cover; border-radius: var(--radius-sm);
    cursor: pointer; display: block;
}
.confirm-dialog__header {
    display: flex; align-items: center; justify-content: space-between;
    background: var(--secondary); color: #fff;
    padding: 14px 20px;
}
.confirm-dialog__header h2 { margin: 0; font-size: 1.05rem; }
.confirm-dialog__body { padding: 20px; }
.confirm-dialog__body p { margin: 0; }
.confirm-dialog__footer {
    display: flex; gap: 10px; flex-wrap: wrap;
    padding: 14px 20px;
    border-top: 1px solid var(--border-color);
}
#app-modal-content {
    display: flex; flex-direction: column; max-height: 88vh;
}
#app-modal-content form {
    display: flex; flex-direction: column; min-height: 0; flex: 1;
}
/* Michal, 2026-09-16 - "mrkni kde všude v popupech máš tu černou
hlavičku a předělej ji do nového redesignu": světlá hlavička (dřív
`.modal-form__header--light` modifikátor jen pro core/_event_form.html/
_event_update_form.html + documents/_document_form_modal.html) je teď
VÝCHOZÍ pro VŠECHNY popupy v appce (desítky šablon - FkBrowse "Vybrat",
Bankovní alokace, Sklad/Majetek/Party/Realizace formuláře atd.), ne jen
pro pár vybraných - modifikátor tím padá, tenhle vzhled je teď jediný.
Třída `modal-form__header--light` v pár šablonách, co ji ještě mají,
zůstává neškodně bez efektu (stejný vzhled jako základ). */
.modal-form__header {
    display: flex; align-items: center; justify-content: space-between;
    background: var(--surface-bg); color: var(--body-fg);
    border-bottom: 1px solid var(--border-color);
    padding: 14px 20px;
    flex: 0 0 auto;
    /* Tažením posouvatelné (dashboard/base.html "mousedown" na hlavičce,
    feedback od Michala - "chci si s ním posunout, ať vidím co je pod
    ním"). */
    cursor: move;
    user-select: none;
}
.modal-form__header h2 { margin: 0; font-size: 1.05rem; }
.modal-form__close {
    background: none; border: none; color: var(--muted-fg); cursor: pointer;
    font-size: 1.3rem; line-height: 1; padding: 2px 6px;
}
.modal-form__close:hover {
    color: var(--body-fg); background: var(--body-bg); border-radius: var(--radius-sm);
}
.modal-form__body { padding: 20px; flex: 1; overflow-y: auto; min-height: 0; }
.modal-form__footer {
    display: flex; gap: 10px;
    padding: 14px 20px;
    border-top: 1px solid var(--border-color);
    flex: 0 0 auto;
}
.modal-form__section {
    margin-top: 16px; border-top: 1px solid var(--border-color); padding-top: 12px;
}
.modal-form__section summary { cursor: pointer; font-weight: 600; color: var(--secondary); }
.checkbox-list {
    max-height: 220px; overflow-y: auto;
    border: 1px solid var(--border-color); border-radius: 6px;
    padding: 8px; margin-top: 6px;
}
.checkbox-list .checkbox-row { padding: 3px 0; }

/* Popisek a pole VEDLE SEBE, ne pod sebou (feedback od Michala + jeho
screenshot starého IS) - v popupu šetří dost výšky, plnostránkové
formuláře (.form-card) tím zatím vědomě neprocházejí, tam to zatím
nevadilo. CSS grid, ne flex (flex:1+width:100% na vnořených prvcích
typu .calc-input/.field-with-add se chovaly nepředvídatelně - zbytečná
mezera vpravo a skákající vodorovný scrollbar, Michalův bug) - grid
"1fr" sloupec se natáhne spolehlivě a `min-width:0` na položkách brání
tomu, aby si vnořený obsah vynutil širší sloupec, než je k dispozici. */
.modal-form__body .form-row,
.form-card--dense .form-row {
    display: grid;
    grid-template-columns: 130px 1fr;
    align-items: center;
    column-gap: 10px;
    row-gap: 2px;
    margin-bottom: 5px;
}
.modal-form__body .form-row > label,
.form-card--dense .form-row > label {
    margin-bottom: 0;
}
.modal-form__body .form-row > *,
.form-card--dense .form-row > * { min-width: 0; }
.modal-form__body .form-row > .checkbox-row,
.form-card--dense .form-row > .checkbox-row { grid-column: 1 / -1; }
.modal-form__body .form-row > .help-text,
.modal-form__body .form-row > .errorlist,
.form-card--dense .form-row > .help-text,
.form-card--dense .form-row > .errorlist {
    grid-column: 2;
}

/* Souhrnný řádek nad záložkami na detailu se záložkami (feedback od
Michala k Realizaci, "líbí se mi, že je stále vidět hlavní řádek ze
seznamu") - `position: sticky` ho drží nahoře i při scrollování dlouhého
tabu, dokud nedojde na konec `.page` (žádný rodič nemá `overflow`
omezené, takže sticky funguje vůči celé stránce, ne jen vlastnímu
kontejneru). Obecná třída (ne jen Realizace) - stejný vzor teď používá
i documents/document_detail.html, viz "koncept grafiky UI bych opět
zvolil se záložkami jak v realizacích, toto jednotné UI lze používat
celkem často" (Michal). */
.detail-summary-bar {
    position: sticky;
    top: 0;
    z-index: 5;
    background: var(--body-bg);
    padding-top: 4px;
    margin-bottom: 14px;
    box-shadow: 0 2px 4px rgba(33,37,41,.06);
}
.detail-summary-bar table.list { margin: 0; }

/* Pás KPI karet na Detailu Realizace (Michal, 2026-09-19 - "ten info
stavový řádek se mi líbí a pak ty obdélníčky jsou pěkné přehledné",
mockup Detail realizace) - nahradil `.detail-summary-bar` tabulku jen na
Realizaci (documents/inventory tu tabulku dál používají beze změny).
Stejný sticky princip - zůstává vidět při scrollování dlouhého tabu. */
.realizace-kpi-bar {
    position: sticky;
    top: 0;
    z-index: 5;
    background: var(--body-bg);
    padding-top: 4px;
    margin-bottom: 14px;
}
/* Michal, 2026-09-19 - na širokém monitoru se karty roztahovaly přes
celou obrazovku, zatímco obsah pod nimi (`.detail-main-column` 900px +
gap 20 + `.card--checklist` 450px = 1370px) končí dřív - `.page` sám
max-width vědomě nemá (potřebují ho gridy s až 26 sloupci, Michalův
starší feedback), tohle je jen lokální omezení pro tenhle konkrétní pás
karet, ať navazuje na šířku obsahu pod ním. */
.realizace-kpi { display: grid; grid-template-columns: repeat(5, 1fr); gap: 12px; max-width: 1370px; }
.realizace-kpi__card {
    background: var(--surface-bg);
    border: 1px solid rgba(33,37,41,.05);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-sm);
    padding: 13px 15px;
}
.realizace-kpi__label {
    font-family: 'JetBrains Mono', monospace; font-size: .68rem; letter-spacing: .06em;
    text-transform: uppercase; color: var(--muted-fg);
}
.realizace-kpi__value { margin-top: 7px; font-size: 1.05rem; font-weight: 700; }
.realizace-kpi__value--link { color: var(--accent-blue-fg); }
.realizace-kpi__sub { margin-top: 3px; font-size: .72rem; color: var(--muted-fg); }
@media (max-width: 960px) {
    .realizace-kpi { grid-template-columns: repeat(2, 1fr); }
}

/* --- Detail se záložkami (realizace/realizace_detail.html - Detail/
Vyhodnocení/Příjmy/Výdaje/Kategorie/Dokumenty; documents/document_detail.html
- Detail/Položky/Platby/Vazby/Kategorie/Dokumenty), feedback od Michala:
"upravit dle stejné logiky jako popup formuláře", tzn. i tady hustý
grid label+pole vedle sebe (`.form-card--dense` výš), a serverem
renderované záložky (`?tab=`) místo JS - stejný princip jako
Vydané/Přijaté zkratky v sidebaru (dashboard/context_processors.py). */
/* Michal, 2026-09-19 - dřívější "connected tabs" efekt (záložky a panel
pod nimi jako JEDEN souvislý tvar - přesné zarovnání přes border-removal/
záporné margin/hranaté rohy, viz historie design-instrukce-zalozky.md) se
v provozu choval nešikovně (křehké, snadno se to "rozjelo" - viz
screenshot Michala 2026-09-19). Zjednodušeno: záložky jsou obyčejné
samostatné "pilulky" a panel pod nimi je normální `.card` se 4 zaoblenými
rohy - žádné mergování, žádné border-tricks. */
.tabs {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin-bottom: 18px;
    padding-left: 4px;
}
.tabs a {
    padding: 10px 16px;
    background: var(--body-bg);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-md);
    font-size: .88rem;
    font-weight: 700;
    color: var(--muted-fg);
    text-decoration: none;
}
.tabs a:hover { color: var(--body-fg); background: var(--surface-bg); }
.tabs a.is-active {
    background: var(--surface-bg);
    border-color: var(--primary);
    color: var(--primary-dark);
}

/* "+ Nový záznam" dropdown na detailu Realizace - stejný <details>
princip jako dashboard/_quick_links.html (žádné JS navíc potřeba). */
.new-record-menu { position: relative; display: inline-block; }
.new-record-menu > summary { list-style: none; }
.new-record-menu > summary::-webkit-details-marker { display: none; }
.new-record-menu__panel {
    position: absolute;
    top: 100%;
    left: 0;
    z-index: 20;
    background: var(--surface-bg);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-md);
    padding: 10px;
    min-width: 220px;
    margin-top: 4px;
    display: flex;
    flex-direction: column;
    gap: 2px;
}
.new-record-menu__panel a {
    display: block;
    padding: 6px 8px;
    border-radius: 6px;
    text-decoration: none;
    color: var(--body-fg);
    font-size: .88rem;
}
.new-record-menu__panel a:hover { background: var(--body-bg); }
/* Stejný panel použitý i pro "Hromadné akce" (core/_list_base.html přes
documents/document_list.html) - tam je položka <button type=submit>, ne
<a> (POSTuje formulář se zaškrtnutými řádky), ale má vypadat stejně. */
.new-record-menu__panel button {
    display: block; width: 100%; text-align: left; padding: 6px 8px;
    border-radius: 6px; border: none; background: none; cursor: pointer;
    color: var(--body-fg); font-size: .88rem; font-family: inherit;
}
.new-record-menu__panel button:hover { background: var(--body-bg); }
.new-record-menu__panel button.danger { color: var(--error); }
.new-record-menu__group-label {
    font-size: .72rem;
    text-transform: uppercase;
    color: var(--muted-fg);
    font-weight: 700;
    margin: 6px 0 2px;
    letter-spacing: .03em;
}
.new-record-menu__group-label:first-child { margin-top: 0; }

/* --- Tisk (core.PrintTemplate, Realizace tab "Tisk") - vytiskne se
JEN `.print-area`, zbytek stránky (sidebar, tabs, tlačítka...) se při
tisku skryje. `.no-print` navíc pro konkrétní prvky mimo `.print-area`
(výběr šablony, tlačítko Tisk samotné).

Fyzický štítkový arch (Michal) - A4 na šířku (landscape), na něm DVĚ
nálepky A5 vedle sebe (A4 landscape = 297×210mm, půlka na šířku =
148,5mm ≈ přesně šířka A5). `.print-area` je zafixovaná užší než
polovina archu (133mm místo 148,5mm), aby nekončila přesně uprostřed
strany a zůstala rezerva cca 10mm před druhou nálepkou (Michal:
"ať nekončí přesně uprostřed"). Navíc @page margin 5mm, aby štítek
nezačínal na úplné hraně papíru (Michal: "větší okraje o cca 5mm").
Vlevo nahoře = první ze dvou nálepek na archu, druhá polovina archu
zůstává prázdná. */
.print-area {
    max-width: 133mm;
    box-sizing: border-box;
}
@media print {
    @page { size: A4 landscape; margin: 5mm; }
    body * { visibility: hidden; }
    .print-area, .print-area * { visibility: visible; }
    .print-area {
        position: absolute; top: 0; left: 0;
        width: 133mm; height: 200mm;
        padding: 5mm;
    }
    .no-print { display: none !important; }
}

/* Checkbox + volitelná poznámka VEDLE něj (core/_routing_slip_form.html -
Michal: "kolonky které mají checkbox, ale také umožňují si dopsat další
poznámku za něj"). */
.checkbox-with-note__inputs { display: flex; align-items: center; gap: 8px; }
.checkbox-with-note__inputs input[type=checkbox] { flex: 0 0 auto; width: auto; }
.checkbox-with-note__inputs input[type=text] { flex: 1; }

/* --- Skupiny dokladů (Příjmy/Výdaje tab) - hlavička dokladu + odsazené
řádky napojených položek pod ní, stejný vizuální vzor jako starý IS
("počet položek na realizaci: N" + odsazený výpis). */
.doc-group { margin-bottom: 4px; }
.doc-group__header td { font-weight: 600; background: var(--body-bg); }
.doc-group__line td { color: var(--muted-fg); font-size: .85rem; }
.doc-group__line td:first-child { padding-left: 24px; }
/* Pole, co nepotřebují roztáhnout na celou šířku (feedback od Michala -
"zkrať ty políčka, ikonky kalendáře/kalkulačky pak nebudou tak daleko" a
o iteraci později "udělej to jen tak široké jak datum"/"nebude víc než
1 000 000 000,-"). Datum užší než číslo (fixní "dd.mm.rrrr" formát nemá
proč být širší), `.form-card--dense` navíc ke `.modal-form__body` -
stejné hustý-grid formuláře teď i mimo popup (Realizace Detail tab). */
.modal-form__body .form-row > select,
.form-card--dense .form-row > select {
    max-width: 220px;
}
/* Jednotka/Sazba DPH na položce dokladu (documents/doc_forms.py
LINE_FORM_FIELDS) - krátké hodnoty ("ks", "21%"), Michal: "roletku u
jednotky a sazby dph zkrať na polovinu" - poloviční max-width oproti
obecným selectům výš. */
.modal-form__body .form-row > select[name="unit"],
.modal-form__body .form-row > select[name="vat_rate"] {
    max-width: 110px;
}
/* Textové pole natažené na celý zbylý 1fr sloupec (~750px na 900px kartě)
vypadá na širokém monitoru prázdně pro krátké hodnoty jako "Test RD Novák"
(feedback od Michala - "tady ty okna taky zmenši klidně na půlku, zabírá
to moc místa a je to prázdné"). Textarea (Poznámka) VĚDOMĚ bez limitu -
tam se naopak víc místa na psaní hodí. */
.modal-form__body .form-row > input[type=text],
.modal-form__body .form-row > input[type=email],
.modal-form__body .form-row > input[type=url],
.form-card--dense .form-row > input[type=text],
.form-card--dense .form-row > input[type=email],
.form-card--dense .form-row > input[type=url] {
    max-width: 380px;
}
/* Stejný limit i na Zákazník-typu polí (core.widgets.AutocompleteSelect
`.ac`, "+ Nový" tlačítko vedle `.field-with-add`) - jinak by zůstaly
plné šířky, i když jejich obsah (input[type=text] výš) je teď užší. */
.modal-form__body .form-row > .ac,
.modal-form__body .form-row > .field-with-add,
.form-card--dense .form-row > .ac,
.form-card--dense .form-row > .field-with-add {
    max-width: 380px;
}
.modal-form__body .form-row > input[type=date],
.form-card--dense .form-row > input[type=date] {
    max-width: 150px;
}
/* Datum+čas ("dd.mm.rrrr --:--", inquiries.forms offer_sent_at) je delší
než čisté datum výš - stejný strop jako select (220px) mu na formát
stačí, beze zbytku prázdného 1fr sloupce navíc. */
.modal-form__body .form-row > input[type=datetime-local],
.form-card--dense .form-row > input[type=datetime-local] {
    max-width: 220px;
}
.modal-form__body .form-row > input[type=number],
.modal-form__body .form-row > .calc-input,
.form-card--dense .form-row > input[type=number],
.form-card--dense .form-row > .calc-input {
    max-width: 180px;
}
/* Peněžní pole (`.money-display`, core/_form_field.html `money=True`) -
o něco širší než čisté číslo (tisícové mezery zabírají místo navíc, "1
000 000 000,00" ~ 17 znaků) - `.calc-input--money` MUSÍ přebít obecné
`.calc-input` 180px výš (input uvnitř má `width:100%` obalu, takže
šířku ve skutečnosti řídí wrapper, ne `.money-display` samotné). */
.modal-form__body .form-row > .calc-input.calc-input--money,
.form-card--dense .form-row > .calc-input.calc-input--money {
    /* Michal: "zkrať ještě i kolonky pro ceny... pochybuju, že někdy
    budu mít položku, která bude více jak 9ti místná" - "999 999 999,00"
    (9místné číslo) se do 140px i s ikonkou kalkulačky pohodlně vejde,
    dřívějších 200px počítalo se zbytečnou rezervou na miliardy. */
    max-width: 140px;
}

/* Pole s "+ Nový" tlačítkem vedle (např. Zákazník na Realizaci - vnořené
založení core.Party, core.views.PartyCreateView.form_valid). */
.field-with-add { display: flex; gap: 8px; align-items: flex-start; }
.field-with-add > *:first-child { flex: 1; }

/* IČ + "Načíst z ARES" (parties/_party_form_fields.html, Michal
2026-09-16) - IČ vlastní úzké pole (má vždy jen pár číslic, netahat na
celou šířku řádku), tlačítko vedle na stejném řádku. */
.ico-with-ares { display: flex; align-items: center; gap: 8px; }
.ico-with-ares input { max-width: 140px; }

/* `.chip-btn` (eurodach-design-system.css "Chip buttons", zdroj pravdy
pro barvy/rozměry) - obecná šedá "pilulka" pro rychlé/vedlejší akce u
pole, doslovné hex hodnoty stejně jako u Faktury (`.quick-days`
button`/`.copy-date__apply` výš), ne app tokeny (viz jejich komentář,
proč se tam v minulém kole nešlo). Znovupoužitelná pro budoucí podobné
akce, ne jen "Načíst z ARES". */
.chip-btn {
    display: inline-flex; align-items: center; gap: 6px; flex-shrink: 0;
    font-size: 12px; font-weight: 700; color: var(--muted-fg);
    background: #eef0f3; border: 1px solid transparent;
    padding: 6px 12px; border-radius: 20px; cursor: pointer;
    min-height: 28px;
}
.chip-btn:hover { background: #e4e7eb; }
.chip-btn:disabled { opacity: .6; cursor: default; }
.chip-btn svg { width: 13px; height: 13px; }

/* Výsledek "Ověřit spolehlivost" (dashboard/base.html checkVatReliability,
parties/_party_form_fields.html). */
.vat-status {
    margin: 0; padding: 8px 12px; border-radius: var(--radius-sm);
    font-size: .82rem; font-weight: 600;
}
.vat-status--reliable { background: var(--accent-green-bg); color: var(--accent-green-fg); }
.vat-status--unreliable { background: var(--accent-red-bg); color: var(--accent-red-fg); }
.vat-status--unknown { background: var(--body-bg); color: var(--muted-fg); }

/* --- Kalkulačka (core/_form_field.html openCalc, dashboard/base.html) --- */

.calc-input { position: relative; display: flex; align-items: center; }
.calc-input input { padding-right: 32px !important; }
.calc-input__trigger {
    position: absolute; right: 4px;
    display: flex; align-items: center; justify-content: center;
    background: none; border: none; cursor: pointer; padding: 4px;
    color: var(--ink-faint);
}
.calc-input__trigger:hover { color: var(--primary-dark); }
/* Michal, 2026-09-16 - "udělej nové ikonky... podle nového konceptu
designu" - plochá SVG (dashboard/_icons/calculator.html) místo dřívějšího
emoji "🧮" (jiný vzhled napříč OS/prohlížeči, neladil s ostatními čistě
SVG ikonkami v appce - stejný důvod jako "📋"->SVG u Faktury dřív). */
.calc-input__icon { width: 15px; height: 15px; }
/* Vlastní -/+ tlačítka krokující po CELÝCH jednotkách (integer_step=True
v core/_form_field.html, feedback od Michala - "šipečky v buňce ať mění
celé jednotky, ne desetinná místa"). Nativní HTML5 šipky pole se skryjí
(jejich krok by kopíroval decimal_places, viz komentář v šabloně) -
`.calc-input__trigger` přestává být absolutně pozicovaná a jede v
normálním flex řádku spolu s -/+ tlačítky. */
.calc-input--step { gap: 4px; }
.calc-input--step input { padding-right: 8px !important; }
.calc-input--step .calc-input__trigger { position: static; }
.calc-input__step {
    flex: 0 0 auto; width: 26px; height: 30px;
    display: flex; align-items: center; justify-content: center;
    border: 1px solid var(--border-color); border-radius: 6px;
    background: var(--body-bg); color: var(--body-fg); cursor: pointer;
    font-size: 1rem; line-height: 1; padding: 0;
}
.calc-input__step:hover { background: var(--sidebar-active-bg); border-color: var(--primary); }
.calc-input--step input[type=number]::-webkit-inner-spin-button,
.calc-input--step input[type=number]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }
.calc-input--step input[type=number] { -moz-appearance: textfield; }

.calc-popup {
    position: fixed;
    z-index: 1000;
    background: var(--surface-bg);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-md);
    padding: 10px;
    width: 200px;
}
.calc-popup__expr {
    width: 100%; box-sizing: border-box; margin-bottom: 6px;
    border: 1px solid var(--border-color); border-radius: 6px;
    padding: 6px 8px; font-size: .95rem; text-align: right;
}
.calc-popup__grid {
    display: grid; grid-template-columns: repeat(4, 1fr); gap: 4px; margin-bottom: 8px;
}
.calc-popup__grid button {
    border: 1px solid var(--border-color); border-radius: 6px; background: var(--body-bg);
    padding: 6px 0; cursor: pointer; font-size: .9rem;
}
.calc-popup__grid button:hover { background: var(--sidebar-active-bg); }
.calc-popup__actions { display: flex; gap: 6px; }
.calc-popup__actions button { flex: 1; padding: 6px 0; font-size: .85rem; }

/* --- Autocomplete (core.widgets.AutocompleteSelect, HTMX) --- */

.ac { position: relative; }
.ac__input {
    width: 100%;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-field);
    padding: 5px 26px 5px 10px;
    font-size: .9rem;
    font-family: inherit;
}
/* "🔍 Vybrat ze seznamu" ikonka (core.views.FkBrowseView, feedback od
Michala - "nemůžu si vzpomenout na jméno... popup okno, ručně si ho
najít") - stejná pozice jako .calc-input__trigger (absolutně vpravo v
poli). */
.ac__browse {
    position: absolute; right: 4px; top: 50%; transform: translateY(-50%);
    background: none; border: none; cursor: pointer; font-size: .85rem; padding: 4px;
    line-height: 1;
}
/* `.ac__results` je v HTML VŽDY přítomné (core/widgets/autocomplete_select.html
- HTMX potřebuje stálý cíl pro `hx-target="next .ac__results"`), i když
zrovna nemá žádný obsah - `:empty` ho tak schová, jinak by (Michal,
2026-09-16 - "je pod inputem nějaká vodorovná čára") viselo prázdné pod
každým autocomplete polem napořád, protože samotný border/border-radius
pravidlo níž se nestará o to, jestli je uvnitř opravdu něco vykreslené. */
.ac__results:empty { display: none; }
.ac__results {
    position: absolute;
    z-index: 20;
    top: 100%;
    left: 0;
    right: 0;
    background: var(--surface-bg);
    border: 1px solid var(--border-color);
    border-top: none;
    border-radius: 0 0 8px 8px;
    max-height: 260px;
    overflow-y: auto;
    box-shadow: 0 6px 16px rgba(0,0,0,.08);
}
.ac__result {
    padding: 8px 10px;
    cursor: pointer;
    font-size: .9rem;
    border-bottom: 1px solid var(--border-color);
}
.ac__result:last-child { border-bottom: none; }
.ac__result:hover { background: var(--body-bg); }
/* core.autocomplete.REGISTRY "detail_fn" (zatím jen "part" - stav
skladu rovnou u výsledku, Michal poslal screeny starého IS). */
.ac__result-detail { color: var(--muted-fg); font-size: .82rem; }
.ac__empty {
    padding: 8px 10px;
    color: var(--muted-fg);
    font-size: .85rem;
}

/* --- Chip multi-select (core.widgets.ChipMultiSelect) - "Pro uživatele"
na core.event_forms.EventCreateForm, Michal 2026-09-15: "ten tvrdý
seznam kazí ten vzhled". Chips = .tag-chip (sdíleno s Kategorizací
výš), tenhle blok jen dropdown/input okolo. --- */
.chip-multiselect { position: relative; }
.chip-multiselect__chips:empty { margin-bottom: 0; }
.chip-multiselect__input {
    width: 100%;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-field);
    padding: 5px 10px;
    font-size: .9rem;
    font-family: inherit;
}
.chip-multiselect__dropdown {
    position: absolute;
    z-index: 20;
    top: 100%;
    left: 0;
    right: 0;
    margin-top: 2px;
    padding: 4px 0;
    background: var(--surface-bg);
    border: 1px solid var(--border-color);
    border-radius: 8px;
    max-height: 220px;
    overflow-y: auto;
    box-shadow: 0 6px 16px rgba(0,0,0,.08);
}
/* SKUTEČNÁ příčina "checkbox/ikonka/jméno pod sebou" (Michal, 2026-09-19) -
`.form-row label { display: block }` (výš, obecný styl popisku pole) má
VYŠŠÍ specificitu (třída+element) než prosté `.chip-multiselect__option`
(jen třída) a widget žije uvnitř `.form-row` ("Pro uživatele" pole) -
bez `.form-row` prefixu tady by ho to pravidlo přebilo, přesně tenhle
bug (ověřeno přes CSS.getMatchedStylesForNode v devtools). */
.form-row .chip-multiselect__option {
    display: flex;
    align-items: center;
    flex-wrap: nowrap;
    gap: 8px;
    padding: 6px 10px;
    cursor: pointer;
    font-size: .9rem;
}
.chip-multiselect__option input,
.chip-multiselect__option .avatar { flex: none; }
.chip-multiselect__option > span:last-child {
    min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* KRITICKÝ [hidden]+display bug (viz eurodach-pdf-import-ai-ostry-test-hotovo
paměť, stejná chyba už jednou opravená jinde v appce) - autorské `display:
flex` výš přebije prohlížečovo výchozí `[hidden] { display: none }` bez
ohledu na specificitu (autorský cascade origin > user-agent origin), takže
psaní do vyhledávacího pole (JS nastavuje `opt.hidden`) nic neschovávalo -
Michal, 2026-09-15: "začnu psát a nic se neděje". Explicitní pravidlo tady
je jediná spolehlivá oprava. */
.chip-multiselect__option[hidden] { display: none; }
.chip-multiselect__option:hover { background: var(--body-bg); }
.chip-multiselect__option input { margin: 0; }
/* Avatar s iniciálami (core_extras.initials) - mockup komentare-ukoly-
redesign.html, sdíleno mezi "Pro uživatele" (core/widgets/
chip_multiselect.html) a chat bublinami ve vlákně (core/_event_update_form.html
`.msg .avatar` výš, jiná velikost). */
.avatar {
    width: 21px; height: 21px; border-radius: 50%; flex-shrink: 0;
    background: var(--accent-blue-bg); color: var(--accent-blue-fg);
    font-size: 9px; font-weight: 800;
    display: flex; align-items: center; justify-content: center;
}

/* --- Strom Struktur/Uzlů (core.Structure/StructureNode) --- */

ul.tree {
    list-style: none;
    margin: 0;
    padding-left: 22px;
    border-left: 1px dashed var(--border-color);
}
ul.tree.tree--root { padding-left: 0; border-left: none; }
.tree-node { margin: 2px 0; }
.tree-node__row {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 6px 8px;
    border-radius: 6px;
}
.tree-node__row:hover { background: var(--body-bg); }
.tree-node__name { font-weight: 600; font-size: .92rem; flex: 1; }
.tree-node__delete { display: inline; margin: 0; }
.tree-node__delete-btn {
    background: none;
    border: none;
    padding: 0;
    cursor: pointer;
    color: var(--muted-fg);
    font-size: .85rem;
    text-decoration: none;
}
.tree-node__delete-btn:hover { color: var(--error); text-decoration: underline; }
.tree-node__inline-form { margin: 6px 0 6px 8px; display: flex; gap: 8px; }
.tree-node__inline-form input {
    border: 1px solid var(--border-color);
    border-radius: var(--radius-field);
    padding: 6px 8px;
    font-size: .85rem;
    min-width: 220px;
}

/* --- Kategorizace (core.Tag přes core_extras.categorization_panel) --- */

.categorization-block { margin-bottom: 18px; }
.categorization-block:last-child { margin-bottom: 0; }
.categorization-block h3 {
    font-size: .85rem;
    font-weight: 600;
    color: var(--muted-fg);
    text-transform: uppercase;
    letter-spacing: .02em;
    margin: 0 0 8px;
}
.tag-chips { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 10px; }
.tag-chip {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    background: var(--body-bg);
    border: 1px solid var(--border-color);
    border-radius: 20px;
    padding: 4px 6px 4px 12px;
    font-size: .85rem;
}
.tag-chip__remove-form { display: inline; margin: 0; }
.tag-chip__remove {
    background: none;
    border: none;
    padding: 0 4px;
    cursor: pointer;
    color: var(--muted-fg);
    font-size: 1rem;
    line-height: 1;
}
.tag-chip__remove:hover { color: var(--error); }

/* Křížek na vyčištění jednoho pole (Michal, 2026-09-14 - "Nabídka
odeslána" jde nastavit, ale ne vzít zpět) - stejná vizuální konvence
jako .tag-chip__remove/.grid-panel__clear výš (tlumené, červené na
hoveru), jen obecná pro libovolné "živé" pole v popupu. `#app-modal-content
form { flex-direction: column }` (viz výš) má vyšší specificitu než
prostá .třída - bez `#app-modal-content` prefixu tady by přebilo řádek
na sloupec a křížek by spadl POD pole (Michalův bugreport 2026-09-14 -
"takto pod to rozhazuje formátování"). */
#app-modal-content .inline-field-with-clear { display: flex; flex-direction: row; align-items: center; gap: 4px; }
.inline-field-clear {
    background: none;
    border: none;
    padding: 0 4px;
    cursor: pointer;
    color: var(--muted-fg);
    font-size: 1rem;
    line-height: 1;
}
.inline-field-clear:hover { color: var(--error); }
.tag-add-form { display: flex; gap: 8px; }
.tag-add-form select { flex: 1; max-width: 320px; }

/* --- Django messages framework (core/views.py akce, Platby/Zatřídění...) ---
Plovoucí "toast" vpravo nahoře (`position: fixed`), NE součást normálního
toku stránky (Michal - "objeví se a všechno pod tím odskočí dolů", časté
zvlášť teď s inline editací přímo v gridu, co dělá redirect+message po
KAŽDÉ změně). Samo zmizí po ~4,5 s (`messages-fade-out` níž), navíc jde
zavřít hned klikem (`onclick="this.remove()"` v base.html). NEDOTÝKÁ SE
to `.messages__item--*` tříd znovupoužitých MIMO tenhle plovoucí seznam
(např. banner visících nabídek v inquiries/inquiry_list.html), protože
`position: fixed` je na obalu `.messages`, ne na samotné `.messages__item`. */

.messages {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 8px;
    position: fixed;
    top: calc(var(--topbar-height) + 12px);
    right: 20px;
    z-index: 1000;
    width: calc(100% - 40px);
    max-width: 420px;
}
.messages__item {
    padding: 10px 14px;
    border-radius: var(--radius-sm);
    border: 1px solid var(--border-color);
    font-size: .9rem;
    background: var(--surface-bg);
    box-shadow: var(--shadow-md);
    cursor: pointer;
    animation: messages-fade-out .3s ease-in 4.5s forwards;
}
.messages__item--success { background: var(--success-bg); border-color: var(--success); color: #0F5132; }
.messages__item--error { background: var(--error-bg); border-color: var(--error); color: #842029; }
.messages__item--warning { background: #FFF4E0; border-color: var(--warning); color: #664D03; }

@keyframes messages-fade-out {
    to { opacity: 0; visibility: hidden; }
}

/* --- Zatřídění dokladu / Platby (documents/document_detail.html) --- */

.accounting-actions { display: flex; flex-wrap: wrap; gap: 16px; align-items: flex-end; }
.accounting-actions__form {
    display: flex; flex-wrap: wrap; gap: 10px; align-items: flex-end; margin-top: 10px;
}
.accounting-actions__form label {
    display: flex; flex-direction: column; gap: 4px; font-size: .85rem; color: var(--muted-fg);
}
.accounting-actions__form input, .accounting-actions__form select {
    border: 1px solid var(--border-color); border-radius: var(--radius-field); padding: 6px 8px; font: inherit;
}
.accounting-actions__form textarea {
    border: 1px solid var(--border-color); border-radius: var(--radius-field-textarea); padding: 6px 8px; font: inherit;
}

/* --- Rychlé dopočítání data (+7/+14/+30/+60), dashboard/base.html "quick-days" --- */

.quick-days { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin-top: 6px; }
.quick-days button {
    background: var(--body-bg); border: 1px solid var(--border-color); border-radius: 6px;
    padding: 4px 9px; font-size: .82rem; font-weight: 600; color: var(--body-fg); cursor: pointer;
}
.quick-days button:hover { background: var(--sidebar-active-bg); border-color: var(--primary); }
/* `.copy-date__apply` (core/_document_form_fields.html, VŠECHNY typy
dokladů - Faktura/DDPP/Výzvy/Objednávky, ne jen Faktura) má SVG ikonku
místo dřívějšího emoji "📋" - bez vlastní velikosti se vykreslí v
intrinzní (obří) velikosti SVG viewboxu (Michal, 2026-09-16 - "u Výzvy
k úhradě máš taky tu chybu s velikostní ikonky", stejná chyba jako dřív
u Faktury, jen tahle obecná oprava byla omylem jen ve `.document-form
--faktury` scope, ne tady, kde platí pro úplně všechny typy). */
.copy-date__apply { display: inline-flex; align-items: center; gap: 6px; }
.copy-date__apply svg { width: 13px; height: 13px; flex-shrink: 0; }
/* `.modal-form__body .form-row` výš (obecné `input[type=number]{width:100%}`)
nově vyhrává specificitou nad tímhle - Michal, 2026-09-16 (4. kolo):
zarovnání gray tlačítek do sloupce polí (`_document_form_fields.html`
"form-row s prázdnou první buňkou") tenhle input nově vnořilo DO
`.form-row`, takže na něj ta obecná pravidla nově dosáhnou. Vyšší
specificita (3 třídy) místo `!important`. */
.modal-form__body .form-row .quick-days__custom,
.form-card--dense .form-row .quick-days__custom {
    /* Michal, 2026-09-16 (4. kolo) - "to se tam vleze, stačí když bude
    malé": užší, ať se vejde na stejnou řádku jako +7/+14/+30/+60,
    místo zalomení na vlastní řádek jen kvůli téhle jedné kolonce. */
    width: 44px;
}
.quick-days__custom { border: 1px solid var(--border-color); border-radius: 6px; padding: 4px 6px; }

/* --- "Nový doklad: Faktura" - nový vizuál (Michal 2026-09-16, zdroj
pravdy `eurodach-modal-forms.css` - PŘESNÉ hodnoty vytažené z mockupů,
ne vlastní odvozená obdoba). Zatím JEN Faktura (documents/
_document_form_modal.html `document-form--faktury` třída), ne plošně
na ostatní typy dokladů.

3. kolo (Michal - "pořád se ti to nedaří, přikládám soubor jako zdroj
pravdy") odhalilo, že několik hodnot, co jsem předtím "přeložil" na
existující tokeny appky, se ve skutečnosti LIŠÍ od mockupu, i když
vypadaly podobně:
  - šedá chipů/přepínače je `#eef0f3` (studenější šedá), NE
    `var(--body-bg)`/`var(--accent-amber-bg)` apod. z appky (krémové/teplé)
  - `.info-note` pozadí je `#fbf9f4`, ne `var(--body-bg)`
  - padding polí je `8px 13px` (vzdušnější), appka měla `3px 8px`
    (hustý grid pro tabulkové doklady - jinam patřičné, sem ne)
  - `.chip-btn` má `min-height: 28px` (jinak "+7" vs "Přičíst" v
    jedné řadě vypadá nerovnoměrně)
Hodnoty níž jsou proto OPSANÉ 1:1 z toho souboru (barvy jako doslovné
hex, ne přes appce vlastní CSS proměnné), přesně podle instrukce
"barvy a rozměry v tomto souboru jsou zdroj pravdy". --- */

/* Užší popup (480px, MÍSTO výchozích 640px) + širší štítkový sloupec
(150px, MÍSTO 130px u ostatních hustých popupů) - `:has()`/specificita
3 tříd stejný trik jako u `.event-form` výš. */
dialog.app-modal:has(.document-form--faktury) { width: min(480px, 92vw); }
.document-form--faktury .modal-form__body .form-row {
    grid-template-columns: 150px 1fr;
    margin-bottom: 12px; row-gap: 6px;
}
.document-form--faktury .modal-form__body .form-row > label { line-height: 1.35; }

/* Vzdušnější pole (8px/13px, MÍSTO hustých 3px/8px pro tabulkové
doklady) - input/select/textarea přímo v řádku. */
.document-form--faktury .modal-form__body .form-row > input[type=text],
.document-form--faktury .modal-form__body .form-row > input[type=date],
.document-form--faktury .modal-form__body .form-row > input[type=number],
.document-form--faktury .modal-form__body .form-row > select {
    padding: 8px 13px;
}
/* `.ac__input` (core.widgets.AutocompleteSelect) má napravo vlastní
"🔍 Vybrat ze seznamu" tlačítko (`.ac__browse`, dashboard.css výš,
26px vyhrazeného místa) - stejné zvětšení jen na zbylých třech stranách,
ať se ikonka nepřekryje s textem. */
.document-form--faktury .modal-form__body .form-row > .ac .ac__input {
    padding: 8px 26px 8px 13px;
}
.document-form--faktury .modal-form__body .form-row input:focus,
.document-form--faktury .modal-form__body .form-row select:focus,
.document-form--faktury .modal-form__body .form-row textarea:focus {
    outline: none; border-color: #e8963c; box-shadow: 0 0 0 3px rgba(232,150,60,.15);
}

/* Vlastní plochá šipka na selectu (appearance:none) - stejný důvod jako
`.grid-panel__filter-row select` výš (Windows 11 "Fluent" natívní stín),
přesný SVG tvar/pozice/velikost z `eurodach-modal-forms.css`. */
.document-form--faktury .modal-form__body .form-row > select {
    appearance: none; -webkit-appearance: none;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%2398a2b5' stroke-width='2.5'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 12px center;
    padding-right: 32px;
    box-shadow: none;
}

/* Kalendářní ikonka na KAŽDÉM datumovém poli (Datum vystavení/splatnosti/
DUZP/fyz. přijetí) - čistě CSS pozadí (`background-image`), žádná změna
šablony/HTML potřeba. */
.document-form--faktury .modal-form__body .form-row > input[type=date] {
    padding-right: 38px;
    appearance: none; -webkit-appearance: none;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2398a2b5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='16' rx='2'/%3E%3Cpath d='M8 3v4M16 3v4M3 10h18'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 12px center;
    background-size: 15px;
}
/* appearance:none výš schová celý nativní vzhled VČETNĚ kalendářní
ikonky u některých prohlížečů, ale ne spolehlivě u všech (Chromium na
type=date si `::-webkit-calendar-picker-indicator` drží jako vlastní
prvek dál) - `opacity:0` navíc, ať se nezdvojí s vlastní SVG ikonkou. */
.document-form--faktury .modal-form__body .form-row > input[type=date]::-webkit-calendar-picker-indicator {
    opacity: 0;
}
/* Michal, 2026-09-16 - "ikonka kalkulačky má oranžový hover efekt, to by
mohla mít i ikonka na datumových inputech" - ikonka je tu jen CSS pozadí
(background-image), ne samostatný DOM prvek jako jinde, takže na hover
"přebarvení" místo `color` přepíná CELÝ obrázek za identický, jen s
jantarovým stroke (`%23c97a2e` = var(--primary-dark)) místo šedého. */
.document-form--faktury .modal-form__body .form-row > input[type=date]:hover {
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23c97a2e' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Crect x='3' y='5' width='18' height='16' rx='2'/%3E%3Cpath d='M8 3v4M16 3v4M3 10h18'/%3E%3C/svg%3E");
}

/* "+7/+14/+30/+60"/"Přičíst"/"Použít i pro..." jako `.chip-btn` z
předlohy - doslovné hodnoty (šedá `#eef0f3`, ne teplý `var(--body-bg)`
appky), `min-height` ať "+7" a "Přičíst" v řadě nevypadají nerovnoměrně.
Funkční třídy (`.quick-days`/`.quick-days__apply`/`.copy-date__apply`,
viz dashboard/base.html JS) zůstávají beze změny - tohle je jen jejich
vizuální vrstva navíc, v tomhle scope. */
.document-form--faktury .quick-days button,
.document-form--faktury .copy-date__apply {
    display: inline-flex; align-items: center; gap: 6px;
    font-size: 12px; font-weight: 700; color: var(--muted-fg);
    background: #eef0f3; border: 1px solid transparent;
    padding: 6px 12px; border-radius: 20px; cursor: pointer;
    min-height: 28px;
}
.document-form--faktury .quick-days button:hover,
.document-form--faktury .copy-date__apply:hover { background: #e4e7eb; }
.document-form--faktury .copy-date__apply svg,
.document-form--faktury .quick-days button svg { width: 13px; height: 13px; flex-shrink: 0; }
/* Dny (+7/+14/+30/+60) jsou v předloze menší a monospace (`.quick-dates
.chip-btn`) - "Přičíst" (`.apply`) si font vrací zpátky na Manrope. */
.document-form--faktury .quick-days button[data-days] {
    padding: 5px 10px; font-family: 'JetBrains Mono', monospace; font-size: 11.5px;
}
.document-form--faktury .quick-days__custom { min-height: 28px; }
.document-form--faktury .quick-days__apply {
    font-family: 'Manrope', sans-serif;
    background: #fbead6; color: #c97a2e; border-color: transparent; font-weight: 700;
}

/* Poznámka "Položky... přibydou po uložení" - vlastní odsazená kartička
(mockup `.divider` + `.info-note`) místo prostého textu. `:last-of-type`
(NE jen `> .help-text`) - nahoře může být i ISDOC import hláška (stejná
`.help-text` třída, taky přímé dítě `.modal-form__body`), tahle úprava
smí trefit jen tu OPRAVDU poslední. */
.document-form--faktury .modal-form__body > p.help-text:last-of-type {
    position: relative;
    margin-top: 28px; padding: 12px 14px;
    background: #fbf9f4; border: 1px solid var(--border-color); border-radius: 10px;
    font-size: .78rem; color: var(--muted-fg); line-height: 1.5;
}
/* Vodorovná linka nad kartičkou (mockup `.divider`), samostatná od
karty (mezera mezi nimi, ne přilepená k hornímu okraji) - `::before`
s absolutní pozicí místo dalšího HTML elementu do šablony. */
.document-form--faktury .modal-form__body > p.help-text:last-of-type::before {
    content: ""; position: absolute; top: -14px; left: 0; right: 0; height: 1px;
    background: var(--border-color);
}
/* Nápověda k "Přenesená povinnost" (documents.models.AbstractDocument.
is_reverse_charge) je v předloze modrá, ne šedá jako ostatní nápovědy -
`:has()` cílí podle checkboxu uvnitř stejného `.form-row`, žádná nová
CSS třída/šablona navíc potřeba. */
.document-form--faktury .form-row:has(input[name="is_reverse_charge"]) .help-text {
    color: #2f6fed;
    /* Michal, 2026-09-16 (5. kolo) - ještě menší (.72rem, míň než
    kartička "Položky..." níž) a přes celou šířku POD "Přenesená
    povinnost", ne jen v úzkém 2. sloupci vedle prázdného štítku -
    `grid-column` výš (`.modal-form__body .form-row > .help-text {
    grid-column: 2 }`) tenhle konkrétní řádek přebíjí zpátky na plnou
    šířku, stejně jako `.checkbox-row` nad ním (`grid-column: 1 / -1`). */
    font-size: .72rem;
    grid-column: 1 / -1;
}

/* --- Náhled Cena po slevě/Základ/DPH/Celkem na popupu položky (readonly) --- */

.line-preview {
    background: var(--body-bg); color: var(--muted-fg); border: 1px solid var(--border-color);
    border-radius: 6px; padding: 6px 8px; font: inherit; width: 100%; box-sizing: border-box;
}

/* --- Přiřazení na Majetek (core.MajetekAssignment) na Položkách dokladu --- */

.majetek-assign-form { display: flex; gap: 6px; align-items: start; margin-top: 6px; }
.majetek-assign-form .ac { width: 160px; }
.majetek-assign-form input[type=number] {
    width: 90px;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-field);
    padding: 8px 8px;
    font-size: .9rem;
}

/* --- Ikona "Rozpoložkování" na Položkách dokladu (documents/document_detail.html) -
jeden sloupec/dialog místo dvou širokých sloupců Realizace+Majetek
(feedback od Michala). Barva/vzhled hned prozradí, jestli je položka
přiřazená (plná zelená tečka) nebo ne (prázdný šedý kroužek). --- */

/* Feedback od Michala postupně: "kolečko 2x větší" -> "pořád jsou
řádky vysoké" -> "zmenši, není důležitá" -> "opravdu musí být tak
malinké?" - `display:block` z mezikroku rozbilo zarovnání pod nadpisem
sloupce (šlo úplně mimo "ROZPOL."), ne font-size - zpátky na `inline`
(text-align sloupce ho pak zarovná normálně) + rozumná čitelná
velikost, co ještě nenatahuje hustý řádek. */
.assign-icon {
    background: none; border: none; cursor: pointer;
    font-size: 1.3rem; line-height: 1; padding: 0; margin: 0;
    color: var(--muted-fg); vertical-align: middle;
}
/* Ikona/stav sloupec vystředěný, ne doleva jako textové sloupce -
stejná výjimka jako by dostal třeba checkbox sloupec. */
table.report--dense .col-center { text-align: center; }
.assign-icon--assigned { color: var(--success); }
.assign-icon:hover { color: var(--primary); }
.modal-form__body h3 { font-size: .9rem; margin: 16px 0 8px; }
.modal-form__body h3:first-child { margin-top: 0; }

/* Náhled Rozpoložkování na hover, bez kliknutí (feedback od Michala +
screen ze starého IS - "aby se mi ukázalo kam je položka rozpoložkovaná,
aniž bych musel na ni kliknout"). Čisté CSS (:hover/:focus-within),
žádný JS - když se otevře popup Rozpoložkování (<dialog>.showModal()),
prohlížeč ho promuje do "top layer" nad vším ostatním včetně tooltipu,
takže se automaticky překryje, není potřeba nic řešit ručně. */
.assign-tooltip-wrap { position: relative; display: inline-block; }
.assign-tooltip {
    display: none;
    /* PŮVODNĚ `bottom: 100%` (vyskakoval nahoru) - tabulka Položek je
    obalená `<div style="overflow-x: auto">` (documents/document_detail.html,
    kvůli vodorovnému scrollu širší tabulky) - podle CSS Overflow spec se
    `overflow-y` u takového obalu dopočítá taky na `auto` (ne `visible`),
    takže cokoliv trčící NAD box (position:absolute mimo normální tok) se
    tím ořízlo - Michalův bugreport "vidím jen Pohořelice" (poslední slovo
    z "36003 Novák RD Pohořelice"), zbytek zmizel nad horní hranou obalu.
    `top: 100%` (vyskakuje DOLŮ) tenhle problém nemá - obal roste podle
    obsahu, dolů má vždycky kam. */
    position: absolute; z-index: 15; left: 50%; top: 100%;
    transform: translateX(-50%); margin-top: 6px;
    background: var(--surface-bg); border: 1px solid var(--border-color);
    border-radius: var(--radius-sm); box-shadow: var(--shadow-md);
    padding: 8px 10px; font-size: .8rem; text-align: left; color: var(--body-fg);
    min-width: 160px; max-width: 260px; white-space: normal;
}
.assign-tooltip-wrap:hover .assign-tooltip,
.assign-tooltip-wrap:focus-within .assign-tooltip { display: block; }

/* Souhrn "kolik z částky položky je přiřazeno" v popupu Rozpoložkování
(feedback od Michala - "v tom popupu to nejde přehledně vidět" jako na
koláčovém grafu starého IS) - jednoduchý pruh místo grafu. Červená, když
je přiřazeno VÍC než celková částka (přerozpoložkováno). */
.assign-summary { font-size: .85rem; color: var(--muted-fg); margin: 0 0 6px; }
.assign-summary--over { color: var(--error); font-weight: 600; }
.assign-bar {
    height: 8px; border-radius: 4px; background: var(--body-bg);
    border: 1px solid var(--border-color); overflow: hidden; margin-bottom: 10px;
}
.assign-bar__fill { height: 100%; background: var(--success); }
.assign-bar__fill--over { background: var(--error); }

/* Menší ikonová akční tlačítka na řádku položky (Upravit/Smazat) - `.btn`
by dělalo zbytečně vysoké řádky (feedback od Michala "plýtváme místem"). */
.row-action-icon {
    background: none; border: 1px solid var(--border-color); border-radius: 6px;
    cursor: pointer; font-size: .9rem; line-height: 1; padding: 4px 7px; color: var(--body-fg);
    text-decoration: none; display: inline-block;
}
.row-action-icon:hover { border-color: var(--primary); color: var(--primary); }
.row-action-icon__svg { width: 14px; height: 14px; display: block; vertical-align: middle; }
/* "Tělo oranžové", když už je co ukázat (Michal, 2026-09-14 - bublina
Události/Komentáře na Realizaci) - stejné amber tokeny jako status-pill--v_priprave. */
.row-action-icon--active {
    background: var(--accent-amber-bg); border-color: var(--accent-amber-bg); color: var(--accent-amber-fg);
}
.row-action-icon--active:hover { border-color: var(--accent-amber-fg); }
/* Bublina Události/Komentáře v gridu (core/_events_bubble.html) - přesně
podle mockupu komentare-ukoly-redesign.html ("1 - Ikona v gridu"), NAHRAZUJE
dřívější přístup nad `.row-action-icon` (ten zůstává pro Upravit/Smazat
apod. beze změny). Tři stavy: prázdná (jen obrys, ikona bubliny), modrá
"existuje vlákno" (ikona bubliny), amber "obsahuje nevyřízený úkol" -
tam se navíc MĚNÍ SAMOTNÁ IKONA na "check-square" (ne jen barva/odznak
navíc) - amber má přednost před modrou (viz šablona `{% if has_open_task %}`
před `{% elif has_events %}`). */
.talk-btn {
    width: 30px; height: 30px; border-radius: 9px; flex-shrink: 0;
    display: flex; align-items: center; justify-content: center;
    border: 1px solid var(--border-color); color: var(--ink-faint); position: relative; cursor: pointer;
    text-decoration: none;
}
.talk-btn svg { width: 15px; height: 15px; }
.talk-btn.has-thread { background: var(--accent-blue-bg); border-color: transparent; color: var(--accent-blue-fg); }
.talk-btn.has-open-task { background: var(--accent-amber-bg); border-color: transparent; color: var(--accent-amber-fg); }
/* Počet - "jen otevřené/nevyřízené" (core.events.bubble_state), NE
celková historie za celou dobu (Michal, 2026-09-15). Vždy amber, i na
modré bublině (mockup - odznak barvu stavu bubliny nekopíruje). */
.talk-count {
    position: absolute; top: -5px; right: -5px;
    min-width: 15px; height: 15px; padding: 0 3px;
    background: var(--accent-amber-fg); color: #fff; font-size: 9px; font-weight: 800;
    border-radius: 20px; display: flex; align-items: center; justify-content: center;
    border: 2px solid var(--surface-bg);
}
/* "+ Přidat" (mockup `.add-tooltip`) - Michal, 2026-09-16: samostatná
plochá "pilulka" (vlastní okraj/zaoblení), ne jen barvený řádek uvnitř
`.events-bubble__menu-box` karty - `a.add-tooltip` proto musí mít vyšší
specificitu než obecné `.events-bubble__menu a` výš, aby přebilo jeho
padding/border-radius. */
.events-bubble__menu a.add-tooltip {
    display: flex; align-items: center; justify-content: center; gap: 6px;
    padding: 7px 14px; border: 1px solid var(--border-color); border-radius: 999px;
    background: var(--body-bg);
    font-size: 12px; font-weight: 700; color: var(--accent-amber-fg);
}
.events-bubble__menu a.add-tooltip:hover { background: var(--accent-amber-bg); border-color: transparent; color: var(--accent-amber-fg); }
.add-tooltip svg { width: 13px; height: 13px; }

/* Segmentovaný přepínač (mockup priprava-vyroba-redesign.html "Vše"/
"Jen moje") - obaluje obyčejné radio buttony (core/inquiries/
preparer_grid.html), `:has()` zjistí stav zaškrtnutí BEZ JS (stejný
princip jako `.event-form .event-task-fields` výš) - žádné přejmenování
inputů, jen vizuální vrstva navrch. */
.segmented {
    display: inline-flex; background: var(--surface-bg);
    border: 1px solid var(--border-color); border-radius: 8px; padding: 2px; gap: 2px;
}
.segmented label {
    padding: 6px 14px; font-size: .82rem; font-weight: 700;
    color: var(--muted-fg); border-radius: 6px; cursor: pointer;
}
.segmented input[type="radio"] { position: absolute; opacity: 0; width: 0; height: 0; }
.segmented label:has(input:checked) { background: var(--secondary); color: #fff; }
/* core/_event_form.html - Komentář/Úkol přepínač NAHRAZUJE dřívější
checkbox "Nastavit jako úkol" (design-instrukce-komentare.md), stejná
`.segmented` třída jako "Vše"/"Jen moje" výš. */
.event-form__kind { margin-bottom: 14px; }
/* Michal, 2026-09-16 (modal-komentar-ukol-presna-specifikace.md) - tenhle
konkrétní přepínač chce SVĚTLÝ track + BÍLÝ aktivní segment s tmavým
textem (klasický iOS segmented control), ne tmavé `--secondary` pozadí
z obecného `.segmented` výš - `.event-form .segmented` scoped jen na
tenhle popup, "Vše"/"Jen moje" (Příprava výroby) zůstává beze změny. */
.event-form .segmented { background: var(--body-bg); border-color: transparent; }
.event-form .segmented label:has(input:checked) {
    background: var(--surface-bg); color: var(--body-fg); box-shadow: var(--shadow-sm);
}

/* Vzdušnější řádek pro gridy, co nikdy nebudou mít desítky záznamů
(mockup priprava-vyroba-redesign.html) - modifikátor, NE výchozí
`table.list` chování (to zůstává kompaktní kvůli hlavním dokladovým
gridům, viz komentář u `table.list th, table.list td` výš). */
.list--roomy th, .list--roomy td { padding: 10px 14px; }
/* Podbarvení řádku na hover (`table.list tbody tr:hover` výš) platí teď
už plošně pro VŠECHNY `table.list` gridy, ne jen tenhle - žádné zvláštní
pravidlo tady navíc potřeba. */

/* Název zakázky v gridu Příprava výroby - Michal, 2026-09-15 (mockup
`.order-name`): tučně, BEZ spodní linky (Michal, 2026-09-15 - "odeber
spodní čáru"), hover jen změní barvu na oranžovou. `table.list tbody
a.order-name` (ne jen `.order-name` samotné) - MUSÍ mít vyšší
specificitu než `table.list tbody a` výš (to odkazům v gridu dává
černý text + tenké oranžové podtržení jako výchozí signál klikatelnosti,
pořád platí pro VŠECHNY OSTATNÍ odkazy v gridu), jinak by `.order-name`
proti němu v kaskádě prohrálo - přesně to se dělo, dokud tahle
specificita chyběla. */
table.list tbody a.order-name,
table.report tbody a.order-name {
    font-weight: 700;
    color: var(--body-fg);
    text-decoration: none;
    border-bottom: none;
    padding-bottom: 0;
}
table.list tbody a.order-name:hover,
table.report tbody a.order-name:hover { color: var(--primary-dark); border-bottom-color: transparent; }

/* Typ zakázky (Poptávka/Výroba) v gridu Příprava výroby - Michal,
2026-09-14 řekl k tomuhle sloupci "těch barev je na tom gridu už hodně,
tohle není stav zakázky" (proto dřív prostý text) - 2026-09-15 při review
mockupu (priprava-vyroba-redesign.html) tohle vědomě přehodnotil a
barevný čtvereček P/V chtěl zavést. */
.type-icon {
    display: inline-flex; align-items: center; justify-content: center;
    width: 22px; height: 22px; border-radius: 6px;
    font-size: .72rem; font-weight: 700;
    background: var(--border-color); color: var(--muted-fg);
}
.type-icon--inquiry { background: var(--accent-blue-bg); color: var(--accent-blue-fg); }
.type-icon--production { background: var(--accent-amber-bg); color: var(--accent-amber-fg); }

/* Karty přípravářů nad gridem Příprava výroby (README redesignu, Michal
2026-09-19, mockup PripravaVyroby.dc.html) - stejný "kartový" princip
jako `.realizace-kpi` na Detailu realizace, jen vlastní obsah (počet +
skládaný pruh + čtyři metriky s barevnou tečkou). */
.preparer-cards { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-bottom: 18px; }
@media (max-width: 960px) {
    .preparer-cards { grid-template-columns: repeat(2, 1fr); }
}
.preparer-card {
    background: var(--surface-bg);
    border: 1px solid rgba(33,37,41,.05);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-sm);
    padding: 13px 15px;
}
.preparer-card--urgent { border-color: var(--accent-red-soft); }
.preparer-card__head { display: flex; align-items: center; gap: 9px; }
.preparer-card__name { flex: 1; font-weight: 600; font-size: .88rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.preparer-card__count { font-size: 1.1rem; font-weight: 700; }
.preparer-card__bar {
    display: flex; height: 6px; border-radius: 3px; overflow: hidden; gap: 2px;
    margin-top: 12px; background: var(--border-color);
}
.preparer-card__seg { min-width: 2px; }
.preparer-card__seg--overdue { background: var(--accent-red-fg); }
.preparer-card__seg--survey { background: var(--accent-amber-fg); }
.preparer-card__seg--running { background: var(--accent-blue-fg); }
.preparer-card__seg--postponed { background: var(--border-color); }
.preparer-card__metrics { display: flex; flex-direction: column; gap: 5px; margin-top: 10px; }
.preparer-card__metric {
    display: flex; align-items: center; gap: 7px; font-size: .74rem; color: var(--body-fg);
}
.preparer-card__metric b { margin-left: auto; font-family: 'JetBrains Mono', monospace; font-weight: 600; }
.preparer-card__metric.is-zero { color: var(--muted-fg); }
.preparer-card__dot { width: 7px; height: 7px; border-radius: 2px; flex: none; }
.preparer-card__dot--overdue { background: var(--accent-red-fg); }
.preparer-card__dot--survey { background: var(--accent-amber-fg); }
.preparer-card__dot--soon { background: var(--accent-blue-fg); }
.preparer-card__dot--postponed { background: var(--ink-faint); }
.preparer-card__metric.is-zero .preparer-card__dot { background: var(--ink-faint); }

/* Klikací filtrovací chipy (README - "filtry na to, co se řeší denně")
- na rozdíl od `.filter-bar__chip` (co jen RUŠÍ aktivní filtr, křížkem)
tyhle rovnou ZAPÍNAJÍ/VYPÍNAJÍ jeden GET parametr, `.segmented` barevný
vzor pro aktivní stav. */
.chip-filters { display: flex; gap: 8px; flex-wrap: wrap; margin: 12px 0 16px; }
.chip-filter {
    height: 30px; padding: 0 13px; border-radius: 15px; border: 1px solid var(--border-color);
    background: var(--surface-bg); color: var(--body-fg); font-size: .78rem; font-weight: 500;
    display: inline-flex; align-items: center; text-decoration: none;
}
.chip-filter:hover { border-color: var(--ink-faint); }
.chip-filter.is-active { background: var(--secondary); border-color: var(--secondary); color: #fff; }

/* Zakázka a zákazník / Připravit do buňky (README - "kdo úkol zadal a
kdy, přímo pod názvem" + odpočet dní pod datem "Připravit do"). */
.preparer-row__sub { margin-top: 2px; font-size: .72rem; color: var(--muted-fg); }
.preparer-row__sub--warn { color: var(--accent-amber-fg); }
.preparer-row__pripravit { font-family: 'JetBrains Mono', monospace; font-weight: 600; }
.preparer-row__pripravit.soon { color: var(--accent-amber-fg); }

/* Samostatné "okno" na přípraváře (Michal, 2026-09-19, mockup
PripravaVyroby.dc.html - "rozděl přípraváře do samostatných oken, dodělej
ty doplňující informace v záhlaví") - nahrazuje dřívější jednu velkou
tabulku se seskupenými řádky. Klidná/urgentní hlavička = stejné dva
odstíny jako README design tokeny (`#faf9f7`/`#fdf6f3`), přímo hex jako
ostatní mockupem dané barvy v appce. */
.preparer-panel {
    background: var(--surface-bg);
    border: 1px solid var(--border-color);
    border-radius: var(--radius-md);
    margin-bottom: 16px;
    /* Michal, 2026-09-18 - "nastav šířku oken přípravářů, ta zůstává
    viset" - tabulka uvnitř má od předchozí opravy pevnou (užší) šířku
    danou součtem sloupců (`width: auto` na `table.list` níž), ale
    samotné OKNO (karta s orámováním) se dál roztahovalo na celou šířku
    stránky jako blok - vznikla tak prázdná plocha uvnitř karty napravo
    od sloupce Expedice. `width: fit-content` zmenší kartu na šířku
    svého nejširšího obsahu (typicky tabulka), `max-width: 100%` ji
    nedovolí přetéct na užších obrazovkách. */
    width: fit-content;
    max-width: 100%;
    /* Michal, 2026-09-18 - "ten bílý roh je tam pořád": ruční dopočet
    poloměru na vnitřních prvcích (o šířku rámečku menší, aby křivky
    seděly) nestačil - subpixelové vykreslování stejně nechávalo
    viditelnou skulinku. Robustnější řešení: NATIVNÍ ořez (`overflow:
    hidden`) - prohlížeč pak zaoblí VŠECHNO uvnitř přesně a bez
    dopočítávání. Roletka Stavu/Zaměření (`position: absolute`) by tím
    ale byla useknutá stejně jako dřív (Michal: "roletka zůstává
    schovaná") - řeší `dashboard/base.html` `releaseOverflowClip`, stejný
    dočasný trik jako u `.modal-form__body`/`dialog.app-modal` (ořez se
    pustí jen na dobu, kdy je roletka v tomhle okně otevřená). */
    overflow: hidden;
}
.preparer-panel__head {
    display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
    padding: 10px 16px; background: #faf9f7; border-bottom: 1px solid var(--border-color);
    border-top-left-radius: var(--radius-md); border-top-right-radius: var(--radius-md);
}
.preparer-panel__head--urgent { background: #fdf6f3; }
.preparer-panel__avatar { width: 24px; height: 24px; font-size: 9.5px; }
.preparer-panel__name { font-weight: 700; font-size: .88rem; }
.preparer-panel__count { font-size: .78rem; color: var(--muted-fg); }
.preparer-panel__badge {
    height: 20px; padding: 0 8px; border-radius: 4px; font-size: .68rem; font-weight: 600;
    display: inline-flex; align-items: center;
}
.preparer-panel__badge--warn { background: var(--accent-red-bg); color: var(--accent-red-fg); }
.preparer-panel__badge--info { background: var(--accent-amber-bg); color: var(--accent-amber-fg); }
.preparer-panel__nearest { margin-left: auto; font-size: .78rem; color: var(--muted-fg); white-space: nowrap; }
.preparer-panel .table-scroll { margin: 0; }
.preparer-panel table.list { margin: 0; border: none; border-radius: 0; box-shadow: none; }
/* Michal, 2026-09-18 - "sloupce v jednotlivých oknech přípravářů jsou
každý jinak odskočený" - KAŽDÉ okno je samostatná `<table>`, takže si
prohlížeč šířku sloupců počítá NEZÁVISLE podle vlastního obsahu (delší
název zakázky v jednom okně rozhodí sloupce napravo od něj jen tam, ne
ve zbylých oknech). `table-layout: fixed` + pevná šířka na VŠECH
sloupcích (vč. "Zakázka a zákazník") zajistí, že šířky sedí NAPŘÍČ
všemi okny stejně. `width: auto` na tabulce samotné (ne zděděné 100 %
z `table.list`) - "Zakázka a zákazník" má sice pevnou šířku, ale
obvykle prázdnou většinu z ní (krátký název), takže NEROZTAHUJEME
tabulku na celou šířku panelu (Michal - "je tam obrovská díra"), zbylé
místo se nechá volné napravo od Expedice, ne nacpané mezi sloupce. */
.preparer-panel table.list { table-layout: fixed; width: auto; }
.preparer-panel table.list th:nth-child(1), .preparer-panel table.list td:nth-child(1) { width: 32px; }
.preparer-panel table.list th:nth-child(2), .preparer-panel table.list td:nth-child(2) { width: 92px; }
.preparer-panel table.list th:nth-child(3), .preparer-panel table.list td:nth-child(3) { width: 340px; }
.preparer-panel table.list th:nth-child(4), .preparer-panel table.list td:nth-child(4) { width: 170px; }
.preparer-panel table.list th:nth-child(5), .preparer-panel table.list td:nth-child(5) { width: 150px; }
.preparer-panel table.list th:nth-child(6), .preparer-panel table.list td:nth-child(6) { width: 100px; }
.preparer-panel table.list th:nth-child(7), .preparer-panel table.list td:nth-child(7) { width: 120px; }
.preparer-panel table.list th:nth-child(8), .preparer-panel table.list td:nth-child(8) { width: 100px; }
/* "Zakázka a zákazník" (3. sloupec) má DVA řádky (název + "zadal X") -
ellipsis funguje jen na jednořádkovém boxu, proto se nastavuje na OBOU
vnořených prvcích zvlášť (ne na `<td>` jako celku), v `fixed` layoutu se
sloupec NEROZTÁHNE podle obsahu jako jinde v appce, takže dlouhý text
ořízneme třemi tečkami, ne necháme přetéct do sousedního sloupce. */
.preparer-panel table.list td:nth-child(3) .order-name,
.preparer-panel table.list td:nth-child(3) .preparer-row__sub {
    display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* Utilita pro "—"/vedlejší texty v buňkách gridu (mockup `.cell-muted`) -
dřív appka řešila tenhle odstín ad-hoc inline stylem, teď jeden token. */
.cell-muted { color: var(--ink-faint); }

/* Bublina Události/Komentáře - hover menu (core_extras.events_bubble),
Michal 2026-09-14: "jako ve starém IS, najetím se hned rozbalí menu" -
čisté CSS, žádný JS. `padding-top` na menu (ne `margin-top`) - myš tak
nikdy neopustí hoverovatelnou oblast mezi ikonou a menu, jinak by se
menu hned po přejetí zase zavřelo. */
.events-bubble { position: relative; display: inline-block; }
.events-bubble__menu {
    display: none;
    position: absolute; top: 100%; left: 0; z-index: 30;
    padding-top: 4px;
}
.events-bubble:hover .events-bubble__menu, .events-bubble__menu:hover { display: block; }
.events-bubble__menu-box {
    display: flex; flex-direction: column; gap: 2px;
    /* Michal, 2026-09-16 - stejný princip "jednoduché, ne stínované"
    jako u filtr panelu: plochý okraj bez box-shadow, žádná "vznášející
    se karta". */
    background: var(--surface-bg); border: 1px solid var(--border-color); border-radius: var(--radius-sm);
    padding: 6px; min-width: 150px;
}
.events-bubble__menu a {
    display: block; padding: 6px 10px; border-radius: 6px; text-decoration: none;
    color: var(--body-fg); font-size: .85rem; white-space: nowrap;
}
.events-bubble__menu a:hover { background: var(--body-bg); color: var(--primary); }
/* Náhled posledních záznamů nad tlačítky (Michal, 2026-09-14 - "pokud
bublina obsahuje záznam, ukaž ho v hover efektu"). */
.events-bubble__preview { display: flex; flex-direction: column; gap: 2px; max-width: 260px; }
.events-bubble__preview-item {
    display: block; padding: 4px 8px; font-size: .8rem; color: var(--body-fg);
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
    text-decoration: none; border-radius: 6px;
}
.events-bubble__preview-item:hover { background: var(--body-bg); }
.events-bubble__preview-item strong { color: var(--accent-amber-fg); font-weight: 600; }
.events-bubble__menu-divider { border-top: 1px solid var(--border-color); margin: 4px 0; }

/* core/_event_form.html - "Nastavit jako úkol" checkbox odkryje Nadpis/
Upozornění/Stav (Michal, 2026-09-15: jedno textové pole + volitelně
připnutý "typ události", místo dřívějšího menu se dvěma položkami
"+ Přidat komentář"/"+ Přidat událost" vybíraného předem). `:has()`
místo JS - stejný "žádný JS navíc" duch jako `.sidebar__toggle:checked
~ .sidebar__submenu` výš, jen `:has()` umí reagovat na checkbox, co
NENÍ přímý sourozenec cílového bloku (je zanořený v `.checkbox-row`
přes core/_form_field.html). */
.event-form .event-task-fields { display: none; }
.event-form:has(input[name="is_task"][value="1"]:checked) .event-task-fields { display: block; }

/* Michal, 2026-09-16 (mockup) - tenhle konkrétní popup chce zpátky
štítek NAD polem (vyšší/užší okno), ne vedle sebe jako ostatní popupy
(`.modal-form__body .form-row` grid výš, obecné pravidlo pro VŠECHNY
modaly) - `.event-form .modal-form__body .form-row` má vyšší specificitu
(3 třídy vs. 2), takže tuhle konkrétní kartu bezpečně přebije, aniž by
se sáhlo na ostatní popupy. */
.event-form .modal-form__body .form-row {
    display: block;
    margin-bottom: 10px;
}
.event-form .modal-form__body .form-row > label { margin-bottom: 2px; }
/* Šířkové stropy (max-width 220px/380px/150px...) o kus výš patří k
hustému gridu OSTATNÍCH popupů (label vlevo, pole vpravo, potřebují
kolonku zkrátit, ať nezůstane osamocená v širokém 1fr sloupci) - tady
pole leží samostatně na celou šířku karty, stejný důvod stropy nemá
smysl, zrušit zpátky na plnou šířku. */
.event-form .modal-form__body .form-row > select,
.event-form .modal-form__body .form-row > input,
.event-form .modal-form__body .form-row > .ac,
.event-form .modal-form__body .form-row > .field-with-add,
.event-form .modal-form__body .form-row > .calc-input {
    max-width: none;
}

/* Jednoduché vlákno odpovědí (core.EventReply) na kartě úpravy Události/
Komentáře - Michal 2026-09-14, "ať to jde přípraváři jednoduše
odpovědět". */
.event-replies { display: flex; flex-direction: column; gap: 8px; margin: 12px 0; max-height: 240px; overflow-y: auto; }
.event-replies__item { background: var(--body-bg); border-radius: var(--radius-sm); padding: 8px 10px; }
.event-replies__meta { font-size: .78rem; margin-bottom: 2px; display: flex; align-items: center; gap: 6px; }
.event-replies__meta .row-action-icon { margin-left: auto; }
.event-replies__text { white-space: pre-line; }
#event-reply-form { display: flex; gap: 8px; align-items: flex-start; }
#event-reply-form textarea { flex: 1; }

/* Obrázky vložené (core.Attachment - core.event_views._save_pasted_images)
do Události/Komentáře/Odpovědi, Michal 2026-09-14: "doplň možnost vložit
tam obrázek z výstřižků... WhatsApp je úplně mimo systém". */
.event-images { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
.event-images img {
    width: 72px; height: 72px; object-fit: cover; border-radius: var(--radius-sm);
    border: 1px solid var(--border-color);
}
.paste-images-hint { font-size: .78rem; margin: 2px 0 8px; }

/* Náhled OBRÁZKŮ VLOŽENÝCH (Ctrl+V) DO POLE, ještě needeslaných (JS v
dashboard/base.html "Vložení obrázku ze schránky") - zjištěná díra
(Michal, 2026-09-15: "nejde mi tam vložit obrázek") - JS obrázek tiše
přidal do skrytého file inputu, ale bez tohohle náhledu to vypadalo, že
se nic nestalo. Stejné rozměry jako `.event-images img` (už uložené
obrázky) pro konzistenci, jen navíc × na odebrání PŘED odesláním
(Michal, 2026-09-14 - "co když vložím blbej obrázek, jak to vezmu
zpět?"). */
.pasted-images-preview:empty { display: none; }
.pasted-images-preview { display: flex; flex-wrap: wrap; gap: 6px; margin: 6px 0; }
.pasted-image-chip { position: relative; line-height: 0; }
.pasted-image-chip img {
    width: 72px; height: 72px; object-fit: cover; border-radius: var(--radius-sm);
    border: 1px solid var(--border-color);
}
.pasted-image-chip__remove {
    position: absolute; top: -6px; right: -6px;
    width: 18px; height: 18px; border-radius: 50%;
    background: var(--secondary); color: #fff; border: none;
    font-size: .75rem; line-height: 1; cursor: pointer; padding: 0;
}
.pasted-image-chip__remove:hover { background: var(--error); }

/* Seznam Událostí/Komentářů jako karty s odpověďmi PŘÍMO uvnitř (core/
_events_list.html) - Michal, 2026-09-14, po vyzkoušení dvouúrovňového
seznam->detail: "je to moc zanořené... to nebudou chtít moc používat
takto". Odpovídat teď jde rovnou tady, "✎ Upravit" zůstává jen pro
vzácnější úpravu Nadpisu/Popisu/Stavu. */
.event-list-cards { display: flex; flex-direction: column; gap: 12px; margin-top: 12px; }
.event-list-card { background: var(--body-bg); border-radius: var(--radius-md); padding: 12px; }
.event-list-card__header { display: flex; justify-content: space-between; align-items: flex-start; gap: 10px; }
.event-list-card__header > div { display: flex; flex-direction: column; gap: 2px; }
.event-list-card__body { margin: 6px 0 0; white-space: pre-line; }
.event-list-card .event-replies { max-height: 180px; }
.event-list-card__reply-form { display: flex; gap: 8px; align-items: flex-start; margin-top: 8px; }
.event-list-card__reply-form textarea { flex: 1; }

/* --- Dokumenty (core.Attachment přes core_extras.attachment_panel) --- */

.attachment-upload-form {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-wrap: wrap;
    margin-bottom: 16px;
    padding-bottom: 16px;
    border-bottom: 1px solid var(--border-color);
}
.attachment-upload-form input[type=text] {
    border: 1px solid var(--border-color);
    border-radius: var(--radius-field);
    padding: 7px 10px;
    font-size: .9rem;
}
.attachment-lists {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 24px;
}
.attachment-lists h3 {
    font-size: .85rem;
    font-weight: 600;
    color: var(--muted-fg);
    text-transform: uppercase;
    letter-spacing: .02em;
    margin: 0 0 8px;
}
.attachment-list { list-style: none; margin: 0; padding: 0; }
.attachment-list li {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 6px 0;
    border-bottom: 1px solid var(--border-color);
    font-size: .9rem;
}
.attachment-list li:last-child { border-bottom: none; }

/* --- Checklist (core.ChecklistItem, core/_checklist.html) - jednoduchý
ToDo list na kartě Realizace + dashboard widget "Co je potřeba udělat"
(Michalova inspirace z konkurenčního IS). Stejný vzor jako .attachment-list
výš. --- */
.checklist { list-style: none; margin: 0 0 12px; padding: 0; }
.checklist-item {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 4px 0;
    border-bottom: 1px solid var(--border-color);
}
.checklist-item:last-child { border-bottom: none; }
.checklist-item__toggle-form { display: inline-flex; margin: 0; }
.checklist-item__text-form { flex: 1; min-width: 0; margin: 0; }
.checklist-item__text-input {
    width: 100%;
    border: 1px solid transparent;
    background: none;
    padding: 3px 6px;
    font-size: .9rem;
    border-radius: 4px;
    color: inherit;
}
.checklist-item__text-input:hover,
.checklist-item__text-input:focus { border-color: var(--border-color); background: var(--body-bg); }
.checklist-item--done .checklist-item__text-input { text-decoration: line-through; color: var(--muted-fg); }
.checklist-add-form { display: flex; gap: 8px; }
.checklist-add-form input[type=text] {
    flex: 1;
    border: 1px solid var(--border-color);
    border-radius: var(--radius-field);
    padding: 7px 10px;
    font-size: .9rem;
}
/* "Realizace - checklisty" widget (dashboard/home.html) - KAŽDÁ
realizace vlastní malá karta, `auto-fill` grid je vedle sebe naskládá
kolik se jich vejde do šířky a zalomí do dalšího řádku (feedback od
Michala - "já mám třeba 10 realizací pořád ve stavu kdy běží... zase je
nešikovné aby to byl jeden dlouhý sloupec dolů, nějak to rozumně
sortovat vedle sebe"). `minmax(240px, 300px)` - dost na název realizace
+ pár položek, ale ne zbytečně široké/prázdné jako .card--narrow karty. */
.dashboard-checklist-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(240px, 300px));
    gap: 16px;
}
.dashboard-checklist-card { padding: 14px 16px; }
.dashboard-checklist-card__title { font-weight: 700; margin-bottom: 4px; }
.dashboard-checklist-card__title a { color: inherit; }

/* --- Koláčové grafy "Faktury vydané" (dashboard/_invoice_payment_donut.html,
feedback od Michala + jeho screenshot konkurenčního IS) - status barvy
(Zaplaceno=úspěch/zelená, Nezaplaceno=neutrální/modrá, Po splatnosti=
kritická/červená), STEJNÉ tokeny jako zbytek appky (--success/--accent-blue-fg/
--error), ne nová paleta. --- */
.donut-row { display: flex; gap: 20px; flex-wrap: wrap; margin-bottom: 20px; }
/* `flex: 0 1 ...` (ne `1 1`) - NErůst přes základní šířku, i kdyby v
řádku zbývalo hodně místa (feedback od Michala - "tady ty okna taky
změnši klidně na půlku, zabírá to moc místa a je to prázdné", "lidi mají
34" monitory"). Karty zůstanou zarovnané doleva (flex výchozí), ne
roztažené přes celou širokou stránku. */
.donut-card { flex: 0 1 380px; }
.donut-card__header { display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 12px; }
.donut-card__header h2 { margin: 0; }
.donut-card__body { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
/* Kolečko zmenšeno na velikost srovnatelnou s textem legendy vedle (feedback
od Michala - "kolečko změnši aby bylo cca stejně velké jako ten text vedle").
Tloušťka prstenu (stroke-width) přepsána přes CSS - CSS má přednost před SVG
atributem a počítá se ve stejných jednotkách jako viewBox, takže se mění
úměrně s velikostí. Nejdřív zúženo na 9 ("můžeš ho i trochu zúžit"), pak po
zmenšení kolečka zase rozšířeno na 16 - na 68px kolečku působila 9 hubeně/
"rozhozeně" (feedback od Michala + jeho screen konkurenčního IS, kde je
prstenec výrazně silnější). */
.donut-chart { width: 68px; height: 68px; flex-shrink: 0; }
.donut-chart circle, .donut-chart path { stroke-width: 24; }
.donut-chart__track { stroke: var(--border-color); }
.donut-segment--success { stroke: var(--success); }
/* Barvy segmentů - "měkký" tón (--accent-blue-soft/--accent-red-soft, viz
:root výš) mezi POZADÍM ikonových kroužků mini-widgetů Banka/Faktury po
splatnosti (--accent-*-bg - první pokus, ale "hrozně světlé jakoby
vybledlé") a jejich sytější barvou ikony (--accent-*-fg - ještě dřívější
pokus, "ostré"). Stejný token používá i `.donut-legend__dot--*` níž, ať
je tečka v legendě STEJNÁ barva jako segment (feedback od Michala -
"kolečka vedle textu... bych obarvil analogicky stejně"). */
.donut-segment--blue { stroke: var(--accent-blue-soft); }
.donut-segment--error { stroke: var(--accent-red-soft); }
/* Legenda jako `<table>` (viz šablona) - počet i částka mají svůj vlastní
sloupec zarovnaný doprava, stejně jako konkurenční IS na Michalově
screenshotu ("ty čísla co určují počet faktur, tak opět zarovnej doprava").
Tabulka bez `table-layout: fixed` si sloupce spočítá sama podle obsahu -
žádné ruční `flex`/`min-width` hackování jako dřív. */
.donut-legend { border-collapse: collapse; font-size: .88rem; }
.donut-legend td { padding: 5px 0; white-space: nowrap; }
/* Mezery mezi štítkem/počtem/částkou zvětšeny - "mezi Po splatnosti 1
25 000 Kč jsou tak malé mezery, že to splývá k sobě" (feedback od
Michala + screenshot). `min-width` na štítku zaručí stejně velkou
mezeru na KAŽDÉM řádku, ne jen na tom s nejkratším štítkem (bez ní by
sloupec bral šířku podle "Po splatnosti" a u toho řádku by padding
splynul s koncem textu).

Skutečná příčina toho, že se mezera mezi POČTEM a ČÁSTKOU vůbec
neprojevila (druhé kolo feedbacku - "mezi počtem faktur a částkou
žádné [odsazení] není") - `.donut-legend td` (třída+element, specificita
0-1-1) má VYŠŠÍ specificitu než `.donut-legend__count`/`__amount`
(jedna třída, 0-1-0), takže jeho `padding: 5px 0` tiše přebil jejich
vlastní horizontální padding na nulu, BEZ OHLEDU na pořadí v souboru.
`td.donut-legend__*` níž má specificitu shodnou s obecným pravidlem
(0-1-1), takže vyhrává podle pořadí v souboru (je až za ním). */
td.donut-legend__label { padding-right: 18px; min-width: 100px; }
td.donut-legend__count { text-align: right; padding: 0 18px; color: var(--muted-fg); font-variant-numeric: tabular-nums; }
td.donut-legend__amount { text-align: right; font-weight: 600; font-variant-numeric: tabular-nums; }
.donut-legend__dot {
    display: inline-block; width: 10px; height: 10px; border-radius: 50%;
    margin-right: 6px; vertical-align: middle;
}
.donut-legend__dot--success { background: var(--success); }
.donut-legend__dot--blue { background: var(--accent-blue-soft); }
.donut-legend__dot--error { background: var(--accent-red-soft); }
/* --- "Požadovat" na widgetu Moje probíhající realizace - buňka
podbarvená červeně (zbývá vyfakturovat), zleva doprava přibývá modré
podle podílu už přijaté částky vůči rozpočtu (dashboard.reports.
ActiveRealizaceRow.pct_hotovo). Widget teď sdílí `table.list` (hlavní
grid Realizací) místo `table.report`, ať je řádek/písmo/hover odkazu
stejný jako všude jinde (feedback od Michala - "použij stejnou velikost
řádků a písma jak na hlavním gridu realizací"). `.req-cell` proto NEMÁ
vlastní VERTIKÁLNÍ padding - `td` z `table.list` už padding má (stejný
trik jako `.price-cell--reverse-charge` výš) - jen vodorovný, ať
podbarvení přesahuje přes text. Řádek "vyfakturováno X %" úplně pryč
(feedback - "je to stále moc velké"), procento nese jen barva. --- */
.req-cell {
    position: relative;
    padding: 0 4px;
    border-radius: var(--radius-sm);
    overflow: hidden;
    background: var(--accent-red-bg);
}
.req-cell__fill {
    position: absolute; inset: 0; width: var(--pct, 0%);
    background: var(--accent-blue-fg);
    opacity: .22;
}
.req-cell__label { position: relative; font-weight: 600; }

/* Karta widgetu byla zbytečně široká (`.card--narrow` = 900px pro obecné
poloviční karty jinde) a s pouhými 5 sloupci vznikala velká prázdná
plocha napravo (feedback od Michala se screenshotem, zelené kolečko
vpravo) - PŮVODNĚ řešeno pevným `max-width: 620px`. Redesign 2026-09-15
(`.card--table`, sloupce Rozp. částka/Požadovat + `.req-cell` bez
zalomení) - pevných 620px už bylo naopak MÁLO a tabulka (nowrap sloupce,
viz `table.list th, table.list td` výš) přetékala napravo mimo
zaoblenou kartu (Michal - "widget stále přetéká doprava"). `width:
fit-content` řeší OBOJÍ najednou - karta se vždycky přesně přizpůsobí
šířce svého obsahu (tabulky), ať je krátký, nebo širší, žádný natvrdo
uhádnutý px navíc. */
#moje-realizace { width: fit-content; max-width: 100%; }
/* "Kč" skákalo na vlastní řádek ve sloupcích Rozp. částka/Požadovat -
tabulka bez `table-layout: fixed` počítala šířku sloupců podle
nejdelšího obsahu VŠECH sloupců dohromady a tenhle dvěma zbyl málo
místa (feedback od Michala - "symbol Kč ti odskakuje na druhý řádek,
měl by zůstat hned za číslem", stejná třída chyby jako `.price-cell`
výš). */
#moje-realizace td:nth-child(4), #moje-realizace td:nth-child(5) { white-space: nowrap; }

/* Stejný důvod jako #moje-realizace výš - obecná `.card--narrow` (900px)
byla na 6 sloupců zbytečně široká (feedback od Michala - "uprav jeho
šířku" po přesunutí widgetu nahoru). `width: fit-content` místo pevného
760px - stejný důvod jako u #moje-realizace, ať dlouhé jméno zákazníka
nezpůsobilo stejné přetečení mimo kartu. */
#faktury-po-splatnosti { width: fit-content; max-width: 100%; }

/* Stejný důvod jako #moje-realizace/#faktury-po-splatnosti výš - "Aktivní
události" má jen 3 sloupce (odkaz/čas/Potvrdit), 900px nechávalo velkou
prázdnou plochu napravo od tlačítka Potvrdit (Michal, 2026-09-15). */
#aktivni-udalosti { max-width: 640px; }
/* Odkaz na dvě řádky (typ/cíl + titulek Události) - bez podtržení na
CELÉM bloku (Michal, 2026-09-15 - "to vypadá zvláštně"), jen na hoveru.
Vnitřní `.link-quiet` span (typ/cíl) řeší svou vlastní tlumenou barvu
zvlášť. */
.aktivni-udalosti__link {
    display: flex; align-items: flex-start; gap: 8px;
    color: inherit; text-decoration: none;
}
/* Text BEZ jakéhokoliv "vypadá jako odkaz" stylu, ani na hoveru (Michal,
2026-09-15 - "když je tam ta ikona, tak už text nedělej aktivní...
uživatel si pak není jistý, jestli aktivní text dělá to stejné co
ikona") - klikatelnost signalizuje VÝHRADNĚ ikona (ta má svůj vlastní
hover přes `.row-action-icon:hover`), text zůstává normální barva
pořád, celý řádek zůstává klikací (větší cílová plocha), jen to
nevypadá jako dva různé odkazy vedle sebe. */
.aktivni-udalosti__text { color: var(--body-fg); }
/* Vnitřní `.link-quiet` (typ/cíl na horní řádce) by jinak na hoveru
podtrhlo samo sebe (obecné pravidlo `.link-quiet:hover` jinde v appce) -
tady to přebíjí, ze stejného důvodu výš. */
.aktivni-udalosti__text .link-quiet:hover { text-decoration: none; }
.aktivni-udalosti__icon { flex: none; margin-top: 1px; }

.donut-card__total {
    display: flex;
    justify-content: space-between;
    gap: 8px;
    flex-wrap: wrap;
    margin-top: 14px;
    padding-top: 10px;
    border-top: 1px solid var(--border-color);
    font-size: .9rem;
}

/* Review obrazovka importu Faktury přijaté (documents/document_import_review.html)
- hodně sloupců na řádek (Michal chtěl paritu se starým IS), takže
padding zúžený ještě víc než běžný `table.list` a inputy/selecty
vyplňují CELOU šířku svého (přes `<colgroup>` řízeného) sloupce místo
výchozí prohlížečové šířky - jinak by přetékaly přes užší sloupce
(Množství/Sleva/Sazba DPH). */
/* Overlay "zpracovávám..." přes ISDOC/PDF upload formulář (viz
documents/_import_processing_overlay.html) - stejná tmavost jako
`dialog.app-modal::backdrop` výš, ať appka při ~20s čekání na LLM
extrakci nevypadá zamrzle. */
.upload-overlay {
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,.45);
    display: flex;
    align-items: center;
    justify-content: center;
    z-index: 1000;
}
/* KRITICKÉ: bez tohohle `display: flex` výš přebije prohlížečovo
výchozí chování pro `[hidden]` (autorské CSS má přednost před UA
stylem bez ohledu na specificitu) - overlay by se pak zobrazoval hned
při načtení stránky, ne až po odeslání formuláře (Michal - "kliknu na
+PDF a hned se objeví toto... neměl jsem ani možnost nahrát pdf"). */
.upload-overlay[hidden] { display: none; }
.upload-overlay__box {
    background: var(--surface-bg);
    border-radius: var(--radius-md);
    padding: 28px 36px;
    text-align: center;
    box-shadow: var(--shadow-sm);
}
.upload-overlay__box p { margin: 12px 0 0; }
.spinner {
    width: 32px;
    height: 32px;
    margin: 0 auto;
    border: 3px solid var(--border-color);
    border-top-color: var(--primary);
    border-radius: 50%;
    animation: spinner-rotate .8s linear infinite;
}
@keyframes spinner-rotate {
    to { transform: rotate(360deg); }
}
/* PDF ikonka na overlaye "zpracovávám..." - pulzuje místo obyčejné
rotace (Michal navrhl buď rotaci, nebo "přibývající písmenka" - zvoleno
obojí: jemný pulz na ikonce + psací efekt na textu pod ní níž). */
.upload-overlay__icon { width: 40px; margin: 0 auto; animation: icon-pulse 1.4s ease-in-out infinite; }
.upload-overlay__icon .pdf-icon { width: 100%; height: auto; display: block; }
@keyframes icon-pulse {
    0%, 100% { transform: scale(1); opacity: 1; }
    50% { transform: scale(1.12); opacity: .75; }
}
/* Psací efekt ("přibývající písmenka") - klasický CSS typewriter trik,
šířka textu se cyklicky roztahuje `steps()` animací přes `overflow:
hidden`, ne skutečné postupné vypisování znaků v JS (na dekorativní
loading text zbytečná komplikace navíc). */
.reading-text {
    display: inline-block;
    max-width: 100%;
    overflow: hidden;
    white-space: nowrap;
    border-right: 2px solid var(--primary);
    animation: reading-type 3s steps(44, end) infinite;
}
@keyframes reading-type {
    0% { width: 0; }
    70% { width: 100%; }
    100% { width: 100%; }
}

.import-lines-table { table-layout: fixed; }
.import-lines-table th, .import-lines-table td { padding: 3px 5px; overflow: hidden; text-overflow: ellipsis; }
.import-lines-table input, .import-lines-table select {
    width: 100%;
    box-sizing: border-box;
}
.import-lines-table td.num { text-align: right; white-space: nowrap; }
.import-lines-table tfoot td { border-top: 2px solid var(--border-color); }

/* Drag&drop zóna pro upload souboru (core/_file_dropzone.html) - Michal
chtěl umět přetáhnout přílohu myší rovnou z e-mailového klienta místo
klikání na systémový "Vybrat soubor" dialog, použité jak na Import
Faktury z PDF/ISDOC (velká zóna), tak na Dokumenty (core/_attachments.html
- `.file-dropzone--compact` níž, malá zóna vedle ostatních polí
formuláře). Skutečný <input type=file> je jen vizuálně schovaný (ne
display:none, aby zůstal fungovat <label for=...> klik i tab fokus),
zóna je ten `<label>`. */
.file-dropzone { position: relative; }
.file-dropzone__input {
    position: absolute;
    width: 1px;
    height: 1px;
    opacity: 0;
    overflow: hidden;
}
.file-dropzone__zone {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 8px;
    padding: 32px 16px;
    border: 2px dashed var(--border-color);
    border-radius: var(--radius-md);
    background: var(--body-bg);
    cursor: pointer;
    text-align: center;
    transition: border-color .15s, background-color .15s;
}
.file-dropzone__zone:hover { border-color: var(--accent-blue-fg); }
/* :focus-visible na skrytém inputu musí zvýraznit zónu, ne neviditelný
1px input (klávesnicová navigace/tab). */
.file-dropzone__input:focus-visible + .file-dropzone__zone { outline: 2px solid var(--accent-blue-fg); outline-offset: 2px; }
.file-dropzone__zone.is-dragover { border-color: var(--accent-blue-fg); background: var(--accent-blue-bg); }
.file-dropzone__zone.has-file { border-style: solid; border-color: var(--success); background: var(--accent-green-bg); }
.file-dropzone__icon-svg { width: 32px; height: 32px; color: var(--muted-fg); }
.file-dropzone__zone.has-file .file-dropzone__icon-svg { color: var(--success); }
.file-dropzone__hint { color: var(--muted-fg); font-size: .9rem; }
.file-dropzone__filename { font-weight: 600; font-size: .9rem; word-break: break-all; }

/* `.file-dropzone--compact` - jeden řádek místo velkého centrovaného
boxu, pro husté formuláře (core/_attachments.html "Dokumenty" - Nahrát
je jedno pole mezi Název/Privátní/Úvodní obrázek, ne samostatná
obrazovka jako Import Faktury). Drag&drop funguje stejně, jen menší
zóna. */
.file-dropzone--compact .file-dropzone__zone {
    display: inline-flex;
    flex-direction: row;
    justify-content: flex-start;
    padding: 6px 12px;
    border-style: solid;
    gap: 6px;
}
.file-dropzone--compact .file-dropzone__icon-svg { width: 18px; height: 18px; flex: none; }
.file-dropzone--compact .file-dropzone__hint,
.file-dropzone--compact .file-dropzone__filename {
    font-size: .85rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 260px;
}

/* --- Přihlašovací stránka (dashboard/login.html) - Michal, 2026-09-15:
vlastní login místo Django admin (viz šablony komentář, proč). Vzhled
tamtéž od Michala (mockup login-design.html) - tmavě modré pozadí s
"příhradovým" vzorem (odkaz na vazníkové konstrukce) a siluetou střech
dole, krémová karta uprostřed nahoře. Vlastní paleta/fonty (Manrope,
JetBrains Mono) JEN pro tuhle stránku, ne `var(--primary)` apod. z
zbytku appky - je to samostatná "titulní" obrazovka, ne appka samotná. --- */
.login-page {
    position: relative;
    min-height: 100vh;
    display: flex;
    align-items: flex-start;
    justify-content: center;
    padding: 14vh 16px 16px;
    overflow: hidden;
    font-family: 'Manrope', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
    background:
        radial-gradient(ellipse 900px 600px at 50% 8%, rgba(232,150,60,.16), transparent 60%),
        linear-gradient(180deg, #0e1a2b 0%, #16273f 55%, #0b1420 100%);
}
/* Vzor příhradového vazníku - Michal, 2026-09-15 (druhé kolo mockupu):
PŮVODNÍ verze (dvě diagonály přes sebe) vytvářela vzor kosočtverců,
"bylo to zavádějící" - zaměněno za dlaždici se skutečnou siluetou
vazníku (horní pásy do trojúhelníku + W-diagonály), zjemněné maskou do
ztracena směrem od karty. */
.login-page__truss {
    position: absolute;
    inset: 0;
    opacity: .6;
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='220' height='130'><path d='M0,114 H220' stroke='%2326395a' stroke-width='1.1' fill='none'/><path d='M0,114 L110,32 L220,114' stroke='%2326395a' stroke-width='1.1' fill='none'/><path d='M0,114 L55,80 L110,114 L165,80 L220,114' stroke='%231f2f4d' stroke-width='0.9' fill='none'/></svg>");
    background-repeat: repeat;
    -webkit-mask-image: radial-gradient(ellipse 1200px 900px at 50% 20%, #000 0%, transparent 72%);
            mask-image: radial-gradient(ellipse 1200px 900px at 50% 20%, #000 0%, transparent 72%);
}
/* Spodní pás - dlouhý vodorovný prvek, na kterém "sedí" každý vazník. */
.login-page__chord {
    position: absolute;
    left: 0; right: 0; bottom: 130px;
    height: 1px;
    background: linear-gradient(90deg, transparent, rgba(232,150,60,.35) 20%, rgba(232,150,60,.35) 80%, transparent);
}
.login-page__rooflines {
    position: absolute;
    left: 0; right: 0; bottom: 0;
    height: 130px;
    display: flex;
    align-items: flex-end;
    pointer-events: none;
}
.login-page__rooflines svg { display: block; width: 100%; height: 100%; }

.login-page__box {
    position: relative;
    width: 100%;
    max-width: 360px;
    padding: 36px 32px 32px;
    background: #fbf9f5;
    border-radius: 14px;
    box-shadow: 0 30px 60px -20px rgba(0,0,0,.55), 0 0 0 1px rgba(255,255,255,.04);
}
.login-page__brand {
    font-size: 21px;
    font-weight: 800;
    letter-spacing: -.01em;
    color: #16233a;
    margin: 0 0 2px;
}
.login-page__brand span { color: #c97a2e; }
.login-page__brand-full {
    font-size: 12.5px;
    font-weight: 500;
    color: #5b6b85;
    margin: 0 0 14px;
}
.login-page__brand-sub {
    font-family: 'JetBrains Mono', monospace;
    font-size: 10.5px;
    letter-spacing: .08em;
    color: #5b6b85;
    margin: 0 0 26px;
    opacity: .75;
}
.login-page__error {
    background: var(--error-bg);
    color: var(--error);
    border-radius: 6px;
    padding: 8px 10px;
    font-size: .85rem;
    margin: 0 0 14px;
}
.login-page__box label {
    display: block;
    font-size: 12.5px;
    font-weight: 600;
    color: #5b6b85;
    margin: 0 0 6px;
}
.login-page__box input {
    width: 100%;
    font-family: 'Manrope', sans-serif;
    font-size: 14px;
    padding: 10px 12px;
    margin-bottom: 18px;
    border-radius: 7px;
    border: 1px solid #e2e0d9;
    background: #fff;
    color: #16233a;
    outline: none;
}
.login-page__box input:focus {
    border-color: #e8963c;
    box-shadow: 0 0 0 3px rgba(232,150,60,.18);
}
.login-page__submit {
    width: 100%;
    padding: 11px;
    margin-top: 6px;
    border: none;
    border-radius: 7px;
    background: linear-gradient(180deg, #edaa54, #c97a2e);
    color: #241505;
    font-family: 'Manrope', sans-serif;
    font-size: 14.5px;
    font-weight: 700;
    cursor: pointer;
    box-shadow: 0 6px 16px -4px rgba(201,122,46,.55);
}
.login-page__submit:hover { filter: brightness(1.04); }

/* --- Sbalitelná hlavní navigace (handoff 5a) -------------------------
⤢ vedle loga zúží menu na 62px rail: místo loga oranžový čtverec "ED",
položky jako dvoupísmenné zkratky (data-zkratka) s plným názvem
v tooltipu. Kvůli místu pro harmonogram; stav se ukládá k uživateli
(User.nav_collapsed). Na mobilu (vysouvací menu) se rail nepoužívá. */
.sidebar__head { display: flex; align-items: flex-start; gap: 8px; padding-right: 4px; }
.sidebar__head-text { flex: 1; min-width: 0; }
.sidebar__mark {
    display: none; width: 30px; height: 30px; border-radius: 7px; background: #e0913c; color: #1c1f24;
    align-items: center; justify-content: center; font: 700 11px 'JetBrains Mono', monospace;
}
.sidebar__rail-btn {
    width: 28px; height: 28px; flex: none; border: 0; border-radius: 7px; background: rgba(255,255,255,.08);
    color: rgba(255,255,255,.7); display: flex; align-items: center; justify-content: center; font-size: 13px; cursor: pointer;
}
.sidebar__rail-btn:hover { background: rgba(255,255,255,.16); color: #fff; }
.sidebar__rail-btn--expand { display: none; }
.sidebar__terminal {
    margin: 14px 0 12px; height: 34px; border-radius: 7px; background: rgba(224,145,60,.14);
    border: 1px solid rgba(224,145,60,.32); color: #e8a659; display: flex; align-items: center; justify-content: center;
    gap: 8px; text-decoration: none; flex: none;
}
.sidebar__terminal:hover, .sidebar__terminal.is-active { background: rgba(224,145,60,.22); color: #f2b872; }
.sidebar__terminal-icon { font-size: 12px; }
.sidebar__terminal-text { font-weight: 600; font-size: .78rem; white-space: nowrap; }

@media (min-width: 901px) {
    body.nav-rail { --sidebar-width: 62px; }
    body.nav-rail .sidebar { padding: 16px 12px; align-items: center; }
    body.nav-rail .sidebar__head { padding: 0 0 14px; justify-content: center; }
    body.nav-rail .sidebar__head-text,
    body.nav-rail .sidebar__rail-btn--collapse,
    body.nav-rail .sidebar__submenu,
    body.nav-rail .sidebar__chevron,
    body.nav-rail .sidebar__terminal-text { display: none; }
    body.nav-rail .sidebar__mark { display: flex; }
    body.nav-rail .sidebar__rail-btn--expand { display: flex; width: 34px; height: 30px; margin: 0 auto 10px; }
    body.nav-rail .sidebar__nav { width: 100%; display: flex; flex-direction: column; align-items: center; gap: 6px; overflow-x: hidden; }
    body.nav-rail .sidebar__group { width: auto; }
    body.nav-rail .sidebar__link,
    body.nav-rail .sidebar__group-header {
        width: 38px; height: 34px; padding: 0; margin: 0; justify-content: center; font-size: 0; gap: 0;
    }
    body.nav-rail .sidebar__link > *,
    body.nav-rail .sidebar__group-header > * { display: none; }
    body.nav-rail .sidebar__link::after,
    body.nav-rail .sidebar__group-header::after {
        content: attr(data-zkratka); font: 600 10.5px 'JetBrains Mono', monospace; letter-spacing: .03em;
    }
    body.nav-rail .sidebar__terminal { width: 38px; }
    body.nav-rail .sidebar__footer { width: 100%; display: flex; flex-direction: column; align-items: center; }
}
@media (max-width: 900px) {
    .sidebar__rail-btn { display: none !important; }
}
/* Terminál stroje hned pod položkami menu (ne až u patičky) - menu se
roztahuje jen podle obsahu, patička (Administrace) drží dole. */
.sidebar__nav { flex: 0 1 auto; }
.sidebar__footer { margin-top: auto; }

/* Pozastávka v detailu dokladu (README 9a kap. 2a). */
.retention-offer { margin: 0 0 10px; font-size: .9rem; }
.retention-card { margin-bottom: 12px; padding: 12px 16px; }
.retention-card.is-due { box-shadow: inset 3px 0 0 #d5862f; background: #fdf8f2; }
.retention-card__row { display: flex; gap: 28px; align-items: center; flex-wrap: wrap; }
.retention-card__actions { margin-left: auto; display: flex; gap: 6px; align-items: center; }
.retention-form { margin-bottom: 12px; padding: 12px 16px; display: flex; flex-direction: column; gap: 10px; }
.retention-form__row { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
.retention-form__quick { display: inline-flex; gap: 6px; }
.pay-status--pozastavka, .pay-status--pozastavka_pozadano { background: #f0ece5; color: #6b5c3f; }
.pay-status--pozadat_pozastavku { background: #fdf1e4; color: #8a5a1f; }
.pay-status--po_splatnosti { background: #fae9e4; color: #8f3522; }
.pay-status--uhrazeno { background: #e6efe6; color: #38553a; }

/* Rozpoložkování přijatých dokladů (README 9a kap. 2a-bis). */
.tab-badge { display: inline-block; min-width: 17px; height: 17px; padding: 0 5px; border-radius: 9px; background: #d5862f; color: #fff; font: 600 10px/17px 'JetBrains Mono', monospace; text-align: center; }
.alloc-pie { display: inline-block; width: 18px; height: 18px; border-radius: 50%; vertical-align: middle; }
.alloc-pie--none { background: #fff; box-shadow: inset 0 0 0 1.5px #d5862f; }
.alloc-pie--partial { box-shadow: 0 0 0 1px #d5862f; }
.alloc-bubble { position: fixed; z-index: 1000; width: 280px; background: #fff; border: 1px solid #e7e4df; border-radius: 8px; box-shadow: 0 8px 24px rgba(0,0,0,.14); padding: 10px 12px; font-size: 12px; }
.alloc-bubble__title { display: block; margin-bottom: 6px; }
.alloc-bubble__title--none, .alloc-bubble__title--partial { color: #8a5a1f; }
.alloc-bubble__title--full { color: #38553a; }
.alloc-bubble__row { display: flex; gap: 8px; align-items: center; padding: 2px 0; }
.alloc-bubble__row i, .alloc-part i, .alloc__legend i { width: 9px; height: 9px; border-radius: 2px; flex: none; display: inline-block; }
.alloc-bubble__row span:nth-child(2) { flex: 1; min-width: 0; }
.alloc { padding: 14px 16px; }
.alloc__bar { display: flex; height: 12px; border-radius: 6px; overflow: hidden; background: #eeebe6; }
.alloc__rest { background: repeating-linear-gradient(135deg, #ddd8d1 0 3px, #eeebe6 3px 6px); }
.alloc__legend { display: flex; gap: 14px; align-items: center; flex-wrap: wrap; margin: 8px 0 12px; font-size: 12.5px; }
.alloc__legend span { display: inline-flex; gap: 6px; align-items: center; }
.alloc__todo { color: #a8641f; } .alloc__done { color: #38553a; }
.alloc__bulkbar { display: flex; gap: 10px; align-items: center; background: #1c1f24; color: #fff; border-radius: 9px; padding: 8px 12px; margin-bottom: 10px; flex-wrap: wrap; }
.alloc-row { border-top: 1px solid #f4f2ef; }
.alloc-row summary { display: grid; grid-template-columns: 22px minmax(0, 1.4fr) 90px 100px 120px minmax(0, 2fr); gap: 10px; align-items: center; padding: 8px 4px; cursor: pointer; list-style: none; font-size: 13px; }
.alloc-row summary::-webkit-details-marker { display: none; }
.alloc-row summary:hover { background: #faf9f7; }
.alloc-row__name { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.alloc-row__mini { display: flex; height: 7px; border-radius: 4px; overflow: hidden; background: #eeebe6; }
.alloc-row__tags { display: flex; flex-wrap: wrap; gap: 4px; }
.alloc-tag { font-size: 11.5px; border: 1px solid #ddd8d1; border-left-width: 3px; border-radius: 4px; padding: 1px 6px; white-space: nowrap; }
.alloc-tag--rest { border-style: dashed; border-left-width: 1px; color: #8a5a1f; }
.alloc-tag--over { border-color: #b3452c; color: #8f3522; }
.alloc-row__detail { background: #fcfbf9; padding: 8px 12px 12px 36px; display: flex; flex-direction: column; gap: 6px; }
.alloc-part { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; font-size: 12.5px; }
.alloc-part__target { min-width: 220px; }
.alloc-part--new { border-top: 1px dashed #ddd8d1; padding-top: 8px; }
.alloc-target { display: inline-flex; gap: 6px; align-items: center; }

/* Přijaté faktury v EUR (README 9a kap. 2b). */
.fx-card { padding: 10px 14px; margin-bottom: 10px; display: flex; flex-direction: column; gap: 6px; font-size: 13px; }
.fx-card__row { display: flex; gap: 16px; flex-wrap: wrap; align-items: center; }
.fx-card__warn { color: #8f3522; }

/* Přepínač účtů v Bance "ČSOB CZK · ČSOB EUR" (README 9a kap. 2b). */
.bank-switch { display: inline-flex; gap: 2px; padding: 3px; background: #eeebe6; border-radius: 8px; margin-bottom: 10px; }
.bank-switch__item { padding: 5px 12px; border-radius: 6px; font-size: 13px; font-weight: 600; color: #555; text-decoration: none; }
.bank-switch__item.is-active { background: #fff; color: #1c1f24; box-shadow: 0 1px 2px rgba(0,0,0,.12); }
