@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=Manrope:wght@400;500;600;700;800&display=swap');

:root{
  /* Paleta neutra "fria" (cinza-azulado) em vez do bege quente antigo —
     o fundo bege/creme e o preto acastanhado davam um ar datado; passou
     a um cinza claro moderno com preto neutro, no estilo do que se vê em
     apps atuais (Linear/Notion/Vercel). Contrastes recalculados e todos
     acima do mínimo WCAG AA de 4.5:1 para texto normal. Mesmo ajuste
     replicado abaixo para o tema escuro. Pedido do Filipe, 17/09/2026. */
  /* --paper voltou ao tom claro de antes (o escurecimento uniforme não
     agradou); a separação entre o fundo da página e os cartões brancos
     passou a vir de um ligeiro degradê no fundo (ver --paper-gradient,
     usado só no <body>) em vez de escurecer o cinzento sólido usado
     também em inputs/chips. Pedido do Filipe, 17/09/2026. */
  --ink:#12151b; --ink-dim:#565b66; --ink-faint:#5b6270;
  --paper:#f2f3f5; --panel:#ffffff; --line:#e1e3e8; --line-soft:#ecedf1;
  --paper-gradient: linear-gradient(160deg, #f8f9fb 0%, #eef0f3 45%, #e3e6eb 100%);
  /* Dourado real da marca (logótipo pcspeed) — mantido tal como pedido
     pelo Filipe em 16/09/2026, agora a destacar-se ainda mais sobre o
     cinza neutro do que sobre o bege antigo. copper-ink escuro porque o
     dourado claro não dá contraste suficiente com texto branco. */
  --copper:#e3a62e; --copper-2:#f0c468; --copper-ink:#201c1a; --copper-wash:#faeed9;
  /* Tom mais claro do dourado, só para o degradê do cartão "Processos
     abertos" do dashboard — pedido do Filipe, 17/09/2026. O --copper
     normal (mais escuro) continua igual em todo o resto (botões, etc.). */
  --copper-light:#f0c468; --copper-light-2:#f8e0a3;
  --blue:#35688f; --blue-wash:#dde8ee;
  --moss:#3e7a56; --moss-wash:#dfeae3;
  --amber:#a8791f; --amber-wash:#f1e6cd;
  --rust:#a93b33; --rust-wash:#f2ddda;
  /* Verde/vermelho mais vivos que --moss/--rust (que são propositadamente
     abafados, para os "chips" de estado do dia a dia) — só para os
     gráficos redondos do dashboard, onde o Filipe pediu mais vivacidade
     sem ficar berrante. Pedido do Filipe, 16/09/2026. */
  --moss-vivid:#1f9d55; --rust-vivid:#dd3d3d;
  --violet:#6a5b9e; --violet-wash:#e7e2f3;
  /* --shadow igualado ao --shadow-lg (que antes só uns quantos cartões
     usavam) — pedido do Filipe, 17/09/2026, para a sombra mais visível
     ficar em todos os cartões/painéis da app, não só nalguns. */
  --shadow: 0 2px 6px rgba(15,23,42,.07), 0 28px 56px -22px rgba(15,23,42,.28);
  --shadow-lg: 0 2px 6px rgba(15,23,42,.07), 0 28px 56px -22px rgba(15,23,42,.28);
  /* Sombra própria da barra lateral — mesmo degradê em duas camadas do
     --shadow normal, mas projetada para o lado (a barra fica encostada
     à esquerda) em vez de para baixo. Pedido do Filipe, 17/09/2026. */
  --shadow-aside: 2px 0 6px rgba(15,23,42,.07), 20px 0 40px -26px rgba(15,23,42,.28);
  /* Radius aumentado (14->20 / 9->13), pedido do Filipe 16/09/2026: visual
     mais próximo das referências (Crextio/Flavorfit) — cartões e campos
     com cantos bem arredondados em vez do estilo anterior, mais reto. */
  --radius: 20px;
  --radius-sm: 13px;
  --grad-copper: linear-gradient(135deg, var(--copper), var(--copper-2));
  color-scheme: light dark;
}
/* Antes dependia de @media (prefers-color-scheme: dark) — o modo
   "Automático" foi retirado (não activava no desktop do Filipe porque o
   SO não comunicava o tema ao browser). Agora o tema escuro só depende
   do atributo data-theme="dark", posto sempre de forma explícita pelo
   script anti-flash em base.html e pelo botão da barra lateral — nunca
   do sistema operativo. Pedido do Filipe, 17/09/2026. */
:root[data-theme="dark"]{
  /* Mesmo ajuste do lado claro: --paper volta ao tom de antes, e a
     separação para --panel vem do degradê (--paper-gradient) no <body>,
     não de escurecer o cinzento sólido. Pedido do Filipe, 17/09/2026. */
  --ink:#eef0f3; --ink-dim:#aab0bb; --ink-faint:#868d99;
  --paper:#0f1216; --panel:#181c22; --line:#2a2f38; --line-soft:#20242c;
  --paper-gradient: linear-gradient(160deg, #15181d 0%, #0f1216 45%, #090b0d 100%);
  --copper:#e8b23e; --copper-2:#f3cb70; --copper-ink:#201c1a; --copper-wash:#3d2f14;
  --copper-light:#f3cb70; --copper-light-2:#f8dda0;
  --blue:#82b3d8; --blue-wash:#20313d;
  --moss:#7ecb9c; --moss-wash:#1e3327;
  --amber:#e0b45c; --amber-wash:#3a2f18;
  --rust:#e2867d; --rust-wash:#3a2320;
  --moss-vivid:#34d17c; --rust-vivid:#f0655d;
  --violet:#ab9bd6; --violet-wash:#2c2740;
}
*{box-sizing:border-box;}
body{margin:0;background:var(--paper-gradient);background-attachment:fixed;color:var(--ink);font-family:'Manrope','IBM Plex Sans',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;-webkit-font-smoothing:antialiased;line-height:1.45;}
.mono{font-family:'IBM Plex Mono',ui-monospace,'SFMono-Regular',Menlo,monospace;}
a{color:inherit;text-decoration:none;}
button,input,select,textarea{font-family:inherit;}

/* Transições subtis — sensação de app "viva" sem exageros: um fade+subir
   ligeiro quando cada página carrega (troca de página = navegação normal
   do browser, mas isto disfarça o corte seco), e um easing consistente
   nos elementos interativos mais comuns. */
@keyframes pageIn{from{opacity:0;transform:translateY(7px);}to{opacity:1;transform:translateY(0);}}
main{animation:pageIn .32s cubic-bezier(.22,.61,.36,1) both;}
@media (prefers-reduced-motion: reduce){ main{animation:none;} }
.qbtn, .chip, .client-card, .card, table tbody tr td, .sidenav-links a,
.pill, .complete-bar span, .tl-dot, .field input, .field select, .field textarea,
.field-h input, .field-h select, .field-h textarea{
  transition: background-color .15s ease, border-color .15s ease, color .15s ease,
              box-shadow .18s ease, transform .15s ease, width .3s ease;
}

/* Layout: barra lateral fixa e sempre visível (nunca painéis deslizantes
   no ecrã principal) + conteúdo a ocupar toda a largura disponível. */
.shell{display:flex;min-height:100vh;}
/* Barra lateral presa à altura do ecrã (não à altura do conteúdo) — o
   logótipo no topo e o utilizador ligado no fundo ficam sempre visíveis
   sem scroll; só a lista de páginas no meio faz scroll própria, e só se
   algum dia não couber. Pedido do Filipe, 10/09/2026. Padding-bottom
   reserva o espaço do rodapé fixo (.app-footer, ~37px), para o bloco do
   utilizador não ficar escondido por baixo dele — bug reportado pelo
   Filipe no mesmo dia. */
.sidenav{width:220px;flex-shrink:0;display:flex;flex-direction:column;background:var(--panel);border-right:1px solid var(--line);position:sticky;top:0;height:100vh;padding-bottom:40px;box-shadow:var(--shadow-aside);z-index:20;}
.sidenav-brand{display:flex;flex-direction:column;gap:2px;padding:20px 18px 16px;flex-shrink:0;}
.sidenav-brand .brand-logo{height:24px;width:auto;display:block;align-self:flex-start;}
.sidenav-brand .sub{font-size:10.5px;color:var(--ink-faint);font-family:'IBM Plex Mono';letter-spacing:.04em;text-transform:uppercase;}
.sidenav-links{display:flex;flex-direction:column;gap:2px;padding:8px 10px;flex:1;min-height:0;overflow-y:auto;}
.sidenav-links a{display:flex;align-items:center;gap:11px;color:var(--ink-dim);font-size:13.5px;font-weight:500;padding:9px 12px;border-radius:9px;position:relative;}
.sidenav-links a svg{width:17px;height:17px;flex-shrink:0;}
.sidenav-links a:hover{background:var(--line-soft);color:var(--ink);}
/* Pílula escura para o item ativo, em vez do fundo cobre + risco à
   esquerda — visual pedido pelo Filipe 16/09/2026 (referências Crextio/
   Flavorfit, nav ativa como pílula preta cheia). */
.sidenav-links a.active{background:var(--ink);color:var(--paper);font-weight:600;border-radius:99px;}
.sidenav-user{display:flex;align-items:center;gap:10px;padding:14px 16px;border-top:1px solid var(--line);flex-shrink:0;}
.sidenav-user .avatar{width:32px;height:32px;border-radius:50%;background:var(--blue-wash);color:var(--blue);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;font-family:'IBM Plex Mono';flex-shrink:0;}
.sidenav-user-info{display:flex;flex-direction:column;gap:1px;min-width:0;font-size:12.5px;}
.sidenav-user-info span{font-weight:500;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sidenav-user-info a{color:var(--ink-faint);font-size:11.5px;}
.sidenav-user-info a:hover{color:var(--ink);text-decoration:underline;}
.sidenav-sair{color:var(--ink-faint);font-size:11.5px;margin-left:auto;}
.sidenav-sair:hover{color:var(--rust);}
/* Botão de tema (claro/escuro, sem automático — pedido do Filipe,
   17/09/2026) — ver wireThemeToggle() em app.js e o script anti-flash em
   base.html. Mostra só o ícone do estado ATUAL (marcado via data-tema no
   próprio botão); o outro fica escondido. */
.theme-toggle{margin-left:auto;flex-shrink:0;width:30px;height:30px;border-radius:8px;border:1px solid var(--line);background:transparent;color:var(--ink-dim);display:flex;align-items:center;justify-content:center;cursor:pointer;}
.theme-toggle:hover{background:var(--line-soft);color:var(--ink);}
.theme-toggle svg{width:16px;height:16px;}
.theme-toggle .theme-icon-light,.theme-toggle .theme-icon-dark{display:none;}
.theme-toggle[data-tema="light"] .theme-icon-light{display:block;}
.theme-toggle[data-tema="dark"] .theme-icon-dark{display:block;}

.shell-main{flex:1;min-width:0;display:flex;flex-direction:column;}

/* Submenu de Processos (pesquisa + pipeline de estados), embutido na
   navegação do site entre "Processos" e "Clientes", sempre visível em
   qualquer página — pedido do Filipe, 10/09/2026. Usa o mesmo aspeto
   visual da navegação (não o estilo "chip" usado no resto da app). */
.sidenav-submenu{display:flex;flex-direction:column;gap:1px;margin:2px 0 6px;}
.sidenav-submenu .sub-search{padding:3px 12px 7px;}
.sidenav-submenu .sub-search input{width:100%;font-size:12px;padding:6px 10px;border-radius:7px;border:1px solid var(--line);background:var(--paper);color:var(--ink);outline:none;}
.sidenav-submenu .sub-search input:focus{border-color:var(--copper);}
.sidenav-submenu .sub-group{display:flex;align-items:center;justify-content:space-between;padding:6px 12px 6px 34px;font-size:11px;font-weight:600;color:var(--ink-faint);text-transform:uppercase;letter-spacing:.03em;cursor:pointer;border-radius:8px;}
.sidenav-submenu .sub-group:hover{background:var(--line-soft);}
.sidenav-submenu .sub-link{display:flex;align-items:center;gap:8px;padding:7px 12px 7px 34px;font-size:12.5px;font-weight:500;color:var(--ink-dim);border-radius:8px;}
.sidenav-submenu .sub-link:hover{background:var(--line-soft);color:var(--ink);}
.sidenav-submenu .sub-link.active{background:var(--copper-wash);color:var(--copper);font-weight:600;}
.sidenav-submenu .sub-link .dot{width:6px;height:6px;border-radius:50%;flex-shrink:0;}
.sidenav-submenu .sub-link .n{margin-left:auto;font-family:'IBM Plex Mono';font-size:11px;color:var(--ink-faint);}
.sidenav-submenu .sub-link.active .n{color:var(--copper);}
.sidenav-submenu .sub-novo{padding:7px 12px;margin:1px 0 2px;color:var(--copper);font-weight:600;background:var(--copper-wash);}
.sidenav-submenu .sub-novo:hover{background:var(--copper-wash);filter:brightness(0.96);}
.sidenav-submenu .subgroup-v{display:flex;flex-direction:column;}

.flash{background:var(--amber-wash);color:var(--amber);padding:10px 20px;font-size:13px;}

main{flex:1;padding:26px 32px 88px;width:100%;}

.mobile-submenu-toggle{
  display:none;align-items:center;justify-content:center;flex-shrink:0;
  width:34px;height:34px;padding:0;border-radius:9px;color:var(--ink-dim);
  background:transparent;border:none;cursor:pointer;
}
.mobile-submenu-toggle:hover{background:var(--line-soft);}
.mobile-submenu-toggle svg{width:15px;height:15px;}
.mobile-submenu-toggle.open svg{transform:rotate(180deg);}

@media (max-width:780px){
  .shell{flex-direction:column;min-height:0;}
  .sidenav{width:100%;height:auto;min-height:0;padding-bottom:0;position:sticky;top:0;z-index:30;flex-direction:row;align-items:center;overflow:visible;border-right:none;border-bottom:1px solid var(--line);box-shadow:var(--shadow);}
  .sidenav-brand{padding:10px 14px;flex-shrink:0;}
  /* Esconder o subtítulo e encolher o botão de tema em telemóvel liberta
     espaço para a barra de ícones — sem isto o "GESTÃO DE PROCESSOS" e o
     botão de tema deixavam quase só ~130px para os 5 ícones de navegação
     (~175px só de largura própria), pelo que "Relatórios" e "Sistema"
     ficavam praticamente impossíveis de alcançar por scroll horizontal
     num ecrã estreito (ex.: iPhone 15, 393px). Bug reportado pelo
     Filipe, 11/09/2026 ("verifica toda a navegação no telemóvel").
     O botão de tema continua acessível — só passa a ecrãs largos. */
  .sidenav-brand .sub{display:none;}
  .theme-toggle{display:none;}
  /* flex:none (usado antes) impedia esta secção de encolher: como o
     resto da barra (logótipo + bloco do utilizador) não pode encolher,
     a barra toda ficava mais larga do que o ecrã em telemóveis estreitos
     (ex.: iPhone 15) — a página inteira ganhava scroll horizontal, e
     tudo o que é position:fixed (o rodapé, e o novo dropdown de
     Processos) passava a ser calculado contra essa largura errada em
     vez da largura real do ecrã, ficando parcialmente fora da vista.
     Com flex:1 1 auto + min-width:0 esta secção encolhe até ao espaço
     que sobra e usa o próprio overflow-x:auto para deslizar os ícones,
     em vez de empurrar a barra toda para fora do ecrã. Bug reportado
     pelo Filipe no iPhone 15 (dropdown aparecia vazio), 10/09/2026. */
  .sidenav-links{flex-direction:row;padding:6px 8px;flex:1 1 auto;min-width:0;overflow-x:auto;-webkit-overflow-scrolling:touch;}
  /* ">" (filho direto) é essencial aqui: sem ele, esta regra também
     apanhava os <span> de dentro dos "chips" do dropdown de Processos
     (.sidenav-submenu vive dentro deste <nav>, mais abaixo no DOM) — o
     texto, o número e a bolinha de cor de cada estado ficavam todos
     display:none, e o dropdown abria com o cabeçalho do grupo visível
     mas as próprias linhas de estado em branco. Era esta a causa real
     do "dropdown aparece vazio" reportado pelo Filipe no iPhone 15
     (10/09/2026) — as outras duas correções ao lado (barra sem scroll
     horizontal, dropdown como position:fixed) eram necessárias mas não
     bastavam sozinhas. Auditoria de código, 10/09/2026. */
  .sidenav-links > a span{display:none;}
  .sidenav-links > a{padding:9px;}
  .sidenav-links > a.active{padding-left:9px;border-radius:99px;}
  .sidenav-user{border-top:none;border-left:1px solid var(--line);margin-left:auto;flex-shrink:0;}
  .sidenav-user-info{display:none;}
  main{padding:16px 16px 68px;}

  /* Em ecrãs estreitos a barra lateral vira uma barra horizontal e o
     submenu de Processos (pesquisa + estados) já não cabe visível o
     tempo todo — fica um dropdown por baixo da barra, aberto ao tocar
     no botão de seta junto a "Processos". Sem isto não havia nenhuma
     forma de mudar de estado no telemóvel. Pedido do Filipe, 10/09/2026.

     Bug reportado pelo Filipe no iPhone 15, 10/09/2026: o dropdown abria
     mas aparecia vazio. Causa: este <div> vive dentro de <nav
     class="sidenav-links">, que em telemóvel tem overflow-x:auto (para a
     barra de ícones poder deslizar) — e por regra do CSS, ter overflow-x
     diferente de "visible" força overflow-y a "auto" também, mesmo sem o
     escrever. Isso recorta (esconde) qualquer conteúdo posicionado com
     position:absolute que saia da caixa da barra, incluindo este dropdown
     "pendurado" por baixo dela. Corrigido a usar position:fixed (o
     dropdown passa a ser posicionado face à janela do browser, não à
     barra com overflow, escapando ao recorte); a distância ao topo é
     calculada em JS (wireMobileSubmenuToggle em app.js) a partir da
     altura real da barra, para não desalinhar se o conteúdo da barra
     mudar de altura. Auditoria de código, 10/09/2026. */
  .mobile-submenu-toggle{display:flex;}
  .sidenav-submenu{
    display:none;position:fixed;top:60px;left:0;right:0;
    background:var(--panel);border-bottom:1px solid var(--line);
    box-shadow:var(--shadow-lg);max-height:calc(100vh - 60px);overflow-y:auto;
    flex-direction:column;margin:0;padding:8px 0 14px;z-index:35;
  }
  .sidenav-submenu.open{display:flex;}
  /* Ver comentário em base.html — escurece o resto da página enquanto o
     dropdown de estados está aberto, para ficar claro que é um painel
     por cima do conteúdo e não parte dele. "top" é calculado em JS tal
     como no próprio dropdown (posicionarSubmenu em app.js). */
  .sidenav-submenu-scrim{display:none;position:fixed;top:60px;left:0;right:0;bottom:0;background:rgba(20,15,10,.32);z-index:34;}
  .sidenav-submenu-scrim.open{display:block;}
}
.panel-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;flex-wrap:wrap;gap:10px;}
.panel-head h1{font-size:15px;margin:0;font-weight:600;}
.panel-head .count{font-size:12.5px;color:var(--ink-faint);}

.search{max-width:420px;display:flex;align-items:center;gap:8px;background:var(--panel);border:1px solid var(--line);border-radius:99px;padding:7px 14px;color:var(--ink-faint);}
.search input{border:none;background:transparent;outline:none;color:var(--ink);font-size:13.5px;width:100%;}
.sortsel{padding:8px 10px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel);color:var(--ink);font-size:12.5px;cursor:pointer;flex-shrink:0;}
/* Filtro de data nos formulários "row-inline" (registo de acessos/erros) —
   mesmo visual do .sortsel ao lado. Pedido do Filipe, 18/09/2026. */
.date-filter{padding:7px 10px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel);color:var(--ink);font-size:12.5px;flex-shrink:0;font-family:inherit;}

