/* ============================================================
   SDÍLENÉ KOMPONENTY
   Jediné místo definice sdílených komponent UI: tlačítka,
   formuláře, štítky, tabulky, týdenní navigace a lišta nástrojů
   atd. Stránkové CSS tyto třídy nesmí předefinovat.

   Načítá se hned za styles/styles.css a před stránkovým CSS
   i před shared/modal.css - viz docs/UI_CONVENTIONS.md 1.1.

   Použití ze stránky:
     <link rel="stylesheet" href="styles/styles.css">
     <link rel="stylesheet" href="shared/components.css">
     ...
     <link rel="stylesheet" href="shared/modal.css">
     <link rel="stylesheet" href="styles/<stranka>-styles.css">

   Specifikace jednotlivých komponent: docs/UI_CONVENTIONS.md 5.
   ============================================================ */

/* ============================================================
   TLAČÍTKA
   Specifikace: docs/UI_CONVENTIONS.md 5.1. Staré třídy jsou
   napojené jako aliasy selektorů (.btn-edit, .btn-delete, .btn-small),
   JS šablony se v R3 nemění (backlog 0.9).
   ============================================================ */

.btn-primary, .btn-secondary, .btn-danger, .btn-ghost, .btn-icon,
.btn-edit, .btn-delete, .btn-sm, .btn-small, .btn-toggle {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: var(--spacing-sm);
    padding: var(--spacing-sm) var(--spacing-md);
    border: 1px solid transparent;
    border-radius: var(--radius-md);
    font: inherit;
    font-weight: 600;
    line-height: 1.25;
    text-decoration: none;
    cursor: pointer;
}

.btn-primary {
    background: var(--color-primary);
    color: white;
    border-color: var(--color-primary);
}

.btn-primary:hover {
    background: var(--color-primary-dark);
    border-color: var(--color-primary-dark);
}

.btn-secondary, .btn-edit, .btn-toggle {
    background: var(--color-bg-white);
    color: var(--color-text-primary);
    border-color: var(--color-border);
}

.btn-secondary:hover, .btn-edit:hover, .btn-toggle:hover {
    background: var(--color-bg-hover);
}

/* Stav "zapnuto" u přepínacích tlačítek (Autor Všechny/Moje, Rozbalit vše) -
   odlišený od stavu "vypnuto" tokenem, ne jen barvou (tučný řez + silnější
   rámeček), aby šel rozeznat i bez barvocitu. */
.btn-toggle[aria-pressed="true"] {
    font-weight: 700;
    border-color: var(--color-primary);
    border-width: 2px;
}

.btn-danger, .btn-delete {
    background: var(--color-delete);
    color: white;
    border-color: var(--color-delete);
}

.btn-danger:hover, .btn-delete:hover {
    background: var(--color-delete-hover);
    border-color: var(--color-delete-hover);
}

.btn-ghost {
    background: transparent;
    color: var(--color-primary);
    border-color: transparent;
}

.btn-ghost:hover {
    background: var(--color-primary-light);
}

.btn-sm, .btn-small, .btn-edit, .btn-delete {
    padding: var(--spacing-xs) var(--spacing-sm);
    font-size: var(--font-size-small);
}

.btn-icon {
    padding: var(--spacing-xs);
    min-width: 32px;
}

.btn-primary:disabled, .btn-secondary:disabled, .btn-danger:disabled,
.btn-ghost:disabled, .btn-icon:disabled, .btn-edit:disabled,
.btn-delete:disabled, .btn-sm:disabled, .btn-small:disabled, .btn-toggle:disabled {
    opacity: .4;
    cursor: not-allowed;
}

.btn-primary:focus-visible, .btn-secondary:focus-visible, .btn-danger:focus-visible,
.btn-ghost:focus-visible, .btn-icon:focus-visible, .btn-edit:focus-visible,
.btn-delete:focus-visible, .btn-sm:focus-visible, .btn-small:focus-visible,
.btn-toggle:focus-visible {
    box-shadow: var(--focus-ring);
}

@media (max-width: 767px) {
    .btn-primary, .btn-secondary, .btn-danger, .btn-ghost, .btn-icon,
    .btn-edit, .btn-delete, .btn-sm, .btn-small, .btn-toggle {
        min-height: var(--touch-target);
    }

    .btn-icon {
        min-width: var(--touch-target);
    }
}

/* Dočasné, do úklidu JS šablon - mezera mezi Upravit a Smazat (D4). */
.btn-edit {
    margin-right: var(--spacing-sm);
}

/* ============================================================
   FORMULÁŘE
   Specifikace: docs/UI_CONVENTIONS.md 5.3. Focus na polích je
   :focus, ne :focus-visible - uživatel musí vidět aktivní pole
   i po kliknutí myší (UI_CONVENTIONS.md 5.3, D14).
   ============================================================ */

