/* ==========================================================================
   Verniz visual das telas Blazor de ESCRITÓRIO do sis (claro/escuro).

   Baseado no Cadastro de Pessoas do WPF (design "clean/moderno"): campos com
   leve fundo cinza + borda fina, campo desabilitado/readonly mais escuro,
   campo em foco/edição com borda de acento, e grid com cabeçalho diferenciado,
   zebra, hover e linha selecionada com faixa de acento.

   Usa APENAS as CSS custom properties publicadas pelo MudThemeProvider
   (--mud-palette-*), então tudo segue o tema ATIVO — verde no claro, verde
   clareado no escuro — sem cor cravada. As paletas moram em SisThemes.cs.

   POR QUE aqui e não em .razor.css: os bundles de CSS isolado
   ({Assembly}.styles.css) NÃO são referenciados por nenhum host (nem o
   index.html do BlazorWebView, nem o do WASM), então estilo isolado não
   carrega. Este arquivo é asset global da RCL, servido em
   _content/Sis.Presentation.Erp.Components/sis-theme.css e ligado no <head>
   de cada host — é onde o CSS compartilhado de fato entra em vigor.
   ========================================================================== */

/* -------------------------------------------------------------------------
   Fonte da interface: Inter (moderna/elegante), SELF-HOSTED — o woff2 é asset
   da RCL (wwwroot/fonts), servido em _content/.../fonts. É a garantia de
   OFFLINE do app local (WPF/MAUI): a fonte vem do próprio app, não do Google
   Fonts (CDN), então funciona sem internet; na web serve do mesmo lugar. É um
   arquivo variável (todos os pesos num só). URL relativa a este CSS.
   Inter é SIL Open Font License — livre para empacotar.
   ------------------------------------------------------------------------- */
@font-face {
    font-family: "Inter";
    font-style: normal;
    font-weight: 100 900;      /* variável: cobre todos os pesos */
    font-display: swap;        /* pinta com a fallback e troca — nunca texto invisível */
    src: url("fonts/InterVariable.woff2") format("woff2");
}

/* Aplica a Inter em toda a interface (MudBlazor lê --mud-typography-*-family da
   tipografia em SisThemes; isto cobre o resto — body, texto solto, HTML puro).
   A stack de sistema (Segoe UI/Roboto/-apple-system) é a fallback enquanto a
   Inter carrega ou se, por algum motivo, o asset não estiver presente. */
html, body, .mud-typography, .mud-input, .mud-button-root, .mud-nav-link {
    font-family: "Inter", "Segoe UI", "Roboto", -apple-system, "Helvetica", "Arial", sans-serif;
}

/* -------------------------------------------------------------------------
   Campos (MudTextField/MudSelect Outlined, o default global do AddSisUi)
   ------------------------------------------------------------------------- */

/* Campo habilitado: leve fundo cinza dentro da borda, como no WPF.

   O preenchimento é DERIVADO da paleta ativa (uma pitada do texto primário
   misturada à superfície), NÃO de --mud-palette-gray-light. Motivo: essa
   variável NÃO acompanha o modo do jeito que o nome sugere — no claro vale
   #F5F5F5 (o cinza sutil que este verniz queria) e no ESCURO vale #BDBDBD, ou
   seja cinza CLARO. Nos temas escuros (Food do restaurante, Channel, o Dark
   canônico da casca, DashboardDark) todo campo virava um bloco cinza claro com
   texto claro por cima — ilegível. Era o que se via no login e na busca do app
   do garçom.

   Os 6% são calibrados para NÃO mexer no que já existia: sobre a superfície
   branca do tema claro dão ~#F2F2F2, praticamente o #F5F5F5 de antes; sobre a
   superfície #1E1E1E do escuro dão ~#2A2A2A, um degrau acima do fundo, com o
   texto #E8E8E8 por cima. Um mesmo valor fixo não serviria aos dois — é por
   isso que a cor é derivada, e não cravada. */
.mud-input.mud-input-outlined:not(.mud-disabled) .mud-input-slot {
    background-color: color-mix(in srgb, var(--mud-palette-text-primary) 6%, var(--mud-palette-surface));
}

/* Campo desabilitado ou readonly: fundo visivelmente mais escuro (ex.: Cidade
   e UF derivados da busca no cadastro) — a diferença habilitado x desabilitado
   fica inequívoca, não um tom quase idêntico. */
.mud-input.mud-input-outlined.mud-disabled .mud-input-slot,
.mud-input.mud-input-outlined .mud-input-slot[readonly] {
    background-color: var(--mud-palette-action-disabled-background);
}

/* Campo em foco/edição: borda de acento (verde) mais grossa — equivale ao
   realce do campo em edição do cadastro WPF. */
.mud-input.mud-input-outlined.mud-focused .mud-input-outlined-border {
    border-width: 2px !important;
    border-color: var(--mud-palette-primary) !important;
}

/* -------------------------------------------------------------------------
   Casca (ShellLayout): barra superior e menu lateral NAVY, espelhando o shell
   WPF nos dois temas. As cores navy vêm da paleta (--mud-palette-appbar/drawer-*,
   definidas em SisThemes: #10293F/#1B374E no claro, navy escuro no escuro).
   Aqui ficam as PROPORÇÕES e os ESTADOS (hover/ativo), que a paleta não expressa.
   ------------------------------------------------------------------------- */

/* Logo da SoftConn no CENTRO da barra superior (decisão do dono, 2026-07-27).

   Altura fixa e `width: auto`: a MudAppBar tem altura fixa e o arquivo tem 644px de largura — sem travar a
   altura, a imagem empurra a barra inteira. `object-fit: contain` preserva a proporção qualquer que seja o
   arquivo, então trocar o logo por outro de proporção diferente não obriga a mexer aqui.

   `pointer-events: none`: o logo é marca, não botão. Sem isto ele intercepta o clique que passa pela faixa
   central da barra, e um logo que não faz nada ao ser clicado é indistinguível de um botão quebrado. */
.sis-shell-logo {
    /* 42px numa barra de 64px. O arquivo é 1317×620 (proporção ~2,12:1), então isto o desenha com ~89px de
       largura — e é a altura, não a largura, que decide se a palavra "SoftConn" dentro da marca é legível.
       A primeira tentativa foi 28px e o logo virou uma mancha colorida: a marca ficou lá e não se lia. */
    height: 42px;
    width: auto;
    max-width: 240px;
    object-fit: contain;
    pointer-events: none;
    user-select: none;
}

/* Menu lateral: texto e ícones claros sobre o navy; hover e item ativo com
   realce translúcido branco (como o WPF), não a primária verde. */
.sis-shell-drawer .mud-navmenu .mud-nav-link,
.sis-shell-drawer .mud-navmenu .mud-nav-group .mud-nav-link {
    color: rgba(255, 255, 255, 0.82);
}
.sis-shell-drawer .mud-navmenu .mud-nav-link .mud-icon-root,
.sis-shell-drawer .mud-navmenu .mud-nav-link-expand-icon {
    color: rgba(255, 255, 255, 0.7);
}
.sis-shell-drawer .mud-navmenu .mud-nav-link:hover {
    background-color: rgba(255, 255, 255, 0.10);
    color: #fff;
}
.sis-shell-drawer .mud-navmenu .mud-nav-link.active:not(.mud-nav-link-disabled) {
    background-color: rgba(255, 255, 255, 0.16);
    color: #fff;
    font-weight: 600;
}
.sis-shell-drawer .mud-navmenu .mud-nav-link.active:not(.mud-nav-link-disabled) .mud-icon-root {
    color: #fff;
}

/* Busca do menu sobre o navy: fundo translúcido e texto claro, sobrescrevendo
   o verniz de campo de formulário (fundo cinza) que não cabe aqui. */
.sis-shell-drawer .sis-nav-busca .mud-input-slot {
    background-color: rgba(255, 255, 255, 0.08) !important;
    color: #fff;
}
.sis-shell-drawer .sis-nav-busca .mud-input-outlined-border {
    border-color: rgba(255, 255, 255, 0.25) !important;
}
.sis-shell-drawer .sis-nav-busca input,
.sis-shell-drawer .sis-nav-busca .mud-input-adornment .mud-icon-root {
    color: rgba(255, 255, 255, 0.85);
}
.sis-shell-drawer .sis-nav-busca input::placeholder {
    color: rgba(255, 255, 255, 0.5);
    opacity: 1;
}

/* Menu COLAPSADO (68px): ícones centrados, como o modo Compact do WPF. */
.sis-nav-mini {
    display: flex;
    flex-direction: column;
    align-items: center;
    padding: 8px 0;
    gap: 2px;
    min-height: 100%;
}
.sis-nav-mini-icon.mud-icon-button {
    color: rgba(255, 255, 255, 0.82);
    width: 48px;
    height: 48px;
}
.sis-nav-mini-icon.mud-icon-button:hover {
    background-color: rgba(255, 255, 255, 0.12);
    color: #fff;
}
.sis-nav-mini-spacer {
    flex: 1 1 auto;
}

/* Flyout do menu colapsado (popover do MudMenu): fundo NAVY como o submenu do WPF
   (não a superfície branca do tema). Usa o mesmo navy do drawer, então casa com o
   menu em claro e escuro. */
.sis-nav-flyout.mud-popover {
    background-color: var(--mud-palette-drawer-background);
    color: rgba(255, 255, 255, 0.9);
    border: 1px solid rgba(255, 255, 255, 0.12);
}
.sis-nav-flyout .mud-menu-item {
    color: rgba(255, 255, 255, 0.85);
}
.sis-nav-flyout .mud-menu-item:hover {
    background-color: rgba(255, 255, 255, 0.10);
    color: #fff;
}
.sis-nav-flyout .sis-nav-flyout-header {
    font-weight: 700;
    font-size: 0.85rem;
    padding: 8px 16px 4px;
    color: #fff;
}
.sis-nav-flyout .sis-nav-flyout-subheader {
    font-weight: 600;
    font-size: 0.68rem;
    text-transform: uppercase;
    letter-spacing: 0.04em;
    padding: 10px 16px 2px;
    color: rgba(255, 255, 255, 0.55);
}

/* -------------------------------------------------------------------------
   RapidView (Painel de Acesso Rápido) — cards de atalho: efeito de hover/clique
   como o CardBotao do WPF (sobe levemente + sombra + brilho ao passar o mouse,
   afunda ao clicar). A cor de fundo (por módulo) vem do componente, na variável
   --sis-rapid-card-bg.

   ⚠️ O `!important` do background NÃO é preguiça — é obrigatório. O MudBlazor
   pinta o botão desabilitado com

       .mud-button-filled:disabled { background-color:
            var(--mud-palette-action-disabled-background) !important }

   e `!important` de folha de estilo vence estilo INLINE sem `!important` (a
   única situação da cascata em que o inline perde). Enquanto a cor vinha por
   `style="background: …"` no componente, todo card desabilitado ficava CINZA —
   e eles são desabilitados em todo head que não registra o IRapidViewLauncher,
   isto é em todos menos o Web.Mock (que finge disponibilidade). Resultado
   medido no head MAUI em 2026-07-27: painel inteiro sem cor, exatamente fora do
   head onde se costuma olhar.

   A escolha de produto: um atalho indisponível continua dizendo DE QUE MÓDULO
   ele é (a cor é identidade, não estado) e diz "indisponível" por opacidade e
   ausência de sombra. Apagar a cor confundia "não posso clicar" com "não
   carregou".
   ------------------------------------------------------------------------- */
.sis-rapid-card.mud-button-root {
    background-color: var(--sis-rapid-card-bg) !important;
    transition: transform 0.12s ease, box-shadow 0.12s ease, filter 0.12s ease;
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.14);
}
.sis-rapid-card.mud-button-root:disabled {
    opacity: 0.55;
    box-shadow: none;
}
.sis-rapid-card.mud-button-root:hover:not(:disabled) {
    transform: translateY(-3px);
    box-shadow: 0 10px 22px rgba(0, 0, 0, 0.24);
    filter: brightness(1.07);
}
.sis-rapid-card.mud-button-root:active:not(:disabled) {
    transform: translateY(-1px) scale(0.99);
    box-shadow: 0 3px 8px rgba(0, 0, 0, 0.2);
    filter: brightness(0.98);
}

/* -------------------------------------------------------------------------
   Densidade do menu lateral aproximada do WPF (item ~13px, altura enxuta). O
   MudBlazor parte de 16px e espaça mais; aqui o item fica mais compacto e com
   respiro vertical menor, como o SfNavigationDrawer do WPF.
   ------------------------------------------------------------------------- */
.sis-shell-drawer .mud-navmenu .mud-nav-link {
    font-size: 0.875rem;
    min-height: 40px;
    padding-top: 6px;
    padding-bottom: 6px;
}
/* Ícone do item um pouco menor e mais colado ao texto (WPF: ícone 22px + gap curto). */
.sis-shell-drawer .mud-navmenu .mud-nav-link .mud-nav-link-icon {
    margin-right: 10px;
}
.sis-shell-drawer .mud-navmenu .mud-nav-link .mud-icon-root {
    font-size: 1.25rem;
}

/* -------------------------------------------------------------------------
   SisPageHeader — ícone do cabeçalho tingido pela primária do tema ativo.
   (Estava só no .razor.css isolado, que não carrega; consolidado aqui.)

   Não usa --mud-palette-primary-hover pelo mesmo motivo da linha selecionada do grid: o "-hover" derivado do
   HoverOpacity (~6%) some sobre o card branco. Mistura fixa da primária + contorno fino — o mesmo vocabulário
   visual dos ícones de ação da linha (caixa contornada), pra a tela ter UM idioma de "ícone em caixa".
   ------------------------------------------------------------------------- */
.sis-page-header-icon {
    width: 44px;
    height: 44px;
    border-radius: var(--mud-default-borderradius, 8px);
    background-color: rgba(var(--mud-palette-primary-rgb), 0.12);
    border: 1px solid rgba(var(--mud-palette-primary-rgb), 0.24);
    color: var(--mud-palette-primary);
}

/* -------------------------------------------------------------------------
   Cadastro SIMPLES (poucos campos — ex.: só "Descrição" — e grade com 1-2
   colunas de texto + Ações). A página ganha um TETO de largura em vez de
   esticar borda a borda do monitor.

   Sem isso, um cadastro trivial (Grupos de rota, Tipos de Produto,
   SubGrupos...) numa tela ultrawide vira uma faixa de texto rente à
   esquerda com um vão enorme até a coluna Ações — sobra de largura que
   ninguém pediu, não fluidez. É TETO, não centralização: abaixo dele o
   bloco continua ocupando 100% da largura disponível (tablet, celular),
   e por isso não contradiz a regra de tela fluida/responsiva — só para
   de crescer sem propósito quando o monitor é maior que o conteúdo.
   ------------------------------------------------------------------------- */
.sis-cadastro-simples {
    max-width: 720px;
}

/* -------------------------------------------------------------------------
   SisDataGrid — contorno, cabeçalho, hover e seleção. Tudo escopado em
   .sis-data-grid, então NÃO afeta grids de outros módulos (PDV/Food).
   ------------------------------------------------------------------------- */

/* Contorno do grid: card com hairline + cantos arredondados do tema, no espírito do "outlined container" do
   Material 3 (contorno fino carrega a delimitação; a elevação fica baixa, sem sombra pesada). O
   overflow:hidden é o que faz o cabeçalho respeitar o canto arredondado — sem ele o fundo cinza do <th>
   vaza e o canto vira um quadrado. Popover de filtro/menu do MudDataGrid não é clipado: renderiza fora,
   no MudPopoverProvider. */
