/* /Components/Base/KodUrAssetPath.razor.rz.scp.css */
[b-l4pmclo4nd] .kodur-asset-path--empty {
    color: var(--kodur-text-muted);
    font-style: italic;
}

[b-l4pmclo4nd] .kodur-asset-path--error {
    color: var(--kodur-text-muted);
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
}

[b-l4pmclo4nd] .kodur-asset-path__error-icon {
    height: 0.875rem;
    width: 0.875rem;
    color: var(--kodur-status-przekroczony-termin-fill);
}

[b-l4pmclo4nd] .kodur-asset-path__kind-icon {
    height: 0.875rem;
    width: 0.875rem;
    margin-right: 0.25rem;
    vertical-align: -2px;
}

[b-l4pmclo4nd] .kodur-asset-path__segment--plain {
    color: var(--kodur-text-muted);
}

.kodur-asset-path__code[b-l4pmclo4nd] {
    margin-left: 0.5rem;
    font-size: 0.75rem;
    color: var(--kodur-text-muted);
}
/* /Components/Base/KodUrAttachmentPanel.razor.rz.scp.css */
.kodur-attachment-panel[b-pyzwx4994r] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}

.kodur-attachment-panel__grid[b-pyzwx4994r] {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0.75rem;
}

@media (min-width: 768px) {
    .kodur-attachment-panel__grid[b-pyzwx4994r] {
        grid-template-columns: repeat(3, minmax(0, 1fr));
    }
}

@media (min-width: 1280px) {
    .kodur-attachment-panel__grid[b-pyzwx4994r] {
        grid-template-columns: repeat(4, minmax(0, 1fr));
    }
}

[b-pyzwx4994r] .kodur-attachment-panel__grid {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0.75rem;
}

[b-pyzwx4994r] .kodur-attachment-panel__list {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}
/* /Components/Base/KodUrBreadcrumb.razor.rz.scp.css */
/*
    K105, decyzje.md — okruszki muszą być odczytywane jako PASEK nawigacji, nie kolejny wiersz
    tekstu pod tytułem. Cztery wymagania z tej decyzji, po kolei:

    1. Separator jednoznaczny — naprawiony w KodUrBreadcrumb.razor (SeparatorContent), tu tylko
       upewniamy się, że ikona ma rozmiar/kolor spójny z resztą paska, nie z treścią strony.
    2. Odsunięcie od tytułu — margin-bottom na pasku.
    3. Widoczna klikalność — kolor z tokenu --kodur-link (ten sam, którym cała aplikacja już
       oznacza "to jest klikalne", patrz WhereIsPartPage/WarehouseScanPage), plus podkreślenie na
       hover jako dodatkowa, jednoznaczna reakcja na wskaźnik.
    4. Własny poziom hierarchii — tło --kodur-bg-elevated + obwódka --kodur-border + padding,
       żeby pasek miał inny kontekst wizualny niż otaczająca treść, a nie tylko inny kolor tekstu.

    WAŻNE (poprawka po pomiarze koordynatora — marginBottom/paddingBottom = 0px na żywej
    stronie): selektory MUSZĄ być zakotwiczone o ".kodur-breadcrumb-bar" (literalny <div> w
    KodUrBreadcrumb.razor) PRZED "::deep", wzorem ".rodzic ::deep .dziecko" — nie jako sam
    "::deep .cokolwiek" bez niczego przed nim. Ten drugi wariant kompiluje się do
    "[b-xxxxxxxxxx] .cokolwiek" (atrybut zasięgu jako WYMÓG PRZODKA), a atrybut [b-xxxxxxxxxx]
    trafia WYŁĄCZNIE na literalny HTML z tego pliku — skoro cała reszta markupu to wywołania
    komponentów BlazorBlueprint, w typowym przypadku (link albo strona bieżąca) atrybut nie miał
    się do czego przyczepić i reguła nigdy nie dopasowywała żadnego elementu. ".kodur-breadcrumb-
    bar" jest jedynym literalnym elementem w tym pliku — dopiero on daje "::deep" prawdziwą
    kotwicę.

    Selektor dla font-size/color celuje w <ol> (nie w <nav>.kodur-breadcrumb), bo Tailwind
    biblioteki ustawia je wprost na <ol> — dziedziczenie z <nav> nie wygrywa z jawną deklaracją
    na tym samym elemencie, niezależnie od specyficzności reguły na przodku.
*/
.kodur-breadcrumb-bar[b-u1q5hu8ai8] {
    display: block;
    margin-bottom: 0.875rem;
}

.kodur-breadcrumb-bar[b-u1q5hu8ai8]  .kodur-breadcrumb {
    display: block;
    padding: 0.5rem 0.75rem;
    background-color: var(--kodur-bg-elevated);
    border: 1px solid var(--kodur-border);
    border-radius: 0.5rem;
}

.kodur-breadcrumb-bar[b-u1q5hu8ai8]  .kodur-breadcrumb ol {
    font-size: 0.8125rem;
    color: var(--kodur-text-muted);
}

.kodur-breadcrumb-bar[b-u1q5hu8ai8]  .kodur-breadcrumb__separator {
    color: var(--kodur-text-muted);
    opacity: 0.8;
}

/* Wygląda na odnośnik ZAWSZE (wymóg K105 pkt 3 — nie tylko po najechaniu), kolor spójny z resztą
   aplikacji. Stan hover biblioteki (klasa Tailwind "hover:text-foreground") ma wyższą
   specyficzność niż ta reguła i nadal wygrywa na :hover — to jest zamierzone, bo daje realną,
   widoczną zmianę koloru; podkreślenie niżej dokłada drugi, niezależny sygnał reakcji. */
.kodur-breadcrumb-bar[b-u1q5hu8ai8]  .kodur-breadcrumb a {
    color: var(--kodur-link);
}

.kodur-breadcrumb-bar[b-u1q5hu8ai8]  .kodur-breadcrumb a:hover {
    text-decoration: underline;
    text-underline-offset: 3px;
    cursor: pointer;
}

.kodur-breadcrumb-bar[b-u1q5hu8ai8]  .kodur-breadcrumb__ellipsis {
    display: none;
}

@media (max-width: 767px) {
    /* T-1506, K147 — separator "wewnętrzny" (między dwiema środkowymi pozycjami, od 4 pozycji
       wzwyż) musi zniknąć RAZEM ze środkiem, inaczej telefon pokazuje kilka chevronów z rzędu
       zamiast jednego wielokropka. Separator przed drugą i przed ostatnią pozycją (bez tej klasy)
       zostaje widoczny zawsze — on domyka skrót "pierwszy › … › ostatni". */
    .kodur-breadcrumb-bar[b-u1q5hu8ai8]  .kodur-breadcrumb__middle,
    .kodur-breadcrumb-bar[b-u1q5hu8ai8]  .kodur-breadcrumb__middle-separator {
        display: none;
    }

    .kodur-breadcrumb-bar[b-u1q5hu8ai8]  .kodur-breadcrumb__ellipsis {
        display: inline-flex;
    }
}
/* /Components/Base/KodUrDataPage.razor.rz.scp.css */
.kodur-data-page[b-7nyux7vnmu] {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.kodur-data-page__header[b-7nyux7vnmu] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
}

.kodur-data-page__title[b-7nyux7vnmu] {
    font-size: 1.375rem;
    font-weight: 700;
    margin: 0;
}

.kodur-data-page__toolbar[b-7nyux7vnmu] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
}

.kodur-data-page__kpi[b-7nyux7vnmu] {
    display: flex;
    gap: 0.75rem;
    overflow-x: auto;
    padding-bottom: 0.25rem;
}

@media (min-width: 768px) {
    .kodur-data-page__kpi[b-7nyux7vnmu] {
        overflow-x: visible;
        flex-wrap: wrap;
    }
}

.kodur-data-page__filters[b-7nyux7vnmu] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    align-items: center;
}

[b-7nyux7vnmu] .kodur-data-page__search {
    max-width: 20rem;
}

.kodur-data-page__skeleton[b-7nyux7vnmu] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.kodur-data-page__pager[b-7nyux7vnmu] {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 0.75rem;
    font-size: 0.8125rem;
    color: var(--kodur-text-muted);
}

/* K289 (decyzje.md) — stopka trybu "przewijanie bez końca" (KodUrDataPage.InfiniteScroll):
   licznik "Pokazano N z M" + znacznik-wyzwalacz doładowania (IntersectionObserver,
   wwwroot/js/infinite-scroll.js) albo baner błędu/szkielet ładowania w tym samym miejscu. */
.kodur-data-page__infinite-footer[b-7nyux7vnmu] {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.5rem;
    font-size: 0.8125rem;
    color: var(--kodur-text-muted);
}

.kodur-data-page__sentinel[b-7nyux7vnmu] {
    height: 1px;
}

@media (max-width: 767px) {
    [b-7nyux7vnmu] table {
        display: none;
    }
}
/* /Components/Base/KodUrKpiTile.razor.rz.scp.css */
[b-qv6ondn4nf] .kodur-kpi-tile {
    display: block;
}

[b-qv6ondn4nf] .kodur-kpi-tile--interactive {
    cursor: pointer;
}

[b-qv6ondn4nf] .kodur-kpi-tile--interactive:hover {
    filter: brightness(0.98);
}

[b-qv6ondn4nf] .kodur-kpi-tile--disabled {
    cursor: default;
}

[b-qv6ondn4nf] .kodur-kpi-tile__content {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}

[b-qv6ondn4nf] .kodur-kpi-tile__icon {
    flex-shrink: 0;
    color: var(--kodur-primary);
}

[b-qv6ondn4nf] .kodur-kpi-tile--warning .kodur-kpi-tile__icon {
    color: var(--kodur-status-przekroczony-termin-fill);
}

[b-qv6ondn4nf] .kodur-kpi-tile--danger .kodur-kpi-tile__icon {
    color: var(--kodur-status-awaria-fill);
}

[b-qv6ondn4nf] .kodur-kpi-tile__body {
    display: flex;
    flex-direction: column;
    min-width: 0;
}

[b-qv6ondn4nf] .kodur-kpi-tile__label {
    font-size: 0.8125rem;
    color: var(--kodur-text-muted);
}

[b-qv6ondn4nf] .kodur-kpi-tile__value {
    font-size: 1.75rem;
    font-weight: 600;
    line-height: 1.2;
}

[b-qv6ondn4nf] .kodur-kpi-tile--compact .kodur-kpi-tile__value {
    font-size: 1.25rem;
}

[b-qv6ondn4nf] .kodur-kpi-tile__value--error {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    color: var(--kodur-status-awaria-fill);
}

[b-qv6ondn4nf] .kodur-kpi-tile__error-icon {
    height: 0.875rem;
    width: 0.875rem;
}

[b-qv6ondn4nf] .kodur-kpi-tile__trend {
    display: inline-flex;
    align-items: center;
    gap: 0.125rem;
    font-size: 0.75rem;
}

[b-qv6ondn4nf] .kodur-kpi-tile__trend--up {
    color: var(--kodur-status-zamkniete-fill);
}

[b-qv6ondn4nf] .kodur-kpi-tile__trend--down {
    color: var(--kodur-status-awaria-fill);
}

[b-qv6ondn4nf] .kodur-kpi-tile__trend-icon {
    height: 0.75rem;
    width: 0.75rem;
}
/* /Components/Base/KodUrPhotoPreview.razor.rz.scp.css */
.kodur-photo-preview__image[b-t5e87k83to] {
    display: block;
    width: 100%;
    max-height: 75vh;
    object-fit: contain;
}
/* /Components/Base/KodUrStatusBadge.razor.rz.scp.css */
/* KodUrStatusBadge — kolor pochodzi z tokenu słownika (--kodur-status-* / --kodur-crit-*),
   nigdy z mapowania status→kolor w kodzie (docs/brand.md §4, BRIEF.md §6.5). */

[b-8r0hkigk7c] .kodur-status-badge {
    border-color: transparent;
}

[b-8r0hkigk7c] .kodur-status-badge--solid {
    background-color: var(--kodur-status-badge-fill) !important;
    color: var(--kodur-status-badge-text) !important;
}

[b-8r0hkigk7c] .kodur-status-badge--soft {
    background-color: color-mix(in srgb, var(--kodur-status-badge-fill) 16%, transparent) !important;
    color: var(--kodur-status-badge-fill) !important;
}

[b-8r0hkigk7c] .kodur-status-badge--outline {
    background-color: transparent !important;
    border: 1px solid var(--kodur-status-badge-fill) !important;
    color: var(--kodur-status-badge-fill) !important;
}

[b-8r0hkigk7c] .kodur-status-badge--sm {
    font-size: 0.6875rem;
    padding: 0.0625rem 0.5rem;
}

[b-8r0hkigk7c] .kodur-status-badge--interactive,
.kodur-status-badge--clickable[b-8r0hkigk7c] {
    cursor: pointer;
}

[b-8r0hkigk7c] .kodur-status-badge__icon {
    height: 0.75rem;
    width: 0.75rem;
}

[b-8r0hkigk7c] .kodur-status-dot {
    display: inline-flex;
    align-items: center;
    gap: 0.375rem;
    font-size: 0.8125rem;
}

[b-8r0hkigk7c] .kodur-status-dot__mark {
    height: 0.5rem;
    width: 0.5rem;
    border-radius: 999px;
    background-color: var(--kodur-status-dot-color, currentColor);
    flex-shrink: 0;
}
/* /Components/Base/KodUrThumbnail.razor.rz.scp.css */
.kodur-thumbnail[b-14m68lsrdz] {
    width: 40px;
    height: 40px;
    border-radius: 6px;
    object-fit: cover;
    flex-shrink: 0;
    background-color: var(--bb-color-surface-muted, #eef0f2);
}

.kodur-thumbnail--placeholder[b-14m68lsrdz] {
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: 600;
    color: var(--bb-color-text-muted, #6b7280);
}
/* /Components/Base/KodUrTreePicker.razor.rz.scp.css */
.kodur-tree-picker[b-m1d4tw06og] {
    display: inline-block;
}

[b-m1d4tw06og] .kodur-tree-picker__trigger {
    min-width: 14rem;
    justify-content: space-between;
}
/* /Components/Layout/KioskLayout.razor.rz.scp.css */
/* T-1496 — było `min-height: 100vh` na tym elemencie, a `.tv-board__grid` (TvKiosk.razor.css)
   rozciągane WYŁĄCZNIE przez `height: 100%` w łańcuchu potomków. Właściciel produktu zgłosił, że
   treść zajmuje ~40% wysokości, reszta to puste tło — czyli łańcuch procentowych wysokości gdzieś
   się urywał. Zamiast szukać, KTÓRY dokładnie krok, cały łańcuch od tego elementu w dół zamieniony
   na `flex: 1` (patrz `.kodur-kiosk__content` niżej i `.tv-board`/`.tv-board__grid` w
   TvKiosk.razor.css) — flex-grow rozciąga się do faktycznej wysokości kontenera niezależnie od
   tego, czy procent wysokości gdzieś po drodze miał czym się rozwiązać. */
.kodur-kiosk[b-h4wae5s527] {
    height: 100vh;
    height: 100dvh;
    display: flex;
    flex-direction: column;
    background: var(--kodur-bg);
    color: var(--kodur-text);
}

.kodur-kiosk__header[b-h4wae5s527] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0.75rem 1.5rem;
    border-bottom: 1px solid var(--kodur-border);
}

.kodur-kiosk__logo[b-h4wae5s527] {
    height: 2rem;
}

.kodur-kiosk__header-actions[b-h4wae5s527] {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}

[b-h4wae5s527] .kodur-kiosk__live {
    color: var(--kodur-status-zamkniete-fill);
    font-size: 0.875rem;
}

/* T-1494 (K136) — przycisk ma zostać MAŁY wizualnie (nie ma odciągać uwagi od tablicy oglądanej z
   kilku metrów), ale z DUŻYM celem dotyku (K69: obsługa w rękawicach) — 44px to dolna granica K69,
   nie rozmiar ikony. min-width/min-height rozszerzają obszar klikalny POZA wizualną ramkę przycisku
   bez powiększania samej ikony (ta zostaje IconSmall z BbButton). */
/* T-1495 — klasa jest teraz na WLASNYM opakowaniu (span w KioskLayout), a nie na komponencie
   biblioteki, bo BbDarkModeToggle nie przyjmuje parametru Class. Dlatego sam selektor bez ::deep
   celuje w opakowanie, a ::deep w przycisk WEWNATRZ niego - i to jego trzeba powiekszyc, bo cel
   dotkniecia to obszar klikalny przycisku, nie rozmiar pudelka wokol. */
.kodur-kiosk__theme-toggle[b-h4wae5s527] {
    display: inline-flex;
}

.kodur-kiosk__theme-toggle[b-h4wae5s527]  button {
    min-width: 44px;
    min-height: 44px;
}

.kodur-kiosk__live-dot[b-h4wae5s527] {
    display: inline-block;
    height: 0.5rem;
    width: 0.5rem;
    border-radius: 999px;
    background: var(--kodur-status-zamkniete-fill);
    animation: kodur-kiosk-pulse-b-h4wae5s527 2s ease-in-out infinite;
}

@keyframes kodur-kiosk-pulse-b-h4wae5s527 {
    0%, 100% { opacity: 1; }
    50% { opacity: 0.35; }
}

.kodur-kiosk__content[b-h4wae5s527] {
    flex: 1;
    min-height: 0;
    padding: 1.5rem;
    display: flex;
}
/* /Components/Layout/MainLayout.razor.rz.scp.css */
[b-rb911b4o3i] .kodur-shell__company-mark {
    display: flex;
    height: 2rem;
    width: 2rem;
    flex-shrink: 0;
    align-items: center;
    justify-content: center;
    border-radius: 0.5rem;
    background: var(--sidebar-primary);
    color: #fff;
}

[b-rb911b4o3i] .kodur-shell__company-info,
[b-rb911b4o3i] .kodur-shell__user-info {
    display: flex;
    min-width: 0;
    flex: 1;
    flex-direction: column;
    align-items: flex-start;
    text-align: left;
}

[b-rb911b4o3i] .kodur-shell__company-name,
[b-rb911b4o3i] .kodur-shell__user-name {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-size: 0.875rem;
    font-weight: 600;
}

[b-rb911b4o3i] .kodur-shell__chevron {
    height: 1rem;
    width: 1rem;
    color: var(--sidebar-foreground);
    opacity: 0.6;
}

[b-rb911b4o3i] .kodur-shell__submenu-chevron {
    margin-left: auto;
    height: 1rem;
    width: 1rem;
}

/*
    T-1446: pozycja menu bez strony docelowej. Zero koloru wlasnego — tylko obnizona
    nieprzezroczystosc na istniejacych tokenach sidebaru (dziala automatycznie w obu motywach)
    i brak Href/pointer-events, zeby klikniecie NIC nie robilo (koniec z cichym 404).

    K106, decyzje.md — rozstrzygniecie: oznaczenie "Niedostepne" ma WLASNE miejsce w wierszu,
    dosuniete do prawej krawedzi z gwarantowanym odstepem, a przy braku miejsca skraca sie NAZWA,
    nie oznaczenie (bo oznaczenie mowi "nie da sie tu wejsc" i musi zostac czytelne w calosci).
    Padding-right rezerwuje realne miejsce (nie tylko wizualne) dla plakietki pozycji top-level
    (BbSidebarMenuBadge, absolutnie pozycjonowana WZGLEDEM <li>, poza przyciskiem) — bez tego
    tekst przycisku nie wie, ze cos zajmuje prawy skraj wiersza, i moze wjechac pod plakietke.

    POPRAWKA (ta sama przyczyna co K105 w KodUrBreadcrumb.razor.css — patrz komentarz tam):
    ".kodur-shell__nav-disabled"/"-badge" są parametrami "Class" komponentów BlazorBlueprint, nie
    literalnymi atrybutami HTML w tym pliku — "::deep" bez PRAWDZIWEGO literalnego przodka
    kompiluje się do "[b-xxx] .klasa" (wymóg przodka z atrybutem zasięgu), a w całym poddrzewie
    BbSidebarProvider → … → ten przycisk NIE MA żadnego literalnego HTML, więc atrybut nie ma się
    do czego przyczepić i reguła nigdy nie dopasowywała żadnego elementu (potwierdzone odczytem
    skompilowanego bundla). ".kodur-shell__nav-disabled-scope" (literalny <div> w
    MainLayout.razor, "display: contents" — zero wpływu na layout) daje TERAZ prawdziwą kotwicę.
*/
.kodur-shell__nav-disabled-scope[b-rb911b4o3i] {
    display: contents;
}

.kodur-shell__nav-disabled-scope[b-rb911b4o3i]  .kodur-shell__nav-disabled {
    opacity: 0.55;
    cursor: default;
    pointer-events: none;
}

.kodur-shell__nav-disabled-scope[b-rb911b4o3i]  button[data-sidebar="menu-button"].kodur-shell__nav-disabled {
    padding-right: 4.5rem;
}

/* Plakietka top-level (BbSidebarMenuBadge) — biblioteka pozycjonuje ją "position: absolute"
   względem <li> (position: relative na BbSidebarMenuItem), ale NIE ustawia "right", więc bez tej
   reguły ląduje bez odstępu tuż za tekstem nazwy ("Zadania prewencyjneNiedostepne" jako jeden
   ciąg — usterka ze zrzutu ekranu właściciela produktu). */
.kodur-shell__nav-disabled-scope[b-rb911b4o3i]  .kodur-shell__nav-disabled-badge {
    right: 0.625rem;
    font-size: 0.7rem;
    white-space: nowrap;
}

/* Plakietka w podmenu (BbSidebarMenuSubButton) — tu odstęp już działa przez margin-left: auto
   w tym samym kontenerze flex; brakowało tylko poprawnego celu skracania (patrz komentarz w
   MainLayout.razor przy tych dwóch <span>). "order" przywraca wizualny układ nazwa→oznaczenie
   niezależnie od tego, że w DOM oznaczenie musi stać PIERWSZE, żeby to nazwa była ":last-child".
   BEZ "::deep" i BEZ kotwicy-<div> — te dwa <span> SĄ literalnym HTML wprost w MainLayout.razor
   (jako ChildContent BbSidebarMenuSubButton), więc dostają atrybut zasięgu wprost na siebie. */
.kodur-shell__nav-disabled-label[b-rb911b4o3i] {
    order: 0;
    min-width: 0;
}

.kodur-shell__nav-disabled-tag[b-rb911b4o3i] {
    order: 1;
    margin-left: auto;
    flex-shrink: 0;
    font-size: 0.7rem;
    white-space: nowrap;
}

.kodur-shell__logo-link[b-rb911b4o3i] {
    display: flex;
    padding: 0.5rem;
}

.kodur-shell__logo[b-rb911b4o3i] {
    height: 1.75rem;
}

.kodur-shell__topbar[b-rb911b4o3i] {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    border-bottom: 1px solid var(--kodur-border);
    padding: 0.5rem 1rem;
}

[b-rb911b4o3i] .kodur-shell__search-trigger {
    flex: 1;
    max-width: 24rem;
    justify-content: flex-start;
    gap: 0.5rem;
    color: var(--kodur-text-muted);
}

[b-rb911b4o3i] .kodur-shell__search-shortcut {
    margin-left: auto;
    font-size: 0.6875rem;
}

.kodur-shell__topbar-actions[b-rb911b4o3i] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-left: auto;
}