.form-group {
    margin-bottom: var(--spacing-md);
}

.form-group label {
    display: block;
    font-size: var(--font-size-base);
    font-weight: 600;
    color: var(--color-text-primary);
    margin-bottom: var(--spacing-xs);
}

.form-group input[type="text"],
.form-group input[type="number"],
.form-group input[type="date"],
.form-group input[type="time"],
.form-group select,
.form-group textarea {
    width: 100%;
    padding: var(--spacing-sm) var(--spacing-md);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    font-size: var(--font-size-base);
    font-family: inherit;
    color: var(--color-text-primary);
    box-sizing: border-box;
}

.form-group textarea {
    resize: vertical;
    min-height: 60px;
}

.form-group input[type="text"]:focus,
.form-group input[type="number"]:focus,
.form-group input[type="date"]:focus,
.form-group input[type="time"]:focus,
.form-group select:focus,
.form-group textarea:focus {
    outline: none;
    border-color: var(--color-primary);
    box-shadow: var(--focus-ring);
}

/* B2: editor popisu bloku (ArchaRichText.attachEditor) - vzhled jako textarea,
   lista B/I nad polem, tlacitka 44 px vsude (8.4). */
.rich-editor {
    min-height: 6em;
    padding: var(--spacing-sm) var(--spacing-md);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    background: var(--color-bg-white);
    color: var(--color-text-primary);
    font-size: var(--font-size-base);
    white-space: pre-wrap;
    overflow-wrap: anywhere;
    cursor: text;
}

.rich-editor:focus {
    outline: none;
    border-color: var(--color-primary);
    box-shadow: var(--focus-ring);
}

.rich-editor[aria-disabled="true"] {
    background: var(--color-border-light);
    color: var(--color-text-muted);
    cursor: not-allowed;
}

.rich-toolbar {
    display: flex;
    gap: var(--spacing-xs);
    margin-bottom: var(--spacing-xs);
}

.rich-toolbar-btn {
    min-width: var(--touch-target);
    min-height: var(--touch-target);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    background: var(--color-bg-white);
    color: var(--color-text-primary);
    font: inherit;
    cursor: pointer;
}

.rich-toolbar-btn--bold { font-weight: 700; }
.rich-toolbar-btn--italic { font-style: italic; }
.rich-toolbar-btn[aria-pressed="true"] { border-color: var(--color-primary); box-shadow: inset 0 0 0 1px var(--color-primary); background: var(--color-primary-light); }
.rich-toolbar-btn:focus-visible { outline: none; box-shadow: var(--focus-ring); }
.rich-toolbar-btn:disabled { opacity: .4; cursor: not-allowed; }

.form-group input[readonly] {
    background: var(--color-border-light);
    color: var(--color-text-muted);
    cursor: not-allowed;
}

.form-hint {
    display: block;
    font-size: var(--font-size-small);
    color: var(--color-text-muted);
    margin-top: var(--spacing-xs);
}

.checkbox-list {
    max-height: 180px;
    overflow-y: auto;
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    padding: var(--spacing-sm) var(--spacing-md);
}

.checkbox-list label {
    display: block;
    font-weight: normal;
    padding: var(--spacing-xs) 0;
    margin-bottom: 0;
    cursor: pointer;
}

.checkbox-list label input[type="checkbox"] {
    margin-right: var(--spacing-sm);
}

.color-picker-row {
    display: flex;
    align-items: center;
    gap: var(--spacing-md);
}

.color-picker-row input[type="color"] {
    width: 48px;
    height: 36px;
    padding: 2px;
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    cursor: pointer;
}

.color-preview {
    display: inline-block;
    width: 36px;
    height: 36px;
    border-radius: var(--radius-sm);
    border: 1px solid var(--color-border);
}

/* ============================================================
   ŠTÍTKY
   Specifikace: docs/UI_CONVENTIONS.md 5.2. Staré třídy jsou
   napojené jako aliasy selektorů - viz docs/UI_CONVENTIONS.md 5.2.
   ============================================================ */

.badge, .role-badge, .status-badge, .status-label,
.goal-status-badge, .visibility-badge {
    display: inline-flex;
    align-items: center;
    padding: 2px var(--spacing-sm);
    border-radius: var(--radius-full);
    font-size: var(--font-size-small);
    font-weight: 600;
    white-space: nowrap;
}

.badge-success, .status-published, .goal-status-badge.achieved,
.visibility-badge.student {
    background: var(--color-success-light);
    color: var(--color-success-text);
}

.badge-error, .visibility-badge.private {
    background: var(--color-error-light);
    color: var(--color-error-text);
}