.pipeline{display:flex;gap:8px;padding:14px 0;overflow-x:auto;margin-bottom:6px;}
.chip{flex-shrink:0;display:flex;align-items:baseline;gap:7px;border:1px solid var(--line);background:var(--panel);padding:8px 13px;border-radius:99px;cursor:pointer;font-size:12.5px;color:var(--ink-dim);white-space:nowrap;}
.chip .n{font-family:'IBM Plex Mono';font-weight:600;font-size:14px;color:var(--ink);}
.chip:hover{border-color:var(--ink-faint);}
.chip.active{background:var(--ink);border-color:var(--ink);color:var(--paper);}
.chip.active .n{color:var(--paper);}
.chip .dot{width:7px;height:7px;border-radius:50%;align-self:center;}
.chip.toggle{border-style:dashed;}
.concl-group{display:flex;gap:8px;flex-wrap:wrap;padding:0 0 14px;}
.concl-group[hidden]{display:none;}

.proc-main{flex:1;min-width:0;}
.pager{display:flex;align-items:center;justify-content:center;gap:14px;padding:16px 0;font-size:12.5px;color:var(--ink-dim);}
.pager[hidden]{display:none;}

/* A sombra e o cartão (fundo/borda/cantos) passaram do <table> para um
   wrapper novo (.table-card) à volta do <div style="overflow-x:auto">
   que já existia em cada página com tabela — o <table> sozinho tinha a
   sombra cortada pelo overflow-x:auto do wrapper (o overflow "auto"
   força também overflow-y non-visible, e por isso recortava a sombra
   grande por baixo), o que fazia esta sombra ficar bem menos definida
   do que a da ficha do processo/cliente (que não tem este problema, por
   não estar dentro de nenhum wrapper com overflow). Pedido do Filipe,
   17/09/2026. */
