/* Admin shell + dashboard — Dwarf | Durin */

/* As cores --tm-* compartilhadas com a gestão local do agente vêm de css/durin-tokens.css,
   carregada antes desta folha. Aqui ficam só os tokens do shell do portal. */
:root {
    --tm-drawer-bg: #303236;
    --tm-drawer-text: #D8DADD;
}

body {
    background-color: var(--tm-bg);
}

/* ---------- TopBar ---------- */

.mud-appbar.app-topbar {
    height: 70px;
    background-color: var(--tm-surface) !important;
    color: var(--tm-text);
    border-bottom: 1px solid var(--tm-border);
    padding: 0 24px;
    gap: 8px;
}

.menu-toggle {
    color: var(--tm-text-muted) !important;
}

.app-logo {
    display: flex;
    align-items: center;
    gap: 10px;
    margin-right: 32px;
}

.app-logo-text.mud-typography {
    font-family: var(--font-display);
    font-weight: 700;
    color: var(--tm-text);
    letter-spacing: -0.01em;
}

.app-search {
    flex: 1 1 auto;
    display: flex;
    justify-content: center;
    max-width: 480px;
}

.app-search .search-field {
    width: 100%;
}

.app-search .mud-input-outlined {
    border-radius: 10px;
    background-color: var(--tm-bg);
}

.app-search .mud-input-outlined .mud-input-outlined-border {
    border-color: transparent;
}

.app-search .mud-input-outlined:hover .mud-input-outlined-border {
    border-color: var(--tm-border);
}

.app-search .mud-input-outlined.mud-shrink .mud-input-outlined-border,
.app-search .mud-input-outlined.mud-focused .mud-input-outlined-border {
    border-color: var(--tm-primary);
}

.notif-badge {
    margin-right: 16px;
}

.notif-badge .mud-icon-button {
    color: var(--tm-text-muted) !important;
}

.user-menu-activator {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 6px 10px;
    border-radius: 10px;
    cursor: pointer;
    transition: background-color 150ms ease;
}

.user-menu-activator:hover {
    background-color: var(--tm-bg);
}

.user-name {
    font-size: 0.9rem;
    font-weight: 600;
    color: var(--tm-text);
}

.user-chevron {
    color: var(--tm-text-muted) !important;
}

/* ---------- Drawer / Side nav ---------- */

.mud-drawer.app-drawer {
    background-color: var(--tm-drawer-bg);
    border-right: 1px solid #232427;
}

/* MudBlazor's persistent-drawer CSS var chain (--mud-drawer-width) resolves
   empty in this theme, which breaks both the closed-state offset and the
   main-content margin reset. Pin both explicitly so the collapse toggle works. */
.app-drawer.mud-drawer--closed {
    left: -260px !important;
}

.mud-drawer-close-persistent-left .mud-main-content {
    margin-left: 0 !important;
    transition: margin 225ms cubic-bezier(0, 0, 0.2, 1);
}

.side-nav {
    padding: 20px 12px;
}

.nav-section-label.mud-typography {
    display: block;
    padding: 0 12px 8px;
    color: rgba(216, 218, 221, 0.55);
    letter-spacing: 0.06em;
}

.nav-divider {
    margin: 12px 4px;
    border-color: rgba(216, 218, 221, 0.18) !important;
}

.side-nav .mud-nav-link {
    border-radius: 10px;
    margin-bottom: 4px;
    color: var(--tm-drawer-text);
    font-weight: 500;
    transition: background-color 150ms ease, color 150ms ease;
}

.side-nav .mud-nav-link .mud-nav-link-icon {
    color: var(--tm-drawer-text);
    transition: color 150ms ease;
}

.side-nav .mud-nav-link:hover {
    background-color: rgba(241, 90, 36, 0.14) !important;
    color: var(--tm-primary) !important;
}

.side-nav .mud-nav-link:hover .mud-nav-link-icon {
    color: var(--tm-primary) !important;
}

.side-nav .mud-nav-link.active {
    background-color: rgba(241, 90, 36, 0.16) !important;
    color: var(--tm-primary) !important;
    font-weight: 600;
    position: relative;
}

.side-nav .mud-nav-link.active::before {
    content: "";
    position: absolute;
    left: -12px;
    top: 8px;
    bottom: 8px;
    width: 3px;
    border-radius: 3px;
    background-color: var(--tm-primary);
}