.kodur-shell__content[b-rb911b4o3i] {
    flex: 1;
    /* min-height: 0 jest wymagane, zeby dziecko flex z flex:1 moglo faktycznie SIE SKURCZYC do
       wysokosci rodzica zamiast rozpychac go tresc — bez tego overflow-y:auto nizej nigdy by sie
       nie uruchomil (ten sam mechanizm co K210 w RoomDetailPage, patrz RoomDetailPageLayoutTests). */
    min-height: 0;
    overflow-y: auto;
    padding: 1rem;
}

@media (min-width: 1280px) {
    .kodur-shell__content[b-rb911b4o3i] {
        padding: 1.5rem 2rem;
    }
}

#blazor-error-ui[b-rb911b4o3i] {
    color-scheme: light only;
    background: lightyellow;
    bottom: 0;
    box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
    box-sizing: border-box;
    display: none;
    left: 0;
    padding: 0.6rem 1.25rem 0.7rem 1.25rem;
    position: fixed;
    width: 100%;
    z-index: 1000;
}

    #blazor-error-ui .dismiss[b-rb911b4o3i] {
        cursor: pointer;
        position: absolute;
        right: 0.75rem;
        top: 0.5rem;
    }
/* /Components/Layout/PublicPortalLayout.razor.rz.scp.css */
.kodur-public-portal[b-42fl9a1ak2] {
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    background: var(--kodur-surface);
}

.kodur-public-portal__header[b-42fl9a1ak2] {
    padding: 1rem 1.25rem;
    border-bottom: 1px solid var(--kodur-border);
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
}

.kodur-public-portal__logo[b-42fl9a1ak2] {
    height: 1.75rem;
}

.kodur-public-portal__content[b-42fl9a1ak2] {
    flex: 1;
    display: flex;
    justify-content: center;
    align-items: center;
    padding: 1.5rem 1rem;
}

@media (min-width: 768px) {
    .kodur-public-portal__content[b-42fl9a1ak2] {
        padding: 3rem 1.5rem;
    }
}

.kodur-public-portal__footer[b-42fl9a1ak2] {
    padding: 1rem 1.25rem;
    text-align: center;
    font-size: 0.75rem;
    color: var(--kodur-text-muted);
}
/* /Components/Layout/ReconnectModal.razor.rz.scp.css */
.components-reconnect-first-attempt-visible[b-lram8ybtis],
.components-reconnect-repeated-attempt-visible[b-lram8ybtis],
.components-reconnect-failed-visible[b-lram8ybtis],
.components-pause-visible[b-lram8ybtis],
.components-resume-failed-visible[b-lram8ybtis],
.components-rejoining-animation[b-lram8ybtis] {
    display: none;
}

#components-reconnect-modal.components-reconnect-show .components-reconnect-first-attempt-visible[b-lram8ybtis],
#components-reconnect-modal.components-reconnect-show .components-rejoining-animation[b-lram8ybtis],
#components-reconnect-modal.components-reconnect-paused .components-pause-visible[b-lram8ybtis],
#components-reconnect-modal.components-reconnect-resume-failed .components-resume-failed-visible[b-lram8ybtis],
#components-reconnect-modal.components-reconnect-retrying[b-lram8ybtis],
#components-reconnect-modal.components-reconnect-retrying .components-reconnect-repeated-attempt-visible[b-lram8ybtis],
#components-reconnect-modal.components-reconnect-retrying .components-rejoining-animation[b-lram8ybtis],
#components-reconnect-modal.components-reconnect-failed[b-lram8ybtis],
#components-reconnect-modal.components-reconnect-failed .components-reconnect-failed-visible[b-lram8ybtis] {
    display: block;
}


#components-reconnect-modal[b-lram8ybtis] {
    background-color: white;
    width: 20rem;
    margin: 20vh auto;
    padding: 2rem;
    border: 0;
    border-radius: 0.5rem;
    box-shadow: 0 3px 6px 2px rgba(0, 0, 0, 0.3);
    opacity: 0;
    transition: display 0.5s allow-discrete, overlay 0.5s allow-discrete;
    animation: components-reconnect-modal-fadeOutOpacity-b-lram8ybtis 0.5s both;
    &[open]

{
    animation: components-reconnect-modal-slideUp-b-lram8ybtis 1.5s cubic-bezier(.05, .89, .25, 1.02) 0.3s, components-reconnect-modal-fadeInOpacity-b-lram8ybtis 0.5s ease-in-out 0.3s;
    animation-fill-mode: both;
}

}

#components-reconnect-modal[b-lram8ybtis]::backdrop {
    background-color: rgba(0, 0, 0, 0.4);
    animation: components-reconnect-modal-fadeInOpacity-b-lram8ybtis 0.5s ease-in-out;
    opacity: 1;
}

@keyframes components-reconnect-modal-slideUp-b-lram8ybtis {
    0% {
        transform: translateY(30px) scale(0.95);
    }

    100% {
        transform: translateY(0);
    }
}

@keyframes components-reconnect-modal-fadeInOpacity-b-lram8ybtis {
    0% {
        opacity: 0;
    }

    100% {
        opacity: 1;
    }
}

@keyframes components-reconnect-modal-fadeOutOpacity-b-lram8ybtis {
    0% {
        opacity: 1;
    }

    100% {
        opacity: 0;
    }
}

.components-reconnect-container[b-lram8ybtis] {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 1rem;
}

#components-reconnect-modal p[b-lram8ybtis] {
    margin: 0;
    text-align: center;
}

#components-reconnect-modal button[b-lram8ybtis] {
    border: 0;
    background-color: #6b9ed2;
    color: white;
    padding: 4px 24px;
    border-radius: 4px;
}

    #components-reconnect-modal button:hover[b-lram8ybtis] {
        background-color: #3b6ea2;
    }

    #components-reconnect-modal button:active[b-lram8ybtis] {
        background-color: #6b9ed2;
    }

.components-rejoining-animation[b-lram8ybtis] {
    position: relative;
    width: 80px;
    height: 80px;
}

    .components-rejoining-animation div[b-lram8ybtis] {
        position: absolute;
        border: 3px solid #0087ff;
        opacity: 1;
        border-radius: 50%;
        animation: components-rejoining-animation-b-lram8ybtis 1.5s cubic-bezier(0, 0.2, 0.8, 1) infinite;
    }

        .components-rejoining-animation div:nth-child(2)[b-lram8ybtis] {
            animation-delay: -0.5s;
        }

@keyframes components-rejoining-animation-b-lram8ybtis {
    0% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 0;
    }

    4.9% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 0;
    }

    5% {
        top: 40px;
        left: 40px;
        width: 0;
        height: 0;
        opacity: 1;
    }

    100% {
        top: 0px;
        left: 0px;
        width: 80px;
        height: 80px;
        opacity: 0;
    }
}
/* /Components/Pages/Dev/UiGallery.razor.rz.scp.css */
.kodur-gallery[b-lyn64m7gai] {
    max-width: 72rem;
    margin: 0 auto;
    padding: 1.5rem;
    display: flex;
    flex-direction: column;
    gap: 2rem;
}

.kodur-gallery__title[b-lyn64m7gai] {
    font-size: 1.5rem;
    font-weight: 700;
}

.kodur-gallery__intro[b-lyn64m7gai] {
    color: var(--kodur-text-muted);
    max-width: 48rem;
}

.kodur-gallery__section[b-lyn64m7gai] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    padding-bottom: 1.5rem;
    border-bottom: 1px solid var(--kodur-border);
}

.kodur-gallery__section h2[b-lyn64m7gai] {
    font-size: 1.125rem;
    font-weight: 600;
}

.kodur-gallery__grid[b-lyn64m7gai] {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
    gap: 1rem;
}

.kodur-gallery__row[b-lyn64m7gai] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.75rem;
}

.kodur-gallery__kpi-grid[b-lyn64m7gai] {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
    gap: 1rem;
}

.kodur-gallery__stack[b-lyn64m7gai] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}
/* /Components/Pages/Home.razor.rz.scp.css */
.home[b-hpbbc7uxtw] {
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
}

.home__header[b-hpbbc7uxtw] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
}

.home__section h2[b-hpbbc7uxtw] {
    margin-bottom: 0.5rem;
    font-size: 1.1rem;
    font-weight: 600;
}

.home__tiles[b-hpbbc7uxtw] {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
}

.home__fallback[b-hpbbc7uxtw] {
    color: var(--muted-foreground);
}

/* T-1535, decyzje.md K216 — sekcja "Moje pokoje". Ten sam wzorzec koloru/tokenów co
   ".pokoje-kafelek" (RoomListPage.razor.css) — duplikowany, nie współdzielony (izolacja CSS
   Blazora), świadomie zgodny wzorzec z resztą modułu Pokoje. */
.home-pokoje__lista[b-hpbbc7uxtw] {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
}

.home-pokoj-kafelek[b-hpbbc7uxtw] {
    cursor: pointer;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    min-width: 12rem;
    padding: 1rem;
    border: 0.0625rem solid var(--kodur-border);
    border-left: 0.375rem solid transparent;
    border-radius: 0.5rem;
    background-color: var(--kodur-surface);
    outline-offset: 2px;
}

.home-pokoj-kafelek--czerwony[b-hpbbc7uxtw] {
    border-left-color: var(--kodur-status-awaria-fill);
}

.home-pokoj-kafelek--niebieski[b-hpbbc7uxtw] {
    border-left-color: var(--kodur-status-oczekiwanie-na-czesci-fill);
}

.home-pokoj-kafelek--zolty[b-hpbbc7uxtw] {
    border-left-color: var(--kodur-accent);
}

.home-pokoj-kafelek--szary[b-hpbbc7uxtw] {
    border-left-color: var(--kodur-status-wstrzymane-fill);
}

.home-pokoj-kafelek__nazwa[b-hpbbc7uxtw] {
    font-weight: 600;
    font-size: 1.05rem;
}

.home-pokoj-kafelek__stan[b-hpbbc7uxtw] {
    color: var(--kodur-text-muted);
    font-size: 0.875rem;
}
/* /Components/Pages/Kalendarz/KalendarzPage.razor.rz.scp.css */
.kalendarz[b-thl5k7p311] {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.kalendarz__header[b-thl5k7p311] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 0.75rem;
}

.kalendarz__layers[b-thl5k7p311] {
    display: flex;
    align-items: center;
}

.kalendarz__toolbar[b-thl5k7p311] {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.75rem;
}

.kalendarz__selected-day[b-thl5k7p311] {
    display: inline-flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.25rem 0.6rem;
    border-radius: 999px;
    background: var(--muted, #f1f5f9);
    font-size: 0.875rem;
}

.kalendarz__selected-day button[b-thl5k7p311] {
    border: none;
    background: transparent;
    cursor: pointer;
    line-height: 1;
    padding: 0;
}

.kalendarz__print-variant[b-thl5k7p311] {
    display: inline-flex;
    gap: 0.25rem;
}

.kalendarz--loading[b-thl5k7p311] {
    opacity: 0.6;
    pointer-events: none;
}

.kalendarz__skeleton[b-thl5k7p311] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.kalendarz__sheet-body[b-thl5k7p311] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    padding: 0.5rem 0;
}

.kalendarz__sheet-badges[b-thl5k7p311] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.kalendarz__sheet-assets[b-thl5k7p311] {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}

.kalendarz__reschedule[b-thl5k7p311] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    padding: 0.75rem;
    border: 1px solid var(--border, #e2e8f0);
    border-radius: 0.5rem;
}

.kalendarz__reschedule-field[b-thl5k7p311] {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    font-size: 0.875rem;
}

.kalendarz__reschedule-actions[b-thl5k7p311] {
    display: flex;
    justify-content: flex-end;
    gap: 0.5rem;
}