.table-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;box-shadow:var(--shadow);}
table{width:100%;border-collapse:collapse;}
thead th{text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-faint);font-weight:700;padding:11px 15px;border-bottom:1px solid var(--line);background:var(--line-soft);}
tbody td{padding:12px 15px;border-bottom:1px solid var(--line-soft);font-size:13.5px;vertical-align:middle;}
tbody tr:last-child td{border-bottom:none;}
tbody tr{background:var(--panel);cursor:pointer;transition:background-color .12s ease;}
tbody tr:hover{background:var(--line-soft);}

/* Lista de processos dentro da ficha do cliente — células com link a
   sério (em vez de só um "onclick" no <tr>), para o botão direito do
   rato mostrar mesmo a opção "Abrir link num separador novo", que um
   <tr> sem link nenhum nunca consegue mostrar. Pedido do Filipe,
   18/09/2026. */
#clienteProcessos td{padding:0;}
#clienteProcessos td > a{display:block;padding:12px 15px;color:inherit;text-decoration:none;}

.ticket{font-family:'IBM Plex Mono';font-size:12.5px;font-weight:700;color:var(--ink-dim);white-space:nowrap;}
.procnum{font-weight:700;}
/* Nº do processo com a letra o maior possível sem sair da coluna —
   testado até à largura mais estreita (768px, coluna com ~150px de
   largura), onde 23px é o máximo que ainda cabe sem cortar o texto
   (pedido do Filipe, 10/09/2026). Prefixo "#detalheBody" para ter
   especificidade suficiente para sobrepor a regra ".field .v{font-
   size:13.5px}" independentemente da ordem no ficheiro. */