.sis-data-grid.mud-table {
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius, 8px);
    overflow: hidden;
}

/* Cabeçalho diferenciado: fundo cinza, texto secundário em caixa alta leve,
   sublinha de 2px. Distingue o header do corpo sem depender de cor forte.
   A sublinha usa table-lines (a mesma cor das linhas do corpo, agora legível) em vez de lines-default —
   assim o cabeçalho é a MESMA linha, só mais grossa, e não uma segunda cor competindo. */
.sis-data-grid .mud-table-head th,
.sis-data-grid .mud-table-head .mud-table-cell {
    background-color: var(--mud-palette-gray-light);
    color: var(--mud-palette-text-secondary);
    font-weight: 600;
    font-size: 0.72rem;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    border-bottom: 2px solid var(--mud-palette-table-lines);
}

/* SEM zebra por padrão (decidido em 2026-07-25, junto com o reforço das linhas).

   Havia aqui uma regra que listrava as linhas pares de TODO .sis-data-grid, INCONDICIONALMENTE — ela ignorava
   o parâmetro `Striped` do SisDataGrid (que é false por default), então a tela não tinha como desligar a
   zebra nem pedindo. Duas razões pra ela sair:

   1. Enquanto a linha de separação era invisível, a zebra fazia o trabalho dela por tabela. Com o separador
      legível, as duas guiam o olho pela mesma linha — Material Design pede UM dos dois, não os dois, e o
      fundo uniforme devolve destaque ao hover e à seleção, que é onde a informação de estado mora.
   2. Sem a regra, o parâmetro `Striped` volta a FUNCIONAR: quem passar Striped="true" recebe o listrado
      nativo do MudBlazor (que usa o mesmo --mud-palette-table-striped). Deixou de ser sempre-ligado e virou
      opt-in por tela, que é o que a assinatura do componente sempre prometeu.

   O TableStriped continua na paleta justamente por causa do (2) — não é valor órfão. */

/* Transição do realce: a faixa "acende" em vez de piscar. É o que torna o hover perceptível mesmo quando o
   mouse atravessa o grid rápido — o olho registra o movimento da cor, não só o estado final. */
.sis-data-grid .mud-table-body .mud-table-row .mud-table-cell {
    transition: background-color 0.12s ease-out;
}

/* Hover: realce esverdeado (o TableHover da paleta, reforçado em SisThemes.cs — ver o comentário lá), sem
   cobrir a seleção. O !important vence o sombreamento próprio do MudDataGrid, que também escreve
   background-color na linha em hover e, sendo mais específico em alguns temas, apagava este realce. */
.sis-data-grid .mud-table-body .mud-table-row:hover:not(.sis-grid-row-selected) td {
    background-color: var(--mud-palette-table-hover) !important;
}

/* Linha selecionada: fundo tingido com a primária + faixa de acento à esquerda.
   O !important vence o sombreamento de hover/zebra do próprio MudDataGrid.

   NÃO usa --mud-palette-primary-hover (o "-hover" que o MudBlazor deriva de HoverOpacity, ~6% de opacidade —
   pensado pra um :hover discreto, não pra marcar "esta é a linha selecionada"). Com opacidade tão baixa, no
   tema CLARO a seleção quase some sobre o branco do card — foi o que o dono reportou ("não dá pra enxergar").
   Em vez disso, mistura a primária do tema ativo (--mud-palette-primary-rgb, publicada pelo MudThemeProvider)
   numa opacidade fixa e mais forte, dedicada só a este estado — segue o tema (muda com Light/Dark/Food/...)
   mas não depende do HoverOpacity global nem se confunde com o :hover comum de botão/menu.

   Seleção x hover não competem por serem tons diferentes do mesmo verde: a seleção soma DOIS sinais que o
   hover não tem — a faixa de acento de 4px e o peso da fonte. */
.sis-data-grid .mud-table-body tr.sis-grid-row-selected td {
    background-color: rgba(var(--mud-palette-primary-rgb), 0.22) !important;
    font-weight: 600;
}
.sis-data-grid .mud-table-body tr.sis-grid-row-selected td:first-child {
    box-shadow: inset 4px 0 0 0 var(--mud-palette-primary);
}

/* Linha de separação entre registros: o MudBlazor usa var(--mud-palette-table-lines) no border-bottom de
   cada célula (1px). O valor de TableLines pro tema Light era quase invisível sobre o branco do card —
   reforçado em SisThemes.cs (ver o comentário lá) pra ficar claramente perceptível sem virar uma grade
   pesada. Aqui só reafirma a intenção — o valor real é publicado pela paleta ativa. */
.sis-data-grid .mud-table-body .mud-table-row .mud-table-cell {
    border-bottom: 1px solid var(--mud-palette-table-lines);
}

/* Última linha sem separador: quem fecha o corpo é o contorno do card. Evita a linha dupla (separador +
   borda) que aparece logo acima do rodapé/paginador. */
.sis-data-grid .mud-table-body .mud-table-row:last-child .mud-table-cell {
    border-bottom: none;
}

/* -------------------------------------------------------------------------
   SisRowActions — ícones de ação (editar/excluir) na linha do grid. Cores
   centralizadas AQUI: mude estas regras e TODO grid do sis (qualquer tela
   que usa SisRowActions) muda junto — é o "tema global" dos ícones de
   ação, deliberadamente desacoplado do Color.Primary/Error do MudBlazor
   (que também pinta botão Salvar, chip de status etc. — mudar só a ação de
   linha não deve mexer no resto da tela, e vice-versa).

   .sis-row-action é a FORMA (caixa contornada, comum aos dois); as classes
   -edit/-delete são só a COR. Separar as duas é o que permite acrescentar uma
   terceira ação amanhã sem repetir a geometria.
   ------------------------------------------------------------------------- */

/* Espaçamento entre as caixas: um respiro maior que o gap-1 (4px) do utilitário,
   pra os contornos não encostarem e virarem uma barra só. */
.sis-row-actions {
    gap: 6px;
}

/* A caixa: contorno fino no cinza de linha do tema, canto arredondado do tema e um quadrado justo em volta
   do ícone. Fundo transparente em repouso (o contorno já delimita) — a cor entra no hover, então a linha do
   grid não fica poluída por dois blocos coloridos em cada registro. */
.sis-row-action.mud-icon-button {
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius, 8px);
    width: 30px;
    height: 30px;
    padding: 0;
    background-color: transparent;
    transition: background-color 0.15s ease-out, border-color 0.15s ease-out, box-shadow 0.15s ease-out,
                transform 0.1s ease-out;
}
.sis-row-action.mud-icon-button .mud-icon-root {
    font-size: 1.05rem;
}

/* Clique: a caixa afunda. Par do hover colorido definido junto das cores, mais abaixo — juntos formam a
   "elevação de estado" do Material (repouso → hover eleva → :active afunda), sem exagero. */
.sis-row-action.mud-icon-button:active:not(.mud-disabled) {
    transform: scale(0.94);
    box-shadow: none;
}

/* Contorno apagado quando desabilitado: a caixa não pode parecer clicável se a ação não está disponível. */
.sis-row-action.mud-icon-button.mud-disabled {
    border-color: var(--mud-palette-action-disabled-background);
}

.sis-row-action-edit.mud-icon-button {
    color: var(--mud-palette-primary);
}
.sis-row-action-edit.mud-icon-button:hover:not(.mud-disabled) {
    background-color: rgba(var(--mud-palette-primary-rgb), 0.12);
    border-color: var(--mud-palette-primary);
    box-shadow: 0 1px 3px rgba(var(--mud-palette-primary-rgb), 0.28);
}
/* Imprimir em PDF: cor SECUNDÁRIA, não primária. A ação convive com "Editar" na mesma linha e as duas são
   não-destrutivas — pintar as duas de primary tiraria de "Editar" o posto de ação principal da linha. E não
   é error: imprimir não destrói nada. Só a COR muda; a caixa vem da .sis-row-action, comum às três. */
.sis-row-action-print.mud-icon-button {
    color: var(--mud-palette-secondary);
}
.sis-row-action-print.mud-icon-button:hover:not(.mud-disabled) {
    background-color: rgba(var(--mud-palette-secondary-rgb), 0.12);
    border-color: var(--mud-palette-secondary);
    box-shadow: 0 1px 3px rgba(var(--mud-palette-secondary-rgb), 0.28);
}

/* Classificação fiscal — INFO, não primary: é ação de configuração, e a cor primária a colocaria no mesmo
   peso visual de editar, que é a ação do dia a dia. A geometria vem toda de `.sis-row-action`. */
.sis-row-action-fiscal.mud-icon-button {
    color: var(--mud-palette-info);
}
.sis-row-action-fiscal.mud-icon-button:hover:not(.mud-disabled) {
    background-color: rgba(var(--mud-palette-info-rgb), 0.12);
    border-color: var(--mud-palette-info);
    box-shadow: 0 1px 3px rgba(var(--mud-palette-info-rgb), 0.28);
}

/* Estornar: cor de AVISO — o degrau que a ação realmente ocupa, entre o não-destrutivo (editar/imprimir) e o
   destrutivo (excluir). Estorno não apaga nada: registra o movimento CONTRÁRIO e preserva a trilha. Mas mexe
   em dinheiro já lançado e não é rotina. Pintá-la de error a confundiria com excluir; de primary, com editar.
   Só a COR muda; a caixa vem da .sis-row-action, comum a todas. */
.sis-row-action-reverse.mud-icon-button {
    color: var(--mud-palette-warning);
}
.sis-row-action-reverse.mud-icon-button:hover:not(.mud-disabled) {
    background-color: rgba(var(--mud-palette-warning-rgb), 0.12);
    border-color: var(--mud-palette-warning);
    box-shadow: 0 1px 3px rgba(var(--mud-palette-warning-rgb), 0.28);
}

/* Eleger como PADRÃO: cor de sucesso. É a única ação da coluna que AFIRMA algo em vez de alterar ou desfazer —
   e não é destrutiva nem rotina, então nem primary (que a igualaria a editar) nem warning (que sugeriria
   risco). Usa color-mix e não `--mud-palette-success-rgb` porque essa variável não existe no tema: a forma
   -rgb só está definida para primary/info/warning/error. Só a COR muda; a caixa vem da .sis-row-action. */
.sis-row-action-default.mud-icon-button {
    color: var(--mud-palette-success);
}
.sis-row-action-default.mud-icon-button:hover:not(.mud-disabled) {
    background-color: color-mix(in srgb, var(--mud-palette-success) 12%, transparent);
    border-color: var(--mud-palette-success);
    box-shadow: 0 1px 3px color-mix(in srgb, var(--mud-palette-success) 28%, transparent);
}

.sis-row-action-delete.mud-icon-button {
    color: var(--mud-palette-error);
}
.sis-row-action-delete.mud-icon-button:hover:not(.mud-disabled) {
    background-color: rgba(var(--mud-palette-error-rgb), 0.12);
    border-color: var(--mud-palette-error);
    box-shadow: 0 1px 3px rgba(var(--mud-palette-error-rgb), 0.28);
}

/* -------------------------------------------------------------------------
   SisCrudToolbar — largura do campo de busca: fixa no desktop (não engole a
   barra), fluida no celular.

   Estava só no .razor.css isolado, que NÃO carrega em host nenhum (mesmo
   motivo do SisPageHeader acima) — ou seja, a regra nunca chegou a valer e a
   busca esticava. Consolidado aqui, onde de fato entra em vigor.
   ------------------------------------------------------------------------- */
.sis-crud-toolbar .sis-crud-toolbar-search {
    max-width: 360px;
    min-width: 200px;
    flex: 1 1 auto;
}

/* -------------------------------------------------------------------------
   Foco visível por teclado (acessibilidade + acabamento moderno).

   :focus-visible só acende na navegação por TECLADO — o clique de mouse não
   deixa o anel para trás. Sem isso, quem usa Tab (o operador de ERP passa o
   dia nisso — ver "Teclado e navegação" no CLAUDE.md) não enxerga onde está,
   porque o outline default do browser é apagado pelo reset do MudBlazor.
   ------------------------------------------------------------------------- */
.mud-button-root:focus-visible,
.mud-icon-button:focus-visible,
.mud-nav-link:focus-visible,
.mud-table-row:focus-visible {
    outline: 2px solid rgba(var(--mud-palette-primary-rgb), 0.6);
    outline-offset: 2px;
}
/* Sobre a casca navy o verde some — ali o anel é branco. */
.sis-shell-drawer .mud-nav-link:focus-visible,
.sis-nav-mini-icon.mud-icon-button:focus-visible {
    outline-color: rgba(255, 255, 255, 0.75);
}

/* -------------------------------------------------------------------------
   Barra de rolagem.

   O MudThemeProvider já injeta um bloco ::-webkit-scrollbar (8px, thumb em
   --mud-palette-lines-inputs) — cobre Chromium e o WebView2 do host WPF. Aqui
   ficam só as DUAS coisas que faltam ou destoam:

   1. Firefox não lê ::-webkit-scrollbar e o MudBlazor não emite os equivalentes
      padronizados — sem isto, no Firefox a barra é a gorda do sistema.
   2. O bloco do MudBlazor usa `border-radius: 1px` (thumb praticamente
      quadrado) e `cursor: crosshair` sobre a barra. O !important é necessário
      porque aquele <style> é injetado pelo provider DEPOIS deste arquivo no
      documento — sem ele, mesma especificidade, e quem vem por último vence.
   ------------------------------------------------------------------------- */
* {
    scrollbar-width: thin;
    scrollbar-color: var(--mud-palette-lines-inputs) transparent;
}
::-webkit-scrollbar {
    cursor: default !important;
}
::-webkit-scrollbar-thumb {
    border-radius: 8px !important;
}

/* -------------------------------------------------------------------------
   Login (LoginView) — réplica do LoginWindow do WPF: card dividido em dois
   painéis (marca à esquerda, formulário à direita), título/botão no AZUL do
   login (#4154F1), independente do verde do tema do app. Um head só de login,
   então cores próprias por classe (não pela paleta do tema).
   ------------------------------------------------------------------------- */
.sis-login-bg {
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 100vh;
    padding: 16px;
    background: var(--mud-palette-background);
    position: relative;
}
.sis-login-card {
    display: flex;
    width: 720px;
    max-width: 100%;
    min-height: 440px;
    border-radius: 14px !important;
    overflow: hidden;
}

/* ⛔ As classes do modo FRAMESS do login (.sis-login-bg--frameless, .sis-login-dragbar, .sis-login-winctl,
   .sis-login-winbtn*) foram APAGADAS em 2026-07-27, junto com o markup que as usava. Elas serviam a janela sem
   moldura do head WPF, que já não existe — nenhum head passava `Frameless`, então eram estilo morto de um
   componente morto. Controle de janela não pertence à RCL compartilhada: ver a nota no LoginView.razor. */

/* Painel esquerdo (marca): fundo claro levemente distinto do branco do form. */
.sis-login-brand {
    flex: 0 0 42%;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 32px 24px;
    background: #f4f6f9;
    border-right: 1px solid #e6e9ef;
}
.sis-login-logo {
    width: 200px;
    max-width: 80%;
    height: auto;
    object-fit: contain;
}
.sis-login-social.mud-icon-button {
    border: 1px solid #b9bec9;
    color: #3f3f3f;
    width: 44px;
    height: 44px;
}
.sis-login-social.mud-icon-button:hover {
    background-color: #e8eaee;
    color: #000;
}
/* Ação secundária do login: "Endereço do servidor" (só nos heads que registram a IApiEndpointFacade — os apps
   locais do ERP). Herda a forma do antigo "Configurar Conexão", que caiu em 2026-07-26: a regra continua sendo
   discreta, arredondada e em caixa normal, para não competir com o botão Login. */