.badge-warning {
    background: var(--color-warning-light);
    color: var(--color-warning-text);
}

.badge-info, .goal-status-badge.active {
    background: var(--color-info-light);
    color: var(--color-info);
}

.badge-neutral, .status-draft, .goal-status-badge.abandoned {
    background: var(--color-neutral-light);
    color: var(--color-neutral-text);
}

.visibility-badge {
    background: var(--color-neutral-light);
    color: var(--color-neutral-text);
}

.badge-dark, .status-archived {
    background: var(--color-dark);
    color: white;
}

/* Role - plné modifikátory (D7), beze změny barev proti styles.css. */
.role-superadmin {
    background: var(--color-secondary);
    color: white;
}

.role-admin {
    background: var(--color-primary);
    color: white;
}

.role-teacher {
    background: var(--color-success);
    color: white;
}

.role-limited {
    background: var(--color-neutral-mid);
    color: var(--color-text-primary);
}

/* Docházka - plné modifikátory (D7), stejné barvy jako buňky mřížky
   a legenda. Specificita .status-label.* je (0,2,0), vyšší než
   světlé varianty výše (0,1,0) - proto se sem nekombinuje. */
.status-label.present { background: var(--color-success); color: white; }
.status-label.absent { background: var(--color-error); color: white; }
.status-label.late { background: var(--color-warning); color: var(--color-on-warning); }
.status-label.excused { background: var(--color-info); color: white; }
.status-label.left_early { background: var(--color-secondary); color: white; }
.status-label.none { background: var(--color-neutral-mid); color: var(--color-text-primary); }

/* ============================================================
   TABULKY
   Specifikace: docs/UI_CONVENTIONS.md 5.5. .teachers-table a
   .attendance-table jsou napojené jako aliasy selektorů - alias
   na .teachers-table-container se nezavádí (D21).
   ============================================================ */

.data-table-wrap {
    background: var(--color-bg-white);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-sm);
    overflow-x: auto;
}

.data-table, .teachers-table, .attendance-table {
    width: 100%;
    border-collapse: collapse;
    background: var(--color-bg-white);
}

.data-table thead, .teachers-table thead, .attendance-table thead {
    background: var(--color-border-light);
}

.data-table th, .teachers-table th, .attendance-table th {
    padding: var(--spacing-sm) var(--spacing-md);
    text-align: left;
    font-weight: 600;
    color: var(--color-text-secondary);
    font-size: var(--font-size-base);
    border-bottom: 1px solid var(--color-border);
}

.data-table td, .teachers-table td, .attendance-table td {
    padding: var(--spacing-sm) var(--spacing-md);
    border-bottom: 1px solid var(--color-border-light);
    font-size: var(--font-size-base);
}

.data-table tbody tr:hover, .teachers-table tbody tr:hover, .attendance-table tbody tr:hover {
    background: var(--color-bg-hover);
}

.data-table tbody tr:last-child td, .teachers-table tbody tr:last-child td,
.attendance-table tbody tr:last-child td {
    border-bottom: none;
}

/* Prázdný stav uvnitř buňky tabulky (R5 krok 3) - nahrazuje inline
   style="text-align: center; color: #999; padding: 40px;". Viz UI_CONVENTIONS.md 6.1. */
.state-empty {
    text-align: center;
    color: var(--color-text-muted);
    padding: 40px;
}

/* Řazení kliknutím na sloupec (R5 krok 3) - tlačítko v <th data-sort-key>,
   vkládá/napojuje shared/list-controls.js (bindSortHeaders). Vlastní
   pravidlo, ne rozšíření .btn-* - dědí typografii buňky hlavičky. */
.sort-button {
    font: inherit;
    color: inherit;
    font-weight: inherit;
    background: none;
    border: 0;
    padding: 0;
    width: 100%;
    text-align: left;
    cursor: pointer;
    display: flex;
    align-items: center;
    gap: var(--spacing-xs);
}

.sort-button:focus-visible {
    box-shadow: var(--focus-ring);
}

@media (max-width: 767px) {
    .sort-button {
        min-height: var(--touch-target);
    }
}

/* .sort-icon je čistě dekorace (aria-hidden), směr nese aria-sort na <th>. */
th[aria-sort="ascending"] .sort-icon::after {
    content: "▲";
}

th[aria-sort="descending"] .sort-icon::after {
    content: "▼";
}

/* Klikatelný text v buňce tabulky, vypadá jako odkaz (S19) - např. jméno
   žáka ve sloupci Žák, otevírá detail. */
.cell-link {
    font: inherit;
    background: none;
    border: 0;
    padding: 0;
    color: var(--color-primary);
    text-align: left;
    cursor: pointer;
    text-decoration: none;
}