#detalheBody .procnum{font-size:23px;}
.who-cell{display:flex;flex-direction:column;gap:2px;}
.who-cell .nm{font-weight:500;}
.who-cell .ph{font-family:'IBM Plex Mono';font-size:11.5px;color:var(--ink-faint);}
.device .br{color:var(--ink-faint);font-size:12px;}

.pill{display:inline-flex;align-items:center;justify-content:center;text-align:center;gap:5px;padding:3px 9px;border-radius:99px;font-size:11.5px;font-weight:600;}
.tech{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--ink-dim);}
.tech .av{width:22px;height:22px;border-radius:50%;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-family:'IBM Plex Mono';font-size:9.5px;font-weight:600;background:var(--blue-wash);color:var(--blue);}
.age{display:flex;align-items:center;gap:6px;font-family:'IBM Plex Mono';font-size:12px;color:var(--ink-dim);}
.age .dot{width:8px;height:8px;border-radius:50%;flex-shrink:0;}
.age.ok .dot{background:var(--moss);} .age.warn .dot{background:var(--amber);} .age.late .dot{background:var(--rust);}

/* Painel deslizante — exceção deliberada à regra "sem painéis
   deslizantes": faz sentido para a revisão ortográfica, um diálogo
   pontual sobre o texto que se está a editar, não uma "página" de
   edição completa (essas vivem sempre em páginas próprias, nunca aqui).
   Continua a usar as classes .modal-* por compatibilidade. */
.modal-scrim{position:fixed;inset:0;background:rgba(20,15,10,.32);z-index:40;opacity:0;pointer-events:none;transition:opacity .2s ease;}
.modal-scrim.show{opacity:1;pointer-events:auto;}
.modal{position:fixed;top:0;right:0;height:100vh;width:min(440px,92vw);background:var(--panel);border-left:1px solid var(--line);box-shadow:var(--shadow);z-index:41;display:flex;flex-direction:column;transform:translateX(100%);transition:transform .25s cubic-bezier(.22,.61,.36,1);}
.modal-scrim.show .modal{transform:translateX(0);}
.modal-head{padding:16px 20px 12px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;align-items:flex-start;gap:10px;}
.modal-head > div:first-child{flex:1;min-width:0;}
.modal-head h2{font-size:16px;margin:0;}
.modal-close{border:1px solid var(--line);background:var(--panel);border-radius:8px;width:28px;height:28px;display:flex;align-items:center;justify-content:center;cursor:pointer;color:var(--ink-dim);flex-shrink:0;}
.modal-body{padding:16px 20px 22px;overflow-y:auto;flex:1;}
@media (max-width:600px){.modal{width:100vw;}}

/* Duas colunas lado a lado dentro de uma ficha (ex.: Acessórios entregues
   + Estado do equipamento) — cai para 1 coluna em ecrãs estreitos. */
.section-cols{display:grid;grid-template-columns:1fr 1fr;gap:24px;}
.section-cols > div > .section-title{margin-top:0;}
@media (max-width:720px){.section-cols{grid-template-columns:1fr;gap:0;}}

/* Variante 80/20 (ex.: Descrição da avaria + Adicionar nota ao histórico
   lado a lado, a segunda mais estreita) — proporção só uma sugestão de
   partida, ajustável sem alterar a ideia de duas colunas lado a lado. */
.section-cols-8020{display:grid;grid-template-columns:4fr 1fr;gap:24px;}
.section-cols-8020 > div > .section-title{margin-top:0;}
@media (max-width:720px){.section-cols-8020{grid-template-columns:1fr;gap:0;}}

/* Variante 40/60 (ex.: Nº de série + Estado do equipamento, dentro de
   metade da largura da página — o nº de série fica mais estreito, à
   esquerda). */
.section-cols-4060{display:grid;grid-template-columns:2fr 3fr;gap:16px;}
.section-cols-4060 > div > .section-title{margin-top:0;}
@media (max-width:640px){.section-cols-4060{grid-template-columns:1fr;gap:0;}}

/* Título de secção com um resumo em linha ao lado (ex.: "Acessórios
   entregues — Carregador, Bolsa" em vez do resumo aparecer por baixo). */
.section-title-row{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin:20px 0 4px;}
.section-title-row:first-child{margin-top:0;}
.section-title-row .section-title{margin:0;}
.acessorios-resumo{font-size:13px;color:var(--ink-dim);}

/* Dashboard inicial — indicadores de relance em vez de cair direto na
   lista de processos. */
.kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:16px;margin-bottom:24px;}
/* Os cartões passaram a ser links (<a>) para a lista de processos filtrada
   por trás de cada número — reset das propriedades de link + sombra/
   deslocação ao passar o rato, para ficar claro que são clicáveis em vez
   de só texto. Auditoria de código, 10/09/2026 (melhoria gráfica). */
.kpi-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:18px 20px;display:flex;flex-direction:column;gap:8px;color:inherit;text-decoration:none;transition:transform .12s ease,box-shadow .12s ease;}
.kpi-card:hover{box-shadow:0 6px 16px rgba(0,0,0,.09);transform:translateY(-1px);}
.kpi-card .kpi-icon{width:34px;height:34px;border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.kpi-card .kpi-icon svg{width:18px;height:18px;}
.kpi-card .kpi-value{font-size:26px;font-weight:700;font-family:'IBM Plex Mono';line-height:1;}
.kpi-card .kpi-label{font-size:12px;color:var(--ink-faint);}
/* Cartões com o fundo inteiro na cor (não só o ícone) — visual pedido
   pelo Filipe 16/09/2026 (referências Crextio/Flavorfit, blocos de
   estatística em cores pastel cheias); o ícone fica num círculo da cor
   do painel para continuar a destacar-se em cima da cor do cartão. */
.kpi-card.copper{background:var(--copper-wash);border-color:transparent;}
.kpi-card.copper .kpi-icon{background:var(--panel);color:var(--copper);}
.kpi-card.blue{background:var(--blue-wash);border-color:transparent;}
.kpi-card.blue .kpi-icon{background:var(--panel);color:var(--blue);}
.kpi-card.moss{background:var(--moss-wash);border-color:transparent;}
.kpi-card.moss .kpi-icon{background:var(--panel);color:var(--moss);}
.kpi-card.amber{background:var(--amber-wash);border-color:transparent;}
.kpi-card.amber .kpi-icon{background:var(--panel);color:var(--amber);}
.kpi-card.violet{background:var(--violet-wash);border-color:transparent;}
.kpi-card.violet .kpi-icon{background:var(--panel);color:var(--violet);}
.dash-section-head{display:flex;align-items:center;justify-content:space-between;margin:26px 0 10px;}
.dash-section-head h2{font-size:14px;margin:0;}
.dash-quicklinks{display:flex;flex-wrap:wrap;gap:10px;}
.dash-quicklinks a{display:flex;align-items:center;gap:10px;background:var(--panel);border:1px solid var(--line);border-radius:var(--radius-sm);padding:13px 17px;box-shadow:var(--shadow);flex:1;min-width:180px;font-size:13px;font-weight:500;}
.dash-quicklinks a:hover{color:var(--copper);box-shadow:var(--shadow-lg);transform:translateY(-1px);}

.field-row{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:14px;}
.field-row3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px;margin-bottom:14px;}
@media (max-width:640px){.field-row3{grid-template-columns:1fr;}}
.field-row4{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:12px;margin-bottom:14px;}
@media (max-width:900px){.field-row4{grid-template-columns:1fr 1fr;}}
@media (max-width:480px){.field-row4{grid-template-columns:1fr;}}
/* Opção B — formulário de cliente em grelha de 2 colunas + secções.
   O "contact-block" (4 colunas apertadas) foi removido por decisão do
   Filipe, 17/09/2026 — os contactos ficam em rows de 2 campos largos. */