.side-nav .mud-nav-link.active .mud-nav-link-icon {
    color: var(--tm-primary) !important;
}

/* ---------- Main content ---------- */

.mud-main-content.app-main {
    background-color: var(--tm-bg);
}

.app-main-inner {
    padding: 32px 40px 64px;
    max-width: 1600px;
    margin: 0 auto;
}

/* ---------- Dashboard header ---------- */

.dashboard-header {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 16px;
    margin-bottom: 32px;
}

.dashboard-title.mud-typography {
    font-family: var(--font-display);
    font-size: 32px;
    font-weight: 700;
    color: var(--tm-text);
    letter-spacing: -0.01em;
}

.dashboard-subtitle.mud-typography {
    color: var(--tm-text-muted);
    margin-top: 4px;
}

.dashboard-date {
    display: flex;
    align-items: center;
    gap: 8px;
    background-color: var(--tm-surface);
    border: 1px solid var(--tm-border);
    border-radius: 10px;
    padding: 10px 16px;
    color: var(--tm-text-muted);
}

/* ---------- Stat cards ---------- */

.stats-grid {
    display: grid;
    grid-template-columns: repeat(5, minmax(0, 1fr));
    gap: 24px;
    margin-bottom: 32px;
}

.stat-card {
    background-color: var(--tm-surface);
    border: 1px solid var(--tm-border);
    border-radius: 12px;
    padding: 24px;
    transition: transform 180ms ease, box-shadow 180ms ease, border-color 180ms ease;
}

.stat-card:hover {
    transform: translateY(-3px);
    box-shadow: 0 12px 28px rgba(17, 17, 17, 0.1);
    border-color: #747A80;
}

.stat-icon {
    width: 48px;
    height: 48px;
    border-radius: 10px;
    background-color: var(--tm-secondary-tint);
    display: flex;
    align-items: center;
    justify-content: center;
    margin-bottom: 16px;
}

.stat-title.mud-typography {
    font-size: 16px;
    font-weight: 600;
    color: var(--tm-text-muted);
    margin-bottom: 6px;
}

.stat-value.mud-typography {
    font-family: var(--font-tech);
    font-size: 40px;
    font-weight: 700;
    color: var(--tm-text);
    line-height: 1.1;
    margin-bottom: 14px;
    letter-spacing: 0.01em;
}

.stat-footer {
    display: flex;
    align-items: center;
    gap: 8px;
}

.stat-dot {
    display: inline-block;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    flex: none;
}

.stat-dot-success {
    background-color: var(--tm-success);
}

.stat-dot-secondary {
    background-color: var(--tm-secondary);
}

.stat-dot-warning {
    background-color: var(--tm-warning);
}

.stat-dot-error {
    background-color: var(--tm-danger);
}

.stat-dot-default {
    background-color: #B0B4B8;
}

.stat-footer-text.mud-typography {
    font-size: 14px;
    color: var(--tm-text-muted);
}

/* ---------- Dashboard KPI states ----------
   The five KPI cards load independently from the stock position and the recent movements: while
   they are in flight a skeleton keeps the grid at its final height (no layout jump), and a
   failure replaces ONLY this grid — the two panels below keep their own data. */

.kpi-skeleton .mud-skeleton {
    margin-bottom: 12px;
}

.kpi-skeleton .mud-skeleton:last-child {
    margin-bottom: 0;
}

.kpi-skeleton-grid .stat-card:hover {
    transform: none;
    box-shadow: none;
    border-color: var(--tm-border);
}

.kpi-error-card {
    margin-bottom: 32px;
}

/* ---------- Panels & tables ---------- */

.panels-grid {
    display: grid;
    grid-template-columns: minmax(0, 1.3fr) minmax(0, 1fr);
    gap: 24px;
    margin-bottom: 32px;
    align-items: start;
}

.panel-card {
    background-color: var(--tm-surface);
    border: 1px solid var(--tm-border);
    border-radius: 12px;
    padding: 24px;
    margin-bottom: 24px;
    min-width: 0;
}

.panel-title.mud-typography {
    font-family: var(--font-display);
    font-size: 16px;
    font-weight: 700;
    color: var(--tm-text);
    margin-bottom: 16px;
}

.panel-title.has-subtitle {
    margin-bottom: 4px;
}

.panel-subtitle.mud-typography {
    color: var(--tm-text-muted);
    font-size: 14px;
    margin-bottom: 16px;
}