.cell-link:hover,
.cell-link:focus-visible {
    text-decoration: underline;
}

.cell-link:focus-visible {
    box-shadow: var(--focus-ring);
}

@media (max-width: 767px) {
    .cell-link {
        min-height: var(--touch-target);
    }
}

/* ============================================================
   TÝDENNÍ NAVIGACE A LIŠTA
   Kanonická verze .btn-week-nav je z styles.css (rámeček, ne stín) - D11.
   ============================================================ */

.week-nav {
    display: flex;
    align-items: center;
    gap: var(--spacing-md);
    margin-bottom: var(--spacing-lg);
}

.btn-week-nav {
    background: var(--color-bg-primary);
    border: 1px solid var(--color-border);
    color: var(--color-text-primary);
    padding: 5px 14px;
    border-radius: var(--radius-md);
    font-size: var(--font-size-small);
    cursor: pointer;
    transition: background var(--transition-fast);
}

.btn-week-nav:hover {
    background: var(--color-border);
}

.week-label {
    font-weight: 600;
    font-size: var(--font-size-base);
    min-width: 180px;
}

.week-label-short {
    display: none;
}

/* Breakpoint sdílený s shared/header.css (@media max-width: 767px). */
@media (max-width: 767px) {
    .btn-week-nav {
        min-width: var(--touch-target);
        min-height: var(--touch-target);
    }

    .week-label-full {
        display: none;
    }

    .week-label-short {
        display: inline;
        white-space: nowrap;
        font-size: var(--font-size-small);
    }
}

.panel-toolbar {
    display: flex;
    align-items: center;
    gap: var(--spacing-sm);
    flex-wrap: wrap;
    margin-top: var(--spacing-md);
    margin-bottom: var(--spacing-lg);
}

.panel-toolbar label {
    font-weight: 600;
    font-size: var(--font-size-base);
    color: var(--color-text-primary);
}

.panel-toolbar select,
.panel-toolbar input[type="date"] {
    padding: 8px 12px;
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    font-size: var(--font-size-base);
    font-family: var(--font-family);
}

.panel-toolbar input[type="text"] {
    padding: 8px 12px;
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    font-size: var(--font-size-base);
    font-family: var(--font-family);
    flex: 1;
    min-width: 200px;
    max-width: 400px;
}

/* input[type="search"] (R5 krok 3, filtr Učitelé) - stejný vzhled jako
   type="text" výše, samostatné pravidlo, protože se selektor type="text"
   nerozšiřuje (jiné stránky ho už používají beze změny chování). */
.panel-toolbar input[type="search"] {
    padding: 8px 12px;
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    font-size: var(--font-size-base);
    font-family: var(--font-family);
    flex: 1;
    min-width: 200px;
    max-width: 400px;
}

/* Počet zobrazených řádků pod lištou filtrů (R5 krok 3). */
.list-count {
    font-size: var(--font-size-small);
    color: var(--color-text-muted);
    margin-top: 0;
    margin-bottom: var(--spacing-md);
}

@media (max-width: 767px) {
    .panel-toolbar {
        flex-direction: column;
        align-items: flex-start;
    }

    .panel-toolbar select,
    .panel-toolbar input,
    .panel-toolbar button {
        min-height: var(--touch-target);
    }
}

/* ============================================================
   TÝDENNÍ TABULKA ROZVRHU
   Specifikace: docs/UI_CONVENTIONS.md 9 (týdenní tabulka, U1).
   Druhý pohled na stejná data jako karty (.block-card, styles/styles.css) -
   přepnutí, který je viditelný, řeší breakpointy tamtéž (W20), tady jen
   vzhled samotné tabulky.
   ============================================================ */

.week-day {
    margin-bottom: var(--spacing-lg);
}

/* B5 R8: posun jen v oblasti tabulky, sloupec poznamek stoji vlevo mimo ni */
.week-day-scroll {
    overflow-x: auto;
}

.week-day--notes {
    display: grid;
    grid-template-columns: clamp(120px, 12vw, 200px) minmax(0, 1fr); /* D6 R2 */
    gap: var(--spacing-md);
    align-items: start;
}

/* B5 R9: den bez bloku - nadpis jako <caption> tabulky */
.week-day-heading {
    font-weight: 600;
    font-size: var(--font-size-large);
    padding: var(--spacing-sm) 0;
}

/* B5: sedy sloupec / box poznamek dne (UI_CONVENTIONS.md 9). Text --color-text-primary
   na --color-neutral-light (cca 10,5 : 1); tlacitka maji vlastni bily/cerveny podklad. */
.week-day-notes {
    background: var(--color-neutral-light);
    color: var(--color-text-primary);
    border-radius: var(--radius-md);
    padding: var(--spacing-sm);
    font-size: var(--font-size-base);
    overflow-wrap: anywhere;
}