.kalendarz__reschedule-error[b-thl5k7p311] {
    color: var(--kodur-crit-awaria-text, #991b1b);
    font-size: 0.875rem;
}

/*
    K132 pkt 2 — plakietka "dwie prace tego dnia na tej maszynie" ma zostać WIZUALNIE MOCNA
    (tło czerwone) na wyraźną prośbę właściciela produktu — chodzi o słowa i godziny w treści,
    nie o stonowanie wyglądu.
*/
.kalendarz__collision-box[b-thl5k7p311] {
    display: flex;
    gap: 0.5rem;
    align-items: flex-start;
    padding: 0.75rem;
    border-radius: 0.5rem;
    background: var(--kodur-crit-awaria-fill, #fee2e2);
    color: var(--kodur-crit-awaria-text, #991b1b);
}

.kalendarz__collision-box ul[b-thl5k7p311] {
    margin: 0.25rem 0 0;
    padding-left: 1.1rem;
}

/*
    K110, decyzje.md — ::deep wymaga PRAWDZIWEJ kotwicy przed nim w tej samej regule, bo izolacja
    stylów Blazora przypisuje atrybut zasięgu WYŁĄCZNIE do literalnych elementów HTML napisanych
    w TYM pliku, nigdy do wywołań komponentów. ".kalendarz" jest jedynym literalnym <div> renderowanym
    zawsze w KalendarzPage.razor — realna kotwica dla stylowania kafelków BbEventCalendar (komponent
    dziecko, więc "głęboko" względem tego pliku) i klas dopisanych przez EventClass/EventTemplate.
*/
.kalendarz[b-thl5k7p311]  .kodur-cal-event {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    min-width: 0;
}

.kalendarz[b-thl5k7p311]  .kodur-cal-event__number {
    font-weight: 600;
    flex-shrink: 0;
}

.kalendarz[b-thl5k7p311]  .kodur-cal-event__subject {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    min-width: 0;
}

.kalendarz[b-thl5k7p311]  .kodur-cal-event__time {
    font-variant-numeric: tabular-nums;
    opacity: 0.8;
    flex-shrink: 0;
}

.kalendarz[b-thl5k7p311]  .kodur-cal-event__icon {
    flex-shrink: 0;
    width: 0.85rem;
    height: 0.85rem;
}

.kalendarz[b-thl5k7p311]  .kodur-cal-event__collision-icon {
    flex-shrink: 0;
    width: 0.85rem;
    height: 0.85rem;
    color: var(--kodur-crit-awaria-text, #991b1b);
}

.kalendarz[b-thl5k7p311]  .kodur-cal-event--pm {
    border-left: 3px solid var(--kodur-status-w-realizacji-fill, #12806f);
}

.kalendarz[b-thl5k7p311]  .kodur-cal-event--downtime {
    background: var(--kodur-status-przekroczony-termin-fill, #fef3c7);
    color: var(--kodur-status-przekroczony-termin-text, #92400e);
}

.kalendarz[b-thl5k7p311]  .kodur-cal-event--qualification {
    background: var(--kodur-crit-oczekiwanie-na-czesci-fill, #e0e7ff);
    color: var(--kodur-crit-oczekiwanie-na-czesci-text, #3730a3);
}

/* K132 pkt 2 — mocne, nieprzeoczalne tło; treść (godziny + "dwie prace") niesie ostrożność, nie wygląd. */
.kalendarz[b-thl5k7p311]  .kodur-cal-event--collision {
    background: var(--kodur-crit-awaria-fill, #fee2e2) !important;
    outline: 2px solid var(--kodur-crit-awaria-text, #991b1b);
    outline-offset: -2px;
}

/*
    T-1528/K166 — blok druku jest RODZEŃSTWEM ".kalendarz" w markupie (KalendarzPage.razor), nie
    jego potomkiem, celowo: ".kalendarz" (sterowanie, checkboxy, siatka) znika CAŁKOWICIE na
    wydruku, więc gdyby blok druku był w środku, zniknąłby razem z nim. Na ekranie — odwrotnie,
    ukryty; przełącznik robi WYŁĄCZNIE @media print, bez JS.
*/
.kalendarz-print[b-thl5k7p311] {
    display: none;
}

@media print {
    .kalendarz[b-thl5k7p311],
    .kalendarz__toolbar[b-thl5k7p311] {
        display: none !important;
    }

    .kalendarz-print[b-thl5k7p311] {
        display: block;
    }

    .kalendarz-print__day[b-thl5k7p311] {
        break-inside: avoid;
        page-break-inside: avoid;
        margin-bottom: 1rem;
    }

    .kalendarz-print__table[b-thl5k7p311] {
        width: 100%;
        border-collapse: collapse;
        font-size: 0.85rem;
    }

    .kalendarz-print__table th[b-thl5k7p311],
    .kalendarz-print__table td[b-thl5k7p311] {
        border: 1px solid #999;
        padding: 0.25rem 0.4rem;
        text-align: left;
    }

    /* T-1528/K166 — wariant "Siatka": kartka na ścianę, układ jak na ekranie. Wiersz tygodnia nie
       łamie się w środku (break-inside: avoid) — komórka dnia ma stały limit (GridCellCap) +
       jawne "+N więcej" zamiast cichego obcięcia CSS overflow. */
    .kalendarz-print__grid[b-thl5k7p311] {
        width: 100%;
        table-layout: fixed;
        border-collapse: collapse;
    }

    .kalendarz-print__grid tr[b-thl5k7p311] {
        break-inside: avoid;
        page-break-inside: avoid;
    }

    .kalendarz-print__grid th[b-thl5k7p311],
    .kalendarz-print__grid td[b-thl5k7p311] {
        border: 1px solid #999;
        vertical-align: top;
        padding: 0.2rem 0.3rem;
        width: 14.28%;
    }

    .kalendarz-print__grid th[b-thl5k7p311] {
        text-align: center;
        font-size: 0.8rem;
    }

    .kalendarz-print__grid-cell--outside[b-thl5k7p311] {
        color: #888;
    }

    .kalendarz-print__grid-daynum[b-thl5k7p311] {
        font-weight: 600;
        font-size: 0.8rem;
    }

    .kalendarz-print__grid-event[b-thl5k7p311] {
        font-size: 0.7rem;
        line-height: 1.2;
    }

    .kalendarz-print__grid-more[b-thl5k7p311] {
        font-size: 0.7rem;
        font-style: italic;
    }
}
/* /Components/Pages/Magazyn/Mapa/RackElevationGrid.razor.rz.scp.css */
.rack-elevation[b-cnvk835piy] {
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.rack-elevation__row[b-cnvk835piy] {
    display: flex;
    align-items: stretch;
    gap: 4px;
}

.rack-elevation__level[b-cnvk835piy] {
    width: 2.5rem;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: 600;
    color: var(--kodur-text-muted);
}

.rack-elevation__bins[b-cnvk835piy] {
    display: flex;
    gap: 4px;
    flex: 1;
    overflow-x: auto;
    align-items: stretch;
}

/* T-1535, decyzje.md K295 — kolor tła i flex-basis (z WidthCells) NIE MOGĄ iść bezpośrednio na
   przycisk (`.rack-elevation__bin`), bo `<BbPopoverTrigger AsChild="false">` nadpisuje WŁASNYM,
   pustym/`pointer-events:none` atrybutem `style` cokolwiek przekazane przez wołającego (zmierzone
   bUnitem — zobacz komentarz w .razor). Dynamiczny styl idzie więc na TEN wrapper (zwykły <div>,
   autorowany bezpośrednio, nieopakowany przez żaden komponent biblioteki), przycisk wewnątrz
   wypełnia go przez `flex: 1`. */
.rack-elevation__bin-wrapper[b-cnvk835piy] {
    display: flex;
}

/* Teraz prawdziwy <button> (wcześniej goły <div>, patrz .razor) wewnątrz wrappera wyżej — reset
   domyślnego wyglądu przeglądarki: bez tego button dostałby własne tło/czcionkę/obramowanie UA,
   nadpisujące świadomie ustawione niżej. */
.rack-elevation__bin[b-cnvk835piy] {
    flex: 1;
    min-width: 3.5rem;
    min-height: 3rem;
    border: 1px solid var(--kodur-border);
    border-radius: 4px;
    background: none;
    font: inherit;
    color: inherit;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 0.25rem;
    cursor: pointer;
}

.rack-elevation__bin-address[b-cnvk835piy] {
    font-size: 0.7rem;
    font-weight: 600;
}

.rack-elevation__bin-badge[b-cnvk835piy] {
    font-size: 0.65rem;
    color: var(--kodur-text-muted);
}

.rack-elevation__popover h4[b-cnvk835piy] {
    margin: 0 0 0.5rem 0;
}

.rack-elevation__popover ul[b-cnvk835piy] {
    margin: 0;
    padding-left: 1rem;
}
/* /Components/Pages/Magazyn/Mapa/RackElevationPage.razor.rz.scp.css */
.rack-page__header[b-7uusfy12uk] {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}

.rack-page__address[b-7uusfy12uk] {
    color: var(--kodur-text-muted);
    font-weight: 400;
    font-size: 0.9em;
}

.rack-page__toolbar[b-7uusfy12uk] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin: 0.75rem 0;
}
/* /Components/Pages/Magazyn/Mapa/WarehouseMapPage.razor.rz.scp.css */
.wmap__header[b-aajxsi25vi] {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 0.5rem;
}

.wmap__address[b-aajxsi25vi] {
    color: var(--kodur-text-muted);
    font-weight: 400;
    font-size: 0.9em;
}

.wmap__actions[b-aajxsi25vi] {
    display: flex;
    gap: 0.5rem;
}

.wmap__issues[b-aajxsi25vi] {
    margin: 0.5rem 0;
}

.wmap__issue[b-aajxsi25vi] {
    color: var(--kodur-status-awaria-fill);
    margin: 0.2rem 0;
}

.wmap__toolbar[b-aajxsi25vi] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin: 0.75rem 0;
}

.wmap__canvas[b-aajxsi25vi] {
    position: relative;
    min-height: 400px;
}

.wmap__zones-layer[b-aajxsi25vi] {
    position: absolute;
    inset: 0;
    display: grid;
    z-index: 0;
    pointer-events: none;
}

.wmap__zone[b-aajxsi25vi] {
    border-radius: 4px;
    border: 1px dashed var(--kodur-border);
    background-color: color-mix(in srgb, var(--kodur-secondary) 15%, transparent);
    padding: 2px 4px;
    position: relative;
}

.wmap__zone-label[b-aajxsi25vi] {
    font-size: 0.75rem;
    color: var(--kodur-text-muted);
    pointer-events: auto;
}

.wmap__zone-add[b-aajxsi25vi] {
    position: absolute;
    top: 2px;
    right: 2px;
    pointer-events: auto;
}

.wmap__grid-layer[b-aajxsi25vi] {
    position: relative;
    z-index: 1;
}

.wmap__widget-header[b-aajxsi25vi] {
    display: flex;
    align-items: center;
    gap: 0.25rem;
    font-size: 0.75rem;
}

.wmap__rack-body[b-aajxsi25vi] {
    width: 100%;
    height: 100%;
    background-color: var(--kodur-primary-light);
    border-radius: 2px;
}

:global(.wmap__rack--issue)[b-aajxsi25vi] {
    outline: 2px solid var(--kodur-status-awaria-fill);
}

:global(.wmap__rack--highlight)[b-aajxsi25vi] {
    outline: 3px solid var(--kodur-accent);
    box-shadow: 0 0 0 4px color-mix(in srgb, var(--kodur-accent) 30%, transparent);
}

.wmap__table[b-aajxsi25vi] {
    width: 100%;
    border-collapse: collapse;
}

.wmap__table th[b-aajxsi25vi],
.wmap__table td[b-aajxsi25vi] {
    border-bottom: 1px solid var(--kodur-border);
    padding: 0.35rem 0.5rem;
    text-align: left;
}

.wmap__loading[b-aajxsi25vi] {
    color: var(--kodur-text-muted);
}
/* /Components/Pages/Magazyn/PartsListPage.razor.rz.scp.css */
.parts-catalog__warehouse[b-0nk6kiws0o] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 1rem;
}

.parts-catalog__filters[b-0nk6kiws0o] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
}

.parts-catalog__below-min[b-0nk6kiws0o] {
    margin-left: 0.5rem;
    font-size: 0.75rem;
    color: var(--bb-color-danger, #b91c1c);
}

.parts-catalog__filter-labeled[b-0nk6kiws0o] {
    display: flex;
    flex-direction: column;
    gap: 0.2rem;
}

.parts-catalog__filter-label[b-0nk6kiws0o] {
    font-size: 0.75rem;
    color: var(--muted-foreground, #6b7280);
}
/* /Components/Pages/Magazyn/Skan/WarehouseScanPage.razor.rz.scp.css */
.scan-page__hint[b-6a219jbr9p] {
    color: var(--kodur-text-muted);
}

.scan-page__table[b-6a219jbr9p] {
    width: 100%;
    border-collapse: collapse;
    margin-top: 0.5rem;
}

.scan-page__table th[b-6a219jbr9p],
.scan-page__table td[b-6a219jbr9p] {
    border-bottom: 1px solid var(--kodur-border);
    padding: 0.5rem;
    text-align: left;
}

.scan-page__below-min[b-6a219jbr9p] {
    margin-left: 0.4rem;
    padding: 0.1rem 0.4rem;
    border-radius: 4px;
    font-size: 0.7rem;
    background-color: var(--kodur-crit-b-fill);
    color: var(--kodur-crit-b-text);
}

.scan-page__form-row td[b-6a219jbr9p] {
    background-color: var(--kodur-bg-elevated);
}

.scan-page__inline-form[b-6a219jbr9p] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    align-items: center;
}

.scan-page__error[b-6a219jbr9p] {
    color: var(--kodur-status-awaria-fill);
    margin: 0.25rem 0 0;
}

.scan-page__missing[b-6a219jbr9p] {
    margin-top: 1rem;
}

.scan-page__actions[b-6a219jbr9p] {
    display: flex;
    gap: 0.5rem;
    margin-top: 1rem;
}

.scan-page__panel[b-6a219jbr9p] {
    margin-top: 1rem;
    padding: 0.75rem;
    border: 1px solid var(--kodur-border);
    border-radius: 6px;
}

.scan-page__search-results[b-6a219jbr9p] {
    list-style: none;
    padding: 0;
    margin: 0.25rem 0;
}

.scan-page__search-result[b-6a219jbr9p] {
    background: none;
    border: none;
    color: var(--kodur-link);
    cursor: pointer;
    padding: 0.15rem 0;
}

.scan-page__count-row[b-6a219jbr9p] {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: 0.5rem;
    margin: 0.35rem 0;
}
/* /Components/Pages/Magazyn/Struktura/WarehouseStructurePage.razor.rz.scp.css */
/*
    T-1535 (K265, decyzje.md) — kolejna strona z bazowego długu (grupa "moduł magazynowy razem",
    kolejność koordynatora). Nagłówek/toolbar/tabela idą przez wspólne klasy `kodur-page*` z
    `app.css` (K265) — WPROST w markupie. Ten plik zostaje wyłącznie dla trzech układów
    specyficznych dla tej strony, bez odpowiednika we wspólnym mechanizmie: własna nawigacja
    okruszkowa oparta o przyciski (NIE `KodUrBreadcrumb` — ta strona nawiguje bez przeładowania
    URL-a, `_currentParentId` w stanie komponentu, więc zwykłe linki by nie pasowały), przycisk
    wyglądający jak link w komórce tabeli, i podświetlenie wybranego wiersza.
*/
.warehouse-structure-page__breadcrumb[b-8e26xylpt2] {
    display: flex;
    align-items: center;
    gap: 0.375rem;
    font-size: 0.875rem;
    color: var(--kodur-text-muted, #6b7280);
}

.warehouse-structure-page__crumb[b-8e26xylpt2],
.warehouse-structure-page__link[b-8e26xylpt2] {
    background: none;
    border: none;
    padding: 0;
    margin: 0;
    font: inherit;
    color: var(--kodur-primary);
    cursor: pointer;
}

.warehouse-structure-page__crumb:hover[b-8e26xylpt2],
.warehouse-structure-page__link:hover[b-8e26xylpt2] {
    text-decoration: underline;
}

.warehouse-structure-page__row--selected[b-8e26xylpt2] {
    background: var(--kodur-surface-hover, rgba(0, 0, 0, 0.04));
}
/* /Components/Pages/Magazyn/Wyszukiwanie/WhereIsPartPage.razor.rz.scp.css */
.where-page__matches[b-71wqku0qzf] {
    list-style: none;
    padding: 0;
    margin: 0.35rem 0;
    max-height: 16rem;
    overflow-y: auto;
}

.where-page__match[b-71wqku0qzf] {
    background: none;
    border: none;
    width: 100%;
    text-align: left;
    color: var(--kodur-link);
    cursor: pointer;
    padding: 0.3rem 0;
}

.where-page__match-code[b-71wqku0qzf] {
    color: var(--kodur-text-muted);
    margin-left: 0.35rem;
}

.where-page__match-exact[b-71wqku0qzf] {
    margin-left: 0.5rem;
    padding: 0.1rem 0.4rem;
    border-radius: 4px;
    font-size: 0.7rem;
    background-color: var(--kodur-primary-light);
}

.where-page__result[b-71wqku0qzf] {
    margin-top: 1rem;
}

.where-page__table[b-71wqku0qzf] {
    width: 100%;
    border-collapse: collapse;
    margin-top: 0.5rem;
}

.where-page__table th[b-71wqku0qzf],
.where-page__table td[b-71wqku0qzf] {
    border-bottom: 1px solid var(--kodur-border);
    padding: 0.5rem;
    text-align: left;
}

.where-page__hint[b-71wqku0qzf] {
    color: var(--kodur-text-muted);
}

.where-page__route td[b-71wqku0qzf] {
    background-color: var(--kodur-bg-elevated);
    color: var(--kodur-text-muted);
    font-size: 0.9em;
}
/* /Components/Pages/Mobile/PobierzAplikacjePage.razor.rz.scp.css */
.pobierz-aplikacje[b-2ymhymc0kn] {
    width: 100%;
    max-width: 40rem;
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.pobierz-aplikacje__wstep[b-2ymhymc0kn] {
    margin: 0;
    color: var(--kodur-text-muted);
}

.pobierz-aplikacje__skeleton[b-2ymhymc0kn],
.pobierz-aplikacje__lista[b-2ymhymc0kn] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}

.pobierz-aplikacje__karta[b-2ymhymc0kn] {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 0.5rem;
    padding: 1rem 1.25rem;
    border: 1px solid var(--kodur-border);
    border-radius: 0.75rem;
    background: var(--kodur-bg);
}

.pobierz-aplikacje__karta--zalecana[b-2ymhymc0kn] {
    border-color: var(--kodur-status-realizacja-fill);
}

.pobierz-aplikacje__karta-naglowek[b-2ymhymc0kn] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.pobierz-aplikacje__architektura[b-2ymhymc0kn] {
    font-family: monospace;
    font-weight: 600;
}

.pobierz-aplikacje__plakietka[b-2ymhymc0kn] {
    font-size: 0.75rem;
    font-weight: 600;
    padding: 0.125rem 0.5rem;
    border-radius: 999px;
    border: 1px solid var(--kodur-status-realizacja-fill);
    color: var(--kodur-status-realizacja-fill);
    background: color-mix(in srgb, var(--kodur-status-realizacja-fill) 12%, transparent);
}

.pobierz-aplikacje__opis[b-2ymhymc0kn] {
    margin: 0;
    font-size: 0.875rem;
    color: var(--kodur-text-muted);
}

.pobierz-aplikacje__meta[b-2ymhymc0kn] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem 1.5rem;
    margin: 0;
}

.pobierz-aplikacje__meta > div[b-2ymhymc0kn] {
    display: flex;
    flex-direction: column;
}

.pobierz-aplikacje__meta dt[b-2ymhymc0kn] {
    margin: 0;
    font-size: 0.75rem;
    color: var(--kodur-text-muted);
}

.pobierz-aplikacje__meta dd[b-2ymhymc0kn] {
    margin: 0;
    font-weight: 500;
}

.pobierz-aplikacje__link-niedostepny[b-2ymhymc0kn] {
    font-size: 0.875rem;
    font-style: italic;
    color: var(--kodur-text-muted);
}
/* /Components/Pages/Pokoje/RoomDetailPage.razor.rz.scp.css */
.pokoj-szczegol__header[b-4xsmclxcpe] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 1rem;
}

.pokoj-szczegol__banner[b-4xsmclxcpe] {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    padding: 1.25rem;
    border-radius: 0.5rem;
    margin-bottom: 1rem;
    border-left: 0.5rem solid transparent;
}

.pokoj-szczegol__banner--czerwony[b-4xsmclxcpe] {
    border-left-color: var(--kodur-status-awaria-fill);
}

.pokoj-szczegol__banner--niebieski[b-4xsmclxcpe] {
    border-left-color: var(--kodur-status-oczekiwanie-na-czesci-fill);
}

.pokoj-szczegol__banner--zolty[b-4xsmclxcpe] {
    border-left-color: var(--kodur-accent);
}

.pokoj-szczegol__banner--szary[b-4xsmclxcpe] {
    border-left-color: var(--kodur-status-wstrzymane-fill);
}

.pokoj-szczegol__stan[b-4xsmclxcpe] {
    font-weight: 600;
    font-size: 1.1rem;
}

.pokoj-szczegol__maszyny-naglowek[b-4xsmclxcpe] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin: 1.5rem 0 0.75rem;
}

/*
   T-1535, decyzje.md K201/K203 — NAPRAWA: właściciel produktu zgłosił TĘ SAMĄ uwagę drugi raz
   ("statusy i interkom mają zajmować mniejszą część niż rozmieszczenie maszyn") — bo pierwsza
   wersja miała rzeczywisty błąd, nie za mało precyzyjne zlecenie. `.kolumna-boczna` (statusy +
   interkom) stała w DOM PRZED `.kolumna-glowna` (maszyny), a auto-rozmieszczenie CSS Grid
   przydziela komórki w kolejności DOM — więc `.kolumna-boczna` dostawała PIERWSZĄ (wtedy szerszą)
   kolumnę, `.kolumna-glowna` DRUGĄ (węższą). Efekt był ODWRÓCONY względem własnego opisu w tym
   komentarzu ("LEWA/główna szersza niż PRAWA/boczna") — wina leży w kodzie, nie w niejasnym
   zleceniu. Naprawione przez JAWNE `grid-column` na obu kolumnach (niżej), niezależne od kolejności
   DOM w markupie — odporne na to, że `.kolumna-boczna` z przyczyn Razora nadal renderuje się w
   markupie PRZED `.kolumna-glowna` (status + interkom muszą wylądować w DOM przed zamknięciem
   sekcji maszyn, żeby czat mógł być OSTATNIM elementem kolumny głównej, patrz `.czat-miejsce`).

   Proporcja 3fr/1fr (75%/25%) — WYRAŹNIE węższa boczna kolumna, nie "blisko połowy" jak przy
   błędzie ani nawet poprzednie (poprawne, ale słabo widoczne) 2fr/1fr.

   Na wąskim ekranie (telefon, ≤48rem): jedna kolumna, kolejność DOM = kolejność wizualna, więc
   MASZYNY (kolumna-glowna, pierwsza w DOM) idą PIERWSZE, statusy/interkom PO nich — właściciel
   produktu wprost: "operator na telefonie ma najpierw widzieć maszyny, nie panel statusów".

   T-1535, decyzje.md K222 — właściciel produktu zobaczył K210 (pasek o STAŁEJ wysokości 28rem) NA
   ŻYWO i zmienił zdanie: pod niskim paskiem zostawało puste miejsce do samego dołu okna. Nowa
   reguła: OBIE kolumny sięgają do dołu okna, `align-items: stretch` (zamiast `start`) rozciąga je do
   TEJ SAMEJ wysokości — `--pokoj-dostepna-wysokosc` (ustawiane przez pokoj-uklad.js,
   ResizeObserver-em na `window.resize`, patrz OnAfterRenderAsync) to realna, ZMIERZONA wysokość
   okna MINUS wszystko, co stoi nad tą siatką (pasek boczny, okruszki, nagłówek, baner stanu, opcjonalny
   baner rozłączenia) — TYLKO JS zna tę wartość poprawnie, bo baner rozłączenia pojawia się i znika
   warunkowo, więc żadna stała liczba w CSS nie byłaby poprawna we WSZYSTKICH stanach strony.
   Warunek z K210 zostaje W INNEJ FORMIE: KAŻDA kolumna to teraz flex-column, gdzie treść GŁÓWNA
   (siatka maszyn / panel statusów) ma `flex: 0 0 auto`/`flex: 1 1 auto` z NIŻSZYM priorytetem
   kurczenia niż jej sąsiad (czat / interkom) — patrz `.pokoj-szczegol__maszyny`,
   `.pokoj-szczegol__czat-miejsce`, `.pokoj-status-panel`, `.pokoj-interkom` niżej. */
.pokoj-szczegol__uklad-dwie-kolumny[b-4xsmclxcpe] {
    display: grid;
    grid-template-columns: minmax(0, 3fr) minmax(0, 1fr);
    /* K222 — BEZ tego drugi wiersz (jedyny, niejawny) sizuje się domyślnie "auto" = do wysokości
       treści, więc `height` na kontenerze NIE wymuszał realnej wysokości wiersza siatki — obie
       kolumny i tak rosły do naturalnej wysokości treści, przelewając się poza okno (zmierzone:
       strona przewijała się o dokładnie różnicę wysokości między kolumnami). "1fr" każe
       JEDYNEMU wierszowi wypełnić DOKŁADNIE `height` kontenera, więc "stretch" niżej ma czego
       dotyczyć. */
    grid-template-rows: minmax(0, 1fr);
    gap: 1.5rem;
    align-items: stretch;
    height: var(--pokoj-dostepna-wysokosc, auto);
    min-height: 0;
}

.pokoj-szczegol__kolumna-glowna[b-4xsmclxcpe] {
    grid-column: 1;
    grid-row: 1;
    display: flex;
    flex-direction: column;
    gap: 1rem;
    /* "align-items: stretch" na rodzicu (siatka) samo nie wystarczyło — zmierzone: kolumna rosła do
       naturalnej wysokości TREŚCI (770px) zamiast do wysokości KOMÓRKI siatki (630px), mimo
       "min-height: 0" i "grid-template-rows: minmax(0, 1fr)" na rodzicu. Jawne "height: 100%" każe
       tej kolumnie (element JEST jednocześnie elementem siatki i osobnym kontenerem flex dla
       WŁASNYCH dzieci) faktycznie przyjąć wysokość komórki, więc "flex: 1 1 auto" na czacie
       (niżej) ma do czego się kurczyć/rosnąć. */
    height: 100%;
    min-height: 0;
}

.pokoj-szczegol__kolumna-boczna[b-4xsmclxcpe] {
    grid-column: 2;
    grid-row: 1;
    height: 100%;
    display: flex;
    flex-direction: column;
    gap: 1rem;
    min-height: 0;
}

@media (max-width: 48rem) {
    .pokoj-szczegol__uklad-dwie-kolumny[b-4xsmclxcpe] {
        grid-template-columns: 1fr;
        /* Telefon i tak przewija całą stronę (patrz media query .pokoj-status-panel/.pokoj-interkom
           niżej — na tej szerokości obie kolumny wracają do naturalnej wysokości) — wymuszanie
           wysokości okna tutaj nie ma sensu i psułoby układ jednokolumnowy. */
        height: auto;
    }

    .pokoj-szczegol__kolumna-glowna[b-4xsmclxcpe],
    .pokoj-szczegol__kolumna-boczna[b-4xsmclxcpe] {
        grid-column: 1;
    }

    .pokoj-szczegol__kolumna-glowna[b-4xsmclxcpe] {
        grid-row: 1;
    }

    .pokoj-szczegol__kolumna-boczna[b-4xsmclxcpe] {
        grid-row: 2;
    }
}

/* K222 — maszyny to GŁÓWNA TREŚĆ: naturalna wysokość, NIGDY się nie kurczą (flex: 0 0 auto) — to
   czat (.pokoj-szczegol__czat-miejsce, flex: 1 1 auto) ustępuje miejsca, nie odwrotnie. */
.pokoj-szczegol__maszyny[b-4xsmclxcpe] {
    flex: 0 0 auto;
}

.pokoj-szczegol__sklad-przycisk[b-4xsmclxcpe] {
    flex: 0 0 auto;
}

/* K222 — panel statusów rośnie do dołu kolumny bocznej, ale interkom (flex: 0 0 auto, PONIŻEJ) ma
   pierwszeństwo do miejsca — to funkcja alarmowa, ma zostać widoczna BEZ przewijania. min-height
   (nie 0) to podłoga, poniżej której panel nie skurczy się do zera, nawet gdyby interkom żądał
   więcej miejsca, niż kolumna ma — reszta idzie w przewijanie WEWNĄTRZ panelu. */
.pokoj-status-panel[b-4xsmclxcpe] {
    flex: 1 1 auto;
    min-height: 6rem;
    overflow-y: auto;
    border: 0.0625rem solid var(--kodur-border);
    border-radius: 0.5rem;
    padding: 0.75rem 1rem;
}

@media (max-width: 48rem) {
    .pokoj-status-panel[b-4xsmclxcpe] {
        flex: 0 0 auto;
        min-height: 0;
        max-height: 30vh;
    }
}

.pokoj-status-panel__lista[b-4xsmclxcpe] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    list-style: none;
    padding: 0;
    margin: 0;
}

.pokoj-status-panel__lista li[b-4xsmclxcpe] {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
}

.pokoj-status-panel__maszyna[b-4xsmclxcpe] {
    font-weight: 600;
}

.pokoj-status-panel__opis[b-4xsmclxcpe] {
    color: var(--kodur-text-muted);
    font-size: 0.875rem;
}

.pokoj-status-panel__meta[b-4xsmclxcpe] {
    color: var(--kodur-text-muted);
    font-size: 0.75rem;
}

/* K201 (miejsce zarezerwowane) → K204 (czat dowieziony) → K210 (pasek na dole) → K222 (czat W
   KOLUMNIE GŁÓWNEJ, POD siatką maszyn — flex: 1 1 auto, zajmuje całą resztę wysokości kolumny PO
   maszynach, patrz .pokoj-szczegol__maszyny wyżej). */
.pokoj-szczegol__czat-miejsce[b-4xsmclxcpe] {
    flex: 1 1 auto;
    min-height: 8rem;
    display: flex;
    flex-direction: column;
}

/* T-1535, decyzje.md K210 — USTERKA znaleziona PRZY PISANIU testu Playwright dla tego wpisu, nie
   zgłoszona przez właściciela produktu: WSZYSTKIE poniższe reguły `.pokoj-czat__*` nigdy nie
   działały. `RoomChatPanel` jest KOMPONENTEM DZIECKIEM osadzonym bez ChildContent — izolacja CSS
   Blazora dopisuje scope RODZICA WYŁĄCZNIE do elementu ROOT renderowanego przez dziecko (`.pokoj-czat`
   niżej — DLATEGO on sam działał), NIGDY do elementów zagnieżdżonych GŁĘBIEJ we własnym markupie
   dziecka. Test mierzący `getComputedStyle(...).overflowY` na `.pokoj-czat__wiadomosci` zwracał
   "visible" (domyślne przeglądarki), nie "auto" z tej reguły — dowód wprost, nie domysł. Naprawione
   kombinatorem `::deep`, który przenika granicę komponentu (dokładnie do tego służy). */
.pokoj-czat[b-4xsmclxcpe] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    height: 100%;
    min-height: 0;
}

/* K210 → K222 — WEWNĄTRZ kolumny sięgającej do dołu okna: ta lista jest jedyną częścią czatu, która
   rośnie i przewija się (flex: 1, min-height: 0 pozwala się skurczyć poniżej treści w kontenerze
   flex), h2 i pole wpisu (sąsiedzi w .pokoj-czat) zostają na stałym rozmiarze. Wcześniej (K204)
   sztywne max-height: 24rem — usunięte, bo kolumna sama narzuca teraz wysokość z zewnątrz. */
[b-4xsmclxcpe] .pokoj-czat__wiadomosci {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: 0.5rem;
    border: 0.0625rem solid var(--kodur-border);
    border-radius: 0.5rem;
}

[b-4xsmclxcpe] .pokoj-czat__wiadomosc {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}

[b-4xsmclxcpe] .pokoj-czat__naglowek-wiadomosci {
    display: flex;
    align-items: baseline;
    gap: 0.5rem;
}

[b-4xsmclxcpe] .pokoj-czat__autor {
    font-weight: 600;
}

[b-4xsmclxcpe] .pokoj-czat__czas {
    color: var(--kodur-text-muted);
    font-size: 0.75rem;
}

[b-4xsmclxcpe] .pokoj-czat__tresc {
    margin: 0;
    white-space: pre-wrap;
    overflow-wrap: break-word;
}

[b-4xsmclxcpe] .pokoj-czat__wzmianki {
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem;
}

[b-4xsmclxcpe] .pokoj-czat__odznaka-wzmianki {
    padding: 0.1rem 0.5rem;
    border-radius: 999px;
    background: var(--kodur-primary-light);
    color: var(--kodur-text-on-primary);
    font-size: 0.75rem;
}

/* T-1535, decyzje.md K222 — właściciel produktu: przycisk wysłania W ŚRODKU pola (jedna linia z
   tekstem), pole BEZ ręcznego uchwytu rozciągania, rosnące samo z treścią od JEDNEJ linii, z limitem
   (dalej), po którym przewija się WEWNĄTRZ zamiast dalej rosnąć. `:first-child` (nie klasa BbTextarea
   — biblioteka jej nie ujawnia w dokumentacji) łapie wewnętrzny kontener BbTextarea niezależnie od
   jego znaczników; `textarea` (zwykły element HTML, bez Shadow DOM) łapie GOŁY input pod spodem. */
[b-4xsmclxcpe] .pokoj-czat__pole-wpisu {
    position: relative;
    display: flex;
    align-items: flex-end;
    gap: 0.5rem;
}

[b-4xsmclxcpe] .pokoj-czat__pole-wpisu > :first-child {
    flex: 1 1 auto;
    min-width: 0;
}

/* T-1535, decyzje.md K237 — `field-sizing: content` był OPISANY w komentarzu RoomChatPanel.razor
   (K222) jako część tej reguły, ale nigdy faktycznie nie dopisany tutaj — pole nie rosło wcale,
   tylko przewijało się wewnątrz od razu po przekroczeniu wysokości domyślnej BbTextarea. Znalezione
   przy weryfikacji zgłoszenia właściciela produktu "wciąż nie rośnie", nie zgadywane. Limit 10rem
   (~6-7 linii) — wybrany tak, żeby wklejona długa treść przewijała się WEWNĄTRZ pola, zamiast
   zjeżdżać na cały ekran i wypychać historię rozmowy poza widok (K222). */
[b-4xsmclxcpe] .pokoj-czat__pole-wpisu textarea {
    field-sizing: content;
    resize: none;
    max-height: 10rem;
    overflow-y: auto;
}

/* Ten sam wzorzec pozycjonowania co .wo-detail__mention-popup (mention-picker.js, "lustrzany div") — position: fixed niezależnie od przodków w layoucie. */
[b-4xsmclxcpe] .pokoj-czat__mention-popup {
    position: fixed;
    z-index: 50;
    display: flex;
    flex-direction: column;
    background: var(--kodur-bg-elevated);
    border: 0.0625rem solid var(--kodur-border);
    border-radius: 0.5rem;
    box-shadow: 0 0.25rem 0.75rem rgba(0, 0, 0, 0.15);
    max-height: 12rem;
    overflow-y: auto;
    min-width: 12rem;
}

[b-4xsmclxcpe] .pokoj-czat__mention-brak {
    padding: 0.5rem 0.75rem;
    color: var(--kodur-text-muted);
    font-size: 0.875rem;
}

[b-4xsmclxcpe] .pokoj-czat__mention-opcja {
    padding: 0.5rem 0.75rem;
    text-align: left;
    background: none;
    border: none;
    cursor: pointer;
}

[b-4xsmclxcpe] .pokoj-czat__mention-opcja:hover,
[b-4xsmclxcpe] .pokoj-czat__mention-opcja--aktywna {
    background: var(--kodur-surface);
}

/* K193 — układ przestrzenny: rząd po rzędzie, w KAŻDYM rzędzie kolumna po kolumnie w kolejności DOM,
   żeby degradacja na wąskim ekranie (media query niżej) nie musiała przestawiać niczego — tylko
   zmienia grid na pojedynczą kolumnę, kolejność czytania zostaje ta sama. */
.pokoj-szczegol__uklad-siatka[b-4xsmclxcpe] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    margin-bottom: 1.5rem;
}

.pokoj-szczegol__uklad-rzad[b-4xsmclxcpe] {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
    gap: 0.5rem;
}

.pokoj-szczegol__uklad-slot[b-4xsmclxcpe] {
    min-height: 5rem;
    border: 0.1rem dashed var(--kodur-border, rgba(0, 0, 0, 0.15));
    border-radius: 0.5rem;
    padding: 0.25rem;
}

.pokoj-szczegol__uklad-slot:has(.pokoj-maszyna-kafelek)[b-4xsmclxcpe] {
    border-style: solid;
    border-color: transparent;
    padding: 0;
}

/* Degradacja na wąskim ekranie (telefon na hali) — jedna kolumna, kolejność DOM zostaje. */
@media (max-width: 40rem) {
    .pokoj-szczegol__uklad-rzad[b-4xsmclxcpe] {
        grid-template-columns: 1fr;
    }
}

.pokoj-maszyna-kafelek[b-4xsmclxcpe] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    padding: 0.75rem;
    border-radius: 0.5rem;
    border: 0.15rem solid transparent;
}

.pokoj-maszyna-kafelek--czerwony[b-4xsmclxcpe] {
    border-color: var(--kodur-status-awaria-fill);
}

.pokoj-maszyna-kafelek--niebieski[b-4xsmclxcpe] {
    border-color: var(--kodur-status-oczekiwanie-na-czesci-fill);
}

.pokoj-maszyna-kafelek--zolty[b-4xsmclxcpe] {
    border-color: var(--kodur-accent);
}

.pokoj-maszyna-kafelek--szary[b-4xsmclxcpe] {
    border-color: var(--kodur-status-wstrzymane-fill);
}

.pokoj-maszyna-kafelek__tresc[b-4xsmclxcpe] {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 0.25rem;
    width: 100%;
    height: auto;
    white-space: normal;
    text-align: left;
}

.pokoj-maszyna-kafelek__nazwa[b-4xsmclxcpe] {
    font-weight: 600;
}

/* T-1535, decyzje.md K222 — kafelek ma STAŁĄ szerokość w siatce (grid-template-columns:
   repeat(auto-fit, minmax(12rem, 1fr))): długi opis sygnału (rodzaj + czas + powód) NIE MIEŚCI SIĘ
   zawsze, więc jest przycinany z wielokropkiem, a pełna treść dostępna po dotknięciu (BbPopover —
   patrz .razor, przycisk-wyzwalacz działa identycznie myszką i palcem, w przeciwieństwie do
   dymka na hover, którego na tablecie w ogóle nie da się wywołać). Reset domyślnych stylów
   <button> (border/background/padding/font/cursor) — wygląda jak zwykły tekst, nie jak kontrolka. */
.pokoj-maszyna-kafelek__sygnal[b-4xsmclxcpe] {
    display: block;
    max-width: 100%;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    text-align: left;
    border: none;
    background: none;
    padding: 0;
    margin: 0;
    font: inherit;
    font-size: 0.85rem;
    font-variant-numeric: tabular-nums;
    opacity: 0.85;
    color: inherit;
    cursor: pointer;
}

.pokoj-maszyna-kafelek__sygnal-pelny[b-4xsmclxcpe] {
    margin: 0;
    max-width: 18rem;
    white-space: normal;
    overflow-wrap: break-word;
}

.pokoj-maszyna-kafelek__akcje[b-4xsmclxcpe] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
}

/* K210 (pasek dolny) → K222 — interkom W KOLUMNIE BOCZNEJ, POD panelem statusów. Funkcja alarmowa:
   `flex: 0 0 auto` — NIGDY się nie kurczy, naturalna wysokość treści, zawsze widoczny bez
   przewijania (to panel statusów ustępuje miejsca, patrz .pokoj-status-panel wyżej). overflow-y:auto
   zostaje jako siatka bezpieczeństwa (długa lista uczestników na bardzo niskim ekranie), nie jako
   normalny tryb pracy. */
.pokoj-interkom[b-4xsmclxcpe] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    flex: 0 0 auto;
    overflow-y: auto;
    padding: 1rem;
    border-radius: 0.5rem;
    background: var(--kodur-surface-muted, rgba(0, 0, 0, 0.03));
}

.pokoj-interkom__uczestnicy[b-4xsmclxcpe] {
    display: flex;
    align-items: flex-start;
    gap: 0.5rem;
}

.pokoj-interkom__uczestnicy ul[b-4xsmclxcpe] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem 1rem;
    list-style: none;
    padding: 0;
    margin: 0;
}