.sis-login-endpoint.mud-button-root {
    border-radius: 20px;
    text-transform: none;
    border-color: #b9bec9;
    color: #3f3f3f;
}
/* Painel direito (formulário): branco, campos e ações centrados. */
.sis-login-form {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    justify-content: center;
    padding: 40px 48px;
    background: #ffffff;
}
.sis-login-title {
    font-size: 2.25rem;
    font-weight: 700;
    text-align: center;
    color: #4154f1;             /* azul do login (WPF) */
    line-height: 1.1;
}
.sis-login-subtitle {
    font-size: 1rem;
    text-align: center;
    color: #878787;
    margin-top: 6px;
    margin-bottom: 8px;
}
/* Texto dos campos SEMPRE escuro. O painel do formulário é branco cravado (independe do tema claro/escuro do
   app), mas o texto digitado, o rótulo e os ícones dos campos herdam --mud-palette-text-primary do tema — que
   no tema ESCURO é branco, sumindo no branco do painel. Forço escuro aqui (o rótulo em foco continua azul,
   pela regra mais específica logo abaixo). */
.sis-login-form .mud-input-slot,
.sis-login-form .mud-input-root,
.sis-login-form .mud-input-label,
.sis-login-form .mud-input-adornment .mud-icon-root {
    color: #1f2430 !important;
}
.sis-login-form .mud-input-slot::placeholder {
    color: #9aa1ad !important;
}
/* Foco dos campos do login em AZUL (#4154F1), não no verde do tema do app — o acento do login WPF. */
.sis-login-form .mud-input.mud-input-underline::after {
    border-bottom-color: #4154f1 !important;
}
.sis-login-form .mud-input-control.mud-focused .mud-input-label,
.sis-login-form .mud-input.mud-focused ~ .mud-input-label {
    color: #4154f1 !important;
}
/* Botão Login: pílula azul, cores próprias (o tema do app é verde). */
.sis-login-btn.mud-button-root {
    background-color: #4154f1;
    color: #fff;
    border-radius: 24px;
    text-transform: none;
    font-weight: 600;
    min-width: 200px;
    padding: 10px 24px;
    box-shadow: 0 2px 8px rgba(65, 84, 241, 0.30);
}
.sis-login-btn.mud-button-root:hover:not(:disabled) {
    background-color: #3244d6;
}
.sis-login-btn.mud-button-root:disabled {
    background-color: #bdbdbd;
    color: #757575;
    box-shadow: none;
}

/* Mobile: o card empilha e o painel de marca some (d-none d-sm-flex no markup). */
@media (max-width: 599.98px) {
    .sis-login-card {
        width: 100%;
        min-height: 0;
    }
    .sis-login-form {
        padding: 32px 24px;
    }
}

/* -------------------------------------------------------------------------
   SPLASH (tela de abertura) — mesmo espírito do login: card claro, sem moldura
   (a janela é arredondada pelo DWM/Win11). Mostrada no boot, antes do login.
   ------------------------------------------------------------------------- */
.sis-splash-bg {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 100vh;
    background: #ffffff;
}
.sis-splash-card {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 32px 48px;
    text-align: center;
}
.sis-splash-logo {
    width: 260px;
    max-width: 72%;
    height: auto;
    object-fit: contain;
    margin-bottom: 8px;
}
.sis-splash-text {
    font-size: 1rem;
    color: #878787;
    margin-top: 6px;
    margin-bottom: 20px;
}
.sis-splash-progress {
    width: 280px;
    max-width: 80%;
    height: 5px !important;
}
.sis-splash-progress .mud-progress-linear-bar {
    background-color: #4154f1 !important;   /* acento azul, igual ao login */
}

/* -------------------------------------------------------------------------
   BUSY OVERLAY (máscara + spinner de "ocupado") — o SisBusyOverlay do ShellLayout.
   Equivalente ao IsLoading do BaseForm legado: caixa central com spinner e rótulo opcional.
   ------------------------------------------------------------------------- */
.sis-busy-box {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 16px;
    padding: 24px 32px;
}
.sis-busy-label {
    color: #ffffff;
    font-size: 0.95rem;
    font-weight: 500;
    letter-spacing: 0.2px;
}

/* =========================================================================
   APPS DE CELULAR (garçom, Sis Food, Força de Vendas) — mobile-first.

   Estas regras existem porque estas são as superfícies do sis operadas em
   celular na mão, em pé, durante o serviço: alvo de toque grande, nada de
   conteúdo essencial abaixo da dobra, e respeito ao notch/gesture bar (o
   index.html de cada head declara viewport-fit=cover, mas quem consome os
   env(safe-area-inset-*) é este arquivo — sem isto a barra superior fica sob o
   relógio/status bar e a barra de ação sob o indicador de home).

   ⚠️ viewport-fit=cover SEM estas regras é PIOR que não tê-lo: ele manda o
   conteúdo ocupar a tela inteira, incluindo o que fica embaixo das barras do
   sistema. Foi exatamente esse o defeito da Força de Vendas (2026-07-28) — o
   head declarava cover, nenhuma regra consumia os insets, e a barra superior
   nascia por baixo do relógio do Android, com o toque indo para a status bar
   em vez do botão. O Android nativo dos dois apps é IDÊNTICO (mesmo
   MainActivity, mesmo manifesto): a diferença era só a ausência do seletor
   abaixo. É por isso que os shells dividem a MESMA regra em vez de cada app
   ter a sua cópia — cópia é como um deles volta a ficar para trás.

   Todo env(...) tem fallback 0px: no desktop e no WebView do MAUI as regras
   degradam exatamente para o layout de antes.
   ========================================================================= */

/* Casca: a barra fina desce abaixo do notch e o conteúdo acompanha. */
.sis-waiter-shell .mud-appbar,
.sis-fv-shell .mud-appbar {
    padding-top: env(safe-area-inset-top, 0px);
    height: calc(var(--mud-appbar-height, 48px) + env(safe-area-inset-top, 0px));
}

.sis-waiter-shell .mud-main-content,
.sis-fv-shell .mud-main-content {
    padding-top: calc(var(--mud-appbar-height, 48px) + env(safe-area-inset-top, 0px));
}

/* O drawer é overlay de altura inteira: sem isto o cabeçalho do menu (nome do
   vendedor) nasce embaixo do relógio. Só a Força de Vendas tem drawer — o
   garçom e o Sis Food são de uma tela só. */
.sis-fv-shell .mud-drawer {
    padding-top: env(safe-area-inset-top, 0px);
}

/* Snackbar ancorado embaixo (PositionClass = BottomRight em AddSisUi): a
   mensagem nascia METADE embaixo da barra de navegação do Android — e o botão
   de fechar junto. Regra GLOBAL, e não por shell, porque o provider é montado
   FORA do MudLayout (no SisThemeProvider), então nenhum seletor de casca o
   alcança. Nos heads de desktop o env() vale 0px e nada muda. */
.mud-snackbar-location-bottom-left,
.mud-snackbar-location-bottom-center,
.mud-snackbar-location-bottom-right {
    padding-bottom: env(safe-area-inset-bottom, 0px);
}

/* Área de trabalho da Força de Vendas. O padding-bottom cobre a faixa de
   gestos; nas telas que têm barra de ação fixa própria (o editor de pedido) ela
   soma folga de rolagem, o que é inofensivo — o contrário, faltar, esconde o
   último item da lista atrás da barra do sistema. */
.sis-fv-content {
    padding: 8px 8px calc(24px + env(safe-area-inset-bottom, 0px)) 8px;
    min-height: 100%;
}

/* Área de trabalho: padding lateral menor no celular (cada pixel conta na
   largura do card) e folga inferior para a barra de ação fixa não cobrir o
   último item da lista. */
.sis-waiter-content {
    padding: 12px 12px calc(96px + env(safe-area-inset-bottom, 0px)) 12px;
    min-height: 100%;
}

@media (min-width: 600px) {
    .sis-waiter-content {
        padding: 20px 20px calc(104px + env(safe-area-inset-bottom, 0px)) 20px;
    }
}

/* -------------------------------------------------------------------------
   Card de comanda do board
   -------------------------------------------------------------------------
   O card ANTIGO era um retângulo de cor chapada (laranja/cinza/vermelho) com
   TODO o texto branco por cima, em duas linhas de flex com MudSpacer. Em
   telefone (3 colunas fixas, ~100px de largura útil) "A enviar" e "R$ 58,00"
   dividiam a mesma linha e se sobrepunham — era o "texto fora do card" do
   relato. Além disso branco sobre #FF9800 dá ~2,1:1 de contraste (WCAG AA pede
   4,5:1).

   O card novo é Material: superfície do tema + faixa de acento colorida à
   esquerda + chip de status na cor. A cor continua legível do outro lado do
   salão (é o ponto do board), mas o texto fica sobre a superfície, com
   contraste do tema, e cada informação em sua própria linha. */
.sis-tab-card {
    position: relative;
    display: flex;
    flex-direction: column;
    /* align-items explícito: o Chrome aplica `align-items: center` na UA stylesheet de <button>, o que
       encolhia e centralizava as linhas internas em vez de esticá-las na largura do card. */
    align-items: stretch;
    gap: 6px;
    width: 100%;
    height: 100%;
    padding: 12px 12px 12px 18px;
    border: 1px solid var(--mud-palette-lines-default);
    border-left: 6px solid var(--sis-tab-accent, var(--mud-palette-primary));
    border-radius: var(--mud-default-borderradius, 12px);
    background-color: var(--mud-palette-surface);
    color: var(--mud-palette-text-primary);
    text-align: left;
    cursor: pointer;
    transition: transform .12s ease, box-shadow .12s ease, background-color .12s ease;
    -webkit-tap-highlight-color: transparent;
}

.sis-tab-card:hover,
.sis-tab-card:focus-visible {
    background-color: color-mix(in srgb, var(--sis-tab-accent, var(--mud-palette-primary)) 10%, var(--mud-palette-surface));
    box-shadow: 0 2px 10px rgba(0, 0, 0, .35);
    outline: none;
}

.sis-tab-card:active {
    transform: scale(.98);
}

/* Número da comanda: a informação que o garçom procura primeiro. */
.sis-tab-card__number {
    font-size: 1.75rem;
    font-weight: 700;
    line-height: 1.1;
}

/* Tempo aberto — discreto, à direita do número. */
.sis-tab-card__elapsed {
    font-size: .75rem;
    color: var(--mud-palette-text-secondary);
    white-space: nowrap;
}

/* Chip de status: é ele que carrega a cor do estado (a mesma da legenda). */
.sis-tab-card__status {
    display: inline-flex;
    align-items: center;
    gap: 5px;
    align-self: flex-start;
    max-width: 100%;
    padding: 2px 8px;
    border-radius: 999px;
    font-size: .7rem;
    font-weight: 600;
    line-height: 1.5;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    background-color: color-mix(in srgb, var(--sis-tab-accent) 22%, transparent);
    color: var(--sis-tab-accent);
}

/* Total: linha própria, alinhado à direita, nunca disputando espaço com o
   status (era exatamente essa disputa que quebrava o layout). */
.sis-tab-card__total {
    margin-top: auto;
    font-size: 1.05rem;
    font-weight: 700;
    text-align: right;
    white-space: nowrap;
}

/* Ponto colorido da legenda. */
.sis-legend-dot {
    display: inline-block;
    width: 12px;
    height: 12px;
    border-radius: 4px;
    flex: 0 0 auto;
}

/* -------------------------------------------------------------------------
   Barra de ação fixa no rodapé (workspace e lançamento)
   -------------------------------------------------------------------------
   No celular as ações principais ficavam no TOPO, acima da lista de itens: com
   a comanda cheia o garçom precisava rolar de volta pra salvar. Fixa no
   rodapé, ficam sempre no alcance do polegar. */
.sis-waiter-actionbar {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    z-index: 1200;
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 10px 12px calc(10px + env(safe-area-inset-bottom, 0px)) 12px;
    background-color: var(--mud-palette-surface);
    border-top: 1px solid var(--mud-palette-lines-default);
    box-shadow: 0 -2px 12px rgba(0, 0, 0, .35);
}

.sis-waiter-actionbar .mud-button-root {
    min-height: 48px;   /* alvo de toque mínimo recomendado */
}

/* -------------------------------------------------------------------------
   Faixa de MODO DEMONSTRAÇÃO
   -------------------------------------------------------------------------
   Largura inteira, no topo do conteúdo, `sticky` — e isso é decisão, não
   inércia. Em 2026-07-26 eu a troquei por um ícone pequeno no rodapé e o
   dono corrigiu: o que ele pediu para virar ícone foi o botão de ENTRAR na
   demonstração, no LOGIN. O AVISO de que se está nela continua sendo faixa,
   porque ele existe justamente para não passar despercebido — sem ele
   alguém olha um total (ou uma comanda) fictício e acha que é real.

   Virou classe compartilhada aqui em vez dos dois blocos de `style` inline
   que existiam antes: um lugar só, os dois apps, e a regra do repo de que
   estilo de componente da RCL mora no sis-theme.css (o .razor.css não
   carrega em host nenhum). */
.sis-demo-banner {
    position: sticky;

    /* ⚠️ `top: 0` NÃO funcionava, e isso passou despercebido desde que a faixa nasceu: sticky ancora no
       VIEWPORT, e o viewport começa atrás da MudAppBar, que é `fixed`. Ao rolar, a faixa "grudava" debaixo
       da barra e sumia de vista — exatamente o cenário em que ela precisa estar (o total fictício aparece
       ao rolar). Só apareceu numa captura com a tela rolada; nenhum teste pegaria, porque `position:sticky`
       estava lá e o elemento estava no DOM.

       48px é a altura da MudAppBar `Dense`, que os dois apps usam; o `env()` cobre o notch do garçom, cuja
       casca desce a barra pelo inset (sis-waiter-shell). */
    top: calc(48px + env(safe-area-inset-top, 0px));

    z-index: 5;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: .5rem;
    width: 100%;
    border: 0;
    cursor: pointer;
    padding: .35rem .5rem;
    font-size: .75rem;
    font-weight: 600;
    letter-spacing: .03em;
    background-color: var(--mud-palette-warning);
    color: var(--mud-palette-warning-text);
}

/* -------------------------------------------------------------------------
   Ícone de "ver demonstração" no LOGIN
   -------------------------------------------------------------------------
   Era um botão de largura inteira embaixo do "Entrar", com legenda. O dono
   pediu ícone (2026-07-26): quem loga todo dia não precisa da vitrine
   ocupando o mesmo peso visual da ação principal.

   Fica na MESMA linha do alternador de tema, no rodapé do cartão de login —
   é onde já moram as ações secundárias da tela. */
.sis-demo-login-icon {
    color: var(--mud-palette-warning);
}

/* FAB de "abrir comanda" — acima da barra de ação e do inset inferior. */
.sis-waiter-fab {
    position: fixed;
    right: 16px;
    bottom: calc(20px + env(safe-area-inset-bottom, 0px));
    z-index: 1210;
}