.day-notes-list {
    list-style: none;
    margin: 0 0 var(--spacing-sm);
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: var(--spacing-sm);
}

.day-note-actions,
.day-note-scope .form-actions {
    display: flex;
    flex-wrap: wrap;
    gap: var(--spacing-xs);
    margin-top: var(--spacing-xs);
}

.day-note-form {
    display: flex;
    flex-direction: column;
    gap: var(--spacing-xs);
}

.day-note-form input[type="text"],
.day-note-form input[type="date"] {
    width: 100%;
    padding: var(--spacing-xs) var(--spacing-sm);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-sm);
    font: inherit;
    color: var(--color-text-primary);
    background: var(--color-bg-white);
}

.day-note-form input:focus {
    outline: none;
    border-color: var(--color-primary);
    box-shadow: var(--focus-ring);
}

.day-note-repeat label {
    display: flex;
    align-items: center;
    gap: var(--spacing-xs);
    min-height: var(--touch-target);
}

.week-table {
    width: 100%;
    table-layout: fixed;
    border-collapse: collapse;
    background: var(--color-bg-white);
}

.week-table caption {
    text-align: left;
    font-weight: 600;
    font-size: var(--font-size-large);
    padding: var(--spacing-sm) 0;
}

.week-table th,
.week-table td {
    border: 1px solid var(--color-border-light);
    vertical-align: top;
    padding: var(--spacing-xs);
}

/* W33/W37: .week-table td > .week-cell:only-child pouziva height: 100% -
   "height: 0" na td dava procentu vuci cemu se pocitat (skutecnou vysku
   radku/rowspanu tim nezmensi). */
.week-table td {
    height: 0;
}

/* D3 (oprava po prokliku): Firefox s table-layout: fixed a height: 0 tabulku
   nevykresli citelne - jen v nem vyska podle obsahu (bloky se neroztahuji). */
@supports (-moz-appearance: none) {
    .week-table td {
        height: auto;
    }
}

/* D6 R3 (6.35): Firefox neroztahne .week-cell na vysku radku, zustavaji prazdne
   plochy. Vzhled bloku (barva, levy okraj) proto nese <td> s jednim blokem
   (app.js markSingleWeekTd) a vnitrni blok je pruhledny. Jen Firefox. */
@supports (-moz-appearance: none) {
    .week-table td.week-td--single {
        background: color-mix(in srgb, var(--cell-color, var(--color-border)) var(--cell-tint), var(--color-bg-white));
        border-left: 4px solid var(--cell-color, var(--color-border));
        print-color-adjust: exact;
        -webkit-print-color-adjust: exact;
    }

    .week-table td.week-td--no-teacher {
        --cell-color: var(--color-neutral-mid);
        background: var(--color-bg-white);
    }

    .week-table td.week-td--single > .week-cell {
        background: transparent;
        border-left: 0;
    }
}

.week-table th {
    font-weight: 600;
    font-size: var(--font-size-small);
    color: var(--color-text-secondary);
    text-align: center;
    white-space: nowrap;
}

/* D4 R6: stazeny kratky sloupec je uzky pruh - bez vnitrniho odsazeni. */
.week-table .week-col--squeeze {
    padding: 0;
}

.week-cell {
    display: block;
    width: 100%;
    font: inherit;
    text-align: left;
    color: inherit;
    background: color-mix(in srgb, var(--cell-color, var(--color-border)) var(--cell-tint), var(--color-bg-white));
    border: 0;
    border-left: 4px solid var(--cell-color, var(--color-border));
    border-radius: var(--radius-sm);
    padding: var(--spacing-xs) var(--spacing-sm);
    print-color-adjust: exact;
}

/* D6 R1: dlouha slova v uzkem sloupci se zalomi, ne vylezou z bloku */
.week-table .week-cell { overflow-wrap: anywhere; hyphens: auto; }

button.week-cell {
    cursor: pointer;
}

/* D7 R2: skok na bunku (panel zmen) neskonci pod ukotvenou listou tydne (styles.css .week-bar-sticky) */
@media screen {
    .week-cell { scroll-margin-top: var(--week-bar-offset); }
}

.week-cell:focus-visible {
    box-shadow: var(--focus-ring);
}

.week-cell + .week-cell {
    margin-top: var(--spacing-xs);
}

.week-cell--no-teacher {
    --cell-color: var(--color-neutral-mid);
    background: var(--color-bg-white);
}

/* W37: kazdy osamoceny .week-cell (bezny blok s rowSpan=1 i .week-cell--span
   s rowSpan>1, i jednopolozkovy pruh) vyplni celou svou <td> az ke spodni
   hrane - bez ohledu na rowSpan. Zarovnani obsahu resi az pravidlo nize. */