.pokoj-interkom__uczestnik--mowi[b-4xsmclxcpe] {
    font-weight: 600;
    color: var(--kodur-accent);
}

.pokoj-interkom__tryb[b-4xsmclxcpe] {
    display: flex;
    gap: 1.5rem;
}

/* WYMÓG 4 (K174, ta fala) — hala: rękawice/mokre ręce/hałas, przycisk musi być duży i działać na
   dotyk. Rozmiar znacznie przekracza standardowy przycisk (min. 44px WCAG) celowo. */
.pokoj-interkom__przycisk[b-4xsmclxcpe] {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 0.5rem;
    min-height: 6rem;
    width: 100%;
    max-width: 20rem;
    align-self: center;
    border-radius: 0.75rem;
    border: 0.2rem solid var(--kodur-status-wstrzymane-fill);
    background: transparent;
    font-size: 1.1rem;
    font-weight: 600;
    cursor: pointer;
    touch-action: none;
    -webkit-user-select: none;
    user-select: none;
}

.pokoj-interkom__przycisk--aktywny[b-4xsmclxcpe] {
    border-color: var(--kodur-status-awaria-fill);
    background: color-mix(in srgb, var(--kodur-status-awaria-fill) 15%, transparent);
}

.pokoj-interkom__przycisk:disabled[b-4xsmclxcpe] {
    opacity: 0.5;
    cursor: not-allowed;
}