/* -------------------------------------------------------------------------
   Faixa de categorias do lançamento
   -------------------------------------------------------------------------
   Eram cartões de 110px com quebra de linha: no telefone ocupavam TRÊS linhas
   (~450px) antes do primeiro produto aparecer. Vira uma faixa de rolagem
   horizontal — padrão Material de "filter chips" — e o produto sobe pra área
   visível. */
.sis-cat-strip {
    display: flex;
    gap: 8px;
    overflow-x: auto;
    overflow-y: hidden;
    padding-bottom: 6px;
    scrollbar-width: thin;
    -webkit-overflow-scrolling: touch;
    scroll-snap-type: x proximity;
}

.sis-cat-strip::-webkit-scrollbar {
    height: 4px;
}

.sis-cat-strip::-webkit-scrollbar-thumb {
    background-color: var(--mud-palette-lines-default);
    border-radius: 4px;
}

.sis-cat-chip {
    /* Coluna EXPLÍCITA: o Chrome trata a caixa de conteúdo de um <button> como flex row, então os dois
       <span> ficavam lado a lado mesmo declarados display:block. */
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    justify-content: center;
    flex: 0 0 auto;
    scroll-snap-align: start;
    min-width: 104px;
    padding: 8px 14px;
    border-radius: 999px;
    border: 2px solid transparent;
    cursor: pointer;
    line-height: 1.25;
    text-align: left;
    -webkit-tap-highlight-color: transparent;
}

.sis-cat-chip--selected {
    border-color: var(--mud-palette-primary);
}

.sis-cat-chip__name {
    display: block;   /* nome em cima, contagem embaixo — sem depender de utilitário do MudBlazor */
    font-size: .875rem;
    font-weight: 600;
    white-space: nowrap;
}

.sis-cat-chip__count {
    display: block;
    font-size: .7rem;
    opacity: .75;
    white-space: nowrap;
}

/* -------------------------------------------------------------------------
   Card de produto do lançamento
   ------------------------------------------------------------------------- */
.sis-product-card {
    display: flex;
    flex-direction: column;
    justify-content: space-between;
    align-items: stretch;   /* idem .sis-tab-card: neutraliza o align-items: center do <button> */
    gap: 8px;
    width: 100%;
    height: 100%;
    min-height: 92px;
    padding: 12px;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius, 12px);
    background-color: var(--mud-palette-surface);
    color: var(--mud-palette-text-primary);
    text-align: left;
    cursor: pointer;
    transition: border-color .12s ease, transform .12s ease;
    -webkit-tap-highlight-color: transparent;
}

.sis-product-card:hover,
.sis-product-card:focus-visible {
    border-color: var(--mud-palette-primary);
    outline: none;
}

.sis-product-card:active {
    transform: scale(.98);
}

.sis-product-card__name {
    font-size: .875rem;
    line-height: 1.25;
    /* Nome longo ocupa até 3 linhas e vira reticências — não estica o card nem
       vaza pra fora dele. */
    display: -webkit-box;
    -webkit-line-clamp: 3;
    line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

.sis-product-card__price {
    font-size: .95rem;
    font-weight: 700;
    color: var(--mud-palette-primary);
    white-space: nowrap;
}

/* -------------------------------------------------------------------------
   Linha de item da comanda (workspace e resumo do lançamento)
   ------------------------------------------------------------------------- */
.sis-tab-item {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 10px 4px;
}

.sis-tab-item__qty {
    flex: 0 0 auto;
    min-width: 38px;
    padding: 2px 6px;
    border-radius: 8px;
    background-color: color-mix(in srgb, var(--mud-palette-primary) 18%, transparent);
    color: var(--mud-palette-primary);
    font-size: .8rem;
    font-weight: 700;
    text-align: center;
}

.sis-tab-item__body {
    flex: 1 1 auto;
    min-width: 0;   /* deixa o texto longo quebrar em vez de empurrar o preço pra fora */
}

/* Link de observação, logo abaixo da descrição do item (app do garçom). Compacto e numa linha só: a linha
   de item divide 390px com quantidade, preço e dois botões de 30px, e um rótulo que quebra empurra a altura
   de TODAS as linhas da comanda. */
.sis-tab-item__note-action {
    min-width: 0;
    height: 28px;
    white-space: nowrap;
    text-transform: none;
    font-size: .78rem;
}

.sis-tab-item__total {
    flex: 0 0 auto;
    font-weight: 700;
    white-space: nowrap;
}

/* =========================================================================
   RESTAURANTE — tela de gerência (RestaurantPage e subtelas), tema Food.

   Segue o vocabulário fixado pelo redesenho do PDV (2026-07-25): card como
   unidade de superfície, hierarquia de botão (tonais + UM sólido, o que fecha
   a conta), container tonal via rgba(var(--mud-palette-*-rgb), a) — nenhum
   hexadecimal cravado, para o tema continuar sendo a fonte única da cor.
   ========================================================================= */

/* Abas "Mesas"/"Venda rápida": o MudTabs força CAIXA ALTA por conta própria,
   ignorando o TextTransform="none" da tipografia do tema. */
.sis-restaurant-tabs .mud-tab {
    text-transform: none;
    font-weight: 600;
}

/* Respiro lateral PRÓPRIO da tela, em vez de depender do padding do host.
   O FoodHost do WPF dá pa-2 (8px) e o painel de inspeção dava menos ainda: o
   total do cabeçalho e o "Fechar conta" ficavam colados na quina da viewport.
   Com o padding aqui, a tela fica correta em qualquer host que a monte. */
.sis-restaurant-tabs .mud-tabs-panels {
    padding-inline: clamp(8px, 1.5vw, 20px);
}

/* -------------------------------------------------------------------------
   Cabeçalho de comanda (workspace e fechamento)
   -------------------------------------------------------------------------
   O total ficava na MESMA linha de flex do título e dos chips, empurrado por
   um MudSpacer. Abaixo de ~1100px isso o encostava na borda — em 820px ele
   saía cortado, junto com o "Fechar conta". Agora título e total são blocos
   independentes que quebram em coluna quando não cabem. */
.sis-tab-header {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px 16px;
    margin-bottom: 16px;
}

.sis-tab-header__id {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
    min-width: 0;   /* deixa os chips encolherem em vez de empurrar o total */
}

.sis-tab-header__total {
    margin-left: auto;
    text-align: right;
    white-space: nowrap;
}

.sis-tab-header__total-label {
    display: block;
    font-size: .75rem;
    color: var(--mud-palette-text-secondary);
    line-height: 1.2;
}

.sis-tab-header__total-value {
    display: block;
    font-size: clamp(1.25rem, 2.2vw, 1.75rem);
    font-weight: 700;
    color: var(--mud-palette-primary);
    line-height: 1.2;
}

/* -------------------------------------------------------------------------
   Barra de ações da comanda
   -------------------------------------------------------------------------
   Eram SETE botões numa linha de flex com MudSpacer: quebravam em duas
   fileiras e deixavam o "Fechar conta" órfão na ponta, colado na borda. Agora
   as ações secundárias vivem num grupo que rola/quebra por conta própria e a
   ação primária (única sólida) fica ancorada à direita, nunca cortada. */
.sis-tab-actions {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    margin-bottom: 16px;
}

.sis-tab-actions__group {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 8px;
    min-width: 0;
    flex: 1 1 auto;
}

.sis-tab-actions__primary {
    flex: 0 0 auto;
    margin-left: auto;
}

/* Ícone dentro de botão/chip nunca encolhe nem vira elipse. */
.sis-tab-actions .mud-icon-root,
.sis-tab-header .mud-icon-root {
    flex: 0 0 auto;
}

/* -------------------------------------------------------------------------
   Card de mesa do board da gerência
   -------------------------------------------------------------------------
   O card usava min-height cravado em três pontos (20px no nome, 60px na
   prévia de itens) só para os cards de uma linha terminarem na mesma altura —
   o que o grid já faz com height:100% + flex. E não havia indicação nenhuma
   de estado: mesa com item pendente de cozinha era idêntica a mesa com tudo
   enviado. A faixa de acento resolve os dois. */
.sis-table-card {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 8px;
    width: 100%;
    height: 100%;
    padding: 14px 14px 14px 18px;
    border: 1px solid var(--mud-palette-lines-default);
    border-left: 6px solid var(--sis-table-accent, var(--mud-palette-lines-default));
    border-radius: var(--mud-default-borderradius, 12px);
    background-color: var(--mud-palette-surface);
    color: var(--mud-palette-text-primary);
    text-align: left;
    cursor: pointer;
    transition: background-color .12s ease, box-shadow .12s ease;
    -webkit-tap-highlight-color: transparent;
}

.sis-table-card:hover,
.sis-table-card:focus-visible {
    background-color: color-mix(in srgb, var(--sis-table-accent, var(--mud-palette-primary)) 10%, var(--mud-palette-surface));
    box-shadow: 0 2px 10px rgba(0, 0, 0, .35);
    outline: none;
}

.sis-table-card__top {
    display: flex;
    align-items: center;
    gap: 8px;
    min-width: 0;
}

.sis-table-card__number {
    font-size: 1.6rem;
    font-weight: 700;
    line-height: 1.1;
    color: var(--mud-palette-primary);
}

.sis-table-card__meta {
    margin-left: auto;
    display: flex;
    align-items: center;
    gap: 6px;
    font-size: .75rem;
    color: var(--mud-palette-text-secondary);
    white-space: nowrap;
}

.sis-table-card__name {
    font-size: .8rem;
    color: var(--mud-palette-text-secondary);
    /* Sem min-height: o alinhamento entre cards vem do height:100% + flex. */
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* Entregador do delivery, logo abaixo do cliente. Nome longo trunca em vez de
   alargar o card — o board é uma grade, e um card mais largo desalinha a linha. */
.sis-table-card__courier {
    display: flex;
    align-items: center;
    gap: 4px;
    font-size: .78rem;
    /* Texto no tom do CORPO, não no azul do info: nome de gente é informação que se
       lê, e #2196F3 sobre a superfície branca dá ~3:1 — abaixo do que a WCAG AA pede
       para texto pequeno. O azul fica só no ícone, que é decorativo. */
    color: var(--mud-palette-text-primary);
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.sis-table-card__courier .mud-icon-root {
    font-size: .95rem;
    flex: 0 0 auto;
    color: var(--mud-palette-info);
}

/* Ainda não saiu com ninguém: mesma linha, tom mais quieto e itálico. Não é alerta —
   pedido recém-aberto não tem entregador e isso é normal; o que se quer é poder
   varrer o board e ver quais já saíram. */
.sis-table-card__courier--none,
.sis-table-card__courier--none .mud-icon-root {
    color: var(--mud-palette-text-secondary);
    font-style: italic;
}

/* ORIGEM da comanda: veio de um canal externo (iFood, delivery direto…). Mesma
   geometria da linha do entregador — as duas respondem "de onde / para onde", são
   lidas na mesma varredura vertical do card, e alinhá-las evita criar um segundo
   eixo visual para dizer a mesma classe de coisa.

   Tom SECUNDÁRIO, e não a cor da marca do canal: o vermelho do iFood competiria
   com o vermelho de atraso/erro, que no board já significa outra coisa. Origem é
   contexto, não alerta — quem precisa reagir tem o selo de pronto e o contador da
   cozinha. O ícone Hub é o que distingue esta linha da do entregador sem gritar. */
.sis-table-card__origin {
    display: flex;
    align-items: center;
    gap: 4px;
    font-size: .78rem;
    color: var(--mud-palette-text-secondary);
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.sis-table-card__origin .mud-icon-root {
    font-size: .95rem;
    flex: 0 0 auto;
    color: var(--mud-palette-secondary);
}

/* Contador de itens PRONTOS na cozinha, no rodapé do card. Cor de sucesso na
   borda e no texto, fundo translúcido: chama o olho sem virar um bloco chapado
   competindo com o total (que é o número mais importante do card). */
.sis-table-card__ready {
    display: inline-flex;
    align-items: center;
    gap: 3px;
    padding: 1px 6px;
    border: 1px solid var(--mud-palette-success);
    border-radius: 999px;
    font-size: .72rem;
    font-weight: 600;
    line-height: 1.5;
    color: var(--mud-palette-success);
    background-color: color-mix(in srgb, var(--mud-palette-success) 12%, transparent);
}

.sis-table-card__ready .mud-icon-root {
    font-size: .9rem;
}

/* Prévia dos itens: cresce e empurra o rodapé do card pra baixo, o que
   alinha os totais de todos os cards da linha sem altura cravada. */
.sis-table-card__items {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    gap: 2px;
    font-size: .75rem;
    color: var(--mud-palette-text-primary);
}

.sis-table-card__items span {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.sis-table-card__foot {
    display: flex;
    align-items: center;
    gap: 8px;
    padding-top: 8px;
    border-top: 1px solid var(--mud-palette-lines-default);
}

.sis-table-card__total {
    margin-left: auto;
    font-size: 1.05rem;
    font-weight: 700;
    color: var(--mud-palette-primary);
    white-space: nowrap;
}

/* Selo de estado: tinta do próprio acento, como no PDV (container tonal). */
.sis-table-card__status {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 2px 8px;
    border-radius: 999px;
    font-size: .68rem;
    font-weight: 600;
    white-space: nowrap;
    background-color: color-mix(in srgb, var(--sis-table-accent) 22%, transparent);
    color: var(--sis-table-accent);
}

/* -------------------------------------------------------------------------
   Fechamento (CheckoutPanel)
   ------------------------------------------------------------------------- */

/* Linha de resultado (Total / Falta / Troco): rótulo e valor sem disputa. */
.sis-checkout-line {
    display: flex;
    align-items: baseline;
    gap: 12px;
    margin-bottom: 12px;
}

.sis-checkout-line__label {
    font-size: .8rem;
    font-weight: 600;
    letter-spacing: .04em;
    text-transform: uppercase;   /* a CAIXA ALTA é estilo, não conteúdo */
    color: var(--mud-palette-text-secondary);
}

.sis-checkout-line__value {
    margin-left: auto;
    font-weight: 700;
    white-space: nowrap;
    font-size: clamp(1.1rem, 2vw, 1.6rem);
}

.sis-checkout-line--total .sis-checkout-line__value { color: var(--mud-palette-primary); }
.sis-checkout-line--due .sis-checkout-line__label,
.sis-checkout-line--due .sis-checkout-line__value { color: var(--mud-palette-warning); }
.sis-checkout-line--change .sis-checkout-line__label,
.sis-checkout-line--change .sis-checkout-line__value { color: var(--mud-palette-success); }

/* Botão de forma de pagamento: ícone em círculo tonal, como o PDV. */
.sis-payment-card {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 6px;
    width: 100%;
    height: 100%;
    min-height: 88px;
    padding: 12px 8px;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius, 12px);
    background-color: var(--mud-palette-surface);
    color: var(--mud-palette-text-primary);
    cursor: pointer;
    transition: border-color .12s ease, background-color .12s ease;
    -webkit-tap-highlight-color: transparent;
}

.sis-payment-card:hover:not(:disabled),
.sis-payment-card:focus-visible {
    border-color: var(--mud-palette-primary);
    background-color: rgba(var(--mud-palette-primary-rgb), .08);
    outline: none;
}

.sis-payment-card:disabled {
    opacity: .5;
    cursor: default;
}

.sis-payment-card__icon {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 36px;
    height: 36px;
    border-radius: 50%;
    background-color: rgba(var(--mud-palette-primary-rgb), .14);
}

.sis-payment-card__label {
    font-size: .75rem;
    line-height: 1.2;
    text-align: center;
}

/* -------------------------------------------------------------------------
   Venda rápida — estado inicial
   ------------------------------------------------------------------------- */
.sis-quicksale-empty {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 12px;
    padding: clamp(24px, 6vw, 64px) 16px;   /* era pa-12 fixo */
    text-align: center;
}

/* Mesa LIVRE do mapa fixo: mesma geometria do card ocupado (a grade tem de ficar
   regular), mas sem preenchimento visual — o olho precisa varrer o salão e achar
   as ocupadas, não as vazias. Borda tracejada + conteúdo apagado dizem "aqui não
   tem nada" sem gritar. */
.sis-table-card--free {
    background-color: transparent;
    border-style: dashed;
    border-left-style: solid;   /* a faixa de acento continua sólida, como nas demais */
    opacity: .72;
}

.sis-table-card--free:hover,
.sis-table-card--free:focus-visible {
    opacity: 1;
    background-color: rgba(var(--mud-palette-primary-rgb), .06);
    border-color: var(--mud-palette-primary);
}

.sis-table-card--free .sis-table-card__number {
    color: var(--mud-palette-text-secondary);
}

/* "Abrir" no rodapé: a ação que o clique dispara, dita em palavra. */
.sis-table-card__free-hint {
    margin-left: auto;
    font-size: .75rem;
    font-weight: 600;
    color: var(--mud-palette-primary);
    white-space: nowrap;
}

/* -------------------------------------------------------------------------
   Visualizador de PDF (PdfViewer) e a execução do relatório do B.I.

   Mora AQUI, e não num PdfViewer.razor.css, porque CSS isolado não carrega em
   host nenhum (ver o cabeçalho deste arquivo). Isto não é preferência: com o
   estilo no arquivo isolado, o visualizador renderizava sem NADA — a barra de
   ações empilhada e o <iframe> no tamanho default do navegador (300x150), o
   que fazia a visualização do relatório do B.I. parecer quebrada.
   ------------------------------------------------------------------------- */
.sis-pdf-viewer {
    display: flex;
    flex-direction: column;
    height: 100%;
    min-height: 0;
    width: 100%;
    gap: 12px;
}

/* Cabeçalho: identidade do arquivo à esquerda, ações à direita. Superfície
   contornada (Material "outlined container"), não elevada — o destaque da tela
   é o documento, não a barra. */
.sis-pdf-viewer__bar {
    position: relative;
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 12px;
    padding: 10px 12px;
    overflow: hidden;   /* segura o MudProgressLinear dentro do canto arredondado */
}

.sis-pdf-viewer__id {
    display: flex;
    align-items: center;
    gap: 12px;
    min-width: 0;
}

/* Ícone em círculo tonal — mesma linguagem do .sis-payment-card do PDV. */
.sis-pdf-viewer__avatar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    width: 40px;
    height: 40px;
    border-radius: 50%;
    background-color: rgba(var(--mud-palette-error-rgb), .12);
    color: var(--mud-palette-error);
}

.sis-pdf-viewer__meta {
    display: flex;
    flex-direction: column;
    min-width: 0;
    line-height: 1.25;
}

.sis-pdf-viewer__filename {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    max-width: 38vw;
    font-weight: 600;
}

.sis-pdf-viewer__hint {
    color: var(--mud-palette-text-secondary);
}

.sis-pdf-viewer__actions {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
}

/* Ações secundárias (baixar/imprimir): caixa contornada discreta, mesma FORMA
   do .sis-row-action do grid — a geometria da ação de ícone é uma só no sis. */
.sis-pdf-viewer__ghost.mud-icon-button {
    width: 36px;
    height: 36px;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius, 8px);
    color: var(--mud-palette-text-secondary);
    background-color: transparent;
}

.sis-pdf-viewer__ghost.mud-icon-button:hover:not(:disabled) {
    background-color: rgba(var(--mud-palette-primary-rgb), .10);
    border-color: var(--mud-palette-primary);
    color: var(--mud-palette-primary);
}

/* Separador entre as ações secundárias e as principais: dá a hierarquia sem
   precisar de mais uma linha de texto. */
.sis-pdf-viewer__divider {
    width: 1px;
    align-self: stretch;
    margin: 2px 2px;
    background-color: var(--mud-palette-lines-default);
}

.sis-pdf-viewer__progress {
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 3px;
}

.sis-pdf-viewer__surface {
    position: relative;
    flex: 1 1 auto;
    min-height: 420px;   /* piso: dentro de um MudTabPanel a altura do pai é auto */
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius, 12px);
    overflow: hidden;
    background-color: var(--mud-palette-background-gray);
}

/* ⛔ NÃO troque por `height: 100%` — foi assim e o PDF aparecia cortado (2026-07-28).
   `height: 100%` resolve contra a ALTURA do pai, e `.sis-pdf-viewer__surface` declara
   `min-height`, não `height`. Percentual contra pai sem altura definida é indeterminado:
   o <iframe> cai na altura intrínseca padrão (150px) e o documento vira uma miniatura
   num retângulo vazio.

   Isso reapareceu em toda tela que embute o visualizador — B.I., pedido de venda — e a
   correção anterior foi dar altura à CADEIA por fora (`.sis-report-viewer`), tela a tela.
   Não é sustentável: a próxima tela nasce quebrada de novo.

   `position: absolute; inset: 0` preenche o pai posicionado sem depender da altura dele —
   é o mesmo que `.sis-pdf-viewer__empty` já fazia logo abaixo. O visualizador passa a ser
   autossuficiente, e quem o embute não precisa saber de nada. */
.sis-pdf-viewer__frame {
    position: absolute;
    inset: 0;
    display: block;
    width: 100%;
    height: 100%;
    border: 0;
}

.sis-pdf-viewer__empty {
    position: absolute;
    inset: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 12px;
    text-align: center;
    padding: 24px;
}

.sis-pdf-viewer__empty-icon.mud-icon-root {
    width: 56px;
    height: 56px;
    font-size: 56px;
    color: var(--mud-palette-text-disabled);
}

/* Tablet: o cabeçalho empilha e as ações ocupam a linha inteira. */
@media (max-width: 900px) {
    .sis-pdf-viewer__filename {
        max-width: 60vw;
    }

    .sis-pdf-viewer__actions {
        width: 100%;
    }

    .sis-pdf-viewer__actions .sis-pdf-viewer__action {
        flex: 1 1 auto;
    }
}

/* Celular: os rótulos saem (sobra o ícone), o separador some e o documento
   ganha praticamente a tela toda. */
@media (max-width: 600px) {
    .sis-pdf-viewer__action-label {
        display: none;
    }

    .sis-pdf-viewer__divider {
        display: none;
    }

    .sis-pdf-viewer__surface {
        min-height: 60vh;
    }
}

/* Execução do relatório do B.I.: o diálogo é FullScreen, então o conteúdo
   precisa esticar em coluna até o rodapé — senão o visualizador de PDF não tem
   altura nenhuma pra ocupar e o documento fica espremido no topo. */
.sis-report-viewer {
    display: flex;
    flex-direction: column;
    min-height: 0;
    height: 100%;
    padding-top: 8px;
}

.sis-report-viewer .mud-tabs,
.sis-report-viewer .mud-tabs-panels,
.sis-report-viewer .mud-tab-panel {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
}

.sis-report-viewer .mud-tabs-panels {
    overflow: auto;
}

/* O visualizador ocupa o que sobra da aba (a barra de ações tem altura própria).
   Fora de um pai flex, `flex` é ignorado — então isto não afeta os outros usos. */
.sis-pdf-viewer {
    flex: 1 1 auto;
}

/* Tabela de dados do relatório dentro de uma superfície contornada, com o
   cabeçalho grudado no topo na rolagem (relatório é feito pra ser lido de cima
   a baixo — perder o cabeçalho na linha 40 é perder o significado da coluna). */
.sis-report-table {
    flex: 1 1 auto;
    min-height: 0;
    overflow: auto;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius, 12px);
}