/* .stock-position-card / .movements-card lived here for the dashboard's two mocked panels. Both
   panels are now real components that own their own spacing (Components/Shared/Reports/
   SimplifiedStockPosition.razor.css and Components/Shared/Dashboard/RecentMovements.razor.css),
   so the rules were removed rather than left dangling against classes nothing applies anymore. */

.dash-table.mud-table {
    background-color: transparent;
    box-shadow: none;
}

.dash-table .mud-table-container {
    overflow-x: auto;
}

.dash-table .mud-table-head .mud-table-cell {
    font-size: var(--type-table-header);
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    color: var(--tm-text-muted);
    border-bottom: 1px solid var(--tm-border);
    white-space: nowrap;
}

.dash-table .mud-table-body .mud-table-cell {
    font-size: var(--type-table-body);
    color: var(--tm-text);
    border-bottom: 1px solid var(--tm-border);
    white-space: nowrap;
}

/* A paginação NÃO ganha regra aqui: o MudBlazor já a entrega em body2 (0,875rem = 14px, peso
   400), medido igual ao --type-table-body, e a família vem do tema junto com o resto do corpo.
   Declarar de novo seria uma regra sem efeito — e um `font-size` no container
   da paginação alcançaria também o seletor de "linhas por página". */

/* ---------- .mono-tech: valor técnico (serial, código, data, contagem) ----------

   Estrutural e GLOBAL: a classe é aplicada em 79 lugares e só ~metade fica dentro de .dash-table
   (diálogos de detalhe, campos de serial, preview de código automático). Escopar em .dash-table,
   como antes, deixava as demais ocorrências sem efeito nenhum.

   O tamanho fica fora daqui de propósito: 15px é a medida da CÉLULA de tabela; um serial dentro
   de um MudTextField ou de um MudText body1 deve manter o tamanho do contexto dele. */
.mono-tech {
    font-family: var(--font-tech);
    font-weight: 600;
    letter-spacing: 0.02em;
    font-variant-numeric: tabular-nums;
}

/* Bootstrap reboot manda `font-family: inherit` em input/textarea, então o <input> de um
   MudTextField Class="mono-tech" herda a família do controle. O tamanho e o peso do input,
   porém, são declarados pelo MudBlazor: não são herdados e continuam como estão. */

/* Reforço DENTRO da célula. O MudBlazor declara família, peso e espaçamento em
   `.mud-table-root .mud-table-body .mud-table-cell` — especificidade (0,3,0), que vence
   `.mono-tech` (0,1,0) sozinha. Era por isso que `<MudTd Class="mono-tech">` renderizava em
   Montserrat 14px: a classe nunca chegou a valer numa célula. Este seletor empata em (0,4,0) e
   vem depois na cascata (dashboard.css carrega após MudBlazor.min.css no <head>).
   Vale para QUALQUER MudTable, não só .dash-table, porque o obstáculo é do MudBlazor. */
.mud-table-root .mud-table-body .mud-table-cell.mono-tech {
    font-family: var(--font-tech);
    font-weight: 600;
    letter-spacing: 0.02em;
}

/* Tamanho técnico: só nas tabelas. O primeiro seletor cobre spans aninhados na célula; o
   segundo precisa do (0,4,0) para vencer o `font-size` de `.dash-table .mud-table-body
   .mud-table-cell` (0,3,0) quando a classe está na própria <td>. */
.dash-table .mono-tech {
    font-size: var(--type-table-tech);
}

.dash-table .mud-table-body .mud-table-cell.mono-tech {
    font-size: var(--type-table-tech);
}

.dash-table .mud-table-row:last-child .mud-table-cell {
    border-bottom: none;
}

.dash-table .mud-table-row:hover {
    background-color: var(--tm-bg);
}