/* T-1535, decyzje.md K218 — regulacja dźwięku. */
.pokoj-interkom__ustawienia[b-4xsmclxcpe] {
    border: 0.0625rem solid var(--kodur-border);
    border-radius: 0.5rem;
    padding: 0.5rem 0.75rem;
    font-size: 0.9rem;
}

.pokoj-interkom__ustawienia summary[b-4xsmclxcpe] {
    cursor: pointer;
    font-weight: 600;
}

.pokoj-interkom__suwak[b-4xsmclxcpe] {
    display: grid;
    grid-template-columns: 10rem 1fr 3rem;
    align-items: center;
    gap: 0.5rem;
    margin-top: 0.75rem;
}

.pokoj-interkom__suwak input[type="range"][b-4xsmclxcpe] {
    width: 100%;
}

.pokoj-interkom__przelacznik[b-4xsmclxcpe] {
    display: flex;
    align-items: flex-start;
    gap: 0.5rem;
    margin-top: 0.75rem;
}

.pokoj-interkom__przelacznik small[b-4xsmclxcpe] {
    display: block;
    color: var(--kodur-text-muted);
}

.pokoj-interkom__miernik[b-4xsmclxcpe] {
    margin-top: 0.75rem;
}

.pokoj-interkom__miernik-tlo[b-4xsmclxcpe] {
    height: 0.5rem;
    border-radius: 0.25rem;
    background: var(--kodur-status-wstrzymane-fill);
    overflow: hidden;
    margin-top: 0.25rem;
}

.pokoj-interkom__miernik-slupek[b-4xsmclxcpe] {
    height: 100%;
    width: 0%;
    background: var(--kodur-accent);
    transition: width 0.05s linear;
}

.pokoj-szczegol__sklad-przycisk[b-4xsmclxcpe] {
    margin-top: 2rem;
}

.pokoj-szczegol__lista-czlonkow[b-4xsmclxcpe] {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    list-style: none;
    padding: 0;
    margin: 0 0 0.75rem;
}

.pokoj-szczegol__lista-czlonkow li[b-4xsmclxcpe] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    flex-wrap: wrap;
}

.pokoj-szczegol__czlonek-akcje[b-4xsmclxcpe] {
    display: flex;
    gap: 0.5rem;
}

.pokoj-szczegol__odznaka-admin[b-4xsmclxcpe] {
    margin-left: 0.5rem;
    padding: 0.1rem 0.5rem;
    border-radius: 999px;
    background: var(--kodur-primary-light);
    color: var(--kodur-text-on-primary);
    font-size: 0.75rem;
}
/* /Components/Pages/Pokoje/RoomListPage.razor.rz.scp.css */
.pokoje-lista__header[b-jjj6x1sqbc] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 1rem;
}

.pokoje-lista__toolbar[b-jjj6x1sqbc] {
    display: flex;
    gap: 0.5rem;
}

.pokoje-lista__skeleton[b-jjj6x1sqbc] {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
    gap: 1rem;
}

.pokoje-lista__grid[b-jjj6x1sqbc] {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
    gap: 1rem;
}

/* Uwaga design-system.md pkt 11 (K110/K156): ".pokoje-lista__section" (wewnątrz KodUrFormDialog,
   dialog dodania pokoju) świadomie BEZ reguły tutaj — treść dialogu portaluje się pod
   BbPortalHost, gdzie CSS izolowany (nawet prosty selektor klasy z atrybutem zasięgu) nie ma jak
   zadziałać w przeglądarce. Ten sam, świadomy brak stylu co "przestoje__section" w
   PrzestojeListPage.razor (bez własnej reguły CSS) — jeśli sekcja dialogu kiedyś potrzebuje
   stylu, idzie do wwwroot/app.css (zwykły, nieizolowany arkusz), nigdy tutaj.

   Kafelek pokoju — cztery stany, decyzje.md K174 pkt 3/4: (czerwony albo niebieski) przed
   żółtym, przed szarym. Kolory z istniejących tokenów statusu (tokens.css), nie nowe wartości —
   niebieski/czerwony to te same barwy, co już reprezentują OczekiwanieCzesci/Awaria gdzie indziej
   w aplikacji, żeby kafelek pokoju i kafelek maszyny wizualnie się nie rozjeżdżały. */
.pokoje-kafelek[b-jjj6x1sqbc] {
    cursor: pointer;
    border-radius: 0.5rem;
    outline-offset: 2px;
}

[b-jjj6x1sqbc] .pokoje-kafelek__content {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    padding: 1rem;
    border-left: 0.375rem solid transparent;
    border-radius: 0.5rem;
}

.pokoje-kafelek--czerwony[b-jjj6x1sqbc]  .pokoje-kafelek__content {
    border-left-color: var(--kodur-status-awaria-fill);
}

.pokoje-kafelek--niebieski[b-jjj6x1sqbc]  .pokoje-kafelek__content {
    border-left-color: var(--kodur-status-oczekiwanie-na-czesci-fill);
}

.pokoje-kafelek--zolty[b-jjj6x1sqbc]  .pokoje-kafelek__content {
    border-left-color: var(--kodur-accent);
}

.pokoje-kafelek--szary[b-jjj6x1sqbc]  .pokoje-kafelek__content {
    border-left-color: var(--kodur-status-wstrzymane-fill);
}

.pokoje-kafelek__nazwa[b-jjj6x1sqbc] {
    font-weight: 600;
    font-size: 1.05rem;
}

.pokoje-kafelek__stan[b-jjj6x1sqbc] {
    font-size: 0.9rem;
    color: var(--kodur-text-muted, inherit);
}