.week-table td > .week-cell:only-child {
    display: flex;
    flex-direction: column;
    height: 100%;
}

.week-cell--span,
.week-band > .week-cell {
    align-items: center;
    justify-content: center;
    text-align: center;
}

/* D2 J4: bunky pruhu se deli rovnomerne o celou vysku dne; mezera je
   stavajici .week-cell + .week-cell margin-top. */
.week-band > .week-cell {
    display: flex;
    flex-direction: column;
    height: calc((100% - (var(--band-count, 1) - 1) * var(--spacing-xs)) / var(--band-count, 1));
}

/* 0.31: radky bunky jsou span (platny obsah <button>), vzhled jako div. */
.week-cell > span,
.week-cell-slots > span {
    display: block;
}

/* D2 J1: jmena v konzultaci; v tisku viditelne. D3 (oprava po prokliku):
   ve vice sloupcich, radek se nedeli; stretch kvuli centrovanym bunkam (flex). */
.week-cell-slots {
    display: block;
    align-self: stretch;
    margin-top: var(--spacing-xs);
    font-size: var(--font-size-small);
    column-width: 7em;
    column-gap: var(--spacing-sm);
}

.week-cell-slots > span {
    break-inside: avoid;
}

.week-band {
    background: var(--color-bg-hover);
}

.week-gap {
    background: var(--color-border-light);
    color: var(--color-text-muted);
}

/* W31: prazdna bunka drahy (type 'empty' v layout.cells) nema vzhled bloku -
   bez ramecku, bez stinu, pozadi tabulky. :not(.week-gap) vylucuje mezeru
   (take bez potomku, ale ma zustat sedivá a odlisna od prazdne bunky). */
.week-table td:empty:not(.week-gap) {
    border: none;
}

/* W42: tiskova hlavicka tabulky (app.js buildWeekPrintHeading) - na
   obrazovce skryta (novy element, ne [hidden] - prepina ji jen @media print
   nize), v tisku prvni radek stranky. */
.week-print-heading {
    display: none;
}

/* D6 R5: nazev bloku tucne (stejna vaha jako .block-title) */
.week-cell-title { font-weight: bold; }

/* ============================================================
   TISK TYDENNI TABULKY (U1 krok 4, W10/W43/W44/W46/W48, D1 krok 3)
   Velikost papiru se nevynucuje - vybira ji uzivatel v dialogu tisku
   prohlizece (doporucene A3, ale tabulka musi jit vytisknout i na A4,
   viz table-layout: fixed nize). Zadny vynuceny zlom stranky mezi dny
   (W48 rusi W41) - kazdy .week-day ma jen break-inside: avoid, prohlizec
   zlomi mezi dny sam, pokud se tyden nevejde na jednu stranu. Co se v
   tisku skryva mimo tabulku samotnou (hlavicka stranky, navigace,
   karty...) resi styles/styles.css - tady jen vzhled tabulky a @page.
   ============================================================ */
@media print {
    @page {
        margin: 10mm;
    }

    .week-print-heading {
        display: block;
        margin-bottom: var(--spacing-md);
        font-size: var(--font-size-large);
        font-weight: 600;
    }

    .week-day {
        break-inside: avoid;
    }

    /* B5: den zpet na jeden sloupec; poznamky a dny bez bloku se netisknou (pozdeji = prednost) */
    .week-day--notes {
        display: block;
    }

    .week-day-notes,
    .week-day--empty {
        display: none;
    }

    .week-table {
        font-size: 10pt;
        line-height: 1.2;
        table-layout: fixed;
    }

    .week-table th,
    .week-table td {
        padding: 2px 4px;
    }

    .week-table .week-col--squeeze {
        padding: 0;
    }

    .week-cell,
    .week-band {
        print-color-adjust: exact;
        -webkit-print-color-adjust: exact;
    }
}

/* ============================================================
   DOMÉNOVÉ KARTY
   Sdílí konzultace i Žáci (goals.html/goals.js), použije i budoucí
   detail žáka (U3). Pozor na matoucí názvy - .note-card-meta se
   používá i pro hlavičku karty cíle (goal-card) a .slot-block-header
   v goals.html nese jméno žáka, ne konzultační slot. Přejmenování je
   mimo rozsah R3.
   ============================================================ */

.slot-block-header {
    margin: var(--spacing-md) 0;
    font-size: var(--font-size-large);
    font-weight: 600;
    color: var(--color-text-primary);
}

.note-list,
.goal-list {
    display: flex;
    flex-direction: column;
    gap: 10px;
    margin-bottom: var(--spacing-md);
}

