/*
 * Normalização geral da interface DMO.
 * Carregado em último lugar pelos layouts: define uma única tipografia,
 * escala de tamanhos, pesos, botões e campos para todas as páginas.
 * Ecrã de trabalho de referência: 1366 x 768.
 */

/* Inter servida pela app (OFL, fonts/Inter-OFL.txt): o mesmo tipo de letra
   em Windows, onde a Inter não vem instalada e o peso 800 caía na Segoe UI Black.
   Os overrides fixam a subida e a descida da Inter (as do hhea): o Windows lia
   outras e a letra ficava fora do centro nos botões e nos campos. */
@font-face{font-family:"Inter";font-style:normal;font-weight:100 900;font-display:swap;ascent-override:96.875%;descent-override:24.121%;line-gap-override:0%;src:url("../fonts/inter-latin-wght-normal.woff2") format("woff2")}

:root{
  --dmo-font:"Inter",system-ui,"Segoe UI",Roboto,Arial,sans-serif;
  --dmo-fs-xs:12px;   /* cabeçalhos de tabela, etiquetas */
  --dmo-fs-sm:13px;   /* notas, texto secundário */
  --dmo-fs-base:14px; /* texto, campos, botões, navegação */
  /* Botões e campos um pouco mais baixos (Diogo, 26/10/2026: «o padrão dos botões está muito grande, reduzir tudo ligeiramente; não esquecer os campos ao lado»): uma só altura para os dois. */
  --dmo-control-height:36px;
  --dmo-fs-md:16px;   /* títulos de cartão */
  --dmo-fs-lg:22px;   /* título da página */
  --dmo-fw-regular:400;
  --dmo-fw-medium:500;
  --dmo-fw-semibold:600;
  --dmo-fw-bold:700;
}

/* Base */
html body{font-family:var(--dmo-font);font-size:var(--dmo-fs-base);line-height:1.45;-webkit-font-smoothing:antialiased}
html body :is(button,input,select,textarea){font-family:inherit}
html body :is(h1,h2,h3,h4){font-family:inherit}

/* Cabeçalho e navegação */
html body .dmo-shell-header{font-family:var(--dmo-font)}
html body .dmo-shell-header .dmo-shell-identity strong{font-weight:var(--dmo-fw-bold)}
html body .dmo-shell-header .dmo-shell-user strong{font-size:var(--dmo-fs-sm);font-weight:var(--dmo-fw-semibold)}
html body .dmo-shell-header :is(.dmo-shell-logout,.dmo-shell-change-password,.dmo-shell-settings){font-size:var(--dmo-fs-sm);font-weight:var(--dmo-fw-semibold)}
html body :is(.dmo-primary-nav,.dmo-secondary-nav) :is(a,button),
html body .dmo-shell-navigation :is(.dmo-primary-nav,.dmo-secondary-nav) :is(a,button){font-size:var(--dmo-fs-base);font-weight:var(--dmo-fw-semibold)}

/* Títulos */
html body :is(.dmo-page-head,.page-head,.page-heading) :is(h1,h2){font-size:var(--dmo-fs-lg) !important;font-weight:var(--dmo-fw-bold) !important;letter-spacing:-.01em}
html body :is(.dmo-page-head,.page-head,.page-heading) p{font-size:var(--dmo-fs-sm) !important}
html body :is(.dmo-card,.beta-bq-layout .card,.resumo-card,.ferr-card) :is(h2,h3){font-size:var(--dmo-fs-md);font-weight:var(--dmo-fw-semibold)}
html body :is(.dmo-card,.beta-bq-layout .card) h4{font-size:var(--dmo-fs-base);font-weight:var(--dmo-fw-semibold)}

/* Botões: um só tamanho e peso e UMA só aparência (Diogo, 16/10/2026): azul
   com letra branca; o hover inverte (branco com letra azul). O «ghost» antigo
   (branco) deixa de ser uma variante: fica igual a todos os outros.
   Texto ao centro (Diogo, 17/10/2026): o text-box corta a caixa da letra à
   altura das maiúsculas e à linha de base, para o flex a centrar sem depender
   das métricas do tipo de letra em cada sistema. */
html body :is(.dmo-button,.button,.btn){box-sizing:border-box;height:var(--dmo-control-height);min-height:var(--dmo-control-height);padding:0 16px;white-space:nowrap;font-family:inherit;font-size:var(--dmo-fs-base);font-weight:var(--dmo-fw-semibold);letter-spacing:0;line-height:1;text-box:trim-both cap alphabetic}
html body :is(.dmo-button,.button,.btn){background:var(--button-color,var(--dmo-brand-600));color:var(--dmo-text-on-color);border:1px solid var(--button-color,var(--dmo-brand-600))}
/* Só a linha fina do botão, sem a segunda borda à volta (Diogo, 17/10/2026).
   O hover inverte as cores; o foco do teclado é um halo suave da paleta. */