.pokoje-kafelek__czas[b-jjj6x1sqbc] {
    font-size: 0.85rem;
    font-variant-numeric: tabular-nums;
}
/* /Components/Pages/Prewencja/NewPmScheduleForm.razor.rz.scp.css */
/*
    T-1526/K164 — te klasy istniały od T-1497 bez żadnego CSS (sam formularz renderował się jako
    goły stos pól). Wzorzec 1:1 z NewWorkOrderForm.razor.css (.wo-form*), który już działa w
    dokładnie tym samym miejscu — treść wewnątrz KodUrFormDialog (portalowanej przez BbDialogPortal
    razem, jako jedno nierozdzielone poddrzewo; żadna reguła tutaj nie używa ::deep, więc atrybut
    zasięgu Blazora jedzie z elementami przez portal bez przeszkód, design-system.md pkt 11).
*/
.pm-schedule-form[b-mbky4gm1m1] {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.pm-schedule-form__row[b-mbky4gm1m1] {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
}

.pm-schedule-form__row > *[b-mbky4gm1m1] {
    flex: 1 1 12rem;
}

.pm-schedule-form__section[b-mbky4gm1m1] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.pm-schedule-form__label[b-mbky4gm1m1] {
    font-weight: 600;
    font-size: 0.875rem;
}

.pm-schedule-form label[b-mbky4gm1m1] {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    font-weight: 500;
    font-size: 0.875rem;
}

.pm-schedule-form label.pm-schedule-form__check[b-mbky4gm1m1] {
    flex-direction: row;
    align-items: center;
    gap: 0.5rem;
    flex: 0 0 auto;
    font-weight: 400;
}

@media (max-width: 767px) {
    .pm-schedule-form__row[b-mbky4gm1m1] {
        flex-direction: column;
        align-items: stretch;
    }
}
/* /Components/Pages/Prewencja/PmOverviewTab.razor.rz.scp.css */
.pm-overview-tab__grid[b-6ias2i01pl] {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: 0.35rem 1rem;
    margin-bottom: 1rem;
}

.pm-overview-tab__grid dt[b-6ias2i01pl] {
    color: var(--muted-foreground, #6b7280);
    font-weight: 500;
}

.pm-overview-tab__asset-path[b-6ias2i01pl] {
    margin-bottom: 0.25rem;
}

.pm-overview-tab__asset-path:last-child[b-6ias2i01pl] {
    margin-bottom: 0;
}
/* /Components/Pages/Prewencja/PmRecurrenceFields.razor.rz.scp.css */
/*
    T-1526/K164 — zgłoszenie właściciela produktu: pola kształtu triggera renderowały się jako
    goły stos etykiet na całą szerokość, bez odstępów i bez grupowania powiązanych pól (np. rodzaj
    wyzwalacza + jednostka + co ile jednostek to jedna myśl). Klasy `.pm-recurrence-fields__*` w
    PmRecurrenceFields.razor istniały od T-1497, ale nigdy nie dostały żadnego CSS. Ten komponent
    NIE portaluje się (używany w BbTabsContent na PmScheduleDetailPage i wewnątrz treści
    KodUrFormDialog na NewPmScheduleForm — w obu przypadkach cały jego render trafia do jednego
    nierozdzielonego poddrzewa DOM, patrz app.css §K156/T-1515), więc zwykły izolowany arkusz
    (.razor.css) działa bez ograniczeń z design-system.md pkt 11.
*/
.pm-recurrence-fields[b-zy5ymc3fcw] {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.pm-recurrence-fields__row[b-zy5ymc3fcw] {
    display: flex;
    flex-wrap: wrap;
    gap: 1rem;
}

.pm-recurrence-fields__row > label[b-zy5ymc3fcw] {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    flex: 1 1 12rem;
    font-weight: 500;
    font-size: 0.875rem;
}

.pm-recurrence-fields__row--secondary[b-zy5ymc3fcw] {
    padding-top: 0.75rem;
    border-top: 1px solid var(--border, #e5e7eb);
}

.pm-recurrence-fields__row > label.pm-recurrence-fields__check[b-zy5ymc3fcw] {
    flex-direction: row;
    align-items: center;
    flex: 0 0 auto;
}

@media (max-width: 767px) {
    .pm-recurrence-fields__row[b-zy5ymc3fcw] {
        flex-direction: column;
        align-items: stretch;
    }
}
/* /Components/Pages/Prewencja/PmRecurrenceTab.razor.rz.scp.css */
.pm-recurrence-tab__section[b-olfmzmnj8s] {
    margin-top: 1.25rem;
}

.pm-recurrence-tab__heading[b-olfmzmnj8s] {
    display: block;
    font-weight: 600;
    font-size: 0.875rem;
    margin-bottom: 0.5rem;
}

.pm-recurrence-tab__current[b-olfmzmnj8s] {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: 0.35rem 1rem;
    margin: 0;
}

.pm-recurrence-tab__current dt[b-olfmzmnj8s] {
    color: var(--muted-foreground, #6b7280);
    font-weight: 500;
}

.pm-recurrence-tab__actions[b-olfmzmnj8s] {
    margin-top: 1rem;
}
/* /Components/Pages/Prewencja/PmScheduleCalendarPreviewPage.razor.rz.scp.css */
/*
    T-1535 (K265, decyzje.md) — kolejna strona z bazowego długu. Nagłówek idzie przez wspólną klasę
    `kodur-page*` z `app.css` (K265), "brak terminów" przez `.kodur-page__hint`. Ten plik zostaje
    wyłącznie dla akordeonu harmonogramów (rozwijany wiersz definicji → lista urządzeń → terminy) —
    układ specyficzny dla tej strony, bez odpowiednika we wspólnym mechanizmie.
*/
.pm-calendar-preview__schedule[b-243igjb3wv] {
    border: 1px solid var(--kodur-border, #e2e8f0);
    border-radius: 0.5rem;
    padding: 0.5rem 0.75rem;
}

.pm-calendar-preview__toggle[b-243igjb3wv] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    width: 100%;
    background: none;
    border: none;
    padding: 0;
    font: inherit;
    font-weight: 600;
    text-align: left;
    cursor: pointer;
}

.pm-calendar-preview__assets[b-243igjb3wv] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    margin-top: 0.75rem;
    padding-left: 1.5rem;
}

.pm-calendar-preview__asset[b-243igjb3wv] {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}
/* /Components/Pages/Prewencja/PmScheduleDetailPage.razor.rz.scp.css */
/*
    T-1526/K164 — zgłoszenie właściciela produktu: tytuł i odznaka statusu renderowały się jeden
    pod drugim (brak jakiegokolwiek CSS dla tego wrappera od T-1497). Wzorzec z
    EquipmentDetailPage.razor.css (.equipment-detail/.equipment-detail__header) — nie portaluje
    się (BbTabs/BbTabsContent nie jest w rodzinie Dialog/Sheet/Popover/Tooltip, design-system.md
    pkt 11), więc zwykły izolowany arkusz działa bez ograniczeń.
*/
.pm-schedule-detail[b-0r7kdb69ou] {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.pm-schedule-detail__header[b-0r7kdb69ou] {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}

.pm-schedule-detail__header h1[b-0r7kdb69ou] {
    margin: 0;
}

.pm-schedule-detail__skeleton[b-0r7kdb69ou] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}
/* /Components/Pages/Raporty/HygieneComplianceExtractPage.razor.rz.scp.css */
.hygiene-extract__filters[b-wndw6382o2] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 1rem;
    margin-bottom: 1rem;
}

.hygiene-extract__filter[b-wndw6382o2] {
    display: flex;
    align-items: center;
    gap: 0.4rem;
}

.hygiene-extract__export[b-wndw6382o2] {
    align-self: center;
}

.hygiene-extract__meta[b-wndw6382o2] {
    font-size: 0.9rem;
    color: var(--muted-foreground, #6b7280);
    margin-bottom: 0.75rem;
}

.hygiene-extract__table[b-wndw6382o2] {
    width: 100%;
    border-collapse: collapse;
    margin-bottom: 1.5rem;
}

.hygiene-extract__table th[b-wndw6382o2],
.hygiene-extract__table td[b-wndw6382o2] {
    padding: 0.4rem 0.6rem;
    border-bottom: 1px solid var(--border, #e5e7eb);
    text-align: left;
    vertical-align: top;
}

.hygiene-extract__row--no-event[b-wndw6382o2] {
    background-color: var(--muted, #f8fafc);
}

.hygiene-extract__path[b-wndw6382o2] {
    font-size: 0.75rem;
    color: var(--muted-foreground, #6b7280);
}
/* /Components/Pages/Raporty/MonthlyMaintenanceReportPage.razor.rz.scp.css */
.monthly-report__filters[b-4veftgv6zm] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 1rem;
    margin-bottom: 1rem;
}

.monthly-report__filter[b-4veftgv6zm] {
    display: flex;
    align-items: center;
    gap: 0.4rem;
}

.monthly-report__export[b-4veftgv6zm] {
    align-self: center;
}

.monthly-report__period[b-4veftgv6zm] {
    font-size: 0.9rem;
    color: var(--muted-foreground, #6b7280);
    margin-bottom: 0.5rem;
}

.monthly-report__summary[b-4veftgv6zm] {
    display: flex;
    flex-wrap: wrap;
    gap: 1.5rem;
    margin-bottom: 0.5rem;
}

.monthly-report__summary-item[b-4veftgv6zm] {
    display: flex;
    flex-direction: column;
}

.monthly-report__summary-label[b-4veftgv6zm] {
    font-size: 0.85rem;
    color: var(--muted-foreground, #6b7280);
}

.monthly-report__summary-value[b-4veftgv6zm] {
    font-size: 1.25rem;
    font-weight: 600;
}

.monthly-report__summary-item--total .monthly-report__summary-value[b-4veftgv6zm] {
    color: var(--kodur-navy, #0C5484);
}

.monthly-report__trend[b-4veftgv6zm] {
    font-size: 0.8rem;
    color: var(--muted-foreground, #6b7280);
}

.monthly-report__definition[b-4veftgv6zm] {
    font-size: 0.85rem;
    color: var(--muted-foreground, #6b7280);
    margin: 0.25rem 0 0.75rem;
}

.monthly-report__table[b-4veftgv6zm] {
    width: 100%;
    border-collapse: collapse;
    margin-bottom: 1.5rem;
}

.monthly-report__table th[b-4veftgv6zm],
.monthly-report__table td[b-4veftgv6zm] {
    padding: 0.4rem 0.6rem;
    border-bottom: 1px solid var(--border, #e5e7eb);
    text-align: left;
}
/* /Components/Pages/Raporty/QualificationComplianceExtractPage.razor.rz.scp.css */
/*
    T-1535 (K265, decyzje.md) — ostatnia strona z bazowego długu. Nagłówek/filtry/tabela/podpis idą
    przez wspólne klasy `kodur-page*` z `app.css` (K265). Ten plik zostaje wyłącznie dla dwóch
    układów specyficznych: etykiety filtra z podpisem NAD polem (inny kształt niż `kodur-page__label`,
    które jest myślane dla sekcji formularza w dialogu, nie luźnego filtra w toolbarze) i
    wyciszenia wiersza pracownika bez ŻADNEGO przypisania danej kwalifikacji (informacyjne, nie
    błędne — K80 pkt 3).
*/
.qualification-extract__filter[b-i6k9n1g8dw] {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    font-size: 0.875rem;
}

.qualification-extract__row--no-assignment[b-i6k9n1g8dw] {
    color: var(--kodur-text-muted, #6b7280);
}
/* /Components/Pages/Raporty/RaportyIndexPage.razor.rz.scp.css */
.raporty-index__opis[b-9n9eaz9b81] {
    color: var(--muted-foreground, #6b7280);
    margin-bottom: 1.5rem;
}

.raporty-index__grid[b-9n9eaz9b81] {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 1rem;
}
/* /Components/Pages/Tv/TvKiosk.razor.rz.scp.css */
/*
    Bazowy font-size dostarcza .kodur-tv-scope (KioskLayout.razor, patrz wwwroot/brand/tokens.css)
    — tu tylko uklad i skalowanie WEWNETRZNE tablicy: duze liczby, mocny kontrast, zero drobnego
    tekstu (wymog wlasciciela produktu, K133 w decyzje.md). T-1494 — jasny/ciemny motyw NIE jest juz
    wymuszany przez .kodur-tv-scope samo w sobie: kiosk dostal wlasny BbDarkModeToggle (KioskLayout.razor)
    i respektuje ten sam wybor .dark na <html>, co reszta aplikacji (K88).

    T-1496 — dwie zmiany naprawiajace "ekran nie jest wykorzystany w 100%":
    1) .kodur-tv-scope dostal font-size jako clamp() liczony z vh (tokens.css), nie sztywne 22px —
       ten SAM uklad ma jechac i na 32", i na 65" (wymog wlasciciela produktu), a niemal cala
       typografia tutaj jest w rem, wiec jedna zmiana bazy skaluje wszystko konsekwentnie.
    2) .tv-board i .tv-board__grid licza wysokosc przez flex:1 (flex-grow), NIE height:100% —
       zrzut properties pokazywal tresc na ~40% wysokosci i pusty granat nizej, czyli lancuch
       procentowych wysokosci od .kodur-kiosk w dol (KioskLayout.razor.css) gdzies sie urywal.
       Listy w panelach (.tv-board__*-list) dostaly flex:1 z tego samego powodu — zeby realnie
       ZAJMOWAC odzyskana wysokosc TRESCIA (wiecej widocznych wierszy), a nie zostawiac ja pusta
       pod krotka lista z overflow-y:auto, ktory nigdy nie mial czym przewijac.
*/

.tv-board[b-8x9u8ee2xq] {
    display: flex;
    flex-direction: column;
    gap: 1.25rem;
    flex: 1;
    min-height: 0;
    width: 100%;
}

.tv-board--centered[b-8x9u8ee2xq] {
    align-items: center;
    justify-content: center;
    min-height: 60vh;
}

/* Wskaznik stanu polaczenia — WYMOG NR 1 tego ekranu (K133): musi byc widoczny z odleglosci,
   nie maly tekst w rogu. Kolor wprost z tokenow statusow (juz dostrojonych do kontrastu na tym
   ciemnym tle przez wariant .kodur-tv-scope w tokens.css). */
.tv-board__banner[b-8x9u8ee2xq] {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.75rem 1.25rem;
    border-radius: 0.5rem;
    font-size: 1.375rem;
    font-weight: 600;
}

.tv-board__banner--ok[b-8x9u8ee2xq] {
    background: color-mix(in srgb, var(--kodur-status-zamkniete-fill) 20%, transparent);
    color: var(--kodur-status-zamkniete-fill);
}

.tv-board__banner--warn[b-8x9u8ee2xq] {
    background: color-mix(in srgb, var(--kodur-status-przekroczony-termin-fill) 22%, transparent);
    color: var(--kodur-status-przekroczony-termin-fill);
}

.tv-board__banner--danger[b-8x9u8ee2xq] {
    background: color-mix(in srgb, var(--kodur-status-awaria-fill) 25%, transparent);
    color: var(--kodur-status-awaria-fill);
    animation: tv-board-banner-pulse-b-8x9u8ee2xq 1.5s ease-in-out infinite;
}

@keyframes tv-board-banner-pulse-b-8x9u8ee2xq {
    0%, 100% { opacity: 1; }
    50% { opacity: 0.55; }
}

.tv-board__banner-dot[b-8x9u8ee2xq] {
    width: 0.875rem;
    height: 0.875rem;
    border-radius: 999px;
    background: currentColor;
    flex-shrink: 0;
}

.tv-board__grid[b-8x9u8ee2xq] {
    display: grid;
    grid-template-columns: 1.3fr 1fr;
    grid-template-rows: 1fr 1fr;
    gap: 1.25rem;
    flex: 1;
    min-height: 0;
}

.tv-board__panel[b-8x9u8ee2xq] {
    background: var(--kodur-bg-elevated);
    border: 1px solid var(--kodur-border);
    border-radius: 0.75rem;
    padding: 1.25rem;
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    overflow: hidden;
}

.tv-board__panel h2[b-8x9u8ee2xq] {
    font-size: 1.25rem;
    font-weight: 700;
    margin: 0;
    color: var(--kodur-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.03em;
}

.tv-board__ok[b-8x9u8ee2xq] {
    font-size: 1.5rem;
    color: var(--kodur-status-zamkniete-fill);
    margin: auto 0;
}

/* --- ANDON --- */
.tv-board__andon-list[b-8x9u8ee2xq] {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    flex: 1;
    min-height: 0;
    overflow-y: auto;
}

.tv-board__andon-item[b-8x9u8ee2xq] {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: 1rem;
    padding: 0.625rem 0.875rem;
    border-radius: 0.5rem;
    font-size: 1.5rem;
    font-weight: 600;
}

.tv-board__andon-item--aktywne[b-8x9u8ee2xq] {
    background: color-mix(in srgb, var(--kodur-status-awaria-fill) 22%, transparent);
    color: var(--kodur-status-awaria-fill);
}

.tv-board__andon-item--przyjete[b-8x9u8ee2xq] {
    background: color-mix(in srgb, var(--kodur-status-oczekiwanie-na-czesci-fill) 20%, transparent);
    color: var(--kodur-status-oczekiwanie-na-czesci-fill);
}

.tv-board__andon-since[b-8x9u8ee2xq] {
    font-size: 1.125rem;
    font-weight: 400;
    opacity: 0.85;
    white-space: nowrap;
}

/* --- Statusy: liczniki + wykres --- */
.tv-board__counters[b-8x9u8ee2xq] {
    display: flex;
    gap: 1.5rem;
}

.tv-board__counter[b-8x9u8ee2xq] {
    display: flex;
    flex-direction: column;
    align-items: center;
    flex: 1;
}

.tv-board__counter-value[b-8x9u8ee2xq] {
    font-size: 4rem;
    font-weight: 800;
    line-height: 1;
    color: var(--kodur-text);
}

.tv-board__counter-label[b-8x9u8ee2xq] {
    font-size: 1.125rem;
    color: var(--kodur-text-muted);
    text-transform: uppercase;
    letter-spacing: 0.03em;
}

/* --- Ostatnie zgloszenia --- */
.tv-board__recent-list[b-8x9u8ee2xq] {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    flex: 1;
    min-height: 0;
    overflow-y: auto;
}

.tv-board__recent-list li[b-8x9u8ee2xq] {
    display: flex;
    gap: 0.75rem;
    font-size: 1.25rem;
}

.tv-board__recent-number[b-8x9u8ee2xq] {
    font-weight: 700;
    color: var(--kodur-text-muted);
    white-space: nowrap;
}

/* --- Maszyny --- */
.tv-board__machine-list[b-8x9u8ee2xq] {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    flex: 1;
    min-height: 0;
    overflow-y: auto;
}

.tv-board__machine-list li[b-8x9u8ee2xq] {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    font-size: 1.5rem;
    font-weight: 600;
    padding: 0.375rem 0;
    border-bottom: 1px solid var(--kodur-border);
}

.tv-board__machine-count[b-8x9u8ee2xq] {
    font-size: 1.75rem;
    font-weight: 800;
    color: var(--kodur-status-awaria-fill);
}

@media (max-width: 1280px) {
    .tv-board__grid[b-8x9u8ee2xq] {
        grid-template-columns: 1fr;
        grid-template-rows: repeat(4, minmax(12rem, 1fr));
    }
}
/* /Components/Pages/Tv/TvScreensPage.razor.rz.scp.css */
.tv-registry__header[b-mjjod4809d] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 1rem;
}

.tv-registry__toolbar[b-mjjod4809d] {
    display: flex;
    gap: 0.5rem;
}

.tv-registry__table[b-mjjod4809d] {
    width: 100%;
    border-collapse: collapse;
}

.tv-registry__table th[b-mjjod4809d],
.tv-registry__table td[b-mjjod4809d] {
    text-align: left;
    padding: 0.5rem 0.75rem;
    border-bottom: 1px solid var(--kodur-border);
}

.tv-registry__actions[b-mjjod4809d] {
    display: flex;
    gap: 0.5rem;
    justify-content: flex-end;
}

.tv-registry__section[b-mjjod4809d] {
    display: flex;
    flex-direction: column;
    gap: 0.375rem;
    margin-bottom: 1rem;
}

.tv-registry__hint[b-mjjod4809d] {
    font-size: 0.8125rem;
    color: var(--kodur-text-muted);
}

.tv-registry__pairing-banner[b-mjjod4809d] {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.75rem 1rem;
    margin-bottom: 1rem;
    border-radius: 0.5rem;
    border: 1px solid var(--kodur-status-realizacja-fill);
    background: color-mix(in srgb, var(--kodur-status-realizacja-fill) 12%, transparent);
    flex-wrap: wrap;
}

.tv-registry__pairing-text[b-mjjod4809d] {
    display: flex;
    flex-direction: column;
    gap: 0.125rem;
    min-width: 14rem;
}

.tv-registry__pairing-input[b-mjjod4809d] {
    flex: 1;
    min-width: 16rem;
    padding: 0.375rem 0.5rem;
    border-radius: 0.375rem;
    border: 1px solid var(--kodur-border);
    background: var(--kodur-bg);
    color: var(--kodur-text);
    font-family: monospace;
    font-size: 0.8125rem;
}

.tv-registry__skeleton[b-mjjod4809d] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}
/* /Components/Pages/Urzadzenia/AssetTreeView.razor.rz.scp.css */
.asset-tree[b-y6ql0xmmio] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    height: 100%;
    min-height: 0;
}

[b-y6ql0xmmio] .asset-tree__search {
    width: 100%;
}

.asset-tree__skeleton[b-y6ql0xmmio] {
    margin-bottom: 0.375rem;
}

.asset-tree__error[b-y6ql0xmmio] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    color: var(--kodur-status-awaria-fill);
    font-size: 0.875rem;
}

.asset-tree__view[b-y6ql0xmmio] {
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
}

.asset-tree__search-results[b-y6ql0xmmio] {
    list-style: none;
    margin: 0;
    padding: 0;
    overflow-y: auto;
}

.asset-tree__search-item[b-y6ql0xmmio] {
    display: flex;
    align-items: baseline;
    gap: 0.5rem;
    width: 100%;
    padding: 0.375rem 0.5rem;
    border: none;
    background: none;
    text-align: left;
    cursor: pointer;
    border-radius: 0.375rem;
}

.asset-tree__search-item:hover[b-y6ql0xmmio] {
    background: var(--kodur-bg-hover, rgb(0 0 0 / 0.04));
}

.asset-tree__search-name[b-y6ql0xmmio] {
    font-weight: 500;
}

.asset-tree__search-path[b-y6ql0xmmio] {
    color: var(--kodur-text-muted);
    font-size: 0.8125rem;
}

.asset-tree__shortcuts[b-y6ql0xmmio] {
    display: flex;
    flex-direction: column;
    gap: 0.375rem;
    padding-bottom: 0.5rem;
    border-bottom: 1px solid var(--kodur-border);
}

.asset-tree__shortcuts-group[b-y6ql0xmmio] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.375rem;
}

.asset-tree__shortcuts-label[b-y6ql0xmmio] {
    font-size: 0.75rem;
    color: var(--kodur-text-muted);
    margin-right: 0.25rem;
}

.asset-tree__chip[b-y6ql0xmmio] {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    padding: 0.125rem 0.5rem;
    border: 1px solid var(--kodur-border);
    border-radius: 999px;
    background: var(--kodur-bg-elevated);
    font-size: 0.8125rem;
    cursor: pointer;
}

@media (max-width: 767px) {
    .asset-tree__shortcuts-group[b-y6ql0xmmio] {
        overflow-x: auto;
        flex-wrap: nowrap;
    }
}
/* /Components/Pages/Urzadzenia/AttachmentsPanel.razor.rz.scp.css */
.attachments-panel[b-rzu1l6ch2p] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}

.attachments-panel__toolbar[b-rzu1l6ch2p] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
}

.attachments-panel__grid[b-rzu1l6ch2p] {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    gap: 0.75rem;
}

.attachments-panel__item[b-rzu1l6ch2p] {
    position: relative;
}

.attachments-panel__preview-image[b-rzu1l6ch2p] {
    max-width: 100%;
    max-height: 60vh;
    object-fit: contain;
}

.attachments-panel__preview-pdf[b-rzu1l6ch2p] {
    width: 100%;
    height: 60vh;
    border: 1px solid var(--kodur-border);
}

/* T-1466 (K112 pkt 7) — dopasowana do KodUrFormDialog Size="Fullscreen" (h-[90vh]); 90vh z odjętą
   wysokością nagłówka/etykiety dokumentacji publicznej dialogu, żeby rysunek zajął realnie cały
   dostępny ekran, nie tylko szerokość. */
.attachments-panel__preview-pdf--fullscreen[b-rzu1l6ch2p] {
    height: calc(90vh - 9rem);
}

.attachments-panel__check[b-rzu1l6ch2p] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-top: 0.5rem;
}

@media (min-width: 768px) {
    .attachments-panel__grid[b-rzu1l6ch2p] {
        grid-template-columns: repeat(3, 1fr);
    }
}

@media (min-width: 1280px) {
    .attachments-panel__grid[b-rzu1l6ch2p] {
        grid-template-columns: repeat(4, 1fr);
    }
}
/* /Components/Pages/Urzadzenia/CheckInOutTab.razor.rz.scp.css */
.checkinout-tab__status[b-woqlg54l8t] {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    margin-bottom: 0.75rem;
}

.checkinout-tab__actions[b-woqlg54l8t] {
    display: flex;
    gap: 0.5rem;
    margin-bottom: 1rem;
}

.checkinout-tab__table[b-woqlg54l8t] {
    width: 100%;
    border-collapse: collapse;
}

.checkinout-tab__table td[b-woqlg54l8t] {
    padding: 0.4rem 0.6rem;
    border-bottom: 1px solid var(--border, #e5e7eb);
}
/* /Components/Pages/Urzadzenia/CzesciTab.razor.rz.scp.css */
.czesci-tab__toolbar[b-pg0cvauded] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 0.75rem;
}

.czesci-tab__switch[b-pg0cvauded] {
    display: flex;
    align-items: center;
    gap: 0.4rem;
}

.czesci-tab__table[b-pg0cvauded] {
    width: 100%;
    border-collapse: collapse;
}

.czesci-tab__table td[b-pg0cvauded] {
    padding: 0.4rem 0.6rem;
    border-bottom: 1px solid var(--border, #e5e7eb);
    vertical-align: middle;
}

.czesci-tab__code[b-pg0cvauded] {
    font-size: 0.85rem;
    color: var(--muted-foreground, #6b7280);
}

.czesci-tab__node[b-pg0cvauded] {
    font-size: 0.85rem;
    color: var(--muted-foreground, #6b7280);
}

.czesci-tab__dialog-field[b-pg0cvauded] {
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    margin-bottom: 0.75rem;
}

.czesci-tab__dialog-label[b-pg0cvauded] {
    font-size: 0.85rem;
    font-weight: 500;
}

.czesci-tab__matches[b-pg0cvauded] {
    list-style: none;
    margin: 0 0 0.75rem;
    padding: 0;
    max-height: 12rem;
    overflow-y: auto;
    border: 1px solid var(--border, #e5e7eb);
    border-radius: 0.375rem;
}

.czesci-tab__match[b-pg0cvauded] {
    display: block;
    width: 100%;
    text-align: left;
    padding: 0.4rem 0.6rem;
    background: none;
    border: none;
    cursor: pointer;
}

.czesci-tab__match:hover[b-pg0cvauded] {
    background: var(--muted, #f3f4f6);
}

.czesci-tab__match-code[b-pg0cvauded] {
    color: var(--muted-foreground, #6b7280);
    margin-left: 0.3rem;
}

.czesci-tab__selected[b-pg0cvauded] {
    margin-bottom: 0.75rem;
}
/* /Components/Pages/Urzadzenia/DaneTab.razor.rz.scp.css */
.dane-tab__grid[b-pislzwcgz7] {
    display: grid;
    grid-template-columns: max-content 1fr;
    gap: 0.35rem 1rem;
    margin-bottom: 1rem;
}

.dane-tab__grid dt[b-pislzwcgz7] {
    color: var(--muted-foreground, #6b7280);
    font-weight: 500;
}

.dane-tab__inherited[b-pislzwcgz7] {
    margin-left: 0.35rem;
    font-size: 0.8rem;
    color: var(--muted-foreground, #6b7280);
}

.dane-tab__check[b-pislzwcgz7] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 0.5rem;
}
/* /Components/Pages/Urzadzenia/EquipmentDetailPage.razor.rz.scp.css */
.equipment-detail[b-4ef15xtgwc] {
    display: flex;
    flex-direction: column;
    gap: 1rem;
    height: 100%;
}

.equipment-detail__header h1[b-4ef15xtgwc] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin: 0.25rem 0 0;
}

.equipment-detail__favorite[b-4ef15xtgwc] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: none;
    background: none;
    cursor: pointer;
    color: var(--kodur-text-muted);
    padding: 0.125rem;
}

.equipment-detail__favorite:hover[b-4ef15xtgwc] {
    color: var(--kodur-status-oczekuje-fill, #d97706);
}

.equipment-detail__skeleton[b-4ef15xtgwc] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}

/* Uklad tabletowy 3-strefowy (docs/design/urzadzenia.md §6.3, PLAN.md §7.2) — od 600px.
   Oba warianty (tablet/telefon) sa renderowane jednoczesnie, przelaczane WYLACZNIE przez CSS
   (wzorzec z KodUrTreePicker, design-system.md §6 pkt 3) — nie ma JS do wykrywania breakpointu
   po stronie Blazor Server. */
.equipment-detail__tablet[b-4ef15xtgwc] {
    display: none;
}

.equipment-detail__phone[b-4ef15xtgwc] {
    display: block;
}

.equipment-detail__resizable[b-4ef15xtgwc] {
    min-height: 32rem;
    height: calc(100vh - 14rem);
    border: 1px solid var(--kodur-border);
    border-radius: 0.5rem;
}

.equipment-detail__zone[b-4ef15xtgwc] {
    height: 100%;
    overflow-y: auto;
    padding: 0.75rem;
}

.equipment-detail__zone--docs h2[b-4ef15xtgwc] {
    margin-top: 0;
}

@media (min-width: 600px) {
    .equipment-detail__tablet[b-4ef15xtgwc] {
        display: block;
    }

    .equipment-detail__phone[b-4ef15xtgwc] {
        display: none;
    }
}
/* /Components/Pages/Urzadzenia/EquipmentListPage.razor.rz.scp.css */
.equipment-list__header[b-zk2pr7cve0] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 1rem;
}

.equipment-list__tree[b-zk2pr7cve0] {
    max-width: 480px;
}
/* /Components/Pages/Urzadzenia/HistoriaTab.razor.rz.scp.css */
.historia-tab__filters[b-vdpsl6767u] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 1rem;
    margin-bottom: 0.75rem;
}

.historia-tab__filter[b-vdpsl6767u] {
    display: flex;
    align-items: center;
    gap: 0.4rem;
}

.historia-tab__summary[b-vdpsl6767u] {
    display: flex;
    flex-wrap: wrap;
    gap: 1.5rem;
    margin-bottom: 0.5rem;
}

.historia-tab__summary-item[b-vdpsl6767u] {
    display: flex;
    flex-direction: column;
}

.historia-tab__summary-label[b-vdpsl6767u] {
    font-size: 0.85rem;
    color: var(--muted-foreground, #6b7280);
}

.historia-tab__summary-value[b-vdpsl6767u] {
    font-size: 1.25rem;
    font-weight: 600;
}

.historia-tab__summary-item--total .historia-tab__summary-value[b-vdpsl6767u] {
    color: var(--kodur-navy, #0C5484);
}

.historia-tab__table[b-vdpsl6767u] {
    width: 100%;
    border-collapse: collapse;
}

.historia-tab__table td[b-vdpsl6767u] {
    padding: 0.4rem 0.6rem;
    border-bottom: 1px solid var(--border, #e5e7eb);
}
/* /Components/Pages/Urzadzenia/HygienePanel.razor.rz.scp.css */
.hygiene-panel[b-7d1qhu54jv] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}

.hygiene-panel__requirement label[b-7d1qhu54jv] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    font-weight: 500;
}

.hygiene-panel__status[b-7d1qhu54jv] {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}

.hygiene-panel__gate-hint[b-7d1qhu54jv] {
    color: var(--kodur-status-awaria-fill, #b91c1c);
    font-size: 0.875rem;
    font-weight: 500;
}

.hygiene-panel__four-eyes[b-7d1qhu54jv] {
    font-size: 0.875rem;
    color: var(--kodur-text-muted);
}

.hygiene-panel__actions[b-7d1qhu54jv] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
}

.hygiene-panel__history h3[b-7d1qhu54jv] {
    margin-bottom: 0.375rem;
}

.hygiene-panel__table[b-7d1qhu54jv] {
    width: 100%;
    border-collapse: collapse;
    font-size: 0.875rem;
}

.hygiene-panel__table td[b-7d1qhu54jv] {
    padding: 0.375rem 0.5rem;
    border-bottom: 1px solid var(--kodur-border);
    vertical-align: top;
}

.hygiene-panel__hint[b-7d1qhu54jv] {
    font-size: 0.875rem;
    color: var(--kodur-text-muted);
    margin-bottom: 0.5rem;
}
/* /Components/Pages/Urzadzenia/LocationDetailPage.razor.rz.scp.css */
.equipment-detail[b-v8xxxtebsh] {
    display: flex;
    flex-direction: column;
    gap: 1rem;
    height: 100%;
}

.equipment-detail__header h1[b-v8xxxtebsh] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin: 0.25rem 0 0;
}

.equipment-detail__favorite[b-v8xxxtebsh] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: none;
    background: none;
    cursor: pointer;
    color: var(--kodur-text-muted);
    padding: 0.125rem;
}

.equipment-detail__favorite:hover[b-v8xxxtebsh] {
    color: var(--kodur-status-oczekuje-fill, #d97706);
}

.equipment-detail__skeleton[b-v8xxxtebsh] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
}

/* Uklad tabletowy 3-strefowy (docs/design/urzadzenia.md §6.3, PLAN.md §7.2) — od 600px. Identyczny
   wzorzec CSS co EquipmentDetailPage.razor.css — izolacja stylów Blazor nie pozwala reuzyc jednego
   pliku scoped CSS w dwoch komponentach. */
.equipment-detail__tablet[b-v8xxxtebsh] {
    display: none;
}

.equipment-detail__phone[b-v8xxxtebsh] {
    display: block;
}

.equipment-detail__resizable[b-v8xxxtebsh] {
    min-height: 32rem;
    height: calc(100vh - 14rem);
    border: 1px solid var(--kodur-border);
    border-radius: 0.5rem;
}

.equipment-detail__zone[b-v8xxxtebsh] {
    height: 100%;
    overflow-y: auto;
    padding: 0.75rem;
}

.equipment-detail__zone--docs h2[b-v8xxxtebsh] {
    margin-top: 0;
}

@media (min-width: 600px) {
    .equipment-detail__tablet[b-v8xxxtebsh] {
        display: block;
    }

    .equipment-detail__phone[b-v8xxxtebsh] {
        display: none;
    }
}
/* /Components/Pages/Urzadzenia/LocationListPage.razor.rz.scp.css */
.equipment-list__header[b-ket8ntc58t] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 1rem;
}

.equipment-list__tree[b-ket8ntc58t] {
    max-width: 480px;
}
/* /Components/Pages/Urzadzenia/PodzespolyTab.razor.rz.scp.css */
.podzespoly-tab__list[b-5316v6qbpc] {
    list-style: none;
    padding: 0;
    margin: 1rem 0 0;
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}

.podzespoly-tab__item[b-5316v6qbpc] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.5rem;
    border: 1px solid transparent;
    border-radius: 0.375rem;
    background: none;
    text-align: left;
    cursor: pointer;
    width: 100%;
}

.podzespoly-tab__item:hover[b-5316v6qbpc] {
    background: var(--muted, #f4f4f5);
}
/* /Components/Pages/Urzadzenia/PunktyPomiaroweTab.razor.rz.scp.css */
.punkty-tab__point[b-4kde70dduy] {
    border: 1px solid var(--border, #e5e7eb);
    border-radius: 0.5rem;
    padding: 0.75rem;
    margin-bottom: 0.75rem;
}

.punkty-tab__point-header[b-4kde70dduy] {
    display: flex;
    justify-content: space-between;
    margin-bottom: 0.5rem;
}

.punkty-tab__point-actions[b-4kde70dduy] {
    display: flex;
    gap: 0.5rem;
    flex-wrap: wrap;
}

.punkty-tab__table[b-4kde70dduy] {
    width: 100%;
    margin-top: 0.5rem;
    font-size: 0.875rem;
}

.punkty-tab__hint[b-4kde70dduy] {
    color: var(--muted-foreground, #6b7280);
    margin-bottom: 0.5rem;
}
/* /Components/Pages/Ustawienia/CreateWorkTeamDialog.razor.rz.scp.css */
.zespoly-form__section[b-smd48fv92v] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    margin-top: 0.75rem;
}

.zespoly-form__label[b-smd48fv92v] {
    font-weight: 600;
    font-size: 0.875rem;
}

.zespoly-form__hint[b-smd48fv92v] {
    font-size: 0.8125rem;
    color: var(--muted-foreground, #64748b);
    margin: 0;
}
/* /Components/Pages/Ustawienia/ManageWorkTeamMembersDialog.razor.rz.scp.css */
.zespoly-members__list[b-x285bek7ex] {
    list-style: none;
    margin: 0 0 0.75rem 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.zespoly-members__list li[b-x285bek7ex] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
}
/* /Components/Pages/Ustawienia/Slowniki/DictionaryItemFlagsDialog.razor.rz.scp.css */
.slowniki-flags__subject[b-lzkqnetpz9] {
    font-weight: 600;
    margin: 0 0 0.5rem;
}

.slowniki-flags__row[b-lzkqnetpz9] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-top: 0.75rem;
}

.slowniki-flags__hint[b-lzkqnetpz9] {
    font-size: 0.8125rem;
    color: var(--muted-foreground, #64748b);
    margin: 0.125rem 0 0;
}
/* /Components/Pages/Ustawienia/Slowniki/DictionaryItemFormDialog.razor.rz.scp.css */
.slowniki-form__section[b-76f61ih0hs] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
    margin-top: 0.75rem;
}

.slowniki-form__label[b-76f61ih0hs] {
    font-weight: 600;
    font-size: 0.875rem;
}
/* /Components/Pages/Ustawienia/Slowniki/SlownikiPage.razor.rz.scp.css */
.slowniki-page__color-dot[b-trmtvtint0] {
    display: inline-block;
    width: 0.75rem;
    height: 0.75rem;
    border-radius: 999px;
    margin-right: 0.375rem;
    vertical-align: middle;
    border: 1px solid rgba(0, 0, 0, 0.15);
}

.slowniki-page[b-trmtvtint0] {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.slowniki-page__header[b-trmtvtint0] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    flex-wrap: wrap;
}

.slowniki-page__toolbar[b-trmtvtint0] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.slowniki-page__drag-disabled-hint[b-trmtvtint0] {
    color: var(--kodur-text-muted, #6b7280);
    font-size: 0.8125rem;
    margin: 0;
}

.slowniki-page__skeleton[b-trmtvtint0] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

/* T-1498 (K256) — wiersz przeciąganej listy: uchwyt po lewej (jedyny obszar, który faktycznie
   inicjuje przeciąganie, patrz Handle=".slowniki-page__drag-handle" na BbSortable), reszta wiersza
   pozostaje zwykłym obszarem przewijania na tablecie. */
.slowniki-page__row[b-trmtvtint0] {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    padding: 0.625rem 0.75rem;
    border: 1px solid var(--kodur-border, #e5e7eb);
    border-radius: 0.5rem;
    background: var(--kodur-surface, #fff);
}

.slowniki-page__drag-handle[b-trmtvtint0] {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: var(--kodur-text-muted, #6b7280);
    cursor: grab;
    /* Obszar dotykowy min. 44px (wytyczna tabletowa hali) — sam glif ikony jest mniejszy. */
    width: 2.75rem;
    height: 2.75rem;
    flex-shrink: 0;
}

.slowniki-page__name[b-trmtvtint0] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex: 1 1 auto;
    min-width: 0;
}

.slowniki-page__extra[b-trmtvtint0] {
    display: flex;
    align-items: center;
    gap: 0.375rem;
    flex-shrink: 0;
}

.slowniki-page__status[b-trmtvtint0] {
    flex-shrink: 0;
    color: var(--kodur-text-muted, #6b7280);
    font-size: 0.875rem;
}

.slowniki-page__actions[b-trmtvtint0] {
    display: flex;
    align-items: center;
    gap: 0.375rem;
    flex-shrink: 0;
}
/* /Components/Pages/Ustawienia/Tlumaczenia/TlumaczeniaPage.razor.rz.scp.css */
/*
    T-1535 (K265, decyzje.md) — strona przy wejściu na listę bazowego długu wyglądała na
    "wystarczająco Tailwind" (space-y-*, flex, gap, rounded-md, border, p-3, text-sm, text-xs —
    wszystkie REALNE, sprawdzone grepem w spakietowanym `blazorblueprint.css`), więc na pierwszy rzut
    oka ten sam przypadek co `Auth/MojProfilPage` (K265 — nie migrowana, bo już działa). Sprawdzone
    DOKŁADNIEJ: DWIE klasy użyte w tym pliku są MARTWE w spakietowanym CSS — dokładnie pułapka
    [[K169]]/[[K170]] ("max-w-6xl" nieistniejące w paczce), `w-48` i `min-w-60`.

    **Korekta (ta sama tura, K283+).** Trzecia klasa uznana wcześniej za martwą,
    `text-muted-foreground`, BYŁA fałszywym trafieniem — pierwszy grep (`\.text-muted-foreground\{`)
    zakładał, że reguła zaczyna się bezpośrednio od `{`, ale minifikator Tailwind grupuje ją w
    liście selektorów po przecinku (`.text-muted-foreground,.text-muted-foreground\/30{color:...}`),
    więc ścisły wzorzec dawał fałszywy negatyw. Poprawiony grep (`[.,]text-muted-foreground[{,\/]`)
    potwierdza: klasa jest REALNA, zawsze była. Cofnięte: `text-muted-foreground` w `.razor` wróciło
    do oryginału, `.tlumaczenia-page__muted` (niepotrzebna) usunięta stąd. Wniosek metodyczny: przy
    weryfikacji obecności klasy w zminifikowanym, spakietowanym CSS trzeba dopuszczać selektory
    grupowane przecinkiem, nie tylko szukać `.klasa{` wprost — inaczej wynik zależy od tego, jak
    akurat pogrupował je minifikator, nie od tego, czy klasa istnieje.

    `.tlumaczenia-page__jezyk` (zastępująca martwe `w-48`) idzie do GLOBALNEGO `app.css`, NIE tutaj
    — cel to `Class` przekazywany do `<BbSelect>` (komponent BIBLIOTEKI), więc dotyczy jej ta sama
    ostrożność co K156/K169 (niepewne, czy atrybut zasięgu CSS izolowanego faktycznie dotrze na
    element renderowany przez komponent z innego assembly) — global jest jedyną PEWNĄ opcją,
    tak jak wcześniej dla wszystkich podobnych przypadków w tym repo. Reguła niżej dotyczy
    WYŁĄCZNIE elementu HTML autorowanego bezpośrednio w tym pliku (`<div>`), gdzie scoped CSS jest
    bezpieczne bez zastrzeżeń.
*/
.tlumaczenia-page__szukaj[b-mzoqhirk74] {
    min-width: 15rem;
}
/* /Components/Pages/Zadania/AndonListPage.razor.rz.scp.css */
.andon[b-40biavvt8y] {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.andon__header[b-40biavvt8y] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 0.5rem;
}

.andon__toolbar[b-40biavvt8y] {
    display: flex;
    gap: 0.5rem;
}

.andon__table[b-40biavvt8y] {
    width: 100%;
    border-collapse: collapse;
}

.andon__table td[b-40biavvt8y] {
    padding: 0.5rem;
    border-bottom: 1px solid var(--border, #e2e8f0);
    vertical-align: top;
}

.andon__actions[b-40biavvt8y] {
    display: flex;
    gap: 0.5rem;
    flex-wrap: wrap;
}

.andon__section[b-40biavvt8y] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.andon__skeleton[b-40biavvt8y] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}
/* /Components/Pages/Zadania/NewWorkOrderForm.razor.rz.scp.css */
.wo-form[b-0jocxudad9] {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.wo-form__row[b-0jocxudad9] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    align-items: center;
}

.wo-form__row > *[b-0jocxudad9] {
    flex: 1 1 12rem;
}

.wo-form__section[b-0jocxudad9] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.wo-form__label[b-0jocxudad9] {
    font-weight: 600;
    font-size: 0.875rem;
}

.wo-form__hint[b-0jocxudad9] {
    font-size: 0.8125rem;
    color: var(--muted-foreground, #64748b);
    margin: 0;
}

.wo-form__check[b-0jocxudad9] {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
}

/* T-1531 (K170, decyzje.md) — jedyny sygnał, że pole ma błąd, dotąd był baner na górze formularza
   z JEDNYM zdaniem, bez wskazania KTÓREGO pola dotyczy (zgłoszenie właściciela produktu: "ux nie
   podpowiada które komórki ma jeszcze wypełnić czy zaznaczyć"). Owijamy każde walidowane pole w ten
   div (nie ::deep w wewnętrzny DOM BbSelect/BbCombobox/KodUrTreePicker — WŁASNY element autorowany
   bezpośrednio w NewWorkOrderForm.razor, więc pułapka nr 11 design-system.md §3 [[K156]], portal +
   CSS izolowany, tu nie ma zastosowania: nie mierzymy w treść, którą cokolwiek portaluje). Ramka
   działa identycznie dla WSZYSTKICH pól, niezależnie od tego, czy dany komponent Bb* w ogóle
   wspiera AriaInvalid/FieldIsInvalid (BbInput/BbTextarea tak, BbSelect/BbCombobox/BbMultiSelect/
   BbDateRangePicker nie — potwierdzone mcp__blazorblueprint, brak sekcji "Cascading Parameters" w
   ich dokumentacji) — jeden mechanizm zamiast dwóch różnych w zależności od typu pola.
   `--destructive` — zmienna z brand/theme-bridge.css (ten sam token, którego BbInput/BbTextarea
   używają wewnętrznie dla AriaInvalid, potwierdzone grepem, nie zgadywane). */
.wo-form__field[b-0jocxudad9] {
    border-radius: 0.5rem;
    transition: box-shadow 0.15s ease;
}

.wo-form__field--invalid[b-0jocxudad9] {
    box-shadow: 0 0 0 2px var(--destructive);
    border-radius: 0.5rem;
    padding: 0.5rem;
    margin: -0.5rem;
}

.wo-form__field-error[b-0jocxudad9] {
    color: var(--destructive);
    font-size: 0.8125rem;
    margin: 0.25rem 0 0;
}

.wo-form__validation-summary-list[b-0jocxudad9] {
    margin: 0;
    padding-left: 1.25rem;
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}

.wo-form__validation-summary-link[b-0jocxudad9] {
    background: none;
    border: none;
    padding: 0;
    margin: 0;
    font: inherit;
    color: inherit;
    text-decoration: underline;
    cursor: pointer;
    text-align: left;
}

@media (max-width: 767px) {
    .wo-form__row[b-0jocxudad9] {
        flex-direction: column;
        align-items: stretch;
    }
}
/* /Components/Pages/Zadania/PartsPickup/TaskPartsPickupPanel.razor.rz.scp.css */
.task-parts-pickup__title[b-lx2w10gdw4] {
    margin-top: 1rem;
    margin-bottom: 0.35rem;
}

.task-parts-pickup__field[b-lx2w10gdw4] {
    margin: 0.5rem 0;
}

.task-parts-pickup__label[b-lx2w10gdw4] {
    display: block;
    margin-bottom: 0.25rem;
    font-size: 0.85rem;
    color: var(--kodur-text-muted);
}

.task-parts-pickup__matches[b-lx2w10gdw4],
.task-parts-pickup__locations[b-lx2w10gdw4] {
    list-style: none;
    padding: 0;
    margin: 0.35rem 0;
    max-height: 14rem;
    overflow-y: auto;
}

.task-parts-pickup__match[b-lx2w10gdw4],
.task-parts-pickup__location[b-lx2w10gdw4] {
    background: none;
    border: none;
    width: 100%;
    text-align: left;
    color: var(--kodur-link);
    cursor: pointer;
    padding: 0.4rem 0.2rem;
}

.task-parts-pickup__location--selected[b-lx2w10gdw4] {
    background-color: var(--kodur-bg-elevated);
    border-radius: 4px;
    font-weight: 600;
}

.task-parts-pickup__match-code[b-lx2w10gdw4] {
    color: var(--kodur-text-muted);
    margin-left: 0.35rem;
}

.task-parts-pickup__selected[b-lx2w10gdw4] {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

.task-parts-pickup__hint[b-lx2w10gdw4] {
    color: var(--kodur-text-muted);
}

.task-parts-pickup__table[b-lx2w10gdw4] {
    width: 100%;
    border-collapse: collapse;
    margin-top: 0.35rem;
}

.task-parts-pickup__table td[b-lx2w10gdw4] {
    border-bottom: 1px solid var(--kodur-border);
    padding: 0.4rem;
    text-align: left;
}
/* /Components/Pages/Zadania/WorkOrderDetailPage.razor.rz.scp.css */
.wo-detail[b-rl5ay4903s] {
    display: flex;
    flex-direction: column;
    gap: 1.5rem;
}

.wo-detail__header[b-rl5ay4903s] {
    display: flex;
    align-items: center;
    gap: 1rem;
    flex-wrap: wrap;
}

.wo-detail__section[b-rl5ay4903s] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    border-top: 1px solid var(--border, #e2e8f0);
    padding-top: 1rem;
}

.wo-detail__grid[b-rl5ay4903s] {
    display: grid;
    grid-template-columns: auto 1fr;
    gap: 0.25rem 1rem;
}

.wo-detail__grid dt[b-rl5ay4903s] {
    font-weight: 600;
    color: var(--muted-foreground, #64748b);
}

.wo-detail__actions[b-rl5ay4903s],
.wo-detail__row[b-rl5ay4903s] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    align-items: center;
}

.wo-detail__checklist-item[b-rl5ay4903s] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    flex-wrap: wrap;
}

.wo-detail__comment[b-rl5ay4903s] {
    border: 1px solid var(--border, #e2e8f0);
    border-radius: 0.5rem;
    padding: 0.5rem 0.75rem;
}

.wo-detail__comment-header[b-rl5ay4903s] {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    flex-wrap: wrap;
}

.wo-detail__comment-photos[b-rl5ay4903s] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    margin-top: 0.5rem;
}

.wo-detail__attachments[b-rl5ay4903s] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.75rem;
}

.wo-detail__attachment[b-rl5ay4903s] {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.25rem;
    width: 6rem;
    font-size: 0.8125rem;
    text-align: center;
    overflow-wrap: anywhere;
    background: none;
    border: none;
    padding: 0;
    font-family: inherit;
    color: inherit;
    cursor: pointer;
}

.wo-detail__comment-photo[b-rl5ay4903s] {
    display: inline-flex;
    background: none;
    border: none;
    padding: 0;
    line-height: 0;
    cursor: pointer;
}

.wo-detail__field-label[b-rl5ay4903s] {
    font-size: 0.85rem;
    color: var(--muted-foreground, #6b7280);
}

.wo-detail__table[b-rl5ay4903s] {
    width: 100%;
    border-collapse: collapse;
}

.wo-detail__table td[b-rl5ay4903s] {
    padding: 0.25rem 0.5rem;
    border-bottom: 1px solid var(--border, #e2e8f0);
}

.wo-detail__hint[b-rl5ay4903s] {
    font-size: 0.8125rem;
    color: var(--muted-foreground, #64748b);
}

.wo-detail__skeleton[b-rl5ay4903s] {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

@media (max-width: 767px) {
    .wo-detail__grid[b-rl5ay4903s] {
        grid-template-columns: 1fr;
    }
}

/* T-1477, K122 w decyzje.md §6 — lista podpowiedzi po "@", NAD kursorem (translateY -100%). */
.wo-detail__mention-field[b-rl5ay4903s] {
    position: relative;
}

.wo-detail__mention-popup[b-rl5ay4903s] {
    position: fixed;
    z-index: 40;
    min-width: 14rem;
    max-width: 20rem;
    max-height: 12rem;
    overflow-y: auto;
    background: var(--popover, #fff);
    color: var(--popover-foreground, #0f172a);
    border: 1px solid var(--border, #e2e8f0);
    border-radius: 0.5rem;
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.16);
    padding: 0.25rem;
    transform: translateY(calc(-100% - 0.5rem));
}

.wo-detail__mention-option[b-rl5ay4903s] {
    display: block;
    width: 100%;
    text-align: left;
    padding: 0.4rem 0.6rem;
    border: none;
    background: none;
    border-radius: 0.375rem;
    font: inherit;
    color: inherit;
    cursor: pointer;
}

.wo-detail__mention-option--active[b-rl5ay4903s],
.wo-detail__mention-option:hover[b-rl5ay4903s] {
    background: var(--accent, #f1f5f9);
}

.wo-detail__mention-empty[b-rl5ay4903s] {
    padding: 0.4rem 0.6rem;
    color: var(--muted-foreground, #64748b);
    font-size: 0.85rem;
}

.wo-detail__comment-mentions[b-rl5ay4903s] {
    display: flex;
    flex-wrap: wrap;
    gap: 0.35rem;
    margin-top: 0.35rem;
}

.wo-detail__mention-badge[b-rl5ay4903s] {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    padding: 0.1rem 0.5rem;
    border-radius: 999px;
    background: var(--accent, #f1f5f9);
    color: var(--accent-foreground, #0C5484);
    font-size: 0.8125rem;
    font-weight: 500;
}

.wo-detail__comment--highlighted[b-rl5ay4903s] {
    animation: wo-detail-comment-highlight-b-rl5ay4903s 2.4s ease-out 1;
}

@keyframes wo-detail-comment-highlight-b-rl5ay4903s {
    0% { background: color-mix(in srgb, var(--accent, #f1f5f9) 70%, transparent); }
    100% { background: transparent; }
}
/* /Components/Pages/Zadania/WorkOrderListPage.razor.rz.scp.css */
.wo-filters[b-vo9whh5ypr] {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    width: 100%;
}

.wo-filters__primary[b-vo9whh5ypr],
.wo-filters__more[b-vo9whh5ypr] {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.5rem;
}

.wo-filters__more[b-vo9whh5ypr] {
    border-top: 1px solid var(--border, #e2e8f0);
    padding-top: 0.75rem;
}

.wo-filters__check[b-vo9whh5ypr] {
    display: inline-flex;
    align-items: center;
    gap: 0.375rem;
    font-size: 0.875rem;
    white-space: nowrap;
}

@media (max-width: 767px) {
    .wo-filters__primary[b-vo9whh5ypr],
    .wo-filters__more[b-vo9whh5ypr] {
        flex-direction: column;
        align-items: stretch;
    }
}
/* /Components/Pages/Zapotrzebowania/PartRequestDetailPage.razor.rz.scp.css */
/*
    T-1535 (K265, decyzje.md) — druga migracja z bazowego długu: strona nie miała ŻADNEGO pliku
    CSS, jak `Przestoje/PrzestojeListPage` (migracja #1) i `Zapotrzebowania/PartRequestListPage`
    (K264). Nagłówek/akcje/sekcje dialogu idą przez wspólne klasy `kodur-page*` z `app.css`
    (K265) — WPROST w markupie, nie kopiowane tu po raz kolejny. Ten plik zostaje WYŁĄCZNIE dla
    dwóch układów naprawdę specyficznych dla tej strony, bez odpowiednika we wspólnym mechanizmie:
    lista par etykieta-wartość (`__fields`, wzorem `.wo-detail__grid` z `WorkOrderDetailPage.razor.css`,
    ale dopasowana do ISTNIEJĄCEGO markupu `<div><span>/<strong>`, nie `<dl>`) i wybieralna lista
    miejsc wydania (`__places__place`, wzorem `.zapotrzebowania__part-result` z K264, plus wariant
    zaznaczenia).
*/
.zapotrzebowanie-detail[b-m6ohkpr3r7] {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.zapotrzebowanie-detail__fields[b-m6ohkpr3r7] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.zapotrzebowanie-detail__fields > div[b-m6ohkpr3r7] {
    display: flex;
    gap: 0.5rem;
}

.zapotrzebowanie-detail__fields > div > span[b-m6ohkpr3r7] {
    min-width: 8rem;
    color: var(--kodur-text-muted, #6b7280);
}

.zapotrzebowanie-detail__places[b-m6ohkpr3r7] {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    max-height: 12rem;
    overflow-y: auto;
}

.zapotrzebowanie-detail__place[b-m6ohkpr3r7] {
    display: block;
    width: 100%;
    text-align: left;
    padding: 0.375rem 0.5rem;
    border: 1px solid transparent;
    border-radius: 0.375rem;
    background: none;
    cursor: pointer;
    font: inherit;
    color: inherit;
}

.zapotrzebowanie-detail__place:hover[b-m6ohkpr3r7] {
    background: var(--kodur-surface-hover, rgba(0, 0, 0, 0.04));
}

.zapotrzebowanie-detail__place--selected[b-m6ohkpr3r7] {
    border-color: var(--kodur-primary);
    background: var(--kodur-surface-hover, rgba(0, 0, 0, 0.04));
}
/* /Components/Pages/Zapotrzebowania/PartRequestListPage.razor.rz.scp.css */
/*
    T-1535 (K264, decyzje.md) — zgłoszenie właściciela produktu o oknie "Nowe zapotrzebowanie":
    "układ wygląda jakby nie miał CSS-a". Zmierzone: prawdziwa przyczyna, nie zgadywana — ten plik
    W OGÓLE NIE ISTNIAŁ, więc żadna z ośmiu literalnych klas używanych w PartRequestListPage.razor
    (zapotrzebowania__header/__toolbar/__section/__part-toggle/__part-results/__part-result/
    __table/__skeleton/__row) nie miała ŻADNEJ reguły, globalnie ani izolowanie — stąd goły
    <div>/<span> bez odstępu, wagi czcionki ani układu. Wzorowany na AndonListPage.razor.css
    (komentarz w PartRequestListPage.razor wprost: "Wzorem AndonListPage.razor") dla części
    listy/tabeli i na NewWorkOrderForm.razor.css (.wo-form*) dla części formularza w dialogu —
    oba pliki istnieją i renderują się poprawnie, więc te same wzorce działają tu bez niewiadomych.
    Elementy autorowane BEZPOŚREDNIO w PartRequestListPage.razor (nie ::deep w cudzy DOM) — CSS
    izolowany działa mimo że KodUrFormDialog portaluje treść (K156, decyzje.md): scoped-atrybut
    Blazora idzie na WŁASNY element w miejscu autorowania, niezależnie od tego, dokąd JS go
    później przenosi; pułapka portalu dotyczy wyłącznie reguł z "::deep" sięgających w CUDZY,
    portalowany DOM (BbSelect/BbTreeView itp.), których ten plik nie używa.
*/
.zapotrzebowania[b-s1s3k3m89t] {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.zapotrzebowania__header[b-s1s3k3m89t] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 0.5rem;
}

.zapotrzebowania__toolbar[b-s1s3k3m89t] {
    display: flex;
    gap: 0.5rem;
}

.zapotrzebowania__skeleton[b-s1s3k3m89t] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.zapotrzebowania__table[b-s1s3k3m89t] {
    width: 100%;
    border-collapse: collapse;
}

.zapotrzebowania__table th[b-s1s3k3m89t],
.zapotrzebowania__table td[b-s1s3k3m89t] {
    padding: 0.5rem;
    border-bottom: 1px solid var(--kodur-border, #e2e8f0);
    text-align: left;
    vertical-align: top;
}

.zapotrzebowania__row[b-s1s3k3m89t] {
    cursor: pointer;
}

.zapotrzebowania__row:hover[b-s1s3k3m89t] {
    background: var(--kodur-surface-hover, rgba(0, 0, 0, 0.04));
}

.zapotrzebowania__section[b-s1s3k3m89t] {
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.zapotrzebowania__section > span[b-s1s3k3m89t] {
    font-weight: 600;
    font-size: 0.875rem;
}

.zapotrzebowania__part-toggle[b-s1s3k3m89t] {
    display: flex;
    gap: 0.5rem;
}

.zapotrzebowania__part-results[b-s1s3k3m89t] {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
    max-height: 12rem;
    overflow-y: auto;
}

.zapotrzebowania__part-result[b-s1s3k3m89t] {
    display: block;
    width: 100%;
    text-align: left;
    padding: 0.375rem 0.5rem;
    border: none;
    border-radius: 0.375rem;
    background: none;
    cursor: pointer;
    font: inherit;
    color: inherit;
}

.zapotrzebowania__part-result:hover[b-s1s3k3m89t] {
    background: var(--kodur-surface-hover, rgba(0, 0, 0, 0.04));
}
/* /Components/Pages/Zapotrzebowania/PartRequestOverviewPage.razor.rz.scp.css */
.zapotrzebowania-overview__header[b-wqj8ysq2d8] {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 1rem;
    flex-wrap: wrap;
}

.zapotrzebowania-overview__toolbar[b-wqj8ysq2d8] {
    display: flex;
    gap: 0.5rem;
}

.zapotrzebowania-overview__skeleton[b-wqj8ysq2d8] {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.zapotrzebowania-overview__section[b-wqj8ysq2d8] {
    margin-bottom: 1.5rem;
    padding-bottom: 1.5rem;
    border-bottom: 1px solid var(--kodur-border, #e2e2e2);
}

.zapotrzebowania-overview__section:last-child[b-wqj8ysq2d8] {
    border-bottom: none;
}

.zapotrzebowania-overview__section-title[b-wqj8ysq2d8] {
    margin: 0 0 0.75rem;
    font-size: 1.1rem;
}

/* Kolor WYŁĄCZNIE z tokenu motywu (tokens.css) — ten sam czerwony, co już reprezentuje "Awaria"
   gdzie indziej w aplikacji (Pokoje, K174), żeby ekran nie wprowadzał drugiego znaczenia czerwieni.
   Brak wartości na sztywno (ColorLiteralGuardTests, decyzje.md) — token przełącza się sam między
   trybem jasnym/ciemnym. */
.zapotrzebowania-overview__section-title--alert[b-wqj8ysq2d8] {
    color: var(--kodur-status-awaria-fill);
}

.zapotrzebowania-overview__empty[b-wqj8ysq2d8] {
    color: var(--kodur-text-muted, inherit);
    font-style: italic;
    margin: 0 0 0.5rem;
}

.zapotrzebowania-overview__items[b-wqj8ysq2d8] {
    list-style: none;
    margin: 0 0 0.75rem;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.25rem;
}

.zapotrzebowania-overview__item[b-wqj8ysq2d8] {
    display: flex;
    flex-direction: column;
    gap: 0.125rem;
    padding: 0.5rem 0.75rem;
    border-radius: 0.375rem;
    cursor: pointer;
}

.zapotrzebowania-overview__item:hover[b-wqj8ysq2d8] {
    background: var(--kodur-surface-hover, rgba(0, 0, 0, 0.04));
}

.zapotrzebowania-overview__item-title[b-wqj8ysq2d8] {
    font-weight: 600;
}

.zapotrzebowania-overview__item-meta[b-wqj8ysq2d8] {
    font-size: 0.85rem;
    color: var(--kodur-text-muted, inherit);
    overflow-wrap: anywhere;
}

/* Tablet/telefon (design-system.md §0, breakpoint 768px) — metadane owijają się pod tytułem
   zamiast wypływać poza szerokość ekranu; brak stałej wysokości wiersza, treść dyktuje wysokość. */
@media (max-width: 768px) {
    .zapotrzebowania-overview__item-meta[b-wqj8ysq2d8] {
        font-size: 0.8rem;
    }
}