#detalheBody > .field, #detalheBody > .field-row, #detalheBody > .field-row3, #detalheBody > .field-row4,
#novoBody > .field, #novoBody > .field-row, #novoBody > .field-row3, #novoBody > .field-row4{margin-bottom:14px;}
.field{display:flex;flex-direction:column;gap:3px;}
.field label{font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-faint);font-weight:600;}
.field .v{font-size:13.5px;}
.field input, .field select, .field textarea{padding:8px 10px;border-radius:var(--radius-sm);border:1px solid var(--line);background:var(--paper);color:var(--ink);font-size:13.5px;width:100%;}
.field textarea{resize:vertical;min-height:60px;}

/* Sub-linha usada dentro do bloco "dados_equipamento" (processos.js) —
   flexbox com flex-grow em vez de %, para não sofrer do problema de
   "gap com %" das colunas do editor de layout (ver renderLayoutLinhas
   em processos.js). Cada filho define a proporção via style="flex:N 1 0". */
.eq-subrow{display:flex;gap:14px;align-items:flex-start;}
@media (max-width:640px){.eq-subrow{flex-direction:column;}}

.field-h{display:flex;flex-direction:row;align-items:flex-start;gap:10px;margin-bottom:12px;}
.field-h > label{font-size:10.5px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-faint);font-weight:600;flex:0 0 130px;padding-top:9px;}
.field-h > .v{font-size:13.5px;flex:1;min-width:0;padding-top:9px;}
.field-h > input, .field-h > select, .field-h > textarea{flex:1;min-width:0;padding:8px 10px;border-radius:var(--radius-sm);border:1px solid var(--line);background:var(--paper);color:var(--ink);font-size:13.5px;width:100%;}
.field-h > input, .field-h > select{max-width:420px;}
.field-h > textarea{resize:vertical;min-height:60px;max-width:none;}
/* "flex:none" sozinho não chega em telemóvel: sem min-width:0/width:100%
   o valor (.v) crescia até à largura natural do conteúdo — por exemplo a
   lista de "Técnicos do processo" (.checklist-inline, que já tem o seu
   próprio overflow-x:auto para deslizar) — e como não havia nada a
   travá-la, a página inteira ganhava scroll horizontal em vez de o
   deslizar ficar só dentro da própria lista. Bug reportado pelo Filipe,
   11/09/2026 ("verifica toda a navegação no telemóvel"). */
@media (max-width:720px){.field-h{flex-direction:column;} .field-h > label, .field-h > .v{flex:none;padding-top:0;min-width:0;width:100%;}}

.section-title{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-faint);font-weight:600;margin:22px 0 9px;}
.section-title:first-child{margin-top:0;}
.desc-box{background:var(--paper);border:1px solid var(--line-soft);border-radius:9px;padding:11px 13px;font-size:13px;line-height:1.5;color:var(--ink-dim);}

.checklist{display:flex;flex-direction:column;gap:7px;}
.checklist .item{display:flex;align-items:center;gap:9px;font-size:13px;}
.checklist-inline{flex-direction:row;flex-wrap:nowrap;gap:8px 18px;overflow-x:auto;padding-bottom:2px;}
.checklist-inline .item{white-space:nowrap;flex-shrink:0;}

.money-input{position:relative;}
.money-input input{padding-right:28px !important;}
.money-input .suffix{position:absolute;right:11px;top:50%;transform:translateY(-50%);font-size:12.5px;color:var(--ink-faint);pointer-events:none;}

.field-wide{margin-bottom:14px;}
.field-wide textarea, .field-wide select, .field-wide input{width:100%;padding:9px 11px;border-radius:var(--radius-sm);border:1px solid var(--line);background:var(--paper);color:var(--ink);font-size:13.5px;}
.field-wide textarea{resize:vertical;min-height:130px;}
/* Resolução: 10 linhas visíveis (era 6) — pedido do Filipe, 17/09/2026. */
#fResolucao{min-height:210px;}
.field-wide select[multiple]{min-height:140px;}
.field-wide .hint{font-size:11px;color:var(--ink-faint);margin-top:5px;}

/* Nota ao histórico — fundo distinto (tom avermelhado) para destacar que
   é um registo permanente, ao contrário dos outros campos de texto livre. */
#fNota{background:var(--rust-wash);}

/* Linha genérica da ficha de processo, gerada a partir do layout
   guardado em /sistema/layout-processo (ver processos.js,
   renderDetalhePagina) — grid-template-columns é definido inline por
   linha, consoante as larguras escolhidas no editor. */
.lg-row{display:grid;gap:20px;margin-bottom:20px;align-items:start;justify-content:end;}
.lg-row > .section-title{margin-top:0;}
/* Título "sozinho" numa linha própria (ex.: "Documentos financeiros",
   "Orçamento") — sem isto, o espaço até à linha de campos seguinte
   somava a margem do próprio título (9px) com a margem entre linhas
   (20px), ficando bem mais espaçado do que os títulos que partilham a
   mesma linha/bloco que o seu conteúdo (ex.: "Resolução", "Histórico"),
   que só têm os 9px. Reparado a pedido do Filipe, 09/09/2026, para
   todos os títulos ficarem com o mesmo espaçamento até ao conteúdo. */
.lg-row:has(> .section-title:only-child){margin-bottom:0;}
/* Uma linha cujo único conteúdo está escondido (ex.: o campo Fornecedor,
   que só aparece com certas opções de Info) fica sem altura, mas
   continua a ocupar a sua margem entre linhas (20px) — isso empurrava
   "Dados do equipamento" (a seguir ao Fornecedor) para mais longe da
   divisória de cima do que devia, sempre que o Fornecedor estava
   escondido. Reparado a pedido do Filipe, 09/09/2026. */
.lg-row:has(> [hidden]:only-child){margin-bottom:0;}
/* Por defeito, um item de grid não encolhe abaixo do tamanho mínimo do
   seu conteúdo (min-width:auto) — isso deixa um campo com texto comprido
   (ex.: um valor longo no Info, ou um <select> com opções compridas)
   "empurrar" a coluna e sair para fora da margem branca da ficha. Isto
   força cada bloco a respeitar sempre a largura da sua coluna. */
.lg-row > *{min-width:0;}
/* Primeira linha da ficha (Nº processo | Cliente [com o contacto lá
   dentro] | Botões finais | Info, por defeito): divisória discreta a
   separar esta linha do resto da ficha, mais divisórias verticais entre
   os 4 grupos — pedido do Filipe, 16/09/2026 (a divisória entre Cliente
   e os botões finais é nova; as outras duas já existiam). Se a ordem
   dos blocos desta linha for alterada no editor de layout, as
   divisórias podem deixar de bater certo com os campos e a linha vale
   mais reajustar isto à mão. */
#detalheBody .lg-row:first-child{padding-bottom:16px;margin-bottom:20px;border-bottom:1px solid var(--line);align-items:stretch;}
/* A divisória que ficava à esquerda do Cliente passou para a direita do
   Nº processo (mesmo sítio visualmente, mas assim não fica por baixo do
   hover do cartão do Cliente, que agora estica para a esquerda com
   margin negativa). Pedido do Filipe, 17/09/2026. */
#detalheBody .lg-row:first-child > :first-child{border-right:1px solid var(--line);padding-right:20px;}
#detalheBody .lg-row:first-child > :nth-child(3){border-left:1px solid var(--line);padding-left:20px;}
#detalheBody .lg-row:first-child > :last-child{border-left:1px solid var(--line);padding-left:20px;}