html body :is(.dmo-button,.button,.btn):is(:hover,:focus-visible){background:var(--dmo-card);color:var(--button-color,var(--dmo-brand-600));outline:0}
/* O botão invertido é branco também no escuro (Diogo, 26/10/2026: «invertido deveria ser branco em todos»). */
:root{--dmo-invertido:#fff}
/* Sem itálico (regra do Diogo; 26/10/2026: «estes botões seguem a regra padrão?»): os <em> e <i> e as dicas dos campos ficam direitos em toda a app. */
html body :is(em,i,cite,dfn,var,address),html body ::placeholder{font-style:normal}
html[data-theme="dark"] body :is(.dmo-button,.button,.btn):is(:hover,:focus-visible){background:var(--dmo-invertido)}
/* Todos os botões iguais (Diogo, 19/10/2026): azul com letra branca; o rato
   por cima inverte; ao carregar fica um azul mais claro da paleta. */
html body :is(.dmo-button,.button,.btn):focus-visible{box-shadow:0 0 0 3px var(--dmo-focus-ring)}
html body :is(.dmo-button,.button,.btn):active:not(:disabled):not([aria-disabled="true"]){background:var(--button-press,var(--dmo-palette-steel));border-color:var(--button-press,var(--dmo-palette-steel));color:var(--dmo-text-on-color);box-shadow:none}
html body :is(.dmo-button,.button,.btn):is(.danger,.success){--button-press:color-mix(in srgb,var(--button-color) 70%,#fff)}
/* Um só tamanho de botão (Diogo, 17/10/2026): a altura e a letra dos campos
   de filtragem (--dmo-control-height, --dmo-fs-base) em toda a app. As setas
   (paginação, mês do calendário) são quadradas com a mesma altura. */
html body :is(.dmo-button,.button,.btn).dmo-arrow,
html body .dmo-calendar .icon-btn{box-sizing:border-box;width:var(--dmo-control-height);min-width:var(--dmo-control-height);height:var(--dmo-control-height);padding:0;font-size:var(--dmo-fs-base);font-weight:var(--dmo-fw-semibold);line-height:1}
/* «Sair»: só a palavra, sem caixa (Diogo, 17/10/2026: o botão era intrusivo no
   cabeçalho). Azul como os links; o hover sublinha. */
html body .dmo-shell-header .dmo-shell-logout{min-height:0;margin-left:18px;padding:4px 2px;border:0;border-radius:4px;background:none;color:var(--dmo-brand-700);font-size:var(--dmo-fs-base);font-weight:var(--dmo-fw-semibold);line-height:1.2;text-decoration:none}
html body .dmo-shell-header .dmo-shell-logout:is(:hover,:focus-visible){background:none;color:var(--dmo-brand-600);text-decoration:underline;text-underline-offset:3px;outline:0}
html body .dmo-shell-header .dmo-shell-logout:focus-visible{outline:2px solid var(--dmo-brand-600);outline-offset:2px}
/* Bloco da conta em duas linhas, encostado à direita: o utilizador; por baixo «Admin» · «Sair». */
html body .dmo-shell-header .dmo-shell-conta{flex:0 1 auto;min-width:0;margin-left:auto;display:flex;flex-direction:column;align-items:flex-end;gap:2px}
html body .dmo-shell-header .dmo-shell-conta .dmo-shell-user{margin-left:0;max-width:100%}
html body .dmo-shell-header .dmo-shell-acoes{display:flex;align-items:center;gap:14px}
html body .dmo-shell-header .dmo-shell-acoes .dmo-shell-logout{margin-left:0;padding:1px 2px}
@media(max-width:600px){html body .dmo-shell-header .dmo-env-badge{flex:0 1 auto;min-width:0;max-width:110px;margin-right:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;line-height:26px}html body .dmo-shell-header .dmo-shell-conta{flex:none;max-width:120px}html body .dmo-shell-header .dmo-shell-conta .dmo-shell-user{max-width:120px}html body .dmo-shell-header .dmo-shell-conta .dmo-shell-user strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}html body .dmo-shell-header .dmo-shell-acoes{gap:10px}}
/* «Modo escuro / Modo claro»: só a palavra, como o «Sair» (Diogo, 21/10/2026). */
/* Indisponível (desativado ou sem seleção): cinzento, sem hover. */
html body :is(.dmo-button,.button,.btn):is(:disabled,[aria-disabled="true"]),
html body :is(.dmo-button,.button,.btn):is(:disabled,[aria-disabled="true"]):hover{background:var(--dmo-disabled);border-color:var(--dmo-disabled);color:var(--dmo-text-on-color);outline:0;opacity:1;cursor:not-allowed;pointer-events:none}
/* Seta desativada da paginação: cinzenta mas legível (contraste ≥ 3:1; teste de carga 17/10/2026). */
html body :is(.dmo-button,.button,.btn).dmo-arrow:is(:disabled,[aria-disabled="true"]){color:var(--dmo-muted)}

/* Campos: todos os selects nativos com o aspeto dos campos da app */
html body :is(.dmo-field,.beta-light-fields) label{font-size:var(--dmo-fs-xs);font-weight:var(--dmo-fw-semibold)}
html body .beta-light-fields :is(input,select){font-weight:var(--dmo-fw-regular)}
html body select:not([multiple]):not([size]){box-sizing:border-box;min-width:0;min-height:var(--dmo-control-height);padding:8px 11px;border:1px solid var(--dmo-border);border-radius:var(--dmo-r-control);background-color:var(--dmo-field);color:var(--dmo-text);font-family:inherit;font-size:var(--dmo-fs-base);font-weight:var(--dmo-fw-regular);line-height:1.2;-webkit-appearance:none;appearance:none}
/* A seta é obrigatória: as regras de campo antigas têm seletores mais fortes e repunham o fundo. */
html body select:not([multiple]):not([size]){padding-right:32px !important;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' fill='none' stroke='%2364778a' stroke-width='1.6'/%3E%3C/svg%3E") !important;background-repeat:no-repeat !important;background-position:right 11px center !important}
html body select:not([multiple]):not([size]):focus{border-color:var(--dmo-brand-600);outline:none;box-shadow:0 0 0 3px rgba(68,100,124,.13)}
/* A lista que abre de um seletor (Diogo, 26/10/2026: «feio», «não deveria ser assim»): a nativa do browser ficava azul-clara no escuro. Onde o browser deixa (appearance:base-select), a lista usa as cores da app: fundo do cartão, a opção por baixo do rato na cor dos botões com letra branca, a escolhida a negrito. */
@supports (appearance:base-select){
html body select:not([multiple]):not([size]),html body select:not([multiple]):not([size])::picker(select){appearance:base-select}
html body select:not([multiple]):not([size])::picker-icon{display:none}
html body select:not([multiple]):not([size])::picker(select){margin-top:4px;padding:4px;border:1px solid var(--dmo-border);border-radius:var(--dmo-r-control);background:var(--dmo-card);color:var(--dmo-text);box-shadow:var(--dmo-shadow)}
html body select:not([multiple]):not([size]) option{padding:7px 10px;border-radius:6px;background:transparent;color:var(--dmo-text);font-weight:var(--dmo-fw-regular)}
html body select:not([multiple]):not([size]) option::checkmark{display:none}
html body select:not([multiple]):not([size]) option:checked{font-weight:var(--dmo-fw-semibold)}
html body select:not([multiple]):not([size]) option:is(:hover,:focus-visible){background:var(--dmo-brand-600);color:var(--dmo-text-on-color);outline:0}
html body select:not([multiple]):not([size]) option:disabled{color:var(--dmo-muted)}
}
html body select:disabled{background-color:var(--dmo-subtle);color:var(--dmo-muted);cursor:not-allowed}
html body :is(.dmo-field,.beta-light-fields) :is(input:not([type=radio]):not([type=checkbox]),textarea){font-size:var(--dmo-fs-base)}

/* Preenchimento automático do browser (Diogo, 17/10/2026: no login a letra
   das credenciais muda de tamanho ao carregar em «Entrar»). Ao abrir a página
   o Chrome mostra as credenciais guardadas como sugestão, desenhada com
   «font:-webkit-small-control !important» (letra do sistema, 13,33px), que o
   CSS da página não consegue mudar; no primeiro clique passa o valor para o
   campo. Por isso o valor preenchido usa essa mesma letra e não muda nesse
   clique. Fora do preenchimento automático os campos continuam na Inter. */
html body input:-webkit-autofill,
html body input:-webkit-autofill:is(:hover,:focus,:active){-webkit-text-fill-color:var(--dmo-text);caret-color:var(--dmo-text);-webkit-box-shadow:0 0 0 1000px var(--dmo-card) inset;box-shadow:0 0 0 1000px var(--dmo-card) inset;font:-webkit-small-control !important;line-height:1.2 !important;transition:background-color 99999s}

/* Notas e texto secundário: um só tamanho */
html body :is(.card-note,.ferr-hint,.peso-hint,.peg-hint,.resumo-hint,.dmu-hint,.dfu-hint,.dmt-hint,.adm-hint,.muted){font-size:var(--dmo-fs-sm);line-height:1.45}

/* Tabelas */
html body table th{font-size:var(--dmo-fs-xs);font-weight:var(--dmo-fw-semibold)}

/* Pesos fortes reduzidos a semibold/bold */
html body :is(strong,b){font-weight:var(--dmo-fw-semibold)}
html body :is(.dmo-pill,.status){font-weight:var(--dmo-fw-semibold)}
/* Pills: o texto centrado na horizontal e na vertical, mesmo quando a página
   força display:block nos spans (ex.: a contagem de utilizadores nos Templates). */
html body :is(.dmo-pill,.status){display:inline-flex;align-items:center;justify-content:center;text-align:center;line-height:1.2}
/* Alinhamento vertical do texto (Diogo, 17/10/2026: «font ligeiramente
   desalinhado»): a Inter tem mais espaço por cima das letras do que por baixo,
   por isso o texto ficava descaído. Altura fixa e a caixa do texto cortada às
   maiúsculas e à linha de base: as letras ficam ao centro do pill. */
html body :is(.dmo-pill,.status,.pill,.revisao-pill){display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;height:24px;min-height:24px;padding:0 10px;font-size:var(--dmo-fs-xs);line-height:1;text-box:trim-both cap alphabetic;white-space:nowrap}
html body .revisao-pill.big{height:32px;min-height:32px;padding:0 14px;font-size:var(--dmo-fs-sm)}

/* Barra de filtros: os campos partilham uma linha e o botão fica no fim dela. */
html body .dmo-filter-bar{display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px 12px}
html body .dmo-filter-bar>.dmo-field{flex:1 1 150px;min-width:0}
html body .dmo-filter-bar>.dmo-field:has(>.dmo-button){flex:0 0 auto;display:flex;gap:8px}
html body .dmo-filter-bar>.dmo-field:has(>.dmo-button)>label{display:none}
/* Campos com a largura do que levam (deep sweep 2, 18/10/2026, F-9): na
   escolha do Job On (Pegamentos, Peso e PU NNPB) a referência, a máquina e a
   produção ficam na mesma linha, e a máquina (B1 a C3) não ocupa meia linha.
   A regra geral (os campos a partilhar a linha) fica como está: os Históricos
   dependem dela. Num ecrã estreito os campos passam à linha seguinte e
   esticam até ao fim dela. */
html body .dmo-filter-bar.dmo-filter-bar-conteudo>.dmo-field{flex:0 1 200px}
html body .dmo-filter-bar.dmo-filter-bar-conteudo>.dmo-field-maquina{flex-basis:96px}
/* A produção com a largura da opção mais comprida, sem cortar o texto
   (Diogo, 20/10/2026: «corta sem razão nenhuma, tem tanto espaço»). */
html body .dmo-filter-bar.dmo-filter-bar-conteudo>.dmo-field-producao{flex:0 0 auto;min-width:240px;max-width:100%}
@media(max-width:600px){html body .dmo-filter-bar.dmo-filter-bar-conteudo>.dmo-field{flex-grow:1}}

/* Formulários em grelha: os campos alinham pelo rótulo; as notas por baixo
   de um campo crescem para baixo sem empurrar o campo para cima. */
html body :is(.ferr-form-grid,.peso-form-grid){align-items:start}
html body :is(.ferr-form-grid,.peso-form-grid)>.dmo-field>label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* Rótulo sem campo próprio (o título de um grupo de caixas, o espaço por cima
   de um botão): um <span class="dmo-label"> com o aspeto do <label>. Um <label>
   sem campo associado dá aviso no browser. */
html body .dmo-field .dmo-label{display:block;margin:0 0 6px;color:var(--dmo-muted);font-size:var(--dmo-fs-xs);font-weight:var(--dmo-fw-semibold)}
html body .dmo-filter-bar>.dmo-field:has(>.dmo-button)>.dmo-label{display:none}
html body :is(.ferr-form-grid,.peso-form-grid)>.dmo-field>.dmo-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* Tabelas: UMA só regra para toda a app (Diogo, 16/10/2026). As linhas são
   brancas; o hover é azul-claro; a linha selecionada inverte como os botões
   (fundo azul, letra branca). Um clique seleciona, o duplo clique ou o Enter
   abrem. Não há círculo de seleção visível: o rádio fica no markup (é o valor
   submetido) mas escondido, e a sua coluna não ocupa espaço. */
html body .dmo-table tbody tr{background:var(--dmo-card)}
html body .dmo-table tbody :is(tr[data-dmo-row],tr:has(>td>input[type=radio]),[data-dmo-row]){cursor:pointer;transition:background var(--dmo-fast),color var(--dmo-fast)}
/* O destaque da linha (Diogo, 17/10/2026: «a forma como encaixa no
   background»): desenhado nas células, com cantos arredondados nas pontas e
   uma barra fina à esquerda, dentro da tabela, que tem uma pequena margem
   para o destaque nunca tocar na borda do cartão. Rato por cima: o azul claro da paleta (--dmo-row-hover);
   linha escolhida: o azul da paleta com letra branca. */
html body .dmo-table-wrap:has(>.dmo-table tbody [data-dmo-row]){padding:4px}
html body .dmo-table-wrap:has(>.dmo-table tbody [data-dmo-row]) thead th:first-child{border-radius:7px 0 0 7px}
html body .dmo-table-wrap:has(>.dmo-table tbody [data-dmo-row]) thead th:last-child{border-radius:0 7px 7px 0}
html body .dmo-table tbody :is(tr[data-dmo-row],tr:has(>td>input[type=radio])):hover>td{background:var(--dmo-row-hover)}
html body .dmo-table tbody :is(tr,[data-dmo-row]):is(.selected,[aria-selected="true"],:has(>td>input[type=radio]:checked)){color:var(--dmo-text-on-color);outline:0}
html body .dmo-table tbody :is(tr,[data-dmo-row]):is(.selected,[aria-selected="true"],:has(>td>input[type=radio]:checked))>td{background:var(--dmo-brand-600)}
html body .dmo-table tbody :is(tr,[data-dmo-row]):is(.selected,[aria-selected="true"],:has(>td>input[type=radio]:checked)) :is(td,strong,b,a,h4,span:not(.dmo-pill)){color:inherit}
html body .dmo-table tbody tr:is(:is([data-dmo-row],:has(>td>input[type=radio])):hover,.selected,[aria-selected="true"],:has(>td>input[type=radio]:checked))>td:is(:first-child:not(:has(>input[type=radio])),:first-child:has(>input[type=radio])+td){border-radius:7px 0 0 7px;box-shadow:inset 3px 0 0 var(--dmo-brand-600)}
html body .dmo-table tbody tr:is(:is([data-dmo-row],:has(>td>input[type=radio])):hover,.selected,[aria-selected="true"],:has(>td>input[type=radio]:checked))>td:last-child{border-radius:0 7px 7px 0}
html body .dmo-table tbody tr:is(:is([data-dmo-row],:has(>td>input[type=radio])):hover,.selected,[aria-selected="true"],:has(>td>input[type=radio]:checked))>td:is(:first-child:not(:has(>input[type=radio])),:first-child:has(>input[type=radio])+td):last-child{border-radius:7px}
/* As linhas de separação não atravessam o destaque. */
html body .dmo-table tbody tr:is(:is([data-dmo-row],:has(>td>input[type=radio])):hover,.selected,[aria-selected="true"],:has(>td>input[type=radio]:checked))>td,
html body .dmo-table tbody tr:is(:is([data-dmo-row],:has(>td>input[type=radio])):hover,.selected,[aria-selected="true"],:has(>td>input[type=radio]:checked))+tr>td{border-top-color:transparent}
html body .dmo-table tbody :is(tr,[data-dmo-row]):focus-visible{outline:2px solid var(--dmo-brand-700);outline-offset:-2px}
html body .dmo-table td>input[type=radio]{position:absolute;opacity:0;width:0;height:0;margin:0;pointer-events:none}
html body .dmo-table :is(th,td):first-child:has(>input[type=radio]),
html body .dmo-table:has(td:first-child>input[type=radio]) thead th:first-child:empty{width:1px;padding:0}

/* Sugestões ao escrever (DMO-044, js/dmo-suggest.js): a lista por baixo do
   campo e o select longo transformado em filtro, com o aspeto dos campos. */
html body .dmo-suggest{position:relative;display:block;min-width:0}
html body .dmo-suggest > input{width:100%}
html body .dmo-suggest-native{position:absolute !important;width:1px !important;height:1px !important;min-height:0 !important;padding:0 !important;border:0 !important;opacity:0;pointer-events:none;bottom:0;left:0}
html body input.dmo-suggest-input{box-sizing:border-box;min-width:0;min-height:var(--dmo-control-height);padding:8px 11px;border:1px solid var(--dmo-border);border-radius:var(--dmo-r-control);background-color:var(--dmo-field);color:var(--dmo-text);font-family:inherit;font-size:var(--dmo-fs-base);font-weight:var(--dmo-fw-regular);line-height:1.2}
html body input.dmo-suggest-combo{padding-right:32px;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' fill='none' stroke='%2364778a' stroke-width='1.6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 11px center}
html body input.dmo-suggest-input:focus{border-color:var(--dmo-brand-600);outline:none;box-shadow:0 0 0 3px rgba(68,100,124,.13)}
/* Texto ao centro nos campos (Diogo, 20/10/2026: «verificar centramento de
   todos»): com a Inter a 14 px e line-height 1.2, o Chromium punha o texto dos
   campos e dos selects 1 px acima do centro (os botões já o centram com o
   text-box). Um píxel a mais em cima e a menos em baixo, com a mesma altura,
   em todos os campos partilhados. */
html body :is(.dmo-field input:not([type=radio]):not([type=checkbox]),.dmo-field select,.beta-light-fields input,.beta-light-fields select,.beta-light-tool-view input,.beta-light-tool-view select,.dmo-search-form input[type="search"],.dmo-search-form select,select:not([multiple]):not([size]),input.dmo-suggest-input){padding-top:9px;padding-bottom:7px}
/* As datas e horas têm a caixa interna do browser mais alta: a mesma altura fixa dos outros campos e dos botões. */
html body input:is([type=date],[type=datetime-local],[type=time],[type=month]){height:var(--dmo-control-height)}
html body input.dmo-suggest-input:disabled{background-color:var(--dmo-subtle);color:var(--dmo-muted);cursor:not-allowed}
html body .dmo-suggest-list{position:fixed;z-index:200;min-width:220px;max-height:min(320px,50vh);overflow-y:auto;margin:0;padding:4px;list-style:none;background:var(--dmo-card);border:1px solid var(--dmo-border);border-radius:var(--dmo-r-control);box-shadow:var(--dmo-shadow-menu)}
html body .dmo-suggest-list li{padding:8px 10px;border-radius:6px;font-size:var(--dmo-fs-base);font-weight:var(--dmo-fw-regular);color:var(--dmo-text);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
html body .dmo-suggest-list li:hover,
html body .dmo-suggest-list li.active{background:var(--dmo-brand-050);color:var(--dmo-brand-700)}
html body .dmo-suggest-list li[aria-selected="true"]{font-weight:var(--dmo-fw-semibold)}
html body .dmo-suggest-list li.dmo-suggest-empty{color:var(--dmo-muted);cursor:default;background:none}

/* A dica de ajuda (partial _DmoHelp): círculo vazio com «?», à direita e acima da palavra; cheio ao passar o rato,
   assente na linha de base e da altura das maiúsculas do texto ao lado; ao
   passar o rato inverte a cor (preenchido ↔ contorno) e mostra o texto.
   Num cartão sem título, .dmo-help-corner põe-no no canto de cima. */
/* A dica fica sempre no mesmo sítio em relação ao texto (Diogo, 22/10/2026): em em, à altura das maiúsculas, em cima à direita da última palavra, seja qual for o tamanho da letra; em linha ou num flex (align-self:baseline). */
/* UM SÓ TAMANHO E UM SÓ SÍTIO (Diogo, 23/10/2026: «normalizar os círculos do help, as páginas variam, meter mais pequeno e da mesma forma posição para tudo»):
   8px, a 3px da palavra, e elevado como um expoente — o fundo do círculo 4px abaixo do topo das maiúsculas (a caixa da dica tem a altura das
   maiúsculas, .72em, assente na linha de base) — igual em títulos de página, de cartão, rótulos e botões. Tudo em px, nunca em em. */
.dmo-help{position:relative;display:inline-block;width:8px;height:.72em;font-size:inherit;vertical-align:baseline;align-self:baseline;margin-left:3px;cursor:help;outline:none;line-height:1;flex:none}
/* Um título flex com dica alinha pela linha de base, para a dica ficar no mesmo sítio que num título em linha
   (!important: os títulos das páginas, como .def-parte > h3, têm align-items:center mais específico). */
html body :is(h1,h2,h3,h4,label,legend,summary):has(>:is(.dmo-help,.dmo-com-ajuda)){align-items:baseline!important}
.dmo-help-mark{position:absolute;left:0;top:-4px;display:block;overflow:visible;width:8px;height:8px}
.dmo-help-mark circle{fill:transparent;stroke:var(--dmo-palette-ocean);stroke-width:1.3;transition:fill var(--dmo-fast)}
.dmo-help:hover .dmo-help-mark circle,.dmo-help:focus .dmo-help-mark circle{fill:var(--dmo-palette-ocean)}
.dmo-help:focus-visible{outline:2px solid var(--dmo-palette-mist);outline-offset:2px;border-radius:50%}
.dmo-help-tip{display:none;position:absolute;z-index:50;top:calc(100% + 6px);left:-8px;width:max-content;max-width:320px;padding:8px 10px;border-radius:var(--dmo-r-control);background:var(--dmo-palette-slate);color:var(--dmo-text-on-color);font-size:var(--dmo-fs-sm);font-weight:var(--dmo-fw-regular);letter-spacing:0;text-transform:none;text-align:left;line-height:1.4;white-space:normal;box-shadow:var(--dmo-shadow-menu)}
.dmo-help:hover .dmo-help-tip,.dmo-help:focus .dmo-help-tip,.dmo-help:focus-within .dmo-help-tip{display:block}
/* O texto da dica é sempre branco, mesmo dentro de blocos que pintam os <span> (como o cabeçalho da lista do Job On). */
html body .dmo-help .dmo-help-tip{color:var(--dmo-text-on-color)}
/* A dica dentro de um <summary> não é focável: abre com o foco do <summary> ou com um toque (classe do script). */
summary:focus-visible .dmo-help[data-dmo-help-sumario] .dmo-help-mark circle,.dmo-help.dmo-help-aberta .dmo-help-mark circle{fill:var(--dmo-palette-ocean)}
summary:focus-visible .dmo-help[data-dmo-help-sumario] .dmo-help-tip,.dmo-help.dmo-help-aberta .dmo-help-tip{display:block}
.card:has(>.dmo-help-corner){position:relative}
/* Ao lado de um botão (Diogo, 22/10/2026): por cima da aresta de cima do botão, como um expoente, nunca ao meio. */
/* Ao lado de um botão, a mesma regra: em cima à direita do texto do botão. */
:is(.dmo-button,button,.dmo-options)+.dmo-help{margin-left:3px}
/* Um elemento e a sua ajuda juntos (p. ex. a etiqueta «Só de leitura»): o gap de um título
   em flex não os separa e a ajuda fica encostada e elevada como nos outros títulos. */
html body .dmo-com-ajuda{display:inline-flex;align-items:baseline}
/* Um controlo com ajuda dentro de uma linha: o círculo fica encostado ao seu e longe do seguinte (Diogo, 23/10/2026). */
html body .dmo-com-ajuda:not(:last-child){margin-right:.4em}
/* Ao lado de uma caixa ou de um botão, o círculo sobe ao canto de cima, à direita (Diogo, 23/10/2026). */
html body .dmo-com-ajuda>:is(select,.dmo-button,.jobon-procura)+.dmo-help{align-self:flex-start}
.dmo-help-corner{position:absolute;top:14px;right:14px}
.dmo-help-corner .dmo-help{margin-left:0}
.dmo-help-corner .dmo-help-tip{left:auto;right:-8px}
/* O título com dica fica com o espaço que a nota por baixo dele ocupava. */
html body :is(.dmo-card,.beta-bq-layout .card) h3:has(>.dmo-help){margin-bottom:12px}
html body :is(.dmo-card,.beta-bq-layout .card) h3:has(>.dmo-help)+:is(.card-note,.muted){margin-top:-8px}

/* Separador com dropdown na barra de funções (o «Funções» do Controlo). */
html body .dmo-shell-navigation>.dmo-secondary-nav:has(.dmo-tab-menu){overflow:visible}
html body .dmo-secondary-nav .dmo-tab-menu{position:relative;display:flex;align-items:stretch}
html body .dmo-secondary-nav .dmo-tab-menu>summary{display:inline-flex;align-items:center;gap:6px;padding:0 5px;border-bottom:3px solid transparent;color:var(--dmo-muted);font-size:var(--dmo-fs-base);font-weight:var(--dmo-fw-semibold);cursor:pointer;list-style:none;white-space:nowrap;user-select:none}
html body .dmo-secondary-nav .dmo-tab-menu>summary::-webkit-details-marker{display:none}
html body .dmo-secondary-nav .dmo-tab-menu>summary:hover,
html body .dmo-secondary-nav .dmo-tab-menu>summary.active,
html body .dmo-secondary-nav .dmo-tab-menu[open]>summary{color:var(--dmo-brand-700);border-bottom-color:var(--dmo-brand-600)}
/* Triângulo de recolher: ver .dmo-caret. */
html body .dmo-secondary-nav .dmo-tab-menu-list{position:absolute;top:100%;left:0;z-index:60;display:flex;flex-direction:column;min-width:190px;margin-top:1px;padding:6px;background:var(--dmo-card);border:1px solid var(--dmo-border);border-radius:var(--dmo-r-control);box-shadow:var(--dmo-shadow)}
html body .dmo-secondary-nav .dmo-tab-menu-list a{display:block;padding:9px 10px;border:0;border-radius:6px;color:var(--dmo-text);white-space:nowrap}
html body .dmo-secondary-nav .dmo-tab-menu-list a:hover{background:var(--dmo-subtle);color:var(--dmo-brand-700)}
html body .dmo-secondary-nav .dmo-tab-menu-list a.active{background:var(--dmo-brand-050);color:var(--dmo-brand-700)}
/* «Opções»: as ações raras de uma folha num só botão com dropdown (menos
   clutter, Diogo 17/10/2026). Fecha ao clicar fora ou com Esc (dmo-live.js). */
html body .dmo-options{position:relative;display:inline-block}
html body .dmo-options>summary{display:inline-flex;align-items:center;gap:6px;list-style:none;cursor:pointer;user-select:none}
html body .dmo-options>summary::-webkit-details-marker{display:none}
/* Triângulo de recolher/abrir: uma regra para tudo (Diogo, 22/10/2026: «sempre do
   lado esquerdo e mais perto do font»). Sempre à esquerda do texto, tamanho e cor
   fixos; fechado aponta para a direita, aberto roda para baixo. Nenhuma página
   define o seu (guarda em SharedComponentsTests). */
html body summary{list-style:none}
html body summary::-webkit-details-marker{display:none}
html body .dmo-caret{display:inline-block;flex:none;width:6px;height:9px;margin-right:.25em;vertical-align:.02em;background:currentColor;clip-path:polygon(0 0,100% 50%,0 100%);transition:transform var(--dmo-fast)}
html body :is(details[open]>summary,[aria-expanded="true"]) .dmo-caret{transform:rotate(90deg)}
html body details:not([open])>summary .dmo-caret{transform:none}
/* Um só triângulo (Diogo, 26/10/2026: «dois triângulos»): o título de um card que abre e fecha já traz o .dmo-caret; o desenhado pelo .dmo-card-topo do design system sai. */
html body summary.dmo-card-topo>:first-child::before{content:none}
/* Só a folga do triângulo conta: o gap do contentor não se soma. */
html body :is(summary,.def-menu-titulo):not(.job-tool-card-head):has(>.dmo-caret:first-child){column-gap:0}
html body .job-tool-card-head>.dmo-caret{margin-right:calc(.25em - 10px)}
html body .dmo-options-list{position:absolute;top:100%;left:0;z-index:60;display:flex;flex-direction:column;min-width:210px;margin-top:4px;padding:6px;background:var(--dmo-card);border:1px solid var(--dmo-border);border-radius:var(--dmo-r-control);box-shadow:var(--dmo-shadow)}
html body .dmo-options-list form{display:block;margin:0}
html body .dmo-options-item{display:block;width:100%;min-height:0;padding:9px 10px;border:0;border-radius:6px;background:none;color:var(--dmo-text);font:inherit;font-size:var(--dmo-fs-base);text-align:left;white-space:nowrap;cursor:pointer}
html body .dmo-options-item:is(:hover,:focus-visible){background:var(--dmo-brand-050);color:var(--dmo-brand-700);outline:0}
/* Cartões de informação (componente partilhado, Diogo 17/10/2026): um rótulo
   curto em maiúsculas e o valor por baixo, com a barra azul à esquerda.
   Modelo em docs/ui-reference/componentes-partilhados.md. */
html body .dmo-facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:9px;margin-top:10px}
html body .dmo-fact{padding:10px 12px;border-left:3px solid var(--dmo-brand-600);background:var(--dmo-subtle);border-radius:8px;min-width:0}
html body .dmo-fact>span{display:block;color:var(--dmo-muted);font-size:10.5px;font-weight:750;text-transform:uppercase;letter-spacing:.03em}
html body .dmo-fact>strong{display:block;margin-top:3px;font-size:14px;overflow-wrap:anywhere}
html body .dmo-fact.dmo-fact-falta{border-left-color:var(--dmo-warning);background:var(--dmo-warning-soft)}
html body .dmo-fact.dmo-fact-falta>strong{color:var(--dmo-warning);font-weight:600}
/* Barras de ações afastadas dos campos e das tabelas à volta (Diogo 17/10/2026:
   «ter atenção aos botões que ficam colados a outros elementos»). */
html body .dmo-list-actions{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:12px 0}
html body .dmo-list-actions form{margin:0}
html body .dmo-fact>small{display:block;margin-top:2px;color:var(--dmo-muted);font-size:10.5px}
/* Cartões curtos empilhados na mesma coluna; um cartão sozinho estica. */
html body .dmo-fact-stack{display:grid;gap:9px;grid-auto-rows:1fr}
/* Um cartão que abre outra página: o hover inverte, como os botões. */
html body a.dmo-fact.dmo-fact-link{display:block;text-decoration:none;color:inherit;cursor:pointer}
html body a.dmo-fact.dmo-fact-link:is(:hover,:focus-visible){background:var(--dmo-brand-600);color:var(--dmo-text-on-color)}
html body a.dmo-fact.dmo-fact-link:is(:hover,:focus-visible)>span{color:inherit}
html body a.dmo-fact.dmo-fact-link>em{display:block;margin-top:4px;font-style:normal;font-size:11.5px;font-weight:700;color:var(--dmo-brand-600)}
html body a.dmo-fact.dmo-fact-link:is(:hover,:focus-visible)>em{color:inherit}
/* Job On: o dropdown das produções da procura em dois passos, a «Opções» da
   folha alinhada à direita e a tabela das produções da referência. */
html body .dmo-search-form select{box-sizing:border-box;flex:0 1 210px;min-width:0;min-height:var(--dmo-control-height);padding:9px 11px;border:1px solid var(--dmo-border);border-radius:var(--dmo-r-control);background:var(--dmo-field);color:var(--dmo-text);font:inherit;font-size:14px}
html body .beta-light-actions .dmo-options-list{left:auto;right:0}
/* Opções no canto superior direito de um cartão: o menu abre para a esquerda e não sai do ecrã (21/10/2026). */
html body .dmo-card-topo-acoes .dmo-options-list{left:auto;right:0}
html body .jobon-ref-productions{margin-top:18px}
html body .jobon-ref-productions h3{margin:0;font-size:15px}
html body .jobon-ref-productions .dmo-table-wrap{margin-top:10px}
html body .jobon-ref-productions tr[data-dmo-row]{cursor:pointer}
html body .jobon-ref-productions tr.jobon-ref-current td{background:var(--dmo-brand-050)}
/* As Opções da ficha estão no topo, ao lado do Fechar (beta.156): a lista abre para baixo e, no telemóvel, os dois botões ficam na mesma linha. */
html body #lightFicha>.beta-light-sheet-head>.beta-light-actions{flex-direction:row;flex-shrink:0}
html body a.dmo-options-item{text-decoration:none}
html body .beta-light-productions .beta-light-card-head h2{white-space:nowrap}
html body .beta-light-productions .dmo-search-form{flex-wrap:nowrap}
html body .beta-light-productions .dmo-search-form input[type="search"]{flex:0 1 170px;width:170px}
html body .beta-light-productions .dmo-search-form select{flex:0 1 170px}
html body .beta-light-productions .dmo-search-form .dmo-button{flex:0 0 auto}
/* O dropdown «Produção» da procura do Job On fica à frente do campo, com a mesma largura (beta.166). */
html body .dmo-search-form .jobon-procura{display:contents}
/* O dropdown com produções destaca-se (Diogo, 19/10/2026). */
html body .dmo-search-form select.jobon-procura-com-resultados{border-color:var(--dmo-palette-slate);background-color:var(--dmo-brand-050);color:var(--dmo-palette-slate);font-weight:700;box-shadow:0 0 0 3px var(--dmo-focus-ring)}
@media(max-width:700px){html body .beta-light-productions .dmo-search-form{flex-wrap:wrap;width:100%}html body .beta-light-productions .dmo-search-form :is(input[type="search"],select){flex:1 1 160px;width:auto}}
/* A janela pequena (Diogo, 17/10/2026): as ações de correção abrem numa
   janela, sem empurrar a página. */
html body .dmo-dialog{width:min(520px,calc(100vw - 32px));padding:20px;border:1px solid var(--dmo-border);border-radius:12px;background:var(--dmo-card);color:var(--dmo-text);box-shadow:var(--dmo-shadow)}
html body .dmo-dialog::backdrop{background:rgba(20,45,70,.45)}
html body .dmo-dialog h3{margin:0 0 12px;font-size:16px}
html body .dmo-dialog form{display:grid;gap:10px;margin:0}
html body .dmo-dialog input[type=url]{width:100%;min-height:40px;padding:8px 10px;border:1px solid var(--dmo-border);border-radius:var(--dmo-r-control);font:inherit}
html body .dmo-dialog textarea{width:100%;padding:8px 10px;border:1px solid var(--dmo-border);border-radius:var(--dmo-r-control);font:inherit;font-size:var(--dmo-fs-base);line-height:1.45;resize:vertical}
html body .dmo-dialog textarea:focus{border-color:var(--dmo-brand-600);outline:0}
html body .dmo-dialog-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:4px}
html body .dmo-dialog .dmo-dialog-cancel{background:none;border-color:var(--dmo-border);color:var(--dmo-brand-700)}
/* Job On: as produções encontradas ao escrever, por baixo do campo e afastadas dele. */

/* Avisos (Diogo 17/10/2026: «estes notices estão sempre colados aos
   elementos»). Um aviso nunca fica colado ao que vem antes ou depois; quando a
   página define a sua própria margem, essa ganha (:where não pesa).
   Componente para páginas novas: .dmo-aviso, com .warn (amarelo, pede
   atenção), .erro (vermelho) e .info (neutro, da paleta). */
html body .dmo-aviso{padding:11px 13px;border-left:4px solid var(--dmo-palette-ocean);background:var(--dmo-brand-050);border-radius:8px}
html body .dmo-aviso.warn{border-left-color:var(--dmo-warning);background:var(--dmo-warning-soft)}
html body .dmo-aviso.erro{border-left-color:var(--dmo-danger);background:var(--dmo-danger-soft)}
html body :where(.dmo-aviso,.dmt-nota,.dmt-aviso,.dmu-aviso,.dfu-aviso,.adm-aviso,.adm-nota,.ferr-aviso,.ferr-nota,.pu-aviso,.peg-aviso,.peso-aviso,.peso-aviso-simples,.resumo-aviso,.jobon-aviso):not(:last-child){margin-bottom:12px}
html body :where(form,.dmo-field,.dmo-table-wrap,fieldset,p,ul,table)+:where(.dmo-aviso,.dmt-nota,.dmt-aviso,.dmu-aviso,.dfu-aviso,.adm-aviso,.adm-nota,.ferr-aviso,.ferr-nota,.pu-aviso,.peg-aviso,.peso-aviso,.peso-aviso-simples,.resumo-aviso,.jobon-aviso){margin-top:12px}
/* O link de um aviso para a página onde se resolve (Diogo, 19/10/2026: «todos
   os warning, notices ter um link para levar o user à página onde pode
   resolver»): partial _DmoAvisoLink, no fim do texto do aviso ou da mensagem
   do canto, na cor escura da paleta e sublinhado. */
html body a.dmo-aviso-link{color:var(--dmo-palette-slate);font-weight:600;text-decoration:underline;text-underline-offset:2px}
html body a.dmo-aviso-link:hover,html body a.dmo-aviso-link:focus-visible{color:var(--dmo-palette-ocean)}
/* O botão de um formulário nunca cola ao campo ou à tabela por cima dele. */
html body :where(.dmo-field,.dmo-table-wrap)+:where(button.dmo-button,.dmo-button[type=submit]){margin-top:12px}

/* Mensagens de resultado (guardado, eliminado, recusado): aparecem por cima
   da página, no canto, e nunca empurram o conteúdo (Diogo 17/10/2026: «os
   elementos têm de ficar fixos»). Marcadas com data-dmo-toast="ok|erro|aviso";
   dmo-live.js junta-as numa pilha, põe o «×» e fecha as «ok» sozinhas; as
   «erro» e os «aviso» ficam até se fecharem (ou até à ação seguinte desse
   cartão, ver o DmoTroca). */
html body [data-dmo-toast]{position:fixed;top:140px;right:16px;z-index:1000;box-sizing:border-box;width:max-content;max-width:min(420px,calc(100vw - 32px));margin:0!important;padding:12px 40px 12px 14px;border:1px solid var(--dmo-border);border-left:4px solid var(--dmo-palette-ocean);border-radius:var(--dmo-r-control);background:var(--dmo-card);color:var(--dmo-text);font-size:var(--dmo-fs-base);line-height:1.4;box-shadow:0 10px 30px rgba(27,40,50,.16)}
html body [data-dmo-toast="erro"]{border-left-color:var(--dmo-danger);background:var(--dmo-danger-soft)}
html body [data-dmo-toast="aviso"]{border-left-color:var(--dmo-warning);background:var(--dmo-warning-soft)}
html body .dmo-toast-pilha{position:fixed;top:140px;right:16px;z-index:1000;display:flex;flex-direction:column;align-items:flex-end;gap:8px;pointer-events:none}
html body .dmo-toast-pilha [data-dmo-toast]{position:relative;top:auto;right:auto;pointer-events:auto;transition:opacity .2s ease,transform .2s ease}
html body .dmo-toast-pilha [data-dmo-toast].a-sair{opacity:0;transform:translateY(-6px)}
html body .dmo-toast-fechar{position:absolute;top:6px;right:6px;width:26px;height:26px;min-height:0;padding:0;border:0;border-radius:6px;background:none;color:var(--dmo-muted);font-size:18px;line-height:1;cursor:pointer}
html body .dmo-toast-fechar:is(:hover,:focus-visible){background:var(--dmo-brand-100);color:var(--dmo-text);outline:0}

/* A procura ao escrever espera pela lista do texto novo (ver o DmoTroca): a
   lista anterior fica esbatida, porque não se pode escolher. O atraso de
   0,3 s evita que pisque a cada tecla; ao sair da espera volta logo. */
html body [data-dmo-procura-espera]{opacity:.55;transition:opacity .15s ease .3s}
@media (max-width:640px){html body :is([data-dmo-toast],.dmo-toast-pilha){top:auto;bottom:16px;left:16px;right:16px}html body .dmo-toast-pilha{align-items:stretch}html body .dmo-toast-pilha [data-dmo-toast]{width:auto;max-width:none}}

/* Um formulário que espera na fila do DmoTroca, num elemento novo (a zona
   trocou com a resposta de outro envio): mostra o que foi enviado, com um
   fundo claro e o cursor de espera, sem mexer no layout. Sai quando a
   resposta dele chega e o formulário volta limpo. */
html body [data-dmo-a-gravar]:is(input,select,textarea){background-color:var(--dmo-brand-050);cursor:progress}
html body [data-dmo-a-gravar]:is(button,input[type=submit],input[type=image]){cursor:progress;opacity:.6}

/* Uma zona do «atualizar só o que muda» (data-dmo-regiao) dentro de um flex ou grid com gap: a zona não cria caixa, os cartões ficam com o espaço de sempre. */
.dmo-zona{display:contents}

/* Ecrã pequeno (teste no Chromium de 22/10/2026: o Peso e os Pegamentos passavam da largura a 360 px). Só abaixo de 600 px; o desktop fica igual.
   A etiqueta do ambiente encolhe com reticências para o «Sair» caber; as funções do módulo passam à linha seguinte em vez de saírem do ecrã; os botões do topo de um cartão quebram o texto. */
@media(max-width:600px){
html body .dmo-shell-header .dmo-env-badge{flex:0 1 auto;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;display:block;line-height:26px}
html body .dmo-shell-navigation>.dmo-secondary-nav:has(.dmo-tab-menu){flex-wrap:wrap;height:auto;row-gap:0}
html body .dmo-shell-navigation>.dmo-secondary-nav:has(.dmo-tab-menu)>:is(a,.dmo-tab-menu){min-height:44px}
html body .dmo-card-topo-acoes{min-width:0;max-width:100%}
html body .dmo-card-topo-acoes :is(.dmo-button,.button,.btn){white-space:normal;text-align:center}
}
/* O ponto do Sumário no separador do Planeamento (Diogo, 23/10/2026): um
   ponto pequeno, sem número, quando há importantes por ver. */
.dmo-tab-novo::after{content:"";display:inline-block;width:7px;height:7px;margin-inline-start:6px;border-radius:50%;background:var(--dmo-warning);vertical-align:super}
/* Links dentro dos mini-cartões e dos valores de resumo (Diogo, 23/10/2026): a cor do
   valor, sem sublinhado (também no hover); o cursor de mão e uma mudança ligeira de cor
   mostram que se pode carregar. Claro e escuro pelos tokens. */
html body :is(.dmo-fact,.dmo-facts,.dmo-fact-stack,.pu-fact,.pu-stat,.peso-fact,.peso-facts,.revisao-facts,.facts,.fact-col,.lot-data,.resumo-stats,.jobon-production-facts,.job-tool-card-facts) a:not(.dmo-button):not(.btn){color:inherit;text-decoration:none;cursor:pointer;transition:color var(--dmo-fast)}
html body :is(.dmo-fact,.dmo-facts,.dmo-fact-stack,.pu-fact,.pu-stat,.peso-fact,.peso-facts,.revisao-facts,.facts,.fact-col,.lot-data,.resumo-stats,.jobon-production-facts,.job-tool-card-facts) a:not(.dmo-button):not(.btn):is(:hover,:focus-visible){color:var(--dmo-brand-700);text-decoration:none}
/* Um cartão que é ele próprio o link (a.dmo-fact-link) enche-se com a cor da barra: a letra fica branca, não a azul dos links dentro dos cartões (Diogo, 26/10/2026). */
html body .dmo-facts a.dmo-fact.dmo-fact-link:not(.dmo-button):not(.btn):is(:hover,:focus-visible){color:var(--dmo-text-on-color)}
html body .dmo-facts a.dmo-fact.dmo-fact-link.dmo-fact-falta:is(:hover,:focus-visible){background:var(--dmo-warning)}
html body .dmo-facts a.dmo-fact.dmo-fact-link.dmo-fact-falta:is(:hover,:focus-visible)>strong{color:inherit}

/* .dmo-uso-cheio: a ferramenta com 100% ou mais de uso (UsoCheio.ClasseDe) — só a cor do tool_id, da referência e do lote muda; nunca aviso nem bloqueio (Diogo, 23/10/2026). */
html body .dmo-uso-cheio{color:color-mix(in srgb,var(--dmo-warning) 70%,var(--dmo-text))}