.sis-report-table table thead th {
    position: sticky;
    top: 0;
    z-index: 1;
    background-color: var(--mud-palette-background-gray);
    font-weight: 600;
    color: var(--mud-palette-text-secondary);
    text-transform: uppercase;
    font-size: .75rem;
    letter-spacing: .02em;
}

.sis-report-table .sis-report-group td {
    background-color: rgba(var(--mud-palette-primary-rgb), .10);
    color: var(--mud-palette-text-primary);
    font-weight: 600;
}

.sis-report-table .sis-report-subtotal td {
    background-color: var(--mud-palette-background-gray);
    font-weight: 600;
}

.sis-report-table .sis-report-total td {
    background-color: rgba(var(--mud-palette-primary-rgb), .14);
    font-weight: 700;
    border-top: 2px solid var(--mud-palette-primary);
}

/* =========================================================================
   Overlay de etapa (fechamento de venda, e o que vier depois)
   -------------------------------------------------------------------------
   É OUTRA TELA, não um diálogo: cobre a viewport inteira, com barra própria e
   corpo rolável. O molde é o `.pdv-overlay` do PDV varejo, que o dono apontou
   como o desenho certo pra receber dinheiro — a diferença é que aqui as cores
   vêm todas do tema (o overlay do PDV nasceu antes da unificação).

   Por que não MudDialog: diálogo carrega a promessa de "cabe numa caixa", e
   fechamento com várias formas + parcelas + troco não cabe. Foi exatamente o
   erro do VendaEditorDialog, em escala menor.
   ========================================================================= */
.sis-overlay {
    position: fixed;
    inset: 0;
    z-index: 1300;                       /* acima do conteúdo, abaixo do Snackbar do MudBlazor */
    display: flex;
    flex-direction: column;
    background-color: var(--mud-palette-background);
}

.sis-overlay__bar {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 12px 16px;
    border-bottom: 1px solid var(--mud-palette-lines-default);
    background-color: var(--mud-palette-surface);
}

.sis-overlay__title {
    font-weight: 600;
    letter-spacing: .04em;
    text-transform: uppercase;           /* CAIXA ALTA é estilo, não conteúdo */
}

.sis-overlay__body {
    flex: 1;
    min-height: 0;                       /* sem isto o filho rolável estoura o flex */
    overflow-y: auto;
    padding: 16px;
}

/* Grade de formas de pagamento: cresce com a largura sem quebrar em 1024x768,
   onde a coluna do overlay tem ~600px. auto-fill + minmax evita ter de escolher
   um número de colunas por breakpoint. */
.sis-payment-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
    gap: 12px;
}

/* Lançamento já feito, na lista do resumo. */
.sis-payment-entry {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 6px 0;
    border-bottom: 1px solid var(--mud-palette-lines-default);
}

.sis-payment-entry__name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sis-payment-entry__amount { margin-left: auto; font-weight: 600; white-space: nowrap; }

/* --------------------------------------------------------------------------
   Selo de andamento na COZINHA, na linha de item da comanda (.sis-tab-item).

   Substitui o ícone de impressora solto que só dizia "saiu do salão". As cores
   vêm da PALETA (sucesso/aviso/info), nunca de hexadecimal — o restaurante roda
   num tema escuro próprio e o escritório no claro/escuro do toggle, e um valor
   cravado só ficaria certo num dos três.

   O TEXTO some abaixo de 600px: no celular a linha de item tem quantidade,
   descrição, selo, preço e o botão de excluir disputando a mesma largura, e é o
   preço que começa a ser espremido. O ícone sozinho, com o tooltip, continua
   dizendo tudo.
   -------------------------------------------------------------------------- */
.sis-kitchen-chip {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    flex: 0 0 auto;
    padding: 1px 8px;
    border-radius: 999px;
    border: 1px solid currentColor;
    font-size: .72rem;
    font-weight: 600;
    line-height: 1.6;
    white-space: nowrap;
}

.sis-kitchen-chip .mud-icon-root {
    font-size: .9rem;
}

/* Na fila: quieto — é o estado normal de quem acabou de mandar o pedido. */
.sis-kitchen-chip--fila {
    color: var(--mud-palette-text-secondary);
}

.sis-kitchen-chip--preparo {
    color: var(--mud-palette-warning);
    background-color: color-mix(in srgb, var(--mud-palette-warning) 12%, transparent);
}

/* Pronto é o único com preenchimento mais forte: é o estado que pede AÇÃO
   (alguém tem de levar o prato). */
.sis-kitchen-chip--pronto {
    color: var(--mud-palette-success);
    background-color: color-mix(in srgb, var(--mud-palette-success) 18%, transparent);
}

.sis-kitchen-chip--entregue {
    color: var(--mud-palette-text-disabled);
}

@media (max-width: 599px) {
    .sis-kitchen-chip__text {
        display: none;
    }

    .sis-kitchen-chip {
        padding: 1px 4px;
    }
}

/* --------------------------------------------------------------------------
   Configuração do aviso de "prato pronto" (menu do cabeçalho das abas da
   gerência).

   Painel curto de propósito: são dois interruptores e uma frase. Configuração
   que vira formulário deixa de ser mexida.
   -------------------------------------------------------------------------- */