/* Cartão do Cliente na 1ª linha da ficha, clicável para a ficha do
   cliente (pedido do Filipe, 17/09/2026) — texto herda a cor normal
   (não fica azul de link) e ganha um hover discreto igual ao dos
   outros cartões clicáveis (.card-link do dashboard). */
.field-cliente-link{text-decoration:none;color:inherit;border-radius:var(--radius-sm);padding:6px 8px;margin:-6px -8px;transition:background .12s ease,transform .12s ease;}
.field-cliente-link:hover{background:var(--line-soft);transform:translateY(-1px);}
@media (max-width:760px){
  .lg-row{grid-template-columns:1fr !important;gap:0;justify-content:stretch;}
  #detalheBody .lg-row:first-child > :first-child{border-right:none;padding-right:0;}
  #detalheBody .lg-row:first-child > :nth-child(3),
  #detalheBody .lg-row:first-child > :last-child{border-left:none;padding-left:0;}
}

/* Divisórias discretas entre secções da ficha (pedido do Filipe,
   09/09/2026) — todas com EXATAMENTE o mesmo espaçamento dos dois lados
   da linha: 16px do conteúdo de cima até à linha, e 16px da linha até
   ao conteúdo de baixo (o Filipe reparou que estava diferente — as
   divisórias "por cima" tinham 20px antes e só 16px depois, ao
   contrário das "por baixo", que tinham 16px antes e 20px depois; agora
   é sempre 16/16, o valor mais pequeno dos dois). Por isso cada
   divisória "por cima" (nth-child 4, 9 e a última linha) reduz também
   a margem da linha ANTERIOR para 16px, em vez de depender dos 20px
   normais entre linhas. Os seletores :nth-child assumem a ordem por
   defeito da ficha (1ª linha, campos da caução [divisória por baixo —
   o título "Documentos financeiros" foi apagado, pedido do Filipe,
   10/09/2026, por isso a caução passou a ser a 2ª linha], Equipamento +
   Descrição da avaria [margem reduzida — o Fornecedor já não tem linha
   própria aqui, mudou-se para dentro do bloco "info" na 1ª linha],
   título Orçamento [divisória por cima], campos do orçamento,
   Resolução, Inserção rápida, Técnicos do processo [margem reduzida],
   Links de peças [divisória por cima], última linha [divisória por
   cima, margem reduzida na linha anterior]) — se essa ordem for
   alterada no editor de layout, ajustar estes seletores à mão. */
#detalheBody .lg-row:nth-child(2){padding-bottom:16px;margin-bottom:16px;border-bottom:1px solid var(--line);}
#detalheBody .lg-row:nth-child(3){margin-bottom:16px;}
#detalheBody .lg-row:nth-child(4){padding-top:16px;border-top:1px solid var(--line);}
#detalheBody .lg-row:nth-child(8){margin-bottom:16px;}
#detalheBody .lg-row:nth-child(9){padding-top:16px;margin-bottom:16px;border-top:1px solid var(--line);}
/* Resolução / ponto de situação + Inserção rápida + Técnicos do
   processo (pedido do Filipe, 10/09/2026): estas 3 linhas formam um
   único grupo lógico (não há divisória entre elas) e usavam a margem
   normal de 20px entre linhas, tal como se fossem secções sem
   relação — o que as fazia parecer com mais espaço à volta do que o
   resto da ficha (onde a maior parte das transições já foi reduzida a
   16px ou a 0px). Reduz-se aqui para 10px, para as aproximar
   visualmente como um bloco coeso. nth-child 6 = Resolução, 7 =
   Inserção rápida (8 = Técnicos do processo já tem 16px, ver acima). */
#detalheBody .lg-row:nth-child(6){margin-bottom:10px;}
#detalheBody .lg-row:nth-child(7){margin-bottom:10px;}

/* Última linha da ficha (Histórico | Adicionar nota ao histórico) — os
   botões finais (Imprimir/Contactar/Gravar) mudaram-se para a 1ª linha
   da ficha (pedido do Filipe, 16/09/2026), por isso esta linha ficou só
   com 2 colunas iguais; as larguras vêm agora do próprio layout
   guardado (50/50), sem precisar de um "auto" à parte para um botão que
   já não está aqui. Só funciona enquanto esta for mesmo a ÚLTIMA linha
   da ficha. */
#detalheBody .lg-row:last-child{align-items:start;padding-top:16px;border-top:1px solid var(--line);}

/* Editor de layout (/sistema/layout-processo) — cada linha é uma zona de
   largar (drop), cada campo um "chip" arrastável. */
#layoutCanvas{display:flex;flex-direction:column;gap:10px;margin-top:6px;}
.le-row{display:flex;flex-wrap:wrap;align-items:center;gap:10px;background:var(--panel);border:2px solid var(--line);border-radius:var(--radius-sm);padding:10px;min-height:52px;cursor:grab;}
.le-row.drag-over{border-color:var(--copper);background:var(--copper-wash);}
.le-row.le-row-invalid{border-color:var(--rust);background:var(--rust-wash);}
.le-row.dragging-row{opacity:.4;}
.le-row-empty{justify-content:center;color:var(--ink-faint);font-size:12.5px;border-style:dashed;background:transparent;cursor:default;}
.le-row-num{flex-shrink:0;width:22px;height:22px;border-radius:50%;background:var(--line-soft);color:var(--ink-dim);font-size:11.5px;font-weight:700;display:flex;align-items:center;justify-content:center;font-family:'IBM Plex Mono';}
.le-move-btn{flex-shrink:0;width:24px;height:24px;padding:0;border:1px solid var(--line);background:var(--paper);color:var(--ink-dim);border-radius:6px;font-size:11px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;}
.le-move-btn:hover:not(:disabled){border-color:var(--copper);color:var(--copper);}
.le-move-btn:disabled{opacity:.3;cursor:default;}
.le-row-total{flex-shrink:0;font-size:11.5px;font-family:'IBM Plex Mono';color:var(--moss);font-weight:600;margin-left:auto;padding-left:10px;}
.le-row-total.le-row-total-erro{color:var(--rust);}
.le-chip{display:flex;align-items:center;gap:8px;background:var(--paper);border:1px solid var(--line);border-radius:var(--radius-sm);padding:8px 10px;cursor:grab;flex:1 1 160px;min-width:150px;}
.le-chip.dragging{opacity:.4;}
.le-chip-drag{color:var(--ink-faint);font-size:14px;line-height:1;flex-shrink:0;}
.le-chip-label{flex:1;min-width:0;font-size:13px;font-weight:500;}
.le-chip-width{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--ink-faint);flex-shrink:0;}
.le-chip-width input{width:48px;padding:4px 5px;border-radius:6px;border:1px solid var(--line);background:var(--panel);color:var(--ink);font-size:12px;text-align:right;}
.le-dist-btn{border:1px dashed var(--line);background:transparent;color:var(--ink-faint);border-radius:var(--radius-sm);padding:6px 10px;font-size:11.5px;cursor:pointer;flex-shrink:0;}
.le-dist-btn:hover{border-color:var(--copper);color:var(--copper);}

.timeline{display:flex;flex-direction:column;}
.tl-item{display:grid;grid-template-columns:14px 1fr;gap:12px;padding-bottom:16px;position:relative;}
.tl-item:last-child{padding-bottom:0;}
.tl-item::before{content:"";position:absolute;left:6px;top:16px;bottom:0;width:1px;background:var(--line);}
.tl-item:last-child::before{display:none;}
.tl-dot{width:14px;height:14px;border-radius:50%;background:var(--panel);border:2px solid var(--copper);margin-top:2px;}
.tl-when{font-family:'IBM Plex Mono';font-size:11px;color:var(--ink-faint);margin-bottom:2px;}
.tl-text{font-size:13px;color:var(--ink-dim);line-height:1.45;}
.tl-who{font-weight:600;color:var(--ink);}