/* ---------- .table-type-standard: só a TIPOGRAFIA da tabela ----------

   Duas das 44 tabelas nasceram fora do kit .dash-table e por isso ficaram no default do
   MudBlazor — cabeçalho em subtitle2 (14px, caixa normal) e corpo em body2 — enquanto as outras
   42 seguem a escala 13/14/12/15:
     · Components/Shared/SkuKitFormDialog.razor            (.kit-component-table)
     · Components/Shared/Integrador/ManageTerminalActivationsDialog.razor (MudSimpleTable)

   Elas NÃO recebem .dash-table: aquele kit também traz `overflow-x: auto` no container,
   `white-space: nowrap` em toda célula, bordas e hover próprios. Dentro de um diálogo isso
   mudaria largura, rolagem e empilhamento móvel — comportamento, não tipografia. Esta classe
   declara apenas família, tamanho, peso, espaçamento e caixa.

   Dois grupos de seletores porque as duas tabelas têm marcação diferente: o MudTable monta
   .mud-table-cell e o MudSimpleTable entrega th/td nus. As especificidades foram escolhidas
   para vencer o MudBlazor sem !important — (0,4,0) contra o `.mud-table-root .mud-table-body
   .mud-table-cell` dele, e (0,1,4) contra o `.mud-simple-table table * tr > td`. */
.table-type-standard .mud-table-root .mud-table-head .mud-table-cell,
.table-type-standard table thead tr > th {
    font-family: var(--font-body);
    font-size: var(--type-table-header);
    font-weight: 600;
    letter-spacing: 0.03em;
    text-transform: uppercase;
}

.table-type-standard .mud-table-root .mud-table-body .mud-table-cell,
.table-type-standard table tbody tr > td {
    font-family: var(--font-body);
    font-size: var(--type-table-body);
    font-weight: 400;
    letter-spacing: normal;
    text-transform: none;
}

.table-type-standard .mono-tech,
.table-type-standard .mud-table-root .mud-table-body .mud-table-cell.mono-tech,
.table-type-standard table tbody tr > td.mono-tech {
    font-family: var(--font-tech);
    font-size: var(--type-table-tech);
    font-weight: 600;
    letter-spacing: 0.02em;
}

/* ---------- Rótulo móvel (DataLabel) ----------

   Abaixo de 600px o MudTable esconde o <thead> e reimprime o rótulo em `.mud-table-cell:before`
   com `content: attr(data-label)`. Esse pseudo-elemento herdava tudo da célula, então o rótulo
   saía do mesmo tamanho e peso do VALOR — e, numa célula .mono-tech, saía até em Barlow. O
   cabeçalho da tabela deixava de existir como degrau visual justamente onde ele é a única
   âncora de leitura.

   O breakpoint é `max-width: 600px` para casar exatamente com o do MudBlazor que dispara o
   empilhamento; usar 599px deixaria a largura de 600px empilhada e sem rótulo formatado.
   A especificidade empata com a do MudBlazor ((0,2,1)) e vence pela ordem no <head>.

   SEM caixa-alta, de propósito, e a decisão vale para as 44 tabelas. A célula empilhada é
   `display:flex` e o kit .dash-table impõe `white-space: nowrap`, então a largura do rótulo vira
   rolagem horizontal direta. Medido em 375px, com os rótulos mais longos do produto
   ("Condição antes → depois", "Motivo do encerramento"), num container de 343px:

       herdado hoje (14px/400/caixa normal) ... excedente de 36px
       com caixa-alta (13px/600/.03em) ...... excedente de 72px   <- dobra a rolagem
       sem caixa-alta (13px/600) ............ excedente de 37px

   O tamanho e o peso entregam a hierarquia inteira por 1px de custo; a caixa-alta cobraria mais
   36px de rolagem em toda tabela empilhada. O `letter-spacing` foi junto com ela: aquele
   0,03em existe para abrir versais, e em caixa normal com acentuação só afasta as letras. */
@media (max-width: 600px) {
    .dash-table .mud-table-cell:before,
    .table-type-standard .mud-table-cell:before {
        /* Família e espaçamento reancorados porque o pseudo herda tudo da célula: sem isto o
           rótulo de uma célula .mono-tech sairia na condensada de --font-tech com o tracking
           técnico de 0,02em, e o de uma célula comum com o 0,01071em do body2 do MudBlazor — o
           mesmo rótulo mudaria de forma conforme a coluna. */
        font-family: var(--font-body);
        font-size: var(--type-table-header);
        font-weight: 600;
        letter-spacing: normal;
    }
}