.sis-kitchen-alerts {
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.sis-kitchen-alerts__hint {
    color: var(--mud-palette-text-secondary);
    margin-bottom: 8px;
}

.sis-kitchen-alerts__switch {
    margin: 0;
}

/* Aviso de que os DOIS canais estão desligados. Fica em cor de atenção, e não
   em texto secundário, porque é o único ponto da tela que diz que o operador
   deixou de ser interrompido — descobrir isso com um prato frio no balcão é
   caro. */
.sis-kitchen-alerts__off {
    margin-top: 8px;
    color: var(--mud-palette-warning);
}

/* --------------------------------------------------------------------------
   KDS (terminal de cozinha): LISTA de pedidos em três abas, um card por pedido.

   O board de colunas por estado SAIU. A unidade passou a ser o PEDIDO (o lote de
   envio), e um pedido tem itens em estados diferentes — não cabe numa coluna só.

   ⚠️ Sem colunas, a POSIÇÃO não comunica mais o estado. Cor, chip e botão do
   rodapé viram informação crítica: são os três sinais que sobraram, e por isso
   estão redundantes de propósito.

   Alvos grandes e um toque por ação: a tela é operada com a mão suja e às vezes
   com luva. As cores vêm da paleta — o restaurante roda num tema escuro próprio.
   -------------------------------------------------------------------------- */
.sis-kds {
    display: flex;
    flex-direction: column;
    gap: 12px;
}

.sis-kds__bar {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 12px;
}

.sis-kds__scopes {
    display: flex;
    gap: 6px;
    flex-wrap: wrap;
}

/* Aba como botão, e não MudTabs: este controle é montado DENTRO do MudTabs da
   gerência, e MudTabs aninhado quebra os cabeçalhos dos dois. */
.sis-kds-scope {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 8px 16px;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: 999px;
    background-color: transparent;
    color: var(--mud-palette-text-secondary);
    font: inherit;
    font-weight: 600;
    font-size: .85rem;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
}

.sis-kds-scope:hover {
    background-color: color-mix(in srgb, var(--mud-palette-primary) 10%, transparent);
}

.sis-kds-scope--on {
    border-color: var(--mud-palette-primary);
    background-color: color-mix(in srgb, var(--mud-palette-primary) 18%, transparent);
    color: var(--mud-palette-primary);
}

.sis-kds-scope__count {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 20px;
    padding: 0 5px;
    border-radius: 999px;
    background-color: color-mix(in srgb, var(--mud-palette-primary) 28%, transparent);
    font-size: .72rem;
}

/* A espera do pedido mais antigo. Numa lista longa o card que importa pode estar
   fora da tela — é esta linha que diz "a cozinha atrasou" sem obrigar a rolar. */
.sis-kds__oldest {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    margin-left: auto;
    font-variant-numeric: tabular-nums;
    font-weight: 700;
    color: var(--mud-palette-text-secondary);
}

.sis-kds__oldest-label {
    font-weight: 400;
    font-size: .8rem;
}

.sis-kds__oldest--atraso {
    color: var(--mud-palette-error);
}

.sis-kds__empty {
    padding: 24px 4px;
    color: var(--mud-palette-text-disabled);
    font-size: .9rem;
    font-style: italic;
}

/* Grade fluida: um terminal de cozinha vai de um monitor 4K na parede a um tablet
   preso na bancada. `auto-fill` com mínimo em 300px cobre os dois sem media query. */
.sis-kds__list {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
    gap: 12px;
    align-items: start;
}

/* --sis-kds-accent é a cor do ESTADO: entra na faixa lateral e no chip. Faixa de
   acento, não fundo chapado — fundo colorido inteiro derruba o contraste do texto
   e faz o card competir com a observação, que é o que precisa gritar. */
.sis-kds-order {
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding: 12px 12px 12px 16px;
    border: 1px solid var(--mud-palette-lines-default);
    border-left: 6px solid var(--sis-kds-accent, var(--mud-palette-primary));
    border-radius: 10px;
    background-color: var(--mud-palette-surface);
    color: var(--mud-palette-text-primary);
}

.sis-kds-order--novo { --sis-kds-accent: var(--mud-palette-warning); }
.sis-kds-order--preparo { --sis-kds-accent: var(--mud-palette-info); }
.sis-kds-order--pronto { --sis-kds-accent: var(--mud-palette-success); }
.sis-kds-order--entregue { --sis-kds-accent: var(--mud-palette-text-disabled); }
.sis-kds-order--cancelado { --sis-kds-accent: var(--mud-palette-error); }

/* Atrasado engrossa a faixa e tinge o cronômetro. É o ÚNICO sinal que muda de cor
   além do estado — se tudo gritasse, nada gritaria. */
.sis-kds-order--atraso {
    border-left-width: 10px;
    --sis-kds-accent: var(--mud-palette-error);
}

.sis-kds-order--atraso .sis-kds-order__timer {
    color: var(--mud-palette-error);
}

/* NÃO quebra linha. Com `flex-wrap: wrap`, o chip e o número caíam para a segunda linha só em ALGUNS
   cards (depende do comprimento do nome da mesa), e o cabeçalho ficava com layout diferente card a card —
   o oposto do que se quer numa tela em que chip e número são a informação crítica. Quem cede espaço é o
   NOME da mesa, que trunca; o número nunca sai do canto direito. */
.sis-kds-order__head {
    display: flex;
    align-items: center;
    flex-wrap: nowrap;
    gap: 8px;
}

.sis-kds-order__table {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    font-weight: 700;
    font-size: 1rem;
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

.sis-kds-order__chip {
    display: inline-flex;
    align-items: center;
    flex: 0 0 auto;
    padding: 2px 10px;
    border-radius: 999px;
    background-color: color-mix(in srgb, var(--sis-kds-accent) 22%, transparent);
    color: var(--sis-kds-accent);
    font-size: .72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .03em;
    white-space: nowrap;
}

/* Número do pedido: é o que o cozinheiro grita e o que o garçom procura. Fica à
   direita, sozinho, para não disputar espaço com a mesa. */
.sis-kds-order__number {
    margin-left: auto;
    font-variant-numeric: tabular-nums;
    font-size: .82rem;
    color: var(--mud-palette-text-secondary);
    white-space: nowrap;
}

/* O cronômetro é a segunda linha do cabeçalho e é grande de propósito: é por ele
   que a cozinha prioriza, e ele é lido a metros de distância. */
.sis-kds-order__timer {
    font-size: 1.6rem;
    font-weight: 700;
    line-height: 1;
    font-variant-numeric: tabular-nums;
    color: var(--mud-palette-text-secondary);
}

.sis-kds-order__items {
    display: flex;
    flex-direction: column;
    gap: 4px;
    margin: 0;
    padding: 0;
    list-style: none;
}

.sis-kds-item {
    display: flex;
    align-items: flex-start;
    gap: 8px;
    width: 100%;
    padding: 8px;
    border: 1px solid transparent;
    border-radius: 8px;
    background-color: color-mix(in srgb, var(--mud-palette-text-primary) 5%, transparent);
    color: inherit;
    font: inherit;
    text-align: left;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
}

.sis-kds-item:hover:not(:disabled) {
    border-color: var(--mud-palette-lines-default);
}

.sis-kds-item:disabled {
    opacity: .6;
    cursor: default;
}

.sis-kds-item__qty {
    flex: 0 0 auto;
    min-width: 34px;
    font-weight: 700;
    font-variant-numeric: tabular-nums;
}

/* min-width:0 na cadeia: sem ele, descrição longa empurra o selo de estado para
   fora do card em vez de quebrar. */
.sis-kds-item__body {
    display: flex;
    flex-direction: column;
    gap: 2px;
    flex: 1 1 auto;
    min-width: 0;
}

.sis-kds-item__desc {
    overflow-wrap: anywhere;
}

.sis-kds-item__options {
    font-size: .78rem;
    color: var(--mud-palette-text-secondary);
}

/* Observação: o que faz o prato voltar quando passa despercebido. */
.sis-kds-item__note {
    font-size: .8rem;
    font-weight: 600;
    color: var(--mud-palette-warning);
}

.sis-kds-item__state {
    flex: 0 0 auto;
    align-self: center;
    padding: 1px 8px;
    border-radius: 999px;
    font-size: .68rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .03em;
    white-space: nowrap;
    background-color: color-mix(in srgb, var(--sis-kds-item-accent, var(--mud-palette-text-primary)) 18%, transparent);
    color: var(--sis-kds-item-accent, var(--mud-palette-text-secondary));
}

.sis-kds-item--fila { --sis-kds-item-accent: var(--mud-palette-text-secondary); }
.sis-kds-item--preparo { --sis-kds-item-accent: var(--mud-palette-info); }
.sis-kds-item--pronto { --sis-kds-item-accent: var(--mud-palette-success); }
.sis-kds-item--entregue { --sis-kds-item-accent: var(--mud-palette-text-disabled); }
.sis-kds-item--cancelado { --sis-kds-item-accent: var(--mud-palette-error); }

/* CANCELADO EM DESTAQUE (regra do dono, 2026-07-27).
   O item cancelado que CHEGA a renderizar é, por construção, um que a cozinha já começou — o cancelado
   que ninguém tocou é filtrado antes (ver KdsBoard.ItensVisiveis). Ou seja: alguém está com este prato
   na mão, e o sinal precisa ser NOTADO do outro lado da cozinha, com o board cheio.

   Por isso ele CANCELA o esmaecimento do :disabled — a linha herdava opacity:.6 e ficava mais discreta
   que as vivas, exatamente ao contrário do que a situação pede. Três sinais somados (faixa sólida, fundo
   tingido e selo sólido), porque um só se perde à distância; e tudo pela paleta (--mud-palette-error),
   nunca hexadecimal solto. */
.sis-kds-item--cancelado:disabled {
    opacity: 1;
}

.sis-kds-item--cancelado {
    border-color: var(--mud-palette-error);
    border-left-width: 4px;
    background-color: color-mix(in srgb, var(--mud-palette-error) 14%, transparent);
}

.sis-kds-item--cancelado .sis-kds-item__desc {
    text-decoration: line-through;
    font-weight: 700;
}

/* Selo SÓLIDO (o dos vivos é um tingido de 18%): é o que se lê primeiro à distância. */
.sis-kds-item--cancelado .sis-kds-item__state {
    background-color: var(--mud-palette-error);
    color: var(--mud-palette-error-text);
}

.sis-kds-order__reason {
    padding: 6px 8px;
    border-radius: 6px;
    background-color: color-mix(in srgb, var(--mud-palette-error) 12%, transparent);
    color: var(--mud-palette-error);
    font-size: .8rem;
    font-weight: 600;
}

.sis-kds-order__foot {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-top: 2px;
    padding-top: 8px;
    border-top: 1px dashed var(--mud-palette-lines-default);
}

.sis-kds-order__confirm {
    flex: 1 1 auto;
    min-width: 0;
    font-size: .82rem;
    font-weight: 600;
    color: var(--mud-palette-error);
}

/* Hierarquia de ação: UM sólido (o avanço, que é o gesto do turno inteiro) e o
   resto tonal. Dois botões sólidos lado a lado fariam "cancelar" parecer tão
   normal quanto "pronto". */
.sis-kds-btn {
    padding: 10px 16px;
    border: 1px solid transparent;
    border-radius: 8px;
    font: inherit;
    font-weight: 700;
    font-size: .85rem;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
}

.sis-kds-btn:disabled {
    opacity: .6;
    cursor: default;
}

.sis-kds-btn--primary {
    margin-left: auto;
    background-color: var(--mud-palette-primary);
    color: var(--mud-palette-primary-text);
}

.sis-kds-btn--ghost {
    background-color: transparent;
    border-color: var(--mud-palette-lines-default);
    color: var(--mud-palette-text-secondary);
}

.sis-kds-btn--danger {
    background-color: var(--mud-palette-error);
    color: var(--mud-palette-error-text, #fff);
}

/* ===================================================================================================
   Tutoriais interativos (SisTutorialHost / tutorial.js)

   Mora AQUI, e não num .razor.css: o bundle {Assembly}.styles.css não é referenciado por nenhum
   index.html do sis (WPF, WASM, Waiter, Mock), então CSS isolado não carrega em host nenhum — some
   junto com o layout, sem erro. Ver CLAUDE.md, "CSS isolado (.razor.css) NÃO carrega em host nenhum".

   Tudo usa variável de tema (--mud-palette-*), então claro e escuro saem de graça: nada de hexadecimal
   cravado, que é o que faria o cartão do tutorial ficar branco-no-branco no tema escuro.
   =================================================================================================== */

/* Camada do tour. Acima do drawer (1100) e do appbar (1300) do MudBlazor, porque o tour precisa destacar
   os DOIS; abaixo de diálogo modal (1400), pra não cobrir uma confirmação de verdade.

   ⚠️ `pointer-events: none` na CAMADA (o cartão reativa pra si): o tour é passivo e não pode sequestrar a
   tela. Com a camada capturando clique, o usuário não conseguia nem experimentar o botão que o passo está
   ensinando — e quem entrava pela primeira vez ficava travado até dispensar o tour. O defeito apareceu de
   forma inequívoca no E2E de outro cadastro, que passou a falhar com "sis-tour-overlay intercepts pointer
   events" num clique que nada tinha a ver com tutorial. */
.sis-tour-overlay {
    position: fixed;
    inset: 0;
    z-index: 1390;
    pointer-events: none;
}

/* O recorte: um elemento só, com sombra gigante fazendo o papel de máscara em volta. Quatro divs de
   máscara dariam o mesmo efeito e quatro oportunidades de dessincronizar em 1px. pointer-events:none
   deixa o clique passar — o usuário continua vendo (e podendo usar) o que está destacado. */
.sis-tour-spotlight {
    position: fixed;
    border-radius: 8px;
    pointer-events: none;
    box-shadow: 0 0 0 9999px rgba(0, 0, 0, .55),
                0 0 0 2px var(--mud-palette-primary);
    transition: left .18s ease, top .18s ease, width .18s ease, height .18s ease;
}

/* Realce no próprio elemento (classe posta pelo tutorial.js). Só o brilho — geometria e posição
   continuam sendo do layout da tela, que o tour não pode alterar. */
.sis-tour-target {
    position: relative;
    z-index: 1391;
}

.sis-tour-card {
    position: fixed;
    z-index: 1392;
    pointer-events: auto;   /* a camada é transparente ao clique; o cartão precisa receber os dele */
    width: 340px;
    max-width: calc(100vw - 24px);
    padding: 16px;
    border-radius: 12px;
    background: var(--mud-palette-surface);
    color: var(--mud-palette-text-primary);
    border: 1px solid var(--mud-palette-lines-default);
    box-shadow: 0 10px 30px rgba(0, 0, 0, .28);
}

/* Passo sem âncora (abertura/fechamento) — e também o fallback de quando nada coube na viewport. */
.sis-tour-card--centro {
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
}

.sis-tour-card-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 4px;
}

.sis-tour-card-contador {
    font-size: .75rem;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: var(--mud-palette-text-secondary);
}

.sis-tour-card-titulo {
    font-weight: 600;
    margin-bottom: 6px;
}

.sis-tour-card-texto {
    color: var(--mud-palette-text-secondary);
    margin-bottom: 12px;
}

.sis-tour-progresso {
    height: 3px;
    margin-bottom: 12px;
}

.sis-tour-card-acoes {
    display: flex;
    align-items: center;
    gap: 8px;
}

/* Em tela estreita o cartão vira faixa no rodapé: ancorar um cartão de 340px a um botão pequeno num
   celular joga metade dele pra fora, e é um defeito que só aparece no tamanho pequeno. */
@media (max-width: 600px) {
    .sis-tour-card,
    .sis-tour-card--centro {
        left: 12px !important;
        right: 12px;
        top: auto !important;
        bottom: calc(12px + env(safe-area-inset-bottom, 0px)) !important;
        width: auto !important;
        transform: none !important;
    }
}

/* ==========================================================================
   Campo de busca com registro vinculado (SisLookupField / SisLookupSearchDialog)
   Ver CLAUDE.md, "Campo de busca com registro vinculado", e a skill criar-tela-blazor.
   Mora aqui e não num .razor.css porque CSS isolado NÃO carrega em host nenhum neste repo.
   ========================================================================== */

/* GRID de duas linhas: em cima [campo][lupa], embaixo o texto de ajuda ocupando as duas colunas.
   `align-items: end` alinha a lupa pelo FIM DO CAMPO — e só continua fazendo isso enquanto o texto de ajuda
   NÃO estiver dentro do controle do campo. Era esse o defeito relatado pelo dono: com `HelperText` no
   MudTextField, o controle cresce, o `end` passa a medir o fim da FRASE e a lupa desce para o lado dela
   (pior em coluna estreita, onde a frase quebra em duas linhas). Ver o comentário do SisCepField.razor.

   ⛔ Grid, e NÃO flex com `flex-wrap: wrap`, por medição: a versão em flex-wrap alinhava certo a 1600×900 e a
   1024×768 punha a LUPA na linha de baixo — na coluna md=3 o campo mais a lupa não cabiam, e com a quebra
   habilitada (necessária para o texto de ajuda descer) quem quebrava era o botão. No grid isso é impossível
   por construção: a lupa é a coluna 2 da linha 1, sempre. O `minmax(0, 1fr)` é o que faz o campo ENCOLHER em
   vez de empurrar — o equivalente do antigo `min-width: 0` do flex item.

   Sem `row-gap`: a distância entre campo e ajuda quem dá é o `margin-top` do próprio contêiner de ajuda do
   MudBlazor (3px). Um gap de linha somaria por cima e afastaria a frase mais do que nos demais campos. */
.sis-lookup-field {
    display: grid;
    /* Terceira coluna: o botão "criar novo" (OnCriarNovo), opcional — sem ele a coluna some por conteúdo,
       igual antes. `position: relative` ancora o dropdown de sugestões abaixo (ver .sis-lookup-suggestions). */
    grid-template-columns: minmax(0, 1fr) auto auto;
    align-items: end;
    column-gap: 4px;
    width: 100%;
    position: relative;
}

/* SUGESTÕES ao digitar (autocomplete com debounce) — fora do fluxo do grid (absolute), pra flutuar por cima
   do que vem depois em vez de empurrar layout. Mesma linguagem visual da tela de busca (.sis-lookup-result),
   só que num popover local em vez de diálogo — ver o porquê da coexistência no comentário do .razor. */
.sis-lookup-suggestions {
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    z-index: 10;
    max-height: 320px;
    overflow-y: auto;
    margin-top: 2px;
}

.sis-lookup-suggestion {
    cursor: pointer;
    border-radius: var(--mud-default-borderradius);
}

/* A frase toma a linha inteira, abaixo do campo E da lupa. Ocupar também a faixa da lupa não é detalhe — é o
   que faz o texto caber em menos linhas na coluna estreita. */
.sis-lookup-helper {
    grid-column: 1 / -1;
    min-width: 0;
}

/* min-width:0 também aqui: o contêiner já declara `minmax(0, 1fr)`, mas o controle do MudBlazor tem conteúdo
   próprio (rótulo, adornos) e sem isto ele volta a assumir a largura do conteúdo em coluna estreita. */
.sis-lookup-input {
    min-width: 0;
}

/* A lupa herda a FORMA da ação de linha do grid (sis-row-action): mesma caixa contornada, mesma altura de
   toque. O `margin-bottom` a põe na linha de base do campo, não do rótulo. */
.sis-lookup-search-button {
    margin-bottom: 4px;
    border: 1px solid var(--mud-palette-table-lines);
    border-radius: var(--mud-default-borderradius);
    height: 36px;
    width: 36px;
}

.sis-lookup-results {
    max-height: 55vh;
    overflow-y: auto;
}

.sis-lookup-result {
    cursor: pointer;
    border-radius: var(--mud-default-borderradius);
}

.sis-lookup-empty {
    opacity: .7;
}

/* --------------------------------------------------------------------------
   TECLADO NUMÉRICO VIRTUAL (SisKeypadHost / SisNumericKeypad).

   Painel ancorado à DIREITA da viewport, sem máscara: não é modal de propósito
   — o operador precisa continuar vendo e tocando o que está por baixo, que é a
   razão de um teclado existir.

   ⛔ E ele EMPURRA o conteúdo em vez de cobri-lo (decisão do dono, 2026-07-28,
   com o CosyPOS como referência). Como overlay puro, um campo que estivesse do
   lado direito da tela ficava ESCONDIDO pelo próprio teclado que ia preenchê-lo
   — e o operador não tinha como ver o que estava digitando. Ver o bloco "empurra
   a tela" logo abaixo.

   z-index 1450: ACIMA do diálogo do MudBlazor (1400), porque metade dos campos
   numéricos do sis vive dentro de diálogo (desconto do PDV, abrir comanda,
   quantidade do item) e um teclado atrás deles seria inalcançável justamente
   onde é mais necessário. Abaixo do Snackbar (1500), que é quem avisa erro.

   Cor SÓ da paleta — o PDV e o restaurante rodam em temas diferentes, e o
   teclado é o mesmo componente nos dois.
   -------------------------------------------------------------------------- */
:root {
    /* Uma variável, três consumidores: a largura do painel, o quanto o conteúdo
       recua e o quanto o diálogo se recentraliza. Separá-los deixaria o teclado
       e o buraco que ele ocupa com tamanhos diferentes no dia em que alguém
       mexesse num só. */
    --sis-keypad-width: 380px;
}

.sis-keypad {
    position: fixed;
    /* ABAIXO da barra superior, não colado no topo. Não é estética: o painel fica aberto o turno inteiro, e
       em `top: 0` ele cobria os ícones da direita da MudAppBar — inclusive o PRÓPRIO botão que o abre, além
       do tema, da ajuda e do Sair. Flagrado na captura de 1600×900, e o E2E não conseguia clicar no
       alternador de tema. No PdvHost, que tem faixa própria e não MudAppBar, a variável ainda resolve e o
       painel encosta logo abaixo da faixa do terminal. */
    top: var(--mud-appbar-height, 64px);
    right: 0;
    bottom: 0;
    z-index: 1450;
    width: var(--sis-keypad-width);
    display: flex;
    flex-direction: column;
    gap: 10px;
    padding: 14px;
    padding-bottom: calc(14px + env(safe-area-inset-bottom, 0px));
    background: var(--mud-palette-surface);
    border-left: 1px solid var(--mud-palette-table-lines);
    box-shadow: -14px 0 34px rgba(0, 0, 0, .20);
    animation: sis-keypad-in 150ms ease-out;
}

@keyframes sis-keypad-in {
    from { transform: translateX(16px); opacity: 0; }
    to   { transform: translateX(0);    opacity: 1; }
}

/* Monitor estreito (o 1024×768 de terminal): 380px de teclado MAIS 280px de menu deixariam menos de 400px
   para a tela de trabalho. A tecla continua bem acima do alvo de toque confortável. */
@media (max-width: 1279px) {
    :root {
        --sis-keypad-width: 320px;
    }
}

/* ---- O teclado EMPURRA a tela, não a cobre ------------------------------
   O seletor é `:has()` e não uma classe posta por JS: o painel EXISTIR no DOM
   já é a única condição, então não há segundo estado para dessincronizar — o
   caso clássico é o teclado fechar por um caminho que esqueceu de limpar a
   classe e a tela ficar com um buraco de 380px para sempre.

   `.mud-main-content` cobre a casca (ShellLayout) e o FoodHost; `.pdv` é o
   terminal de PDV, que é `position: fixed` por conta própria e por isso recua
   pelo `right`, não por padding. O contêiner de diálogo entra junto para o
   modal se RECENTRALIZAR no espaço que sobrou — senão o teclado voltaria a
   cobrir metade dele, que é o defeito que este bloco existe para corrigir.

   Onde NÃO empurra: no celular e no monitor deitado baixo (media query no fim
   deste bloco), onde o painel vira faixa inferior. Ali empurrar comeria a
   altura útil, e o comportamento esperado é o do teclado do próprio aparelho:
   sobrepor, com o campo rolando para a vista (scrollIntoView no keypad.js). */
.mud-main-content,
.mud-dialog-container {
    transition: padding-right .16s ease;
}

body:has(.sis-keypad) .mud-main-content,
body:has(.sis-keypad) .mud-dialog-container {
    padding-right: var(--sis-keypad-width);
}

body:has(.sis-keypad) .pdv {
    right: var(--sis-keypad-width);
}

.sis-keypad__bar {
    display: flex;
    align-items: center;
    gap: 8px;
    color: var(--mud-palette-text-secondary);
}

.sis-keypad__title {
    font-size: .75rem;
    font-weight: 700;
    letter-spacing: .08em;
}

/* margin-left:auto e não um spacer: o X fica na ponta com qualquer largura de painel. */
.sis-keypad__close {
    margin-left: auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 32px;
    height: 32px;
    border: 0;
    border-radius: var(--mud-default-borderradius);
    background: transparent;
    color: inherit;
    cursor: pointer;
}

.sis-keypad__close:hover {
    background: rgba(var(--mud-palette-text-primary-rgb), .08);
}

/* ---- Visor ----------------------------------------------------------------
   Repete o valor do campo em corpo grande, para quem opera olhando o teclado.
   Fica logo abaixo do título e ANTES do `margin-top:auto` do aviso, então é ele
   que ocupa a folga do topo do painel — a mesma folga que antes era buraco. */
.sis-keypad__display {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    /* Duas linhas de altura mínima: o visor não pode mudar de tamanho entre
       vazio e preenchido, ou as teclas subiriam e desceriam sob o dedo. */
    min-height: 64px;
    padding: 6px 12px;
    border-radius: 12px;
    background: rgba(var(--mud-palette-text-primary-rgb), .04);
    border: 1px solid var(--mud-palette-table-lines);
    /* Números longos cortam em vez de quebrar: o visor tem uma linha, sempre. */
    overflow: hidden;
    white-space: nowrap;
}

.sis-keypad__display-value {
    font-size: 2.1rem;
    font-weight: 600;
    line-height: 1.1;
    /* tnum: dígitos de largura fixa. Sem isso o número "dança" para os lados a
       cada tecla, porque 1 é mais estreito que 8 na fonte de texto. */
    font-variant-numeric: tabular-nums;
    color: var(--mud-palette-text-primary);
}

.sis-keypad__display-empty {
    font-size: 1.6rem;
    color: var(--mud-palette-text-disabled);
}

/* Altura reservada mesmo apagado — ver o comentário do aviso no SisKeypadHost.razor: tecla que dança sob o
   dedo é como se erra o toque num terminal. */
.sis-keypad__hint {
    /* margin-top:auto empurra aviso + teclas + rodapé para a BASE do painel. O teclado fica onde a mão já
       está, e o espaço que sobra num monitor alto vira folga em cima, não um buraco entre o aviso e as
       teclas. */
    margin: auto 0 0;
    min-height: 2.4em;
    font-size: .78rem;
    line-height: 1.2;
    color: var(--mud-palette-text-secondary);
}

.sis-keypad__hint--alert {
    color: var(--mud-palette-warning);
    font-weight: 600;
}

.sis-keypad__keys {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    /* Altura natural (não estica): num monitor alto o grid viraria faixas de 200px e a mão subiria e
       desceria mais do que precisa. O minmax dá o alvo confortável com teto. */
    /* Teclas grandes, no tamanho do PDV de referência: são operadas com o dedo,
       muitas vezes por quem não está olhando para elas. */
    grid-auto-rows: minmax(72px, 96px);
    gap: 10px;
    flex: 0 0 auto;
}

.sis-keypad__key {
    display: flex;
    align-items: center;
    justify-content: center;
    /* 72px é o alvo de toque do teclado de PDV — bem acima do piso de 48px de
       acessibilidade, porque aqui a tecla é o instrumento de trabalho. */
    min-height: 72px;
    font-size: 1.6rem;
    font-weight: 600;
    color: var(--mud-palette-text-primary);
    background: var(--mud-palette-background-gray);
    border: 1px solid var(--mud-palette-table-lines);
    border-radius: 12px;
    cursor: pointer;
    user-select: none;
    transition: background-color .12s ease, transform .06s ease;
}

.sis-keypad__key:hover:not(:disabled) {
    background: rgba(var(--mud-palette-primary-rgb), .12);
}

/* O afundar é o retorno tátil que um teclado de vidro não tem. Sem :active o operador não sabe se a tecla
   pegou, e acaba tocando duas vezes. */
.sis-keypad__key:active:not(:disabled) {
    transform: scale(.96);
    background: rgba(var(--mud-palette-primary-rgb), .20);
}

.sis-keypad__key:disabled {
    opacity: .45;
    cursor: default;
}

/* Apagar e limpar: tonais, para não competirem com os dígitos nem com o ENTER. */
.sis-keypad__key--action {
    background: rgba(var(--mud-palette-text-primary-rgb), .06);
    color: var(--mud-palette-text-secondary);
    font-size: 1.1rem;
}

/* O ÚNICO sólido do painel — a hierarquia "tonais + um sólido" das telas de operação. */
.sis-keypad__key--enter {
    grid-row: span 2;
    background: var(--mud-palette-primary);
    color: var(--mud-palette-primary-text);
    border-color: transparent;
}

.sis-keypad__key--enter:hover:not(:disabled) {
    background: var(--mud-palette-primary-darken);
}

.sis-keypad__key--enter:active:not(:disabled) {
    background: var(--mud-palette-primary-darken);
}

.sis-keypad__key--zero {
    grid-column: span 2;
}

/* Sem vírgula (modo inteiro), o zero toma a linha inteira em vez de deixar um buraco no grid. */
.sis-keypad__keys--integer .sis-keypad__key--zero {
    grid-column: span 3;
}

.sis-keypad__foot {
    border-top: 1px solid var(--mud-palette-table-lines);
    padding-top: 8px;
}

.sis-keypad__switch .mud-typography {
    font-size: .78rem;
    line-height: 1.15;
}

/* Celular e terminal deitado baixo: à direita o painel comeria a largura útil da tela de venda. Vira faixa
   inferior, que é onde todo teclado de aparelho aparece — e o operador não precisa reaprender nada. */
@media (max-width: 720px), (max-height: 560px) {
    .sis-keypad {
        top: auto;
        left: 0;
        width: auto;
        max-height: 62vh;
        border-left: 0;
        border-top: 1px solid var(--mud-palette-table-lines);
        box-shadow: 0 -14px 34px rgba(0, 0, 0, .20);
        animation: sis-keypad-in-bottom 150ms ease-out;
    }

    .sis-keypad__keys {
        grid-auto-rows: minmax(56px, 72px);
    }

    .sis-keypad__key {
        min-height: 56px;
        font-size: 1.4rem;
    }

    /* Faixa inferior: empurrar aqui comeria a altura útil, que é o que falta num
       celular. Sobrepõe, como o teclado do próprio aparelho. */
    body:has(.sis-keypad) .mud-main-content,
    body:has(.sis-keypad) .mud-dialog-container {
        padding-right: 0;
    }

    body:has(.sis-keypad) .pdv {
        right: 0;
    }
}

@keyframes sis-keypad-in-bottom {
    from { transform: translateY(16px); opacity: 0; }
    to   { transform: translateY(0);    opacity: 1; }
}

/* ==========================================================================
   Ordem de serviço
   ========================================================================== */

/* Previsão vencida numa OS que ainda pode ser atendida.
   Cor pela variável do TEMA, não hexadecimal: um vermelho cravado que funciona no claro fica
   ilegível no escuro, e é o tipo de defeito que só aparece na captura. */
.sis-os-atrasada {
    color: var(--mud-palette-error);
    font-weight: 600;
}

/* O painel de itens/checklist da tela de operação. Altura mínima para a lista vazia não colapsar o
   layout e fazer o rodapé de totais subir por cima do cabeçalho. */
.sis-os-painel {
    min-height: 180px;
}

/* Linha de item da OS — mesma geometria da linha de comanda, com o rótulo de peça/serviço à direita. */
.sis-os-item {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 10px 12px;
    border-bottom: 1px solid var(--mud-palette-table-lines);
}

.sis-os-item:last-child {
    border-bottom: none;
}

.sis-os-item-descricao {
    flex: 1 1 auto;
    /* Sem isto, uma descrição longa empurra quantidade e preço para fora do painel em vez de truncar. */
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

/* --------------------------------------------------------------------------
   Card do MONITOR de O.S.
   Mesma família do `sis-table-card` do board de comandas (faixa de acento à
   esquerda, botão nativo, cor pela paleta) — mas MAIOR: o card de mesa mostra
   um número e um total; este responde "o que é, de quem é e para quando" sem
   que o técnico precise abrir a ordem.
   -------------------------------------------------------------------------- */
.sis-os-card {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 8px;
    width: 100%;
    height: 100%;
    padding: 14px 16px 14px 18px;
    border: 1px solid var(--mud-palette-lines-default);
    border-left: 6px solid var(--sis-table-accent, var(--mud-palette-lines-default));
    border-radius: var(--mud-default-borderradius, 12px);
    background-color: var(--mud-palette-surface);
    color: var(--mud-palette-text-primary);
    text-align: left;
    cursor: pointer;
    transition: background-color .12s ease, box-shadow .12s ease;
    -webkit-tap-highlight-color: transparent;
}

.sis-os-card:hover,
.sis-os-card:focus-visible {
    background-color: color-mix(in srgb, var(--sis-table-accent, var(--mud-palette-primary)) 10%, var(--mud-palette-surface));
    box-shadow: 0 2px 10px rgba(0, 0, 0, .35);
    outline: none;
}

/* Atrasada: a faixa já é vermelha (o acento vence o status), e o contorno inteiro
   acompanha. Fundo NÃO chapado — um card vermelho sólido apaga o texto que o
   técnico precisa ler, que é justamente o defeito. */
.sis-os-card--atrasada {
    border-color: var(--mud-palette-error);
}

.sis-os-card__top {
    display: flex;
    align-items: center;
    gap: 10px;
    min-width: 0;
}

.sis-os-card__number {
    font-size: 1.5rem;
    font-weight: 700;
    line-height: 1.1;
    color: var(--mud-palette-primary);
}

.sis-os-card__number::before {
    content: "Nº ";
    font-size: .7rem;
    font-weight: 600;
    color: var(--mud-palette-text-secondary);
}

/* Selo do estado, na cor do acento do próprio card — é o que amarra a faixa da
   esquerda ao texto, para quem não distingue as cores. */
.sis-os-card__status {
    padding: 2px 8px;
    border: 1px solid var(--sis-table-accent, var(--mud-palette-lines-default));
    border-radius: 999px;
    font-size: .72rem;
    font-weight: 600;
    white-space: nowrap;
    color: var(--sis-table-accent, var(--mud-palette-text-secondary));
}

.sis-os-card__meta {
    margin-left: auto;
    font-size: .75rem;
    color: var(--mud-palette-text-secondary);
    white-space: nowrap;
}

.sis-os-card__client,
.sis-os-card__equipment {
    display: flex;
    align-items: center;
    gap: 5px;
    /* min-width:0 na cadeia inteira: sem ele o nome longo ALARGA o card em vez de
       truncar, e um card mais largo desalinha a linha inteira da grade. */
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.sis-os-card__client {
    font-weight: 600;
    font-size: .92rem;
}

.sis-os-card__equipment {
    font-size: .84rem;
    color: var(--mud-palette-text-secondary);
}

.sis-os-card__client .mud-icon-root,
.sis-os-card__equipment .mud-icon-root {
    font-size: .95rem;
    flex: 0 0 auto;
    color: var(--mud-palette-text-secondary);
}

/* O defeito CRESCE (flex:1) e é ele que alinha o rodapé — e portanto a previsão —
   de todos os cards da linha, sem altura cravada. Duas linhas e reticências: o
   relato do cliente pode ter um parágrafo, e o card não é o lugar de lê-lo inteiro. */
.sis-os-card__defect {
    flex: 1 1 auto;
    font-size: .84rem;
    line-height: 1.35;
    color: var(--mud-palette-text-primary);
    display: -webkit-box;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
    min-height: 2.4em;
}

.sis-os-card__foot {
    display: flex;
    align-items: center;
    gap: 10px;
    padding-top: 8px;
    border-top: 1px solid var(--mud-palette-table-lines);
}

.sis-os-card__due {
    display: flex;
    align-items: center;
    gap: 4px;
    font-size: .8rem;
    color: var(--mud-palette-text-secondary);
    white-space: nowrap;
}

.sis-os-card__due .mud-icon-root {
    font-size: .95rem;
}

/* Na atrasada o prazo é a informação que muda a ação — vai para a cor de erro,
   junto com o ícone. */
.sis-os-card--atrasada .sis-os-card__due,
.sis-os-card--atrasada .sis-os-card__due .mud-icon-root {
    color: var(--mud-palette-error);
    font-weight: 600;
}

.sis-os-card__total {
    margin-left: auto;
    font-weight: 700;
    white-space: nowrap;
}

/* Item de checklist já conferido. Riscado E esmaecido — o risco sozinho some no tema escuro,
   e o esmaecimento sozinho se confunde com "desabilitado". */
.sis-os-check--feito {
    text-decoration: line-through;
    color: var(--mud-palette-text-secondary);
}

/* --------------------------------------------------------------------------
   Card do MONITOR de O.P. — a MESMA receita do `sis-os-card` (faixa de acento
   à esquerda, botão nativo, cor pela paleta), copiada com nome próprio: o
   nome carrega a origem (Ordem de Serviço), e aqui o card é de PRODUÇÃO.
   -------------------------------------------------------------------------- */
.sis-pcp-card {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 8px;
    width: 100%;
    height: 100%;
    padding: 14px 16px 14px 18px;
    border: 1px solid var(--mud-palette-lines-default);
    border-left: 6px solid var(--sis-table-accent, var(--mud-palette-lines-default));
    border-radius: var(--mud-default-borderradius, 12px);
    background-color: var(--mud-palette-surface);
    color: var(--mud-palette-text-primary);
    text-align: left;
    cursor: pointer;
    transition: background-color .12s ease, box-shadow .12s ease;
    -webkit-tap-highlight-color: transparent;
}

.sis-pcp-card:hover,
.sis-pcp-card:focus-visible {
    background-color: color-mix(in srgb, var(--sis-table-accent, var(--mud-palette-primary)) 10%, var(--mud-palette-surface));
    box-shadow: 0 2px 10px rgba(0, 0, 0, .35);
    outline: none;
}

.sis-pcp-card--atrasada {
    border-color: var(--mud-palette-error);
}

.sis-pcp-card__top {
    display: flex;
    align-items: center;
    gap: 10px;
    min-width: 0;
}

.sis-pcp-card__number {
    font-size: 1.5rem;
    font-weight: 700;
    line-height: 1.1;
    color: var(--mud-palette-primary);
}

.sis-pcp-card__number::before {
    content: "Nº ";
    font-size: .7rem;
    font-weight: 600;
    color: var(--mud-palette-text-secondary);
}

.sis-pcp-card__status {
    padding: 2px 8px;
    border: 1px solid var(--sis-table-accent, var(--mud-palette-lines-default));
    border-radius: 999px;
    font-size: .72rem;
    font-weight: 600;
    white-space: nowrap;
    color: var(--sis-table-accent, var(--mud-palette-text-secondary));
}

.sis-pcp-card__meta {
    margin-left: auto;
    font-size: .75rem;
    color: var(--mud-palette-text-secondary);
    white-space: nowrap;
}

.sis-pcp-card__products {
    display: flex;
    align-items: center;
    gap: 5px;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-weight: 600;
    font-size: .92rem;
    flex: 1 1 auto;
}

.sis-pcp-card__products .mud-icon-root {
    font-size: .95rem;
    flex: 0 0 auto;
    color: var(--mud-palette-text-secondary);
}

.sis-pcp-card__foot {
    display: flex;
    align-items: center;
    gap: 10px;
    padding-top: 8px;
    border-top: 1px solid var(--mud-palette-table-lines);
}

.sis-pcp-card__due {
    display: flex;
    align-items: center;
    gap: 4px;
    font-size: .8rem;
    color: var(--mud-palette-text-secondary);
    white-space: nowrap;
}

.sis-pcp-card__due .mud-icon-root {
    font-size: .95rem;
}

.sis-pcp-card--atrasada .sis-pcp-card__due,
.sis-pcp-card--atrasada .sis-pcp-card__due .mud-icon-root {
    color: var(--mud-palette-error);
    font-weight: 600;
}

.sis-pcp-card__total {
    margin-left: auto;
    font-weight: 700;
    white-space: nowrap;
}

/* --------------------------------------------------------------------------
   KANBAN de ordens de produção — colunas de VERDADE por status (diferente do
   board de comandas do restaurante, que abandonou colunas em favor de abas de
   escopo). Aqui a posição da coluna É a informação: o encarregado varre da
   esquerda pra direita e vê o funil de produção inteiro de uma vez.
   -------------------------------------------------------------------------- */
.sis-pcp-kanban {
    display: flex;
    align-items: flex-start;
    gap: 16px;
    overflow-x: auto;
    padding-bottom: 8px;
}

.sis-pcp-kanban-column {
    display: flex;
    flex-direction: column;
    flex: 1 1 260px;
    min-width: 260px;
    max-width: 340px;
    background-color: var(--mud-palette-background-grey);
    border-radius: var(--mud-default-borderradius, 12px);
    border-top: 4px solid var(--sis-table-accent, var(--mud-palette-lines-default));
    padding: 12px;
    gap: 10px;
}

.sis-pcp-kanban-column__header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    padding: 0 2px;
}

.sis-pcp-kanban-column__title {
    font-weight: 700;
    font-size: .95rem;
    color: var(--sis-table-accent, var(--mud-palette-text-primary));
}

.sis-pcp-kanban-column__count {
    font-size: .78rem;
    font-weight: 600;
    color: var(--mud-palette-text-secondary);
    background-color: var(--mud-palette-surface);
    border-radius: 999px;
    padding: 1px 9px;
}

.sis-pcp-kanban-column__body {
    display: flex;
    flex-direction: column;
    gap: 8px;
    min-height: 60px;
}

.sis-pcp-kanban-column__empty {
    font-size: .8rem;
    color: var(--mud-palette-text-secondary);
    text-align: center;
    padding: 18px 4px;
    border: 1px dashed var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius, 8px);
}

/* O CARD é um <div> (não <button>) porque ele contém DOIS controles: a área que abre a ordem e o botão de
   ação (Iniciar/Concluir) — botão dentro de botão é HTML inválido e quebra o clique. A área de abrir é o
   `__open`, um <button> "desenhado" (all:unset) para ocupar o espaço sem parecer um botão solto. */
.sis-pcp-kanban-card {
    display: flex;
    flex-direction: column;
    gap: 8px;
    width: 100%;
    padding: 10px 12px;
    border: 1px solid var(--mud-palette-lines-default);
    border-radius: var(--mud-default-borderradius, 10px);
    background-color: var(--mud-palette-surface);
    color: var(--mud-palette-text-primary);
}

.sis-pcp-kanban-card--atrasada {
    border-color: var(--mud-palette-error);
}

.sis-pcp-kanban-card__open {
    all: unset;
    display: flex;
    flex-direction: column;
    gap: 6px;
    width: 100%;
    box-sizing: border-box;
    cursor: pointer;
    text-align: left;
    border-radius: var(--mud-default-borderradius, 8px);
    padding: 2px;
    -webkit-tap-highlight-color: transparent;
}

.sis-pcp-kanban-card__open:hover,
.sis-pcp-kanban-card__open:focus-visible {
    background-color: color-mix(in srgb, var(--mud-palette-primary) 8%, var(--mud-palette-surface));
    outline: none;
}

.sis-pcp-kanban-card__top {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
}

.sis-pcp-kanban-card__number {
    font-weight: 700;
    font-size: .95rem;
}

.sis-pcp-kanban-card__due {
    font-size: .74rem;
    color: var(--mud-palette-text-secondary);
    white-space: nowrap;
}

.sis-pcp-kanban-card--atrasada .sis-pcp-kanban-card__due {
    color: var(--mud-palette-error);
    font-weight: 600;
}

.sis-pcp-kanban-card__products {
    font-size: .82rem;
    color: var(--mud-palette-text-secondary);
}

.sis-pcp-kanban-card__total {
    font-size: .84rem;
    font-weight: 600;
}

.sis-pcp-kanban-card__action {
    margin-top: 2px;
}

/* =========================================================================
   Seletor de observações de produto (ProductObservationPicker).

   Faixa de chips que envolve, e não rola na horizontal: aqui a lista é curta
   (os rótulos de UMA categoria) e o operador precisa ver todos de uma vez —
   diferente da .sis-cat-strip, onde rolar é o certo porque a lista cresce
   com o cardápio. Um rótulo escondido fora da tela é um rótulo que ninguém
   usa, e o operador volta a digitar a frase à mão.

   Sem cor cravada: quem pinta o chip é o Variant/Color do MudBlazor, para o
   estado ligado/desligado acompanhar o tema (o restaurante roda num tema
   escuro próprio, o escritório no toggle claro/escuro). */
.sis-obs-picker {
    display: flex;
    flex-wrap: wrap;
    gap: 6px;
    margin: 4px 0 8px;
}

/* Área de toque: 32px é o piso confortável para o dedo num terminal de
   balcão. O chip Small do MudBlazor nasce menor que isso. */
.sis-obs-picker .mud-chip {
    min-height: 32px;
    margin: 0;
}

/* Os rótulos escolhidos, exibidos na LINHA DO ITEM (comanda, garçom, gerência).
   Classe própria, e não a do seletor: ali os chips são controles que o operador
   toca; aqui são leitura. Compartilhar a classe amarraria o espaçamento de um ao
   do outro, e foi o que o portão de seletor de teste acusou. */
.sis-obs-tags {
    display: flex;
    flex-wrap: wrap;
    gap: 4px;
    margin: 2px 0 4px;
}

.sis-obs-tags .mud-chip {
    margin: 0;
}

/* ---------------------------------------------------------------------------
   Grupo de campos com LEGENDA NA BORDA (`<fieldset>` + `<legend>`).

   É o mesmo desenho que o MudTextField `Outlined` usa para o rótulo dele — e não
   é imitação por CSS: o corte da borda em volta da legenda é comportamento
   NATIVO do par fieldset/legend no navegador. Um `MudPaper` com o título dentro
   não consegue isso sem gambiarra (fundo opaco sobreposto à borda, que quebra em
   cima de superfície de cor diferente e nos dois temas).

   Os valores vêm da receita do próprio MudBlazor (`.mud-input-outlined-border`),
   para o contorno bater com o dos campos ao lado: 1px, o raio padrão, a variável
   de cor de linha de input, legenda em .75rem com margem 11px e padding 5px.
   Usar as VARIÁVEIS, e não hexadecimal, é o que faz a caixa acompanhar o tema
   claro e o escuro sozinha.
   --------------------------------------------------------------------------- */
.sis-field-group {
    border: 1px solid var(--mud-palette-lines-inputs);
    border-radius: var(--mud-default-borderradius);
    /* O padding-top menor compensa o espaço que a legenda já ocupa na borda. */
    padding: 2px 12px 6px;
    margin: 0;
    min-width: 0;
}

.sis-field-group > legend {
    font-size: .75rem;
    line-height: 1;
    padding: 0 5px;
    margin: 0 6px;
    color: var(--mud-palette-text-secondary);
}

/* Os controles do grupo numa linha só, quebrando quando não couber. */
.sis-field-group-inline {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
}

/* ---------------------------------------------------------------------------
   MudChart: o <svg> raiz recorta o próprio conteúdo por padrão (overflow:
   hidden é o default do UA para <svg>). O MudChart de barra posiciona a 1ª e a
   ÚLTIMA categoria NA BORDA do viewBox (não centralizadas no slot), então o
   rótulo do eixo X rotacionado da ponta nasce cortado pela borda do PRÓPRIO
   svg — padding no elemento HTML em volta não alcança isso, porque o corte
   acontece dentro do svg, não no container. `overflow: visible` deixa o texto
   desenhar além do viewBox; a folga (padding do container que hospeda o
   MudChart) é quem garante que esse excedente não estoure a TELA.
   --------------------------------------------------------------------------- */
.mud-chart svg {
    overflow: visible;
}