.note-card,
.goal-card {
    background: var(--color-bg-white);
    border-radius: var(--radius-md);
    box-shadow: var(--shadow-sm);
    padding: 12px 16px;
}

.note-card-header,
.goal-card-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: var(--spacing-sm);
    margin-bottom: 6px;
    flex-wrap: wrap;
}

.note-card-meta {
    font-size: var(--font-size-small);
    color: var(--color-text-secondary);
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
    align-items: center;
}

.note-card-content,
.goal-card-content {
    white-space: pre-wrap;
    word-break: break-word;
    line-height: 1.5;
}

/* Sbalitelná karta poznámky (U3 krok 4, S25) - jen doplňkové třídy k
   .note-card/.note-card-header/.note-card-content výše, ty se neupravují.
   Sbalený text zůstává v DOM celý, jen je opticky oříznutý na 2 řádky.
   .note-card--collapsible je na kartě vždy (nezávisle na aktuálním
   sbaleno/rozbaleno), .note-card--collapsed jen ve sbaleném stavu -
   position: relative dává kartě vlastní pozicovací kontext pro tlačítko
   .note-card-toggle v hlavičce, nezávisle na okolním rozložení stránky.
   Sbalení a přepínač sdílí sloučené selektory i s kartou cíle
   (.goal-card--collapsed/.goal-card-toggle, U4 krok 5b, R2/R3). */
.note-card--collapsible {
    position: relative;
}

.note-card--collapsed .note-card-content,
.goal-card--collapsed .goal-card-content {
    line-clamp: 2;
    -webkit-line-clamp: 2;
    display: -webkit-box;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.note-card-toggle,
.goal-card-toggle {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: var(--spacing-xs) var(--spacing-sm);
    border: 1px solid var(--color-border);
    border-radius: var(--radius-md);
    background: var(--color-bg-white);
    color: var(--color-text-primary);
    font: inherit;
    font-size: var(--font-size-small);
    font-weight: 600;
    cursor: pointer;
}

.note-card-toggle:hover,
.goal-card-toggle:hover {
    background: var(--color-bg-hover);
}

.note-card-toggle:focus-visible,
.goal-card-toggle:focus-visible {
    box-shadow: var(--focus-ring);
}

/* Pravý blok hlavičky sbalitelné karty (U3 krok 4b, K10) - drží štítek
   viditelnosti a přepínač Rozbalit/Sbalit vedle sebe, .note-card-meta
   zůstává vlevo beze změny. */
.note-card-side {
    display: flex;
    align-items: center;
    gap: var(--spacing-sm);
}

/* Editační režim karty poznámky (N10 K3) - formulář nahradí zobrazený
   obsah; pole a tlačítka jsou sdílené (.form-group, .form-actions). */
.note-card--editing .note-card-content {
    display: none;
}

.note-card-edit-form {
    margin-top: var(--spacing-sm);
}

.note-card-edit-form .note-fields input,
.note-card-edit-form .note-fields select,
.note-card-edit-form .note-fields textarea {
    width: 100%;
}

/* Checkbox "Zpřístupnit učitelům" (N11): jeden řádek, checkbox vlevo (v DOM label první);
   width: auto ruší 100 % z pravidla výš. */
.form-group--checkbox {
    display: flex;
    flex-direction: row-reverse;
    justify-content: flex-end;
    align-items: center;
    gap: var(--spacing-sm);
}

.form-group--checkbox label { margin-bottom: 0; font-weight: normal; cursor: pointer; }
.note-card-edit-form .note-fields .form-group--checkbox input[type="checkbox"] { width: auto; cursor: pointer; }

.note-card-edit-form .form-actions {
    margin-top: var(--spacing-sm);
}

@media (max-width: 767px) {
    .note-card-toggle,
    .goal-card-toggle {
        min-height: var(--touch-target);
    }

    .note-card-side {
        flex-basis: 100%;
        justify-content: flex-start;
    }

    .note-card-side .btn-small {
        min-height: var(--touch-target);
    }

    .section-toggle {
        min-height: var(--touch-target);
    }
}

.goal-edit-form {
    margin-top: 10px;
    padding-top: 10px;
    border-top: 1px solid var(--color-border-light);
}

/* Sbalitelné nadpisy sekcí Cíle/Poznámky v detailu žáka (U4 krok 5c) -
   tlačítko obalující text nadpisu, vzhled zůstává jako u <h3>. Stav
   sbaleno/rozbaleno nese otočení .section-toggle-icon, ne jen barva. */
.section-toggle {
    font: inherit;
    color: inherit;
    background: none;
    border: 0;
    padding: 0;
    display: inline-flex;
    align-items: center;
    gap: var(--spacing-sm);
    cursor: pointer;
    text-align: left;
}

.section-toggle:focus-visible {
    box-shadow: var(--focus-ring);
}

.section-toggle-icon {
    width: 0;
    height: 0;
    border-left: 5px solid transparent;
    border-right: 5px solid transparent;
    border-top: 6px solid currentColor;
    transition: transform var(--transition-fast);
}

.section-toggle[aria-expanded="false"] .section-toggle-icon {
    transform: rotate(-90deg);
}

/* ============================================================
   ZPĚTNÁ VAZBA
   Specifikace: docs/UI_CONVENTIONS.md 6 (backlog 0.13). Inline hláška
   u formuláře (.form-feedback) a toasty - napojení řeší shared/feedback.js
   (window.ArchaFeedback). Prázdný .form-feedback (:empty) nemá padding
   ani pozadí, nezabírá místo (D3). Bez border - vědomé rozhodnutí (D4).
   ============================================================ */

.form-feedback {
    white-space: pre-line;
}

.form-feedback:not(:empty) {
    padding: var(--spacing-sm) var(--spacing-md);
    border-radius: var(--radius-sm);
    font-size: var(--font-size-base);
    background: var(--color-neutral-light);
    color: var(--color-neutral-text);
}

.form-feedback-error:not(:empty) {
    background: var(--color-error-light);
    color: var(--color-error-text);
}

.form-feedback-success:not(:empty) {
    background: var(--color-success-light);
    color: var(--color-success-text);
}

.form-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: var(--spacing-sm);
}