.quickrow{display:flex;gap:8px;margin-top:18px;flex-wrap:wrap;}
.qbtn{display:inline-flex;align-items:center;gap:7px;border:1px solid var(--line);background:var(--panel);padding:9px 16px;border-radius:99px;font-size:12.5px;font-weight:500;cursor:pointer;color:var(--ink);letter-spacing:.01em;}
.qbtn:hover{background:var(--line-soft);transform:translateY(-1px);box-shadow:var(--shadow);}
.qbtn:focus-visible{outline:none;box-shadow:0 0 0 3px var(--copper-wash);}
.qbtn.primary{background:var(--grad-copper);border-color:var(--copper);color:var(--copper-ink);box-shadow:0 4px 14px -6px rgba(227,166,46,.55);}
.qbtn.primary:hover{filter:brightness(1.05);transform:translateY(-1px);box-shadow:0 6px 18px -6px rgba(227,166,46,.6);}
.qbtn.danger{background:var(--rust);border-color:var(--rust);color:#fff;}
.qbtn.danger:hover{background:#8f2f28;}
/* Verde de marca do WhatsApp, para os botões que abrem uma conversa —
   pedido do Filipe, 11/09/2026, para se distinguirem à primeira vista
   dos outros botões da ficha (ex.: "Imprimir ficha"). #25d366 é a cor
   oficial dos botões/ícone do WhatsApp. */
.qbtn.whatsapp{background:#25d366;border-color:#25d366;color:#fff;}
.qbtn.whatsapp:hover{background:#1da851;border-color:#1da851;}

/* Par de botões "Tem WhatsApp" / "Não tem" na ficha de cliente — substitui
   a checkbox única, sem estado neutro possível depois de escolhido (ver
   waToggleHtml() em clientes.js). Cores da própria paleta do site
   (--moss/--rust), não o verde de marca do WhatsApp acima, para não
   destoar do resto do formulário. Pedido do Filipe, 11/09/2026. */
.wa-toggle{display:flex;gap:8px;}
.wa-toggle-btn{flex:1;border:1px solid var(--line);background:var(--panel);padding:9px 10px;border-radius:var(--radius-sm);font-size:12.5px;font-weight:500;cursor:pointer;color:var(--ink);}
.wa-toggle-btn:hover{background:var(--line-soft);}
/* altura/figura uniforme dos botões de toggle nos formulários (opção B) */
.wa-toggle-btn{padding:9px 10px;font-size:13.5px;min-height:36px;display:flex;align-items:center;justify-content:center;}
#detalheBody .wa-toggle-btn, #novoBody .wa-toggle-btn{height:36px;}
.wa-toggle-btn.wa-nao.selecionado{background:var(--rust);border-color:var(--rust);color:#fff;}
.wa-toggle-btn.wa-sim.selecionado{background:var(--moss);border-color:var(--moss);color:#fff;}
.wa-toggle-btn.sem-danger{background:var(--rust);border-color:var(--rust);color:#fff;}

.client-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:15px 17px;display:flex;align-items:center;gap:14px;margin-bottom:10px;box-shadow:var(--shadow);flex-wrap:wrap;transition:transform .12s ease,box-shadow .12s ease,border-color .12s ease;cursor:pointer;}
.client-card:hover{transform:translateY(-1px);box-shadow:var(--shadow-lg);}
.client-card .av{width:38px;height:38px;border-radius:50%;background:var(--blue-wash);color:var(--blue);display:flex;align-items:center;justify-content:center;font-family:'IBM Plex Mono';font-weight:600;font-size:13px;flex-shrink:0;}
.client-main{flex:1;min-width:160px;}
.client-main .nm{font-weight:600;font-size:14px;}
.client-main .ph{font-family:'IBM Plex Mono';font-size:12px;color:var(--ink-faint);}
.complete-wrap{display:flex;align-items:center;gap:9px;flex-shrink:0;}
.complete-bar{width:64px;height:6px;border-radius:99px;background:var(--line-soft);overflow:hidden;}
.complete-bar span{display:block;height:100%;background:var(--moss);}
.complete-label{font-family:'IBM Plex Mono';font-size:11px;color:var(--ink-faint);width:32px;}
.missing{display:flex;gap:5px;flex-wrap:wrap;}
.missing .tag{font-size:10.5px;background:var(--rust-wash);color:var(--rust);padding:2px 7px;border-radius:99px;font-weight:600;}

.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:19px 21px;margin-bottom:18px;}

/* Secções de Relatórios e Sistema — cada uma é um <details class="card">
   fechado por omissão, para a página não ser uma parede de painéis todos
   abertos ao mesmo tempo. Pedido do Filipe, 10/09/2026. */
details.card > summary{
  cursor:pointer;list-style:none;font-size:14px;font-weight:600;color:var(--ink);
  margin:0;display:flex;align-items:center;justify-content:space-between;gap:12px;
  -webkit-tap-highlight-color:transparent;
}
details.card[open] > summary{margin-bottom:13px;}
details.card > summary::-webkit-details-marker{display:none;}
details.card > summary::after{
  content:"";width:8px;height:8px;flex-shrink:0;margin-left:8px;
  border-right:2px solid var(--ink-faint);border-bottom:2px solid var(--ink-faint);
  transform:rotate(45deg);transition:transform .15s ease;
}
details.card[open] > summary::after{transform:rotate(-135deg);}

/* Ficha de detalhe (processo / cliente) — página própria, mesmos campos
   que antes viviam no drawer, mas numa página normal (link direto,
   partilhável), largura de leitura confortável em vez de ecrã inteiro. */
.detalhe-ficha{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-lg);padding:22px 24px 30px;width:100%;}
.panel-head .t{font-family:'IBM Plex Mono';font-size:12px;color:var(--ink-faint);}
.card h2{font-size:14px;margin:0 0 13px;}
.row-inline{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:8px;}
.tag-list{display:flex;flex-direction:column;gap:0;}
.tag-list .li{display:flex;align-items:center;justify-content:space-between;padding:9px 2px;border-bottom:1px solid var(--line-soft);font-size:13.5px;}
.tag-list .li:last-child{border-bottom:none;}
.tag-list .li.inactive{opacity:.45;}
.small-btn{border:1px solid var(--line);background:var(--panel);padding:5px 10px;border-radius:var(--radius-sm);font-size:11.5px;cursor:pointer;color:var(--ink);}
.small-btn:hover{background:var(--line-soft);}
/* Lista de mensagens pré-definidas de WhatsApp para escolher (ver
   escolherMensagemWhatsapp em processos.js) — pedido do Filipe,
   11/09/2026. */
.wa-msg-opt:hover{background:var(--line-soft);border-radius:8px;}

.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;background:var(--paper);padding-bottom:44px;}
.login-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-lg);padding:34px;width:320px;}
.login-card .login-logo{height:34px;width:auto;display:block;margin:0 0 8px;}
.login-card .sub{font-size:12px;color:var(--ink-faint);margin-bottom:20px;font-family:'IBM Plex Mono';text-transform:uppercase;letter-spacing:.04em;}
.login-card label{font-size:11px;text-transform:uppercase;color:var(--ink-faint);font-weight:600;}
.login-card input{width:100%;padding:9px 11px;border-radius:var(--radius-sm);border:1px solid var(--line);background:var(--paper);margin:5px 0 14px;font-size:13.5px;color:var(--ink);}
.login-card button{width:100%;padding:11px;border-radius:99px;border:none;background:var(--copper);color:var(--copper-ink);font-weight:600;font-size:13.5px;cursor:pointer;}
.login-error{background:var(--rust-wash);color:var(--rust);padding:8px 11px;border-radius:var(--radius-sm);font-size:12.5px;margin-bottom:14px;}

::-webkit-scrollbar{width:10px;height:10px;}
::-webkit-scrollbar-thumb{background:var(--line);border-radius:99px;}
[hidden]{display:none !important;}
@media (max-width:720px){.field-row{grid-template-columns:1fr;}}

/* Anel de foco consistente em todos os campos e botões — acessibilidade
   e sensação mais cuidada/moderna do que o contorno padrão do browser. */
.field input:focus, .field select:focus, .field textarea:focus,
.field-h > input:focus, .field-h > select:focus, .field-h > textarea:focus,
.field-wide input:focus, .field-wide select:focus, .field-wide textarea:focus,
.search:focus-within, .sortsel:focus,
.row-inline input:focus, .row-inline select:focus{
  outline:none;border-color:var(--copper);box-shadow:0 0 0 3px var(--copper-wash);
}

/* Rodapé com nomenclatura da versão e direitos de autor — visível em
   todo o site (páginas com sessão e a página de login), discreto e
   fixo no fundo do ecrã (não acompanha o scroll da página, tal como a
   barra lateral). Pedido do Filipe, 10/09/2026. */
.app-footer{
  position:fixed;left:0;right:0;bottom:0;z-index:26;
  text-align:center;font-size:11px;color:var(--ink-faint);
  padding:10px 16px;font-family:'IBM Plex Mono';letter-spacing:.02em;
  background:var(--panel);border-top:1px solid var(--line);
}

/* Painel inicial (dashboard) — cartão "hoje" em destaque + comparação do
   mês com gráfico redondo, coluna lateral com modelo mais popular e
   orçamentos. Substitui a grelha de KPIs + tabela usada até aqui.
   Pedido do Filipe, 16/09/2026 (desenhado primeiro num canvas de design,
   ver anotações: gráfico redondo sem agulha, verde/vermelho consoante o
   resultado, barras de "Orçamentos aceites por técnico" todas iguais). */
.dash-cols{display:flex;gap:22px;align-items:flex-start;}
.dash-main{flex:1.55;min-width:0;display:flex;flex-direction:column;gap:16px;}
/* margin-top aproxima a altura do bloco "Bem-vindo, ..." + subtítulo
   (que só existe na coluna .dash-main) para o primeiro cartão da coluna
   lateral (Modelo mais popular) começar à mesma altura do cartão
   "Processos abertos", não do título de saudação. Pedido do Filipe,
   16/09/2026. */
.dash-side{flex:1;min-width:0;display:flex;flex-direction:column;gap:16px;margin-top:58px;}
@media (max-width:900px){.dash-cols{flex-direction:column;} .dash-main,.dash-side{flex:none;width:100%;margin-top:0;}}

.dash-greet-title{font-size:19px;font-weight:700;}
.dash-greet-sub{font-size:12.5px;color:var(--ink-faint);margin-top:2px;}

.dash-hero{
  display:block;text-decoration:none;
  /* Tom mais claro (--copper-light/-2) do que o dourado normal dos
     botões — pedido do Filipe, 17/09/2026. */
  background:linear-gradient(135deg,var(--copper-light),var(--copper-light-2));
  border-radius:var(--radius);padding:22px 26px;color:var(--copper-ink);
  box-shadow:var(--shadow-lg);transition:transform .12s ease,box-shadow .12s ease;
}
.dash-hero:hover{transform:translateY(-1px);box-shadow:0 10px 26px -10px rgba(227,166,46,.55);}
.dash-hero-top{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;flex-wrap:wrap;}
.dash-hero-label{font-size:12px;opacity:.7;text-transform:uppercase;letter-spacing:.05em;}
.dash-hero-value{font-size:42px;font-weight:700;line-height:1;margin-top:6px;}
.dash-hero-stats{display:flex;gap:16px;text-align:right;}
.dash-hero-stats > div > div:first-child{font-size:19px;font-weight:700;}
.dash-hero-stats > div > div:last-child{font-size:10.5px;opacity:.7;}
/* Mini-gráfico dos últimos 7 dias — dia da semana em 3 letras + a
   contagem ao lado (ex.: "Seg: 8") por baixo de cada barra (1 letra só
   era ambígua: "S" servia para Segunda, Sexta E Sábado). Pedido do
   Filipe, 16/09/2026. */
.dash-weekgrid{display:flex;gap:6px;margin-top:18px;align-items:flex-end;}
.dash-weekcol{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;gap:6px;}
.dash-weekbar-track{width:100%;height:40px;display:flex;align-items:flex-end;}
.dash-weekbar{width:100%;background:rgba(32,28,26,.22);border-radius:5px;min-height:4px;}
.dash-weekbar.is-hoje{background:var(--copper-ink);}
.dash-weeklabel{font-size:10px;opacity:.75;white-space:nowrap;}

.dash-card-title{font-size:13.5px;font-weight:600;}
.dash-cmp-card{padding:20px 22px;}
/* "Análise de processos": 2 colunas (Mensal / Anual), cada uma com a
   comparação até-ao-dia por cima e o gráfico redondo (total vs. meta)
   por baixo — substitui a vista só do mês. Pedido do Filipe, 16/09/2026. */
.dash-analise-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 28px;}
@media (max-width:640px){.dash-analise-grid{grid-template-columns:1fr;gap:24px 0;}}
.dash-analise-col{min-width:0;}
.dash-analise-col-sep{border-left:1px solid var(--line);padding-left:28px;}
@media (max-width:640px){.dash-analise-col-sep{border-left:none;padding-left:0;border-top:1px solid var(--line);padding-top:20px;}}
.dash-analise-col-title{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-faint);font-weight:700;margin-bottom:12px;}
/* Par de gráficos duplos em semicírculo (comparação até-ao-dia, depois
   total vs. meta), um por baixo do outro, dentro de cada coluna
   Mensal/Anual. Pedido do Filipe, 16/09/2026 ("gráfico duplo em
   semicírculo... comparação dos dois valores, para as 4 análises"). */
