  :root {
    color-scheme:light;
    --bg:#f4f4f5;
    --card:#fff;
    --subcard:#fafafa;
    --line:#d4d4d8;
    --accent:#0f2d58;
    --primary:#0f2d58;
    --primary-text:#fff;
    --muted:#71717a;
    --text:#18181b;
    --field:#fff;
    --field-text:#18181b;
    --secondary:#e4e4e7;
    --secondary-text:#27272a;
    --danger:#fee2e2;
    --danger-text:#b91c1c;
    --canvas:#fff;
    --header:#0f2d58;
    --today-bg:#e8f1fe;
    --today-line:#93b7ef;
    --today-text:#0f2d58;
    --tap-ring:rgba(15,45,88,.32);
    /* Stavy nepritomnosti - caka / schvalena / zamietnuta (Filip 2026-07-20) */
    --absence-waiting:#b35c00;
    --absence-ok:#1e7d4f;
    --absence-no:#c02626;
  }
  html[data-theme="dark"] {
    color-scheme:dark;
    --bg:#0f172a;
    --card:#182235;
    --subcard:#111827;
    --line:#334155;
    --accent:#93c5fd;
    --primary:#1d5f9f;
    --primary-text:#f8fafc;
    --muted:#a7b2c4;
    --text:#e5edf8;
    --field:#0f172a;
    --field-text:#f8fafc;
    --secondary:#263449;
    --secondary-text:#e5edf8;
    --danger:#4a1f28;
    --danger-text:#fecdd3;
    --canvas:#fff;
    --header:#08233f;
    --today-bg:#1a3358;
    --today-line:#3f6fb5;
    --today-text:#cfe0fa;
    --tap-ring:rgba(147,197,253,.42);
    /* na tmavom podklade musia byt stavy svetlejsie, inak splynu s kartou */
    --absence-waiting:#f0a03c;
    --absence-ok:#34c98a;
    --absence-no:#f0736b;
  }
  * { box-sizing:border-box; }
  body { margin:0; font-family:-apple-system,Segoe UI,Roboto,Arial,sans-serif; background:var(--bg); color:var(--text); }
  header { background:var(--header); color:#fff; padding:12px 16px; font-size:18px; font-weight:600; position:sticky; top:0; z-index:5; display:flex; align-items:center; justify-content:space-between; gap:12px; }
  .brand { min-width:0; background:none; color:inherit; padding:0; min-height:auto; border:0; border-radius:0; cursor:default; display:flex; align-items:center; }
  .brand.is-home { cursor:pointer; }
  .brand-logo { display:block; height:28px; width:auto; max-width:120px; object-fit:contain; }
  /* Skupina je prilepena vpravo, takze roztiahnuty odznak rastie DOLAVA do prazdneho
     miesta a zvoncek, manual ani nastavenia sa nepohnu (Filip 2026-08-04).
     `flex:1 1 auto` + `min-width:0`: skupina si vezme zvysne miesto po logu a smie sa
     zmensit - bez toho by na uzkom telefone pretiekla mimo obrazovku. */
  .header-actions { display:flex; align-items:center; justify-content:flex-end; gap:8px; min-width:0; flex:1 1 auto; }
  /* Tlacidla neustupuju NIKDY - ked je tesno, ustupi odznak (nizsie `flex:0 1 auto`).
     Inak by sa na uzkom telefone stlacili ikony a tie uz kliknut netrafis. */
  .header-actions .header-btn, .header-actions .icon-btn { flex:0 0 auto; }
  .theme-icon { display:none; }
  main { max-width:680px; margin:0 auto; padding:14px; }
  .auth-main { max-width:420px; padding-top:42px; }
  .card { background:var(--card); border:1px solid var(--line); border-radius:8px; padding:14px; margin-bottom:14px; }
  .card h2 { font-size:14px; margin:0 0 10px; text-transform:uppercase; letter-spacing:.03em; color:var(--muted); }
  label { display:block; font-size:12px; color:var(--muted); margin:8px 0 3px; }
  /* 16px je minimum, pri ktorom iOS Safari NEpriblizi stranku po kliknuti do pola -
     montér musel po kazdom poli odzoomovavat prstami (audit 2026-07-21). */
  input, textarea, select { width:100%; min-width:0; max-width:100%; padding:10px; border:1px solid var(--line); border-radius:8px; font-size:16px; background:var(--field); color:var(--field-text); }
  /* checkboxy nesmu dedit padding/border/background z generickeho input pravidla -
     inak niektore vysli ako velke ramcekove boxy a boli roznej velkosti (Filip 2026-07-28).
     Jednotna natívna velkost + firemny akcent. */
  input[type="checkbox"] { width:auto; flex:none; padding:0; border:none; background:none;
    border-radius:0; min-height:0; accent-color:var(--primary); }
  input[type="date"], input[type="time"] { -webkit-appearance:none; appearance:none; }
  input::placeholder, textarea::placeholder { color:var(--muted); opacity:.82; }
  textarea { min-height:90px; resize:vertical; }
  .row2 { display:grid; grid-template-columns:1fr 1fr; gap:8px; }
  button { font-size:15px; padding:12px 14px; border:none; border-radius:8px; background:var(--primary); color:var(--primary-text); font-weight:600; cursor:pointer; }
  .header-actions .header-btn { padding:7px 9px; font-size:12px; background:rgba(255,255,255,.14); color:#fff; border:1px solid rgba(255,255,255,.22); }
  .header-actions .icon-btn { width:34px; height:30px; padding:0; display:grid; place-items:center; }
  .header-actions .icon-btn.active { background:#fff; color:var(--header); border-color:#fff; }
  .header-actions .icon-btn svg { width:18px; height:18px; display:block; stroke:currentColor; }
  button.sec, label.sec { background:var(--secondary); color:var(--secondary-text); }
  button.danger { background:var(--danger); color:var(--danger-text); }
  button.lnk { background:none; color:var(--accent); padding:6px; font-weight:600; }
  button:disabled { opacity:.5; }

  /* Odznak prihlaseneho: kruzok s velkym zaciatocnym pismenom, ktory sa po kliknuti
     ROZTIAHNE na pilulku a dopise zvysok mena ("R" -> "Root"). Ziadny stitok vedla -
     je to jeden a ten isty prvok, len siri (Filip 2026-08-04).

     Odznak je <button>, takze naň plati aj vseobecne pravidlo pre tlacidla vyssie
     (padding 12px, border-radius 8px) - z kruzku by bol OBDLZNIK. Preto dve poistky
     naraz: vyssia specificita (`.header-actions .user-badge`) A umiestnenie AZ ZA
     tymi pravidlami. Staci jedna, ale takto to plati aj keby niekto poradie prehodil.

     `border-radius:999px`, nie 50%: pri 30x30 je to rovnaky kruh, ale ked sa odznak
     rozsiri, 50% by z neho spravilo elipsu. Takto je z toho pilulka so zaoblenymi koncami. */
  .header-actions .user-badge {
                /* `flex:0 1 auto`: v tesnom priestore sa zmensi az na min-width (kruzok),
                   takze roztiahnutie nikdy nevytlaci tlacidla mimo obrazovku. Meno sa
                   vtedy oreze bodkami - presne to si Filip vybral. */
                flex:0 1 auto; display:inline-flex; align-items:center; justify-content:center;
                box-sizing:border-box; min-width:30px; height:30px; padding:0 8px;
                border-radius:999px; font-size:13px; font-weight:700; line-height:1;
                color:#fff; background:rgba(255,255,255,.18);
                border:1px solid rgba(255,255,255,.35); user-select:none; cursor:pointer;
                overflow:hidden; white-space:nowrap; }
  .header-actions .user-badge:hover { background:rgba(255,255,255,.26); }
  /* Pismeno je VZDY velke, aj ked ma clovek meno malymi ("root" -> "Root"). */
  .badge-initial { text-transform:uppercase; }
  /* Zvysok mena je zbaleny na nulovu sirku; po kliknuti sa rozvinie. Prechod je na
     `max-width`, nie na `width:auto` - to sa animovat neda.
     Dlhe meno sa oreze bodkami (Filip 2026-08-04): strop 50vw = najviac polovica sirky
     obrazovky, takze hlavicka sa nikdy nerozbije ani na uzkom telefone. Cele meno
     zostava v `title` odznaku. */
  /* `min-width:0` je nutne: bez neho sa polozka vo flexe nezmensi pod sirku obsahu
     a bodky by sa nikdy neukazali. */
  .badge-rest { display:inline-block; min-width:0; max-width:0; overflow:hidden;
                text-overflow:ellipsis; transition:max-width .22s ease; }
  .header-actions .user-badge[aria-expanded="true"] .badge-rest { max-width:50vw; }
  @media (prefers-reduced-motion: reduce) { .badge-rest { transition:none; } }
  .btnrow { display:flex; gap:8px; flex-wrap:wrap; margin-top:8px; }
  @media (min-width:641px) { #calendarApproveAllBtn:not(.hidden) { margin-left:auto; } }
  .final-actions { display:grid; grid-template-columns:1fr; gap:8px; }
  .final-actions button { width:100%; }
  .is-logged-out .header-actions { display:none; }
  .login-actions { justify-content:center; margin-top:6px; }
  #loginBtn { width:100%; min-height:40px; padding:10px; font-size:14px; }
  .module-grid { display:grid; grid-template-columns:1fr; gap:8px; }
  /* skupiny funkcii v menu (Filip 2026-07-17): Zakazka / Prehlad / Ostatne */
  .module-group + .module-group { margin-top:14px; padding-top:12px; border-top:1px solid var(--line); }
  .module-group-title { font-size:12px; font-weight:700; text-transform:uppercase; letter-spacing:.05em;
    color:var(--muted); margin-bottom:8px; }
  .dashboard-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(130px,1fr)); gap:8px; margin-top:10px; }
  .dashboard-stat { border:1px solid var(--line); border-radius:8px; padding:9px; background:var(--subcard); }
  .dashboard-stat strong { display:block; font-size:20px; margin-top:3px; }
  .module-btn { width:100%; min-height:52px; text-align:left; transition:background .15s ease, color .15s ease;
    display:flex; align-items:center; gap:12px; }
  .module-btn:hover { background:var(--primary); color:var(--primary-text); }
  /* ikona modulu: obrysova, dedi farbu textu (funguje v svetlom aj tmavom rezime aj pri hoveri) */
  .module-icon { width:22px; height:22px; flex:0 0 22px; stroke:currentColor; opacity:.85; }
  .module-btn:hover .module-icon { opacity:1; }
  .module-topbar { justify-content:flex-start; margin-bottom:8px; }
  .home-btn, .icon-btn { display:inline-flex; align-items:center; gap:6px; }
  .home-icon { width:17px; height:17px; display:block; background:currentColor; -webkit-mask:url("/home.svg") center / contain no-repeat; mask:url("/home.svg") center / contain no-repeat; }
  .refresh-icon { width:16px; height:16px; display:block; background:currentColor; -webkit-mask:url("/refresh.svg") center / contain no-repeat; mask:url("/refresh.svg") center / contain no-repeat; }
  .back-icon { width:16px; height:16px; display:block; background:currentColor; -webkit-mask:url("/back.svg") center / contain no-repeat; mask:url("/back.svg") center / contain no-repeat; }
  .edit-icon { width:16px; height:16px; display:block; background:currentColor; -webkit-mask:url("/edit.svg") center / contain no-repeat; mask:url("/edit.svg") center / contain no-repeat; }
  .offline-icon { width:16px; height:16px; display:block; background:currentColor; -webkit-mask:url("/offline.svg") center / contain no-repeat; mask:url("/offline.svg") center / contain no-repeat; }
  /* Offline rezim manualov zapnuty -> tlacidlo zvyraznene ako aktivne (Filip 2026-07-28) */
  #manualsOfflineBtn.active { background:var(--primary); color:var(--primary-text); }
  .filter-icon { width:16px; height:16px; display:block; background:currentColor; -webkit-mask:url("/filter.svg") center / contain no-repeat; mask:url("/filter.svg") center / contain no-repeat; }
  /* nazov | mnozstvo | jednotka | rozdelit | zmazat (+ zaskrtavatko vlavo pri pokyne) */
  .mat-row { display:grid; grid-template-columns:minmax(0,1fr) 70px 60px auto; gap:6px; align-items:end; margin-bottom:6px; }
  .mat-row.with-note { grid-template-columns:minmax(0,1fr) 70px 60px minmax(110px,.8fr) auto; }
  /* Pokyn začína v jednom riadku. Názov a poznámka rastú podľa obsahu a flexbox
     presunie až tie polia, ktoré sa už na PC/tablet/telefón fyzicky nezmestia. */
  .mat-row.dynamic-material-row, .task-row.dynamic-task-row {
    display:flex; flex-wrap:wrap; justify-content:flex-start; width:100%; }
  .dynamic-material-row .mont-dynamic-field, .dynamic-task-row .mont-dynamic-field {
    flex:1 0 var(--mont-field-width, 100px); max-width:100%; min-width:0; }
  .dynamic-material-row .mont-name-field, .dynamic-task-row .mont-name-field { order:1; }
  .dynamic-material-row .mont-qty-field { flex:0 0 70px; order:2; }
  .dynamic-material-row .mont-unit-field { flex:0 0 60px; order:3; }
  .dynamic-material-row.with-note .mont-note-field { order:4; }
  .dynamic-material-row.with-note .mat-actions { flex:0 0 auto; order:5; }
  /* Názov sa prepne na celý riadok iba podľa vlastného obsahu. Pod ním zostanú
     množstvo, jednotka, pružná poznámka a celá skupina tlačidiel spolu. */
  .dynamic-material-row.mont-name-full .mont-name-field { flex:0 0 100%; }
  .dynamic-material-row:not(.with-note) .mat-actions { flex:0 0 auto; order:4; }
  /* Až vlastný dlhý text dá poznámke celý riadok. Tlačidlá sa vtedy zaradia hneď
     za jednotku, takže názov + ovládanie + poznámka vytvoria najviac tri riadky. */
  .dynamic-material-row.mont-note-full .mat-actions { order:4; }
  .dynamic-material-row.mont-note-full .mont-note-field { flex:0 0 100%; order:5; }
  .dynamic-task-row .mont-note-field { order:2; }
  .dynamic-task-row > .del { flex:0 0 auto; order:3; }
  /* Úkony kopírujú dynamiku materiálu, ale s jediným tlačidlom: dlhý názov sám
     obsadí riadok, dlhá poznámka sa oddelí iba podľa svojho vlastného obsahu. */
  .dynamic-task-row.mont-name-full:not(.mont-note-full) .mont-name-field { flex:0 0 100%; }
  .dynamic-task-row.mont-note-full > .del { order:2; }
  .dynamic-task-row.mont-note-full .mont-note-field { flex:0 0 100%; order:3; }
  .dynamic-task-row.mont-note-full .mont-name-field { max-width:calc(100% - 46px); }
  /* Všeobecný label má 3 px spodný okraj. Tlačidlo ho nemá, preto opticky viselo
     nižšie; v riadkoch pokynu musia spodné hrany polí a tlačidiel presne lícovať. */
  .dynamic-material-row > .of, .dynamic-task-row > .of { margin-bottom:0; }
  .mat-row input, .mat-row select, .mat-row textarea { padding:8px; font-size:16px; }
  /* Montážny pokyn: celý diktát sa zalomí a pole dorastie namiesto vodorovného posúvania. */
  textarea.mont-grow-text { min-height:40px; height:40px; overflow:hidden; resize:none;
    line-height:1.35; white-space:pre; overflow-wrap:normal; }
  textarea.mont-grow-text.mont-wrap-text { white-space:pre-wrap; overflow-wrap:anywhere; }
  .dynamic-task-row textarea.mont-grow-text { padding:8px; font-size:16px; }
  /* tlacidla riadku (📖 ⿲ ✕) pokope vpravo, mensie - nech nevytrcaju */
  .mat-actions { display:flex; gap:5px; align-items:end; justify-content:flex-end; }
  /* Tlacidla riadku (✕ ⿲ 📖) = rovnake stvorce vysoke ako pole, zarovnane k nemu,
     jednotne velke (Filip 2026-07-28). */
  .mat-row .del, .task-row .del { display:inline-flex; align-items:center; justify-content:center;
    width:40px; height:40px; padding:0; font-size:16px; font-weight:400; line-height:1;
    border:1px solid transparent; border-radius:8px; box-sizing:border-box;
    background:var(--danger); color:var(--danger-text); }
  .mat-row .manual-lookup-btn { width:40px; height:40px; padding:0; font-size:18px;
    background:var(--field); color:var(--field-text); border:1px solid var(--line); border-radius:8px; }
  .task-row { display:grid; grid-template-columns:minmax(0,.85fr) minmax(0,1fr) auto; gap:6px; align-items:end; margin-bottom:6px; }
  /* Ponuka: nastavenia vpravo v liste, Domov vlavo */
  .offer-topbar { justify-content:space-between; }
  .offer-saved { color:#1d7a3c; font-weight:700; align-self:center; }
  /* Telefon/tablet: nastavenia sa rozbalia priamo v strankе */
  /* Manualy / Support */
  .manual-photo-grid { display:grid; grid-template-columns:repeat(auto-fill, minmax(140px, 1fr)); gap:10px; margin:8px 0; }
  /* Aj malé náhľady môžu byť priehľadné schémy s tmavými čiarami.
     Biely podklad ich udrží čitateľné v tmavom režime. */
  .manual-photo { border:1px solid var(--line); border-radius:10px; overflow:hidden; background:#fff; }
  .manual-photo img { width:100%; height:110px; object-fit:cover; display:block; cursor:pointer; background:#fff; }
  .manual-photo .caption { font-size:.85em; padding:6px 8px; }
  /* Čítacie zobrazenie manuálu (Filip 2026-07-28) */
  .manual-view h2 { font-size:19px; margin:6px 0 2px; }
  .manual-view .manual-view-sub { color:var(--muted); font-size:13px; margin-bottom:8px; display:flex; gap:8px; flex-wrap:wrap; align-items:center; }
  .manual-view .manual-view-body { white-space:pre-wrap; line-height:1.5; margin:10px 0; }
  .manual-view .group-title { margin-top:14px; }
  /* Veľké obrázky priamo v zobrazení - nech vidno obsah bez rozklikávania */
  .manual-view-figure { margin:10px 0; }
  /* Schémy z manuálov bývajú PNG s priehľadným pozadím a tmavými čiarami.
     Musia mať preto stále biely „papier“, inak v tmavom režime splynú s kartou. */
  .manual-view-figure img { width:100%; height:auto; max-height:78vh; object-fit:contain;
    border:1px solid var(--line); border-radius:10px; background:#fff; display:block; cursor:zoom-in; }
  .manual-view-figure figcaption { font-size:13px; color:var(--muted); margin-top:4px; }
  .manual-view-pdf { display:flex; gap:8px; align-items:center; flex-wrap:wrap; padding:8px 0; }
  /* Fullscreen prezeranie obrázka */
  .manual-lightbox { position:fixed; inset:0; z-index:2000; background:rgba(0,0,0,.92);
    display:flex; align-items:center; justify-content:center; padding:16px; cursor:zoom-out; }
  .manual-lightbox img { max-width:100%; max-height:100%; object-fit:contain; background:#fff; }
  .manual-lightbox .manual-lightbox-close { position:absolute; top:14px; right:16px; width:42px; height:42px;
    border-radius:50%; border:none; background:rgba(255,255,255,.15); color:#fff; font-size:22px; cursor:pointer;
    display:flex; align-items:center; justify-content:center; }
  .manual-lightbox .manual-lightbox-cap { position:absolute; left:0; right:0; bottom:16px; text-align:center;
    color:#fff; font-size:14px; padding:0 20px; text-shadow:0 1px 3px rgba(0,0,0,.6); }
  .manual-row { display:flex; align-items:center; gap:8px; padding:8px 10px; border:1px solid var(--line); border-radius:10px; margin:6px 0; flex-wrap:wrap; }
  .manual-row .grow { flex:1; min-width:180px; }
  /* Kontakt je rozbaľovacia karta, nie riadok s prvkami vedľa seba. Pri flexe sa
     dlhý e-mail alebo tlačidlo mohli dostať za pravý okraj úzkeho telefónu. */
  #contactsList .manual-row { display:block; }
  #contactsList .manual-row .hint { overflow-wrap:anywhere; word-break:break-word; }
  .manual-phone-flagged { color:#b00020; font-weight:600; }
  .manual-group-title { font-weight:700; margin:14px 0 4px; }

  /* Rezim navrhu (technik bez cien): cenove casti sa skryju, navrhove ukazu */
  #offerCard .offer-draft-only { display:none; }
  #offerCard.offer-draft .offer-draft-only { display:block; }
  #offerCard.offer-draft .offer-price-only,
  #offerCard.offer-draft .offer-purchase,
  #offerCard.offer-draft .offer-recommended,
  #offerCard.offer-draft .offer-margin,
  #offerCard.offer-draft .offer-item-result { display:none !important; }
  #offerCard.offer-draft .offer-item .offer-price-field { display:none !important; }
  .offer-settings { margin:8px 0 12px; }
  .offer-settings-inner { border:1px solid var(--line); border-radius:10px; padding:12px; background:var(--subcard); }
  .offer-settings-head { display:flex; justify-content:space-between; align-items:center; margin-bottom:8px; }
  .offer-settings-head .sec { padding:4px 10px; min-height:auto; }
  /* Kazda kolonka v ponuke ma nad sebou jemny popis, aby bolo vidno, co sa kam zadava. */
  .of { display:flex; flex-direction:column; gap:2px; min-width:0; }
  .of > span { font-size:11px; color:var(--muted); line-height:1.2; white-space:nowrap;
    overflow:hidden; text-overflow:ellipsis; }
  .of > input { width:100%; }
  /* Praca: pocet ludi x hodiny (x vlastna sadzba) */
  .offer-labour { display:grid; gap:6px; align-items:end; margin-bottom:8px;
    grid-template-columns:minmax(90px,1.6fr) minmax(46px,.5fr) minmax(52px,.6fr) minmax(72px,.9fr) 40px; }
  .offer-labour input { padding:8px; font-size:16px; }
  .offer-labour .del { display:inline-flex; align-items:center; justify-content:center; width:40px; height:40px;
    padding:0; font-size:16px; font-weight:400; line-height:1; border:1px solid transparent; border-radius:8px;
    box-sizing:border-box; background:var(--danger); color:var(--danger-text); }
  .offer-labour-result { grid-column:1 / -1; font-size:12px; }
  @media (max-width:640px) {
    .offer-labour { grid-template-columns:minmax(0,1fr) 32px; }
    .offer-labour .of { grid-column:1 / -1; }
    .offer-labour .of-labour-label { grid-column:1 / 2; grid-row:1; }
    .offer-labour .del { grid-column:2 / 3; grid-row:1; }
  }
  /* Pocitac: siroke rozlozenie - vlavo skladanie, vpravo sucty (drzia sa pri skrolovani).
     main ma inak 680 px; pri ponuke ho rozsirime, lebo skladanie potrebuje miesto. */
  @media (min-width:1024px) {
    body.cal-wide main { max-width:1180px; }
    /* Ponuka a faktúra na PC: plná šírka monitora - polia položiek (názov, typ, ks…) sú
       tým širšie a prehľadnejšie; čím väčší monitor, tým viac miesta (Filip 2026-07-28). */
    body.offer-wide main { max-width:none; }
    /* Kalendar na PC: dvojpanel v mesiaci (vlavo mriezka, vpravo agenda vybraneho dna).
       CSS mriezku zapne LEN tu (siroke okno); na mobile/tablete zostane jeden stlpec. */
    .calendar-layout.has-detail { display:grid; grid-template-columns:minmax(0,1fr) 330px; gap:14px; align-items:start; }
    .calendar-layout.has-detail .calendar-detail { display:block; position:sticky; top:8px; align-self:start;
      max-height:calc(100vh - 130px); overflow:auto; border:1px solid var(--line); border-radius:10px;
      padding:10px; background:var(--field); }
    /* tyzden/zoznam na PC: den-skupiny tecu do stlpcov (den = jeden stlpec), vyuziju sirku */
    .cal-wide .calendar-list.cal-multicol { columns:300px; column-gap:10px; }
    .cal-wide .calendar-list.cal-multicol .calendar-day-group { break-inside:avoid; margin-bottom:10px; }
    .offer-layout { display:grid; grid-template-columns:minmax(0,1fr) 360px; gap:18px; align-items:start; }
    .offer-side { position:sticky; top:74px; }
    /* nastavenia ako popup okno cez obrazovku */
    .offer-settings:not(.hidden) { position:fixed; inset:0; z-index:20; margin:0;
      background:rgba(0,0,0,.45); display:flex; align-items:center; justify-content:center; padding:20px; }
    .offer-settings .offer-settings-inner { background:var(--card); max-width:640px; width:100%;
      max-height:85vh; overflow:auto; box-shadow:0 12px 40px rgba(0,0,0,.3); }
  }
  /* Ponuka: riadok polozky (nazov, typ, ks, nakup, doporucena, marza, krizik) + vysledok pod nim */
  .offer-item { display:grid; gap:6px; align-items:end; margin-bottom:8px; padding-bottom:8px;
    border-bottom:1px solid var(--line);
    /* názov, typ, ks, jedn., nákup, doporučená, marža, poznámka, split, remove */
    grid-template-columns:minmax(78px,1.3fr) minmax(74px,1.1fr) minmax(42px,.45fr) minmax(46px,.45fr) minmax(58px,.75fr) minmax(64px,.8fr) minmax(50px,.55fr) minmax(88px,1.2fr) 40px 40px; }
  /* Rovnaké pravidlá ako materiál dokladov, bez zásahu do cenových výpočtov. */
  .offer-item.dynamic-offer-row { display:flex; flex-wrap:wrap; justify-content:flex-start; width:100%; }
  .dynamic-offer-row .mont-dynamic-field { flex:1 0 var(--mont-field-width, 88px); max-width:100%; min-width:0; }
  .dynamic-offer-row .mont-name-field { order:1; }
  .dynamic-offer-row .mont-type-field { order:2; }
  .dynamic-offer-row .offer-qty-field { flex:0 0 42px; order:3; }
  .dynamic-offer-row .offer-unit-field { flex:0 0 46px; order:4; }
  .dynamic-offer-row .offer-purchase-field { flex:0 0 58px; order:5; }
  .dynamic-offer-row .offer-recommended-field { flex:0 0 64px; order:6; }
  .dynamic-offer-row .offer-margin-field { flex:0 0 50px; order:7; }
  .dynamic-offer-row .mont-note-field { order:8; }
  .dynamic-offer-row .offer-item-actions { flex:0 0 auto; order:9; display:flex; gap:6px; align-items:flex-end; }
  .dynamic-offer-row .offer-item-result, .dynamic-offer-row .offer-source { flex:0 0 100%; order:10; }
  .dynamic-offer-row.mont-name-full .mont-name-field { flex:0 0 100%; }
  .dynamic-offer-row.mont-type-full .mont-type-field { flex:0 0 100%; }
  .dynamic-offer-row.mont-note-full .offer-item-actions { order:8; }
  .dynamic-offer-row.mont-note-full .mont-note-field { flex:0 0 100%; order:9; }
  .dynamic-offer-row > .of { margin-bottom:0; }
  .offer-item input, .offer-item textarea { padding:8px; font-size:16px; }
  .offer-item .del { display:inline-flex; align-items:center; justify-content:center; width:40px; height:40px;
    padding:0; font-size:16px; font-weight:400; line-height:1; border:1px solid transparent; border-radius:8px;
    box-sizing:border-box; background:var(--danger); color:var(--danger-text); }
  .offer-item-result { grid-column:1 / -1; font-size:12px; }
  /* Odhad nakupnej ceny (predajna / marza): jemny, sedy - je to len pomocka, nic sa nevyplna samo. */
  .offer-implied-hint { color:var(--muted); opacity:.75; }
  .offer-item-result .lnk { font-size:12px; padding:0 2px; }
  /* Zoznam "chyba toto" - kratke vety, nech je hned vidno, co doplnit. */
  #offerChecks { border:1px solid var(--line); border-left:3px solid #d08700; border-radius:10px;
    padding:10px 12px; background:var(--subcard); margin-bottom:10px; }
  /* Hlaska o testovacom rezime - musi byt vidiet aj offline, preto ziadne volanie servera */
  .test-mode-overlay { position:fixed; inset:0; z-index:100; background:rgba(0,0,0,.55);
    display:flex; align-items:center; justify-content:center; padding:20px; }
  .test-mode-box { background:var(--card); border:1px solid var(--line); border-left:4px solid #d08700;
    border-radius:12px; padding:18px 20px; max-width:420px; box-shadow:0 12px 40px rgba(0,0,0,.35); }
  .test-mode-title { font-weight:700; font-size:15px; margin-bottom:8px; }
  .test-mode-text { font-size:13px; line-height:1.5; color:var(--muted); margin-bottom:14px; }
  .test-mode-text a { color:inherit; font-weight:600; }
  .test-mode-box button { width:100%; }
  .offer-checks-head { font-weight:700; font-size:13px; margin-bottom:4px; }
  /* Nahrate cenniky: nazov + velkost vlavo, stiahnut/zmazat vpravo */
  .price-list-row { display:grid; grid-template-columns:minmax(0,1fr) auto auto; gap:8px;
    align-items:center; padding:8px 0; border-bottom:1px solid var(--line); }
  .price-list-row .pl-name { font-size:13px; word-break:break-word; }
  .price-list-row .pl-meta { font-size:11px; color:var(--muted); }
  .price-list-row .sec, .price-list-row .del { padding:6px 10px; min-height:auto; font-size:12px; }
  /* Cenník, z ktorého sa nedá čítať, nesmie vyzerať rovnako dobre ako funkčný. */
  .pl-problem { margin-top:4px; font-size:12px; line-height:1.35; color:var(--danger-text); }
  .pl-stale { margin-top:4px; font-size:12px; line-height:1.35; color:var(--muted); }
  .price-list-row .del { background:var(--danger); color:var(--danger-text); border-radius:8px; }
  .pl-kind { display:inline-block; font-size:10px; font-weight:700; padding:1px 5px; border-radius:4px;
    background:var(--subcard); border:1px solid var(--line); margin-right:5px; }
  /* Varianty vo vysledkoch (zakladna/stredna/vyssia/najvyssia) - farebny stitok + pruzok
     riadku, nech je na prvy pohlad vidiet, co je ktora uroven (Adam 2026-07-17).
     Farby su pevne (funguju v svetlej aj tmavej teme, text vzdy biely). */
  .variant-badge { display:inline-block; font-size:10px; font-weight:700; letter-spacing:.04em;
    padding:2px 8px; border-radius:10px; margin-right:7px; color:#fff; vertical-align:middle;
    white-space:nowrap; }
  .vb-zakladna { background:#6b7280; }
  .vb-stredna { background:#2563eb; }
  .vb-vyssia { background:#d97706; }
  .vb-najvyssia { background:#7c3aed; }
  .price-list-row.variant-row { padding-left:10px; border-left:4px solid transparent; }
  .price-list-row.vrow-zakladna { border-left-color:#6b7280; }
  .price-list-row.vrow-stredna { border-left-color:#2563eb; }
  .price-list-row.vrow-vyssia { border-left-color:#d97706; }
  .price-list-row.vrow-najvyssia { border-left-color:#7c3aed; }
  /* Uz zvoleny typ v navrhu zostavy: zelene tlacidlo + jemne podfarbeny riadok */
  button.type-in-use, .price-list-row .sec.type-in-use { background:#1a7f37; color:#fff;
    border-color:#1a7f37; opacity:1; }
  .price-list-row.type-in-use-row { background:color-mix(in srgb, #1a7f37 8%, transparent); }
  /* Dialog "Ponuka nie je uplna" / kompatibilita: dve tlacidla vedla seba,
     primarne = Dopracovat ponuku (Adam 2026-07-17) */
  .offer-confirm-box { max-width:520px; }
  .offer-confirm-box .offer-checks-list { max-height:45vh; overflow-y:auto; }
  .offer-confirm-actions { display:flex; gap:8px; margin-top:14px; }
  .offer-confirm-actions button { flex:1; width:auto; }
  /* vynimky limitov nepritomnosti pri uprave konta (bod 7) */
  .abs-person-limits-inline { display:flex; flex-wrap:wrap; gap:10px; margin-top:4px; }
  .abs-person-limits-inline > div { display:flex; flex-direction:column; }
  .abs-person-limits-inline input { width:90px; }
  /* podpisove platno v dialogu (podpis zapisu z porady, bod 15) */
  .sign-dialog-pad { margin-top:10px; }
  .sign-dialog-canvas { width:100%; height:150px; border:1px solid var(--line);
    border-radius:8px; background:#fff; display:block; }
  /* dialog s textovym polom (nahrada window.prompt) a dialog s volbami */
  .app-dialog-input { width:100%; margin-top:10px; }
  /* Kalendárik na výber dňa (Presunúť) - ťukni na deň, netreba písať (Filip 2026-07-22) */
  .app-datepicker { margin-top:12px; }
  .dp-head { display:flex; align-items:center; gap:8px; margin-bottom:8px; }
  .dp-label { flex:1; text-align:center; font-weight:600; font-size:15px; }
  .dp-nav { width:40px; padding:8px 0; background:var(--secondary); color:var(--secondary-text); font-size:18px; line-height:1; }
  .dp-dow { display:grid; grid-template-columns:repeat(7,1fr); gap:4px; margin-bottom:4px; }
  .dp-dow span { text-align:center; font-size:11px; color:var(--muted); font-weight:600; }
  .dp-grid { display:grid; grid-template-columns:repeat(7,1fr); gap:4px; }
  .dp-day { padding:0; height:40px; background:var(--field); color:var(--field-text); border:1px solid var(--line); font-weight:500; font-size:15px; }
  .dp-day.dp-we, .dp-dow span.dp-we { color:var(--danger-text); }
  .dp-day.dp-sel { background:var(--primary); color:var(--primary-text); border-color:var(--primary); }
  .dp-day.dp-off { opacity:.32; background:var(--subcard); }
  .dp-day:disabled { cursor:default; }
  .app-dialog-choices { display:flex; flex-direction:column; gap:8px; margin-top:12px; }
  .app-dialog-choices button { width:100%; }
  /* Kompatibilita zostavy: pri nesulade cerveny ram, nech sa neda prehliadnut */
  #offerCompat { border:1px solid var(--line); border-radius:10px; padding:10px 12px; margin-bottom:10px; }
  #offerCompat.offer-compat-bad { border-color:#b00020; background:color-mix(in srgb, #b00020 6%, transparent); }
  /* Rozklikavacia tabulka so vsetkymi parametrami zo stranky dodavatela */
  /* Nahrady s podobnymi parametrami - vysunu sa pod polozkou */
  .similar-box { border-left:3px solid var(--line); margin:0 0 8px 12px; padding:6px 0 6px 10px;
    font-size:12px; }
  .pl-specs { margin-top:4px; }
  .pl-specs summary { font-size:11px; color:var(--muted); cursor:pointer; }
  .spec-table { width:100%; border-collapse:collapse; margin:6px 0; font-size:11px; }
  .spec-table th, .spec-table td { text-align:left; vertical-align:top; padding:3px 6px;
    border-bottom:1px solid var(--line); }
  .spec-table th { width:38%; font-weight:600; color:var(--muted); }
  .offer-checks-list { margin:0; padding-left:18px; font-size:13px; line-height:1.45; color:var(--muted); }
  .offer-checks-list li { margin:2px 0; }
  .offer-line { display:flex; justify-content:space-between; gap:12px; padding:4px 0;
    border-bottom:1px solid var(--line); }
  /* Zľava v súčtoch ponuky - výrazná červeno-oranžová, nech je hneď vidno, že sa dáva
     zľava (Filip 2026-07-20; pôvodná tmavomodrá v tmavej téme splývala). */
  .offer-line-discount { color:#e65100; font-weight:700; }
  html[data-theme="dark"] .offer-line-discount { color:#ff8a50; }
  .offer-profit { margin-top:8px; padding:8px; border-radius:8px; background:var(--subcard); }
  @media (max-width:640px) {
    .offer-item { grid-template-columns:minmax(0,1fr) 32px; }
    .offer-item .of { grid-column:1 / -1; }
    /* nazov a krizik drzia prvy riadok vedla seba, ostatne kolonky su pod sebou */
    .offer-item .of-name { grid-column:1 / 2; grid-row:1; }
    .offer-item .del { grid-column:2 / 3; grid-row:1; }
  }
  /* --- Riadok prijemcu -------------------------------------------------------
     Montazny pokyn ma TRI prvky (email, format, krizik), dokumenty STYRI
     (+ zaskrtnutie "s logom"). Pravidla su preto oddelene: kym boli spolocne,
     stvrty prvok sa vtisol do 32px stlpca pre krizik a z textu ostalo "s log"
     (Filip 2026-08-04). */

  /* Montazny pokyn: email + format + krizik */
  #montEmails .task-row { grid-template-columns:minmax(0,1fr) 130px 32px; }
  #montEmails .mont-format { padding:8px; font-size:14px; }

  /* Dokumenty: email + format + "s logom" + krizik */
  #documentEmails .task-row { grid-template-columns:minmax(0,1fr) 120px auto 32px; }
  #documentEmails .mont-format { padding:8px; font-size:14px; }
  /* Riadok zarovnava prvky na spodok (align-items:end), ale zaskrtnutie je nizsie
     nez policka - vlastne zarovnanie na stred ho drzi v jednej linke s ich textom. */
  #documentEmails .recipient-branding { margin:0; align-self:center; white-space:nowrap;
                                        font-size:13px; gap:6px; }
  #documentEmails .recipient-branding input { width:auto; flex:0 0 auto; margin:0; }

  /* Tablet a uzsie okno: email dostane cely riadok, pod nim format + volba + krizik.
     Vsetko zostava viditelne, nic sa neoreze ani nevytlaci mimo obrazovku. */
  @media (max-width:820px) {
    #documentEmails .task-row { grid-template-columns:minmax(0,1fr) auto 32px; }
    #documentEmails .mont-email { grid-column:1 / -1; }
  }

  /* Telefon: montazny pokyn ma svoje povodne zalomenie (email + krizik, format pod nimi) */
  @media (max-width:640px) {
    #montEmails .task-row { grid-template-columns:minmax(0,1fr) 32px; }
    #montEmails .mont-format { grid-column:1 / -1; }
  }
  .task-row input { padding:8px; font-size:16px; }
  /* .task-row .del zladene s .mat-row .del vyssie (rovnaky stvorec) */
  .work-row { border:1px solid var(--line); border-radius:8px; padding:8px; margin-bottom:8px; background:var(--subcard); overflow:hidden; }
  .work-row > * { min-width:0; }
  .work-row label { margin-top:0; }
  .work-row input { height:42px; padding:8px; font-size:16px; line-height:20px; display:block; }
  .work-date { max-width:220px; min-width:0; }
  .work-time-row { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr) minmax(86px,.7fr) 42px; gap:8px; align-items:end; margin-top:6px; }
  .work-time-row > div { min-width:0; }
  .work-worker { margin-top:6px; }
  .work-row .del { width:42px; height:42px; min-height:42px; background:var(--danger); color:var(--danger-text); padding:0; border-radius:8px; align-self:end; display:grid; place-items:center; line-height:1; font-size:16px; font-weight:400; border:1px solid transparent; box-sizing:border-box; }
  .hint { font-size:12px; color:var(--muted); margin-top:6px; }
  #status { font-size:13px; color:var(--accent); min-height:18px; margin-top:8px; }
  #loginStatus, #settingsStatus { min-height:18px; }
  #twoFactorResendBtn { width:100%; margin-top:8px; }
  .settings-grid { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); gap:8px; }
  .password-field { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:8px; align-items:center; }
  .password-field button { margin:0; white-space:nowrap; }
  .settings-section { border:1px solid var(--line); border-radius:8px; background:var(--field); margin-bottom:8px; overflow:hidden; }
  .settings-section summary { min-height:48px; padding:13px 12px; font-weight:700; cursor:pointer; list-style:none; display:flex; align-items:center; justify-content:space-between; gap:10px; }
  .settings-section summary::-webkit-details-marker { display:none; }
  /* ikonka + nazov pod-sekcie nastaveni vlavo (Filip 2026-07-17) */
  .settings-section summary .summary-title { display:inline-flex; align-items:center; gap:8px; min-width:0; }
  .settings-section summary .summary-icon { width:18px; height:18px; flex:0 0 18px; stroke:currentColor; opacity:.75; }
  .settings-section summary::after { content:"+"; width:26px; height:26px; border-radius:8px; display:grid; place-items:center; background:var(--secondary); color:var(--secondary-text); flex:0 0 auto; }
  .settings-section[open] summary { border-bottom:1px solid var(--line); }
  .settings-section[open] summary::after { content:"−"; }
  .settings-panel { padding:12px; }
  .settings-panel > .group-title:first-child { margin-top:0; }
  .profile-details { display:grid; gap:6px; margin-bottom:12px; }
  .profile-detail { display:grid; grid-template-columns:minmax(120px, 0.42fr) 1fr; gap:10px; align-items:baseline; }
  .profile-detail-label { color:var(--muted); font-size:13px; }
  .profile-security { border-top:1px solid var(--line); margin-top:14px; padding-top:14px; }
  #twoFactorDevices > :first-child { margin-top:10px; font-weight:700; }
  .trusted-device-row { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:12px;
    align-items:center; margin-top:8px; padding:10px; border:1px solid var(--line);
    border-radius:8px; background:var(--subcard); }
  .trusted-device-info { display:grid; gap:3px; min-width:0; }
  .trusted-device-info strong { color:var(--text); font-size:14px; overflow-wrap:anywhere; }
  .trusted-device-revoke { min-width:142px; min-height:40px; margin:0; white-space:nowrap; }
  @media (max-width:480px) {
    .trusted-device-row { grid-template-columns:1fr; }
    .trusted-device-revoke { width:100%; }
  }
  /* Nastavenie Authenticatora: kód, potvrdenie a pomocný text nesmú byť nalepené
     v jednom riadku. Grid drží rovnaký vzduch aj na mobile. */
  #twoFactorQrSetup { display:grid; gap:10px; margin-top:12px; }
  #twoFactorQrSetup button { width:fit-content; }
  /* Návod: obsah a hľadanie skrátia cestu k sekcii, samotné texty sa nemenia. */
  .manual-guide-tools { display:flex; gap:8px; margin:10px 0 6px; }
  .manual-guide-tools input { flex:1; min-width:0; }
  .manual-guide-tools button { margin:0; white-space:nowrap; }
  .manual-search-empty { margin:8px 0; padding:12px; border:1px dashed var(--line); border-radius:8px; color:var(--muted); }
  /* Každá téma návodu je samostatný vizuálny blok; text a jeho poradie ostávajú rovnaké. */
  .manual-guide-panel > p { margin:0 0 8px; padding:11px 12px; border:1px solid var(--line); border-radius:8px; background:var(--subcard); }
  .manual-guide-panel > ul { display:grid; gap:8px; margin:0; padding:0; list-style:none; }
  .manual-guide-panel > ul > li { margin:0; padding:11px 12px; border:1px solid var(--line); border-left:4px solid var(--primary); border-radius:8px; background:var(--subcard); }
  .manual-guide-panel > ul > li.manual-account-info { padding:0; border:0; background:transparent; }
  .manual-guide-panel > ol { margin:0; padding:12px 12px 12px 32px; border:1px solid var(--line); border-radius:8px; background:var(--subcard); }
  .manual-guide-panel > ol + p, .manual-guide-panel > ul + p { margin-top:8px; }
  .manual-account-info { list-style:none; margin:10px 0; padding:0; }
  .manual-account-card, .manual-account-note { margin:8px 0; padding:12px; border:1px solid var(--line); border-radius:8px; background:var(--subcard); }
  .manual-account-card { border-left:4px solid var(--primary); }
  .manual-account-card h4 { margin:0 0 6px; font-size:15px; }
  .manual-account-card p, .manual-account-note p { margin:0; }
  .manual-account-card p + p { margin-top:10px; padding-top:10px; border-top:1px solid var(--line); }
  .manual-account-actions { display:grid; grid-template-columns:repeat(2, minmax(0, 1fr)); gap:8px; }
  .manual-account-actions .manual-account-card { margin:0; }
  .manual-account-note { background:var(--today-bg); border-color:var(--today-line); }
  @media (max-width:640px) { .manual-account-actions { grid-template-columns:1fr; } }
  .checkline { display:flex; align-items:center; gap:8px; margin-top:10px; color:var(--text); font-size:13px; }
  #loginView .checkline { color:var(--muted); font-size:12px; margin:8px 0 0; }
  .user-list, .history-list { border:1px solid var(--line); border-radius:8px; overflow:hidden; background:var(--field); }
  .user-row, .history-row { padding:10px; border-top:1px solid var(--line); }
  .user-row:first-child { border-top:none; }
  .history-row:first-child { border-top:none; }
  .user-row summary { cursor:pointer; list-style:none; display:flex; align-items:center; justify-content:space-between; gap:8px; }
  .user-row summary::-webkit-details-marker { display:none; }
  .user-row summary::after { content:"+"; width:26px; height:26px; border-radius:8px; display:grid; place-items:center; background:var(--secondary); color:var(--secondary-text); flex:0 0 auto; }
  .user-row[open] summary::after { content:"−"; }
  .user-row summary > div { min-width:0; }
  .user-account-panel { margin-top:10px; padding-top:10px; border-top:1px solid var(--line); }
  .user-info { min-width:0; }
  .user-info strong { display:block; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .user-meta, .history-meta { display:flex; gap:8px; flex-wrap:wrap; color:var(--muted); font-size:12px; margin-top:2px; }
  .user-edit-grid { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); gap:8px; margin-top:8px; }
  .permission-grid { display:grid; grid-template-columns:repeat(auto-fit, minmax(132px, 1fr)); gap:6px; margin-top:8px; }
  .permission-grid label { margin:0; }
  .locked-banner { border:1px solid var(--danger-text); background:var(--danger); color:var(--danger-text); border-radius:10px; padding:12px 14px; margin:0 0 14px; }
  .locked-banner strong { display:block; margin-bottom:6px; }
  .locked-banner .locked-row { display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-top:6px; }
  .locked-banner .locked-row span { flex:1; min-width:140px; }
  .user-actions { display:flex; flex-direction:column; gap:8px; margin-top:8px; }
  .user-password-actions { display:grid; grid-template-columns:minmax(0,1fr) auto auto; gap:6px; align-items:center; }
  .user-account-actions { display:flex; justify-content:flex-end; gap:6px; flex-wrap:wrap; }
  .user-actions input { padding:8px; font-size:16px; }
  .user-actions button { padding:8px 10px; font-size:13px; }
  .history-row { display:grid; grid-template-columns:auto minmax(0,1fr) auto; gap:8px; align-items:center; }
  .history-row button { padding:8px 10px; font-size:13px; }
  .history-filters { display:grid; grid-template-columns:2fr 1fr 1fr; gap:8px; margin:10px 0; }
  .history-filters label { margin-top:0; }
  .history-actions { display:flex; gap:6px; flex-wrap:wrap; align-items:center; margin:8px 0; }
  .history-actions button { padding:8px 10px; font-size:13px; }
  .history-select { width:20px; height:20px; margin:0; }
  .history-row-actions { display:flex; gap:6px; flex-wrap:wrap; justify-content:flex-end; }
  /* Vyber ponuky/obhliadky v module Ponuka: riadok ma len text + tlacidlo - tlacidlo
     drzi vpravo a vsetky maju rovnaku sirku (Filip 2026-07-17: "hrozne dlhe tlacidlo") */
  .history-row.picker-row { grid-template-columns:minmax(0,1fr) auto; }
  .history-row.picker-row button { width:110px; justify-self:end; }
  .history-storage { border:1px solid var(--line); border-radius:8px; padding:8px; background:var(--subcard); }
  .history-storage.danger { border-color:var(--danger-text); color:var(--danger-text); }
  .history-progress { height:8px; background:var(--secondary); border-radius:999px; overflow:hidden; margin-top:5px; }
  .history-progress > span { display:block; height:100%; background:var(--primary); width:0; }
  .calendar-toolbar, .calendar-filters { display:grid; grid-template-columns:repeat(auto-fit,minmax(135px,1fr)); gap:8px; align-items:end; }
  .calendar-toolbar { margin:10px 0; }
  .calendar-filters { margin-bottom:10px; }
  /* Filter je zapnuty: bodka na tlacidle, nech je jasne, ze zoznam je orezany, aj ked je
     panel zatvoreny (Filip 2026-07-20). */
  #calendarFilterToggle.has-active { background:var(--primary); color:var(--primary-text); }
  .calendar-legend { display:flex; flex-wrap:wrap; gap:6px 12px; padding:9px; margin:10px 0; border:1px solid var(--line); border-radius:8px; background:var(--subcard); font-size:12px; }
  .calendar-legend span { display:inline-flex; align-items:center; gap:5px; }
  /* zalomenie: typy udalosti na jednom riadku, ostatne znacky na dalsom */
  .calendar-legend-break { flex-basis:100%; height:0; }
  /* Nepritomnost nema vlastnu farbu - v legende ju zastupuje prazdny prerusovany stvorcek,
     rovnako ako chip v mesiaci (Filip 2026-07-20). */
  /* Stavy nepritomnosti v legende: prazdny stvorcek s vlasovym obrysom sa na 11px stratil
     (Filip 2026-07-20). Polovica je preto plna farbou stavu, druha zostava prazdna s
     prerusovanym okrajom - presne ako stitok v kalendari. */
  .calendar-dot { width:11px; height:11px; border-radius:3px; display:inline-block; border:1px solid rgba(0,0,0,.18); }
  /* AZ ZA `.calendar-dot`: jeho skratka `border:` prepisala prerusovany obrys a stavy
     nepritomnosti mali v legende obycajnu sivu linku (audit 2026-07-20). */
  .calendar-dot-absence { border-style:dashed; border-color:currentColor;
    background:linear-gradient(135deg, currentColor 0 50%, transparent 50% 100%); }
  .calendar-dot-waiting { color:var(--absence-waiting); }
  .calendar-dot-ok { color:var(--absence-ok); }
  .calendar-dot-no { color:var(--absence-no); }
  .calendar-list { display:grid; gap:8px; margin-top:10px; }
  .calendar-day-group { border:1px solid var(--line); border-radius:9px; padding:8px; background:var(--field); }
  .calendar-day-title { font-weight:700; margin-bottom:7px; }
  /* dnesny den - jemne modre zvyraznenie v zozname aj v mesiaci */
  .calendar-day-group.is-today { background:var(--today-bg); border-color:var(--today-line); }
  .calendar-day-group.is-today .calendar-day-title { color:var(--today-text); }
  .calendar-today-tag { font-weight:600; font-size:11px; margin-left:6px; color:var(--today-text); }
  /* Pracovny vykaz - denna casova os: modre=pracoval, sive=presuny (Filip 2026-07-18) */
  .wr-day { margin:8px 0 2px; }
  .wr-day-head { font-size:12px; color:var(--muted); display:flex; justify-content:space-between; margin:0 0 3px; }
  .wr-timeline { position:relative; height:22px; border-radius:6px; background:var(--bg); border:1px solid var(--line); overflow:hidden; }
  .wr-block { position:absolute; top:0; bottom:0; font-size:10px; line-height:22px; white-space:nowrap; overflow:hidden; padding:0 4px; box-sizing:border-box; }
  .wr-block.work { background:#3178c6; color:#fff; }
  .wr-block.move { background:#9aa3af; color:#141414; }
  .wr-legend { font-size:11px; color:var(--muted); display:flex; gap:14px; margin-top:4px; align-items:center; }
  .wr-legend i { width:11px; height:11px; border-radius:3px; display:inline-block; margin-right:4px; vertical-align:-1px; }
  .wr-legend i.work { background:#3178c6; } .wr-legend i.move { background:#9aa3af; }
  /* Skratka dňa "tu bol, tu bol" + odkazy na zákazkové listy (Filip 2026-07-28) */
  .wr-day-summary { margin:10px 0 2px; display:flex; flex-wrap:wrap; align-items:baseline; gap:4px 8px; }
  .wr-day-summary > strong { font-size:13px; }
  .wr-day-places { color:var(--muted); font-size:13px; }
  .wr-place-link { background:none; border:0; padding:0; margin:0; font:inherit; color:var(--primary);
    text-decoration:underline; cursor:pointer; }
  .wr-place-link:hover { opacity:.8; }
  /* Porovnanie dvoch ľudí vedľa seba */
  .wr-compare { display:grid; grid-template-columns:1fr 1fr; gap:12px; align-items:start; }
  .wr-compare-col { min-width:0; }
  @media (max-width:700px) { .wr-compare { grid-template-columns:1fr; } }
  /* Výkričník admina + poznámka používateľa k dňu (Fáza 2, Filip 2026-07-28) */
  .wr-note { margin:2px 0 6px; display:flex; flex-direction:column; gap:4px; }
  .wr-note-flag { font-size:13px; color:#8a1c1c; background:#fdecec; border:1px solid #f3c2c2;
    border-radius:6px; padding:4px 8px; }
  .wr-note-user { font-size:13px; background:var(--bg); border:1px solid var(--line);
    border-radius:6px; padding:4px 8px; }
  .wr-note-actions { display:flex; flex-wrap:wrap; gap:6px; }
  .wr-note-actions button { padding:2px 8px; font-size:12px; }
  /* Vlastné (ručné) záznamy do výkazu (Fáza 4, Filip 2026-07-28) */
  .wr-manual-tag { color:#5b3d8a; font-weight:600; }
  .wr-entries { margin:2px 0 6px; display:flex; flex-direction:column; gap:4px; }
  .wr-entry-row { display:flex; flex-wrap:wrap; align-items:center; gap:6px; font-size:13px;
    background:var(--bg); border:1px solid var(--line); border-radius:6px; padding:4px 8px; }
  .wr-entry-row > span { flex:1 1 auto; }
  .wr-entry-row button { padding:2px 8px; font-size:12px; }
  /* Prehľadný "job card" montážneho pokynu pre technikov (Filip 2026-07-29) */
  .job-bar { background:#2872cd; color:#fff; font-weight:700; letter-spacing:.5px;
    padding:6px 10px; border-radius:8px; font-size:13px; margin:0 0 6px; }
  .job-place { font-size:20px; font-weight:800; line-height:1.2; margin:2px 0 6px; }
  .job-warn { background:#fff4d6; color:#6b4e00; border:1px solid #f0d488;
    border-radius:8px; padding:6px 10px; font-size:12.5px; margin:0 0 10px; }
  .job-sec { margin:0 0 8px; }
  .job-block { background:var(--bg); border:1px solid var(--line); border-radius:10px; padding:8px 10px; }
  .job-sec-title { font-weight:800; text-transform:uppercase; letter-spacing:.4px; font-size:13px; margin:0 0 4px; }
  .job-item { font-size:15px; line-height:1.5; }
  /* Kroky prace ostavaju doslovne cele, na telefone su len rozdelene do samostatnych
     ocislovanych riadkov. Dlhy postup sa tak necita ako jeden zliaty odsek. */
  .job-tasks { counter-reset:job-step; padding:8px 10px; }
  .job-tasks .job-sec-title { margin:0 0 4px; }
  .job-tasks .job-item { counter-increment:job-step; display:grid; grid-template-columns:28px minmax(0, 1fr);
    gap:8px; align-items:start; padding:8px 0; margin:0; border:0; border-top:1px dashed var(--line);
    overflow-wrap:anywhere; }
  .job-tasks .job-item::before { content:counter(job-step); display:grid; place-items:center; width:24px; height:24px;
    border-radius:50%; background:#2872cd; color:#fff; font-weight:800; font-size:12px; line-height:1; }
  .job-tasks .job-sec-title + .job-item { border-top:0; }
  /* Pod-skupiny v "Zober si" (Zariadenia / Materiál / Náradie) oddelené čiarou */
  .job-subtitle { font-weight:700; font-size:12px; color:var(--muted); text-transform:uppercase;
    letter-spacing:.3px; margin:4px 0 2px; }
  .job-subdiv { border-top:1px dashed var(--line); margin:8px 0 2px; }
  /* AI návrh náradia - odlíšený (nie istá vec, len tip nech nezabudnú) */
  .job-item-navrh { display:flex; align-items:center; gap:6px; color:var(--muted); font-style:italic; }
  .job-navrh-chip { font-style:normal; font-size:10px; font-weight:700; text-transform:uppercase;
    letter-spacing:.4px; background:#fff4d6; color:#6b4e00; border:1px solid #f0d488;
    border-radius:999px; padding:0 6px; line-height:16px; }
  .job-link-row { display:flex; align-items:center; gap:8px; justify-content:space-between; padding:4px 0; }
  .job-link-text { font-size:15px; word-break:break-word; }
  .job-nav-btn, .job-call-btn { flex:none; text-decoration:none; color:#fff; padding:6px 12px;
    border-radius:8px; font-size:13px; font-weight:600; white-space:nowrap; }
  .job-nav-btn { background:#2872cd; } .job-call-btn { background:#1b7a3d; }
  .job-when { font-size:15px; font-weight:600; margin-top:2px; }
  .job-meta-small { font-size:12px; color:var(--muted); margin:2px 0 8px; }
  .job-details { margin:2px 0; border-top:1px dashed var(--line); padding-top:4px; }
  .job-details > summary { cursor:pointer; color:var(--primary); font-size:13px; padding:2px 0; }
  .job-ctx-line { font-size:13px; color:var(--muted); white-space:pre-wrap; margin:2px 0; }
  /* Kontakty podpory naspodku job cardu (Filip 2026-07-29) */
  .job-support-row { display:flex; align-items:center; justify-content:space-between; gap:8px;
    padding:5px 0; font-size:14px; border-top:1px solid var(--line); }
  .job-support-row:first-of-type { border-top:0; }
  .job-support-name { flex:1 1 auto; word-break:break-word; }
  .calendar-item { border:1px solid var(--line); border-left:6px solid var(--accent); border-radius:8px; padding:8px; margin-top:6px; background:var(--card); }
  /* Priorita = pruh vlavo na karte. Iba urgentna a vysoka maju farbu, zvysok je sivy,
     nech farba nesutazi s typom udalosti (Filip 2026-07-20). */
  .calendar-item.priority-nizka, .calendar-item.priority-normalna { border-left-color:#7a8493; }
  /* Urgentna je ta vyrazna cervena, vysoka tmavsia - Filip 2026-07-20 */
  .calendar-item.priority-vysoka { border-left-color:#8f1d1d; }
  .calendar-item.priority-urgentna { border-left-color:#e11d2e; }
  /* Jemny podklad karty v tej istej farbe ako stitok typu. */
  .calendar-item.type-montaz { background:color-mix(in srgb, #2872cd 8%, var(--card)); }
  .calendar-item.type-zakazkovy_list { background:color-mix(in srgb, #8f4e0a 8%, var(--card)); }
  .calendar-item.type-obhliadka { background:color-mix(in srgb, #d81b60 8%, var(--card)); }
  .calendar-item.type-servis { background:color-mix(in srgb, #3d2f93 8%, var(--card)); }
  .calendar-item.type-porada { background:color-mix(in srgb, #f0b400 9%, var(--card)); }
  /* Nepritomnost: farba podla STAVU - caka oranzova, schvalena zelena, zamietnuta cervena,
     zrusena siva (Filip 2026-07-20). */
  .calendar-item.absence-pending, .calendar-item.absence-cancel_requested {
    border-left-color:var(--absence-waiting); background:color-mix(in srgb, var(--absence-waiting) 8%, var(--card)); }
  .calendar-item.absence-approved {
    border-left-color:var(--absence-ok); background:color-mix(in srgb, var(--absence-ok) 8%, var(--card)); }
  .calendar-item.absence-rejected {
    border-left-color:var(--absence-no); background:color-mix(in srgb, var(--absence-no) 8%, var(--card)); }
  .calendar-item.absence-cancelled { border-left-color:#7a8493; opacity:.78; }
  .calendar-item summary { cursor:pointer; list-style:none; }
  .calendar-item summary::-webkit-details-marker { display:none; }
  .calendar-item-head { display:flex; gap:8px; justify-content:space-between; align-items:flex-start; }
  .calendar-badges { display:flex; flex-wrap:wrap; gap:4px; margin-top:4px; }
  .calendar-badge { font-size:11px; padding:2px 6px; border-radius:999px; background:var(--secondary); color:var(--secondary-text); }
  /* Farby typov udalosti (Filip 2026-07-20: povodne pastelove odtiene boli od seba
     nerozoznatelne). Plne odtiene namiesto svetlych tintov - paleta presla validatorom
     na odstup vsetkych dvojic aj pri farbosleposti (najhorsia dvojica servis-zakazkovy
     list: OKLab dE 8.2 deutan, 18.4 pri normalnom videni). Rovnaka v svetlej aj tmavej
     teme: je to VYPLNENY chip s vlastnou farbou pisma, nie tenka znacka na podklade,
     takze odstup drzi v oboch. Text je bud biely, alebo tmavy - podla toho, co ma na
     danej farbe kontrast (najnizsi 4.8:1). */
  .calendar-type-montaz { background:#2872cd; color:#fff; }
  .calendar-type-zakazkovy_list { background:#8f4e0a; color:#fff; }
  .calendar-type-obhliadka { background:#d81b60; color:#fff; }
  .calendar-type-servis { background:#3d2f93; color:#fff; }
  .calendar-type-porada { background:#f0b400; color:#241a00; }
  .calendar-type-ine { background:#64748b; color:#fff; }
  /* Stav podpisu zapisu z porady (Filip 2026-07-28) */
  .calendar-badge.calendar-signed { background:#1b7a3d; color:#fff; }
  .calendar-badge.calendar-awaiting { background:#b4690e; color:#fff; }
  /* Zoznam podpisov v nahlade / detaile zapisu */
  .meeting-signatures { margin-top:8px; display:flex; flex-direction:column; gap:8px; }
  .meeting-signature-row { border:1px solid var(--line); border-radius:8px; padding:6px 8px; }
  .meeting-signature-img { display:block; margin-top:4px; max-width:220px; max-height:90px;
    background:#fff; border:1px solid var(--line); border-radius:6px; padding:2px; }
  /* V tmavej teme su tmavsie odtiene (fialova) blizko farby karty - vlasovy obrys ich
     oddeli, netreba kvoli tomu menit paletu a rozbijat odstupy. */
  html[data-theme="dark"] [class*="calendar-type-"] { border:1px solid rgba(255,255,255,.28); }
  .calendar-month { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); gap:4px; margin-top:10px; }
  .calendar-month-head { text-align:center; font-size:11px; color:var(--muted); padding:4px; }
  .calendar-month-day { min-height:105px; border:1px solid var(--line); border-radius:7px; padding:5px; background:var(--field); overflow:hidden; }
  .calendar-month-day.outside { opacity:.45; }
  .calendar-month-day.is-today { background:var(--today-bg); border-color:var(--today-line); box-shadow:inset 0 0 0 1px var(--today-line); }
  /* vybrany den (jeho agenda je v pravom paneli na PC) */
  .calendar-month-day.is-selected { outline:2px solid var(--accent); outline-offset:-2px; }
  /* Cislo dna: rovnaky kruzok v kazdej bunke, vycentrovany hore - na telefone boli
     cisla ako tlacidla roznej sirky a mriezka posobila rozhadzane (Filip 2026-07-20).
     Selektor cez .calendar-month-day, aby prebil button.sec (pozadie/farba). */
  .calendar-month-day button.calendar-month-date {
    display:flex; align-items:center; justify-content:center;
    width:24px; height:24px; margin:0 auto 4px; padding:0;
    background:none; color:var(--text); border-radius:50%;
    font-weight:700; font-size:12px; line-height:1;
  }
  /* --primary/--primary-text, NIE --accent/#fff: v tmavej teme je --accent svetlomodry
     a biele cislo na nom prakticky nevidno (audit 2026-07-20). */
  .calendar-month-day.is-today button.calendar-month-date { background:var(--primary); color:var(--primary-text); }
  /* Klikacia je cela bunka, nielen cislo - na telefone bol 24px kruzok jediny terc
     a prazdny den sa trafil ledva (audit 2026-07-20). */
  .calendar-month-day { cursor:pointer; }
  /* pravy panel dvojpanelu: default skryty (mobil/tablet aj neme sacne zobrazenia);
     zobrazi ho az .has-detail v PC media query vyssie */
  .calendar-detail { display:none; }
  .calendar-detail-head { display:flex; justify-content:space-between; align-items:center; gap:8px; margin-bottom:8px; }
  .calendar-month-event { width:100%; text-align:left; font-size:10px; padding:3px 4px; margin-top:3px; border-radius:4px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  /* Farebne udalosti aj v mesiaci (Filip 2026-07-20) - vyssia specificita nez button.sec,
     nech typ prebije sedu sekundarnu farbu. Rovnaka paleta ako farebne stitky v zozname. */
  .calendar-month-event.calendar-type-montaz { background:#2872cd; color:#fff; }
  .calendar-month-event.calendar-type-zakazkovy_list { background:#8f4e0a; color:#fff; }
  .calendar-month-event.calendar-type-obhliadka { background:#d81b60; color:#fff; }
  .calendar-month-event.calendar-type-servis { background:#3d2f93; color:#fff; }
  .calendar-month-event.calendar-type-porada { background:#f0b400; color:#241a00; }
  .calendar-month-event.calendar-type-ine { background:#64748b; color:#fff; }
  /* Nepritomnost nie je typ udalosti: prazdny stitok s prerusovanym obrysom vo farbe
     STAVU - caka oranzova, schvalena zelena, zamietnuta cervena (Filip 2026-07-20).
     Prerusovany obrys drzi rozdiel "praca vs. nepritomnost" aj ked farby susedia. */
  .calendar-month-event.calendar-absence { font-weight:600; border:1px dashed currentColor;
    background:color-mix(in srgb, currentColor 18%, var(--field)); }
  .calendar-month-event.calendar-absence-waiting { color:var(--absence-waiting); }
  .calendar-month-event.calendar-absence-ok { color:var(--absence-ok); }
  .calendar-month-event.calendar-absence-no { color:var(--absence-no); }
  .calendar-month-event.calendar-absence-off { color:var(--muted); }
  .calendar-form-actions { display:flex; gap:8px; flex-wrap:wrap; margin-top:8px; }
  .calendar-review-note { margin-top:6px; padding:6px 9px; border-radius:6px; font-size:13px;
    color:var(--text); background:var(--subcard); border-left:3px solid var(--accent); }
  .calendar-editor { margin-top:10px; }
  .calendar-editor .settings-panel { background:var(--subcard); }
  .calendar-chooser h3 { margin:0 0 10px; font-size:16px; }
  /* Formular / vyber typu je SAMOSTATNA obrazovka: mriezka, filtre, legenda aj panel dna
     zmiznu, nech clovek vidi iba to, co vyplna. Horny panel modulu (Domov / Obnovit)
     je mimo .card, takze zostava (Filip 2026-07-20). */
  .calendar-focus h2,
  .calendar-focus #calendarTopActions,
  .calendar-focus .calendar-toolbar,
  .calendar-focus .calendar-filters,
  .calendar-focus .calendar-legend,
  .calendar-focus #calendarDocPreview,
  .calendar-focus .calendar-layout { display:none; }
  .calendar-focus .calendar-editor, .calendar-focus .calendar-chooser { margin-top:0; }
  /* Obnovit by v rozpisanom formulari len prepisalo hlasku ("Nazov je povinny") a inak
     nespravilo nic - v tomto rezime ho skryjeme, Domov zostava (audit 2026-07-20). */
  .calendar-focus #calendarRefreshBtn { display:none; }
  /* Nahlad dokumentu z kalendara = CISTA stranka: len nahlad + horna lista, Domov a
     Obnovit. Skry cely kalendar (nadpis, ovladanie, mriezku) OKREM nahladu; topbar
     (Domov/Obnovit) je mimo .card, takze zostava (Filip 2026-07-23). */
  .calendar-doc-focus h2,
  .calendar-doc-focus #calendarTopActions,
  .calendar-doc-focus .calendar-toolbar,
  .calendar-doc-focus .calendar-filters,
  .calendar-doc-focus .calendar-legend,
  .calendar-doc-focus .calendar-editor,
  .calendar-doc-focus .calendar-chooser,
  .calendar-doc-focus #calendarStatus,
  .calendar-doc-focus .calendar-layout { display:none; }
  /* Editor sa otvara VZDY ako samostatna obrazovka, takze zbalovanie klikom na nadpis
     nema co robit - prec s ikonou aj s klikom (audit 2026-07-20). */
  .calendar-editor > summary { list-style:none; cursor:default; pointer-events:none; }
  .calendar-editor > summary::-webkit-details-marker { display:none; }
  /* dvojita trieda + [open]: musi prebit .settings-section[open] summary::after vyssie */
  .settings-section.calendar-editor > summary::after,
  .settings-section.calendar-editor[open] > summary::after { content:none; display:none; }
  #recBtn.rec { background:#dc2626; }
  .meeting-panel { border:1px solid var(--line); border-radius:8px; padding:10px; margin-top:10px; background:var(--subcard); }
  .meeting-status { min-height:18px; color:var(--accent); font-size:13px; margin-top:8px; white-space:pre-wrap; }
  .meeting-timer { font-size:22px; font-variant-numeric:tabular-nums; font-weight:700; color:var(--text); align-self:center; }
  .draft-recovery { margin-top:8px; border:1px solid var(--line); border-radius:8px; padding:10px; background:var(--subcard); }
  .draft-recovery #draftRecoveryText { font-size:13px; margin-bottom:6px; }
  .meeting-recovery { margin-top:8px; }
  .meeting-recovery-row { border-top:1px solid var(--line); padding:8px 0; }
  .meeting-recovery-row:first-child { border-top:0; }
  canvas { width:100%; height:260px; border:1px dashed var(--line); border-radius:8px; touch-action:none; background:var(--canvas); display:block; }
  #signaturePad { height:120px; border-style:solid; }
  .symbol-panel { margin:8px 0; }
  .symbol-toolbar { display:grid; grid-template-columns:repeat(auto-fit, minmax(84px, 1fr)); gap:6px; margin-top:6px; }
  .symbol-toolbar button { min-width:0; padding:8px 6px; font-size:12px; line-height:1.15; white-space:normal; overflow-wrap:anywhere; background:var(--secondary); color:var(--secondary-text); }
  .symbol-toolbar button.active { background:var(--primary); color:var(--primary-text); }
  .symbol-mark { display:block; font-size:18px; line-height:1; margin-bottom:3px; }
  .symbol-size { display:flex; align-items:center; gap:8px; margin-top:8px; }
  .symbol-size label { margin:0; flex:0 0 auto; }
  .symbol-size input { flex:1 1 auto; padding:0; }
  .symbol-size .hint { margin:0; min-width:48px; text-align:right; }
  .shape-snap { display:flex; align-items:center; gap:8px; margin-top:8px; font-size:13px; }
  .shape-snap input { flex:0 0 auto; width:auto; }
  .canvas-tools { display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-top:8px; }
  .canvas-tools button { padding:8px 10px; min-width:44px; }
  .canvas-tools .hint { margin:0; min-width:78px; text-align:center; }
  .thumbs { display:flex; gap:8px; flex-wrap:wrap; margin-top:8px; }
  .thumb { flex:1 1 148px; max-width:190px; min-width:0; border:1px solid var(--line); border-radius:8px; padding:6px; background:var(--field); }
  .thumb img { width:100%; height:92px; object-fit:cover; border:1px solid var(--line); border-radius:6px; display:block; background:var(--canvas); }
  .thumb-actions { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); gap:4px; margin-top:6px; }
  .thumb-actions button { width:100%; min-width:0; font-size:11px; line-height:1.15; padding:7px 4px; white-space:normal; overflow-wrap:anywhere; }
  @media (max-width: 640px) {
    header { align-items:center; }
    .brand-logo { height:23px; max-width:94px; }
    .header-actions { flex-wrap:wrap; }
    .settings-grid { grid-template-columns:1fr; }
    .user-edit-grid { grid-template-columns:1fr; }
    .user-password-actions { grid-template-columns:1fr; }
    .user-account-actions button { flex:1; }
    .history-row { grid-template-columns:1fr; }
    /* vyber v module Ponuka: tlacidlo drzi vpravo aj na mobile */
    .history-row.picker-row { grid-template-columns:minmax(0,1fr) auto; }
    .history-row > .history-select { grid-row:1; }
    .history-filters { grid-template-columns:1fr; }
    .history-row-actions { justify-content:stretch; }
    .history-row-actions button { flex:1; }
    .calendar-month-day { min-height:72px; padding:3px; }
    .calendar-month-event { font-size:9px; }
    .work-date { max-width:none; }
    .work-time-row { grid-template-columns:minmax(0,1fr) minmax(0,1fr); gap:8px; }
    .mat-row.with-note { grid-template-columns:minmax(0,1fr) 70px 60px auto; }
    .mat-row.with-note .of-note { grid-column:1 / -1; }
    .task-row { grid-template-columns:minmax(0,1fr) auto; }
    .task-row .of-note { grid-column:1 / -1; }
    .thumb { flex-basis:100%; max-width:none; }
    .thumb-actions { grid-template-columns:1fr; }
  }
  .hidden { display:none !important; }
  .group-title { font-weight:600; font-size:13px; margin:12px 0 6px; }

/* Faktury (2026-07-16) */
#invoicesCard .grow { flex:1; min-width:0; }
#invoicesCard select.grow { max-width:100%; }
/* 7 deti: nazov, ks, j., cena, DPH, riadkovy sucet, mazacie tlacidlo (audit 2026-07-17);
   kazda bunka ma maly popisok nad sebou (.of, ako v ponuke - Filip 2026-07-17) */
.invoice-item { display:grid; grid-template-columns: 1fr 70px 60px 100px 70px 90px auto; gap:6px; align-items:end; margin-bottom:6px; }
.invoice-item .inv-line-total { min-height:34px; display:flex; align-items:center; justify-content:flex-end; }
.invoice-item input { width:100%; }
.invoice-item .inv-line-total { font-size:12px; color:var(--muted); white-space:nowrap; text-align:right; }
.invoice-item .inv-del { display:inline-flex; align-items:center; justify-content:center; width:40px; height:40px;
  padding:0; font-size:16px; font-weight:400; line-height:1; border:1px solid transparent; border-radius:8px;
  box-sizing:border-box; background:var(--danger); color:var(--danger-text); min-height:40px; }
.invoice-totals { margin-top:10px; font-size:14px; }
.invoice-totals .grand { font-weight:700; font-size:16px; }
@media (max-width:640px){ .invoice-item { grid-template-columns: 1fr 1fr; } }

/* Statistiky nepritomnosti - prehlad osob (Filip 2026-07-18) */
.abs-stats-scroll { overflow-x:auto; margin:8px 0; }
.abs-stats-table { border-collapse:collapse; width:100%; font-size:14px; min-width:520px; }
.abs-stats-table th, .abs-stats-table td { padding:8px 10px; border-bottom:1px solid var(--line); text-align:left; }
.abs-stats-table th { font-weight:700; white-space:nowrap; }
.abs-stats-table .num { text-align:right; white-space:nowrap; font-variant-numeric:tabular-nums; }
.abs-stats-table .strong { font-weight:700; }
.abs-stats-row { cursor:pointer; }
.abs-stats-row:hover, .abs-stats-row:focus { background:var(--subcard); outline:none; }
.abs-stats-total td { border-top:2px solid var(--line); background:var(--subcard); }
.abs-stats-table tr.abs-over { background:rgba(176,0,32,.10); }
.abs-stats-table tr.abs-near { background:rgba(208,135,0,.12); }
.abs-stats-table td.abs-cell-flag { font-weight:700; }
.abs-summary { display:flex; flex-wrap:wrap; gap:8px; margin:8px 0; }
.abs-chip { display:flex; flex-direction:column; align-items:center; min-width:76px; padding:8px 10px; border:1px solid var(--line); border-radius:8px; background:var(--field); }
.abs-chip strong { font-size:18px; line-height:1.1; }
.abs-chip span { font-size:12px; color:var(--muted); margin-top:2px; }
/* --danger je bledé pozadie; na viditeľný rám treba --danger-text */
.abs-chip.abs-over { border-color:var(--danger-text); background:rgba(176,0,32,.10); }
.abs-chip.abs-near { border-color:#d08700; background:rgba(208,135,0,.12); }
.abs-edit { border:1px solid var(--line); border-radius:8px; background:var(--field); padding:10px; }
.abs-chip .abs-chip-limit { font-size:11px; color:var(--muted); margin-top:1px; }
/* "zostava X dni" pre usera (bod 7) - zvyrazneny, pri prekroceni cerveny */
.abs-chip .abs-chip-remaining { font-size:12px; font-weight:600; color:var(--ok, #15803d); margin-top:1px; }
.abs-chip .abs-chip-remaining.abs-over { color:var(--danger-text, #b00020); }

/* Banner "nová verzia" - verziovanie appky (Filip 2026-07-18, bod 18) */
.update-banner {
  position: fixed; left: 12px; right: 12px; bottom: 12px; z-index: 9999;
  display: flex; align-items: center; gap: 10px;
  padding: 10px 12px; border-radius: 10px;
  background: var(--primary); color: var(--primary-text);
  box-shadow: 0 6px 24px rgba(0,0,0,.28); font-size: 14px;
  max-width: 520px; margin: 0 auto;
}
.update-banner-text { flex: 1; min-width: 0; }
.update-banner-reload {
  flex: 0 0 auto; padding: 7px 14px; border: 0; border-radius: 8px; cursor: pointer;
  background: var(--primary-text); color: var(--primary); font-weight: 700;
}
.update-banner-x {
  flex: 0 0 auto; width: 30px; height: 30px; padding: 0; border: 0; border-radius: 8px;
  cursor: pointer; background: transparent; color: var(--primary-text);
  font-size: 20px; line-height: 1; opacity: .8;
}
.update-banner-x:hover { opacity: 1; }

/* Jednotná vizuálna odozva na klik tlačidla (Filip 2026-07-18, bod 11).
   Univerzálne pre všetky <button>: stlačenie (:active) + krátky pulz (.tap-pulse),
   ktorý pridáva jeden delegovaný listener v 01-core.js. Žiadne prepisovanie handlerov. */
button:active:not(:disabled) { transform: scale(.97); }
@keyframes opom-tap-pulse {
  from { box-shadow: 0 0 0 0 var(--tap-ring); }
  to   { box-shadow: 0 0 0 7px rgba(0,0,0,0); }
}
button.tap-pulse:not(:disabled) { animation: opom-tap-pulse .36s ease-out; }
@media (prefers-reduced-motion: reduce) {
  button:active:not(:disabled) { transform: none; }
  button.tap-pulse { animation: none; }
}

/* Notifikacie / vykricnik v hornej liste (Filip 2026-07-18, bod 9) */
#notifBtn { position: relative; }
.notif-badge {
  position: absolute; top: -3px; right: -3px; min-width: 16px; height: 16px; padding: 0 4px;
  border-radius: 8px; background: #e11d48; color: #fff; font-size: 10px; font-weight: 700;
  line-height: 16px; text-align: center; box-shadow: 0 0 0 2px var(--header);
}
@keyframes notif-pulse-anim { 0%,100% { opacity: 1; } 50% { opacity: .45; } }
#notifBtn.notif-pulse .notif-badge { animation: notif-pulse-anim 1.4s ease-in-out infinite; }
.notif-backdrop { position: fixed; inset: 0; z-index: 40; background: transparent; }
.notif-panel {
  position: fixed; top: 56px; right: 8px; z-index: 41; width: min(420px, calc(100vw - 16px));
  max-height: calc(100vh - 72px); overflow-y: auto;
  background: var(--card); color: var(--text); border: 1px solid var(--line);
  border-radius: 12px; box-shadow: 0 12px 34px rgba(0,0,0,.3); padding: 12px;
}
.notif-panel h3 { margin: 0 0 8px; font-size: 15px; }
.notif-section-title { font-size: 12px; font-weight: 700; text-transform: uppercase;
  letter-spacing: .04em; color: var(--muted); margin: 12px 0 6px; }
.notif-item { border: 1px solid var(--line); border-radius: 10px; padding: 9px 10px; margin-bottom: 8px; background: var(--subcard); }
.notif-item .n-title { font-weight: 700; }
.notif-item .n-meta { font-size: 12px; color: var(--muted); margin-top: 2px; display: flex; flex-wrap: wrap; gap: 8px; }
.notif-item .n-usage-over { color: #b00020; font-weight: 700; }
.notif-item .n-usage-near { color: #d08700; font-weight: 700; }
.notif-item .btnrow { margin-top: 8px; }
/* Upozornenie na dochádzajúce miesto - výraznejšie ako bežná notifikácia. */
.notif-item.notif-alert { border-left: 3px solid #b00020; background: rgba(176,0,32,0.06); }
.notif-item.notif-alert .n-title { color: #b00020; }
/* Nadchádzajúca akcia technika - modrý prízvuk (odlíši od žiadostí a upozornení). */
.notif-item.notif-action { border-left: 3px solid #0b3b66; }
.notif-item.notif-action .n-title { color: #0b3b66; }
.notif-empty { color: var(--muted); padding: 10px 2px; }

/* Krok "co sa ide hladat" pred hladanim cien (Filip 2026-07-18) */
.search-preview-row { display:flex; align-items:center; gap:8px; margin:5px 0; }
.search-preview-row .sp-check { width:auto; flex:0 0 auto; }
.search-preview-row .sp-query { flex:1; min-width:0; padding:8px; font-size:16px; }

/* Jednotný toast pre úspech/chybu akcií (Filip 2026-07-19, bod 11) */
.toast-wrap { position:fixed; left:50%; bottom:max(20px, env(safe-area-inset-bottom)); transform:translateX(-50%);
  z-index:1200; display:flex; flex-direction:column; gap:8px; align-items:center; pointer-events:none;
  width:max-content; max-width:92vw; }
.toast { pointer-events:auto; display:flex; align-items:center; gap:9px; padding:11px 16px; border-radius:11px;
  font-size:14px; font-weight:600; color:#fff; background:#1d7a3c; box-shadow:0 8px 26px rgba(0,0,0,.28);
  opacity:0; transform:translateY(10px) scale(.98); transition:opacity .2s ease, transform .2s ease;
  cursor:pointer; max-width:100%; }
.toast.show { opacity:1; transform:translateY(0) scale(1); }
.toast.error { background:#b3261e; }
.toast-ic { font-size:15px; line-height:1; }
@media (prefers-reduced-motion: reduce) {
  .toast { transition:opacity .15s linear; transform:none; }
  .toast.show { transform:none; }
}

/* Varianty vedľa seba — matica (bod 1, Filip 2026-07-19) */
.kit-view-toggle { display:flex; gap:6px; margin:6px 0 10px; }
.kit-view-toggle button { padding:5px 12px; }
.kit-view-toggle button.is-active { background:var(--accent); color:#fff; border-color:var(--accent); }
.kit-matrix-scroll { overflow-x:auto; margin-top:4px; -webkit-overflow-scrolling:touch; }
.kit-matrix { border-collapse:separate; border-spacing:0; width:100%; font-size:13px; }
.kit-matrix th, .kit-matrix td { border-bottom:1px solid var(--line); padding:8px 10px; text-align:left; vertical-align:top; }
.kit-matrix thead th { position:sticky; top:0; background:var(--card); z-index:1; white-space:nowrap; }
.kit-matrix .km-item-h, .kit-matrix .km-item { min-width:130px; }
.km-name { font-weight:600; }
.km-qty { color:var(--muted); font-size:12px; margin-top:2px; }
.km-cell { min-width:190px; max-width:280px; }
.km-cell.km-empty { color:var(--muted); text-align:center; }
/* bunka matice: rovnake info ako v zozname (cena, parametre, vsetky parametre, Varianty) */
.km-cell-body > .pl-meta { font-size:11px; color:var(--muted); margin-top:3px; }
.km-cell-body > .pl-specs { margin-top:4px; }
.km-variants { margin-top:8px; padding:3px 9px; font-size:12px; }
/* cena nech je vidiet - nie stlmena ako ostatne meta (Filip 2026-07-20) */
.price-list-row .pl-price, .km-cell-body .pl-price { color:var(--text); font-weight:700; }
.km-opt { display:flex; gap:8px; align-items:flex-start; cursor:pointer; }
.km-opt input { width:auto; flex:0 0 auto; margin-top:2px; }
.km-model { font-weight:600; line-height:1.3; }
.km-why { color:var(--muted); font-size:12px; margin-top:2px; }
.km-link { display:inline-block; font-size:11px; margin-top:4px; }
.kit-matrix .km-more { margin-top:8px; padding:3px 9px; font-size:12px; }
.km-cell.km-chosen { background:color-mix(in srgb, #26965c 13%, var(--card));
  outline:2px solid #26965c; outline-offset:-2px; border-radius:7px; }
@media (min-width:1024px){ .offer-settings.kit-matrix-open .offer-settings-inner { max-width:1040px; } }

/* Verzia appky v hlavicke Nastaveni: nadpis vlavo, verzia vpravo mensim pismom (Filip 2026-07-19) */
.settings-head { display:flex; justify-content:space-between; align-items:baseline; gap:10px; }
.settings-version { font-size:10px; font-weight:400; letter-spacing:0; text-transform:none; color:var(--muted); white-space:nowrap; }

/* Tlac pracovneho vykazu: iba prehlad, bez ovladacich prvkov (Filip 2026-07-18) */
@media print {
  body.printing-wr header { display:none !important; }
  body.printing-wr #appView > *:not(#workReportCard) { display:none !important; }
  body.printing-wr #workReportCard { display:block !important; border:none; box-shadow:none; margin:0; padding:0; }
  body.printing-wr #workReportCard button,
  body.printing-wr #workReportCard select,
  body.printing-wr #workReportCard input,
  body.printing-wr #workReportCard label,
  body.printing-wr #workReportCard .btnrow,
  body.printing-wr #workReportStatus { display:none !important; }
  body.printing-wr .wr-block,
  body.printing-wr .wr-legend i { -webkit-print-color-adjust:exact; print-color-adjust:exact; }
  body.printing-wr .calendar-day-group { break-inside:avoid; }
}

/* Doslovny diktat pod formularom (Filip 2026-07-21): text sa da citat, zvyraznene
   su vety, ktore sa nedostali do ziadneho pola. */
.dictation-text { white-space: pre-wrap; line-height: 1.5; font-size: 15px; }
.dictation-text mark {
  /* color:inherit tu bolo zle: v tmavej teme to bol svetly text na svetlozltej
     a nedalo sa to precitat (Filip 2026-08-06). Farby su preto explicitne. */
  background: #fef3c7;
  color: #1f2937;
  padding: 1px 2px;
  border-radius: 3px;
}
html[data-theme="dark"] .dictation-text mark { background:#4a3b12; color:#fde68a; }
.dictation-unplaced { margin-bottom: 8px; }
.dictation-unplaced li { margin-bottom: 4px; }

/* "Dnes / Moja práca" (Filip 2026-07-22) */
.today-tile { border-color: var(--accent); }
.today-card { border:1px solid var(--line); border-radius:12px; background:var(--subcard);
  padding:12px 14px; margin-bottom:10px; }
.today-card.today-overdue { border-color: var(--danger-text); }
.today-head { display:flex; align-items:center; justify-content:space-between; gap:8px; margin-bottom:4px; }
.today-head strong { font-size:16px; }
.today-badge { font-size:11px; padding:2px 8px; border-radius:999px; background:var(--card);
  border:1px solid var(--line); white-space:nowrap; }
.today-overdue .today-badge { background:var(--danger); color:var(--danger-text); border-color:var(--danger-text); }
.today-meta { margin:2px 0 8px; }
.today-actions { display:flex; gap:8px; flex-wrap:wrap; }
.today-actions button { flex:1; min-width:96px; min-height:44px; }
.today-actions .primary { background:var(--primary); color:var(--primary-text); }

.today-header { display:flex; align-items:center; justify-content:space-between; gap:8px; margin-bottom:10px; }
.today-date { font-weight:600; color:var(--muted, #666); white-space:nowrap; }

.today-preview-box { max-height:80vh; overflow-y:auto; text-align:left; }
.today-preview-box .group-title { margin-top:10px; }

/* Nástenka: rovnaké stručné karty od telefónu po PC. Detail ostáva v editore, aby sa
   dlhé poznámky v zozname neroztiahli do neprehľadných blokov. */
.board-tile { border-color:var(--accent); }
.board-filters { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:8px; margin-top:8px; align-items:center; }
.board-filters .checkline { margin:0; min-height:38px; }
.board-summary { display:flex; flex-wrap:wrap; gap:7px; margin:10px 0 2px; }
.board-summary-chip, .board-chip { display:inline-flex; align-items:center; min-height:24px; box-sizing:border-box; border:1px solid var(--line); border-radius:999px; padding:2px 8px; background:var(--card); font-size:12px; line-height:1.25; }
.board-summary-chip.danger, .board-chip.overdue { border-color:var(--danger-text); color:var(--danger-text); background:var(--danger); }
.board-summary-chip.today, .board-chip.today { border-color:var(--accent); }
.board-list { display:grid; gap:16px; margin-top:10px; }
.board-list-section > h3 { margin:0 0 7px; font-size:14px; color:var(--muted); }
.board-list-cards { display:grid; gap:9px; }
.board-list-empty { margin:0; padding:10px; border:1px dashed var(--line); border-radius:10px; color:var(--muted); font-size:13px; }
.board-item { width:100%; display:block; border:1px solid var(--line); border-radius:12px; background:var(--subcard); color:var(--text); padding:11px 12px; text-align:left; font:inherit; cursor:pointer; }
.board-item:hover { border-color:var(--accent); }
.board-item:focus-visible { outline:3px solid var(--accent); outline-offset:2px; }
.board-item.board-overdue { border-left:4px solid var(--danger-text); }
.board-item.board-today { border-left:4px solid var(--accent); }
.board-item.board-urgent { border-left:4px solid var(--warning, var(--accent)); }
.board-item.board-resolved { background:var(--card); opacity:.82; }
.board-item-head { display:flex; justify-content:space-between; align-items:flex-start; gap:8px; }
.board-item-head strong { font-size:16px; line-height:1.3; }
.board-chip.priority-urgentna { border-color:var(--danger-text); color:var(--danger-text); }
.board-chip.priority-vysoka { border-color:var(--accent); }
.board-meta { display:flex; flex-wrap:wrap; gap:5px; margin-top:7px; }
.board-info, .board-note { margin:7px 0 0; color:var(--muted); font-size:13px; line-height:1.4; }
.board-note { color:var(--text); white-space:pre-wrap; }
.board-preview-content { display:grid; gap:10px; }
.board-preview-content > .hint { margin:0; }
.board-preview-meta { margin-top:0; }
.board-preview-fields { display:grid; gap:0; border:1px solid var(--line); border-radius:10px; overflow:hidden; background:var(--subcard); }
.board-preview-field { padding:9px 10px; border-top:1px solid var(--line); line-height:1.4; white-space:pre-wrap; }
.board-preview-field:first-child { border-top:0; }
.board-preview-field strong { display:block; margin-bottom:2px; color:var(--muted); font-size:12px; }
.board-preview-note { min-height:62px; }
.board-preview-actions { margin-top:12px; }
.board-editor-title { align-self:center; color:var(--muted); font-weight:600; }
.board-assignees { display:flex; flex-wrap:wrap; gap:5px 12px; min-height:38px; padding:7px 0; }
.board-assignees .checkline { margin:0; }
.board-document-link { margin-top:10px; }
.board-document-search-row { display:flex; gap:8px; align-items:end; }
.board-document-search-row input { min-width:0; flex:1 1 240px; }
.board-document-search-row button { flex:0 0 auto; }
.board-document-selected, .board-document-results { margin-top:6px; border:1px solid var(--line); border-radius:9px; background:var(--subcard); }
.board-document-selected { padding:8px 10px; font-size:13px; }
.board-document-results { max-height:220px; overflow:auto; }
.board-document-result { width:100%; border:0; border-bottom:1px solid var(--line); border-radius:0; padding:8px 10px; text-align:left; background:transparent; color:var(--text); }
.board-document-result:last-child { border-bottom:0; }
.board-document-result:hover, .board-document-result:focus-visible { background:var(--secondary); color:var(--secondary-text); }
.board-document-result small { display:block; color:var(--muted); margin-top:2px; }
.board-audit { margin-top:12px; border:1px solid var(--line); border-radius:9px; background:var(--subcard); }
.board-audit summary { cursor:pointer; padding:9px 10px; font-weight:600; }
.board-audit[open] summary { border-bottom:1px solid var(--line); }
.board-audit > .hint { padding:0 10px; }
.board-audit-list { display:grid; gap:0; }
.board-audit-event { padding:8px 10px; border-top:1px solid var(--line); font-size:13px; line-height:1.35; }
.board-audit-event:first-child { border-top:0; }
.board-audit-event small { display:block; margin-top:2px; color:var(--muted); }
.calendar-board-strip { margin-top:10px; padding:10px 12px; border:1px dashed var(--line); border-radius:10px; background:var(--subcard); }
.calendar-board-head { display:flex; align-items:baseline; gap:8px; flex-wrap:wrap; }
.calendar-board-items { display:grid; gap:5px; margin-top:7px; }
.calendar-board-item { display:flex; gap:8px; align-items:baseline; justify-content:space-between; font-size:13px; }
.calendar-board-item span { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
@media (max-width:640px) {
  .board-filters { grid-template-columns:1fr 1fr; }
  .board-filters .checkline { grid-column:1 / -1; }
  .board-item { padding:10px; }
  .board-item-head strong { font-size:15px; }
  .board-document-search-row { align-items:stretch; }
}

/* Nasepkavanie objednavatela z Kontaktov (bod 14) */
.contact-suggest {
  position:absolute; z-index:1000; max-height:280px; overflow-y:auto;
  background:var(--card,#fff); color:var(--text,#18181b);
  border:1px solid var(--line,#d4d4d8); border-radius:8px;
  box-shadow:0 6px 20px rgba(0,0,0,.18);
}
.contact-suggest-item { padding:8px 10px; cursor:pointer; border-bottom:1px solid var(--line,#eee); }
.contact-suggest-item:last-child { border-bottom:none; }
.contact-suggest-item:hover { background:var(--secondary,#e4e4e7); }
.contact-suggest-name { font-weight:600; }
.contact-suggest-meta { font-size:.85em; color:var(--muted,#71717a); margin-top:2px; }
.contact-phone-chips { display:flex; flex-wrap:wrap; align-items:center; gap:6px; margin:6px 0 4px; }
.contact-phone-hint { font-size:.82em; color:var(--muted,#71717a); width:100%; }
.contact-phone-chip {
  padding:4px 9px; font-size:.85em; cursor:pointer;
  background:var(--secondary,#e4e4e7); color:var(--secondary-text,#27272a);
  border:1px solid var(--line,#d4d4d8); border-radius:14px;
}
.contact-phone-chip.active {
  background:var(--primary,#0f2d58); color:var(--primary-text,#fff); border-color:var(--primary,#0f2d58);
}
.contact-phone-none { font-style:italic; }
.contact-fill-banner { margin:6px 0 10px; padding:8px 10px; border-radius:8px;
  background:var(--accent-ghost, var(--subcard)); border-left:3px solid var(--accent); }
.contact-fill-msg { font-size:13px; color:var(--text); margin-bottom:6px; }
.contact-fill-row { display:flex; flex-wrap:wrap; gap:8px; }
.contact-fill-dismiss { background:none; border:none; color:var(--muted); text-decoration:underline;
  cursor:pointer; font:inherit; font-size:13px; padding:0 4px; }
.contact-actions { display:flex; flex-wrap:wrap; align-items:center; gap:8px; margin:6px 0 10px; }
.contact-actions.hidden { display:none; }
.contact-action-btn {
  padding:5px 11px; font-size:.88em; cursor:pointer;
  background:var(--secondary,#e4e4e7); color:var(--secondary-text,#27272a);
  border:1px solid var(--line,#d4d4d8); border-radius:8px;
}
.contact-action-btn:disabled { opacity:.55; cursor:default; }
.contact-action-status { font-size:.85em; color:var(--muted,#71717a); }

/* Prepojenie manual <-> dokument (bod 21) */
.manual-lookup-btn { background:none; border:none; cursor:pointer; font-size:1.05em; padding:0 4px; }
.manual-lookup-pop {
  position:absolute; z-index:1000; min-width:200px; max-width:min(320px,92vw);
  background:var(--card,#fff); color:var(--text,#18181b);
  border:1px solid var(--line,#d4d4d8); border-radius:8px;
  box-shadow:0 6px 20px rgba(0,0,0,.18); padding:6px;
}
.manual-lookup-head { font-size:.82em; color:var(--muted,#71717a); padding:2px 6px 6px; }
.manual-lookup-item { padding:8px 8px; cursor:pointer; border-radius:6px; }
.manual-lookup-item:hover { background:var(--secondary,#e4e4e7); }
.manual-lookup-empty { padding:6px 8px; color:var(--muted,#71717a); font-size:.9em; }
.manual-lookup-search {
  margin-top:4px; width:100%; padding:6px; cursor:pointer; font-size:.9em;
  background:var(--secondary,#e4e4e7); color:var(--secondary-text,#27272a);
  border:1px solid var(--line,#d4d4d8); border-radius:6px;
}

/* Zdroj (odznak) + tagy manualov (bod 2) */
.manual-source-badge {
  display:inline-block; font-size:.72em; font-weight:600; padding:1px 7px;
  border-radius:10px; vertical-align:middle;
}
.manual-source-badge.vendor { background:var(--secondary,#e4e4e7); color:var(--secondary-text,#27272a); }
.manual-source-badge.own {
  background:var(--today-bg,#e8f1fe); color:var(--today-text,#0f2d58);
  border:1px solid var(--today-line,#93b7ef);
}
.manual-tags-inline { display:inline-flex; flex-wrap:wrap; gap:4px; margin-left:6px; }
.manual-tags { display:flex; flex-wrap:wrap; gap:6px; margin:4px 0 8px; }
.manual-tag {
  display:inline-flex; align-items:center; gap:4px; font-size:.8em; padding:2px 8px;
  border-radius:12px; background:var(--secondary,#e4e4e7); color:var(--secondary-text,#27272a);
  border:1px solid var(--line,#d4d4d8); cursor:default;
}
button.manual-tag { cursor:pointer; }
.manual-tag.removable { background:var(--subcard,#fafafa); }
.manual-tag-x { background:none; border:none; cursor:pointer; color:var(--muted,#71717a); font-size:.9em; padding:0; line-height:1; }
.manual-pdf-snippet { font-size:.85em; color:var(--muted,#71717a); margin-top:2px; }

/* OCR prepis prilohy (bod 2, krok 4) */
.manual-ocr-box {
  margin:6px 0 12px; padding:8px; border:1px dashed var(--line,#d4d4d8);
  border-radius:8px; background:var(--subcard,#fafafa);
}
.manual-ocr-date { font-size:.8em; color:var(--muted,#71717a); margin-bottom:4px; }
.manual-ocr-label { font-size:.8em; font-weight:600; color:var(--muted,#71717a); margin:6px 0 2px; }
.manual-ocr-text { width:100%; box-sizing:border-box; font-size:.9em; }
.manual-ocr-btns { display:flex; flex-wrap:wrap; gap:8px; margin-top:6px; }
.manual-ocr-status { font-size:.85em; color:var(--muted,#71717a); margin-top:4px; }
.manual-prev-version { display:inline-block; margin:0 0 8px 4px; font-size:.85em; }
.manual-qr-box {
  margin:8px 0; padding:10px; text-align:center;
  border:1px solid var(--line,#d4d4d8); border-radius:8px; background:var(--subcard,#fafafa);
}
  .manual-qr-img { width:200px; max-width:60vw; height:auto; background:#fff; padding:6px; border-radius:6px; }

  /* Evidencia vecí: QR sa sníma priamo fotoaparátom; fotky sú malé náhľady, nie plná galéria. */
  .asset-scanner { margin:8px 0; padding:10px; border:1px solid var(--line); border-radius:10px; background:var(--subcard); text-align:center; }
  .asset-scanner video { display:block; width:100%; max-width:520px; max-height:56vh; margin:0 auto 6px; border-radius:8px; background:#111; object-fit:cover; }
  /* Evidencia vecí: nad vyhľadávaním je samostatný riadok akcií, aby tlačidlá
     nepôsobili nalepené na poli. Na telefóne sa úsporne presunú pod nadpis. */
  .assets-topbar { align-items:center; gap:10px 14px; margin-bottom:14px; }
  .assets-topbar h2 { flex:1 1 180px; }
  .assets-topbar-actions { margin:0 0 0 auto; }
  .assets-home { display:grid; gap:10px; }
  .assets-home > #assetsSearch { margin:0; }
  .assets-filters { display:flex; flex-wrap:wrap; gap:8px; }
  .assets-filters select { flex:1 1 170px; min-width:0; margin:0; }
  .asset-category-field { display:flex; align-items:stretch; gap:8px; }
  .asset-category-field select { flex:1 1 auto; min-width:0; }
  .asset-category-field button { flex:0 0 auto; }
  .asset-photo-list { display:grid; grid-template-columns:repeat(3, minmax(0, 1fr)); gap:8px; margin:8px 0; }
  .asset-photo { min-width:0; }
  .asset-photo img { display:block; width:100%; aspect-ratio:1; object-fit:cover; border:1px solid var(--line); border-radius:8px; background:#fff; }
  .asset-photo button { width:100%; margin-top:4px; }
  /* Prípad poškodenia je súčasť detailu veci, nie ďalšia záplava kariet. Jemný
     rám drží priradenie a riešenie pokope aj na telefóne. */
  .asset-damage-case { margin-top:10px; padding:10px; border:1px solid var(--line); border-radius:8px; background:var(--subcard); }
  .asset-damage-case > button { margin-top:8px; }
  .asset-trip-row { display:flex; align-items:flex-start; justify-content:space-between; gap:8px; margin:7px 0; }
  .asset-trip-row > :first-child { flex:1 1 auto; min-width:0; }
  .asset-trip-row button { flex:0 0 auto; margin:0; }
  .asset-reservation-row { position:relative; padding:7px 0; border-bottom:1px solid var(--line); }
  .asset-reservation-row:last-child { border-bottom:0; }
  .asset-reservation-row > button { margin:6px 0 0; }
  /* V zozname požičaných vecí je termín iba krátky riadok, nie ďalší box. Farba
     pomôže pri rýchlej kontrole, no text zostáva zrozumiteľný aj bez nej. */
  .asset-loan-due { font-weight:600; }
  .asset-loan-due-overdue, .asset-loan-due-urgent { color:var(--danger-text); }
  @media (max-width:640px) {
    .assets-topbar { align-items:flex-start; }
    .assets-topbar-actions { width:100%; margin-left:0; }
    .assets-topbar-actions button { flex:1 1 145px; }
    .asset-category-field { flex-wrap:wrap; }
    .asset-category-field select { min-width:160px; }
    .assets-filters select { flex-basis:145px; }
    .asset-trip-row { align-items:stretch; flex-direction:column; }
    .asset-trip-row button { align-self:flex-start; }
  }
  @media (max-width:480px) { .asset-photo-list { grid-template-columns:repeat(2, minmax(0, 1fr)); } }

/* Celá zákazka — reťazec dokladov (bod 17, fáza B) */
.zakazka-overlay {
  position:fixed; inset:0; z-index:2000; padding:16px;
  background:rgba(0,0,0,.45); display:flex; align-items:center; justify-content:center;
}
.zakazka-box {
  background:var(--card,#fff); color:var(--text,#18181b); border-radius:12px;
  max-width:560px; width:100%; max-height:85vh; overflow-y:auto; padding:14px;
  box-shadow:0 10px 40px rgba(0,0,0,.3);
}
.zakazka-head { display:flex; align-items:center; justify-content:space-between; gap:8px; margin-bottom:10px; }
.zakazka-step {
  display:flex; align-items:center; gap:10px; padding:10px; margin-bottom:8px;
  border:1px solid var(--line,#d4d4d8); border-radius:8px;
}
.zakazka-step.current { border-color:var(--primary,#0f2d58); background:var(--today-bg,#e8f1fe); }
.zakazka-step .grow { flex:1; min-width:0; }
.zakazka-state {
  display:inline-block; margin-bottom:10px; padding:4px 12px; border-radius:14px;
  font-weight:600; font-size:.9em;
  background:var(--today-bg,#e8f1fe); color:var(--today-text,#0f2d58); border:1px solid var(--today-line,#93b7ef);
}
.zakazka-state-vyfakturovana { background:#e6f5ea; color:#1e7d4f; border-color:#9bd3ad; }

  /* --- Osobný zápisník (Filip 2026-08-04) ------------------------------------------ */
  .note-list { display:flex; flex-direction:column; gap:6px; margin-top:10px; }
  /* Riadok je <button>, aby sa dal otvoriť aj klávesnicou. Preto sa mu musí zrušiť
     vzhľad tlačidla z globálneho pravidla `button` a nastaviť zarovnanie doľava. */
  .note-list .note-row { display:flex; align-items:center; gap:10px; width:100%;
                         text-align:left; padding:10px 12px; font-size:14px;
                         font-weight:400; border-radius:8px; cursor:pointer; }
  .note-list .note-row.note-row-active { outline:2px solid var(--primary); }
  .note-lock { flex:0 0 auto; font-size:15px; }
  .note-detail { margin-top:14px; padding-top:12px; border-top:1px solid var(--line); }
  .note-detail-head { display:flex; align-items:center; justify-content:space-between; gap:8px; }
  /* meno + právo + krížik; meno sa zmestí aj na úzkom telefóne, právo má pevnú šírku */
  .note-share-row { display:grid; grid-template-columns:minmax(0,1fr) 150px 32px;
                    gap:6px; align-items:center; margin-bottom:6px; }
  .note-share-name { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-size:14px; }
  .note-share-right { padding:8px; font-size:14px; }
  @media (max-width:640px) {
    .note-share-row { grid-template-columns:minmax(0,1fr) 32px; }
    .note-share-right { grid-column:1 / -1; }
  }
  /* Záznamy: meno je nadpis sekcie, pod ním riadky značka | čas | text | koho sa týka */
  .note-person { margin:12px 0 4px; font-size:12px; font-weight:700; letter-spacing:.06em;
                 text-transform:uppercase; color:var(--muted); }
  .note-entry { display:grid; grid-template-columns:132px 92px minmax(0,1fr) 140px 30px 30px;
                gap:6px; align-items:start; margin-bottom:6px; }
  .note-entry-tag { padding:6px; font-size:13px; }
  .note-entry-time { font-size:12px; color:var(--muted); padding-top:9px; white-space:nowrap; }
  .note-entry-text { font-size:14px; padding:7px 8px; resize:vertical; overflow:hidden;
                     min-height:36px; }
  .note-entry-person { font-size:13px; padding:7px 8px; }
  .note-entry-move { font-size:13px; padding:6px 2px; min-height:auto; }
  .note-entry .del { display:inline-flex; align-items:center; justify-content:center;
                     width:30px; height:34px; padding:0; font-size:16px; min-height:auto; }
  @media (max-width:640px) {
    /* Na telefóne text cez celú šírku, pod ním značka a meno vedľa seba. */
    .note-entry { grid-template-columns:minmax(0,1fr) minmax(0,1fr) 32px 32px; }
    .note-entry-text { grid-column:1 / -1; order:-1; }
    .note-entry-time { grid-column:1 / -1; order:-2; padding-top:0; }
  }
  /* Návrh AI „patrí to k poznámke X" + lišta zlučovania */
  .note-suggest { display:flex; flex-wrap:wrap; align-items:center; gap:8px; margin-top:10px;
                  padding:10px 12px; border:1px solid var(--line); border-radius:8px;
                  background:var(--subcard); font-size:14px; }
  .note-suggest button { padding:7px 12px; font-size:13px; }
  .note-row-wrap { display:flex; align-items:center; gap:8px; }
  .note-pick { flex:0 0 auto; width:18px; height:18px; }
  .note-merge-bar { display:flex; flex-wrap:wrap; align-items:center; gap:8px; margin-top:10px;
                    font-size:14px; }
  .note-merge-bar select { flex:1 1 160px; min-width:0; padding:8px; font-size:14px; }
  .note-merge-bar button { flex:0 0 auto; padding:8px 12px; font-size:13px; }

  /* --- Celá zostava alarmu v Ponuke (Filip 2026-08-05) ---------------------------- */
  .set-spec { display:grid; grid-template-columns:repeat(auto-fit,minmax(190px,1fr));
              gap:8px 14px; align-items:end; margin:8px 0 10px; }
  .set-spec input[type=number], .set-spec select { width:100%; padding:8px; font-size:14px; }
  .set-variant { border:1px solid var(--line); border-radius:8px; padding:10px 12px;
                 margin-top:10px; background:var(--card); }
  .set-variant-head { display:flex; justify-content:space-between; align-items:baseline;
                      gap:10px; margin-bottom:6px; }
  .set-variant-price { font-weight:700; white-space:nowrap; }
  .set-group { margin:8px 0 2px; font-size:11px; font-weight:700; letter-spacing:.06em;
               text-transform:uppercase; color:var(--muted); }
  .set-row { display:flex; justify-content:space-between; gap:10px; font-size:13px;
             padding:2px 0; }
  .set-row-price { white-space:nowrap; color:var(--muted); font-variant-numeric:tabular-nums; }
  .set-universal { font-size:11px; padding:1px 6px; border-radius:999px;
                   background:var(--secondary); color:var(--secondary-text); }
  .set-missing { margin-top:6px; font-size:12px; color:var(--danger-text); }
  .set-rejected { margin-top:6px; font-size:12px; }
  .set-variant button { margin-top:10px; }
  .set-families { display:flex; flex-wrap:wrap; align-items:center; gap:8px; margin-top:8px;
                  font-size:13px; color:var(--muted); }

  /* Dva zdroje typov v ponuke: cenníky (s cenami) vs. web (bez cien) — nemiešať */
  .kit-source-head { margin:10px 0 4px; font-size:11px; font-weight:700; letter-spacing:.07em;
                     text-transform:uppercase; color:var(--muted); }
  /* Odkiaľ vybraná položka je — pre teba, nie pre zákazníka (na PDF nejde) */
  .offer-source { grid-column:1 / -1; margin-top:2px; font-size:11.5px; color:var(--muted); }
  /* Stitky "hladat v:" nad vysledkami - zuzenie hladania na jeden cennik alebo iba web
     (Filip 2026-08-05). Defaultne je aktivne "Vsade". */
  .kit-sources { display:flex; flex-wrap:wrap; align-items:center; gap:6px; margin:6px 0 8px; }
  .kit-sources-label { font-size:12px; color:var(--muted); margin-right:2px; }
  .kit-source-chip {
    padding:4px 10px; font-size:12px; cursor:pointer; white-space:nowrap;
    background:var(--secondary,#e4e4e7); color:var(--secondary-text,#27272a);
    border:1px solid var(--line,#d4d4d8); border-radius:14px;
  }
  .kit-source-chip.active {
    background:var(--primary,#0f2d58); color:var(--primary-text,#fff); border-color:var(--primary,#0f2d58);
  }
  .kit-source-chip .kit-source-count { opacity:.7; margin-left:4px; }
  /* Odolnosť voči zveri a "čo na tejto možnosti nesedí" (Filip 2026-08-05). */
  .kit-pet { color:var(--text); font-weight:600; }
  .kit-warn { color:#b06000; font-weight:600; }
  /* Dni montáže v pokyne — odklikáva sa, čo sa nerobí (Filip 2026-08-06). */
  .mont-days { display:flex; flex-wrap:wrap; gap:6px; margin:6px 0; }
  .mont-day {
    padding:5px 10px; font-size:12px; cursor:pointer; white-space:nowrap;
    background:var(--field); color:var(--muted);
    border:1px solid var(--line); border-radius:14px; text-decoration:line-through;
  }
  .mont-day.active {
    background:var(--primary,#0f2d58); color:var(--primary-text,#fff);
    border-color:var(--primary,#0f2d58); text-decoration:none; font-weight:600;
  }
  .mont-day.vikend:not(.active) { opacity:.75; font-style:italic; }
  /* Položka, ktorá sa z pokynu už raz zapísala (viacdňová montáž) — Filip 2026-08-06.
     Iba upozornenie, nie zákaz: množstvo si upraví človek. */
  .mat-row.uz-zapisane { position:relative; }
  .mat-row.uz-zapisane .mat-name { border-color:#b06000; background:rgba(176,96,0,.06); }
  .mat-row.uz-zapisane::after {
    content:"už zapísané"; grid-column:1 / -1; font-size:11px; color:#b06000; font-weight:600;
  }