.toast-container {
    position: fixed;
    bottom: var(--spacing-md);
    left: 50%;
    transform: translateX(-50%);
    max-width: 480px;
    display: flex;
    flex-direction: column;
    gap: var(--spacing-sm);
    /* nad modalem (1000, shared/modal.css) a detail panely (200-251) */
    z-index: 1100;
}

@media (max-width: 767px) {
    .toast-container {
        left: var(--spacing-md);
        right: var(--spacing-md);
        max-width: none;
        transform: none;
    }
}

.toast {
    display: flex;
    align-items: center;
    gap: var(--spacing-sm);
    padding: var(--spacing-sm) var(--spacing-md);
    border-radius: var(--radius-sm);
    font-size: var(--font-size-base);
    white-space: pre-line;
    box-shadow: var(--shadow-lg);
    background: var(--color-neutral-light);
    color: var(--color-neutral-text);
}

.toast-error {
    background: var(--color-error-light);
    color: var(--color-error-text);
}

.toast-success {
    background: var(--color-success-light);
    color: var(--color-success-text);
}

.state-error {
    background: var(--color-error-light);
    color: var(--color-error-text);
    padding: var(--spacing-sm) var(--spacing-md);
    border-radius: var(--radius-sm);
    font-size: var(--font-size-base);
}

/* ============================================================
   STRÁNKA ŽÁKA (S1, student.html)
   Hlavička: jméno + lokace vlevo, Odhlásit vpravo, na úzkém displeji
   se zalomí. Hlášky pod hlavičkou dostanou odsazení jen tady.
   ============================================================ */

.student-header {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    align-items: center;
    gap: var(--spacing-md);
}

.student-header-info {
    min-width: 0;
}

.student-header-location {
    margin: 0;
    color: var(--color-text-secondary);
    font-size: var(--font-size-base);
}

.student-feedback:not(:empty) {
    margin-bottom: var(--spacing-md);
}

@media print {
    .student-feedback {
        display: none;
    }
}

/* P4: stitek zmeny po uzamceni (karta: v .block-header, bunka: prvni prvek). Tokeny z :root. */
.block-change-badge,
.week-cell > .block-change-badge {
    display: inline-block;
    width: fit-content;
    align-self: flex-start;
    margin-left: var(--spacing-xs);
    padding: 0 var(--spacing-xs);
    border-radius: 3px;
    font-size: var(--font-size-small);
    font-weight: bold;
    line-height: 1.4;
    text-transform: uppercase;
}

.week-cell > .block-change-badge {
    margin-left: 0;
}

.block-change-badge--changed {
    background: var(--color-warning-light);
    color: var(--color-on-warning);
    border: 1px solid var(--color-warning-border);
}

.block-change-badge--new {
    background: var(--color-primary-light);
    color: var(--color-primary-dark);
    border: 1px solid var(--color-primary-dark);
}

@media print {
    .block-change-badge { display: none; }
}

/* P4 krok 5: summary panelu zmen (display:flex ztraci nativni trojuhelnik) + stitek v radku bez odsazeni */
.changes-panel-summary::before {
    content: '\25B8';
    margin-right: var(--spacing-sm);
}

.changes-panel[open] > .changes-panel-summary::before {
    content: '\25BE';
}

.changes-panel-item .block-change-badge {
    margin-left: 0;
}