.dash-semi-stack{display:flex;flex-direction:column;gap:22px;align-items:center;}
.dash-semi-item{display:flex;flex-direction:column;align-items:center;gap:8px;}
.dash-semi-legend{display:flex;flex-direction:row;flex-wrap:wrap;gap:6px 16px;font-size:11px;text-align:center;justify-content:center;margin-top:-8px;}
.dash-semi-legend .dot{display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:5px;}
.dash-semi-note{font-size:10.5px;color:var(--ink-dim);}

.dash-bar-list{display:flex;flex-direction:column;gap:12px;}
.dash-bar-row-head{display:flex;justify-content:space-between;font-size:12px;margin-bottom:5px;}
.dash-bar-track{height:7px;background:var(--line-soft);border-radius:99px;overflow:hidden;}
.dash-bar-fill{height:100%;background:var(--copper);border-radius:99px;}
.dash-bar-fill.moss{background:var(--moss);}

/* Cartão inteiro clicável (Modelo mais popular, Orçamentos por técnico
   mês/ano) — cada um abre a página do relatório respetivo. Pedido do
   Filipe, 16/09/2026 ("ambos os relatórios ao clicar abrem a página
   respetiva"). */
.card-link{display:block;text-decoration:none;color:inherit;transition:transform .12s ease,box-shadow .12s ease;}
.card-link:hover{transform:translateY(-1px);box-shadow:var(--shadow-lg);}

/* Badge de estado/variação (ex.: "+18%", "Em análise") — cor consoante a
   variante (.moss/.amber/.blue/.rust). */
.st{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;padding:3px 10px;border-radius:99px;flex-shrink:0;}
.st .dot{width:6px;height:6px;border-radius:50%;}
.st.moss{background:var(--moss-wash);color:var(--moss);} .st.moss .dot{background:var(--moss);}
.st.amber{background:var(--amber-wash);color:var(--amber);} .st.amber .dot{background:var(--amber);}
.st.blue{background:var(--blue-wash);color:var(--blue);} .st.blue .dot{background:var(--blue);}
.st.rust{background:var(--rust-wash);color:var(--rust);} .st.rust .dot{background:var(--rust);}