/* ---------- Kit de tabela de largura fixa (opt-in: .dash-table-fixed) ----------
   .dash-table impõe `white-space: nowrap` a toda célula de corpo (acima), então cada coluna exige
   a largura do próprio conteúdo e o `overflow-x` de .dash-table .mud-table-container vira scroll
   horizontal em listagens com muitas colunas. Somando .dash-table-fixed, as colunas passam a
   repartir o painel em porcentagem — a tabela deixa de poder exceder o container, por definição do
   algoritmo de layout fixo — e cada página só precisa declarar os `width` por nth-child.

   Só vale de 600px para cima: abaixo disso o MudTable empilha a linha em cartão com DataLabel,
   onde largura de coluna não significa nada e truncar esconderia informação sem motivo.

   Vocabulário das células:
     .cell-stack       — célula de duas linhas (libera o nowrap herdado)
     .cell-line        — linha em bloco que trunca com reticências
     .cell-line-muted  — modificador da linha secundária (menor e apagada)
     .cell-chips       — pilha vertical de chips
     .chip-label       — rótulo de chip que encolhe junto com a coluna em vez de vazar */

.dash-table-fixed .cell-line {
    display: block;
    line-height: 1.3;
}

.dash-table-fixed .cell-line-muted {
    font-size: var(--type-table-meta);
    color: var(--tm-text-muted);
}

.dash-table-fixed .cell-chips {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 4px;
}

/* O MudChip traz margem própria; num empilhamento vertical quem espaça é o gap. */
.dash-table-fixed .cell-chips .mud-chip {
    margin: 0;
}

@media (min-width: 600px) {
    .dash-table-fixed table {
        table-layout: fixed;
        width: 100%;
    }

    /* Rede de segurança: com layout fixo, conteúdo mais largo que a coluna vazaria para fora da
       célula em vez de alargar a tabela. Popovers de kebab e tooltips são renderizados no
       MudPopoverProvider (Components/Routes.razor), fora da célula, então não são cortados. */
    .dash-table-fixed td.mud-table-cell {
        overflow: hidden;
    }

    .dash-table-fixed .cell-stack {
        white-space: normal;
    }

    .dash-table-fixed .cell-line,
    .dash-table-fixed .chip-label {
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
    }

    .dash-table-fixed .mud-chip {
        max-width: 100%;
    }

    .dash-table-fixed .chip-label {
        display: block;
    }
}

/* Faixa apertada: entre 600px e 1279px o drawer persistente ainda come 260px da tela. Recuperar
   12px de padding horizontal por célula aqui adia a truncagem dos chips. */
@media (min-width: 600px) and (max-width: 1279px) {
    .dash-table-fixed .mud-table-cell {
        padding-left: 10px;
        padding-right: 10px;
    }
}

/* ---------- Responsive ---------- */

@media (max-width: 1279px) {
    .stats-grid {
        grid-template-columns: repeat(3, 1fr);
    }

    .panels-grid {
        grid-template-columns: 1fr;
    }

    .app-main-inner {
        padding: 24px 24px 48px;
    }
}

@media (max-width: 959px) {
    .stats-grid {
        grid-template-columns: repeat(2, 1fr);
    }

    .app-search {
        display: none;
    }

    .mud-drawer.app-drawer {
        position: fixed;
        z-index: 1300;
    }
}

@media (max-width: 599px) {
    .stats-grid {
        grid-template-columns: 1fr;
    }

    .app-logo-text.mud-typography {
        display: none;
    }

    .user-name {
        display: none;
    }

    .dashboard-header {
        flex-direction: column;
    }
}

/* ---------- Full-page states (404 / error) ---------- */

.state-page {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    gap: 16px;
    min-height: calc(100vh - 220px);
    padding: 48px 24px;
}

.state-page-icon {
    width: 88px;
    height: 88px;
    border-radius: 50%;
    background-color: var(--tm-secondary-tint);
    color: var(--tm-secondary);
    display: flex;
    align-items: center;
    justify-content: center;
    margin-bottom: 8px;
}

.state-page-icon .mud-icon-root {
    font-size: 2.6rem;
}

.state-page-icon-error {
    background-color: var(--tm-danger-tint);
    color: var(--tm-danger);
}

.state-page-title.mud-typography {
    font-family: var(--font-display);
    font-weight: 700;
    color: var(--tm-text);
}

.state-page-subtitle.mud-typography {
    color: var(--tm-text-muted);
    max-width: 420px;
}

.state-page-meta {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 10px 16px;
    border: 1px solid var(--tm-border);
    border-radius: 10px;
    background-color: var(--tm-surface);
    color: var(--tm-text-muted);
    font-size: 13px;
}

.state-page-meta code {
    font-family: var(--font-tech);
    font-weight: 600;
    color: var(--tm-text);
}

.state-page-dev-alert {
    max-width: 520px;
    text-align: left;
}
