/* ============================================================
   CONSTRUSUD — Sistema de Gestão (CRM + Orçamentação)
   v0.2 · React + TS + Vite + Firebase
   (Idêntico ao styles.css original — UI parity garantida)
   ============================================================ */

/* ============================================================
   FONTES — Lato (marca Construsud)
   ============================================================ */

@font-face {
  font-family: 'Lato';
  src: url('/fonts/Lato-Light.ttf') format('truetype');
  font-weight: 300;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Lato';
  src: url('/fonts/Lato-Regular.ttf') format('truetype');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Lato';
  src: url('/fonts/Lato-Italic.ttf') format('truetype');
  font-weight: 400;
  font-style: italic;
  font-display: swap;
}
@font-face {
  font-family: 'Lato';
  src: url('/fonts/Lato-Bold.ttf') format('truetype');
  font-weight: 700;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Lato';
  src: url('/fonts/Lato-BoldItalic.ttf') format('truetype');
  font-weight: 700;
  font-style: italic;
  font-display: swap;
}
@font-face {
  font-family: 'Lato';
  src: url('/fonts/Lato-Thin.ttf') format('truetype');
  font-weight: 100;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Lato';
  src: url('/fonts/Lato-ThinItalic.ttf') format('truetype');
  font-weight: 100;
  font-style: italic;
  font-display: swap;
}
@font-face {
  font-family: 'Lato';
  src: url('/fonts/Lato-LightItalic.ttf') format('truetype');
  font-weight: 300;
  font-style: italic;
  font-display: swap;
}
@font-face {
  font-family: 'Lato';
  src: url('/fonts/Lato-Black.ttf') format('truetype');
  font-weight: 900;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Lato';
  src: url('/fonts/Lato-BlackItalic.ttf') format('truetype');
  font-weight: 900;
  font-style: italic;
  font-display: swap;
}

:root{
  /* Brand — bordô Construsud (2026-05-10: era #FF3B3B vermelho vivo, redesign mockup CRM) */
  --red:#7A1818;        /* Mantém nome --red por compatibilidade legacy; valor passou a bordô */
  --red-main:#7A1818;   /* alias canónico — usar este em código novo */
  --red-mid:#D62E2E;    /* hover/destaque secundário (mantém vermelho médio) */
  --red-dark:#D62E2E;   /* alias legacy */
  --red-soft:#FFF5F5;   /* fundo suave (era #FFE7E7) */
  --red-line:#FBD9D9;   /* bordas accent */
  --red-ch:#FFEBEB;     /* chapter cards background */
  --red-ch-dark:#FFCECE;/* chapter cards "a definir" */
  --bg:#F5F6F8;
  --panel:#FFFFFF;
  --line:#E6E8EE;
  --line-strong:#CFD3DC;
  --ink:#1B1F27;
  --ink-2:#454B57;
  --ink-3:#7A8190;
  --ink-4:#AAB1BD;
  --ink-5:#CFD3DC;      /* novo — números/elementos desactivados */
  --green:#2BAE66;
  --amber:#E8A547;
  --blue:#3F7BD7;
  --purple:#8060D6;
  /* Fundo subtil de linha por status (CRM lista, mockup 2026-05-10) */
  --row-adjudicado:#F6FDF9;
  --row-cancelado:#FFF8F8;
  --row-arquivada:#FAFAFA;
  --shadow:0 1px 3px rgba(20,25,40,.06), 0 4px 14px rgba(20,25,40,.05);
  --radius:8px;
  --radius-sm:5px;
  --font: "Lato", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --mono: "IBM Plex Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace;
}

*{box-sizing:border-box}
html,body{margin:0;padding:0;height:100%}
body{font-family:var(--font);font-size:14px;color:var(--ink);background:var(--bg);-webkit-font-smoothing:antialiased}
button{font-family:inherit;cursor:pointer;border:none}

/* Scrollbars bordô minimalistas (Onda 8.8) — webkit + firefox */
*{
  scrollbar-width:thin;
  scrollbar-color:var(--red-line) transparent;
}
*::-webkit-scrollbar{
  width:6px;
  height:6px;
}
*::-webkit-scrollbar-track{
  background:transparent;
}
*::-webkit-scrollbar-thumb{
  background:var(--red-line);
  border-radius:3px;
  border:1px solid transparent;
}
*::-webkit-scrollbar-thumb:hover{
  background:var(--red);
}
*::-webkit-scrollbar-corner{
  background:transparent;
}
input,select,textarea{font-family:inherit;font-size:14px}

.app{display:grid;grid-template-columns:240px 1fr;min-height:100vh}

.sidebar{background:#1B1F27;color:#fff;display:flex;flex-direction:column;position:sticky;top:0;height:100vh}
.sidebar .brand{display:flex;align-items:center;gap:10px;padding:18px;border-bottom:1px solid #2A2F3B}
.sidebar .brand svg{width:28px;height:28px}
.sidebar .brand span{font-weight:700;letter-spacing:.5px;font-size:16px}

.nav{padding:10px 8px;flex:1;overflow-y:auto}
.nav-section{font-size:10px;text-transform:uppercase;letter-spacing:1px;color:#7A8190;padding:14px 12px 6px}
.nav a{display:flex;align-items:center;gap:10px;padding:9px 12px;color:#D2D6DE;text-decoration:none;border-radius:6px;font-size:13.5px;transition:background .12s}
.nav a:hover{background:#262B36;color:#fff}
.nav a.active{background:var(--red);color:#fff}
.nav a .ic{width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;font-size:14px}
.nav a .badge{margin-left:auto;font-size:10px;background:#2A2F3B;padding:2px 6px;border-radius:10px;color:#9AA0AC}
.nav a.coming{opacity:.55;cursor:not-allowed}
.nav a.coming:hover{background:transparent;color:#D2D6DE}
.sidebar .footer{padding:12px 16px;border-top:1px solid #2A2F3B;font-size:11px;color:#7A8190}

.main{display:flex;flex-direction:column;min-width:0}
.topbar{background:#fff;border-bottom:1px solid var(--line);padding:10px 24px;display:flex;align-items:center;gap:18px;position:sticky;top:0;z-index:10}
.crumb{font-size:13px;color:var(--ink-3)}
.crumb b{color:var(--ink)}
.topbar .grow{flex:1}
.topbar input.search{padding:7px 10px;border:1px solid var(--line);border-radius:6px;width:280px;background:#F8F9FB}
.user-chip{font-size:12px;color:var(--ink-2);padding:6px 10px;background:var(--bg);border:1px solid var(--line);border-radius:18px}

.content{padding:22px 28px;flex:1;min-width:0}

.panel{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow)}
.panel + .panel{margin-top:18px}
.panel-head{padding:14px 18px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:12px}
.panel-head h2{margin:0;font-size:15px;font-weight:600}
.panel-head .grow{flex:1}
.panel-body{padding:18px}
.panel-body.tight{padding:0}

.kpi-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:18px}
.kpi{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px;box-shadow:var(--shadow)}
.kpi .lbl{font-size:11px;text-transform:uppercase;letter-spacing:1px;color:var(--ink-3)}
.kpi .val{font-size:22px;font-weight:700;margin-top:4px}
.kpi .sub{font-size:11px;color:var(--ink-3);margin-top:3px}
.kpi.red .val{color:var(--red)}
.kpi.green .val{color:var(--green)}
.kpi.blue .val{color:var(--blue)}
.kpi.amber .val{color:var(--amber)}

/* ── Gestão de Obras: filtros + ordenação (mesma linguagem da app) ── */
.obras-tools{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.obras-chip{font-family:var(--font);font-size:11.5px;font-weight:700;padding:5px 13px;border-radius:20px;border:1px solid var(--line-strong);background:#fff;color:var(--ink-2);cursor:pointer;transition:all .12s;letter-spacing:.3px}
.obras-chip:hover{border-color:var(--red);color:var(--red)}
.obras-chip.on{background:var(--red);border-color:var(--red);color:#fff}
.obras-search{font-family:var(--font);font-size:13px;padding:6px 12px 6px 30px;border:1px solid var(--line-strong);border-radius:7px;background:#fff url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%237A8190' stroke-width='2'><circle cx='11' cy='11' r='7'/><path d='M21 21l-4-4'/></svg>") no-repeat 9px center;color:var(--ink);min-width:200px}
.obras-search:focus{outline:none;border-color:var(--red);box-shadow:0 0 0 3px var(--red-soft)}
table.tbl th.so{cursor:pointer;user-select:none;transition:color .1s}
table.tbl th.so:hover{color:var(--red)}
table.tbl th.so .ar{margin-left:5px;font-size:9px;color:var(--red);vertical-align:middle}
.obras-row{transition:background .1s}
.obras-row:hover td{background:var(--row-adjudicado)}
.estado-toggle{border:none;font-family:var(--font);cursor:pointer}
.estado-toggle:hover{filter:brightness(.96);box-shadow:0 0 0 2px var(--line)}

.btn{display:inline-flex;align-items:center;gap:6px;padding:7px 13px;font-size:13px;font-weight:500;background:#fff;color:var(--ink);border:1px solid var(--line-strong);border-radius:6px;transition:all .12s}
.btn:hover{background:#F1F2F6}
.btn-primary{background:var(--red);color:#fff;border-color:var(--red)}
.btn-primary:hover{background:var(--red-dark);border-color:var(--red-dark)}
.btn-ghost{background:transparent;border-color:transparent;color:var(--ink-2)}
.btn-ghost:hover{background:#EDEFF3}
.btn-danger{background:#fff;color:var(--red);border-color:#FFB5B5}
.btn-danger:hover{background:#FFE7E7}
.btn-sm{padding:4px 9px;font-size:12px}
.btn-icon{padding:6px;width:30px;height:30px;justify-content:center}

table.tbl{width:100%;border-collapse:collapse;font-size:13px}
table.tbl th{text-align:left;font-weight:600;color:var(--ink-2);padding:10px 14px;background:#F8F9FB;border-bottom:1px solid var(--line);font-size:11.5px;text-transform:uppercase;letter-spacing:.5px;white-space:nowrap}
table.tbl td{padding:0 14px;height:54px;border-bottom:1px solid var(--line);vertical-align:middle}
table.tbl tr:hover td{background:#FAFBFC;cursor:pointer}
table.tbl tr.no-hover:hover td{background:transparent;cursor:default}
table.tbl td.num{text-align:right;font-variant-numeric:tabular-nums}
table.tbl td.muted{color:var(--ink-3)}

/* StatusPill — estilo "pill" do mockup (2026-05-10):
   bolinha 5px à esquerda + uppercase + radius 11px.
   A bolinha herda currentColor com opacity .85 — fica subtil
   mas legível em todos os tons de status. */
.status-pill{display:inline-flex;align-items:center;gap:4px;padding:3px 10px;font-size:10.5px;font-weight:700;border-radius:11px;text-transform:uppercase;letter-spacing:.6px;white-space:nowrap;text-decoration:none !important}
.status-pill::before{content:'';display:inline-block;width:5px;height:5px;border-radius:50%;background:currentColor;opacity:.85;flex-shrink:0}
.status-por_enviar{background:#E8EDF6;color:#3C5AA6}
.status-por_aprovar{background:#FFF3D9;color:#A77400}
.status-adjudicado{background:#DFF5E6;color:#1F7A3D}
.status-cancelado{background:#FFE7E7;color:#D62E2E}
.status-anulado, .status-reprovado{background:#F0EEEE;color:#7A7375}
/* Microalteração D (2026-05-11): pill arquivada passa de cinza para bordô (mesma paleta da linha) */
.status-arquivada{background:var(--red-soft);color:var(--red);font-style:italic}
/* status internos do orçamentar */
.status-para_analise{background:#FFF0E0;color:#B35C00}
.status-para_envio{background:#E6F0FF;color:#1A56A6}

/* Paleta orcamento (semaforo) — apenas usada na aba Orcamentar (Bloco E4 refresh 2026-05-11) */
.status-pill-orc{ text-decoration:none !important; }
.status-orc-nova_proposta{background:#E8F1FE;color:#1E4D8C;text-decoration:none}
.status-orc-em_orcamentacao{background:#F0E8FE;color:#5A2EA6;text-decoration:none}
.status-orc-para_analise{background:#FFF3D9;color:#A77400;text-decoration:none}
.status-orc-para_envio{background:#DFF5E6;color:#1F7A3D;text-decoration:none}

/* Bolinha de alerta laranja — aparece por cima do status pill no CRM */
.status-with-alert{position:relative;display:inline-block}
.status-with-alert .alert-dot{position:absolute;top:-4px;right:-4px;width:9px;height:9px;background:var(--amber);border-radius:50%;border:1.5px solid #fff}

/* CodePill — pill mono para códigos (V12618, 1.1.1, V0/V1, unidades).
   Mockup 2026-05-10. Cores derivam dos tokens do brand. */
.code-pill{display:inline-flex;align-items:center;font-family:var(--mono);font-weight:500;border-radius:4px;white-space:nowrap;line-height:1}
.code-pill-md{font-size:11px;padding:3px 8px}
.code-pill-sm{font-size:10.5px;padding:2px 6px;border-radius:3px}
.code-pill-accent{color:var(--red);background:var(--red-soft);border:1px solid var(--red-line)}
.code-pill-muted{color:var(--ink-4);background:var(--line);border:1px solid var(--line)}

/* IconButton — botão quadrado pequeno (28x28) para acções de linha:
   copy morada, eliminar, expandir versões. Mockup 2026-05-10.
   3 variantes: accent (bordô neutro), danger (vermelho em hover), muted (cinza). */
.icon-btn{display:inline-flex;align-items:center;justify-content:center;border-radius:5px;cursor:pointer;background:transparent;font-family:inherit;flex-shrink:0;transition:all .12s}
.icon-btn-accent{border:1px solid var(--line);color:var(--red)}
.icon-btn-accent:hover{background:#F4F5F8;border-color:var(--red-line)}
.icon-btn-danger{border:1px solid var(--line);color:var(--ink-3)}
.icon-btn-danger:hover{background:#FFE7E7;color:#D62E2E;border-color:#D62E2E}
.icon-btn-muted{border:1px solid var(--line);color:var(--ink-4)}
.icon-btn-muted:hover{background:#F4F5F8;color:var(--ink-2)}
/* Bolinha verde — indica que a proposta tem orçamento preenchido */
.orc-dot{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--green);flex-shrink:0;margin-left:2px}

/* Barra de ações do workflow de orçamentação */
.workflow-bar{display:flex;align-items:center;gap:12px;padding:10px 18px;background:#F8F9FB;border-bottom:1px solid var(--line);flex-wrap:wrap}
.workflow-bar .wf-status{font-size:12px;font-weight:600;color:var(--ink-2)}
.workflow-bar .wf-notes{flex:1;font-size:12px;color:var(--amber);background:#FFF8EE;border:1px solid #FFD89A;border-radius:6px;padding:6px 10px}
.workflow-bar .spacer{flex:1}

.form-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:14px 16px}
.form-grid.cols-3{grid-template-columns:repeat(3,1fr)}
.form-grid.cols-4{grid-template-columns:repeat(4,1fr)}
.form-grid .full{grid-column:1/-1}
.field{display:flex;flex-direction:column;gap:5px}
.field label{font-size:12px;font-weight:600;color:var(--ink-2)}
.field .hint{font-size:11px;color:var(--ink-3)}
.field input, .field select, .field textarea{padding:8px 10px;border:1px solid var(--line-strong);border-radius:6px;background:#fff;outline:none;width:100%}
.field input:focus, .field select:focus, .field textarea:focus{border-color:var(--red);box-shadow:0 0 0 3px var(--red-soft)}
.field textarea{resize:vertical;min-height:60px}

.tabs{display:flex;border-bottom:1px solid var(--line);background:#fff}
.tab{padding:12px 18px;font-size:13.5px;font-weight:500;color:var(--ink-2);cursor:pointer;border-bottom:2px solid transparent}
.tab:hover{color:var(--ink)}
.tab.active{color:var(--red);border-bottom-color:var(--red)}

.tree-chap{background:#fff;border:1px solid var(--line);border-radius:var(--radius);margin-bottom:14px;overflow:hidden;box-shadow:var(--shadow)}
.tree-chap-head{padding:11px 14px;background:#262B36;color:#fff;display:flex;align-items:center;gap:10px}
.tree-chap-head .num{font-weight:700;font-size:13px}
.tree-chap-head input{background:transparent;border:none;color:#fff;font-size:14px;font-weight:600;flex:1;outline:none}
.tree-chap-head input:focus{background:rgba(255,255,255,.1)}
.tree-chap-head .total{font-variant-numeric:tabular-nums;font-weight:600}
.tree-chap-body{padding:10px}

.tree-sub{border:1px solid var(--line);border-radius:6px;margin-bottom:10px;background:#FAFBFC}
.tree-sub-head{padding:8px 12px;background:#EFF1F5;display:flex;align-items:center;gap:10px;border-bottom:1px solid var(--line)}
.tree-sub-head .num{font-weight:600;color:var(--ink-2);font-size:12px;min-width:42px}
.tree-sub-head input{background:transparent;border:none;flex:1;font-weight:600;color:var(--ink);outline:none}
.tree-sub-head input:focus{background:#fff;border-radius:4px;padding:2px 4px}

.tree-act{border-top:1px solid var(--line);padding:10px 12px}
.tree-act:first-child{border-top:none}
.tree-act-head{display:grid;grid-template-columns:60px 1fr 70px 80px 100px 110px 30px;gap:8px;align-items:center;margin-bottom:6px}
.tree-act-head .acode{font-weight:600;font-size:12px;color:var(--ink-2)}
.tree-act-head input{border:1px solid transparent;background:transparent;padding:6px 8px;border-radius:4px}
.tree-act-head input:hover{background:#fff;border-color:var(--line)}
.tree-act-head input:focus{background:#fff;border-color:var(--red);box-shadow:0 0 0 3px var(--red-soft)}
.tree-act-head input.num{text-align:right;font-variant-numeric:tabular-nums}

.tree-act-body{display:none;background:#fff;border:1px solid var(--line);border-radius:6px;padding:14px;margin-top:8px}
.tree-act.open .tree-act-body{display:block}
.tree-act .toggle{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:4px;color:var(--ink-3);cursor:pointer;background:transparent;border:none}
.tree-act .toggle:hover{background:#EFF1F5;color:var(--ink)}

.act-section{margin-bottom:14px}
.act-section h4{margin:0 0 8px;font-size:11px;text-transform:uppercase;letter-spacing:1px;color:var(--ink-3);font-weight:700}

/* ── 5 cards de custo no drill-in de atividades ── */
.cost-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:4px}
@media(max-width:1000px){.cost-cards{grid-template-columns:repeat(2,1fr)}}
@media(max-width:640px){.cost-cards{grid-template-columns:1fr}}
.cost-card{border-radius:8px;border:1px solid;padding:12px 14px}
.cost-card h4{margin:0 0 10px;font-size:10px;text-transform:uppercase;letter-spacing:.9px;font-weight:700}
.cost-card.mat{background:#E8F1FE;border-color:#B8D4F5}
.cost-card.mat h4{color:#1E4D8C}
.cost-card.mo{background:#FFF1E0;border-color:#FFD8A0}
.cost-card.mo h4{color:#A04E00}
.cost-card.subs{background:#F0E8FE;border-color:#D5BFF5}
.cost-card.subs h4{color:#5A2EA6}
.cost-card.log{background:#FFFAE0;border-color:#F0DD8A}
.cost-card.log h4{color:#8A6A00}
.cost-card.amort{background:#E0F5E8;border-color:#A0E0B0}
.cost-card.amort h4{color:#1A7A3A}
.cost-total{font-size:15px;font-weight:700;font-variant-numeric:tabular-nums}

table.mini{width:100%;border-collapse:collapse;font-size:12.5px}
table.mini th{font-size:10.5px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--ink-3);padding:6px 8px;text-align:left;background:#F8F9FB;border-bottom:1px solid var(--line)}
table.mini td{padding:5px 4px;border-bottom:1px solid var(--line)}
table.mini td input, table.mini td select{padding:5px 7px;font-size:12.5px;border:1px solid var(--line);border-radius:4px;background:#fff;width:100%}
table.mini td.num input{text-align:right;font-variant-numeric:tabular-nums}

.totals-band{background:#F8F9FB;border:1px solid var(--line);border-radius:6px;padding:10px 14px;margin-top:10px;display:grid;grid-template-columns:repeat(5,1fr);gap:10px;font-size:12px}
.totals-band .b{font-weight:700;color:var(--ink);font-size:13px}
.totals-band .l{color:var(--ink-3);font-size:11px;text-transform:uppercase;letter-spacing:.5px}

.modal-back{position:fixed;inset:0;background:rgba(15,18,28,.45);display:flex;align-items:center;justify-content:center;z-index:100;animation:fadeIn .15s}
@keyframes fadeIn{from{opacity:0}to{opacity:1}}
.modal{background:#fff;border-radius:10px;width:560px;max-width:90vw;max-height:88vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(15,20,30,.3)}
.modal.large{width:880px}
.modal-head{padding:16px 20px;border-bottom:1px solid var(--line);display:flex;align-items:center}
.modal-head h3{margin:0;font-size:15px}
.modal-body{padding:20px;overflow-y:auto;flex:1}
.modal-foot{padding:14px 20px;border-top:1px solid var(--line);display:flex;gap:8px;justify-content:flex-end}

.empty{padding:50px 30px;text-align:center;color:var(--ink-3)}
.empty .icon{font-size:36px;margin-bottom:10px;opacity:.5}
.empty h3{margin:6px 0;color:var(--ink-2);font-size:16px;font-weight:600}
.empty p{margin:0;max-width:400px;margin-left:auto;margin-right:auto}

.coming-soon{background:linear-gradient(135deg,#F8F9FB,#EFF1F5);border:2px dashed var(--line-strong);border-radius:10px;padding:50px;text-align:center}
.coming-soon h2{margin:0 0 8px;font-size:20px}
.coming-soon p{color:var(--ink-3);max-width:520px;margin:6px auto}
.coming-soon ul{text-align:left;display:inline-block;margin:18px auto 6px;color:var(--ink-2)}

.row{display:flex;gap:10px;align-items:center}
.row.gap-sm{gap:6px}
.row.wrap{flex-wrap:wrap}
.spacer{flex:1}
.muted{color:var(--ink-3)}
.bad{color:var(--red)}
.good{color:var(--green)}
.right{text-align:right}
.b{font-weight:600}
.toolbar{display:flex;gap:8px;align-items:center;margin-bottom:14px;flex-wrap:wrap}
.tag{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;font-size:11px;background:#EEF1F6;color:var(--ink-2);border-radius:10px}
.toast{position:fixed;bottom:20px;right:20px;background:var(--ink);color:#fff;padding:11px 16px;border-radius:8px;font-size:13px;box-shadow:0 6px 16px rgba(0,0,0,.2);animation:slideIn .2s;z-index:200;max-width:420px;line-height:1.4}
.toast--clickable{cursor:pointer;transition:background 0.15s;user-select:text}
.toast--clickable:hover{background:#000}
@keyframes slideIn{from{transform:translateY(20px);opacity:0}to{transform:none;opacity:1}}

/* ── DialogContext (substitui confirm()/prompt() do browser) ─────── */
/* A1.1.a — 2026-05-11 */
.dlg-back{position:fixed;inset:0;background:rgba(15,18,28,.5);display:flex;align-items:center;justify-content:center;z-index:300;animation:fadeIn .15s}
.dlg{background:#fff;border-radius:10px;width:420px;max-width:92vw;box-shadow:0 24px 60px rgba(15,20,30,.32);overflow:hidden;display:flex;flex-direction:column;animation:dlgPop .18s}
@keyframes dlgPop{from{transform:scale(.96);opacity:0}to{transform:scale(1);opacity:1}}
.dlg-head{padding:16px 20px 0;display:flex;align-items:center}
.dlg-title{margin:0;font-size:15px;font-weight:600;color:var(--ink);letter-spacing:.01em}
.dlg-body{padding:14px 20px 6px}
.dlg-msg{font-size:13px;color:var(--ink-2);line-height:1.55;white-space:pre-line}
.dlg-label{display:block;font-size:11px;color:var(--ink-3);margin:12px 0 4px;letter-spacing:.04em;text-transform:uppercase}
.dlg-input{width:100%;height:34px;padding:0 10px;border:1px solid var(--line-strong);border-radius:6px;font-size:13px;font-family:inherit;color:var(--ink);background:#fff;box-sizing:border-box;outline:none;transition:border-color .15s,box-shadow .15s}
.dlg-input:focus{border-color:var(--red);box-shadow:0 0 0 3px rgba(122,24,24,.12)}
/* João 2026-05-19: flex-wrap + texto a quebrar — diálogos com vários
   botões (ex.: 4 opções do "puxar da BD") já não cortam o texto. */
.dlg-foot{padding:14px 20px 16px;display:flex;gap:8px;justify-content:flex-end;flex-wrap:wrap}
.dlg-btn{min-height:32px;padding:7px 14px;font-size:13px;font-family:inherit;font-weight:500;border-radius:6px;cursor:pointer;border:1px solid transparent;white-space:normal;line-height:1.2;transition:background .15s,border-color .15s,color .15s}
.dlg-btn--ghost{background:transparent;border-color:var(--line-strong);color:var(--ink-2)}
.dlg-btn--ghost:hover{background:#F5F6F8;color:var(--ink)}
.dlg-btn--primary{background:var(--red);border-color:var(--red);color:#fff}
.dlg-btn--primary:hover{background:#5e1212}
.dlg-btn--danger{background:#B91C1C;border-color:#B91C1C;color:#fff}
.dlg-btn--danger:hover{background:#8c1414}
.dlg--danger .dlg-title{color:#B91C1C}
.dlg--warning .dlg-title{color:#A77400}
.dlg--info .dlg-title{color:#1E4D8C}

.lock-banner{background:#FFF3D9;border:1px solid #E8A547;border-radius:6px;padding:10px 14px;margin-bottom:14px;font-size:13px;color:#7A5500}

/* ── Filtros CRM ──────────────────────────────────────────────── */
/* Escalões chips */
.esc-btn{display:inline-flex;align-items:center;padding:5px 12px;font-size:12px;font-weight:500;border:1px solid var(--line-strong);border-radius:20px;background:#fff;color:var(--ink-2);cursor:pointer;transition:all .15s;white-space:nowrap}
.esc-btn:hover{border-color:var(--red);color:var(--red)}
.esc-btn.active{background:var(--red);border-color:var(--red);color:#fff}

/* Altura padrão dos três controles de filtro: 36px */
.f-status-btn,.f-cal-trigger{display:flex;align-items:center;gap:8px;padding:0 10px;border:1px solid var(--line-strong);border-radius:6px;background:#fff;cursor:pointer;font-size:13px;height:36px;white-space:nowrap}
.f-status-btn{min-width:160px}
.f-cal-trigger{min-width:180px}
.f-status-btn:hover,.f-cal-trigger:hover{border-color:var(--red)}
.f-status-btn.has-sel,.f-cal-trigger.has-sel{border-color:var(--red)}

/* Status dropdown */
.f-status-drop{position:relative}
.f-status-menu{position:absolute;top:calc(100% + 3px);left:0;min-width:200px;background:#fff;border:1px solid var(--line-strong);border-radius:8px;box-shadow:0 6px 20px rgba(0,0,0,.12);z-index:50;overflow:hidden}
.f-status-opt{display:flex;align-items:center;gap:10px;padding:9px 12px;cursor:pointer;font-size:13px}
.f-status-opt:hover{background:#F5F6F8}
.f-status-chk{width:16px;height:16px;border:1.5px solid var(--line-strong);border-radius:4px;display:flex;align-items:center;justify-content:center;font-size:10px;color:#fff;flex-shrink:0}
.f-status-opt.selected .f-status-chk{background:var(--red);border-color:var(--red)}
.f-status-sdot{width:8px;height:8px;border-radius:50%;flex-shrink:0}

/* Autocomplete cliente — mesma altura via min-height+padding */
.f-ac-wrap{position:relative}
.f-ac-box{display:flex;flex-wrap:wrap;gap:4px;padding:0 8px;border:1px solid var(--line-strong);border-radius:6px;background:#fff;cursor:text;min-height:36px;align-items:center}
.f-ac-box:focus-within{border-color:var(--red);box-shadow:0 0 0 3px var(--red-soft)}
.f-ac-box.has-sel{border-color:var(--red)}
.f-ac-tag{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;background:#E8EDF6;color:#3C5AA6;border-radius:12px;font-size:12px;white-space:nowrap;margin:2px 0}
.f-ac-tag button{background:none;border:none;cursor:pointer;color:#3C5AA6;font-size:13px;padding:0;line-height:1;display:flex}
.f-ac-input{border:none;outline:none;font-size:13px;flex:1;min-width:100px;padding:2px 4px;background:transparent}
.f-ac-list{position:absolute;top:calc(100% + 3px);left:0;right:0;background:#fff;border:1px solid var(--line-strong);border-radius:8px;box-shadow:0 6px 20px rgba(0,0,0,.12);z-index:50;overflow:hidden;max-height:240px;overflow-y:auto}
.f-ac-item{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;cursor:pointer;font-size:13px}
.f-ac-item:hover{background:#F5F6F8}
.f-ac-item mark{background:#FFF3D9;border-radius:2px;padding:0 1px}
.f-ac-chk{color:var(--green);font-weight:700;font-size:13px}

/* Calendário range picker */
.f-cal-wrap{position:relative}
.f-cal-popup{position:absolute;top:calc(100% + 3px);left:0;background:#fff;border:1px solid var(--line-strong);border-radius:8px;box-shadow:0 6px 20px rgba(0,0,0,.12);z-index:50;padding:14px;min-width:262px}
.f-cal-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.f-cal-mlbl{font-weight:600;font-size:13px}
.f-cal-nav{background:none;border:none;cursor:pointer;font-size:18px;color:var(--ink-2);padding:2px 6px;border-radius:4px}
.f-cal-nav:hover{background:#F0F1F4}
.f-cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.f-cal-dow{text-align:center;font-size:10px;font-weight:600;color:var(--ink-3);padding:3px 0;text-transform:uppercase}
.f-cal-empty{height:30px}
.f-cal-day{text-align:center;font-size:12px;padding:6px 2px;cursor:pointer;border-radius:4px;user-select:none}
.f-cal-day:hover{background:#F0F1F4}
.f-cal-day.rs{background:var(--red)!important;color:#fff!important;border-radius:4px 0 0 4px}
.f-cal-day.re{background:var(--red)!important;color:#fff!important;border-radius:0 4px 4px 0}
.f-cal-day.rs.re{border-radius:4px}
.f-cal-day.ri{background:var(--red-soft);color:var(--red);border-radius:0}
.f-cal-day.ss{background:#3C5AA6!important;color:#fff!important;border-radius:4px 0 0 4px}
.f-cal-day.se{background:#3C5AA6!important;color:#fff!important;border-radius:0 4px 4px 0}
.f-cal-day.si{background:#E8EDF6;color:#3C5AA6;border-radius:0}
.f-cal-hint{font-size:11px;color:var(--ink-3);margin-top:8px;text-align:center}
.f-cal-foot{display:flex;align-items:center;justify-content:space-between;margin-top:10px;padding-top:8px;border-top:1px solid var(--line)}
.f-cal-mini{font-size:11px;color:var(--ink-3)}

/* Tags de filtros ativos */
.f-active-bar{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px;padding-top:10px;border-top:1px solid var(--line)}
.f-active-tag{display:inline-flex;align-items:center;gap:4px;padding:3px 8px;background:#E8EDF6;color:#3C5AA6;border-radius:12px;font-size:12px}
.f-active-tag button{background:none;border:none;cursor:pointer;color:#3C5AA6;font-size:14px;padding:0;line-height:1}
.f-clear-all{background:none;border:none;cursor:pointer;color:var(--red);font-size:12px;font-weight:600;padding:3px 8px;text-decoration:underline}

@media (max-width:1100px){
  .kpi-grid{grid-template-columns:repeat(2,1fr)}
  .form-grid{grid-template-columns:1fr}
  .form-grid.cols-3, .form-grid.cols-4{grid-template-columns:1fr 1fr}
}

/* ============================================================
   FILTROS CRM — escalões, status multi-select, autocomplete, calendário
   ============================================================ */

/* Escalões de valor */
.esc-btn{display:inline-flex;align-items:center;padding:4px 11px;border-radius:20px;border:1px solid var(--line-strong);background:#fff;color:var(--ink-2);cursor:pointer;font-size:12px;font-weight:500;white-space:nowrap;transition:all .12s;font-family:var(--font)}
.esc-btn:hover{border-color:var(--red);color:var(--red);background:var(--red-soft)}
.esc-btn.active{background:var(--red);border-color:var(--red);color:#fff}

/* Status multi-select dropdown */
.f-status-drop{position:relative}
.f-status-btn{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid var(--line-strong);border-radius:6px;background:#fff;cursor:pointer;width:100%;font-size:13px;text-align:left;font-family:var(--font);color:var(--ink)}
.f-status-btn:hover{border-color:var(--ink-3)}
.f-status-btn.has-sel{border-color:var(--red)}
.f-status-menu{position:absolute;top:calc(100% + 3px);left:0;min-width:100%;background:#fff;border:1px solid var(--line-strong);border-radius:var(--radius);z-index:50;overflow:hidden;box-shadow:var(--shadow)}
.f-status-opt{display:flex;align-items:center;gap:10px;padding:9px 12px;cursor:pointer;font-size:13px;transition:background .08s;color:var(--ink)}
.f-status-opt:hover{background:var(--bg)}
.f-status-chk{width:16px;height:16px;border:1.5px solid var(--line-strong);border-radius:4px;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:10px;color:#fff;transition:all .1s}
.f-status-opt.selected .f-status-chk{background:var(--red);border-color:var(--red)}
.f-status-sdot{width:8px;height:8px;border-radius:50%;flex-shrink:0}

/* Autocomplete multi-cliente */
.f-ac-wrap{position:relative}
.f-ac-box{display:flex;flex-wrap:wrap;gap:4px;align-items:center;padding:5px 8px;border:1px solid var(--line-strong);border-radius:6px;background:#fff;min-height:36px;cursor:text;transition:border-color .12s}
.f-ac-box:focus-within{border-color:var(--red);box-shadow:0 0 0 3px var(--red-soft)}
.f-ac-box.has-sel{border-color:var(--red)}
.f-ac-tag{display:inline-flex;align-items:center;gap:4px;background:#E8EDF6;color:#3C5AA6;border-radius:12px;padding:2px 8px;font-size:12px;font-weight:500;white-space:nowrap}
.f-ac-tag button{background:none;border:none;color:#3C5AA6;cursor:pointer;font-size:13px;line-height:1;padding:0;opacity:.7;font-family:var(--font)}
.f-ac-tag button:hover{opacity:1}
.f-ac-input{border:none;outline:none;font-size:13px;background:transparent;min-width:80px;flex:1;color:var(--ink);padding:2px 0;font-family:var(--font)}
.f-ac-list{position:absolute;top:calc(100% + 2px);left:0;right:0;background:#fff;border:1px solid var(--line-strong);border-radius:var(--radius);z-index:50;overflow:hidden;box-shadow:var(--shadow)}
.f-ac-item{padding:9px 12px;cursor:pointer;font-size:13px;display:flex;align-items:center;gap:8px;color:var(--ink)}
.f-ac-item:hover{background:var(--bg)}
.f-ac-item mark{background:none;color:var(--red);font-weight:600}
.f-ac-chk{margin-left:auto;color:var(--green);font-size:12px}

/* Calendário range */
.f-cal-wrap{position:relative}
.f-cal-trigger{display:flex;align-items:center;gap:8px;padding:7px 10px;border:1px solid var(--line-strong);border-radius:6px;background:#fff;cursor:pointer;font-size:13px;white-space:nowrap;min-width:180px;user-select:none;transition:border-color .12s}
.f-cal-trigger:hover{border-color:var(--ink-3)}
.f-cal-trigger.has-sel{border-color:var(--red)}
.f-cal-popup{position:absolute;top:calc(100% + 4px);left:0;background:#fff;border:1px solid var(--line-strong);border-radius:var(--radius);z-index:50;padding:14px 16px;box-shadow:0 8px 24px rgba(20,25,40,.12);min-width:262px}
.f-cal-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.f-cal-nav{background:none;border:1px solid var(--line);border-radius:5px;padding:3px 10px;color:var(--ink-2);cursor:pointer;font-size:14px;font-family:var(--font)}
.f-cal-nav:hover{background:var(--bg)}
.f-cal-mlbl{font-size:13px;font-weight:600;color:var(--ink)}
.f-cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:1px}
.f-cal-dow{font-size:10px;color:var(--ink-3);text-align:center;padding:3px 0;font-weight:600;text-transform:uppercase}
.f-cal-day{font-size:12px;text-align:center;padding:6px 2px;border-radius:4px;cursor:pointer;color:var(--ink);transition:background .08s}
.f-cal-day:hover{background:#F0F5FD;color:var(--blue)}
.f-cal-empty{padding:6px 2px}
/* seleção em curso (vermelho) */
.f-cal-day.rs{background:var(--red)!important;color:#fff!important;font-weight:600;border-radius:4px 0 0 4px}
.f-cal-day.re{background:var(--red)!important;color:#fff!important;font-weight:600;border-radius:0 4px 4px 0}
.f-cal-day.rs.re{border-radius:4px}
.f-cal-day.ri{background:var(--red-soft);color:var(--red);border-radius:0}
/* períodos confirmados (azul) */
.f-cal-day.ss{background:#3C5AA6!important;color:#fff!important;border-radius:4px 0 0 4px}
.f-cal-day.se{background:#3C5AA6!important;color:#fff!important;border-radius:0 4px 4px 0}
.f-cal-day.ss.se{border-radius:4px}
.f-cal-day.si{background:#E8EDF6;color:#3C5AA6;border-radius:0}
.f-cal-hint{font-size:11px;color:var(--ink-3);text-align:center;margin-top:10px;padding-top:10px;border-top:1px solid var(--line)}
.f-cal-foot{display:flex;justify-content:space-between;align-items:center;margin-top:8px}
.f-cal-mini{font-size:11px;color:var(--ink-3)}

/* Filtros ativos — barra de tags */
.f-active-bar{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px;padding-top:12px;border-top:1px solid var(--line);align-items:center}
.f-active-tag{display:inline-flex;align-items:center;gap:5px;padding:3px 7px 3px 10px;border-radius:20px;background:#E8EDF6;color:#3C5AA6;font-size:12px;font-weight:500}
.f-active-tag button{background:none;border:none;color:#3C5AA6;cursor:pointer;font-size:14px;line-height:1;padding:0 1px;opacity:.6;font-family:var(--font)}
.f-active-tag button:hover{opacity:1}
.f-clear-all{font-size:12px;color:var(--ink-3);background:none;border:none;cursor:pointer;padding:3px 10px;border-radius:20px;font-family:var(--font)}
.f-clear-all:hover{background:var(--bg);color:var(--ink)}

/* ============================================================
   NOVO APP SHELL v0.3 — Header horizontal + sidebar fina BD
   ============================================================ */

/* Grelha raiz */
.app-shell{
  display:grid;
  grid-template-rows:46px 1fr;          /* mockup 2026-05-10: era 52px (sincronizar com .app-header height) */
  grid-template-columns:48px 1fr;
  height:100vh;
  overflow:hidden;
}

/* ── Header — fundo accent bordô (mockup 2026-05-10) ─────────
   Antes era dark (#1B1F27, height 52px, nav vermelho).
   Agora é bordô (var(--red), height 46px, nav branco). */
.app-header{
  grid-column:1/-1;
  grid-row:1;
  background:var(--red);                /* era #1B1F27 */
  border-bottom:none;                   /* era 1px solid; agora conecta com sidebar bordô formando L */
  display:flex;
  align-items:center;
  height:46px;                          /* era 52px (mockup é 46px) */
  min-height:46px;
  max-height:46px;
  overflow:hidden;
  position:sticky;
  top:0;
  z-index:30;
}

.header-brand{
  display:flex;
  align-items:center;
  gap:10px;
  padding:0 14px;
  height:100%;
  border-right:1px solid rgba(255,255,255,.18); /* era #252B38 */
  text-decoration:none;
  flex-shrink:0;
  overflow:hidden;
}
.header-brand:hover{background:rgba(255,255,255,.06)}

/* Ícone do logo — original é bordô sobre transparente.
   Filter brightness(10) vira-o branco para contraste com header bordô. */
.header-logo-icon{
  height:22px;
  width:auto;
  filter:brightness(10);
  flex-shrink:0;
}
.header-brand-text{
  color:#fff;
  font-size:13px;
  font-weight:700;
  letter-spacing:.4px;
  font-family:var(--font);
  white-space:nowrap;
}

/* Logo legacy (full image — só usado se algum sítio ainda chamar) */
.header-logo{
  height:26px;
  width:auto;
  max-width:140px;
  object-fit:contain;
  display:block;
  flex-shrink:0;
}

.header-nav{
  display:flex;
  align-items:stretch;
  height:100%;
  padding:0 4px;
  flex:1;
  overflow:hidden;
}

.header-nav-link{
  display:inline-flex;
  align-items:center;
  height:100%;
  padding:0 13px;                       /* era 0 4px */
  margin:0 2px;
  text-decoration:none;
  font-size:12.5px;                     /* era 13px */
  font-weight:500;                      /* era 600 */
  color:rgba(255,255,255,.72);          /* era var(--red) — agora branco translucido */
  white-space:nowrap;
  cursor:pointer;
  user-select:none;
  font-family:var(--font);
  border-bottom:2px solid transparent;
  transition:color .12s,background .12s;
}
.header-nav-link:hover{color:#fff}     /* era #ff6b6b */
.header-nav-link.active{
  background:rgba(255,255,255,.25);     /* era var(--red) */
  color:#fff;                           /* era #000 */
  font-weight:700;                      /* nova ênfase */
  border-radius:5px;
  border-bottom-color:transparent;
  padding:0 13px;
  margin:7px 2px;
  height:calc(100% - 14px);
}
.header-nav-link.coming{
  opacity:.4;                           /* era .35 */
  cursor:not-allowed;
  font-size:12.5px;
  font-weight:500;
  pointer-events:none;
}

.header-right{
  display:flex;
  align-items:center;
  gap:10px;
  padding:0 14px;
  flex-shrink:0;
}

.header-user-chip{
  font-size:12px;
  color:rgba(255,255,255,.9);           /* era #6A7280 */
  padding:4px 10px;
  background:rgba(255,255,255,.14);     /* era rgba(255,255,255,.05) */
  border:1px solid rgba(255,255,255,.22); /* era #2A3040 */
  border-radius:14px;
  white-space:nowrap;
}
.header-user-chip.offline{color:rgba(255,255,255,.55)}

.header-config-btn{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:32px;
  height:32px;
  border-radius:6px;
  color:rgba(255,255,255,.85);          /* era #7A8090 */
  font-size:16px;
  text-decoration:none;
  transition:background .15s,color .15s;
}
.header-config-btn:hover{background:rgba(255,255,255,.18);color:#fff}
.header-config-btn.active{background:rgba(255,255,255,.28);color:#fff}

/* Pill "Teste Varredura Email" — ao lado do Config (T2.5 v3.12o, 2026-05-16) */
.header-pill-teste{
  display:inline-flex;
  align-items:center;
  height:28px;
  padding:0 10px;
  border-radius:14px;
  background:rgba(255,255,255,.12);
  color:rgba(255,255,255,.85);
  font-size:11.5px;
  font-weight:500;
  text-decoration:none;
  margin-right:6px;
  transition:background .15s,color .15s;
}
.header-pill-teste:hover{background:rgba(255,255,255,.22);color:#fff}
.header-pill-teste.active{background:rgba(255,255,255,.32);color:#fff}

/* ── BD Sidebar fina — bordô em L com a topbar (mockup 2026-05-10) ───
   Header bordô + sidebar bordô forma um L no canto superior esquerdo,
   sem linha de separação entre as duas. */
.bd-sidebar{
  grid-column:1;
  grid-row:2;
  background:var(--red);                 /* era #1B1F27 (dark) */
  border-right:1px solid rgba(0,0,0,.18); /* era #252B38; subtil para separar do conteúdo */
  display:flex;
  flex-direction:column;
  align-items:center;
  padding:10px 0;
  gap:3px;
  overflow:visible;
  position:relative;
  z-index:20;
}

.bd-sidebar-item{
  position:relative;
  width:38px;
  height:38px;
  display:flex;
  align-items:center;
  justify-content:center;
  border-radius:8px;
  text-decoration:none;
  color:rgba(255,255,255,.7);            /* era #505868; agora branco translucido */
  font-size:17px;
  transition:background .15s,color .15s;
  cursor:pointer;
  /* P6 — fundo presente sempre, mais opaco quando active */
  background:rgba(255,255,255,.15);
}
.bd-sidebar-item:hover{
  background:rgba(255,255,255,.22);      /* P6 — hover acima do default */
  color:#fff;
}
.bd-sidebar-item.active{
  background:rgba(255,255,255,.38);      /* P6 — selected: bem mais opaco */
  color:#fff;
}

/* Tooltip animado */
.bd-tooltip{
  position:absolute;
  left:calc(100% + 11px);
  top:50%;
  transform:translateY(-50%) translateX(-7px);
  background:#262C3A;
  color:#DDE0E8;
  padding:5px 11px;
  border-radius:6px;
  font-size:12px;
  font-weight:500;
  white-space:nowrap;
  pointer-events:none;
  opacity:0;
  transition:opacity .18s ease,transform .18s ease;
  box-shadow:0 4px 16px rgba(0,0,0,.38);
  border:1px solid #353C4E;
  z-index:200;
  font-family:var(--font);
}
.bd-tooltip::before{
  content:'';
  position:absolute;
  right:100%;
  top:50%;
  transform:translateY(-50%);
  border:5px solid transparent;
  border-right-color:#353C4E;
}
.bd-sidebar-item:hover .bd-tooltip{
  opacity:1;
  transform:translateY(-50%) translateX(0);
}

/* ── Area de conteudo ────────────────────────────────────── */
.app-content{
  grid-column:2;
  grid-row:2;
  overflow-y:auto;
  overflow-x:hidden;
  display:flex;
  flex-direction:column;
  min-height:0;
  background:var(--bg);
}


/* ═══════════════════════════════════════════════════════════════
   CRM 2-PANEL LAYOUT
   ═══════════════════════════════════════════════════════════════ */

/* CRM ocupa toda a area de conteudo via position:fixed */
.crm-page{
  position:fixed;
  top:52px;       /* altura do topbar */
  left:48px;      /* largura da sidebar */
  right:0;
  bottom:0;
  z-index:5;
  background:var(--bg);
  display:grid;
  grid-template-rows:1fr;
  overflow:hidden;
  padding:10px;
}

/* minmax(0,1fr) garante que cada coluna fica a 50% mesmo se o conteudo for mais largo */
.crm-panels{
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:10px;
  overflow:hidden;
  min-height:0;
}

/* Bloco E4 refresh 2026-05-11 — Split 40/60 na aba Orçamentar
   (PropostaPanel à direita precisa de espaço para edição/análise). */
.crm-panels--orc{
  /* T2.5 Fase B v7 (2026-05-13): 2fr 3fr = 40/60 robusto. % puro estava a
     ser ignorado por algum override em conteúdo largo. fr partilha o
     restante respeitando minmax(0, ...) na regra base .crm-panels. */
  grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
}

/* Coluna esquerda — 2 cards físicos separados (Listagem + Estatísticas).
   Proporção fixa 60/40 (Onda 8.6): CRM 60% / Estatísticas 40% — não muda com nº de propostas.
   overflow:visible para o calendário do date range picker não ser cortado. */
.crm-left-column{
  display:grid;
  grid-template-rows:6fr 4fr;
  gap:10px;
  min-height:0;
  /* T2.5 Fase B v7 (2026-05-13): min-width:0 garante que a coluna respeita
     o grid 2fr/3fr do .crm-panels--orc — sem isto, conteúdo intrínseco
     largo dentro da listagem pode forçar a expansão para fora dos 40%. */
  min-width:0;
  overflow:visible;
}
/* Estatísticas escondidas (botão 📊): a listagem cresce p/ ocupar tudo */
.crm-left-column--no-stats{
  grid-template-rows:1fr;
}

/* Card esquerdo (Listagem) — overflow:visible para popover do calendário sair (Onda 8.6).
   O scroll interno fica no `.crm-list-scroll`. */
.crm-list-card{
  background:#fff;
  border:1px solid var(--line);
  border-radius:8px;
  box-shadow:0 1px 3px rgba(0,0,0,.05);
  display:flex;
  flex-direction:column;
  overflow:visible;
  min-height:0;
  min-width:0;
  position:relative;
}

/* Header dentro do card: casinha + pesquisa + filtros */
.crm-list-card-header{
  display:flex;
  align-items:center;
  gap:6px;
  padding:8px 10px;
  border-bottom:1px solid var(--line);
  background:#FAFBFC;
  flex-shrink:0;
}

/* Botão Nova Proposta — ícone + texto (mockup 2026-05-10).
   Fundo bordô soft, border accent — alinhado com chip do mockup. */
.crm-nova-btn{
  display:inline-flex;
  align-items:center;
  gap:5px;
  height:30px;
  padding:3px 12px 3px 10px;
  background:var(--red-soft);
  border:1px solid var(--red-line);
  border-radius:14px;
  cursor:pointer;
  flex-shrink:0;
  transition:background .12s,border-color .12s;
  font-family:var(--font);
}
.crm-nova-btn:hover{background:var(--red-ch);border-color:var(--red)}
.crm-nova-icon{
  width:18px;
  height:18px;
  object-fit:contain;
  display:block;
  flex-shrink:0;
}
.crm-nova-label{
  font-size:11px;
  font-weight:700;
  color:var(--red);
  white-space:nowrap;
}

/* Input de pesquisa */
.crm-search-input{
  flex:1;
  min-width:0;
  padding:5px 8px;
  border:1px solid var(--line);
  border-radius:5px;
  font-size:12px;
  background:#fff;
  color:var(--ink);
}
.crm-search-input:focus{outline:none;border-color:var(--red)}

/* Selects de filtro */
.crm-filter-select{
  padding:5px 6px;
  border:1px solid var(--line);
  border-radius:5px;
  font-size:11.5px;
  background:#fff;
  color:var(--ink-2);
  cursor:pointer;
}
.crm-filter-select:focus{outline:none;border-color:var(--red)}

/* Botão Anular — bordô para se ver claramente (Onda 8.6).
   Antes era cinza claro; agora destaque accent quando há acções disponíveis. */
.crm-undo-btn{
  width:32px;
  height:32px;
  display:flex;
  align-items:center;
  justify-content:center;
  border:1.5px solid var(--red-line);
  border-radius:6px;
  font-size:14px;
  background:var(--red-soft);
  color:var(--red);
  cursor:pointer;
  flex-shrink:0;
  font-weight:700;
  transition:all .12s;
}
.crm-undo-btn:hover:not(:disabled){
  background:var(--red);
  color:#fff;
  border-color:var(--red);
}
.crm-undo-btn:disabled{
  opacity:.35;
  cursor:not-allowed;
  background:transparent;
  color:var(--ink-4);
  border-color:var(--line);
}

/* Subheader: labels das colunas */
.crm-list-subheader{
  display:flex;
  align-items:center;
  gap:0;
  padding:4px 8px;
  background:#F5F6F8;
  border-bottom:1px solid var(--line);
  font-size:9.5px;
  font-weight:700;
  color:var(--ink-4);
  text-transform:uppercase;
  letter-spacing:.4px;
  flex-shrink:0;
}
.clsh-num{width:36px;flex-shrink:0}
.clsh-ver{width:34px;flex-shrink:0}
.clsh-toggle{
  width:18px;flex-shrink:0;
  cursor:pointer;
  color:var(--ink-3);
  font-size:11px;
  font-weight:400;
  text-transform:none;
  letter-spacing:0;
}
.clsh-obra{flex:1.4;min-width:0}
.clsh-cliente{flex:1;min-width:0}
.clsh-status{width:80px;flex-shrink:0}
.clsh-valor{width:84px;flex-shrink:0;text-align:right}
.clsh-data{width:42px;flex-shrink:0;text-align:right}
.clsh-count{
  margin-left:auto;
  font-size:9px;
  font-weight:400;
  color:var(--ink-4);
  text-transform:none;
  letter-spacing:0;
  white-space:nowrap;
}

/* Lista com scroll interno */
.crm-list-scroll{
  flex:1;
  overflow-y:auto;
  overflow-x:hidden;
  min-height:0;
}

/* Tabela da lista */
table.crm-tbl{
  width:100%;
  border-collapse:collapse;
  font-size:11.5px;
}
table.crm-tbl td{
  padding:0 6px;
  height:36px;
  vertical-align:middle;
  border-bottom:1px solid #F0F2F5;
  white-space:nowrap;
}
table.crm-tbl tr:hover td{ background:#F8F9FB }
table.crm-tbl tr.row-selected td{
  color:var(--red);
  background:#FFF5F5;
}
table.crm-tbl tr.row-selected:hover td{ background:#FFECEC }
table.crm-tbl tr.row-dropdown td{
  background:#F8F9FB;
  color:var(--ink-2);
  font-size:11px;
}
table.crm-tbl tr.row-arquivada td{
  font-style:italic;
  text-decoration:underline;
  color:var(--ink-3);
}
table.crm-tbl tr.row-dropdown.row-arquivada td{
  color:var(--ink-4);
}

/* Colunas da tabela */
.col-num{
  width:36px;
  font-size:10.5px;
  font-weight:700;
  color:var(--ink-3);
  font-variant-numeric:tabular-nums;
}
.col-ver{
  width:34px;
  font-size:10.5px;
  font-weight:700;
  color:var(--ink-2);
}
.ver-toggle{ cursor:pointer }
.ver-exp{
  font-size:9px;
  font-weight:400;
  color:var(--ink-4);
  margin-left:2px;
  transition:opacity .15s;
}
.col-obra{
  max-width:0;
  overflow:hidden;
  text-overflow:ellipsis;
  font-weight:600;
  color:var(--ink-1);
}
.col-cliente{
  max-width:0;
  overflow:hidden;
  text-overflow:ellipsis;
  color:var(--ink-3);
  font-size:11px;
}
.col-status{ width:80px }
.col-valor{
  width:84px;
  text-align:right;
  font-variant-numeric:tabular-nums;
  font-weight:600;
  color:var(--ink-1);
  font-size:11px;
}
.col-adj-val{
  font-size:9.5px;
  font-weight:400;
  color:var(--green);
  display:block;
}
.col-data{
  width:42px;
  text-align:right;
  color:var(--ink-4);
  font-size:10.5px;
  font-variant-numeric:tabular-nums;
}
.col-acts{
  width:54px;
  text-align:right;
  transition:opacity .15s;
}
.crm-del-btn{
  cursor:pointer;
  color:#DC2626;
  font-size:14px;
  font-weight:700;
  padding:0 3px;
  user-select:none;
}
.crm-del-btn:hover{ color:#991B1B }


/* Contador de obras/propostas */
.crm-count-label{
  font-size:10.5px;
  color:var(--ink-4);
  white-space:nowrap;
  flex-shrink:0;
  font-weight:400;
}

/* Botão toggle CRM ↔ Listagem */
.view-toggle-btn{
  display:flex;
  align-items:center;
  justify-content:center;
  width:28px;
  height:28px;
  border:1px solid var(--line-strong);
  border-radius:5px;
  background:#fff;
  cursor:pointer;
  flex-shrink:0;
  transition:all .12s;
}
.view-toggle-btn:hover{ background:var(--red); border-color:var(--red); color:#fff; }
.view-toggle-active{ background:var(--red); border-color:var(--red); color:#fff; }
.view-toggle-icon{ font-size:14px; line-height:1; }

/* ═══════════════════════════════════════════════════════
   CRM LIST — GRID ROW CARDS
   Grid: Nº | V | Obra | Cliente | Valor | Envio | Status | D.Adj | V.Adj | Ações
   ═══════════════════════════════════════════════════════ */
/* Nº | V | Obra | Cliente | Valor | Envio | Status | D.Adj | V.Adj | Ações */
/* Nº | V | Obra | Cliente | Valor | Envio | Status | D.Adj | V.Adj | Ações */
/* Grid CRM split (mockup 2026-05-10).
   Onda 5.8: Nº alargado 80→92px para Lato 900 32px selected caber sem cortar. */
:root { --crm-grid: 78px minmax(0,1fr) 44px 86px 76px 108px 56px; }

/* Cabeçalho sticky */
.crm-row-header{
  display:grid;
  grid-template-columns:var(--crm-grid);
  column-gap:4px;
  align-items:center;
  padding:5px 6px;      /* igual ao crm-row-card — mantém colunas alinhadas */
  background:#F5F6F8;
  border-bottom:1px solid var(--line);
  position:sticky;
  top:0;
  z-index:2;
  font-family:var(--font);
  font-size:9.5px;
  font-weight:700;
  color:var(--ink-4);
  text-transform:uppercase;
  letter-spacing:.5px;
}
/* Todas as células do cabeçalho: mesma fonte, sem bold — só alinhamento difere */
.crm-row-header > * {
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  font-family:var(--font) !important;
  font-size:9.5px !important;
  font-weight:700 !important;
  color:var(--ink-4) !important;
  letter-spacing:.5px !important;
}

/* Wrapper dos cards */
.crm-cards-body{
  display:flex;
  flex-direction:column;
  gap:3px;
  padding:5px 6px;
}

/* Card de uma proposta */
.crm-row-card{
  display:grid;
  grid-template-columns:var(--crm-grid);
  column-gap:4px;
  align-items:center;
  padding:5px 6px;
  background:#fff;
  border:1px solid var(--line);
  border-radius:4px;
  cursor:pointer;
  transition:background .1s, border-color .1s;
  min-height:34px;
}
.crm-row-card:hover{ background:#F8F9FB; border-color:var(--line-strong); }

/* Linha SELECCIONADA — não muda fundo (preserva o fundo de status).
   Só destaca: barra esquerda accent + texto obra/cliente/valor bordô + número grande bordô (.crc-num separado).
   Mockup 2026-05-10. */
.crm-row-sel{
  border-left:3px solid var(--red) !important;
  border-color:var(--red-line);
}
.crm-row-sel .crc-obra,
.crm-row-sel .crc-cli,
.crm-row-sel .crc-val{
  color:var(--red);
  font-weight:700;
}
/* Sub-rows do dropdown (versões arquivadas) — cinzentadas + opacity baixa.
   Italic só no texto (obra/cliente); número fica sem italic (Onda 8.8). */
.crm-row-drop{
  background:#F8F9FB;
  opacity:.75;
  min-height:auto;
}
.crm-row-drop .crc-num{
  font-style:normal;        /* override italic herdado de crm-row-arq */
  color:var(--ink-4);
}
.crm-row-drop .crc-obra-line,
.crm-row-drop .crc-cli-line{
  font-size:11.5px;
  color:var(--ink-3);
}

/* Footer Total Orçamentado (mockup 2026-05-10).
   Lato 900 grande na cor INK; aparece no fim do crm-list-card. */
.crm-list-footer{
  display:flex;
  align-items:center;
  justify-content:space-between;
  padding:14px 18px;
  border-top:2px solid var(--ink);
  flex-shrink:0;
  background:#fff;
}
.crm-list-footer-label{
  font-size:9.5px;
  font-weight:800;
  color:var(--ink);
  letter-spacing:1.1px;
  text-transform:uppercase;
}
.crm-list-footer-value{
  font-family:var(--font);
  font-weight:900;
  font-size:28px;
  color:var(--ink);
  font-variant-numeric:tabular-nums;
  letter-spacing:-.4px;
  line-height:1;
  white-space:nowrap;
}

/* Background subtil por status (mockup 2026-05-10) — só aplica se não for selecionada */
.crm-row-adj:not(.crm-row-sel){ background:var(--row-adjudicado); }
.crm-row-adj:not(.crm-row-sel):hover{ background:#EBF7EE; }
.crm-row-canc:not(.crm-row-sel){ background:var(--row-cancelado); color:var(--ink-3); }
.crm-row-canc:not(.crm-row-sel):hover{ background:#FFEFEF; }
/* Microalteração C+E (2026-05-11): texto em bordô (era cinza-ink-3) para diferenciar
   propostas arquivadas mesmo quando os dropdowns das versões estão todos abertos.
   Reforço de selectores para vencer o color:var(--ink) específico no .lst-obra-text
   e similares. O pill V<n> mantém-se neutro (usa CodePill com paleta própria). */
.crm-row-arq:not(.crm-row-sel){ background:var(--row-arquivada); font-style:italic; color:var(--red); }
.crm-row-arq:not(.crm-row-sel) > div{ color:var(--red); }
/* Vista LISTAGEM */
.crm-row-arq:not(.crm-row-sel) .lst-obra-text,
.crm-row-arq:not(.crm-row-sel) .lst-cli,
.crm-row-arq:not(.crm-row-sel) .lst-num,
.crm-row-arq:not(.crm-row-sel) .lst-val,
.crm-row-arq:not(.crm-row-sel) .lst-env{
  color:var(--red);
}
/* Vista CRM */
.crm-row-arq:not(.crm-row-sel) .crc-obra-line,
.crm-row-arq:not(.crm-row-sel) .crc-cli-line,
.crm-row-arq:not(.crm-row-sel) .crc-num,
.crm-row-arq:not(.crm-row-sel) .crc-val,
.crm-row-arq:not(.crm-row-sel) .crc-env{
  color:var(--red);
}
.crm-row-arq:not(.crm-row-sel):hover{ background:#F0F0F0; }

/* ── Células das colunas ──────────────────────────── */
/* Texto geral: cinzento escuro suave */
.crm-row-card > div{
  font-size:11.5px;
  color:var(--ink-2);
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  padding:0 2px;
}

/* Nº — Lato 300 22px default (Onda 8.8, igual às arquivadas).
   Selected: Lato 900 32px bordô. Mesma estética em toda a lista — só selected destaca. */
.crc-num{
  text-align:center;
  font-family:var(--font);
  font-weight:300;
  font-size:22px;
  color:var(--ink-5);
  font-variant-numeric:tabular-nums;
  letter-spacing:-.4px;
  line-height:1;
  transition:font-size .15s, font-weight .15s, color .15s;
}
.crm-row-sel .crc-num{
  font-weight:900;
  font-size:32px;
  color:var(--red);
  letter-spacing:-.8px;
}
/* V — centrado; seta posicionada absolutamente para não deslocar o texto.
   overflow:visible vence o overflow:hidden genérico de .crm-row-card > div
   (senão a seta de expandir, em right:-11px, fica cortada e o dropdown
   parece não funcionar). */
.crm-row-card > .crc-ver{ overflow:visible; }
.crc-ver{
  text-align:center;
  font-size:11px;
  color:var(--ink-3);
  display:flex;
  align-items:center;
  justify-content:center;
  position:relative;
}
.ver-clickable{
  cursor:pointer;
  position:relative;
  display:inline-block;
  text-align:center;
}
.ver-exp{
  font-size:9px;
  color:var(--red);
  line-height:1;
  transition:opacity .15s;
  position:absolute;
  right:-11px;
  top:50%;
  transform:translateY(-50%);
  width:10px;
  text-align:center;
}
/* Cabeçalho da coluna V — toggle */
.th-ver-toggle{
  cursor:pointer;
  display:inline-flex;
  align-items:center;
  gap:2px;
  font-size:9.5px;
  font-weight:700;
  color:var(--ink-4);
  text-transform:uppercase;
  letter-spacing:.5px;
}
.th-ver-toggle .sf-arrow,
.th-ver-toggle span:last-child{ color:var(--red); }

/* Obra — alinhada à esquerda */
.crc-obra{
  text-align:left;
  font-size:11.5px;
  color:var(--ink-2);
}
/* Cliente — centrado */
.crc-cli{ text-align:center; font-size:10.5px; color:var(--ink-3); }
/* Valor — centrado, bold */
.crc-val{
  text-align:center;
  font-weight:600;
  font-size:11.5px;
  color:var(--ink-1);
  font-variant-numeric:tabular-nums;
}
/* Envio — centrado */
.crc-env{ text-align:center; font-size:10.5px; color:var(--ink-3); font-variant-numeric:tabular-nums; }

/* Data Limite de entrega no CRM — 2 linhas em bordô, só aparece quando dataEnvio=null.
   Quando passa do prazo, .is-overdue muda para vermelho sangue + linha extra "Atrasado X dias".
   (Bloco E4 refresh 2026-05-11) */
.crc-env-dlim{
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  line-height:1.15;
  color:var(--red-main);
}
.crc-env-dlim-label{
  font-size:9px;
  font-weight:600;
  text-transform:uppercase;
  letter-spacing:.4px;
  opacity:.85;
}
.crc-env-dlim-date{
  font-size:11px;
  font-weight:700;
  font-variant-numeric:tabular-nums;
}
.crc-env-dlim.is-overdue{ color:#B91C1C; }
.crc-env-dlim-overdue{
  font-size:9px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.4px;
  color:#B91C1C;
  margin-top:1px;
}
/* Status — centrado, overflow:visible para o pill não ser cortado */
.crc-sts{ text-align:center; overflow:visible !important; }
/* D.Adj — centrado */
.crc-dadj{ text-align:center; font-size:10.5px; color:var(--ink-3); font-variant-numeric:tabular-nums; }
/* V.Adj — centrado, verde se adjudicado (via inline style) */
.crc-vadj{
  text-align:center;
  font-size:11px;
  font-variant-numeric:tabular-nums;
  color:var(--ink-3);
}
/* Ações — centrado, aparece on hover */
.crc-act{
  display:flex;
  align-items:center;
  justify-content:center;
  gap:4px;
  transition:opacity .15s;
}

/* Botão morada */
.crm-morada-btn{
  position:relative;
  cursor:pointer;
  font-size:13px;
  user-select:none;
  line-height:1;
}
.crm-morada-btn::after{
  content:'Copiar Morada';
  position:absolute;
  bottom:calc(100% + 6px);
  right:0;
  background:#1B1F27;
  color:#fff;
  font-size:10px;
  padding:4px 8px;
  border-radius:5px;
  white-space:nowrap;
  pointer-events:none;
  opacity:0;
  transition:opacity .18s;
  z-index:20;
}
.crm-morada-btn:hover::after{ opacity:1; }

/* ═══════════════════════════════════════════════════════
   STATUS FILTER PILL
   ═══════════════════════════════════════════════════════ */
.sf-wrap{ position:relative; flex-shrink:0; }
.sf-pill{
  display:inline-flex;
  align-items:center;
  gap:5px;
  padding:5px 10px;
  border-radius:20px;
  border:1px solid var(--line-strong);
  background:#3A3F4B;
  color:#fff;
  font-size:11.5px;
  font-weight:500;
  cursor:pointer;
  white-space:nowrap;
  transition:background .12s;
  font-family:var(--font);
}
.sf-pill:hover{ background:#2E3340; }
.sf-pill-active{ background:#1B1F27; border-color:#1B1F27; }
.sf-arrow{ font-size:9px; opacity:.7; }
.sf-dropdown{
  position:absolute;
  top:calc(100% + 6px);
  left:0;
  background:#fff;
  border:1px solid var(--line-strong);
  border-radius:8px;
  box-shadow:0 4px 16px rgba(0,0,0,.12);
  min-width:160px;
  padding:6px 0;
  z-index:50;
}
.sf-option{
  display:flex;
  align-items:center;
  gap:8px;
  padding:7px 14px;
  font-size:12px;
  color:var(--ink-2);
  cursor:pointer;
  transition:background .1s;
  font-family:var(--font);
}
.sf-option:hover{ background:#F5F6F8; }
.sf-option input[type=checkbox]{ accent-color:var(--red); cursor:pointer; }
.sf-clear{
  display:block;
  width:calc(100% - 28px);
  margin:6px 14px 2px;
  padding:5px;
  border:none;
  border-top:1px solid var(--line);
  background:none;
  font-size:11px;
  color:var(--ink-3);
  cursor:pointer;
  text-align:left;
  font-family:var(--font);
}
.sf-clear:hover{ color:var(--red); }

/* ═══════════════════════════════════════════════════════
   DATE RANGE PICKER
   ═══════════════════════════════════════════════════════ */
.drp-wrap{ position:relative; flex-shrink:0; }
.drp-btn{
  display:inline-flex;
  align-items:center;
  gap:5px;
  padding:5px 10px;
  border-radius:6px;
  border:1px solid var(--line-strong);
  background:#fff;
  color:var(--ink-2);
  font-size:11.5px;
  font-weight:500;
  cursor:pointer;
  white-space:nowrap;
  transition:all .12s;
  font-family:var(--font);
}
.drp-btn:hover{ background:#F5F6F8; border-color:var(--ink-3); }
.drp-btn-active{ background:#FFF5F5; border-color:var(--red); color:var(--red); }
.drp-popup{
  position:absolute;
  top:calc(100% + 6px);
  right:0;
  background:#fff;
  border:1px solid var(--line-strong);
  border-radius:10px;
  box-shadow:0 6px 24px rgba(0,0,0,.14);
  padding:14px;
  z-index:50;
  min-width:560px;
}
.drp-hint{
  text-align:center;
  font-size:11px;
  color:var(--ink-3);
  margin-bottom:10px;
  font-weight:500;
}
.drp-months{
  display:flex;
  gap:20px;
}
.drp-month{
  flex:1;
  min-width:0;
}
.drp-month-header{
  display:flex;
  align-items:center;
  justify-content:space-between;
  margin-bottom:6px;
}
.drp-month-name{
  font-size:12px;
  font-weight:700;
  color:var(--ink-1);
  text-align:center;
  flex:1;
}
.drp-nav{
  background:none;
  border:1px solid var(--line);
  border-radius:4px;
  padding:2px 8px;
  font-size:13px;
  color:var(--ink-3);
  cursor:pointer;
  line-height:1.4;
  transition:all .1s;
  font-family:var(--font);
}
.drp-nav:hover{ background:#F5F6F8; color:var(--ink-1); border-color:var(--ink-3); }
.drp-days-hdr{
  display:grid;
  grid-template-columns:repeat(7, 1fr);
  text-align:center;
  font-size:9.5px;
  font-weight:700;
  color:var(--ink-4);
  text-transform:uppercase;
  letter-spacing:.3px;
  margin-bottom:3px;
}
.drp-days-grid{
  display:grid;
  grid-template-columns:repeat(7, 1fr);
  gap:1px;
}
.drp-day{
  aspect-ratio:1;
  display:flex;
  align-items:center;
  justify-content:center;
  font-size:11px;
  color:var(--ink-2);
  border-radius:50%;
  cursor:pointer;
  transition:background .1s, color .1s;
}
.drp-day:hover{ background:#F5F6F8; }
.drp-start, .drp-end{
  background:var(--red) !important;
  color:#fff !important;
  border-radius:50%;
  font-weight:700;
}
.drp-range{
  background:#FFE7E7;
  border-radius:0;
  color:var(--ink-1);
}
.drp-footer{
  display:flex;
  align-items:center;
  justify-content:space-between;
  margin-top:10px;
  padding-top:10px;
  border-top:1px solid var(--line);
}
.drp-range-label{
  font-size:11.5px;
  color:var(--ink-2);
  font-variant-numeric:tabular-nums;
}
.drp-clear{
  font-size:11px;
  color:var(--ink-3);
  background:none;
  border:none;
  cursor:pointer;
  padding:3px 8px;
  border-radius:4px;
  font-family:var(--font);
  transition:color .1s;
}
.drp-clear:hover{ color:var(--red); }

/* ═══════════════════════════════════════════════════════
   PROPOSTA PANEL — Resumo do Orçamento
   ═══════════════════════════════════════════════════════ */

/* Resumo card: flex coluna — label + scroll + total bar */
.det-resumo-card{
  display:flex;
  flex-direction:column;
  overflow:hidden;
  padding:0;      /* override .det-card padding — usamos padding nos filhos */
}
.det-resumo-card .section-label{
  padding:10px 12px 6px;
  flex-shrink:0;
  border-bottom:1px solid var(--line);
  margin-bottom:0;
}
/* T4 (2026-05-11): header do Resumo com label à esquerda + Orçamentista à direita */
.det-resumo-card .resumo-header{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:10px;
  flex-wrap:wrap;
}
.resumo-orcamentista{
  display:inline-flex;
  align-items:center;
  gap:6px;
  font-size:10px;
  letter-spacing:.7px;
  text-transform:uppercase;
  font-weight:400;
  color:var(--ink-3);
}
.resumo-orcamentista-label{
  font-weight:700;
}
/* T4.1 (2026-05-11): mesma fonte do .folha-rosto-meta-value (30 dias) */
.resumo-orcamentista .inline-text{
  font-family:var(--font);
  font-size:11px;
  font-weight:400;
  color:var(--ink-3);
  text-transform:none;
  letter-spacing:0;
  line-height:1.45;
}
.resumo-scroll{
  flex:1;
  overflow-y:auto;
  min-height:0;
  display:flex;
  flex-direction:column;
  gap:5px;
  padding:8px 10px;
}

/* Card de capítulo (mockup 2026-05-10) — compactado para caber ~5 cards no viewport.
   Antes: padding 12 14, número 26 → ~50px. Agora: padding 8 12, número 22 → ~40px. */
.resumo-cap-card{
  display:grid;
  grid-template-columns:34px 1fr auto;
  gap:10px;
  align-items:center;
  padding:8px 12px;
  flex-shrink:0;
  background:var(--red-ch);
  border:1px solid var(--red-line);
  border-radius:6px;
  cursor:pointer;
  transition:filter .12s, transform .08s;
}
.resumo-cap-card:hover{ filter:brightness(.97); }
.resumo-cap-card:active{ transform:scale(.99); }
.resumo-cap-card-zero{ background:var(--red-ch-dark); }

.resumo-cap-num{
  font-family:var(--font);
  font-weight:300;
  font-size:22px;
  color:var(--red);
  line-height:1;
  font-variant-numeric:tabular-nums;
  letter-spacing:-.5px;
  text-align:center;
}
.resumo-cap-card-zero .resumo-cap-num{ color:#E5E7EC; }

.resumo-cap-mid{
  min-width:0;
  display:flex;
  flex-direction:column;
  gap:3px;
}
.resumo-cap-titulo{
  font-size:11.5px;
  font-weight:600;
  color:var(--ink);
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.resumo-cap-card-zero .resumo-cap-titulo{ color:var(--ink-4); }

.resumo-cap-progress{
  display:flex;
  align-items:center;
  gap:7px;
}
.resumo-cap-pct{
  font-size:9.5px;
  color:var(--red);
  font-weight:700;
  min-width:28px;
}
.resumo-cap-bar{
  flex:1;
  height:3px;
  background:#EFE3E3;
  border-radius:2px;
  overflow:hidden;
}
.resumo-cap-bar-fill{
  height:100%;
  background:var(--red);
  border-radius:2px;
  transition:width .25s ease-out;
}
.resumo-cap-valor{
  font-size:12.5px;
  font-weight:700;
  color:var(--ink);
  font-variant-numeric:tabular-nums;
  white-space:nowrap;
  text-align:right;
}
.resumo-cap-adefinir{
  font-size:10px;
  font-weight:700;
  letter-spacing:.5px;
  text-transform:uppercase;
  color:var(--red);
}

/* Barra de total: sempre colada ao fundo do card, fora do scroll (mockup 2026-05-10) */
.resumo-total-bar{
  display:flex;
  align-items:baseline;
  justify-content:space-between;
  padding:11px 14px;
  background:#fff;
  border-top:2px solid var(--ink);    /* sólido preto, mais marcado (mockup) */
  flex-shrink:0;
}
.resumo-total-label{
  font-size:10px;
  font-weight:800;
  text-transform:uppercase;
  letter-spacing:1.1px;
  color:var(--ink);
}
.resumo-total-valor{
  font-family:var(--font);
  font-size:18px;
  font-weight:900;
  color:var(--ink);
  font-variant-numeric:tabular-nums;
  letter-spacing:-.3px;
}

/* ═══════════════════════════════════════════════════════
   PROPOSTA PANEL — card direito (crm-detail-wrapper)
   ═══════════════════════════════════════════════════════ */

/* Wrapper direito — agora flex container, sem bordas próprias.
   Cada filho (.det-top-row -> FR + Resumo; .det-card-last -> Detalhada) ganha bordas individuais.
   Mockup 2026-05-10, Onda 5.8 — separação física dos 5 cards. */
.crm-detail-wrapper{
  display:flex;
  flex-direction:column;
  gap:10px;
  background:transparent;
  border:none;
  border-radius:0;
  box-shadow:none;
  overflow:hidden;
  min-height:0;
  height:100%;
}

/* Estado vazio — nenhuma proposta selecionada */
.crm-detail-empty{
  display:flex;
  align-items:center;
  justify-content:center;
  height:100%;
  color:var(--ink-4);
  font-size:13px;
  border:1px solid var(--line);
  border-radius:8px;
  background:#fff;
}

/* Fila superior: FR + Resumo — agora 2 cards físicos separados com gap (Onda 5.8) */
.det-top-row{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:10px;
  border:none;
  flex-shrink:0;
  height:320px;
}
.det-top-row .det-card:first-child{
  border-right:none;
  overflow:hidden;
  display:flex;
  flex-direction:column;
}

/* Card genérico — cada .det-card é agora um card físico independente
   (Onda 5.8): bordas + radius + shadow individuais, alinhado com os Cards 1 e 5. */
.det-card{
  padding:12px 14px;
  overflow:hidden;
  background:#fff;
  border:1px solid var(--line);
  border-radius:8px;
  box-shadow:0 1px 3px rgba(0,0,0,.05);
}

/* Último card: proposta detalhada — ocupa resto, é O ÚNICO que rola. */
.det-card-last{
  flex:1 1 0;
  overflow:hidden auto;    /* x:hidden y:auto — explícito para o sticky context */
  min-height:0;
  padding:0;
  /* O sticky do .atv-card-header (filho de .det-list) cola no topo deste container. */
}
.det-card-last > .det-list{
  /* Garante que o flex child .det-list ocupa a altura total do scroll context.
     Sem isto, em alguns browsers o sticky não cola. */
  min-height:100%;
}

/* Label de secção */
.section-label{
  font-size:10px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.7px;
  color:var(--ink-4);
  margin-bottom:8px;
}

/* ── Folha de Rosto (mockup 2026-05-10) ─────────────────────
   Layout: 3 rows (header / content 2 cols / actions) sobre watermark.
   Header: logo + tag PROPOSTA
   Content: esquerda (obra/cliente/morada/valor) | direita (meta enviado/validade/pagamento)
   Actions: ActionButton circular + Button rect pequeno
   Watermark: logo-icon-black.png opacity .22 no canto inferior-direito */
.folha-rosto{
  position:relative;
  display:flex;
  flex-direction:column;
  overflow:hidden;
}

/* Watermark — logo grande translúcido, ancorado canto inferior direito */
.folha-rosto-watermark{
  position:absolute;
  right:-26px;
  bottom:-44px;
  height:200px;
  width:auto;
  opacity:.18;
  pointer-events:none;
  user-select:none;
  z-index:0;
}

/* TOP: logo + tag PROPOSTA */
.folha-rosto-header{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:10px;
  padding-bottom:8px;
  margin-bottom:10px;
  border-bottom:1px solid var(--line);
  position:relative;
  z-index:1;
  flex-shrink:0;
}
.folha-rosto-logo{
  height:24px;
  width:auto;
  object-fit:contain;
}
.folha-rosto-tag{
  font-size:11px;
  font-weight:800;
  color:var(--red);
  letter-spacing:1.4px;
  text-transform:uppercase;
  padding:3px 9px;
  background:var(--red-soft);
  border:1.5px solid var(--red-line);
  border-radius:5px;
  white-space:nowrap;
}

/* T2.5 Precificação v2 (2026-05-13): nota interna global da proposta.
   Wrap em volta do pill com bolinha cinza absolute no canto superior direito.
   Quando sem nota, o pill vira botão (variante --nota-btn). */
.folha-rosto-tag-wrap{
  position:relative;
  display:inline-block;
}
.folha-rosto-tag-nota-dot{
  position:absolute;
  top:-5px;
  right:-5px;
  width:11px;
  height:11px;
  border-radius:50%;
  background:#7A8190;
  border:1.5px solid #fff;
  padding:0;
  cursor:pointer;
  box-shadow:0 1px 3px rgba(0,0,0,0.15);
  transition:transform .12s, background .12s;
}
.folha-rosto-tag-nota-dot:hover{
  background:#454B57;
  transform:scale(1.15);
}
.folha-rosto-tag-nota-dot:disabled{
  cursor:default;
  opacity:.65;
}
.folha-rosto-tag-nota-dot:disabled:hover{
  transform:none;
  background:#7A8190;
}
/* Variante "botão" — pill todo clicável quando ainda não há nota.
   Adiciona um "+" subtil à direita em hover para dar a entender que se edita. */
.folha-rosto-tag--nota-btn{
  cursor:pointer;
  font-family:inherit;
  position:relative;
  transition:background .12s, border-color .12s;
}
.folha-rosto-tag--nota-btn:hover{
  background:#fff;
  border-color:var(--red);
}
.folha-rosto-tag--nota-btn::after{
  content:"+";
  position:absolute;
  top:-7px;
  right:-7px;
  width:14px;
  height:14px;
  border-radius:50%;
  background:#fff;
  border:1.5px dashed var(--red-line);
  color:var(--red);
  font-size:11px;
  font-weight:700;
  line-height:11px;
  display:flex;
  align-items:center;
  justify-content:center;
  opacity:0;
  transition:opacity .15s;
}
.folha-rosto-tag--nota-btn:hover::after{
  opacity:1;
}

/* CONTENT: 2 colunas — esquerda flex / direita 175px (era 150).
   Coluna direita maior para acomodar valores grandes (pagamento longo)
   sem precisar de empilhar / cortar. */
/* A1.2 T3.4 (2026-05-11): grid com pagamento na col 2 abaixo da Meta (à direita
   do card). Sem border/linha — a watermark fica no fundo, conteúdo por cima. */
.folha-rosto-content{
  display:grid;
  grid-template-columns:minmax(0, 1fr) auto;
  grid-template-rows:auto auto 1fr;
  grid-template-areas:
    "obra meta"
    "left meta"
    "left pgto";
  align-items:start;
  gap:8px 16px;
  flex:1;
  min-height:0;
  position:relative;
  z-index:1;
}
.folha-rosto-content.fr-wide{
  grid-template-areas:
    "obra obra"
    "left meta"
    "left pgto";
}
.fr-obra-cell{ grid-area:obra; }
.folha-rosto-left{
  grid-area:left;
  display:flex;
  flex-direction:column;
  min-width:0;
}
.fr-pgto-cell{
  grid-area:pgto;
  min-width:180px;
  margin-top:6px;
  display:flex;
  flex-direction:column;
  align-items:flex-end;
}
.folha-rosto-obra{
  font-family:var(--font);
  font-weight:900;
  font-size:22px;
  color:var(--ink);
  letter-spacing:-.4px;
  /* Microalteração AH (2026-05-11): pill encostada ao topo visual do texto.
     line-height: 1 para reduzir leading. A pill recebe margin-top negativo
     para compensar o leading residual do glyph e ficar mesmo no topo. */
  line-height:1;
  display:flex;
  align-items:flex-start;
  gap:0.4em;
  flex-wrap:nowrap;
}
/* Pill dentro da obra — compensa leading visual da fonte Lato 22px black */
.folha-rosto-obra > .mini-pill-wrap{
  margin-top:-3px;
}
.folha-rosto-cliente{
  font-size:12px;
  font-weight:500;
  color:var(--ink-2);
  line-height:1;
  display:flex;
  align-items:center;
  gap:0.4em;
  flex-wrap:nowrap;
}
.folha-rosto-morada{
  font-size:11px;
  color:var(--ink-3);
  line-height:1.45;
  margin-bottom:8px;
}
.folha-rosto-morada > div{ overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.folha-rosto-morada-zip{ color:var(--ink-4); }

/* Zona Valor Total — destacada no fim da coluna esquerda.
   margin-bottom dá folga até à linha de actions. */
.folha-rosto-valor-zone{
  margin-top:auto;
  padding-top:6px;
  padding-bottom:8px;
}
/* Q1 — pill orçamento em cima do valor total (só CRM + por_enviar) */
.folha-rosto-valor-orc-pill{
  margin-bottom:6px;
  display:flex;
}
.folha-rosto-valor-label{
  font-size:9px;
  font-weight:700;
  color:var(--ink-3);
  letter-spacing:1.1px;
  text-transform:uppercase;
  margin-bottom:3px;
  line-height:1.4;
}
.folha-rosto-valor{
  font-family:var(--font);
  font-weight:900;
  font-size:24px;
  color:var(--ink);
  line-height:1;
  font-variant-numeric:tabular-nums;
  letter-spacing:-.5px;
  white-space:nowrap;
}
/* Desconto comercial (2026-05-17): sem → desconto → com.
   Só renderiza quando a obra tem desconto. */
.folha-rosto-desconto{
  margin-top:8px;
  padding-top:8px;
  border-top:1px dashed var(--line, rgba(0,0,0,.12));
  display:flex;
  flex-direction:column;
  gap:3px;
  font-variant-numeric:tabular-nums;
}
.fr-desc-row{
  display:flex;
  justify-content:space-between;
  gap:14px;
  font-size:11px;
  color:var(--ink-3);
  white-space:nowrap;
}
.fr-desc-row--desc{ color:#c0392b; }
.fr-desc-row--total{
  font-weight:800;
  color:var(--ink);
  font-size:12px;
  margin-top:2px;
}

/* Coluna direita — meta (Enviado / Validade) — encostado à DIREITA do card.
   A1.2 T3.3 (2026-05-11). Pagamento saiu daqui (agora em fr-pgto-cell). */
.folha-rosto-right{
  grid-area:meta;
  display:flex;
  flex-direction:column;
  gap:8px;
  min-width:140px;
  align-self:start;
  text-align:right;
}
.folha-rosto-meta-row{
  display:flex;
  flex-direction:column;
  align-items:flex-end;
  gap:1px;
}
.folha-rosto-meta-row-pgto{
  flex-direction:column;
  align-items:flex-end;
  gap:2px;
}
.folha-rosto-meta-label{
  font-family:var(--font);
  font-size:9px;
  color:var(--ink-3);
  letter-spacing:.7px;
  text-transform:uppercase;
  font-weight:700;
  white-space:nowrap;
  line-height:1.2;
}
.folha-rosto-meta-value{
  /* Uniforme com .folha-rosto-morada e .cond-editor (T3.6) */
  font-family:var(--font);
  font-size:11px;
  color:var(--ink-3);
  font-weight:400;
  white-space:nowrap;
  min-width:0;
  line-height:1.45;
}
/* Os InlineText/InlineDate/InlineDropdown dentro do meta herdam tudo via font:inherit */
.folha-rosto-meta-value .inline-text,
.folha-rosto-meta-value .inline-text-input{
  color:var(--ink-3);
  font-weight:400;
}
/* T5.3: área clicável da validade/data limite maior — quando placeholder, fica fácil de clicar */
.folha-rosto-meta-value .inline-text{
  display:inline-block;
  min-width:80px;
}
.folha-rosto-meta-pgto{
  display:flex;
  flex-direction:column;
  align-items:flex-start;
  gap:1px;
  width:100%;
}

/* ACTIONS — circulares + rectangulares
   margin-top maior para o separador não atropelar o valor (sintonizado com o
   espaçamento do .folha-rosto-header que tem padding-bottom 8 + margin-bottom 10) */
.folha-rosto-actions{
  display:flex;
  gap:8px;
  align-items:center;
  padding-top:10px;
  margin-top:18px;
  border-top:1px solid var(--line);
  flex-wrap:wrap;
  flex-shrink:0;
  position:relative;
  z-index:1;
}

/* Botão secundário (rectangular pequeno) — para +V2 e PDF.
   Cinza claro neutro, hover ligeiro. PDF tem alinhamento à direita. */
.fr-btn-secondary{
  padding:6px 14px;
  border-radius:6px;
  font-size:11px;
  font-weight:600;
  background:#F4F5F8;
  color:var(--ink-2);
  border:1px solid var(--line);
  cursor:pointer;
  font-family:inherit;
  transition:background .12s, border-color .12s;
}
.fr-btn-secondary:hover:not(:disabled){
  background:#E9EBF0;
  border-color:var(--line-strong);
}
.fr-btn-secondary:disabled{ opacity:.5; cursor:not-allowed; }
.fr-btn-pdf{ margin-left:auto; }

/* Botões legacy preservados para retrocompat (não usados pela FR actual) */
.fr-btn{
  padding:5px 12px;
  border-radius:5px;
  font-size:12px;
  font-weight:600;
  cursor:pointer;
  border:1px solid transparent;
  transition:all .12s;
}
.fr-btn:disabled{ opacity:.5; cursor:not-allowed; }
.fr-btn-primary{ background:var(--red); color:#fff; border-color:var(--red); }
.fr-btn-primary:hover:not(:disabled){ background:var(--red-dark); }
.fr-btn-success{ background:#2BAE66; color:#fff; border-color:#2BAE66; }
.fr-btn-success:hover:not(:disabled){ background:#1F8A50; }
.fr-btn-danger{ background:#fff; color:var(--red); border-color:#FFB5B5; }
.fr-btn-danger:hover:not(:disabled){ background:#FFE7E7; }
.fr-btn-neutral{ background:#fff; color:var(--ink-2); border-color:var(--line-strong); }
.fr-btn-neutral:hover:not(:disabled){ background:#F5F6F8; }

/* ── Proposta Detalhada — lista de atividades ───────── */
.det-list{
  display:flex;
  flex-direction:column;
}

/* CAP-BLOCK (Onda 8.8): sem position:relative para o sticky cap-header ancorar
   no scroll context certo (.det-card-last com overflow-y:auto).
   Sem overflow:hidden mas o header tem border-radius próprio nos topos.
   Onda 8.9: scroll-margin-top 8px para o scrollIntoView posicionar o cap-block
   imediatamente abaixo do topo do scroll, deixando o cap-header completo visível. */
.det-cap-block{
  margin:8px 12px;
  background:var(--panel);
  border:1px solid var(--line);
  border-radius:8px;
  box-shadow:0 1px 3px rgba(20,25,40,.03);
  scroll-margin-top:8px;
}
.det-cap-block:first-child{ margin-top:8px; }
.det-cap-body{
  /* container das atividades dentro do cap-block. T2.5 (2026-05-12):
     padding-top dá ar para o gap-card abaixo do header animar sem encostar. */
  padding-top:6px;
}

/* Cabeçalho de capítulo — sticky no topo do scroll do det-card-last (Onda 8.8).
   Border-radius próprio nos topos (cap-block já não tem overflow:hidden). */
.det-cap-header{
  display:grid;
  grid-template-columns:auto 1fr auto;
  align-items:center;
  gap:14px;
  padding:13px 18px;
  background:var(--red-ch);
  border:none;
  border-bottom:1px solid var(--red-line);
  border-radius:8px 8px 0 0;
  margin:0;
  /* T2.5 v3.6 (2026-05-14): sticky abaixo do .atv-card-header (toolbar) que
     cola em top:0. Como o cap-block aparece sempre depois do toolbar +
     det-cap-gap--first (~45px), o offset natural > 33 e o sticky não puxa
     antes do scroll. Trocará automaticamente conforme o scroll passa de
     um cap para o seguinte. */
  position:-webkit-sticky;
  position:sticky;
  top:33px;
  /* z-index 20 (T2.5 v3.7): tem de vencer .code-pill-trevo-wrap (z:10) das
     pills das ATVs abaixo, senão a pill aparece a flutuar por cima do header
     sticky. Continua abaixo do .atv-card-header (z:50). */
  z-index:20;
}
.det-cap-header:first-child{ margin-top:0; }

/* Número grande Lato 900 (ex: 01, 02, 03) — editável inline (A1.3 T2.2) */
.det-cap-bignum{
  font-family:var(--font);
  font-weight:900;
  font-size:34px;
  color:var(--red);
  line-height:.85;
  letter-spacing:-1.5px;
  font-variant-numeric:tabular-nums;
  flex-shrink:0;
  min-width:46px;
  text-align:center;
}
/* T2.3 (2026-05-12): input minimalista — tamanho do índice (2 dígitos).
   Anula o min-width 120px do base. ch = largura de um caractere "0". */
.det-cap-bignum .inline-text-input{
  min-width:0;
  width:2.2ch;
  max-width:3.5ch;
  text-align:center;
  padding:0 1px;
  margin:0;
  font-variant-numeric:tabular-nums;
}

/* Coluna texto: eyebrow em cima, título uppercase embaixo */
.det-cap-textcol{
  display:flex;
  flex-direction:column;
  gap:2px;
  min-width:0;
}
.det-cap-eyebrow{
  font-size:10px;
  font-weight:700;
  color:var(--red);
  letter-spacing:1.3px;
  text-transform:uppercase;
}
.det-cap-titulo{
  font-size:14px;
  font-weight:700;
  color:var(--ink);
  letter-spacing:.2px;
  text-transform:uppercase;
  line-height:1.2;
}

/* Coluna subtotal: label uppercase em cima + linha (chart + valor) à direita.
   T2.5 v3.7 (2026-05-14): o chart de status vive numa flex-row junto do valor
   para se mover conforme o tamanho do número (limite direito = label, limite
   esquerdo = livre). */
.det-cap-subtotal{
  display:flex;
  flex-direction:column;
  align-items:flex-end;
  text-align:right;
  white-space:nowrap;
}
.det-cap-subtotal-label{
  font-size:9px;
  font-weight:700;
  color:var(--red);
  letter-spacing:1px;
  text-transform:uppercase;
  margin-bottom:2px;
}
.det-cap-subtotal-value{
  font-family:var(--font);
  font-weight:900;
  font-size:16px;
  color:var(--ink);
  font-variant-numeric:tabular-nums;
  letter-spacing:-.2px;
}
.det-cap-subtotal-adefinir{
  font-size:11px;
  font-weight:700;
  letter-spacing:.5px;
  text-transform:uppercase;
  color:var(--red);
}

/* .det-cap-num — legacy, mantido para retrocompat (não usado pelo PropostaPanel actual). */
.det-cap-num{
  font-size:10px;
  font-weight:700;
  color:var(--red);
  text-transform:uppercase;
  letter-spacing:.5px;
  flex-shrink:0;
}

/* Cabeçalho de subcapítulo — grid alinhada com atividades (Onda 8.9).
   `det-sub-inner` (wrapper) fica na 1ª coluna (1fr — onde a descrição das atividades vive).
   Pill e texto não esticam nem cruzam para colunas UN/QTD/€un/TOTAL. */
.det-sub-header{
  display:grid;
  grid-template-columns:1fr 36px 60px 86px 94px;
  gap:14px;
  align-items:start;
  padding:12px 20px 8px;
  background:#FAFBFC;
  font-size:13px;
  font-weight:700;
  color:var(--ink);
  border:none;
  border-radius:0;
  margin:0;
  border-top:1px solid var(--line);
  text-transform:uppercase;
  letter-spacing:.8px;
}
.det-sub-inner{
  display:flex;
  align-items:flex-start;
  gap:12px;
  min-width:0;
  line-height:1.35;
}
.det-sub-inner > .code-pill{
  margin-top:1px;        /* topo da pill alinhado com topo do texto */
  flex-shrink:0;
}
.det-sub-inner > span{
  white-space:normal;
  word-break:break-word;
  line-height:1.35;
}
.det-cap-body > .det-sub-header:first-child{ border-top:none; }

/* Empty state — proposta sem capítulos mostra botão grande "+ Capítulo" (A1.3 T2.1) */
.det-add-capitulo-empty{
  display:block;
  width:calc(100% - 40px);
  margin:24px 20px;
  padding:18px 16px;
  background:var(--red-soft);
  border:1px dashed var(--red-line);
  color:var(--red);
  font-family:var(--font);
  font-size:13px;
  font-weight:700;
  letter-spacing:0.6px;
  text-transform:uppercase;
  border-radius:6px;
  cursor:pointer;
  transition:background 0.15s;
}
.det-add-capitulo-empty:hover{ background:#FEE2E2; }

/* Gaps entre capítulos — toda a zona é clicável; hover mostra prévia do header
   (A1.3 T2.2 — 2026-05-11). Sem margin lateral para a zona ocupar largura toda. */
.det-cap-gap{
  height:12px;
  cursor:pointer;
  transition:height 0.22s ease;
  overflow:hidden;
  display:flex;
  align-items:stretch;
  justify-content:stretch;
}
.det-cap-gap--first{ margin-top:0; }
.det-cap-gap--last{ margin-bottom:0; }
.det-cap-gap:hover{
  height:78px;
}
.det-cap-gap-ghost{
  display:grid;
  grid-template-columns:auto 1fr auto;
  gap:14px;
  align-items:center;
  background:var(--red-soft);
  border:1px dashed var(--red-line);
  padding:14px 20px;
  margin:6px 20px;
  border-radius:8px;
  width:calc(100% - 40px);
  opacity:0;
  transform:translateY(-6px);
  transition:opacity 0.18s ease 0.05s, transform 0.18s ease 0.05s, background 0.15s;
  pointer-events:none;
}
.det-cap-gap:hover .det-cap-gap-ghost{
  opacity:1;
  transform:translateY(0);
  pointer-events:auto;
}
.det-cap-gap-ghost:hover{ background:#FEE2E2; }
.det-cap-bignum--ghost{
  color:var(--red);
  font-weight:900;
  font-size:32px;
  line-height:1;
}
.det-cap-titulo--ghost{
  color:var(--red);
  font-style:italic;
  opacity:0.85;
}

/* Zona de eliminação do capítulo — hover do header faz o subtotal deslizar
   para a esquerda e aparece um ícone de lixo grande à direita (A1.3 T2.2).
   Só aparece quando a proposta está editável (em /orcamentos). No CRM o
   header é estático (sem animação).
   T2.5 v3.7 (2026-05-14): REMOVIDO position:relative — estava a anular o
   position:sticky declarado mais acima (mesma especificidade, regra abaixo
   ganhava). Como sticky também cria containing block para children abs,
   .det-cap-trash continua a posicionar-se contra o header. */
.det-cap-header{ overflow:hidden; }
.det-cap-subtotal{
  transition:transform 0.22s ease, opacity 0.22s ease;
}
.crm-detail-wrapper--editable .det-cap-header:hover .det-cap-subtotal{
  transform:translateX(-72px);
  opacity:0.4;
}
.det-cap-trash{
  position:absolute;
  top:0;
  right:0;
  bottom:0;
  width:64px;
  display:flex;
  align-items:center;
  justify-content:center;
  background:transparent;
  border:none;
  color:#5e1212;       /* bordô escuro — destaca-se sobre o rosa */
  cursor:pointer;
  padding:0;
  opacity:0;
  transform:translateX(20px);
  transition:opacity 0.18s ease 0.05s, transform 0.22s ease, background 0.15s;
}
.crm-detail-wrapper--editable .det-cap-header:hover .det-cap-trash{
  opacity:1;
  transform:translateX(0);
}
.det-cap-trash:hover{
  background:rgba(94,18,18,0.10);
}
/* No CRM (não editável) o botão lixo nunca aparece e o cursor do header
   não convida ao hover. */
.crm-detail-wrapper:not(.crm-detail-wrapper--editable) .det-cap-trash{
  display:none;
}

/* ──────────────────────────────────────────────────────────────────────────
   GAP-CARD DE ITEMS (T2.5 — 2026-05-12)
   Card único entre items de um capítulo, com 3 zonas clicáveis:
   ┌───────────────────┬──────────────┐
   │                   │  + Subcap    │
   │   + Atividade     ├──────────────┤
   │                   │  + Linha aux │
   └───────────────────┴──────────────┘
   Quando dentro de subcap/linha aux, só mostra 2 zonas (sem +Subcap),
   layout 50/50 — usa modificador .det-item-gap-card--two.
   Hover na zona pequena (10px) abre o card (64px). Container vazio: aberto sempre.
   ────────────────────────────────────────────────────────────────────────── */
.det-item-gap{
  height:10px;
  cursor:pointer;
  transition:height 0.22s ease;
  overflow:hidden;
  display:flex;
  align-items:stretch;
  justify-content:stretch;
}
.det-item-gap:hover,
.det-item-gap--always-open{
  height:64px;
}
.det-item-gap--always-open{ cursor:default; }
.det-item-gap-card{
  display:grid;
  grid-template-columns:1fr 220px;
  grid-template-rows:1fr 1fr;
  gap:0;
  background:var(--red-soft);
  border:1px dashed var(--red-line);
  margin:4px 20px;
  border-radius:8px;
  width:calc(100% - 40px);
  opacity:0;
  transform:translateY(-4px);
  transition:opacity 0.18s ease 0.05s, transform 0.18s ease 0.05s;
  pointer-events:none;
  overflow:hidden;
}
.det-item-gap:hover .det-item-gap-card,
.det-item-gap--always-open .det-item-gap-card{
  opacity:1;
  transform:translateY(0);
  pointer-events:auto;
}
.det-item-gap-zone{
  display:flex;
  align-items:center;
  justify-content:center;
  font-size:12px;
  font-weight:700;
  color:var(--red);
  text-transform:uppercase;
  letter-spacing:.5px;
  padding:8px 12px;
  cursor:pointer;
  transition:background 0.12s;
  background:transparent;
  border:none;
  font-family:var(--font);
}
.det-item-gap-zone:hover{ background:#FEE2E2; }
.det-item-gap-zone--atv{
  grid-column:1;
  grid-row:1 / span 2;
  border-right:1px dashed var(--red-line);
}
.det-item-gap-zone--sub{
  grid-column:2;
  grid-row:1;
  border-bottom:1px dashed var(--red-line);
}
.det-item-gap-zone--aux{
  grid-column:2;
  grid-row:2;
}
/* Variante 2-zonas (dentro de subcap/linha aux): 50/50 atv vs aux, sem coluna direita partida */
.det-item-gap-card--two{
  grid-template-columns:1fr 1fr;
  grid-template-rows:1fr;
}
.det-item-gap-card--two .det-item-gap-zone--atv{
  grid-column:1;
  grid-row:1;
  border-right:1px dashed var(--red-line);
}
.det-item-gap-card--two .det-item-gap-zone--aux{
  grid-column:2;
  grid-row:1;
  border:none;
}

/* Linha Auxiliar — visual mais leve que subcapítulo (A1.3 T1 — 2026-05-11).
   Mesma grid das atividades para alinhamento, mas sem uppercase + peso mais discreto.
   Serve para agrupar atividades sob um título (ex: "Fornecimento e montagem de:"). */
.det-linha-aux-header{
  display:grid;
  grid-template-columns:1fr 36px 60px 86px 94px;
  gap:14px;
  align-items:start;
  padding:8px 20px 4px;
  background:transparent;
  font-size:12px;
  font-weight:600;
  color:var(--ink-2);
  border:none;
  margin:0;
  font-style:italic;
}
.det-linha-aux-inner{
  display:flex;
  align-items:flex-start;
  gap:10px;
  min-width:0;
  line-height:1.35;
}
.det-linha-aux-inner > .code-pill{
  margin-top:1px;
  flex-shrink:0;
}
.det-linha-aux-inner > span{
  white-space:normal;
  word-break:break-word;
  line-height:1.35;
}
.det-codigo{
  font-size:10px;
  font-weight:700;
  color:var(--ink-4);
  min-width:30px;
  flex-shrink:0;
  letter-spacing:.3px;
}

/* Cabeçalho fixo das colunas — Onda 8.9: alinhado com cor cinza das colunas (UN/QTD/€un). */
/* Selector .atv-card.atv-card-header (especificidade 020) para vencer
   a regra `.atv-card { position: relative }` declarada mais abaixo no
   ficheiro (linha ~6717), que estava a sobrescrever o sticky.
   z-index alto (50) para passar à frente dos pills de código (que têm
   position:relative + bolinhas com z:10) quando o conteúdo scrolla. */
.atv-card.atv-card-header{
  display:grid;
  grid-template-columns:1fr 36px 60px 86px 94px;
  align-items:center;
  gap:4px;
  padding:8px 20px;
  background:#F5F6F8;
  border-bottom:2px solid var(--line);
  font-size:10px;
  font-weight:700;
  color:var(--ink-4);
  text-transform:uppercase;
  letter-spacing:.6px;
  position:-webkit-sticky;
  position:sticky;
  top:0;
  z-index:50;
  flex-shrink:0;
  align-self:stretch;
  box-shadow:0 1px 4px rgba(0,0,0,0.04);
}
.atv-header-title{
  color:var(--ink-3);
  text-transform:none;
  letter-spacing:0;
  font-weight:600;
  font-size:11px;
}

/* Atividade — row dentro do det-cap-body (mockup 2026-05-10, Onda 5.6).
   Sem border individual; separadores via border-top entre rows; padding generoso;
   font 14px line-height 1.55 para respiração. Texto descrição limita-se a 70% (Onda 4.7). */
.atv-card{
  display:grid;
  grid-template-columns:1fr 36px 60px 86px 94px;
  align-items:flex-start;
  padding:14px 20px;
  background:#fff;
  border:none;
  border-radius:0;
  margin:0;
  font-size:14px;
  color:var(--ink);
  gap:14px;
  transition:background .12s;
  border-top:1px solid var(--line);
  line-height:1.55;
  font-weight:500;
}
/* Primeira atividade dentro do cap-block — sem border-top (já tem o cap-header em cima) */
.det-cap-body > .atv-card:first-child,
.det-cap-body > .det-sub-header + .atv-card{
  border-top:none;
}
.atv-card:hover{ background:#FAFBFC; }

/* Descrição: pill código + texto. Texto limita-se a ~70% da célula para reservar
   espaço a notas futuras (orçamentação — vermelho italico bordô) que vão
   aparecer ao lado da descrição.
   Onda 8.9: pill alinhada ao TOPO do texto (não ao centro). */
.atv-desc{
  display:flex;
  align-items:flex-start;
  gap:12px;
  min-width:0;
  line-height:1.55;
}
/* T2.5 F0.5 / Fase B v3 (2026-05-13) — RODELA com FURO no meio.
   8 botões equidistantes (45° entre cada) ao longo de um anel branco com
   furo central. O furo deixa ver o pill da atividade através e mantém-no
   clicável. Botões minimalistas (38px) com cores alinhadas com ActionButton
   da folha de rosto. */
.pill-trevo-host{
  position:relative;
  display:inline-flex;
  align-items:center;
  gap:8px;
  flex-shrink:0;
  /* T2.5 Fase B v8: cria stacking context próprio + z-index alto para o pill
     ficar SEMPRE em cima de qualquer elemento que possa estar a sobrepor
     (cards de outras colunas com overflow estourado, etc.). */
  z-index:10;
  isolation:isolate;
}
/* Wrapper button do CodePill — sem estilo próprio, só capture do click.
   T2.5 Fase B v8 (2026-05-13): position:relative + z-index alto garante que
   o pill fica POR CIMA de elementos invisíveis que possam estar a sobrepor
   (overflow de outras colunas, tooltips órfãos, etc.). */
.pill-trevo-pill-btn{
  background:none;
  border:none;
  padding:0;
  margin:0;
  font:inherit;
  cursor:pointer;
  display:inline-flex;
  align-items:center;
  position:relative;
  z-index:9999;
  pointer-events:auto;
}
.pill-trevo-pill-btn:focus{
  outline:none;
}
.pill-trevo{
  /* Container redondo invisível, 180px à volta do pill central. */
  position:absolute;
  top:50%; left:50%;
  transform:translate(-50%,-50%);
  width:180px;
  height:180px;
  pointer-events:none;
  z-index:30;
}
/* T2.5 Fase C v3 (2026-05-13): quando aberto, captura hover (mouseenter/leave)
   no container inteiro para detectar transições suaves entre botões da rodela.
   Como pointer-events:auto cobre o pill central, o click no pill passa a ser
   tratado pelo onClick do próprio popover (que ignora zones). */
.pill-trevo--open{
  pointer-events:auto;
}

/* ── anel SVG donut — DECORATIVO apenas (pointer-events:none).
   O browser não respeita fiavelmente `visiblePainted` no <svg> wrapper —
   captava cliques no furo central. Tornar todo o SVG transparente a eventos
   resolve o click no pill por baixo. Hover-keep-open agora é gerido pelos
   8 botões individuais (já têm onMouseEnter/Leave). */
.pill-trevo-ring{
  position:absolute;
  top:50%; left:50%;
  width:160px;
  height:160px;
  margin-left:-80px;
  margin-top:-80px;
  pointer-events:none;
  filter:drop-shadow(0 8px 22px rgba(0,0,0,0.10)) drop-shadow(0 2px 6px rgba(0,0,0,0.06));
  opacity:0;
  transform:scale(0.6);
  transition:opacity 0.22s ease, transform 0.34s cubic-bezier(.34,1.56,.64,1);
  overflow:visible;
}
.pill-trevo--open .pill-trevo-ring{
  opacity:1;
  transform:scale(1);
}

/* ── zona base — botão circular flutuante posicionado em coords polares ── */
.pill-trevo-zone{
  position:absolute;
  top:50%; left:50%;
  width:38px;
  height:38px;
  margin-left:-19px;
  margin-top:-19px;
  pointer-events:auto;
  /* Posição polar via custom props */
  --angle:0deg;
  --radius:60px;
  /* Estado fechado: invisível, encolhido no centro */
  opacity:0;
  transform:rotate(var(--angle)) translateY(0) rotate(calc(-1 * var(--angle))) scale(0.3);
  transition:
    opacity 0.20s ease,
    transform 0.38s cubic-bezier(.34, 1.56, .64, 1),
    filter 0.14s;
  /* Aparência: fundo SUAVE + borda + cor (paleta ActionButton) */
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  background:var(--zone-bg, #fff);
  border:1.5px solid var(--zone-border, var(--zone-color, var(--red)));
  border-radius:50%;
  cursor:pointer;
  font-family:var(--font);
  font-size:7px;
  font-weight:800;
  color:var(--zone-color, var(--red));
  text-transform:uppercase;
  letter-spacing:.3px;
  line-height:1;
  user-select:none;
}
/* Estado aberto: voa para o seu lugar polar */
.pill-trevo--open .pill-trevo-zone{
  opacity:1;
  transform:rotate(var(--angle)) translateY(calc(-1 * var(--radius))) rotate(calc(-1 * var(--angle))) scale(1);
}
.pill-trevo-zone:hover{
  filter:brightness(.94);
}
.pill-trevo-zone-emoji{
  font-size:15px;
  line-height:1;
  margin-bottom:1px;
}

/* ── cores por tipo (paleta ActionButton — folha de rosto) ── */
.pill-trevo-zone--sub  { --zone-bg:#FFF8EE; --zone-color:#A77400; --zone-border:#A77400; }  /* âmbar (pasta) */
.pill-trevo-zone--aux  { --zone-bg:#FEF9C3; --zone-color:#854D0E; --zone-border:#A16207; }  /* amarelo (notas) */
.pill-trevo-zone--atv  { --zone-bg:#F0FAF4; --zone-color:#1F7A3D; --zone-border:#1F7A3D; }  /* verde (€) */
.pill-trevo-zone--nota { --zone-bg:#F4F5F8; --zone-color:#7A8190; --zone-border:#AAB1BD; }  /* cinza */
.pill-trevo-zone--del  { --zone-bg:#FFF5F5; --zone-color:#D62E2E; --zone-border:#D62E2E; }  /* vermelho */

/* ── ângulos polares — 8 botões EQUIDISTANTES (45° entre cada).
   Sentido horário a partir do topo:
     -45°  0°  +45°  +90°  +135°  +180°  +225°  +270°
     sub-up aux-up atv-up NOTA atv-dn aux-dn sub-dn ELIMINAR                 */
.pill-trevo-zone--sub-up { --angle:-45deg; }
.pill-trevo-zone--aux-up { --angle:0deg; }
.pill-trevo-zone--atv-up { --angle:45deg; }
.pill-trevo-zone--nota   { --angle:90deg; }
.pill-trevo-zone--atv-dn { --angle:135deg; }
.pill-trevo-zone--aux-dn { --angle:180deg; }
.pill-trevo-zone--sub-dn { --angle:225deg; }
.pill-trevo-zone--del    { --angle:270deg; }

/* Transformar — quando há só 1 botão (SUB ou AUX como fonte), centrar em cima. */
.pill-trevo-zone--trans-mid { --angle:0deg; --radius:54px; }

/* Rodela mãe/filha (Shift). T2.5 Fase D v2 (2026-05-13).
   Layout:
                  [mae-left]   [mae-right]                  (TOPO ↑ envolve)
                          .  PILL  .
                 [filha-left][filha-mid][filha-right]       (BAIXO ↓ dentro)
   Mães em cima = "envolve-me, eu fico filha de algo novo".
   Filhas em baixo = "entra dentro de mim".
   Click no pill = rodela transformar (não está nesta rodela).                  */
.pill-trevo-zone--rb-mae-left    { --angle:-35deg; --radius:54px; }
.pill-trevo-zone--rb-mae-right   { --angle:35deg;  --radius:54px; }
.pill-trevo-zone--rb-filha-left  { --angle:225deg; --radius:54px; }
.pill-trevo-zone--rb-filha-mid   { --angle:180deg; --radius:54px; }
.pill-trevo-zone--rb-filha-right { --angle:135deg; --radius:54px; }

/* Stagger rodela mãe-filha — sequencial topo → fundo */
.pill-trevo--rodela-mae-filha .pill-trevo-zone--rb-mae-left    { transition-delay:0ms;  }
.pill-trevo--rodela-mae-filha .pill-trevo-zone--rb-mae-right   { transition-delay:30ms; }
.pill-trevo--rodela-mae-filha .pill-trevo-zone--rb-filha-right { transition-delay:60ms; }
.pill-trevo--rodela-mae-filha .pill-trevo-zone--rb-filha-mid   { transition-delay:90ms; }
.pill-trevo--rodela-mae-filha .pill-trevo-zone--rb-filha-left  { transition-delay:120ms;}

/* Stagger sutil — ordem horária a partir do topo */
.pill-trevo--open .pill-trevo-zone--aux-up { transition-delay:0ms; }
.pill-trevo--open .pill-trevo-zone--atv-up { transition-delay:30ms; }
.pill-trevo--open .pill-trevo-zone--nota   { transition-delay:60ms; }
.pill-trevo--open .pill-trevo-zone--atv-dn { transition-delay:90ms; }
.pill-trevo--open .pill-trevo-zone--aux-dn { transition-delay:120ms; }
.pill-trevo--open .pill-trevo-zone--sub-dn { transition-delay:150ms; }
.pill-trevo--open .pill-trevo-zone--del    { transition-delay:180ms; }
.pill-trevo--open .pill-trevo-zone--sub-up { transition-delay:210ms; }
/* T2.5 F1 fix-A: variante portal — position fixed no viewport, escapa ao
   overflow do det-card. Centro do popover alinhado ao centro do pill
   (top/left vêm em pixels do JS via getBoundingClientRect). */
.pill-trevo--portal{
  position:fixed;
  z-index:9999;
}
/* T2.5 F1 fix-A2 (2026-05-13): no portal o popover deixa de ser filho do
   .pill-trevo-host, entao o seletor :hover do CSS deixa de funcionar.
   A classe --open (gerida pelo React via state) forca a visibilidade. */
/* T2.5 F0.5 Fase B: a classe --open só dispara a animação das zonas (já tratada
   pelo selector `.pill-trevo--open .pill-trevo-zone` mais acima). O container
   .pill-trevo mantém pointer-events:none para o pill central ficar clicável. */

.atv-desc > .code-pill{
  margin-top:1px;        /* pequeno alinhamento topo-com-topo do texto */
  flex-shrink:0;
}
/* Texto descrição — 95% por defeito (mais respiração); limita a 70% só quando há nota.
   Cor INK-2 (cinza-escuro) para diferenciar de subcap uppercase preto (Onda 4.9). */
.atv-desc-text{
  max-width:95%;
  white-space:pre-wrap;
  word-break:break-word;
  line-height:1.55;
  color:var(--ink-2);
  font-weight:500;
  font-size:13.5px;
}
/* João 2026-05-19: input do nome da atividade (autocomplete BD) — tem de
   parecer exactamente o texto normal da descrição. */
/* Quando a descrição está em modo edição (autocomplete), o wrapper precisa
   de largura — o span passa a comportar-se como bloco flexível. */
.atv-desc-text:has(.mat-nome-wrapper){
  display:block;
  flex:1 1 auto;
  min-width:0;
}
.atv-nome-input{
  width:100%;
  border:0;
  background:transparent;
  padding:0;
  margin:0;
  resize:none;
  overflow:hidden;
  font:inherit;
  line-height:1.55;
  color:var(--ink-2);
  font-weight:500;
  font-size:13.5px;
  white-space:pre-wrap;
  word-break:break-word;
}
.atv-nome-input:focus{
  outline:1px solid var(--accent, #4c8bf5);
  outline-offset:2px;
  border-radius:3px;
}
/* João 2026-05-19: ÁREA RESERVADA da AI (overlay sobre o card; volta sem
   perder o orçamento). Estética limpa, alinhada com o resto da app. */
.ai-overlay{
  position:fixed;
  inset:0;
  z-index:9000;
  background:rgba(20,25,40,.55);
  display:flex;
  justify-content:center;
  align-items:flex-start;
  overflow-y:auto;
  padding:32px 16px;
}
.ai-panel{
  width:100%;
  max-width:680px;
  background:var(--surface, #fff);
  border-radius:14px;
  box-shadow:0 20px 60px rgba(10,15,30,.4);
  padding:20px 22px 22px;
}
.ai-panel-head{
  display:flex;
  align-items:center;
  gap:14px;
  margin-bottom:4px;
}
.ai-back{
  border:1px solid var(--border, #d6dbe2);
  background:var(--surface-2, #f2f4f7);
  border-radius:7px;
  padding:6px 12px;
  font-size:13px;
  font-weight:600;
  cursor:pointer;
}
.ai-back:hover{ border-color:var(--accent, #4c8bf5); }
.ai-title{
  font-size:18px;
  font-weight:800;
  display:flex;
  align-items:center;
  gap:10px;
}
.ai-badge{
  font-size:10px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.4px;
  color:#A77400;
  background:#fff3d6;
  border:1px solid #f0d79a;
  border-radius:999px;
  padding:2px 8px;
}
.ai-sub{ color:var(--ink-3, #8a93a2); font-size:12.5px; margin:2px 0 16px; }
.ai-block{ margin-bottom:16px; }
.ai-block-title{
  font-size:12px;
  font-weight:700;
  color:var(--ink-2, #555);
  text-transform:uppercase;
  letter-spacing:.3px;
  margin-bottom:7px;
}
.ai-drop{
  border:2px dashed var(--border, #c9d0da);
  border-radius:10px;
  padding:22px;
  text-align:center;
  color:var(--ink-3, #8a93a2);
  cursor:pointer;
  transition:border-color .12s, background .12s;
}
.ai-drop:hover{ border-color:var(--accent, #4c8bf5); background:#f7faff; }
.ai-drop-ic{ font-size:22px; margin-bottom:4px; }
.ai-files{ margin:8px 0 0; padding-left:18px; font-size:12.5px; color:var(--ink-2,#555); }
.ai-textarea{
  width:100%;
  border:1px solid var(--border, #d6dbe2);
  border-radius:8px;
  padding:9px 11px;
  font:inherit;
  font-size:13px;
  resize:vertical;
}
.ai-textarea:focus{ outline:1px solid var(--accent, #4c8bf5); }
.ai-choice{ display:flex; gap:10px; flex-wrap:wrap; }
.ai-choice label{
  display:flex;
  align-items:center;
  gap:6px;
  border:1px solid var(--border, #d6dbe2);
  border-radius:8px;
  padding:8px 12px;
  font-size:13px;
  cursor:pointer;
}
.ai-choice label.is-active{
  border-color:var(--accent, #4c8bf5);
  background:#eef4ff;
  font-weight:600;
}
.ai-actions{ display:flex; gap:8px; flex-wrap:wrap; margin:18px 0 12px; }
.ai-btn{
  border:1px solid var(--border, #d6dbe2);
  background:var(--surface-2, #f2f4f7);
  border-radius:8px;
  padding:9px 16px;
  font-size:13px;
  font-weight:600;
  cursor:pointer;
}
.ai-btn--primary{
  background:var(--accent, #4c8bf5);
  border-color:var(--accent, #4c8bf5);
  color:#fff;
}
.ai-btn:disabled{ opacity:.5; cursor:not-allowed; }
.ai-note{
  font-size:11.5px;
  color:#A77400;
  background:#fff8e8;
  border:1px solid #f0d79a;
  border-radius:8px;
  padding:9px 11px;
  line-height:1.45;
}
.ai-note code{ font-size:11px; background:#fff; padding:1px 4px; border-radius:3px; }
/* João 2026-05-19: AI ligada — erro + resultado (MDQ proposto) */
.ai-erro{
  font-size:12px; color:#b91c1c; background:#fef2f2;
  border:1px solid #fecaca; border-radius:8px; padding:9px 11px;
  margin:10px 0; line-height:1.45; white-space:pre-wrap;
}
.ai-resultado{
  margin-top:12px; border-top:1px dashed #e2d6f7; padding-top:14px;
}
.ai-perguntas{
  background:#fff8e8; border:1px solid #f0d79a; border-radius:8px;
  padding:8px 12px; font-size:12.5px; color:#7a5600; margin:8px 0 12px;
}
.ai-perguntas ul{ margin:5px 0 0; padding-left:18px; }
.ai-perguntas li{ margin:2px 0; }
.ai-cap{ margin-bottom:10px; }
.ai-cap-t{
  font-weight:800; font-size:13px; color:#4b3b6b;
  background:#f3eefc; border-radius:6px; padding:5px 10px;
}
.ai-cap-list{ margin:5px 0 0; padding-left:20px; font-size:13px; }
.ai-cap-list li{ margin:3px 0; }
.ai-resultado-notas{
  font-size:12px; color:#4b5563; font-style:italic; margin:8px 0;
}
/* João 2026-05-19: painel AI redesenhado — passos numerados limpos */
.ai-panel-head{ flex-wrap:wrap; }
.ai-panel-head .ai-sub{ margin:0; flex-basis:100%; }
.ai-step{
  border:1px solid var(--border,#e3e7ee); border-radius:12px;
  margin:12px 0; overflow:hidden; background:var(--surface,#fff);
}
.ai-step-h{
  display:flex; align-items:center; gap:10px;
  padding:11px 14px; background:#f6f8fc; border-bottom:1px solid #eef1f6;
}
.ai-step-n{
  width:22px; height:22px; border-radius:50%;
  background:var(--accent,#4c8bf5); color:#fff; font-size:12px;
  font-weight:800; display:flex; align-items:center; justify-content:center;
  flex:0 0 auto;
}
.ai-step-t{ font-weight:700; font-size:13.5px; color:#1f2937; }
.ai-step-tag{
  margin-left:auto; font-size:10.5px; font-weight:700; color:#166534;
  background:#dcfce7; border-radius:999px; padding:2px 9px;
}
.ai-step-b{ padding:14px; display:flex; flex-direction:column; gap:10px; }
.ai-step--res{ border-color:#bbf7d0; }
.ai-step--res .ai-step-h{ background:#f0fdf4; border-bottom-color:#dcfce7; }
.ai-step--res .ai-step-n{ background:#16a34a; }
.ai-drop{ padding:16px; display:flex; align-items:center;
  justify-content:center; gap:10px; }
.ai-drop-ic{ font-size:18px; margin:0; }
.ai-files{ list-style:none; margin:0; padding:0; font-size:12.5px; }
.ai-files li{ display:flex; align-items:center; gap:6px; padding:3px 0; }
.ai-file-x{
  margin-left:auto; border:none; background:transparent; cursor:pointer;
  color:#9ca3af; font-size:12px; padding:2px 6px; border-radius:4px;
}
.ai-file-x:hover{ background:#fde2e2; color:#b91c1c; }
.ai-seg{ display:flex; gap:8px; }
.ai-seg button{
  flex:1; display:flex; flex-direction:column; gap:2px;
  border:1px solid var(--border,#d6dbe2); background:#fff;
  border-radius:9px; padding:9px 12px; cursor:pointer;
  font-size:13px; font-weight:600; color:#374151; text-align:left;
}
.ai-seg button small{ font-weight:500; font-size:11px; color:#9ca3af; }
.ai-seg button.is-on{
  border-color:var(--accent,#4c8bf5); background:#eef4ff; color:#1e40af;
}
.ai-seg button.is-on small{ color:#4c8bf5; }
.ai-step-b .ai-actions{ margin:0; }
.ai-btn--wide{ width:100%; }
.ai-btn.is-ok{ background:#dcfce7; border-color:#86efac; color:#166534; }
.ai-hint{ font-size:12px; color:#6b7280; line-height:1.5; }
.ai-prompt-out{ display:flex; flex-direction:column; gap:8px;
  margin-top:4px; }
.ai-prompt-ta{
  font-family:ui-monospace,Menlo,Consolas,monospace; font-size:11.5px;
  background:#fbfaff;
}
.ai-res-list{
  max-height:320px; overflow-y:auto; border:1px solid #eef1f6;
  border-radius:8px; padding:10px;
}
.ai-api-det{
  margin:12px 0 0; border:1px dashed #d6dbe2; border-radius:10px;
  background:#fafafa;
}
.ai-api-det>summary{
  cursor:pointer; font-size:12px; color:#6b7280; font-weight:600;
  padding:10px 14px; user-select:none; list-style:none;
}
.ai-api-det>summary::-webkit-details-marker{ display:none; }
.ai-api-det>summary::before{ content:'▸ '; }
.ai-api-det[open]>summary::before{ content:'▾ '; }

/* ═══════════════════════════════════════════════════════════════════════════
   João 2026-05-19 — Painel AI: "consola de briefing" editorial, on-brand
   bordô Construsud (Lato + IBM Plex Mono). Override autoritário (vem depois
   de todas as regras .ai-* anteriores → ganha na cascata).
   ═══════════════════════════════════════════════════════════════════════════ */
@keyframes aiPanelIn{
  from{ opacity:0; transform:translateY(14px) scale(.985); }
  to{ opacity:1; transform:none; }
}
@keyframes aiStepIn{
  from{ opacity:0; transform:translateY(10px); }
  to{ opacity:1; transform:none; }
}
.ai-overlay{
  background:rgba(20,16,18,.52);
  backdrop-filter:blur(3px);
  -webkit-backdrop-filter:blur(3px);
  padding:40px 18px;
}
.ai-panel{
  max-width:740px;
  background:
    radial-gradient(120% 60% at 100% 0%, #FCF6F4 0%, rgba(252,246,244,0) 60%),
    var(--panel,#fff);
  border:1px solid var(--line,#E6E8EE);
  border-radius:18px;
  padding:0;
  overflow:hidden;
  box-shadow:0 30px 80px -20px rgba(60,12,18,.34),
             0 2px 10px rgba(20,25,40,.08);
  animation:aiPanelIn .34s cubic-bezier(.2,.7,.2,1);
}
.ai-panel::before{
  content:''; display:block; height:3px;
  background:linear-gradient(90deg,var(--red,#7A1818),#B23A3A 55%,var(--amber,#E8A547));
}

/* ── Cabeçalho ───────────────────────────────────────────────────────────── */
.ai-panel-head{
  display:flex; align-items:flex-start; gap:14px;
  padding:22px 26px 18px;
  border-bottom:1px solid var(--line,#E6E8EE);
  background:linear-gradient(180deg,#FCF7F5,rgba(252,247,245,0));
  margin:0;
}
.ai-back{
  width:34px; height:34px; flex:0 0 auto; padding:0;
  border-radius:50%; font-size:16px; font-weight:700;
  color:var(--red,#7A1818); background:#fff;
  border:1px solid var(--red-line,#FBD9D9);
  display:flex; align-items:center; justify-content:center;
  transition:transform .12s, background .12s, box-shadow .12s;
}
.ai-back:hover{
  background:var(--red,#7A1818); color:#fff; border-color:var(--red,#7A1818);
  transform:translateX(-2px); box-shadow:0 4px 12px rgba(122,24,24,.28);
}
.ai-head-main{ min-width:0; }
.ai-eyebrow{
  font-size:10.5px; font-weight:800; letter-spacing:.18em;
  text-transform:uppercase; color:var(--red,#7A1818); opacity:.85;
  margin-bottom:3px;
}
.ai-title{
  margin:0; font-size:25px; font-weight:900; letter-spacing:-.018em;
  color:var(--ink,#1B1F27); line-height:1.05;
}
.ai-badge{ display:none; }
.ai-sub{
  display:flex; align-items:center; gap:9px; flex-wrap:wrap;
  margin:9px 0 0; font-size:12px; color:var(--ink-3,#7A8190);
}
.ai-sub-num{
  font-family:var(--mono,monospace); font-size:11px; font-weight:700;
  color:var(--red,#7A1818); background:var(--red-soft,#FFF5F5);
  border:1px solid var(--red-line,#FBD9D9);
  padding:2px 9px; border-radius:999px; letter-spacing:.02em;
}

/* ── Passos (timeline editorial) ─────────────────────────────────────────── */
.ai-step{
  position:relative; margin:0; border:0;
  border-bottom:1px solid var(--line,#EDEFF4);
  background:transparent; border-radius:0;
  padding:20px 26px 22px 26px;
  animation:aiStepIn .4s both cubic-bezier(.2,.7,.2,1);
}
.ai-step:nth-of-type(1){ animation-delay:.04s; }
.ai-step:nth-of-type(2){ animation-delay:.10s; }
.ai-step:nth-of-type(3){ animation-delay:.16s; }
.ai-step:nth-of-type(4){ animation-delay:.22s; }
.ai-step::before{
  content:''; position:absolute; left:0; top:0; bottom:-1px; width:3px;
  background:var(--red,#7A1818);
  transform:scaleY(0); transform-origin:top;
  transition:transform .25s ease;
}
.ai-step:focus-within::before,
.ai-step:hover::before{ transform:scaleY(1); }
.ai-step--res{ background:linear-gradient(180deg,#F4FBF6,rgba(244,251,246,0) 60%); }
.ai-step--res::before{ background:var(--green,#2BAE66); transform:scaleY(1); }

.ai-step-h{
  display:flex; align-items:center; gap:12px;
  padding:0; background:none; border:0; margin:0 0 14px;
}
.ai-step-n{
  width:30px; height:30px; flex:0 0 auto; border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  font-family:var(--mono,monospace); font-size:13px; font-weight:700;
  color:var(--red,#7A1818); background:#fff;
  border:1.5px solid var(--red,#7A1818);
}
.ai-step--res .ai-step-n{
  color:#fff; background:var(--green,#2BAE66); border-color:var(--green,#2BAE66);
}
.ai-step-t{
  font-size:11.5px; font-weight:800; letter-spacing:.13em;
  text-transform:uppercase; color:var(--ink,#1B1F27);
}
.ai-step-tag{
  margin-left:auto; font-size:10px; font-weight:800; letter-spacing:.08em;
  text-transform:uppercase; color:var(--green,#2BAE66);
  background:#E9F7EF; border:1px solid #BFE8D2;
  border-radius:999px; padding:3px 10px;
}
.ai-step-b{ padding:0 0 0 42px; display:flex; flex-direction:column; gap:12px; }

/* ── Dropzone + ficheiros ────────────────────────────────────────────────── */
.ai-drop{
  border:1.5px dashed var(--red-line,#FBD9D9);
  border-radius:12px; background:var(--red-soft,#FFF5F5);
  padding:18px; display:flex; align-items:center; justify-content:center;
  gap:10px; color:var(--ink-2,#454B57); font-size:13px; font-weight:600;
  transition:border-color .14s, background .14s, transform .14s;
}
.ai-drop:hover{
  border-color:var(--red,#7A1818); background:#FDEEEC;
  transform:translateY(-1px);
}
.ai-drop-ic{
  font-size:15px; width:30px; height:30px; border-radius:50%;
  display:flex; align-items:center; justify-content:center;
  background:#fff; color:var(--red,#7A1818);
  border:1px solid var(--red-line,#FBD9D9);
}
.ai-files{ list-style:none; margin:0; padding:0; display:flex;
  flex-direction:column; gap:2px; }
.ai-files li{
  display:flex; align-items:center; gap:8px; padding:7px 10px;
  font-size:12.5px; color:var(--ink-2,#454B57);
  background:#fff; border:1px solid var(--line,#E6E8EE); border-radius:7px;
  font-family:var(--mono,monospace);
}
.ai-file-x{
  margin-left:auto; border:none; background:transparent; cursor:pointer;
  color:var(--ink-4,#AAB1BD); font-size:12px; padding:2px 6px;
  border-radius:5px; transition:color .12s, background .12s;
}
.ai-file-x:hover{ background:var(--red-soft,#FFF5F5); color:var(--red,#7A1818); }

/* ── Inputs ──────────────────────────────────────────────────────────────── */
.ai-textarea{
  width:100%; border:1px solid var(--line-strong,#CFD3DC);
  border-radius:9px; padding:11px 13px; font:inherit; font-size:13px;
  color:var(--ink,#1B1F27); background:#fff; resize:vertical;
  transition:border-color .14s, box-shadow .14s;
}
.ai-textarea::placeholder{ color:var(--ink-4,#AAB1BD); }
.ai-textarea:focus{
  outline:none; border-color:var(--red,#7A1818);
  box-shadow:0 0 0 3px rgba(122,24,24,.12);
}

/* ── Segmented (a sério / só MDQ) ────────────────────────────────────────── */
.ai-seg{ display:flex; gap:10px; }
.ai-seg button{
  flex:1; display:flex; flex-direction:column; gap:3px; text-align:left;
  border:1px solid var(--line-strong,#CFD3DC); background:#fff;
  border-radius:10px; padding:11px 14px; cursor:pointer;
  font-size:13px; font-weight:700; color:var(--ink-2,#454B57);
  transition:all .15s;
}
.ai-seg button small{ font-weight:500; font-size:11px;
  color:var(--ink-4,#AAB1BD); }
.ai-seg button:hover{ border-color:var(--red-line,#FBD9D9); }
.ai-seg button.is-on{
  border-color:var(--red,#7A1818); color:#fff;
  background:linear-gradient(180deg,#8A1E1E,var(--red,#7A1818));
  box-shadow:0 6px 18px -6px rgba(122,24,24,.5);
}
.ai-seg button.is-on small{ color:rgba(255,255,255,.78); }

/* ── Botões ──────────────────────────────────────────────────────────────── */
.ai-actions{ display:flex; gap:10px; flex-wrap:wrap; margin:0; }
.ai-step-b .ai-actions{ margin:0; }
.ai-btn{
  border:1px solid var(--line-strong,#CFD3DC); background:#fff;
  color:var(--ink,#1B1F27); border-radius:9px; padding:10px 18px;
  font-size:13px; font-weight:700; cursor:pointer;
  transition:transform .12s, box-shadow .12s, background .12s,
    border-color .12s;
}
.ai-btn:hover:not(:disabled){
  border-color:var(--red-line,#FBD9D9); transform:translateY(-1px);
  box-shadow:0 4px 12px rgba(20,25,40,.08);
}
.ai-btn--primary{
  border-color:var(--red,#7A1818); color:#fff;
  background:linear-gradient(180deg,#8A1E1E,var(--red,#7A1818));
  box-shadow:0 6px 18px -7px rgba(122,24,24,.55);
}
.ai-btn--primary:hover:not(:disabled){
  box-shadow:0 9px 22px -7px rgba(122,24,24,.6);
  transform:translateY(-1px);
}
.ai-btn--primary:active:not(:disabled){ transform:translateY(0); }
.ai-btn--wide{ width:100%; text-align:center; justify-content:center; }
.ai-btn.is-ok{
  background:#E9F7EF; border-color:#9FDDBC; color:#16703F;
  box-shadow:none;
}
.ai-btn:disabled{ opacity:.45; cursor:not-allowed; }
.ai-hint{
  font-size:12px; color:var(--ink-3,#7A8190); line-height:1.55;
}

/* ── Recibo do prompt (terminal) ─────────────────────────────────────────── */
.ai-prompt-out{ display:flex; flex-direction:column; gap:9px; }
.ai-prompt-ta{
  font-family:var(--mono,monospace); font-size:11.5px; line-height:1.55;
  color:#3A2A2C; background:#FBF6F4;
  border:1px solid var(--red-line,#FBD9D9); border-left:3px solid var(--red,#7A1818);
  box-shadow:inset 0 1px 4px rgba(122,24,24,.06);
}
.ai-prompt-ta:focus{ box-shadow:inset 0 1px 4px rgba(122,24,24,.06),
  0 0 0 3px rgba(122,24,24,.1); border-color:var(--red,#7A1818); }

/* ── Erro / resultado ────────────────────────────────────────────────────── */
.ai-erro{
  font-size:12.5px; color:#7A1818; background:var(--red-soft,#FFF5F5);
  border:1px solid var(--red-line,#FBD9D9); border-left:3px solid var(--red,#7A1818);
  border-radius:8px; padding:11px 13px; margin:14px 26px;
  line-height:1.5; white-space:pre-wrap;
}
.ai-perguntas{
  background:#FFF8EC; border:1px solid #F2DDB4;
  border-left:3px solid var(--amber,#E8A547);
  border-radius:9px; padding:12px 14px; font-size:12.5px;
  color:#7A5A1E; display:flex; flex-direction:column; gap:9px;
}
.ai-perguntas ul{ margin:2px 0; padding-left:18px; }
.ai-perguntas li{ margin:3px 0; line-height:1.45; }
.ai-res-list{
  max-height:340px; overflow-y:auto;
  border:1px solid var(--line,#E6E8EE); border-radius:10px;
  padding:6px;
}
.ai-cap{ margin:0; }
.ai-cap + .ai-cap{ border-top:1px solid var(--line,#EDEFF4); }
.ai-cap-t{
  font-size:11px; font-weight:800; letter-spacing:.1em;
  text-transform:uppercase; color:var(--red,#7A1818);
  background:none; padding:12px 10px 6px;
}
.ai-cap-list{ margin:0 0 8px; padding:0 10px 0 26px; font-size:13px;
  color:var(--ink-2,#454B57); }
.ai-cap-list li{ margin:4px 0; line-height:1.4; }
.ai-resultado-notas{
  font-size:12px; color:var(--ink-3,#7A8190); font-style:italic;
  line-height:1.55;
}

/* ── Alternativa API (discreta) ──────────────────────────────────────────── */
.ai-api-det{
  margin:0; border:0; border-top:1px solid var(--line,#E6E8EE);
  background:#FAFAFB; border-radius:0;
}
.ai-api-det>summary{
  font-family:var(--mono,monospace); font-size:11.5px; font-weight:600;
  color:var(--ink-3,#7A8190); padding:13px 26px;
}
.ai-api-det>summary:hover{ color:var(--red,#7A1818); }
.ai-api-det[open]>summary{ border:0; }
.ai-api-det .ai-step-b{ padding:0 26px 20px; }
/* João 2026-05-19: seletor de versões da atividade (hover no €/un).
   Um botão por obra; por cima os dados. Estética limpa. */
.atv-eur--versoes{ cursor:default; }
.atv-eur--versoes:hover{
  text-decoration:underline dotted;
  text-underline-offset:3px;
}
.verpick-pop{
  z-index:99998;
  width:300px;
  max-height:60vh;
  overflow-y:auto;
  background:var(--surface, #fff);
  border:1px solid var(--border, #d6dbe2);
  border-radius:9px;
  box-shadow:0 10px 30px rgba(20,25,40,.22);
  padding:9px;
}
.verpick-title{
  font-size:11px;
  font-weight:700;
  color:var(--ink-3, #8a93a2);
  text-transform:uppercase;
  letter-spacing:.3px;
  margin:2px 4px 8px;
}
.verpick-grid{ display:flex; flex-direction:column; gap:6px; }
.verpick-btn{
  display:flex;
  flex-direction:column;
  gap:2px;
  text-align:left;
  padding:7px 10px;
  border:1px solid var(--border, #d6dbe2);
  border-radius:7px;
  background:var(--surface-2, #f7f8fa);
  cursor:pointer;
  transition:border-color .12s, background .12s, transform .05s;
}
.verpick-btn:hover{
  border-color:var(--accent, #4c8bf5);
  background:#eef4ff;
}
.verpick-btn:active{ transform:translateY(1px); }
.verpick-btn--media{ background:#fff7e6; }
.verpick-btn--media:hover{ background:#ffefcc; }
.verpick-data{ font-size:11px; color:var(--ink-3, #8a93a2); }
.verpick-strong{
  display:flex;
  align-items:baseline;
  gap:8px;
  font-size:14px;
  font-weight:800;
  color:var(--ink, #1b1f27);
}
.verpick-margem{
  font-size:12px;
  font-weight:700;
  color:#1f8a4c;
}
.verpick-obra{
  font-size:12.5px;
  font-weight:700;
  color:var(--ink, #222);
  margin-top:2px;
}
/* João 2026-05-19: bolinha de origem ao lado do total da atividade.
   verde = veio da BD · amarelo = BD+editado · roxo = fora da BD. */
.atv-origem-dot{
  display:inline-block;
  width:7px;
  height:7px;
  border-radius:50%;
  margin-left:5px;
  vertical-align:middle;
}
.atv-origem-dot--verde{ background:#2ecc71; }
.atv-origem-dot--amarelo{ background:#f1c40f; }
.atv-origem-dot--roxo{ background:#8e44ad; }

/* ═══ João 2026-05-19: vista detalhada rica da BD Atividades ═══════════════ */
.atvd-cell{ background:#faf7ff; padding:0 !important; }
.atvd-wrap{ padding:16px 18px 20px; }
.atvd-head{ display:flex; align-items:baseline; gap:10px; flex-wrap:wrap;
  margin-bottom:14px; }
.atvd-code{ background:#7c3aed; color:#fff; font-weight:800; font-size:12px;
  padding:3px 9px; border-radius:6px; }
.atvd-title{ font-weight:800; font-size:16px; color:#1f2937; }
.atvd-unit{ color:#7c3aed; font-weight:700; font-size:13px; }
.atvd-kpis{ display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr));
  gap:10px; margin-bottom:18px; }
.atvd-kpi{ background:#fff; border:1px solid #ede9fe; border-radius:12px;
  padding:12px 14px; box-shadow:0 1px 2px rgba(80,40,140,.05); }
.atvd-kpi-lbl{ font-size:11px; color:#6b7280; text-transform:uppercase;
  letter-spacing:.04em; margin-bottom:4px; }
.atvd-kpi-val{ font-size:22px; font-weight:800; color:#1f2937; line-height:1.1; }
.atvd-kpi-sub{ font-size:11px; color:#9ca3af; margin-top:3px; }
.atvd-kpi--mg.is-bom .atvd-kpi-val{ color:#16a34a; }
.atvd-kpi--mg.is-med .atvd-kpi-val{ color:#d97706; }
.atvd-kpi--mg.is-baixo .atvd-kpi-val{ color:#dc2626; }
.atvd-section{ margin-bottom:18px; }
.atvd-section-t{ font-weight:700; font-size:13px; color:#4b3b6b;
  margin-bottom:8px; }
.atvd-stack{ display:flex; height:26px; border-radius:8px; overflow:hidden;
  background:#f1f5f9; }
.atvd-seg{ height:100%; transition:width .2s; }
.atvd-seg--mat{ background:#3b82f6; } .atvd-dot.atvd-seg--mat{ background:#3b82f6; }
.atvd-seg--mo{ background:#f59e0b; } .atvd-dot.atvd-seg--mo{ background:#f59e0b; }
.atvd-seg--subs{ background:#8b5cf6; } .atvd-dot.atvd-seg--subs{ background:#8b5cf6; }
.atvd-seg--log{ background:#94a3b8; } .atvd-dot.atvd-seg--log{ background:#94a3b8; }
.atvd-legend{ display:flex; flex-wrap:wrap; gap:14px; margin-top:8px;
  font-size:12px; color:#374151; }
.atvd-legend-item{ display:inline-flex; align-items:center; gap:5px; }
.atvd-dot{ width:10px; height:10px; border-radius:3px; display:inline-block; }
.atvd-dot.is-vigor{ background:#16a34a; }
.atvd-dot.is-arq{ background:#cbd5e1; }
.atvd-bars{ display:flex; align-items:flex-end; gap:10px; height:140px;
  padding:6px 2px 0; overflow-x:auto; }
.atvd-bar-col{ display:flex; flex-direction:column; align-items:center;
  min-width:54px; height:100%; }
.atvd-bar-track{ flex:1; width:30px; display:flex; align-items:flex-end;
  background:#f1f5f9; border-radius:5px 5px 0 0; }
.atvd-bar-fill{ width:100%; border-radius:5px 5px 0 0; transition:height .2s; }
.atvd-bar-fill.is-vigor{ background:#16a34a; }
.atvd-bar-fill.is-arq{ background:#cbd5e1; }
.atvd-bar-v{ font-size:11px; font-weight:700; color:#374151; margin-top:3px; }
.atvd-bar-x{ font-size:10px; color:#9ca3af; margin-top:1px; max-width:60px;
  text-align:center; overflow:hidden; text-overflow:ellipsis;
  white-space:nowrap; }
.atvd-mats{ display:flex; flex-wrap:wrap; gap:8px; }
.atvd-mat{ background:#fff; border:1px solid #e5e7eb; border-radius:10px;
  padding:8px 12px; min-width:180px; }
.atvd-mat-n{ font-weight:700; font-size:13px; color:#1f2937; }
.atvd-mat-meta{ display:flex; flex-wrap:wrap; gap:8px; font-size:11px;
  color:#4b5563; margin-top:3px; }
.atvd-subs{ display:flex; flex-wrap:wrap; gap:6px; }
.atvd-sub-chip{ background:#ede9fe; color:#5b21b6; font-size:12px;
  font-weight:600; padding:4px 10px; border-radius:999px; }
.atvd-vtable{ font-size:12px; }
.atvd-vrow-media{ background:#f3e8ff; font-weight:700; }

/* João 2026-05-19: pill da unidade da atividade + popover */
.atv-un-pill{
  display:inline-flex;
  align-items:center;
  gap:3px;
  padding:1px 7px;
  border-radius:999px;
  background:var(--surface-2, #eef1f5);
  border:1px solid var(--border, #d6dbe2);
  font-size:12px;
  cursor:pointer;
  user-select:none;
}
.atv-un-pill:hover{ border-color:var(--accent, #4c8bf5); }
.atv-un-pill--editable{ cursor:pointer; }
.atv-un-pill--editing{
  background:#fff;
  border-color:var(--accent, #4c8bf5);
  min-width:44px;
  text-align:center;
}
.atv-un-pill-badge{
  font-size:9px;
  background:var(--accent, #4c8bf5);
  color:#fff;
  border-radius:999px;
  padding:0 4px;
  line-height:1.4;
}
.atv-un-pop-backdrop{ position:fixed; inset:0; z-index:60; }
.atv-un-pop{
  z-index:61;
  width:280px;
  background:var(--surface, #fff);
  border:1px solid var(--border, #d6dbe2);
  border-radius:8px;
  box-shadow:0 8px 28px rgba(0,0,0,.18);
  padding:10px;
  display:flex;
  flex-direction:column;
  gap:8px;
  font-size:12px;
}
.atv-un-pop-title{ font-weight:600; font-size:12px; color:var(--ink-2); }
.atv-un-pop-list{ display:flex; flex-direction:column; gap:3px; }
.atv-un-pop-item{
  display:flex;
  align-items:center;
  gap:6px;
  padding:4px 7px;
  border:1px solid var(--border, #d6dbe2);
  border-radius:6px;
  background:transparent;
  cursor:pointer;
  text-align:left;
}
.atv-un-pop-item small{ color:var(--ink-3, #8a93a2); margin-left:auto; }
.atv-un-pop-item.is-active{
  border-color:var(--accent, #4c8bf5);
  background:rgba(76,139,245,.08);
}
.atv-un-pop-del{
  margin-left:6px;
  color:#c0392b;
  font-weight:700;
  cursor:pointer;
}
.atv-un-pop-row{ display:flex; align-items:center; gap:6px; flex-wrap:wrap; }
.atv-un-pop-lbl{ color:var(--ink-3, #8a93a2); min-width:78px; }
.atv-un-pop-eq{ color:var(--ink-3, #8a93a2); }
.atv-un-pop-input,
.atv-un-pop-num{
  flex:1 1 60px;
  min-width:48px;
  border:1px solid var(--border, #d6dbe2);
  border-radius:5px;
  padding:3px 6px;
  font-size:12px;
}
.atv-un-pop-addbtn{
  background:var(--accent, #4c8bf5);
  color:#fff;
  border:0;
  border-radius:5px;
  padding:4px 9px;
  cursor:pointer;
  font-size:12px;
}
.atv-un-pop-note{
  color:var(--ink-3, #8a93a2);
  font-size:10.5px;
  font-style:italic;
  border-top:1px dashed var(--border, #d6dbe2);
  padding-top:6px;
}
/* Quando há nota inline ao lado, encurta para 70% (reserva 30% à direita) */
.atv-desc:has(.atv-nota-inline) .atv-desc-text{
  max-width:70%;
}
/* Zona de nota — pré-reservada para futura nota inline da actividade na orçamentação.
   Quando a nota existir, aparece à direita da descrição em vermelho italico. */
.atv-nota-inline{
  margin-left:auto;
  padding-left:12px;
  color:var(--red);              /* bordô #7A1818 */
  font-style:italic;             /* tudo em itálico (texto + label) */
  font-weight:500;               /* texto sem negrito — só "NOTA:" é bold */
  font-size:13.5px;              /* igual a .atv-desc-text */
  line-height:1.55;              /* igual a .atv-desc-text */
  align-self:flex-start;
  flex-shrink:1;
  max-width:30%;
  /* Alinhamento à direita: o texto cresce para a esquerda e o "NOTA:"
     fica como cabeçalho a empurrar-se conforme o texto aumenta. */
  text-align:right;
  /* pre-wrap preserva Enter e espaços do textarea da nota. */
  white-space:pre-wrap;
  word-break:break-word;
}
.atv-nota-inline-prefix{
  text-transform:uppercase;      /* garante CAIXA ALTA */
  font-weight:800;               /* só o "NOTA:" é negrito */
  letter-spacing:.3px;
  margin-right:4px;
  /* font-style herda italic do pai */
}

/* Colunas UN/QTD/€/Un — mesma fonte e cor acinzentada (Onda 8.9).
   Total é o único destacado (Lato negrito ink).
   Onda 8.10: alinhamento topo — `padding-top: 5px` faz com que o texto
   das colunas comece à mesma altura que o topo da pill do código (sm: 3px padding + 1px border + base text). */
.atv-col{
  text-align:right;
  font-variant-numeric:tabular-nums;
  white-space:nowrap;
  font-size:12px;
  /* line-height:1 garante que o topo do glifo coincide com o topo da box,
     independentemente do font-size. Sem isto, .atv-total (14px) fica ~1.5px
     mais baixo que UN/QTD/€un (12px) por causa do leading do line-height:normal.
     Onda 8.11 (2026-05-10): alinhamento Total com restantes pelo topo da pill. */
  line-height:1;
  padding-top:5px;
  color:var(--ink-4);
  font-weight:400;
  align-self:flex-start;
}
.atv-un{ color:var(--ink-4); font-size:12px; }
.atv-qtd{ color:var(--ink-4); font-size:12px; }
.atv-eur{ color:var(--ink-4); font-size:12px; text-align:right; }
/* Total: maior + bold para destaque, mas mesmo line-height:1 para alinhar topo. */
.atv-total{ font-weight:700; color:var(--ink); text-align:right; font-size:14px; line-height:1; }
.atv-adefinir{
  grid-column:4 / 6;
  text-align:right;
  font-size:11px;
  font-weight:700;
  letter-spacing:.5px;
  text-transform:uppercase;
  color:var(--red);
  padding-top:3px;
}
/* Nota legacy em full-width abaixo (não usada com .atv-nota-inline activa) */
.atv-nota{
  grid-column:1 / -1;
  font-size:11px;
  color:var(--ink-3);
  font-style:italic;
  padding-top:4px;
  border-top:1px solid #F0E0E0;
  margin-top:4px;
}

/* ═══════════════════════════════════════════════════════
   VISTA LISTAGEM — card full-width com tabela alargada
   Grid: Nº | V | Obra | Cliente | Valor | Envio | Status | Ações | V.Adj | D.Adj | Morada
   ═══════════════════════════════════════════════════════ */
/* Grid: Nº | V | Obra | Cliente | Valor | Envio | Status | Ações | V.Adj | D.Adj | Morada | Ctrl */
/* Grid Listagem (Onda 8): Nº alargado 72→92px para Lato 900 32px caber quando selected. */
:root{ --lst-grid: 92px 42px 2fr 1fr 100px 90px 124px 160px 100px 90px 1.2fr 52px; }

.lst-page{
  flex:1;
  display:flex;
  flex-direction:column;
  padding:10px 12px;
  overflow:hidden;
  height:100%;
}
.lst-card{
  display:flex;
  flex-direction:column;
  background:#fff;
  border:1px solid var(--line);
  border-radius:8px;
  box-shadow:0 1px 3px rgba(0,0,0,.05);
  overflow:hidden;
  flex:1;
  min-height:0;
}
/* Toolbar — igual ao CRM mas limita o input de pesquisa */
.lst-header{
  display:flex;
  align-items:center;
  gap:6px;
  padding:8px 10px;
  border-bottom:1px solid var(--line);
  background:#FAFBFC;
  flex-shrink:0;
}
/* Na listagem o search-input NÃO cresce — fica mesma largura que CRM */
.lst-header .crm-search-input{
  flex:0 0 200px;
  width:200px;
}
/* Cabeçalho das colunas */
.lst-row-header{
  display:grid;
  grid-template-columns:var(--lst-grid);
  column-gap:8px;
  align-items:center;
  padding:5px 8px;
  background:#F5F6F8;
  border-bottom:1px solid var(--line);
  position:sticky;
  top:0;
  z-index:2;
  flex-shrink:0;
}
/* Todas as células do cabeçalho — mesma fonte/tamanho, sem variações */
.lst-row-header > * {
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  font-family:var(--font) !important;
  font-size:9.5px !important;
  font-weight:700 !important;
  color:var(--ink-4) !important;
  text-transform:uppercase;
  letter-spacing:.5px !important;
  /* alinhamento por defeito: centro — as excepções são overridden abaixo */
  text-align:center;
}
/* Corpo da lista */
.lst-body{
  flex:1;
  overflow-y:auto;
  min-height:0;
  display:flex;
  flex-direction:column;
  gap:2px;
  padding:4px 6px;
}
/* Linha / card — rows altas para acomodar número Lato grande (mockup, Onda 4.8).
   Padding 5→14 vertical · column-gap 8→12 · min-height 40→64. */
.lst-row-card{
  display:grid;
  grid-template-columns:var(--lst-grid);
  column-gap:12px;
  align-items:center;
  padding:14px 12px;
  background:#fff;
  border:1px solid var(--line);
  border-radius:4px;
  cursor:pointer;
  min-height:64px;
  transition:background .1s, border-color .1s;
  position:relative;
}
.lst-row-card:hover{ background:#F8F9FB; border-color:var(--line-strong); }
/* Selected (a usar quando o JSX da Listagem passar isSelected) — só barra + número, sem alterar texto */
.lst-row-sel{
  border-left:3px solid var(--red) !important;
  border-color:var(--red-line);
}
/* Células genéricas: mesmo tamanho e cor que CRM rows */
.lst-row-card > div{
  font-size:11.5px;
  color:var(--ink-2);
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  text-align:center;   /* por defeito centrado */
}
/* ── Colunas individuais ── */
/* Centradas */
/* Lst num — Lato 300 default · Lato 900 selected (Onda 8.5, alinhado com CRM split).
   Contraste claro por peso + tamanho + cor. */
.lst-num{
  font-family:var(--font);
  font-weight:300;
  font-size:28px;
  color:var(--ink-5);
  font-variant-numeric:tabular-nums;
  letter-spacing:-.6px;
  line-height:1;
  text-align:center;
}
.lst-row-sel .lst-num{
  font-weight:900;
  font-size:32px;
  color:var(--red);
  letter-spacing:-.8px;
}
.lst-ver{ font-size:11px; color:var(--ink-3); }
.lst-val{ font-variant-numeric:tabular-nums; font-weight:600; }
.lst-env{ font-size:11px; font-variant-numeric:tabular-nums; }
.lst-vadj{ font-variant-numeric:tabular-nums; }
.lst-dadj{ font-size:11px; font-variant-numeric:tabular-nums; }
/* Morada — 2 linhas reais */
.lst-mor{
  text-align:left !important;
  overflow:hidden;
  white-space:normal !important;  /* permite 2 linhas */
  line-height:1.4;
  display:flex;
  flex-direction:column;
  justify-content:center;
}
/* Header alinhados à esquerda */
.lst-row-header .lst-obra{ text-align:left !important; }
.lst-row-header .lst-mor{ text-align:left !important; }
/* Status: não truncar pill */
/* Q1 — quando há 2 pills (Por Enviar + status orçamento), empilhar verticalmente */
.lst-sts{ overflow:visible !important; display:flex; flex-direction:column; align-items:center; justify-content:center; gap:4px; }
.lst-mor-linha1{
  font-size:11px;
  color:var(--ink-2);
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.lst-mor-linha2{
  font-size:10px;
  color:var(--ink-4);
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  margin-top:1px;
}
/* Obra — texto à esquerda, seta encostada à direita da coluna */
.lst-obra{
  display:flex;
  align-items:center;
  overflow:hidden;
  text-align:left !important;
}
.lst-obra-text{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  flex:1;
  min-width:0;
  font-weight:400 !important;   /* Onda 8.9: garantir não-negrito (só valor é negrito) */
  color:var(--ink);
  font-size:13px;
  text-align:left !important;
}
.lst-obra-open{
  flex-shrink:0;
  margin-left:auto;          /* empurra seta para o extremo direito da coluna */
  padding-left:6px;
  background:none;
  border:none;
  cursor:pointer;
  color:var(--red);
  font-size:15px;
  font-weight:700;
  line-height:1;
  padding-right:0;
  transition:opacity .15s, transform .15s;
}
.lst-obra-open:hover{ transform:translateX(2px); }

/* ── Ações: 3 slots fixos, sempre à direita ── */
.lst-act{
  display:flex;
  gap:3px;
  align-items:center;
  justify-content:flex-end;
  overflow:visible !important;
  white-space:nowrap;
}
.lst-slot{
  width:28px;
  height:24px;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  flex-shrink:0;
}
.lst-row-header .lst-act{ text-align:right !important; }
/* ── Ctrl (clipboard + delete) — última coluna ── */
.lst-ctrl{
  display:flex;
  gap:2px;
  align-items:center;
  justify-content:flex-end;
  overflow:visible !important;
}
.lst-row-header .lst-ctrl{ text-align:right !important; }
/* Botões de ação */
/* Botões de ação — icon only, cabe num slot de 28px */
.lst-action-btn{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:24px;
  height:24px;
  border-radius:4px;
  font-size:12px;
  font-weight:700;
  cursor:pointer;
  border:1px solid transparent;
  transition:all .1s;
  font-family:var(--font);
  padding:0;
}
.lst-action-btn:disabled{ opacity:.4; cursor:default; }
.lst-action-adj{ background:#DCFCE7; color:#166534; border-color:#BBF7D0; }
.lst-action-adj:hover:not(:disabled){ background:#BBF7D0; }
.lst-action-canc{ background:#FEE2E2; color:#991B1B; border-color:#FECACA; font-size:13px; }
.lst-action-canc:hover:not(:disabled){ background:#FECACA; }
.lst-action-nova{ background:#F0F9FF; color:#0C4A6E; border-color:#BAE6FD; font-size:9.5px; font-weight:700; width:auto; padding:0 5px; }
.lst-action-nova:hover:not(:disabled){ background:#BAE6FD; }
.lst-action-clip{ background:transparent; border-color:transparent; font-size:12px; color:var(--ink-4); }
.lst-action-clip:hover:not(:disabled){ color:var(--ink-2); }
.lst-action-del{ background:transparent; border-color:transparent; font-size:16px; color:var(--ink-4); font-weight:400; }
.lst-action-del:hover:not(:disabled){ color:var(--red); }

/* ═══════════════════════════════════════════════════════
   MODAL — detalhe da proposta (aberto a partir da Listagem)
   ═══════════════════════════════════════════════════════ */
.prop-modal-overlay{
  position:fixed;
  inset:0;
  background:rgba(0,0,0,.45);
  z-index:200;
  display:flex;
  align-items:center;
  justify-content:center;
  padding:24px;
}
.prop-modal-content{
  position:relative;
  width:min(1400px, 98vw);
  height:min(960px, 94vh);
  background:#fff;
  border-radius:10px;
  box-shadow:0 8px 40px rgba(0,0,0,.2);
  display:flex;
  flex-direction:column;
  overflow:hidden;
}
.prop-modal-close{
  position:absolute;
  top:10px;
  right:12px;
  z-index:10;
  width:28px;
  height:28px;
  border-radius:50%;
  background:#F5F6F8;
  border:1px solid var(--line);
  cursor:pointer;
  font-size:13px;
  display:flex;
  align-items:center;
  justify-content:center;
  transition:background .1s;
}
.prop-modal-close:hover{ background:#FEE2E2; color:var(--red); border-color:var(--red); }
/* PropostaPanel dentro do modal ocupa todo o espaço */
.prop-modal-content .crm-detail-wrapper{
  border:none;
  border-radius:0;
  flex:1;
  height:100%;
}

/* ═══════════════════════════════════════════════════════
   LATO UNIVERSAL — garante que NENHUM elemento escapa
   Qualquer componente novo herda automaticamente Lato
   ═══════════════════════════════════════════════════════ */
*, *::before, *::after{ font-family:var(--font); }


/* ============================================================
   Card de Estatísticas (Onda 7 — mockup 2026-05-10)
   Substitui o footer simples "Total Orçamentado".
   Layout: tiles totais/KPIs em grid 4×2 + listas Top 3 em grid 2×2.
   ============================================================ */
/* Card 5 — Estatísticas: card físico próprio (Onda 5.8) com mesmas bordas dos outros 4. */
.crm-stats-card{
  display:flex;
  flex-direction:column;
  background:#fff;
  border:1px solid var(--line);
  border-radius:8px;
  box-shadow:0 1px 3px rgba(0,0,0,.05);
  flex-shrink:0;
  padding:14px 18px 16px;
  gap:12px;
}
.crm-stats-header{
  font-size:10px;
  font-weight:800;
  text-transform:uppercase;
  letter-spacing:1.4px;
  color:var(--red);
}

/* Grid de tiles — 4 colunas x 2 linhas */
.crm-stats-tiles{
  display:grid;
  grid-template-columns:repeat(4, 1fr);
  gap:8px;
}
.stat-tile{
  display:flex;
  flex-direction:column;
  gap:6px;
  padding:14px 14px 12px;
  background:#FAFBFC;
  border:1px solid var(--line);
  border-left:3px solid var(--ink-4);
  border-radius:6px;
  min-width:0;
  cursor:default;
  transition:transform .15s ease-out, box-shadow .15s ease-out, border-color .15s;
}
.stat-tile:hover{
  transform:translateY(-2px);
  box-shadow:0 4px 12px rgba(20,25,40,.08);
  border-color:var(--line-strong);
}
.stat-tile-label{
  font-size:9.5px;
  font-weight:700;
  color:var(--ink-3);
  letter-spacing:.9px;
  text-transform:uppercase;
  line-height:1.2;
}
.stat-tile-value{
  font-family:var(--font);
  font-weight:900;
  font-size:22px;
  color:var(--ink);
  font-variant-numeric:tabular-nums;
  letter-spacing:-.5px;
  line-height:1.05;
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
}

/* Variantes por tom (border-left e cor do valor) */
.stat-tile-default { border-left-color:var(--ink-3); }
.stat-tile-success { border-left-color:#2BAE66; background:#F6FDF9; }
.stat-tile-success .stat-tile-value { color:#1F7A3D; }
.stat-tile-warning { border-left-color:#A77400; background:#FFFAF0; }
.stat-tile-warning .stat-tile-value { color:#A77400; }
.stat-tile-danger  { border-left-color:#D62E2E; background:#FFF8F8; }
.stat-tile-danger  .stat-tile-value { color:#D62E2E; }
.stat-tile-info    { border-left-color:#3C5AA6; background:#F5F8FD; }
.stat-tile-info    .stat-tile-value { color:#3C5AA6; }

/* Listas Top 3 — grid 2 colunas x 2 linhas */
.crm-stats-lists{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:8px;
}
.stat-toplist{
  display:flex;
  flex-direction:column;
  padding:10px 12px;
  background:#FAFBFC;
  border:1px solid var(--line);
  border-radius:6px;
  min-width:0;
}
.stat-toplist-title{
  font-size:9.5px;
  font-weight:700;
  color:var(--red);
  letter-spacing:.9px;
  text-transform:uppercase;
  margin-bottom:7px;
  line-height:1.2;
}
.stat-toplist-empty{
  font-size:11px;
  color:var(--ink-4);
  font-style:italic;
}
.stat-toplist-items{
  display:flex;
  flex-direction:column;
  gap:8px;
  margin:0;
  padding:0;
  list-style:none;
}
/* Item da lista — rank grande à esquerda + conteúdo (label + valor + barra) (Onda 7.5) */
.stat-toplist-item{
  display:grid;
  grid-template-columns:24px 1fr;
  gap:10px;
  align-items:center;
  min-width:0;
}
.stat-toplist-rank{
  font-family:var(--font);
  font-weight:900;
  font-size:18px;
  color:var(--red);
  text-align:center;
  line-height:1;
  font-variant-numeric:tabular-nums;
  letter-spacing:-.3px;
}
/* Top 1 destaca-se mais visualmente (maior + glyph diferente) */
.stat-toplist-rank-1{ font-size:22px; }
.stat-toplist-rank-2{ font-size:18px; color:var(--ink-3); }
.stat-toplist-rank-3{ font-size:16px; color:var(--ink-4); }

.stat-toplist-content{
  min-width:0;
  display:flex;
  flex-direction:column;
  gap:3px;
}
.stat-toplist-row{
  display:flex;
  justify-content:space-between;
  align-items:baseline;
  gap:8px;
  min-width:0;
}
.stat-toplist-label{
  font-size:11.5px;
  color:var(--ink);
  font-weight:600;
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
  min-width:0;
}
.stat-toplist-value{
  font-size:11px;
  font-weight:700;
  color:var(--ink);
  font-variant-numeric:tabular-nums;
  white-space:nowrap;
  flex-shrink:0;
}
/* Barra proporcional (Top 1 = 100%) — coerente com Resumo dos capítulos */
.stat-toplist-bar{
  height:3px;
  background:#EFE3E3;
  border-radius:2px;
  overflow:hidden;
}
.stat-toplist-bar-fill{
  height:100%;
  background:var(--red);
  border-radius:2px;
  transition:width .25s ease-out;
}

/* ============================================================
   CRM lista — 3 zonas de header (mockup 2026-05-10, Onda 4.6)
   1. Info row (CRM tag + título + chips + Nova Proposta + toggle)
   2. Filter row 1 (search + date range + undo)
   3. Filter row 2 (status filters + sort)
   ============================================================ */
.crm-list-info-row{
  display:flex;
  align-items:flex-start;
  justify-content:space-between;
  gap:10px;
  padding:18px 22px 12px;
  flex-shrink:0;
}
.crm-list-info-left{
  display:flex;
  flex-direction:column;
  gap:4px;
  min-width:0;
}
.crm-list-eyebrow{
  font-size:11px;
  font-weight:800;
  color:var(--red);
  letter-spacing:1.6px;
  text-transform:uppercase;
}
.crm-list-title{
  font-size:20px;
  font-weight:900;
  color:var(--ink);
  letter-spacing:-.3px;
  line-height:1.1;
}
.crm-list-meta{
  display:flex;
  align-items:center;
  gap:6px;
  flex-wrap:wrap;
  margin-top:4px;
}
.crm-list-chip{
  font-size:11px;
  font-weight:700;
  color:var(--red);
  background:var(--red-soft);
  border:1px solid var(--red-line);
  border-radius:10px;
  padding:2px 9px;
}
.crm-list-dot{ color:var(--ink-5); }
.crm-list-count{
  font-size:11px;
  color:var(--ink-4);
}

/* Filter rows (search + chips) */
.crm-list-filter-row{
  display:flex;
  align-items:center;
  gap:6px;
  padding:0 14px 6px;
  flex-shrink:0;
  position:relative;
}
.crm-list-filter-row1 .crm-search-input{
  flex:1;
  min-width:0;
}
.crm-list-filter-row2{
  flex-wrap:wrap;
}
.crm-list-sort-spacer{ flex:1; }
.crm-sort-wrap{ position:relative; flex-shrink:0; }
.crm-list-sort-btn{
  padding:4px 11px;
  font-size:11px;
  font-weight:500;
  background:transparent;
  color:var(--ink-4);
  border:1px solid var(--line);
  border-radius:12px;
  cursor:pointer;
  white-space:nowrap;
  font-family:var(--font);
  display:inline-flex;
  align-items:center;
  gap:4px;
  flex-shrink:0;
}
.crm-list-sort-btn:hover{
  color:var(--red);
  border-color:var(--red-line);
  background:var(--red-soft);
}
.crm-list-sort-btn-active{
  color:var(--red);
  border-color:var(--red-line);
  background:var(--red-soft);
  font-weight:700;
}
/* Dropdown do sort (Onda 8.6) */
.crm-sort-dropdown{
  position:absolute;
  top:calc(100% + 4px);
  right:0;
  z-index:300;
  background:#fff;
  border:1px solid var(--line);
  border-radius:8px;
  padding:4px;
  box-shadow:0 4px 16px rgba(20,25,40,.1);
  min-width:180px;
}
.crm-sort-option{
  display:block;
  width:100%;
  text-align:left;
  padding:7px 12px;
  font-size:12px;
  background:transparent;
  color:var(--ink);
  border:none;
  border-radius:5px;
  cursor:pointer;
  font-family:var(--font);
}
.crm-sort-option:hover{ background:#F4F5F8; }
.crm-sort-option-active{
  background:var(--red-soft);
  color:var(--red);
  font-weight:700;
}

/* Obra+Cliente em 2 linhas (mockup 2026-05-10) */
.crc-obracli{
  display:flex;
  flex-direction:column;
  gap:2px;
  min-width:0;
  justify-content:center;
  /* +5px de respiração para o Nº cresce até 32px Lato 900 quando selecionado.
     Aplicado a todas as rows + ao header (.crm-row-header > .crc-obracli) para
     manter alinhamento vertical consistente. */
  padding-left:5px;
}
/* Header usa o mesmo padding para alinhar o cabeçalho "Obra · Cliente". */
.crm-row-header .crc-obracli{ padding-left:5px; }
.crc-obra-line{
  font-size:13px;
  font-weight:700;
  color:var(--ink);
  line-height:1.2;
  overflow:hidden;
  display:-webkit-box;
  -webkit-line-clamp:2;
  -webkit-box-orient:vertical;
  white-space:normal;
  word-break:break-word;
}
.crc-cli-line{
  font-size:11.5px;
  color:var(--ink-3);
  line-height:1.2;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}

/* Status pill com data adj subtil embaixo */
.crc-sts{
  display:flex;
  flex-direction:column;
  align-items:center;
  gap:3px;
  justify-content:center;
}
.crc-sts-adjdate{
  font-size:9.5px;
  font-weight:700;
  color:#1F7A3D;
  font-variant-numeric:tabular-nums;
  letter-spacing:.2px;
}

/* Linha SELECCIONADA (mockup 2026-05-10) — só barra + número grande bordô,
   sem mudar cor do texto obra/cliente/valor (regra do João).
   Sobrescreve a regra anterior que mudava cor para bordô. */
.crm-row-sel .crc-obra-line,
.crm-row-sel .crc-cli-line,
.crm-row-sel .crc-val{
  color:initial;
  font-weight:inherit;
}
.crm-row-sel .crc-obra-line{ color:var(--ink); font-weight:700; }
.crm-row-sel .crc-cli-line{ color:var(--ink-3); }
.crm-row-sel .crc-val{ color:var(--ink); font-weight:700; }

/* ============================================================
   StatusFilterPill — chips inline (Onda 8.5, mockup 2026-05-10)
   Alinhado com mockup CRM Combinado v3: chips horizontais com
   bolinha colorida do status à esquerda, cor de fundo subtil
   correspondente ao status, semi-transparente quando inactivo.
   ============================================================ */
.sf-chips{
  display:inline-flex;
  align-items:center;
  gap:5px;
  flex-wrap:wrap;
}
.sf-chip{
  display:inline-flex;
  align-items:center;
  gap:5px;
  padding:4px 10px;
  font-size:10.5px;
  font-weight:500;
  border:1px solid var(--line);
  background:transparent;
  color:var(--ink-3);
  border-radius:11px;
  cursor:pointer;
  white-space:nowrap;
  font-family:var(--font);
  transition:all .1s;
  opacity:.75;
}
.sf-chip:hover{ opacity:1; }
.sf-chip-active{
  font-weight:700;
  opacity:1;
}

/* "Todos" — accent quando seleccionado */
.sf-chip:not(.sf-chip-status){
  color:var(--ink);
}
.sf-chip:not(.sf-chip-status).sf-chip-active{
  background:var(--red-soft);
  color:var(--red);
  border-color:var(--red-line);
}

/* Bolinha colorida à esquerda dos chips de status */
.sf-chip-dot{
  width:5px;
  height:5px;
  border-radius:50%;
  flex-shrink:0;
}

/* Por Enviar — blue */
.sf-chip-por_enviar{ color:#3C5AA6; }
.sf-chip-por_enviar .sf-chip-dot{ background:#3C5AA6; }
.sf-chip-por_enviar.sf-chip-active{
  background:#E8EDF6;
  border-color:#3C5AA660;
}

/* Por Aprovar — amber */
.sf-chip-por_aprovar{ color:#A77400; }
.sf-chip-por_aprovar .sf-chip-dot{ background:#A77400; }
.sf-chip-por_aprovar.sf-chip-active{
  background:#FFF3D9;
  border-color:#A7740060;
}

/* Adjudicado — green */
.sf-chip-adjudicado{ color:#1F7A3D; }
.sf-chip-adjudicado .sf-chip-dot{ background:#1F7A3D; }
.sf-chip-adjudicado.sf-chip-active{
  background:#DFF5E6;
  border-color:#1F7A3D60;
}

/* Cancelado — red */
.sf-chip-cancelado{ color:#D62E2E; }
.sf-chip-cancelado .sf-chip-dot{ background:#D62E2E; }
.sf-chip-cancelado.sf-chip-active{
  background:#FFE7E7;
  border-color:#D62E2E60;
}

/* Arquivada — bordô (microalteração F — 2026-05-11): era cinza, passou a bordô
   para coerência com a paleta das linhas arquivadas e da pill de status. */
.sf-chip-arquivada{ color:var(--red); }
.sf-chip-arquivada .sf-chip-dot{ background:var(--red); }
.sf-chip-arquivada.sf-chip-active{
  background:var(--red-soft);
  border-color:var(--red-line);
}

/* ============================================================
   Cursor casinha Construsud (2026-05-10)
   Substitui o cursor do sistema dentro do .app-shell por uma
   versão pequena (32x32) do logo casinha rodada em diagonal.
   Hotspot: ponta do telhado (15, 0). !important para vencer
   estilos inline `cursor: pointer` em buttons/links.
   Excepções (mantêm cursor default do sistema):
   - aria-busy / .loading  → wait (carregando)
   - :disabled / aria-disabled → not-allowed (anulado)
   Fora do .app-shell (login) mantém-se o default sempre.
   ============================================================ */
/* O14 2026-05-11 — cursor custom desactivado, voltou ao default do sistema. */

/* Carregando — devolve o cursor wait do sistema */
.app-shell [aria-busy="true"],
.app-shell [aria-busy="true"] *,
.app-shell .loading,
.app-shell .loading *{
  cursor: wait !important;
}

/* Anulado / disabled — devolve o not-allowed do sistema */
.app-shell :disabled,
.app-shell [disabled],
.app-shell [aria-disabled="true"],
.app-shell [aria-disabled="true"] *{
  cursor: not-allowed !important;
}

/* ============================================================
   Bloco E4 — OrcamentarPage (2026-05-10)
   Tabs com badges count + Card Auxiliar de Orçamentação +
   badge de notas (📝) na coluna status.
   Reutiliza .crm-page / .crm-panels / .crm-list-card / .crm-row-card
   ============================================================ */

/* — 4 sub-abas (Nova / Em Orçamentação / Em Análise / Pronta) — */
.orc-tabs{
  display:flex;
  gap:4px;
  padding:0 14px;
  border-bottom:1px solid var(--line);
  margin-top:-2px;
}
.orc-tab{
  display:inline-flex;
  align-items:center;
  gap:6px;
  padding:9px 12px;
  background:transparent;
  border:none;
  border-bottom:2px solid transparent;
  font-family:var(--font);
  font-size:12px;
  font-weight:600;
  color:var(--ink-3);
  cursor:pointer;
  white-space:nowrap;
  transition:color .12s, border-color .12s;
  margin-bottom:-1px;
}
.orc-tab:hover{ color:var(--ink); }
.orc-tab-active{
  color:var(--red);
  border-bottom-color:var(--red);
}
.orc-tab-badge{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  min-width:18px;
  height:16px;
  padding:0 5px;
  border-radius:8px;
  background:var(--line);
  color:var(--ink-3);
  font-size:10px;
  font-weight:700;
  font-variant-numeric:tabular-nums;
  line-height:1;
}
.orc-tab-active .orc-tab-badge{
  background:var(--red-soft);
  color:var(--red);
}

/* — Badge de notas de revisão (📝) na coluna status — */
.orc-notes-badge{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:18px;
  height:18px;
  margin-left:6px;
  border-radius:50%;
  background:#FFF3D9;
  font-size:10px;
  cursor:help;
  vertical-align:middle;
}

/* — Card placeholder "Auxiliar de Orçamentação" (40% inferior) — */
.orc-aux-card{
  background:#fff;
  border:1px solid var(--line);
  border-radius:8px;
  box-shadow:0 1px 3px rgba(0,0,0,.05);
  padding:14px 16px;
  display:flex;
  flex-direction:column;
  gap:8px;
  min-height:0;
  overflow:auto;
}
.orc-aux-eyebrow{
  font-size:10px;
  font-weight:700;
  letter-spacing:.6px;
  color:var(--red);
  text-transform:uppercase;
}
.orc-aux-title{
  font-size:14px;
  font-weight:700;
  color:var(--ink);
  line-height:1.2;
}
.orc-aux-body{
  display:flex;
  flex-direction:column;
  gap:6px;
  margin-top:2px;
}
.orc-aux-placeholder{
  font-size:11.5px;
  color:var(--ink-3);
  margin:0;
}
.orc-aux-list{
  margin:0;
  padding-left:18px;
  font-size:11.5px;
  color:var(--ink-2);
  line-height:1.5;
}
.orc-aux-list li{ margin:0; }
.orc-aux-foot{
  font-size:10.5px;
  font-style:italic;
  color:var(--ink-4);
  margin:6px 0 0;
}


/* ───────────────────────────────────────────────────────────────────────────
   Bloco E4 refresh — adições para a aba Orçamentar (2026-05-11)
   Visual idêntico ao CRM (.crm-row-card / .crm-row-header), só:
     • o conteúdo das colunas muda (Num vazio, Ver. vazio, Envio→Data Limite editável)
     • o StatusPill usa variant='orcamento' (paleta semáforo)
     • os filtros viram cards por status (orc-status-card)
   ─────────────────────────────────────────────────────────────────────────── */

/* ── Data Limite na linha do Orçamento ────────────────────────────────────
   Subtil quando preenchido (texto bordô, sem borda).
   Pill vermelha "Preencher" quando vazio (chama atenção).
   Vermelho sangue + "Atrasado X dias" quando passou o prazo. */

/* Wrapper: 2 linhas verticais (data + overdue) */
.orc-dlim-cell{
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  line-height:1.15;
  gap:1px;
}

/* Input quando preenchido — texto bordô sem caixa visível */
.orc-dlim-input{
  width:100%;
  max-width:90px;
  padding:1px 2px;
  border:none;
  background:transparent;
  font-size:11px;
  font-weight:700;
  font-family:inherit;
  font-variant-numeric:tabular-nums;
  color:var(--red-main);
  cursor:pointer;
  text-align:center;
}
.orc-dlim-input:hover{ background:#FFF5F5; border-radius:3px; }
.orc-dlim-input:focus{ outline:none; background:#FFF5F5; border-radius:3px; }
/* O13 — esconder o highlight azul nos campos DD/MM/YYYY ao focar */
.orc-dlim-input::-webkit-datetime-edit-day-field:focus,
.orc-dlim-input::-webkit-datetime-edit-month-field:focus,
.orc-dlim-input::-webkit-datetime-edit-year-field:focus{
  background-color: transparent !important;
  color: inherit !important;
  outline: none;
}
.orc-dlim-input::selection{ background:transparent; }
.orc-dlim-input::-webkit-calendar-picker-indicator{ display:none; }
.orc-dlim-input::-moz-calendar-picker-indicator{ display:none; }
.orc-dlim-input::-webkit-inner-spin-button{ display:none; }
.orc-dlim-input{ appearance:none; -webkit-appearance:none; }

/* Variante overdue — vermelho sangue */
.orc-dlim-input.is-overdue{ color:#B91C1C; }

/* Botão "Preencher" — pill vermelha quando dataLimite ainda nao foi definida */
/* Batch A (2026-05-13): pill vazia da Data Limite — agora "+" minimalista
   vermelho, em vez de chip rosa "Preencher". Círculo pequeno (18×18),
   borda fina vermelha, "+" centrado. Mais discreto, alinhado com o
   resto da listagem. */
.orc-dlim-empty-pill{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:18px;
  height:18px;
  padding:0;
  font-size:14px;
  font-weight:700;
  line-height:1;
  border-radius:50%;
  background:transparent;
  color:#B91C1C;
  border:1px solid #FCA5A5;
  cursor:pointer;
  font-family:inherit;
  transition:background .12s, border-color .12s;
}
.orc-dlim-empty-pill:hover{
  background:#FEE2E2;
  border-color:#B91C1C;
}

/* Linha extra "Atrasado X dias" — abaixo da data quando overdue */
.orc-dlim-overdue{
  font-size:9px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.4px;
  color:#B91C1C;
}

/* ── Cards por status (substituem as 4 sub-abas) ────────────────────────────
   Cada status é um card visível, com header colorido (paleta orçamento).
   Cards vazios escondem-se. Sem scroll interno (cards crescem com conteúdo);
   scroll fica no .crm-list-scroll exterior. */

.orc-status-card{
  background:#fff;
  border:1px solid var(--line);
  border-radius:6px;
  margin:0 6px 8px 6px;
  overflow:hidden;
}
.orc-status-card:first-child{ margin-top:6px; }
.orc-status-card:last-child{ margin-bottom:6px; }

/* Header coloreado de cada card de status */
.orc-status-card-header{
  display:flex;
  align-items:center;
  justify-content:space-between;
  padding:7px 12px;
  font-family:var(--font);
  font-size:11.5px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.6px;
  border-bottom:1px solid var(--line);
}
.orc-status-card-count{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  min-width:20px;
  height:18px;
  padding:0 7px;
  font-size:10px;
  font-weight:700;
  border-radius:10px;
  background:rgba(255,255,255,.55);
}

/* Cores da paleta orçamento (semáforo) — espelham ORCAMENTO_STATUS_COLORS */
.orc-status-card--nova_proposta   .orc-status-card-header{ background:#E8F1FE; color:#1E4D8C; }
.orc-status-card--em_orcamentacao .orc-status-card-header{ background:#F0E8FE; color:#5A2EA6; }
.orc-status-card--para_analise    .orc-status-card-header{ background:#FFF3D9; color:#A77400; }
.orc-status-card--para_envio      .orc-status-card-header{ background:#DFF5E6; color:#1F7A3D; }

/* Header das colunas DENTRO de cada card de status — mesmo visual do .crm-row-header
   mas não sticky (cada card tem o seu) */
.orc-status-card .crm-row-header{
  position:static !important;
  top:auto !important;
  background:#FAFBFC !important;
  border-bottom:1px solid var(--line);
}

/* Body do card de status — empilha as rows do mesmo status (mesmo gap do .crm-cards-body) */
.orc-status-card-body{
  display:flex;
  flex-direction:column;
  gap:3px;
  padding:5px 6px;
}

/* Defesa: esconder a velha estrutura de sub-abas (.orc-tabs) caso ainda apareça */
.orc-tabs{ display:none !important; }


/* M6 — Identificador V<n><nº> herda visual do .crc-num. Quando .crm-row-card--orc
   está selected, font-size é 22px (em vez de 32px do CRM) para caber 6 chars em 92px. */
.crm-row-card--orc.crm-row-sel .crc-num{
  font-size:22px;
  font-weight:900;
  color:var(--red);
  letter-spacing:-.4px;
}


/* N1+O4 — Gap maior entre as colunas .crc-env (Data Limite) e .crc-sts (Status)
   na lista do Orçamento. Aplica em todas as rows e no header dentro de .orc-status-card. */
.orc-status-card .crm-row-header,
.orc-status-card .crm-row-card{
  column-gap:13px;
}


/* O10 — Orçamento: coluna .crc-ver fica vazia (CodePill da versão removido),
   colapsar a 0px para que .crc-obracli (1fr) ganhe esse espaço para
   nomes de obra/cliente longos. */
.orc-status-card .crm-row-header,
.orc-status-card .crm-row-card{
  grid-template-columns: 78px minmax(0,1fr) 0px 86px 76px 108px 56px;
}


/* ── O15 — Input editável de Data Limite no CRM (apenas status=por_enviar) ──
   Estilo coerente com .crc-env-dlim-date (bordô, sem caixa, clicável). */
.crc-env-dlim-edit{
  border:none;
  background:transparent;
  font-size:11px;
  font-weight:700;
  font-family:inherit;
  font-variant-numeric:tabular-nums;
  color:var(--red-main);
  cursor:pointer;
  text-align:center;
  padding:0;
  width:auto;
  max-width:90px;
  appearance:none;
  -webkit-appearance:none;
}
.crc-env-dlim-edit.is-overdue{
  color:#B91C1C;
  background:#FFE4E4;
  border-radius:3px;
  padding:1px 3px;
}
.crc-env-dlim-edit:hover{ filter:brightness(.92); }
.crc-env-dlim-edit:focus{ outline:none; }

/* Esconder ícone calendário do input editável no CRM */
.crc-env-dlim-edit::-webkit-calendar-picker-indicator{ display:none; }
.crc-env-dlim-edit::-webkit-inner-spin-button{ display:none; }

/* Wrapper da pill "Preencher" no CRM — input invisível por cima */
.crc-env-dlim-empty-wrapper{
  position:relative;
  display:inline-flex;
  align-items:center;
  justify-content:center;
}
.crc-env-dlim-empty-input{
  position:absolute;
  inset:0;
  width:100%;
  height:100%;
  opacity:0;
  cursor:pointer;
  border:none;
  background:transparent;
  appearance:none;
  -webkit-appearance:none;
}
.crc-env-dlim-empty-pill{ pointer-events:none; }

/* ── O16 — Esconder selecção azul dos digitos DD/MM/YYYY em TODOS os inputs date ── */
.orc-dlim-input::-webkit-datetime-edit,
.crc-env-dlim-edit::-webkit-datetime-edit,
.crc-env-dlim-empty-input::-webkit-datetime-edit{
  background:transparent !important;
  color:inherit !important;
}
.orc-dlim-input::-webkit-datetime-edit-fields-wrapper,
.crc-env-dlim-edit::-webkit-datetime-edit-fields-wrapper,
.crc-env-dlim-empty-input::-webkit-datetime-edit-fields-wrapper{
  background:transparent !important;
}
.orc-dlim-input::-webkit-datetime-edit-day-field,
.orc-dlim-input::-webkit-datetime-edit-month-field,
.orc-dlim-input::-webkit-datetime-edit-year-field,
.crc-env-dlim-edit::-webkit-datetime-edit-day-field,
.crc-env-dlim-edit::-webkit-datetime-edit-month-field,
.crc-env-dlim-edit::-webkit-datetime-edit-year-field{
  background:transparent !important;
  color:inherit !important;
}
.orc-dlim-input::-webkit-datetime-edit-day-field:focus,
.orc-dlim-input::-webkit-datetime-edit-month-field:focus,
.orc-dlim-input::-webkit-datetime-edit-year-field:focus,
.crc-env-dlim-edit::-webkit-datetime-edit-day-field:focus,
.crc-env-dlim-edit::-webkit-datetime-edit-month-field:focus,
.crc-env-dlim-edit::-webkit-datetime-edit-year-field:focus{
  background-color:transparent !important;
  color:inherit !important;
  outline:none !important;
}


/* O17 — Label "Data Limite" no Orçamento, igual ao CRM */
.orc-dlim-label{
  font-size:9px;
  font-weight:600;
  text-transform:uppercase;
  letter-spacing:.4px;
  color:var(--red-main);
  opacity:.85;
  line-height:1.15;
}
.orc-dlim-cell.is-overdue .orc-dlim-label,
.orc-dlim-cell .is-overdue + .orc-dlim-label{ color:#B91C1C; }


/* P5 — Diário de Notas: spacer empurra o botão para baixo da sidebar */
.bd-sidebar-spacer{ flex:1 0 auto; min-height:8px; }

/* O sidebar precisa de ser flex column para o spacer funcionar */
.bd-sidebar{ display:flex; flex-direction:column; }

/* Botão Diário tem ligeira variação (cor accent quando aberto) */
.bd-sidebar-diario{
  background:rgba(255,255,255,.15) !important;
  border:none;
  cursor:pointer;
  padding:0;
}
.bd-sidebar-diario:hover{ background:rgba(255,255,255,.22) !important; }
.bd-sidebar-diario.active{ background:rgba(255,255,255,.38) !important; }

/* ── Painel Diário (modal centrado, minimalista) ──────────────────────────── */

.diario-backdrop{
  position:fixed;
  inset:0;
  background:rgba(20,25,40,.45);
  backdrop-filter:blur(2px);
  z-index:998;
  animation:diarioFade .15s ease-out;
}

.diario-painel{
  position:fixed;
  top:50%; left:50%;
  transform:translate(-50%, -50%);
  width:min(680px, 92vw);
  max-height:84vh;
  background:#FFF;
  border-radius:12px;
  box-shadow:0 20px 60px rgba(15,20,30,.28);
  z-index:999;
  display:flex;
  flex-direction:column;
  overflow:hidden;
  animation:diarioPop .2s cubic-bezier(.2,.9,.3,1.2);
}

@keyframes diarioFade{ from{opacity:0} to{opacity:1} }
@keyframes diarioPop{
  from{ opacity:0; transform:translate(-50%,-50%) scale(.96); }
  to{ opacity:1; transform:translate(-50%,-50%) scale(1); }
}

.diario-head{
  display:flex;
  align-items:center;
  justify-content:space-between;
  padding:18px 24px 14px;
  border-bottom:1px solid var(--line);
}
.diario-title{
  margin:0;
  font-size:18px;
  font-weight:800;
  color:var(--ink);
  letter-spacing:-.2px;
  display:flex;
  align-items:center;
  gap:10px;
}
.diario-title::before{
  content:"📔";
  font-size:20px;
}
.diario-head-right{
  display:flex; align-items:center; gap:8px;
}
.diario-copy-btn{
  padding:6px 12px;
  font-size:11px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.4px;
  border:1px solid var(--line-strong);
  background:#FFF;
  color:var(--ink-2);
  border-radius:5px;
  cursor:pointer;
  transition:all .12s;
}
.diario-copy-btn:hover{ background:var(--red-soft); border-color:var(--red-main); color:var(--red-main); }
.diario-close{
  border:none; background:transparent; cursor:pointer;
  font-size:26px; color:var(--ink-3); padding:0 6px;
  line-height:1;
  border-radius:4px;
  transition:all .12s;
}
.diario-close:hover{ color:var(--red-main); background:var(--red-soft); }

.diario-input-area{
  padding:16px 24px 14px;
  border-bottom:1px solid var(--line);
  background:#FAFBFC;
}
.diario-input-prompt-hint{
  font-size:11px;
  color:var(--ink-3);
  margin-bottom:6px;
  font-weight:600;
}
.diario-textarea{
  width:100%; box-sizing:border-box;
  padding:10px 12px;
  border:1.5px solid var(--line);
  border-radius:8px;
  font-size:13px;
  font-family:inherit;
  line-height:1.45;
  resize:vertical;
  min-height:72px;
  background:#FFF;
}
.diario-textarea:focus{ outline:none; border-color:var(--red-main); box-shadow:0 0 0 3px var(--red-soft); }

.diario-input-row{
  display:flex; align-items:center; justify-content:space-between;
  margin-top:10px;
}
.diario-input-hint{
  font-size:10.5px;
  color:var(--ink-3);
  font-weight:600;
}
.diario-add-btn{
  padding:8px 18px;
  border:none;
  border-radius:6px;
  background:var(--red-main);
  color:#FFF;
  font-size:12px;
  font-weight:700;
  letter-spacing:.3px;
  cursor:pointer;
  transition:filter .12s;
}
.diario-add-btn:hover:not(:disabled){ filter:brightness(.92); }
.diario-add-btn:disabled{ background:var(--ink-4); cursor:not-allowed; }

.diario-list-wrapper{
  flex:1;
  display:flex;
  flex-direction:column;
  min-height:0;
  background:#FFF;
}
.diario-list-label{
  padding:14px 24px 8px;
  font-size:10px;
  font-weight:800;
  text-transform:uppercase;
  letter-spacing:.6px;
  color:var(--ink-3);
  border-bottom:1px solid var(--line);
}
.diario-list{
  flex:1;
  overflow-y:auto;
  padding:8px 24px 20px;
  display:flex;
  flex-direction:column;
}

/* Cada entry: bloco com timeline-dot à esquerda + datetime + text */
.diario-entry{
  display:flex;
  align-items:flex-start;
  gap:12px;
  padding:10px 0;
  border-bottom:1px solid #F0F1F4;
  position:relative;
}
.diario-entry:last-child{ border-bottom:none; }
.diario-entry-date{
  flex-shrink:0;
  width:90px;
  font-size:10.5px;
  font-weight:700;
  color:var(--red-main);
  font-variant-numeric:tabular-nums;
  letter-spacing:.2px;
  padding-top:1px;
  line-height:1.35;
}
.diario-entry-date-day{ display:block; }
.diario-entry-date-time{ display:block; font-weight:600; color:var(--ink-3); font-size:10px; margin-top:1px; }
.diario-entry-body{
  flex:1;
  min-width:0;
}
.diario-entry-text{
  font-size:13px;
  line-height:1.5;
  color:var(--ink);
  white-space:pre-wrap;
  word-wrap:break-word;
}
.diario-entry-del{
  flex-shrink:0;
  border:none; background:transparent; cursor:pointer;
  font-size:16px; color:var(--ink-4); padding:2px 6px;
  line-height:1;
  border-radius:4px;
  transition:all .12s;
  opacity:0;
}
.diario-entry:hover .diario-entry-del{ opacity:1; }
.diario-entry-del:hover{ color:var(--red-mid); background:var(--red-soft); }

.diario-empty{
  padding:40px 24px;
  text-align:center;
  color:var(--ink-3);
  font-size:13px;
  font-style:italic;
}


/* P5 v2 — Status pills + opus notes no diário */
.diario-entry-status-row{
  display:flex;
  align-items:center;
  gap:8px;
  margin-bottom:4px;
}
.diario-entry-status-pill{
  display:inline-flex;
  align-items:center;
  padding:2px 8px;
  font-size:9.5px;
  font-weight:800;
  text-transform:uppercase;
  letter-spacing:.5px;
  border-radius:10px;
  line-height:1.4;
}
.diario-entry-resolvido-date{
  font-size:10px;
  font-weight:600;
  color:#1F7A3D;
  font-variant-numeric:tabular-nums;
}
.diario-entry-opus{
  margin-top:6px;
  padding:6px 10px;
  background:#F0E8FE;
  border-left:3px solid #5A2EA6;
  border-radius:0 4px 4px 0;
  font-size:11.5px;
  color:#5A2EA6;
  font-style:italic;
}
.diario-entry-opus::before{
  content:"💬 Opus: ";
  font-weight:700;
  font-style:normal;
}
/* Estado visual da entry conforme status */
.diario-entry--resolvido{ opacity:.68; }
.diario-entry--resolvido .diario-entry-text{ text-decoration:line-through; text-decoration-thickness:.5px; }
.diario-entry--rejeitado{ opacity:.5; }
.diario-entry--a_clarificar{ background:#FFFBEB; border-radius:4px; padding-left:6px; }


/* P5 v3 — Dropdown de status na nota (clique no pill abre menu) */
.diario-entry-status-pill{
  border:none;
  cursor:pointer;
  font-family:inherit;
  transition:filter .12s;
}
.diario-entry-status-pill:hover{ filter:brightness(.94); }

.diario-status-menu{
  position:absolute;
  top:calc(100% + 4px);
  left:0;
  background:#FFF;
  border:1px solid var(--line);
  border-radius:6px;
  box-shadow:0 8px 24px rgba(20,25,40,.15);
  padding:4px;
  z-index:10;
  min-width:140px;
  display:flex;
  flex-direction:column;
  gap:1px;
}
.diario-status-menu-item{
  display:flex;
  align-items:center;
  gap:8px;
  padding:6px 10px;
  border:none;
  background:transparent;
  border-radius:4px;
  font-size:12px;
  font-weight:600;
  text-align:left;
  cursor:pointer;
  font-family:inherit;
  transition:background .1s;
}
.diario-status-menu-item:hover{ background:var(--bg); }
.diario-status-menu-item.is-active{
  background:rgba(0,0,0,.04);
  font-weight:800;
}
.diario-status-menu-dot{
  width:8px;
  height:8px;
  border-radius:50%;
  flex-shrink:0;
}
.diario-entry-status-row{ position:relative; }


/* Esconder tooltip nativo do browser (title=) quando temos data-tip — title fica como fallback A11y */
[data-tip][title]{ /* native title aparece com delay nativo, browser-controlled — OK como fallback */ }


/* P10 — Tooltip global via portal. Renderizado no <body>, position:fixed,
   nunca cortado por overflow:hidden. Aparece instantâneo no hover. */
.global-tooltip{
  background:#1B1F27;
  color:#FFF;
  font-size:11px;
  font-weight:600;
  letter-spacing:.1px;
  padding:5px 10px;
  border-radius:5px;
  /* João 2026-05-19: pre-line p/ tooltips multi-linha (versões da BD).
     Tips curtos sem \n continuam numa linha (cabem no max-width). */
  white-space:pre-line;
  max-width:360px;
  text-align:left;
  box-shadow:0 4px 14px rgba(20,25,40,.30);
  font-family:var(--font, inherit);
  line-height:1.3;
  animation:tipFadeIn .1s ease-out;
  position:relative;
}
.global-tooltip::after{
  content:"";
  position:absolute;
  left:50%;
  transform:translateX(-50%);
  border-style:solid;
  border-width:5px;
}
.global-tooltip--above::after{
  top:100%;
  border-color:#1B1F27 transparent transparent transparent;
  border-width:5px 5px 0 5px;
}
.global-tooltip--below::after{
  bottom:100%;
  border-color:transparent transparent #1B1F27 transparent;
  border-width:0 5px 5px 5px;
}
@keyframes tipFadeIn{
  from{ opacity:0; }
  to{ opacity:1; }
}


/* P11 — Botões Excel (Folha de Rosto, aba Orçamento) */
.fr-btn-excel{
  display:inline-flex;
  align-items:center;
  color:#1F7A3D !important;
  border-color:#1F7A3D !important;
}
.fr-btn-excel:hover{ background:#DFF5E6 !important; }
.fr-btn-excel-x{
  display:inline-flex;
  align-items:center;
  color:#1F7A3D !important;
  border-color:#1F7A3D !important;
  position:relative;
}
.fr-btn-excel-x:hover{ background:#FFE7E7 !important; border-color:#D62E2E !important; }
.fr-btn-excel-x-mark{
  margin-left:3px;
  color:#D62E2E;
  font-weight:900;
  font-size:14px;
  line-height:1;
}


/* P11 v2 — Ícones inline nos botões PDF / Excel */
.fr-icon-pdf, .fr-icon-xls{
  display:inline-flex;
  align-items:center;
  margin-right:5px;
  vertical-align:middle;
}
.fr-icon-pdf svg, .fr-icon-xls svg{
  display:block;
}


/* P11 v4 — Cluster no header da Folha de Rosto: pill PROPOSTA + 3 botões export.
   Todos com mesmo gap (8px) entre si. PNGs reais (/icon-pdf.png, /icon-excel.png). */
.folha-rosto-cluster{
  display:flex;
  align-items:center;
  gap:8px;
  margin-left:auto; /* empurra o cluster para a direita do header */
}
.fr-export-btn{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:32px;
  height:32px;
  padding:4px;
  border:none;
  background:transparent;
  border-radius:6px;
  cursor:pointer;
  transition:background .12s, transform .08s;
  position:relative;
}
.fr-export-btn:hover{
  background:#F0F1F5;
  transform:translateY(-1px);
}
.fr-export-btn:active{ transform:translateY(0); }
.fr-export-btn img{
  display:block;
  width:100%;
  height:100%;
  object-fit:contain;
}
/* "Sem custos" — overlay × vermelho no canto superior direito */
.fr-export-btn--nocosts::after{
  content:"×";
  position:absolute;
  top:-2px;
  right:-2px;
  width:14px;
  height:14px;
  background:#D62E2E;
  color:#FFF;
  font-size:12px;
  font-weight:900;
  line-height:14px;
  text-align:center;
  border-radius:50%;
  border:1.5px solid #FFF;
  pointer-events:none;
}

/* ============================================================
   NOVA PROPOSTA — A1.1.d (2026-05-11)
   Caixa redesenhada com pill substituindo header + 6 secções
   ============================================================ */

.np-modal{
  width:min(720px, 95vw);
  max-width:720px;
  padding:0;
  /* Microalteração O (2026-05-11): overflow visible para que o dropdown do
     orçamentista possa sobrepor o limite do card (como calendário). */
  overflow:visible;
}

/* Header claro com pill rosinha à esquerda (microalteração #4 — 2026-05-11) */
.np-header{
  display:flex;
  align-items:center;
  gap:10px;
  background:#fff;
  padding:14px 20px;
  border-bottom:1px solid #EEEEEE;
}
.np-pill{
  display:inline-flex;
  align-items:baseline;       /* microalteração J (2026-05-11): baseline em vez de center */
  gap:10px;
  background:var(--red-soft);
  color:var(--red);
  padding:7px 14px;
  border-radius:18px;
  border:1px solid var(--red-line);
  max-width:calc(100% - 50px);
  line-height:1.2;
}
/* Microalteração J (2026-05-11): número e nome da obra com mesma tipografia
   (mesmo tamanho, weight, letter-spacing e baseline) para alinhamento limpo */
.np-pill-numero,
.np-pill-obra{
  font-family:var(--font);
  font-size:13px;
  font-weight:700;
  letter-spacing:1px;
  color:var(--red);
  text-transform:uppercase;
  white-space:nowrap;
}
.np-pill-obra{
  min-width:0;
  overflow:hidden;
  text-overflow:ellipsis;
}
.np-pill-placeholder{
  font-weight:400;
  opacity:0.55;
  font-style:italic;
  letter-spacing:0;
  text-transform:none;
}
.np-pill-x{
  background:transparent;
  border:none;
  color:var(--ink-3);
  cursor:pointer;
  font-size:18px;
  padding:4px 10px;
  border-radius:4px;
  margin-left:auto;
  transition:color 0.15s, background 0.15s;
}
.np-pill-x:hover{
  color:var(--red);
  background:var(--red-soft);
}

/* Body com secções empilhadas — overflow visible para dropdowns sobrepostos */
.np-body{
  padding:0;
  /* Microalteração O (2026-05-11): nunca scroll na caixa Nova Proposta */
  overflow:visible;
}
.np-section{
  padding:11px 20px;
  border-bottom:1px solid #EEEEEE;
}
.np-section:last-child{
  border-bottom:none;
}
.np-section-title{
  font-size:10px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:1px;
  color:var(--ink-3);
  margin:0 0 7px 0;
}

/* ============================================================
   Re-layout 3 linhas (microalteração H — 2026-05-11)
   ============================================================ */
.np-row{
  padding:11px 20px;
  border-bottom:1px solid #EEEEEE;
}
.np-row:last-child{ border-bottom:none; }
.np-label{
  font-size:10px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:1px;
  color:var(--ink-3);
  display:block;
  margin-bottom:5px;
}
.np-row--cols2{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:18px;
}
.np-row--cols2-wide{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:22px;
}
.np-col{
  display:flex;
  flex-direction:column;
  gap:10px;
}
.np-sub-pair{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:10px;
}

/* Orçamentista — trigger estilo select com seta (microalteração O — 2026-05-11)
   Aparência igual aos outros inputs/selects da caixa, com seta indicando que abre. */
.np-orc-relative{ position:relative; }
.np-orc-trigger{
  display:flex;
  align-items:center;
  gap:8px;
  padding:6px 10px;
  min-height:32px;
  background:#fff;
  border:1px solid #D1D5DB;
  border-radius:4px;
  cursor:pointer;
  font-family:var(--font);
  font-size:13px;
  text-align:left;
  width:100%;
  box-sizing:border-box;
  transition:border-color 0.15s;
}
.np-orc-trigger:hover{ border-color:var(--ink-3); }
.np-orc-trigger.is-open{
  border-color:var(--red);
  box-shadow:0 0 0 2px rgba(122,24,24,0.12);
}
.np-orc-nome{
  font-weight:500;
  color:var(--ink);
  flex:1;
  min-width:0;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.np-orc-nome--vazio{ color:var(--ink-3); font-style:italic; }
.np-orc-chevron{
  font-size:10px;
  color:var(--ink-3);
  flex-shrink:0;
  transition:transform 0.15s;
}
.np-orc-trigger.is-open .np-orc-chevron{ transform:rotate(180deg); }

/* Dropdown sobreposto — z-index alto para passar por cima de tudo */
.np-dropdown--over{
  position:absolute;
  top:calc(100% + 3px);
  left:0;
  right:0;
  z-index:1000;       /* acima do footer, sobrepõe completamente */
  background:#fff;
  border:1px solid #D1D5DB;
  border-radius:4px;
  box-shadow:0 6px 18px rgba(0,0,0,0.18);
  max-height:240px;
  overflow-y:auto;
}

/* Estado de erro — borda vermelha + mensagem inline */
.np-field--error input,
.np-field--error select,
.np-field--error textarea,
.np-field--error .np-orc-display{
  border-color:#DC2626;
  background:#FFFBFB;
}
.np-field-error{
  font-size:11px;
  color:#DC2626;
  margin-top:3px;
  font-weight:500;
}

/* ============================================================
   NovoClienteModal — Representantes (microalteração #6 — 2026-05-11)
   ============================================================ */
.nc-reps-list{
  display:flex;
  flex-direction:column;
  gap:6px;
  padding:6px;
  border:1px dashed #E5E7EB;
  border-radius:4px;
  background:#FAFAFA;
}
.nc-reps-empty{
  font-size:11px;
  color:var(--ink-3);
  font-style:italic;
  padding:4px 6px;
}
.nc-rep-card{
  display:flex;
  align-items:center;
  gap:8px;
  padding:7px 10px;
  background:#fff;
  border:1px solid #E5E7EB;
  border-radius:4px;
}
.nc-rep-info{ flex:1; min-width:0; }
.nc-rep-nome{
  font-size:13px;
  font-weight:600;
  color:var(--ink);
}
.nc-rep-meta{
  display:flex;
  gap:10px;
  font-size:11px;
  color:var(--ink-3);
  margin-top:2px;
}
.nc-rep-remove{
  background:transparent;
  border:none;
  cursor:pointer;
  color:var(--ink-3);
  font-size:14px;
  padding:2px 6px;
  border-radius:3px;
}
.nc-rep-remove:hover{ background:#FEE2E2; color:#DC2626; }
.nc-rep-form{
  padding:8px;
  background:#fff;
  border:1px solid #FBD9D9;
  border-radius:4px;
}
.nc-rep-form-grid{
  display:grid;
  grid-template-columns:1.4fr 1fr 1fr;
  gap:6px;
}
.nc-rep-form-grid input{
  width:100%;
  font-family:var(--font);
  font-size:12px;
  padding:5px 8px;
  border:1px solid #D1D5DB;
  border-radius:3px;
  box-sizing:border-box;
}
.nc-rep-form-actions{
  display:flex;
  gap:6px;
  justify-content:flex-end;
  margin-top:6px;
}
.nc-rep-add-btn{
  background:transparent;
  border:1px dashed var(--red-line);
  color:var(--red);
  cursor:pointer;
  font-size:12px;
  font-weight:600;
  padding:6px 10px;
  border-radius:4px;
  align-self:flex-start;
  transition:background 0.15s;
}
.nc-rep-add-btn:hover{ background:var(--red-soft); }

/* ============================================================
   Mini-pills inline (microalteração S — 2026-05-11)
   Versão menor do StatusPill para encaixar no campo de texto
   (categoria do cliente + natureza da obra). Cores NOVAS — não
   reutilizam paletas existentes da app.
   ============================================================ */
.mini-pill{
  display:inline-flex;
  align-items:center;
  gap:5px;
  font-family:var(--font);
  font-size:10px;
  font-weight:700;
  letter-spacing:0.6px;
  text-transform:uppercase;
  padding:3px 8px;
  border-radius:10px;
  border:1px solid transparent;
  cursor:pointer;
  white-space:nowrap;
  line-height:1.2;
  background:#F0EEEE;
  color:#7A7375;
  transition:filter 0.15s, box-shadow 0.15s;
}
.mini-pill::before{
  content:'';
  display:inline-block;
  width:5px;
  height:5px;
  border-radius:50%;
  background:currentColor;
  opacity:0.85;
  flex-shrink:0;
}
.mini-pill::after{
  content:'▾';
  font-size:8px;
  opacity:0.7;
  margin-left:1px;
}
.mini-pill:hover{ filter:brightness(0.96); box-shadow:0 1px 3px rgba(0,0,0,0.08); }
.mini-pill.is-open{ box-shadow:0 0 0 2px rgba(0,0,0,0.06); }
.mini-pill--seleccionar{ background:#EFEFEF; color:#8A8A8A; font-style:italic; }

/* Paleta CLIENTE CATEGORIA — tons amarelados/alaranjados (novas, nunca usadas)
   Microalteração U (2026-05-11): cliente_final dividido em particular+empresa. */
.mini-pill--cat-particular{         background:#FFFBE6; color:#A88300; border-color:#F4E08E; }
.mini-pill--cat-empresa{            background:#FFF6D0; color:#9B7400; border-color:#EFD37C; }
.mini-pill--cat-cliente_final{      background:#FFFBE6; color:#A88300; border-color:#F4E08E; } /* alias legacy = particular */
.mini-pill--cat-escritorios{        background:#FFEFC9; color:#946100; border-color:#F0C572; }
.mini-pill--cat-lojas_restauracao{  background:#FFE0B0; color:#854A00; border-color:#EFA858; }
.mini-pill--cat-outros{             background:#FFD49C; color:#7A3D00; border-color:#E89542; }

/* Paleta NATUREZA OBRA — tons roxos (novas, nunca usadas) */
.mini-pill--nat-obra_global{       background:#F2E8FA; color:#5A2B86; border-color:#CDB2E5; }
.mini-pill--nat-pinturas{          background:#ECDCF7; color:#6B2EA0; border-color:#C19BDF; }
.mini-pill--nat-montagens{         background:#E5D0F2; color:#5D2295; border-color:#B98CD9; }
.mini-pill--nat-manutencao{        background:#DDC2F0; color:#4F1B83; border-color:#AF7CD0; }
.mini-pill--nat-subempreitadas{    background:#D5B5ED; color:#43146E; border-color:#A56AC4; }
.mini-pill--nat-intermediacao{     background:#C9A2E5; color:#360F5C; border-color:#9B5EBC; }
.mini-pill--nat-especialidades{    background:#BF8FDE; color:#2A0B49; border-color:#8F4FB1; }
.mini-pill--nat-engenharia_gestao{ background:#A06CC9; color:#FFFFFF; border-color:#7F49A6; }

/* Wrapper relativo para o dropdown da mini-pill */
.mini-pill-wrap{ position:relative; display:inline-block; }
/* Microalteração V (2026-05-11): dropdown com position fixed + z-index altíssimo
   para nunca ficar tapado por outras zonas (problema do dropdown Natureza Obra
   que ficava por trás da caixa do Representante). Posicionado dinamicamente em JS. */
.mini-pill-dropdown{
  position:fixed;
  z-index:99999;
  background:#fff;
  border:1px solid #D1D5DB;
  border-radius:6px;
  box-shadow:0 6px 18px rgba(0,0,0,0.18);
  padding:4px;
  display:flex;
  flex-direction:column;
  gap:2px;
  /* width é setada via inline style — calculada em JS */
}
/* Botão-wrapper de cada opção — invisível, só serve como área de clique */
.mini-pill-option-btn{
  display:block;
  width:100%;
  background:transparent;
  border:none;
  padding:4px 6px;
  cursor:pointer;
  text-align:left;
  border-radius:4px;
}
.mini-pill-option-btn:hover{ background:#F5F6F8; }
.mini-pill-option-btn.is-active{ background:#F2F3F5; }
.mini-pill-option-btn.is-active .mini-pill{ box-shadow:0 0 0 2px rgba(0,0,0,0.08); }

/* Pill em si — garantir 1 linha + truncate quando aparece em sítios apertados */
.mini-pill{
  max-width:100%;
  overflow:hidden;
  text-overflow:ellipsis;
}

/* Caixa de input com pill alinhada à direita */
.np-input-with-pill{
  position:relative;
  display:flex;
  align-items:center;
}
.np-input-with-pill > input{
  padding-right:140px;  /* espaço para a pill */
}
.np-input-with-pill > .mini-pill-wrap{
  position:absolute;
  right:6px;
  top:50%;
  transform:translateY(-50%);
}

/* ============================================================
   InlineText — edição inline (A1.2 T1 — 2026-05-11)
   Sem botões, sem bordas. Click → input. Enter/blur grava. Escape cancela.
   ============================================================ */
.inline-text{
  cursor:text;
  display:inline;
  border-radius:3px;
  padding:1px 3px;
  margin:-1px -3px;
  transition:background 0.12s;
}
.inline-text:hover{ background:rgba(122,24,24,0.06); }
.inline-text-placeholder{ color:var(--ink-4); }

.inline-text-input{
  font:inherit;
  color:inherit;
  letter-spacing:inherit;
  text-transform:inherit;       /* T2.5 v3.2: respeita uppercase do parent (cap, nota interna) */
  font-style:inherit;            /* idem para itálico do banner de nota */
  background:rgba(122,24,24,0.05);
  border:none;
  outline:none;
  padding:1px 3px;
  margin:-1px -3px;
  border-radius:3px;
  width:auto;
  field-sizing:content;          /* T2.5 v3.2: cresce/diminui com o texto */
  min-width:160px;               /* área de click confortável mesmo vazio */
  max-width:100%;
  box-shadow:0 0 0 1px var(--red-line);
}
.inline-text-input:focus{
  box-shadow:0 0 0 2px rgba(122,24,24,0.25);
}
/* Modo block — input ocupa toda a largura (usado para morada).
   Anula o margin negativo do .inline-text-input base para que o box-shadow
   (que cria o efeito "bordas" rosa) fique exactamente alinhado com o container. */
.inline-text--block{ display:block; }
.inline-text-input--block{
  display:block;
  width:100%;
  box-sizing:border-box;
  margin:0;
  padding:2px 6px;
}

/* InlineClientePicker — dropdown abaixo do input inline (A1.2 T1 refactor) */
.inline-client-dropdown{
  position:fixed;
  z-index:99999;
  background:#fff;
  border:1px solid #D1D5DB;
  border-radius:6px;
  box-shadow:0 6px 18px rgba(0,0,0,0.18);
  padding:4px;
  display:flex;
  flex-direction:column;
  max-height:260px;
  overflow-y:auto;
}
.inline-picker-item{
  padding:6px 8px;
  font-size:13px;
  cursor:pointer;
  border-radius:4px;
}
.inline-picker-item:hover{ background:#F5F6F8; }
.inline-picker-item.is-active{ background:#F2F3F5; font-weight:700; }
.inline-picker-item--criar{
  color:var(--red);
  font-weight:600;
  background:var(--red-soft);
  margin-top:2px;
}
.inline-picker-item--criar:hover{ background:#FEE2E2; }

/* CondicoesEditor — fonte igual à .folha-rosto-morada (11px regular cinza).
   T3.5 (2026-05-11). align-items:flex-end (T3.9 — 2026-05-11) faz cada linha
   encolher ao conteúdo e ficar encostada à direita do bloco, sem espaço vazio. */
.cond-editor{
  display:flex;
  flex-direction:column;
  align-items:flex-end;
  font-family:var(--font);
  font-size:11px;
  font-weight:400;
  color:var(--ink-3);
  line-height:1.45;
}
.cond-editor-wrap{
  position:relative;
  display:flex;
  flex-direction:column;
  align-items:flex-end;
}
/* Cada linha encolhe ao seu próprio conteúdo — o parent align-items:flex-end
   alinha cada linha à direita do card, sem espaço vazio */
.cond-editor-row{
  display:flex;
  align-items:center;
  gap:8px;
  width:auto;
  position:relative;
}
.cond-editor-percent{
  min-width:36px;
  text-align:right;
}
.cond-editor-fase{
  flex:0 0 auto;
  min-width:0;
}
/* X só aparece em hover da linha — passa a ficar à ESQUERDA, fora do bloco
   (T3.7 — 2026-05-11) — não invade o espaço das parcelas */
.cond-editor-remove{
  position:absolute;
  left:-22px;
  top:50%;
  transform:translateY(-50%);
  background:transparent;
  border:none;
  cursor:pointer;
  color:var(--ink-3);
  padding:0;
  width:14px;
  height:14px;
  font-size:11px;
  line-height:1;
  border-radius:50%;
  opacity:0;
  transition:opacity 0.12s, background 0.12s, color 0.12s;
}
.cond-editor-row:hover .cond-editor-remove{ opacity:0.55; }
.cond-editor-remove:hover{ background:#FEE2E2; color:#DC2626; opacity:1; }
/* Gap entre linhas — zona clicável estendida para o "+" (T3.16 — 2026-05-11)
   margin/padding negativos esticam a zona de hover para a esquerda e em cima/baixo
   para o utilizador conseguir chegar facilmente ao botão. */
.cond-editor-gap{
  height:14px;
  position:relative;
  cursor:pointer;
  margin:-2px -2px -2px -28px;
  padding:2px 2px 2px 28px;
  align-self:stretch;
}
.cond-editor-add-gap{
  position:absolute;
  left:6px;
  top:50%;
  transform:translateY(-50%);
  width:16px;
  height:16px;
  border:1px solid var(--red-line);
  background:var(--red-soft);
  color:var(--red);
  font-size:12px;
  font-weight:700;
  line-height:1;
  padding:0;
  border-radius:50%;
  cursor:pointer;
  z-index:5;
  opacity:0;
  pointer-events:none;
  transition:opacity 0.12s;
}
/* T5.3: hover no gap mostra o botão — CSS puro, sem state JS (zero flicker) */
.cond-editor-gap:hover .cond-editor-add-gap{
  opacity:1;
  pointer-events:auto;
}
.cond-editor-add-gap:hover{
  background:#FEE2E2;
}

/* "Restante" alinhado mais à direita para colar à fase (T3.3) */
.cond-editor-percent--resto{
  text-align:right;
  padding-right:4px;
  font-style:italic;
  color:var(--ink-3);
}

/* (Fase outro foi substituída pelo combobox InlineFasePicker — T3.15) */

/* Modo livre — uma só caixa de texto "a combinar" + botão "+" à esquerda em hover (T3.14) */
.cond-editor--livre{
  position:relative;
  min-width:180px;
}
.cond-editor-livre-row{
  position:relative;
  min-width:180px;
  padding-left:22px;     /* zona clicável estendida à esquerda (mesmo padrão do gap) */
  margin-left:-22px;
}
.cond-editor-livre-row .inline-text{
  display:inline-block;
  min-width:140px;
  font-style:italic;
  color:var(--ink-3);
  text-align:left;        /* T3.16: placeholder "a combinar" à esquerda */
}
.cond-editor-add-livre{
  left:2px;
  opacity:0;
  pointer-events:none;
}
/* T5.6: hover no .cond-editor-livre-row mostra o + (CSS puro, sem state) */
.cond-editor-livre-row:hover .cond-editor-add-livre{
  opacity:1;
  pointer-events:auto;
}

/* Dialog textarea (microalteração K) */
.dlg-textarea{
  width:100%;
  font-family:var(--font);
  font-size:13px;
  padding:8px 10px;
  border:1px solid #D1D5DB;
  border-radius:4px;
  resize:vertical;
  min-height:60px;
  box-sizing:border-box;
}
.dlg-textarea:focus{
  outline:none;
  border-color:var(--red);
  box-shadow:0 0 0 2px rgba(122,24,24,0.12);
}

/* Fields */
.np-field{
  display:flex;
  flex-direction:column;
  min-width:0;
}
.np-field > label{
  font-size:12px;
  font-weight:500;
  color:var(--ink);
  margin-bottom:4px;
}
.np-field input,
.np-field textarea,
.np-field select{
  font-family:var(--font);
  font-size:13px;
  padding:6px 10px;
  border:1px solid #D1D5DB;
  border-radius:4px;
  background:#fff;
  color:var(--ink);
  width:100%;
  box-sizing:border-box;
}
.np-field textarea{
  resize:vertical;
  min-height:48px;
}
.np-field input:focus,
.np-field textarea:focus,
.np-field select:focus{
  outline:none;
  border-color:var(--red);
  box-shadow:0 0 0 2px rgba(122,24,24,0.12);
}
.np-required{
  color:var(--red);
  font-weight:700;
  margin-left:2px;
}

/* Grids */
.np-grid{
  display:grid;
  gap:10px;
}
.np-grid--2{ grid-template-columns:1fr 1fr; }
.np-grid--3{ grid-template-columns:2fr 70px 130px; }
.np-grid--obra{ grid-template-columns:2fr 1fr 1.4fr; }

/* Microalteração #4 (2026-05-11): caixa validade compacta — só cabe o número */
.np-field--narrow input[type="number"]{
  width:60px;
  text-align:center;
}

/* Dropdown autocomplete (cliente + orçamentista) */
.np-dropdown{
  position:absolute;
  top:100%;
  left:0;
  right:0;
  z-index:50;
  background:#fff;
  border:1px solid #D1D5DB;
  border-radius:4px;
  box-shadow:0 4px 12px rgba(0,0,0,0.1);
  max-height:200px;
  overflow-y:auto;
  margin-top:2px;
}
.np-dropdown-item{
  padding:7px 12px;
  cursor:pointer;
  font-size:13px;
  border-bottom:1px solid #F3F4F6;
}
.np-dropdown-item:last-child{ border-bottom:none; }
.np-dropdown-item:hover{ background:#F9FAFB; }
.np-dropdown-item--criar{
  color:var(--red);
  font-weight:600;
  background:#FFF5F5;
}
.np-dropdown-item--criar:hover{ background:#FEE2E2; }

/* Cliente seleccionado hint */
.np-cliente-ok{
  font-size:11px;
  color:#16A34A;
  margin-top:3px;
}

/* Footer */
.np-foot{
  display:flex;
  align-items:center;
  gap:8px;
  padding:11px 20px;
  border-top:1px solid #E5E7EB;
  background:#FAFAFA;
}
.np-foot-hint{
  font-size:11px;
  color:var(--ink-3);
}

/* ══════════════════════════════════════════════════════════════════════════
   FOLHA DE OBRA — T2.5 Fase E (2026-05-13).
   Toggle no canto superior direito do PropostaPanel + view alternativa
   com cards de resumo (custos, materiais, subempreiteiros, margens, gráficos).
   ══════════════════════════════════════════════════════════════════════════ */

/* Toggle Detalhe ↔ Folha de Obra — segmented control top-right */
.view-toggle-wrap{
  position:absolute;
  top:14px;
  right:14px;
  z-index:5;
  display:inline-flex;
  background:#fff;
  border:1px solid var(--line);
  border-radius:6px;
  padding:2px;
  box-shadow:0 1px 3px rgba(20,25,40,.05);
}
.view-toggle-pill{
  border:none;
  background:transparent;
  font-family:var(--font);
  font-size:11px;
  font-weight:700;
  color:var(--ink-3);
  padding:6px 12px;
  border-radius:4px;
  cursor:pointer;
  letter-spacing:.3px;
  text-transform:uppercase;
  transition:background .15s, color .15s;
}
.view-toggle-pill:hover{ color:var(--ink); }
.view-toggle-pill.is-active{
  background:var(--red);
  color:#fff;
}
/* Ícones Abrir Excel/pasta colados ao toggle (João 2026-05-18) */
.view-toggle-sep{
  width:1px;
  align-self:stretch;
  margin:3px 4px;
  background:var(--line);
}
.view-toggle-icon-btn{
  border:none;
  background:transparent;
  font-size:14px;
  line-height:1;
  padding:5px 7px;
  border-radius:4px;
  cursor:pointer;
  transition:background .15s, opacity .15s;
}
.view-toggle-icon-btn:hover{ background:var(--bg-2,#f1f1f4); }
.view-toggle-icon-btn:disabled{ opacity:.3; cursor:not-allowed; }
/* crm-detail-wrapper precisa de position:relative para o toggle absoluto ancorar */
.crm-detail-wrapper{ position:relative; }

/* Folha de Obra — scrollable container que ocupa todo o painel */
.folha-obra-scroll{
  height:100%;
  overflow-y:auto;
  padding:54px 18px 18px;   /* top maior para não passar por baixo do toggle */
}
.folha-obra-grid{
  display:grid;
  grid-template-columns:repeat(2, minmax(0, 1fr));
  gap:14px;
}
/* Cards de full-width (resumo, breakdown, fluxo, margens) ocupam as 2 colunas */
.folha-card--resumo,
.folha-card--custos,
.folha-card--fluxo,
.folha-card--margens{ grid-column:1 / -1; }
/* Top atividades + Materiais + Subs + Fornecedores ficam em 2 colunas */

@media (max-width:900px){
  .folha-obra-grid{ grid-template-columns:1fr; }
  .folha-card--resumo,
  .folha-card--custos,
  .folha-card--fluxo,
  .folha-card--margens{ grid-column:auto; }
}

/* Card base */
.folha-card{
  background:#fff;
  border:1px solid var(--line);
  border-radius:8px;
  padding:14px 16px;
  box-shadow:0 1px 3px rgba(20,25,40,.04);
}
.folha-card-title{
  font-size:10px;
  font-weight:800;
  letter-spacing:1.1px;
  text-transform:uppercase;
  color:var(--ink-4);
  margin-bottom:10px;
}
.folha-empty{
  font-size:12px;
  color:var(--ink-4);
  font-style:italic;
  padding:8px 0;
}
.folha-more{
  font-size:11px;
  color:var(--ink-4);
  margin-top:6px;
  text-align:right;
  font-style:italic;
}

/* ── Resumo Financeiro — big numbers em 4 cells ── */
.folha-resumo-grid{
  display:grid;
  grid-template-columns:repeat(4, 1fr);
  gap:12px;
}
.folha-resumo-cell{
  display:flex;
  flex-direction:column;
  gap:4px;
  padding:8px 0;
}
.folha-resumo-label{
  font-size:9.5px;
  font-weight:700;
  letter-spacing:.8px;
  text-transform:uppercase;
  color:var(--ink-4);
}
.folha-resumo-value{
  font-family:var(--font);
  font-weight:900;
  font-size:22px;
  color:var(--ink);
  font-variant-numeric:tabular-nums;
  letter-spacing:-.3px;
  line-height:1;
}
.folha-resumo-value--accent{ color:var(--red); }
.folha-resumo-value--ok{ color:#1F7A3D; }
.folha-resumo-value--bad{ color:#B91C1C; }
@media (max-width:600px){
  .folha-resumo-grid{ grid-template-columns:repeat(2, 1fr); }
}

/* ── Breakdown de custos — barra empilhada + legenda ── */
.folha-stack-bar{
  display:flex;
  width:100%;
  height:22px;
  border-radius:4px;
  overflow:hidden;
  background:#F4F5F8;
  margin-bottom:10px;
}
.folha-stack-seg{
  height:100%;
  min-width:2px;
  transition:filter .12s;
}
.folha-stack-seg:hover{ filter:brightness(.92); }
.folha-legend{
  display:grid;
  grid-template-columns:repeat(auto-fit, minmax(180px, 1fr));
  gap:6px 14px;
  font-size:11px;
}
.folha-legend-item{
  display:flex;
  align-items:center;
  gap:6px;
  font-variant-numeric:tabular-nums;
}
.folha-legend-dot{
  width:8px; height:8px;
  border-radius:50%;
  flex-shrink:0;
}
.folha-legend-label{
  color:var(--ink-2);
  font-weight:600;
  flex:1;
  min-width:0;
}
.folha-legend-value{
  color:var(--ink);
  font-weight:700;
}
.folha-legend-pct{
  color:var(--ink-4);
  min-width:42px;
  text-align:right;
}

/* ── Margem por capítulo — linha por cap com barra ── */
.folha-cap-list{ display:flex; flex-direction:column; gap:6px; }
.folha-cap-row{
  display:grid;
  grid-template-columns:minmax(160px, 1.4fr) 1fr auto;
  gap:12px;
  align-items:center;
  font-size:12px;
  padding:4px 0;
}
.folha-cap-info{ display:flex; align-items:center; gap:8px; min-width:0; }
.folha-cap-num{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  min-width:24px;
  height:18px;
  padding:0 4px;
  border-radius:3px;
  background:var(--red-soft);
  color:var(--red);
  font-size:10px;
  font-weight:800;
  font-variant-numeric:tabular-nums;
}
.folha-cap-tit{
  font-weight:600;
  color:var(--ink-2);
  text-transform:uppercase;
  letter-spacing:.3px;
  font-size:11px;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.folha-cap-bar-wrap{
  height:8px;
  background:#F4F5F8;
  border-radius:4px;
  overflow:hidden;
}
.folha-cap-bar{
  height:100%;
  border-radius:4px;
  transition:width .2s ease;
}
.folha-cap-bar--pos{ background:linear-gradient(90deg, #34A853 0%, #1F7A3D 100%); }
.folha-cap-bar--neg{ background:linear-gradient(90deg, #FCA5A5 0%, #B91C1C 100%); }
.folha-cap-vals{
  display:flex;
  gap:10px;
  font-variant-numeric:tabular-nums;
  font-size:11px;
  align-items:center;
}
.folha-cap-pct{
  font-weight:800;
  color:#1F7A3D;
  min-width:48px;
  text-align:right;
}
.folha-cap-pct.is-neg{ color:#B91C1C; }
.folha-cap-eur{
  color:var(--ink-3);
  min-width:80px;
  text-align:right;
}

/* ── Tabelas (atividades, materiais, subs) ── */
.folha-table{
  width:100%;
  border-collapse:collapse;
  font-size:11.5px;
}
.folha-table th{
  text-align:left;
  font-size:9.5px;
  font-weight:800;
  letter-spacing:.6px;
  text-transform:uppercase;
  color:var(--ink-4);
  padding:6px 8px 6px 0;
  border-bottom:1px solid var(--line);
}
.folha-table td{
  padding:6px 8px 6px 0;
  border-bottom:1px solid #F4F5F8;
  color:var(--ink-2);
  vertical-align:top;
}
.folha-table tr:last-child td{ border-bottom:none; }
.folha-table .folha-num{
  text-align:right;
  font-variant-numeric:tabular-nums;
  white-space:nowrap;
}
.folha-table .folha-muted{ color:var(--ink-4); }
.folha-table .is-neg{ color:#B91C1C; font-weight:700; }

/* ══════════════════════════════════════════════════════════════════════════
   FLUXO DE CAIXA — T2.5 Fase F (2026-05-13). Ferramenta inteligente de
   alocação de custos por parcela + cálculo de saldo + avisos.
   ══════════════════════════════════════════════════════════════════════════ */

.fluxo-scroll{
  height:100%;
  overflow-y:auto;
  padding:54px 18px 18px;
  display:flex;
  flex-direction:column;
  gap:14px;
}
.fluxo-empty-wrapper{
  height:100%;
  display:flex;
  align-items:center;
  justify-content:center;
  padding:18px;
}
.fluxo-empty{
  max-width:520px;
  background:#fff;
  border:1px solid var(--line);
  border-radius:8px;
  padding:22px 26px;
  text-align:center;
}
.fluxo-empty h3{
  margin:0 0 10px;
  font-size:14px;
  font-weight:800;
  letter-spacing:.4px;
  text-transform:uppercase;
  color:var(--ink);
}
.fluxo-empty p{
  margin:0;
  font-size:13px;
  color:var(--ink-2);
  line-height:1.5;
}

/* Header — resumo financeiro compacto */
.fluxo-header{
  display:flex;
  align-items:center;
  gap:24px;
  background:#fff;
  border:1px solid var(--line);
  border-radius:8px;
  padding:12px 16px;
}
.fluxo-header-block{
  display:flex;
  flex-direction:column;
  gap:3px;
}
.fluxo-header-label{
  font-size:9.5px;
  font-weight:700;
  letter-spacing:.7px;
  text-transform:uppercase;
  color:var(--ink-4);
}
.fluxo-header-value{
  font-family:var(--font);
  font-weight:900;
  font-size:17px;
  color:var(--ink);
  font-variant-numeric:tabular-nums;
  letter-spacing:-.2px;
  line-height:1;
}
.fluxo-header-value--accent{ color:var(--red); }
.fluxo-header-value.is-pos{ color:#1F7A3D; }
.fluxo-header-value.is-neg{ color:#B91C1C; }
.fluxo-reset-btn{
  margin-left:auto;
  background:#FAFBFC;
  border:1px solid var(--line);
  border-radius:5px;
  padding:7px 12px;
  font-size:11px;
  font-weight:700;
  color:var(--ink-2);
  cursor:pointer;
  letter-spacing:.3px;
  transition:background .12s, color .12s;
}
.fluxo-reset-btn:hover{
  background:var(--red-soft);
  color:var(--red);
}

/* Card base do Fluxo */
.fluxo-card{
  background:#fff;
  border:1px solid var(--line);
  border-radius:8px;
  padding:14px 16px;
  box-shadow:0 1px 3px rgba(20,25,40,.04);
}
.fluxo-card-title{
  font-size:10px;
  font-weight:800;
  letter-spacing:1.1px;
  text-transform:uppercase;
  color:var(--ink-4);
  margin-bottom:12px;
  display:flex;
  align-items:center;
  gap:10px;
}
.fluxo-card-hint{
  font-size:9.5px;
  font-weight:500;
  text-transform:none;
  letter-spacing:.2px;
  color:var(--ink-4);
  font-style:italic;
}

/* Timeline — barra empilhada com parcelas */
.fluxo-timeline{
  display:flex;
  width:100%;
  height:42px;
  border-radius:6px;
  overflow:hidden;
  border:1px solid var(--line);
  margin-bottom:10px;
}
.fluxo-timeline-seg{
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  color:#fff;
  font-family:var(--font);
  font-weight:800;
  letter-spacing:.3px;
  min-width:36px;
  transition:filter .12s;
}
.fluxo-timeline-seg:hover{ filter:brightness(.93); }
.fluxo-timeline-num{ font-size:10px; opacity:.85; }
.fluxo-timeline-pct{ font-size:12px; font-variant-numeric:tabular-nums; }
.fluxo-timeline-legend{
  display:grid;
  grid-template-columns:repeat(auto-fit, minmax(180px, 1fr));
  gap:6px 14px;
  font-size:11px;
}
.fluxo-timeline-leg{
  display:flex;
  align-items:center;
  gap:6px;
  color:var(--ink-2);
}
.fluxo-timeline-leg .fluxo-mono{
  margin-left:auto;
  font-weight:700;
  color:var(--ink);
}

/* Matriz Sector × Parcela — editável */
.fluxo-matrix-scroll{
  overflow-x:auto;
  margin:0 -16px;
  padding:0 16px;
}
.fluxo-matrix{
  width:100%;
  min-width:520px;
  border-collapse:collapse;
  font-size:11.5px;
}
.fluxo-matrix th,
.fluxo-matrix td{
  padding:6px 8px;
  text-align:left;
  vertical-align:middle;
  border-bottom:1px solid #F4F5F8;
}
.fluxo-matrix th{
  font-size:9.5px;
  font-weight:800;
  letter-spacing:.5px;
  text-transform:uppercase;
  color:var(--ink-4);
  border-bottom:1px solid var(--line);
}
.fluxo-matrix .fluxo-num{
  text-align:right;
  font-variant-numeric:tabular-nums;
  white-space:nowrap;
}
.fluxo-matrix-sector{
  display:flex;
  align-items:center;
  gap:8px;
  font-weight:700;
  color:var(--ink);
}
.fluxo-mono{ font-variant-numeric:tabular-nums; }
.fluxo-muted{ color:var(--ink-4); }

/* Célula editável: input + % + custo €  */
.fluxo-cell{
  position:relative;
  padding:6px 4px !important;
}
.fluxo-cell-input{
  width:42px;
  border:1px solid var(--line);
  border-radius:4px;
  padding:3px 5px;
  font-size:11.5px;
  font-weight:700;
  text-align:right;
  font-variant-numeric:tabular-nums;
  color:var(--ink);
  background:#FAFBFC;
  font-family:inherit;
  outline:none;
  transition:border-color .12s, background .12s;
  -moz-appearance:textfield;
}
.fluxo-cell-input::-webkit-outer-spin-button,
.fluxo-cell-input::-webkit-inner-spin-button{ -webkit-appearance:none; margin:0; }
.fluxo-cell-input:focus{
  border-color:var(--red);
  background:#fff;
}
.fluxo-cell-suffix{
  color:var(--ink-4);
  font-size:10px;
  margin-left:2px;
}
.fluxo-cell-eur{
  display:block;
  font-size:9.5px;
  color:var(--ink-4);
  font-weight:600;
  margin-top:2px;
  font-variant-numeric:tabular-nums;
}
.is-ok{ color:#1F7A3D; font-weight:700; }
.is-warn{ color:#B45309; font-weight:700; }

/* Tabela de resultado por parcela */
.fluxo-result-table{
  width:100%;
  border-collapse:collapse;
  font-size:12px;
}
.fluxo-result-table th{
  text-align:left;
  font-size:9.5px;
  font-weight:800;
  letter-spacing:.5px;
  text-transform:uppercase;
  color:var(--ink-4);
  padding:6px 8px;
  border-bottom:1px solid var(--line);
}
.fluxo-result-table td{
  padding:8px 8px;
  border-bottom:1px solid #F4F5F8;
  color:var(--ink-2);
}
.fluxo-result-table .fluxo-num{
  text-align:right;
  font-variant-numeric:tabular-nums;
}
.fluxo-result-table tr.is-warn{
  background:#FFF7ED;
}
.fluxo-result-total{
  background:#FAFBFC;
  font-weight:800;
}
.fluxo-result-total td{
  border-top:2px solid var(--ink);
  border-bottom:none;
  padding-top:10px;
}
.is-pos{ color:#1F7A3D; font-weight:700; }
.is-neg{ color:#B91C1C; font-weight:700; }

/* Avisos / alertas */
.fluxo-alerts{
  display:flex;
  flex-direction:column;
  gap:8px;
}
.fluxo-alert{
  border-radius:6px;
  padding:10px 14px;
  font-size:12px;
  line-height:1.45;
}
.fluxo-alert--warn{
  background:#FFF7ED;
  border:1px solid #FDBA74;
  color:#7C2D12;
}
.fluxo-alert--danger{
  background:#FEF2F2;
  border:1px solid #FCA5A5;
  color:#7F1D1D;
}

/* Hint final */
.fluxo-hint{
  font-size:11px;
  color:var(--ink-4);
  font-style:italic;
  padding:6px 4px;
  text-align:center;
}

/* ── Fluxo de Caixa: 2 lados (recebimentos / pagamentos) + saldo no rodapé ── */
.folha-fluxo-grid{
  display:grid;
  grid-template-columns:repeat(2, minmax(0, 1fr));
  gap:18px;
}
.folha-fluxo-side{
  display:flex;
  flex-direction:column;
  gap:8px;
  min-width:0;
}
.folha-fluxo-side-title{
  display:flex;
  align-items:center;
  gap:8px;
  font-size:11px;
  font-weight:800;
  letter-spacing:.6px;
  text-transform:uppercase;
  color:var(--ink-2);
}
.folha-fluxo-side-total{
  margin-left:auto;
  font-family:var(--font);
  font-weight:900;
  font-size:14px;
  color:var(--ink);
  font-variant-numeric:tabular-nums;
  text-transform:none;
  letter-spacing:0;
}
.folha-fluxo-arrow{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:18px;
  height:18px;
  border-radius:50%;
  font-size:11px;
  font-weight:900;
  line-height:1;
}
.folha-fluxo-arrow--in{ background:#E6F4EA; color:#1F7A3D; }
.folha-fluxo-arrow--out{ background:#FFE4E4; color:#B91C1C; }
.folha-fluxo-list{
  display:flex;
  flex-direction:column;
  gap:5px;
}
.folha-fluxo-row{
  display:grid;
  grid-template-columns:8px 1fr auto auto;
  gap:8px;
  align-items:center;
  font-size:11.5px;
  color:var(--ink-2);
  padding:3px 0;
}
.folha-fluxo-label{
  font-weight:600;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.folha-fluxo-pct{
  color:var(--ink-4);
  font-variant-numeric:tabular-nums;
  font-weight:700;
  min-width:36px;
  text-align:right;
}
.folha-fluxo-eur{
  color:var(--ink);
  font-variant-numeric:tabular-nums;
  font-weight:700;
  min-width:78px;
  text-align:right;
}
/* Saldo previsto — rodapé com cor consoante positivo/negativo */
.folha-fluxo-saldo{
  grid-column:1 / -1;
  display:flex;
  align-items:center;
  justify-content:space-between;
  padding:10px 12px;
  margin-top:4px;
  background:#FAFBFC;
  border:1px dashed var(--line);
  border-radius:6px;
}
.folha-fluxo-saldo-label{
  font-size:10px;
  font-weight:800;
  letter-spacing:.8px;
  text-transform:uppercase;
  color:var(--ink-3);
}
.folha-fluxo-saldo-value{
  font-family:var(--font);
  font-weight:900;
  font-size:18px;
  font-variant-numeric:tabular-nums;
  letter-spacing:-.2px;
}
.folha-fluxo-saldo-value.is-pos{ color:#1F7A3D; }
.folha-fluxo-saldo-value.is-neg{ color:#B91C1C; }

@media (max-width:600px){
  .folha-fluxo-grid{ grid-template-columns:1fr; }
}

/* T2.5 it2 (2026-05-13): botões PDF interno na Folha de Obra e Fluxo de Caixa.
   Visual discreto (botão vermelho-secundário), alinhado com a paleta da app. */
.folha-obra-toolbar{
  display:flex;
  justify-content:flex-end;
  padding:8px 16px 0;
}
.folha-pdf-btn,
.fluxo-pdf-btn{
  display:inline-flex;
  align-items:center;
  gap:6px;
  padding:6px 14px;
  font-size:12px;
  font-weight:700;
  letter-spacing:.2px;
  background:#fff;
  color:#B91C1C;
  border:1px solid #FCA5A5;
  border-radius:8px;
  cursor:pointer;
  font-family:inherit;
  transition:background .12s, border-color .12s;
}
.folha-pdf-btn:hover,
.fluxo-pdf-btn:hover{
  background:#FEE2E2;
  border-color:#B91C1C;
}
.fluxo-pdf-btn{ margin-left:6px; }

/* ───────────────────────────────────────────────────────────────────────────
   T2.5 Precificação v3.3 (2026-05-14) — drawer "Status" compacto.
   Card à direita da ATV com:
     - MiniPill (com bolinha à esquerda + dropdown em portal) para escolher
       estado: Aberto / Aguarda cotação / Dúvida / Fechado.
     - Botão "+ NOTA" estilo PROPOSTA pill rosa.
   Sem botão X (fecha-se com botão direito na ATV).
   Suporta múltiplas notas internas (NOTA INTERNA 1/2/...).
   Quando o drawer está aberto, a nota cliente sobe para banner próprio
   acima do nome (volta ao normal ao fechar).
   ─────────────────────────────────────────────────────────────────────────── */

.atv-row-wrap{ display:contents; }
.atv-row-wrap--open{
  display:grid;
  column-gap:8px;
  align-items:stretch;
  animation:atvRowWrapOpen .14s ease-out;
}
/* T2.5 v3.9k: layout depende de QUAIS drawers estão abertos.
   --status (lateral) → coluna direita 194px para o card Status.
   --bottom (Materiais etc.) → row 2 ocupa toda a largura.
   Quando só --bottom (sem --status), 1 coluna apenas. */
/* João 2026-05-18: atividade encolhe a 60% (alinha com a borda do card
   Materiais / MO em baixo); Status e Resumo iguais (20% + 20% = 40%). */
.atv-row-wrap--status{
  grid-template-columns:6fr 2fr 2fr;
}
.atv-row-wrap--bottom:not(.atv-row-wrap--status){
  grid-template-columns:1fr;
}
@keyframes atvRowWrapOpen{
  from{ opacity:0; transform:translateY(-2px); }
  to{ opacity:1; transform:none; }
}
body.dnd-active .atv-row-wrap--open{ display:contents; animation:none; }
body.dnd-active .atv-status-card{ display:none; }

.atv-row-wrap--open > .atv-card{ grid-column:1; min-width:0; }

/* ─── Card Status — layout centrado horizontal e vertical ──────────────── */
.atv-status-card{
  position:relative;
  background:#fff;
  border:1px solid var(--line);
  border-radius:8px;
  padding:6px 10px 8px 10px;
  display:flex;
  flex-direction:column;
  align-items:center;
  gap:0;
  align-self:stretch;
  text-align:center;
}
.atv-status-card-titulo{
  font-size:9px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.5px;
  color:var(--ink-3);
  flex:0 0 auto;
}
/* margin auto 0 + flex column → centra os controls verticalmente no espaço
   restante, mantendo o título "STATUS" no topo. Funciona seja qual for a
   altura final do card (card alto = atv multi-linha → mais espaço sobra). */
.atv-status-card-controls{
  display:flex;
  flex-direction:column;
  gap:7px;
  align-items:center;
  justify-content:center;
  margin:auto 0;
}

/* MiniPill custom para status de orçamentação. Reutiliza .mini-pill base
   (estilos no styles.css mais acima) mas ganha 4 modificadores --statusorc-X
   com background e cor pastel + bolinha currentColor à esquerda via ::before. */
.mini-pill--statusorc-aberto         { background:#FFF3D9; color:#A77400; border:1px solid #F5DDA8; }
.mini-pill--statusorc-aguarda_cotacao{ background:#E8F1FE; color:#1E4D8C; border:1px solid #C9DAF5; }
.mini-pill--statusorc-duvida         { background:#FEE2E2; color:#DC2626; border:1px solid #FBC7C7; }
.mini-pill--statusorc-fechado        { background:#DFF5E6; color:#1F7A3D; border:1px solid #B7E2C5; }
.mini-pill[class*="mini-pill--statusorc-"]::before{
  content:'';
  display:inline-block;
  width:6px; height:6px;
  border-radius:50%;
  background:currentColor;
  margin-right:6px;
  flex-shrink:0;
  opacity:.95;
}

/* Botão NOTA — visual da pill rosa "PROPOSTA Vxxx" (.folha-rosto-tag) */
.atv-status-nota-btn{
  font-size:11px;
  font-weight:800;
  color:var(--red);
  letter-spacing:1.4px;
  text-transform:uppercase;
  padding:3px 9px;
  background:var(--red-soft);
  border:1.5px solid var(--red-line);
  border-radius:5px;
  white-space:nowrap;
  cursor:pointer;
  font-family:inherit;
  transition:background .12s, border-color .12s;
}
.atv-status-nota-btn:hover{ background:#fff; border-color:var(--red); }
.atv-status-nota-btn.is-active{ background:#fff; border-color:var(--red); }

/* ─── Card Resumo — ao lado do Status (João 2026-05-18) ──────────────── */
.atv-resumo-card{
  position:relative;
  background:#fff;
  border:1px solid var(--line);
  border-radius:8px;
  padding:6px 8px 8px;
  display:flex;
  flex-direction:column;
  align-self:stretch;
  min-width:0;
  font-variant-numeric:tabular-nums;
}
.atv-resumo-titulo{
  font-size:9px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.5px;
  color:var(--ink-3);
  text-align:center;
  margin-bottom:5px;
  flex:0 0 auto;
}
.rsm-body{ display:flex; flex-direction:column; gap:4px; min-width:0; }
.rsm-in-row{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:6px;
}
.rsm-in-lbl{
  font-size:9px;
  font-weight:700;
  letter-spacing:.4px;
  text-transform:uppercase;
  color:#8A93A2;
}
.rsm-body .mat-input-wrap.rsm-in,
.rsm-body .rsm-in{
  width:74px;
  background:#F3F6FB;
  border:1px solid #D8E1EF;
  border-radius:4px;
  padding:1px 3px;
}
.rsm-body .mat-input-wrap.rsm-in--sm{ width:62px; }
.rsm-body .rsm-in:focus-within{
  border-color:#1E4D8C; background:#fff;
  box-shadow:0 0 0 2px rgba(30,77,140,.14);
}
.rsm-body .rsm-in .mat-input{ font-size:11px; font-weight:700; color:#1F2937; }
.rsm-outros-desc{
  font-size:10px;
  color:#6b7280;
  background:transparent;
  border:0;
  border-bottom:1px dotted #D8E1EF;
  padding:1px 2px;
  width:100%;
}
.rsm-outros-desc:focus{ border-bottom-color:#1E4D8C; outline:none; }
.rsm-list{
  display:flex;
  flex-direction:column;
  margin-top:3px;
  border-top:1px solid #EAECEF;
  padding-top:3px;
}
.rsm-li{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:6px;
  padding:2.5px 0;
  font-size:10.5px;
  border-bottom:1px solid #F1F3F5;
}
.rsm-li:last-child{ border-bottom:0; }
.rsm-li-k{ color:#6b7280; }
.rsm-li-v{ font-weight:700; color:#1F2937; white-space:nowrap; }
.rsm-li-v small{
  margin-left:5px; font-weight:600; color:#9AA4B2; font-size:9.5px;
}
.rsm-li--strong .rsm-li-k{ font-weight:700; color:#374151; }
.rsm-li--strong .rsm-li-v{ color:#111827; }
.rsm-li--total{
  margin-top:2px;
  border-top:1px solid #D2E0F2;
  border-bottom:0;
  padding-top:5px;
}
.rsm-li--total .rsm-li-k{ font-weight:800; text-transform:uppercase;
  letter-spacing:.4px; font-size:9px; color:#1E4D8C; }
.rsm-li--total .rsm-li-v{ font-size:14px; font-weight:800; color:#1E4D8C; }
.rsm-li--mtot .rsm-li-v{ color:#1F7A3D; }
/* Labels clicáveis (Amortizar / Margem↔Preço) */
.rsm-toggle{
  font-size:9px;
  font-weight:800;
  letter-spacing:.4px;
  text-transform:uppercase;
  color:#8A93A2;
  background:#F1F3F5;
  border:1px solid #E2E5E9;
  border-radius:4px;
  padding:2px 6px;
  cursor:pointer;
  font-family:inherit;
  transition:background .12s, color .12s, border-color .12s;
}
.rsm-toggle:hover{ border-color:#1E4D8C; color:#1E4D8C; }
.rsm-toggle.is-on{
  background:#1E4D8C; color:#fff; border-color:#1E4D8C;
}
.rsm-li--amort .rsm-toggle.is-on{
  background:#1F7A3D; border-color:#1F7A3D;
}
.rsm-off{ color:#B45309; font-style:normal; font-weight:600; }

/* João 2026-05-18: Status + Resumo NÃO esticam a linha. Alinham ao topo
   e o Resumo rola por dentro se for preciso (a linha fica compacta,
   como quando só havia o Status). */
.atv-row-wrap--status{ align-items:start; }
.atv-row-wrap--status > .atv-status-card,
.atv-row-wrap--status > .atv-resumo-card{
  align-self:start;
  max-height:300px;
}
.atv-resumo-card .rsm-body{
  overflow-y:auto;
  min-height:0;
}

/* ─── Gestor de Amortização (topo, ao lado das ações) ─────────────────── */
.amort-panel{
  display:flex;
  flex-direction:column;
  gap:4px;
  padding:6px 9px;
  background:#F7F9FC;
  border:1px solid #DCE4F0;
  border-radius:8px;
  min-width:168px;
  font-variant-numeric:tabular-nums;
}
.amort-head{
  display:flex;
  align-items:baseline;
  justify-content:space-between;
  gap:10px;
  border-bottom:1px solid #DCE4F0;
  padding-bottom:3px;
}
.amort-title{
  font-size:9px;
  font-weight:800;
  letter-spacing:.6px;
  text-transform:uppercase;
  color:#1E4D8C;
}
.amort-total{
  font-size:13px;
  font-weight:800;
  color:#1E4D8C;
}
.amort-rows{ display:flex; flex-direction:column; gap:3px; }
.amort-row{
  display:flex;
  align-items:center;
  gap:6px;
}
.amort-setor{
  flex:1 1 auto;
  font-size:10px;
  font-weight:600;
  color:#5b6472;
  white-space:nowrap;
}
.amort-panel .mat-input-wrap.amort-in{
  width:68px;
  background:#fff;
  border:1px solid #CFDAEC;
  border-radius:4px;
  padding:1px 3px;
}
.amort-panel .amort-in:focus-within{
  border-color:#1E4D8C; box-shadow:0 0 0 2px rgba(30,77,140,.14);
}
.amort-panel .amort-in .mat-input{ font-size:11px; font-weight:700; color:#1F2937; }
.amort-del{
  border:0; background:transparent; color:#9AA4B2;
  cursor:pointer; font-size:10px; line-height:1; padding:2px;
  opacity:0; transition:opacity .12s, color .12s;
}
.amort-row:hover .amort-del{ opacity:.8; }
.amort-del:hover{ opacity:1; color:#8B0000; }
/* "+" e menu de setores — aparece no hover do painel */
.amort-add-wrap{ position:relative; }
.amort-add{
  border:1px dashed #B7C6DF;
  background:transparent;
  color:#1E4D8C;
  font-size:9.5px;
  font-weight:700;
  letter-spacing:.3px;
  padding:2px 8px;
  border-radius:4px;
  cursor:pointer;
  font-family:inherit;
  opacity:.35;
  transition:opacity .12s, background .12s;
}
.amort-panel:hover .amort-add{ opacity:1; }
.amort-add:hover{ background:#E8F1FE; }
.amort-add-menu{
  position:absolute;
  top:100%;
  left:0;
  margin-top:3px;
  background:#fff;
  border:1px solid #CFDAEC;
  border-radius:6px;
  box-shadow:0 6px 18px rgba(20,25,40,.14);
  padding:3px;
  display:none;
  flex-direction:column;
  gap:1px;
  z-index:30;
  min-width:120px;
}
.amort-add-wrap:hover .amort-add-menu,
.amort-add:focus + .amort-add-menu,
.amort-add-menu:hover{ display:flex; }
.amort-add-opt{
  text-align:left;
  border:0;
  background:transparent;
  font-size:11px;
  font-weight:600;
  color:#374151;
  padding:5px 8px;
  border-radius:4px;
  cursor:pointer;
  font-family:inherit;
}
.amort-add-opt:hover{ background:#E8F1FE; color:#1E4D8C; }

/* ─── Sombreado da linha ATV conforme status (mais visível que v3.2) ──── */
.atv-card--status-aberto         { background:linear-gradient(to right, rgba(245,158,11,0.18), rgba(245,158,11,0.06) 65%, transparent); }
.atv-card--status-aguarda_cotacao{ background:linear-gradient(to right, rgba(37,99,235,0.18), rgba(37,99,235,0.06) 65%, transparent); }
.atv-card--status-duvida         { background:linear-gradient(to right, rgba(220,38,38,0.18), rgba(220,38,38,0.06) 65%, transparent); }
.atv-card--status-fechado        { background:linear-gradient(to right, rgba(21,128,61,0.18), rgba(21,128,61,0.06) 65%, transparent); }
/* Hover preserva o sombreado de status (em vez do reset cinza global) */
.atv-card--status-aberto:hover         { background:linear-gradient(to right, rgba(245,158,11,0.24), rgba(245,158,11,0.08) 65%, rgba(0,0,0,0.02)); }
.atv-card--status-aguarda_cotacao:hover{ background:linear-gradient(to right, rgba(37,99,235,0.24), rgba(37,99,235,0.08) 65%, rgba(0,0,0,0.02)); }
.atv-card--status-duvida:hover         { background:linear-gradient(to right, rgba(220,38,38,0.24), rgba(220,38,38,0.08) 65%, rgba(0,0,0,0.02)); }
.atv-card--status-fechado:hover        { background:linear-gradient(to right, rgba(21,128,61,0.24), rgba(21,128,61,0.08) 65%, rgba(0,0,0,0.02)); }

/* ─── Cards 50/50 abaixo da ATV — T2.5 v3.8 (2026-05-14) ────────────────
   Quando o drawer está aberto, a row vira grid com a 2ª "row" a conter um
   container que ocupa as duas colunas (1 / -1). Esse container divide em
   50/50: esquerda = Materiais; direita = stack vertical de sectores. Cada
   header tem cor própria; o body é placeholder para preencher depois. */
.atv-row-wrap--open{
  grid-template-rows:auto auto;       /* row 1 = atv+status; row 2 = bottom */
}
.atv-drawer-bottom{
  grid-column:1 / -1;
  grid-row:2;
  display:grid;
  grid-template-columns:6fr 4fr;     /* João 2026-05-18: 60/40 — direita
                                        com largura p/ ver MO + subs */
  gap:8px;
  margin-top:6px;
}
/* João 2026-05-18: altura maior p/ caber resumo MO + linha toda dos subs. */
.atv-sector-card--materiais{ height:340px; }
.atv-sector-right{
  height:340px;
  display:flex;
  flex-direction:column;
  gap:4px;
  min-width:0;
}
.atv-sector-right > .atv-sector-card{
  flex:1 1 0;
  min-height:0;
}
.atv-sector-card{
  background:#fff;
  border:1px solid var(--line);
  border-radius:6px;
  overflow:hidden;
  display:flex;
  flex-direction:column;
}
.atv-sector-header{
  padding:5px 10px;
  font-size:10px;
  font-weight:800;
  letter-spacing:.7px;
  text-transform:uppercase;
  line-height:1.4;
  border-bottom:1px solid var(--line);
  display:flex;
  align-items:center;
  justify-content:space-between;
  flex-shrink:0;
}
.atv-sector-header-title{ flex:1; }
/* Botões de acção no header de cada sector (ex: copy/paste materiais). */
.atv-sector-header-actions{
  display:inline-flex;
  align-items:center;
  gap:4px;
  flex-shrink:0;
}
.atv-sector-actbtn{
  width:20px;
  height:20px;
  padding:0;
  border-radius:3px;
  border:1px solid currentColor;
  background:transparent;
  color:inherit;
  font-size:13px;
  line-height:1;
  cursor:pointer;
  opacity:.7;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  font-family:inherit;
  transition:opacity .12s, background .12s;
}
.atv-sector-actbtn:hover:not(:disabled){ opacity:1; background:rgba(0,0,0,0.08); }
.atv-sector-actbtn:disabled{ opacity:.25; cursor:not-allowed; }
/* Conteúdo compacto dos sub-cards da direita (MO/Subs/Logística/Resumo/Amort/Div).
   Cada um ~46px de altura — header 22 + body 24px. */
.sec-body{
  padding:4px 8px !important;
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:6px;
  font-size:11px;
  min-height:0;
}
.sec-body--readonly{ color:var(--ink-2); }
.sec-body--cols{ justify-content:space-around; gap:4px; }
.sec-input{
  width:56px !important;
  font-size:11px !important;
  padding:1px 3px !important;
  background:#F3F4F6;
  border-radius:3px;
}
.sec-input--wide{ width:74px !important; }
.sec-tag{
  font-size:9.5px;
  font-weight:700;
  color:var(--ink-4);
  background:#F3F4F6;
  border-radius:3px;
  padding:1px 5px;
  text-transform:uppercase;
  letter-spacing:.3px;
  flex-shrink:0;
}
.sec-cost{
  font-size:11.5px;
  font-weight:700;
  color:var(--ink);
  font-variant-numeric:tabular-nums;
  margin-left:auto;
}
.sec-cost--solo{ margin:0 auto; }
.sec-pair{
  display:flex;
  flex-direction:column;
  align-items:center;
  gap:0;
  line-height:1.1;
}
.sec-pair-label{
  font-size:8.5px;
  text-transform:uppercase;
  color:var(--ink-4);
  letter-spacing:.4px;
}
.sec-pair-val{
  font-size:10.5px;
  font-weight:700;
  color:var(--ink-2);
  font-variant-numeric:tabular-nums;
}
.sec-pair-val--strong{ color:var(--ink); font-weight:800; }

.atv-sector-add{
  width:18px;
  height:18px;
  padding:0;
  border-radius:50%;
  border:1px solid currentColor;
  background:transparent;
  color:inherit;
  font-weight:700;
  font-size:13px;
  line-height:1;
  cursor:pointer;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  opacity:.7;
  transition:opacity .12s, background .12s;
}
.atv-sector-add:hover{ opacity:1; background:rgba(0,0,0,0.06); }
.atv-sector-body{
  padding:8px 10px;
  font-size:12px;
  color:var(--ink-3);
  flex:1 1 auto;
  min-height:0;
}
.atv-sector-body--placeholder{
  background:repeating-linear-gradient(45deg, transparent, transparent 6px, rgba(0,0,0,0.025) 6px, rgba(0,0,0,0.025) 7px);
}

/* ─── Tabela Materiais (T2.5 v3.8) ───────────────────────────────────────
   Grid de 7 colunas: descrição (1fr), un, qtd, desp%, €/un, total, ×.
   Header com labels cinza pequenas; rows com inputs minimalistas;
   footer com subtotal alinhado à direita. */
.mat-table{
  flex:1 1 auto;
  display:flex;
  flex-direction:column;
  min-height:0;
  overflow:hidden;
}
/* T2.5 v3.9d (2026-05-14): tabela com 6 colunas (Desp% movido para popover
   no hover da unidade). Material 70%, tudo CENTRADO excepto nome/fornecedor.
   Cabeçalho segue o alinhamento do conteúdo. */
.mat-row{
  display:grid;
  grid-template-columns:1fr 150px 116px 88px 100px 42px;
  gap:6px;
  align-items:center;
  padding:2px 8px;
  min-height:24px;
}
.mat-row--head{
  font-size:9px;
  font-weight:700;
  color:var(--ink-4);
  text-transform:uppercase;
  letter-spacing:.4px;
  border-bottom:1px solid var(--line);
  background:#FAFBFC;
  padding-top:4px;
  padding-bottom:4px;
  min-height:22px;
  position:sticky;
  top:0;
  z-index:2;
}
.mat-row--head > span{ text-align:center; }
.mat-row--head .mat-c-nome{ text-align:left; }
/* T2.5 v3.9i: dados numéricos com valor à direita (encosta no sufixo).
   Header dos números também à direita para alinhar com o conteúdo. */
.mat-row--data .mat-c-rend,
.mat-row--data .mat-c-qtd,
.mat-row--data .mat-c-eur,
.mat-row--data .mat-c-total{
  justify-self:stretch;
}
.mat-row--head .mat-c-rend,
.mat-row--head .mat-c-qtd,
.mat-row--head .mat-c-eur,
.mat-row--head .mat-c-total{
  text-align:right;
  padding-right:4px;
}
.mat-tbody{
  flex:1 1 auto;
  overflow-y:auto;
  min-height:0;
}
/* Linhas — altura mínima ~36px mas crescem automaticamente quando o nome
   ou fornecedor é longo (textarea auto-resize). */
.mat-row--data{
  border-bottom:1px solid #F1F2F4;
  transition:background .12s;
  min-height:36px;
  align-items:stretch;
}
.mat-row--data:hover{ background:#FAFBFC; }
.mat-row--data:last-child{ border-bottom:none; }
.mat-nome-stack{
  display:flex;
  flex-direction:column;
  gap:0;
  min-width:0;
  align-self:stretch;
  justify-content:center;
}
.mat-input--nome{
  font-size:12px;
  font-weight:600;
  color:var(--ink);
  padding:2px 4px;
  /* Textarea auto-resize: sem scroll, sem resize handle, quebra natural. */
  resize:none;
  overflow:hidden;
  white-space:pre-wrap;
  word-break:break-word;
  line-height:1.3;
  font-family:inherit;
}
/* T2.5 v3.9c (2026-05-14): Fornecedor SEMPRE escondido por defeito.
   Só aparece quando a linha está em hover OU o input tem foco.
   T2.5 v3.9k (2026-05-14): se está preenchido (placeholder não shown), fica
   em bordô-vinho; vazio = cinzento. */
.mat-input--forn{
  font-size:10.5px;
  color:var(--ink-4);
  padding:0 4px;
  font-style:italic;
  font-weight:500;
  display:none;
}
.mat-input--forn:not(:placeholder-shown){
  color:var(--red);
  font-weight:600;
}
.mat-row--data:hover .mat-input--forn,
.mat-input--forn:focus{
  display:block;
}
.mat-input--forn::placeholder{
  color:var(--ink-4);
  opacity:.55;
  font-style:italic;
}
/* v3.12i (2026-05-15): valor "Genérico N" → cinzento como o default. */
.mat-input--forn-generico:not(:placeholder-shown){
  color:var(--ink-4) !important;
  font-style:italic !important;
  font-weight:500 !important;
}
/* T2.5 v3.11 (2026-05-15): MaterialNomeInput — wrapper + dropdown de
   auto-complete de materiais da BD. Aparece em foco quando há sugestões.
   O wrapper é position:relative para o dropdown se ancorar mesmo abaixo
   do textarea (que cresce em altura quando o nome é longo). */
.mat-nome-wrapper{
  position:relative;
  display:flex;
  flex-direction:column;
  min-width:0;
  width:100%;
}
.mat-nome-dropdown{
  /* T2.5 v3.11b (2026-05-15): position:fixed + portal ao body → escapa do
     overflow:hidden do card materiais. left/top/minWidth vêm inline do React.
     v3.12g: largura cresce com o texto (max-content) — nunca trunca. */
  position:fixed;
  z-index:2000;
  width:max-content;
  max-width:600px;
  background:#fff;
  border:1px solid var(--ink-6, #d6d9dd);
  border-radius:6px;
  box-shadow:0 8px 24px rgba(20,24,33,.22);
  padding:3px 0;
  /* João 2026-05-19: mais alto + scroll — mostra até 30 resultados da
     busca partilhada (acentos/palavras-chave/erros) sem cortar. */
  max-height:340px;
  overflow-y:auto;
  font-size:12px;
}
.mat-nome-dropdown-item{
  display:flex;
  align-items:center;
  gap:8px;
  padding:5px 9px;
  cursor:pointer;
  color:var(--ink);
  line-height:1.25;
}
.mat-nome-dropdown-item.is-active,
.mat-nome-dropdown-item:hover{
  background:rgba(166,38,57,.08);
}
.mat-nome-dropdown-nome{
  flex:1 1 auto;
  font-weight:500;
  white-space:nowrap;
}
.mat-nome-dropdown-un{
  flex:0 0 auto;
  font-size:10.5px;
  font-weight:600;
  color:var(--ink-4);
  text-transform:uppercase;
  letter-spacing:.04em;
  background:var(--bg-2, #f3f4f6);
  padding:1px 6px;
  border-radius:3px;
}
/* v3.12h (2026-05-15): grupos no dropdown de fornecedor —
 *  relacionados (estrela) vs outros. */
.mat-nome-dropdown-group{ padding:2px 0; }
.mat-nome-dropdown-group + .mat-nome-dropdown-group{ border-top:1px solid #f1f5f9; }
.mat-nome-dropdown-grouptitle{
  font-size:10px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.08em;
  color:#7c3aed;
  padding:3px 9px 2px;
  background:#faf5ff;
}
.mat-nome-dropdown-grouptitle--outros{
  color:var(--ink-4);
  background:transparent;
}
.mat-nome-dropdown-item--rel{
  background:#fdfaff;
}
.mat-nome-dropdown-item--rel:hover,
.mat-nome-dropdown-item--rel.is-active{
  background:rgba(124,58,237,.10);
}
.mat-nome-dropdown-preco{
  flex:0 0 auto;
  font-size:11px;
  font-weight:700;
  color:#047857;
  font-variant-numeric:tabular-nums;
  background:#ecfdf5;
  padding:1px 6px;
  border-radius:3px;
}
/* v3.12i (2026-05-15): item "+ Criar novo fornecedor: XYZ" no fundo do dropdown */
.mat-nome-dropdown-item--novo{
  border-top:1px dashed #e5e7eb;
  background:#fefce8;
}
.mat-nome-dropdown-item--novo:hover,
.mat-nome-dropdown-item--novo.is-active{
  background:#fef9c3;
}
.mat-nome-dropdown-novo{
  font-size:10.5px;
  font-weight:700;
  color:#a16207;
  text-transform:uppercase;
  letter-spacing:.06em;
  flex-shrink:0;
}
/* T2.5 v3.9d (2026-05-14): célula Quantidade — input + unidade clicável.
   A unidade abre popover (hover/focus) com edit de desperdício, unidade
   (se !bdId), e preview de qtd real. Se desp > 0, mostra "real: X" por baixo. */
.mat-qtd-cell{
  display:flex;
  flex-direction:column;
  align-items:stretch;
  gap:1px;
  min-width:0;
}
.mat-qtd-row{
  display:flex;
  align-items:center;
  gap:3px;
  justify-content:flex-end;
}
.mat-qtd-num{
  flex:1 1 auto;
  min-width:0;
}
.mat-qtd-real{
  font-size:9.5px;
  font-style:italic;
  color:var(--red);
  font-weight:600;
  text-align:center;
  letter-spacing:.2px;
  line-height:1.1;
}
/* Trigger da unidade — pill cinza, cursor help, hover/focus abre popover. */
.mat-un-hover-wrap{
  position:relative;
  display:inline-block;
  flex-shrink:0;
}
/* T2.5 v3.9f (2026-05-14): trigger sem tabIndex e onMouseDown preventDefault
   garantem que o clique não dá foco ao span — só hover do mouse abre o popover
   (e :focus-within do wrap mantém aberto enquanto se edita os inputs dentro). */
.mat-un-trigger{
  display:inline-block;
  cursor:help;
  font-size:10.5px;
  font-weight:600;
  color:var(--ink-3);
  background:#F3F4F6;
  border-radius:3px;
  padding:1px 6px;
  letter-spacing:.3px;
  text-transform:lowercase;
  user-select:none;
}
.mat-un-trigger:hover{
  background:#E5E7EB;
  color:var(--ink);
}
/* Pill editável (material novo) — cursor pointer + subtil dashed border */
.mat-un-trigger--editable{
  cursor:pointer;
  border:1px dashed transparent;
}
.mat-un-trigger--editable:hover{
  border-color:var(--red-line);
  color:var(--red);
}
/* Em edição inline — textarea pequena no lugar do pill */
.mat-un-trigger--editing{
  display:inline-block;
  width:42px;
  font-size:10.5px;
  font-weight:600;
  color:var(--ink);
  background:#fff;
  border:1px solid var(--red-line);
  border-radius:3px;
  padding:1px 4px;
  text-align:center;
  text-transform:lowercase;
  font-family:inherit;
  outline:none;
}
/* T2.5 v3.9p (2026-05-14): popover render via portal (componente UnitPopover);
   posição calculada em JS via getBoundingClientRect → position:fixed inline.
   Visibilidade controlada pelo render condicional do componente. */
.mat-un-popover{
  position:fixed;
  background:#fff;
  border:1px solid var(--line);
  border-radius:6px;
  box-shadow:0 4px 14px rgba(0,0,0,0.12);
  padding:8px 10px 7px;
  z-index:60;
  min-width:190px;
  flex-direction:column;
  gap:5px;
  text-align:left;
}
.mat-un-pop-row{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:8px;
}
.mat-un-pop-label{
  font-size:10px;
  font-weight:700;
  color:var(--ink-3);
  text-transform:uppercase;
  letter-spacing:.4px;
  flex-shrink:0;
}
.mat-un-pop-input{
  width:64px;
  font-size:11px;
  text-align:center;
  background:#F8F9FB;
  border:1px solid var(--line);
  border-radius:3px;
  padding:2px 4px;
  font-family:inherit;
  outline:none;
  font-variant-numeric:tabular-nums;
}
.mat-un-pop-input:focus{
  background:#fff;
  border-color:var(--red-line);
}
.mat-un-pop-locked{
  font-size:11px;
  font-weight:600;
  color:var(--ink-4);
  background:#F3F4F6;
  border-radius:3px;
  padding:2px 8px;
  text-transform:lowercase;
}
.mat-un-pop-check{
  display:flex;
  align-items:center;
  gap:6px;
  font-size:10.5px;
  color:var(--ink-3);
  cursor:pointer;
  user-select:none;
}
.mat-un-pop-check input{
  margin:0;
  width:13px;
  height:13px;
  accent-color:var(--red);
  cursor:pointer;
}
.mat-un-pop-check:hover{ color:var(--ink); }
.mat-un-pop-real{
  font-size:10.5px;
  color:var(--ink-3);
  border-top:1px dashed var(--line);
  padding-top:5px;
  margin-top:2px;
}
.mat-un-pop-real strong{ color:var(--ink); font-weight:800; font-variant-numeric:tabular-nums; }

/* Linha de "+ MATERIAL" — só contém um pill pequeno alinhado à esquerda. */
.mat-row--add{
  padding:6px 10px;
  background:transparent;
  display:flex;
  align-items:center;
  justify-content:flex-start;
}
.mat-add-pill{
  font-size:10.5px;
  font-weight:800;
  color:var(--red);
  background:var(--red-soft);
  border:1.5px solid var(--red-line);
  border-radius:5px;
  padding:3px 9px;
  text-transform:uppercase;
  letter-spacing:1.2px;
  cursor:pointer;
  font-family:inherit;
  line-height:1.3;
  transition:background .12s, border-color .12s;
}
.mat-add-pill:hover{ background:#fff; border-color:var(--red); }
/* T2.5 v3.12g (2026-05-15): linha template — visual de linha-fantasma faded
 *  para criar material novo com 1 clique. */
.mat-row--template{
  cursor:pointer;
  background:transparent;
  opacity:.55;
  transition:opacity .12s, background .12s;
  border-top:1px dashed #e5e7eb;
}
.mat-row--template:hover,
.mat-row--template:focus{
  opacity:1;
  background:#fff7ed;
  outline:none;
}
.mat-template-hint{
  font-size:11px;
  font-weight:700;
  color:var(--red);
  text-transform:uppercase;
  letter-spacing:1px;
}
.mat-template-dash{
  color:#cbd5e1;
  text-align:right;
  font-size:12px;
  font-variant-numeric:tabular-nums;
}
.mat-cell-muted{
  color:var(--ink-4);
  text-align:right;
  font-size:11px;
  opacity:.4;
  align-self:center;
}
.mat-input--total{
  font-weight:700;
}
.mat-input-wrap{
  display:inline-flex;
  align-items:baseline;
  justify-content:flex-end;
  gap:3px;
  width:100%;
  min-width:0;
}
.mat-input{
  width:100%;
  border:none;
  background:transparent;
  font:inherit;
  font-size:12px;
  color:var(--ink);
  padding:3px 4px;
  border-radius:3px;
  outline:none;
  font-family:inherit;
  min-width:0;
}
.mat-input:focus{
  background:#fff;
  box-shadow:inset 0 0 0 1px var(--red-line);
}
.mat-input::placeholder{ color:var(--ink-4); opacity:.55; }
.mat-input--center{ text-align:center; }
.mat-input--right{ text-align:right; font-variant-numeric:tabular-nums; }
/* T2.5 v3.9g (2026-05-14): suffix inline next to input, NOT absolute.
   Input value cresce para a esquerda; suffix fica colado à direita com
   espaço de 3px (como uma barra de espaço). */
.mat-input-suffix{
  font-size:9.5px;
  color:var(--ink-4);
  pointer-events:none;
  letter-spacing:.2px;
  flex-shrink:0;
  white-space:nowrap;
}
.mat-input-wrap--has-suffix > .mat-input{ padding-right:2px; }
.mat-row-total{
  text-align:right;
  font-variant-numeric:tabular-nums;
  font-size:12px;
  font-weight:600;
  color:var(--ink);
}
.mat-del{
  width:20px;
  height:20px;
  padding:0;
  background:transparent;
  border:none;
  color:var(--ink-4);
  cursor:pointer;
  font-size:14px;
  line-height:1;
  border-radius:50%;
  opacity:.6;
  display:inline-flex;
  align-items:center;
  justify-content:center;
}
.mat-row--data:hover .mat-del{ opacity:1; }
.mat-row--data:hover .mat-row-copy{ opacity:1; }
.mat-del:hover{ background:var(--red-soft); color:var(--red); }
/* Ações por linha: copy + delete agrupados na última coluna. */
.mat-row-actions{
  display:flex;
  align-items:center;
  gap:2px;
  justify-content:flex-end;
}
.mat-row-copy{
  width:20px;
  height:20px;
  padding:0;
  background:transparent;
  border:none;
  color:var(--ink-4);
  cursor:pointer;
  font-size:12px;
  line-height:1;
  border-radius:50%;
  opacity:.6;
  display:inline-flex;
  align-items:center;
  justify-content:center;
}
.mat-row-copy:hover{ background:#F3F4F6; color:var(--ink); }
/* Botão de acção danger (limpar tudo) no header do card */
.atv-sector-actbtn--danger:hover:not(:disabled){
  background:rgba(122,24,24,0.10);
}
.mat-empty{
  padding:20px 12px;
  text-align:center;
  font-size:12px;
  color:var(--ink-4);
  font-style:italic;
}
.mat-empty strong{
  font-style:normal;
  font-weight:700;
  color:var(--ink-3);
  background:#F3F4F6;
  border-radius:50%;
  padding:0 5px;
  font-size:11px;
}
.mat-footer{
  flex-shrink:0;
  display:flex;
  justify-content:space-between;
  align-items:center;
  padding:6px 12px;
  background:#FFF1F1;
  border-top:1px solid #FBC7C7;
  font-size:11px;
}
.mat-footer-label{
  text-transform:uppercase;
  font-weight:700;
  letter-spacing:.5px;
  color:#8B0000;
}
.mat-footer-val{
  font-size:13px;
  font-weight:800;
  color:#8B0000;
  font-variant-numeric:tabular-nums;
}
/* Cores por sector — pastel no header, texto escuro a combinar */
.atv-sector-card--materiais  > .atv-sector-header{ background:#FEE2E2; color:#8B0000; border-bottom-color:#FBC7C7; }
.atv-sector-card--mo         > .atv-sector-header{ background:#E8F1FE; color:#1E4D8C; border-bottom-color:#C9DAF5; }
.atv-sector-card--subs       > .atv-sector-header{ background:#DFF5E6; color:#1F7A3D; border-bottom-color:#B7E2C5; }
.atv-sector-card--logistica  > .atv-sector-header{ background:#FFE8D1; color:#9A4B00; border-bottom-color:#F2C99A; }
.atv-sector-card--resumo     > .atv-sector-header{ background:#E8E5FB; color:#3F2D8C; border-bottom-color:#CFC7F0; }
.atv-sector-card--amortizacao> .atv-sector-header{ background:#FCE7F3; color:#9B2D5B; border-bottom-color:#F5C2DA; }
.atv-sector-card--diversos   > .atv-sector-header{ background:#F3F4F6; color:#374151; border-bottom-color:#D1D5DB; }
/* Esconder durante drag (consistente com .atv-status-card) */
body.dnd-active .atv-drawer-bottom{ display:none; }

/* ─── v3.12k (2026-05-15): MO Card expandido ─────────────────────────────
   Mantém a largura do sector mas cresce para baixo: 4 sub-linhas dentro do
   body. Os outros cards (Logística, Resumo) ficam mais comprimidos no flex. */
/* João 2026-05-18: MO e Subs ocupam EXATAMENTE metade da altura cada. */
.atv-sector-card--mo-expandido{ flex:1 1 50% !important; min-height:0; }
/* ════════════════════════════════════════════════════════════════════
   MÃO DE OBRA — estética "razão financeira" (João 2026-05-18)
   Densa mas legível: campos discretos (underline), números tabulares,
   €/h como número-herói, barra de total sólida. Azul Construsud #1E4D8C.
   ════════════════════════════════════════════════════════════════════ */
/* ════════════════════════════════════════════════════════════════════
   MÃO DE OBRA — layout do esboço do João (2026-05-18)
   header · FAIXA(Of/Aj inline · €/h) · 3 caixas + CUSTO MO · FAIXA(O/A h
   · €/un). Metade da altura do drawer. Azul Construsud #1E4D8C.
   ════════════════════════════════════════════════════════════════════ */
.mo-body{
  --mo-blue:#1E4D8C;
  padding:0;
  display:flex;
  flex-direction:column;
  font-size:11px;
  min-height:0;
  height:100%;
  font-variant-numeric:tabular-nums;
}
/* ── FAIXA (cabeçalho repetido em cima e em baixo) ── */
.mo-band{
  display:flex;
  align-items:center;
  gap:14px;
  padding:7px 11px;
  background:linear-gradient(180deg,#EEF4FC,#E4EDF8);
  border-bottom:1px solid #D2E0F2;
  flex-shrink:0;
}
.mo-band--btm{
  margin-top:auto;
  border-bottom:0;
  border-top:1px solid #D2E0F2;
}
.mo-band-grp{
  display:flex;
  align-items:center;
  gap:5px;
  font-size:10px;
  font-weight:800;
  letter-spacing:.6px;
  text-transform:uppercase;
  color:var(--mo-blue);
}
.mo-band-grp > span{ opacity:.6; }
.mo-band-grp--ro{ font-size:11px; }
/* Caixa Of/Aj pequena — só do tamanho do número (mo-band-in está no
   <input>; o wrapper é .mat-input-wrap, daí o seletor por descendência). */
.mo-band-grp .mat-input-wrap{
  width:30px;
  flex:0 0 30px;
  background:#fff;
  border:1px solid #C2D5F0;
  border-radius:4px;
  padding:1px 2px;
}
.mo-band-grp .mat-input-wrap:focus-within{
  border-color:var(--mo-blue);
  box-shadow:0 0 0 2px rgba(30,77,140,.16);
}
.mo-band-grp .mat-input.mo-band-in{
  font-weight:800; color:var(--mo-blue); font-size:12px;
  padding:1px 2px;
}
.mo-band-val{
  margin-left:auto;
  font-weight:800;
  font-size:17px;
  line-height:1;
  color:var(--mo-blue);
  white-space:nowrap;
  letter-spacing:-.3px;
}
.mo-band-val small{
  font-size:9px; font-weight:700; color:#7C93B5; letter-spacing:.3px;
}
/* ── Toggle antigo/atual ── */
.mo-modo-row{
  display:flex;
  align-items:center;
  gap:8px;
  padding:5px 11px 0;
  flex-shrink:0;
}
.mo-modo-row .mo-k{
  flex:0 0 auto;
  font-size:9.5px; font-weight:700; letter-spacing:.5px;
  text-transform:uppercase; color:#8A93A2;
}
/* ── MEIO: 3 caixas (esq.) · CUSTO MO (dir.) ── */
.mo-mid{
  flex:1 1 auto;
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:12px;
  padding:10px 11px;
  min-height:0;
}
.mo-boxes{
  display:flex;
  gap:7px;
}
.mo-box{
  display:flex;
  flex-direction:column;
  gap:3px;
  width:62px;
}
.mo-box-lbl{
  font-size:8.5px;
  font-weight:700;
  letter-spacing:.4px;
  text-transform:uppercase;
  color:#8A93A2;
  white-space:nowrap;
}
.mo-box .mat-input-wrap{
  background:#F3F6FB;
  border:1px solid #D8E1EF;
  border-radius:4px;
  padding:3px 4px;
  transition:border-color .12s, box-shadow .12s;
}
.mo-box .mat-input-wrap:focus-within{
  border-color:var(--mo-blue);
  background:#fff;
  box-shadow:0 0 0 2px rgba(30,77,140,.14);
}
.mo-box .mat-input.mo-box-in{
  font-size:12px; font-weight:700; color:#1F2937; padding:1px 2px;
}
.mo-mid-total{
  display:flex;
  flex-direction:column;
  align-items:flex-end;
  gap:3px;
  text-align:right;
}
.mo-total-cap{
  font-size:8.5px;
  font-weight:800;
  letter-spacing:.8px;
  text-transform:uppercase;
  color:#8A93A2;
}
.mo-travado{
  color:#B45309;
  font-weight:700;
  font-style:normal;
  letter-spacing:.3px;
}
/* CUSTO MO editável — número grande azul; editar recalcula horas
   (€/h é travado pela equipa). mo-total-in está no <input>. */
.mo-mid-total .mat-input-wrap{
  width:auto;
  justify-content:flex-end;
  border-bottom:1px dashed transparent;
  border-radius:0;
  transition:border-color .12s;
}
.mo-mid-total .mat-input-wrap:hover{ border-bottom-color:#B7C9E6; }
.mo-mid-total .mat-input-wrap:focus-within{ border-bottom-color:var(--mo-blue); }
.mo-mid-total .mat-input.mo-total-in{
  font-weight:800;
  font-size:21px;
  line-height:1;
  color:var(--mo-blue);
  letter-spacing:-.4px;
  padding:0 2px;
  width:96px;
}
.mo-mid-total .mat-input-suffix{
  font-size:12px; font-weight:800; color:var(--mo-blue);
}
.mo-row{
  display:flex;
  align-items:center;
  gap:6px;
  min-width:0;
}
.mo-row--equipa{ justify-content:space-between; }
.mo-select{
  flex:1 1 0;
  min-width:0;
  font-size:10.5px;
  padding:1px 4px;
  background:#F3F4F6;
  border:1px solid var(--line);
  border-radius:3px;
  height:20px;
  color:var(--ink);
  font-family:inherit;
}
.mo-oa{
  font-size:9.5px;
  font-weight:700;
  color:#1E4D8C;
  background:#E8F1FE;
  border-radius:3px;
  padding:1px 5px;
  letter-spacing:.2px;
  flex-shrink:0;
}
.mo-eurh{
  font-size:10px;
  font-weight:600;
  color:var(--ink-3);
  font-variant-numeric:tabular-nums;
  flex-shrink:0;
}
.mo-modo-toggle{
  display:inline-flex;
  border:1px solid var(--line);
  border-radius:3px;
  overflow:hidden;
  background:#F3F4F6;
}
.mo-modo-btn{
  border:0;
  background:transparent;
  font-size:9.5px;
  font-weight:600;
  padding:2px 6px;
  cursor:pointer;
  color:var(--ink-3);
  font-family:inherit;
  border-right:1px solid var(--line);
  letter-spacing:.2px;
}
.mo-modo-btn:last-child{ border-right:0; }
.mo-modo-btn:hover{ background:rgba(0,0,0,.05); }
.mo-modo-btn--active{ background:#1E4D8C; color:#fff; }
.mo-modo-btn--active:hover{ background:#1E4D8C; }
.mo-row--totais{
  justify-content:space-between;
  padding-top:3px;
  border-top:1px dashed var(--line);
  margin-top:1px;
}
.mo-totais-label{
  font-size:9.5px;
  color:var(--ink-3);
  font-variant-numeric:tabular-nums;
}
.mo-totais-val{
  font-size:11.5px;
  font-weight:800;
  color:var(--ink);
  font-variant-numeric:tabular-nums;
}
.mo-row--split{
  justify-content:space-between;
  font-size:9.5px;
  color:var(--ink-3);
}
.mo-split-cell{
  display:inline-flex;
  align-items:center;
  gap:4px;
  font-variant-numeric:tabular-nums;
}
.mo-split-lbl{
  font-weight:700;
  font-size:9px;
  color:#1E4D8C;
  background:#E8F1FE;
  border-radius:2px;
  padding:0 3px;
}
.mo-split-sep{ color:var(--line); }

/* ─── v3.12k: Subempreiteiros como mini-tabela ─────────────────────────── */
.atv-sector-card--subs-expandido{ flex:1 1 50% !important; min-height:0; }
.subs-body{
  flex:1 1 auto;
  overflow:auto;
  min-height:0;
}
.subs-row{
  display:grid;
  /* João 2026-05-18: IGUAL à de materiais mas SEM desperdício/un/dias —
     nome · rend · qtd · €/un · total · ✕. Cabe no painel 40%. */
  grid-template-columns:minmax(0,1.5fr) 54px 54px 60px 64px 18px;
  align-items:center;
  gap:4px;
  padding:4px 9px;
  font-size:10.5px;
  border-bottom:1px solid #EEF1EF;
  min-height:26px;
}
.subs-row:last-child{ border-bottom:0; }
.subs-row:not(.subs-row--head):not(.subs-row--template):hover{
  background:#F6FBF7;
}
.subs-row--head{
  font-size:8.5px;
  font-weight:800;
  text-transform:uppercase;
  letter-spacing:.5px;
  color:#1F7A3D;
  background:linear-gradient(180deg,#F0F9F2,#E8F5EC);
  border-bottom:1px solid #C7E6D1;
  min-height:20px;
}
.subs-row--head > span{ text-align:right; opacity:.85; }
.subs-row--head .subs-c-nome{ text-align:left; }
.subs-c-nome{ min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.subs-c-rend, .subs-c-qty, .subs-c-eur, .subs-c-dias{ text-align:right; font-variant-numeric:tabular-nums; }
.subs-c-un{ text-align:center; font-size:9.5px; color:var(--ink-3); }
.subs-c-total{
  text-align:right;
  font-variant-numeric:tabular-nums;
  font-weight:800;
  color:#1F7A3D;
}
.subs-input{
  font-size:10.5px !important;
  padding:0 3px !important;
  height:18px;
  background:transparent;
  border:0;
  border-bottom:1px dotted transparent;
  border-radius:0;
  width:100%;
  min-width:0;
}
.subs-input:hover{ border-bottom-color:var(--line); }
.subs-input:focus{ border-bottom-color:#1F7A3D; background:#fff; outline:none; }
.subs-del-btn{
  width:14px; height:14px;
  border:0;
  background:transparent;
  color:var(--ink-4);
  cursor:pointer;
  font-size:11px;
  padding:0;
  line-height:1;
  opacity:0;
  transition:opacity .12s;
}
.subs-row:hover .subs-del-btn{ opacity:.7; }
.subs-del-btn:hover{ opacity:1 !important; color:#8B0000; }
.subs-row--template{
  cursor:pointer;
  color:var(--ink-4);
  font-style:italic;
}
.subs-row--template:hover{ background:#F7FDF9; color:#1F7A3D; }
.subs-template-hint{ font-style:italic; }
.subs-template-dash{ text-align:center; color:#D1D5DB; }
.subs-footer{
  display:flex;
  justify-content:space-between;
  align-items:center;
  padding:3px 8px;
  background:#FAFAF7;
  border-top:1px solid var(--line);
  font-size:10px;
  flex-shrink:0;
}
.subs-footer-label{ color:var(--ink-3); }
.subs-footer-val{ font-weight:800; color:var(--ink); font-variant-numeric:tabular-nums; }

/* ─── v3.12k: tabela de items dentro do painel rico /faturas ─────────── */
.tbl--items-fatura{
  width:100%;
  font-size:11px;
  border-collapse:collapse;
  margin-top:4px;
}
.tbl--items-fatura th{
  text-align:left;
  font-size:9px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.4px;
  color:var(--ink-4);
  background:#FAFAF7;
  padding:3px 6px;
  border-bottom:1px solid var(--line);
}
.tbl--items-fatura th.num{ text-align:right; }
.tbl--items-fatura td{
  padding:3px 6px;
  border-bottom:1px dashed var(--line);
  vertical-align:top;
}
.tbl--items-fatura td.num{ text-align:right; font-variant-numeric:tabular-nums; }
.tbl--items-fatura tr:last-child td{ border-bottom:0; }

/* ─── v3.12k: célula "?" laranja em /import-faturas — campo por preencher ─ */
.tbl--standby-edit td{ vertical-align:middle; }
.tbl--standby-edit .cell-q-wrap .inline-text-placeholder,
.tbl--standby-edit .cell-q{
  color:#fff;
  background:#F59E0B;
  border-radius:50%;
  width:18px;
  height:18px;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  font-weight:800;
  font-size:11px;
  cursor:pointer;
  line-height:1;
}
.tbl--standby-edit .cell-q-wrap{ cursor:pointer; }
.tbl--standby-edit .cell-q-wrap:hover .inline-text-placeholder,
.tbl--standby-edit .cell-q:hover{ background:#D97706; }

/* ─── Banner NOTA INTERNA — uppercase, multiline (Enter), X em hover ──── */
.atv-nota-orc-banner{
  position:relative;
  grid-column:1 / -1;
  padding:5px 10px 5px 28px;        /* espaço à esquerda para o X em hover */
  margin:0 0 4px 0;
  background:rgba(122,24,24,0.06);
  border-left:3px solid var(--red);
  border-radius:3px;
  color:var(--red);
  font-style:italic;
  font-size:12px;
  line-height:1.45;
  text-transform:uppercase;
  white-space:pre-wrap;             /* respeita Enters */
  word-break:break-word;
  text-align:left;
  letter-spacing:.2px;
}
.atv-nota-orc-banner > strong{
  font-style:normal;
  font-weight:800;
  letter-spacing:.4px;
  margin-right:6px;
}
/* Banner draggable: cursor grab quando há texto e fora do modo edit */
.atv-nota-orc-banner[draggable="true"]{ cursor:grab; }
.atv-nota-orc-banner[draggable="true"]:active{ cursor:grabbing; }
.atv-nota-orc-text{ font-style:italic; }
/* Wrapper destacado quando paira nota arrastada por cima */
.atv-row-wrap--drop-hover .atv-card{
  outline:2px dashed var(--red);
  outline-offset:-2px;
  background:rgba(122,24,24,0.06) !important;
}
/* Banner mostra label + input na MESMA linha. Textarea começa com 1 linha
   e cresce com Enter via field-sizing:content. Salvar = blur (clicar fora). */
.atv-nota-orc-banner .inline-text,
.atv-nota-orc-banner .atv-nota-orc-text{
  display:inline;
  vertical-align:baseline;
}
.atv-nota-orc-banner textarea.inline-text-input,
.atv-nota-orc-banner input.inline-text-input{
  display:inline-block;
  vertical-align:top;
  min-width:200px;
  max-width:100%;
  resize:none;
  overflow:hidden;
  field-sizing:content;
  line-height:1.45;
}
/* X de delete — invisível por defeito, aparece em hover do banner */
.atv-nota-orc-del{
  position:absolute;
  top:50%;
  left:6px;
  transform:translateY(-50%);
  width:18px;
  height:18px;
  padding:0;
  border:none;
  background:transparent;
  color:var(--red);
  font-size:14px;
  font-weight:700;
  line-height:1;
  cursor:pointer;
  border-radius:3px;
  opacity:0;
  transition:opacity .12s, background .12s;
}
.atv-nota-orc-banner:hover .atv-nota-orc-del{ opacity:0.7; }
.atv-nota-orc-del:hover{ opacity:1 !important; background:rgba(122,24,24,0.12); }

/* ─── Banner NOTA CLIENTE — aparece quando drawer aberto, igual estilo ── */
.atv-nota-cli-banner{
  grid-column:1 / -1;
  padding:5px 10px;
  margin:0 0 4px 0;
  background:rgba(122,24,24,0.04);
  border-left:3px dashed var(--red);
  border-radius:3px;
  color:var(--red);
  font-style:italic;
  font-size:12px;
  line-height:1.45;
  white-space:pre-wrap;
  word-break:break-word;
  text-align:left;
  letter-spacing:.2px;
}
.atv-nota-cli-banner > strong{
  font-style:normal;
  font-weight:800;
  letter-spacing:.4px;
  text-transform:uppercase;
  margin-right:6px;
}

/* ─── Sombreado de sub/aux quando todas as filhas têm o mesmo status ── */
.det-sub-header--status-aberto         { background:linear-gradient(to right, rgba(245,158,11,0.18), rgba(245,158,11,0.06) 65%, transparent); }
.det-sub-header--status-aguarda_cotacao{ background:linear-gradient(to right, rgba(37,99,235,0.18), rgba(37,99,235,0.06) 65%, transparent); }
.det-sub-header--status-duvida         { background:linear-gradient(to right, rgba(220,38,38,0.18), rgba(220,38,38,0.06) 65%, transparent); }
.det-sub-header--status-fechado        { background:linear-gradient(to right, rgba(21,128,61,0.18), rgba(21,128,61,0.06) 65%, transparent); }

/* Bolinhas inline de contagem de status no sub-header / linha-aux header.
   Aparecem ANTES do pill quando há mistura de status nas filhas. */
.sub-status-counters{
  display:inline-flex;
  align-items:center;
  gap:3px;
  margin-right:6px;
  vertical-align:middle;
}

/* ─── Bolinhas verticais de status no header do capítulo ──────────────────
   T2.5 v3.7 (2026-05-14): voltou a ser bolinhas (chart abortado).
   Posicionadas absolutas à esquerda do número grande do capítulo, empilhadas
   vertical. Requer .det-cap-bignum{ position:relative }. */
.det-cap-bignum{ position:relative; }
.cap-status-counters{
  position:absolute;
  top:50%;
  right:100%;
  transform:translateY(-50%);
  margin-right:0;
  display:flex;
  flex-direction:column;
  align-items:center;
  gap:2px;
  z-index:5;
}
.cap-status-dot{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:14px;
  height:14px;
  border-radius:50%;
  border:1px solid #fff;
  box-shadow:0 0 0 1px rgba(0,0,0,0.15);
  font-size:8px;
  font-weight:800;
  font-family:var(--mono);
  line-height:1;
  cursor:help;
}
.cap-status-dot--aberto         { background:#FFF3D9; color:#A77400; }
.cap-status-dot--aguarda_cotacao{ background:#E8F1FE; color:#1E4D8C; }
.cap-status-dot--duvida         { background:#FEE2E2; color:#DC2626; }
.cap-status-dot--fechado        { background:#DFF5E6; color:#1F7A3D; }

/* Versão "agregada" para a folha de rosto, ao lado do Valor Total — usa
   exactamente os mesmos modificadores .cap-status-dot--X. */
.fr-status-counters{
  display:inline-flex;
  align-items:center;
  gap:4px;
  margin-left:10px;
  vertical-align:middle;
}

/* ─── Botões "drawers" no header da Proposta Detalhada (v3.4) ──────────
   Pill cinza circular só com seta = toggle global. Pill "Status ▾" cinza =
   toggle só dos cards Status. Em hover do botão "all", abre dropdown com
   as 4 opções de status — clicar muda TODAS as atividades para esse status. */
.det-drawer-toggles{
  display:inline-flex;
  align-items:center;
  gap:6px;
  margin-left:14px;
  vertical-align:middle;
}
.det-drawer-toggle{
  padding:2px 8px;
  background:#F3F4F6;
  border:1px solid #D1D5DB;
  color:#4B5563;
  border-radius:11px;
  font-size:10.5px;
  font-weight:700;
  letter-spacing:.4px;
  text-transform:uppercase;
  cursor:pointer;
  font-family:inherit;
  line-height:1;
  transition:background .12s, border-color .12s;
}
.det-drawer-toggle:hover:not(:disabled){ background:#E5E7EB; border-color:#9CA3AF; color:#1F2937; }
.det-drawer-toggle.is-open{ background:#4B5563; color:#fff; border-color:#4B5563; }
.det-drawer-toggle.is-open:hover{ background:#374151; border-color:#374151; }
.det-drawer-toggle:disabled{ opacity:.35; cursor:not-allowed; }
/* T2.5 v3.7 (2026-05-14): pills Undo/Redo — redondas pequenas, símbolo grande.
   Reaproveitam .det-drawer-toggle como base. */
.det-drawer-toggle--history{
  width:22px;
  height:22px;
  padding:0;
  border-radius:50%;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  font-size:13px;
  line-height:1;
}
/* Versão "all" — só seta, sem texto, redonda */
.det-drawer-toggle--all{
  width:22px;
  height:22px;
  padding:0;
  border-radius:50%;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  font-size:11px;
}
/* Wrapper para hover dropdown — abre menu com "mudar todos para X".
   O menu tem um pseudo-elemento ::before invisível que cobre o gap entre
   o botão e o menu — assim o mouse não "sai" e o menu fica aberto. */
.det-drawer-toggle-wrap{
  position:relative;
  display:inline-block;
}
.det-drawer-toggle-menu{
  display:none;
  position:absolute;
  top:100%;
  left:0;
  margin-top:6px;
  background:#fff;
  border:1px solid #D1D5DB;
  border-radius:8px;
  box-shadow:0 4px 14px rgba(0,0,0,0.12);
  padding:6px;
  z-index:20;
  min-width:190px;
}
/* Buffer transparente no topo do menu — preenche o gap visível para que
   o hover não interrompa quando o mouse passa por entre o botão e o menu. */
.det-drawer-toggle-menu::before{
  content:'';
  position:absolute;
  top:-8px;
  left:0;
  right:0;
  height:8px;
  background:transparent;
}
.det-drawer-toggle-wrap:hover .det-drawer-toggle-menu,
.det-drawer-toggle-menu:hover{ display:block; }
.det-drawer-toggle-menu-header{
  display:block;
  font-size:9px;
  font-weight:700;
  letter-spacing:.5px;
  text-transform:uppercase;
  color:var(--ink-3);
  padding:4px 6px 6px 6px;
  margin-bottom:2px;
  border-bottom:1px solid #E5E7EB;
}
.det-drawer-toggle-menu-item{
  display:block;
  width:100%;
  text-align:left;
  background:transparent;
  border:none;
  padding:5px 6px;
  cursor:pointer;
  border-radius:4px;
  font-family:inherit;
}
.det-drawer-toggle-menu-item:hover{ background:#F3F4F6; }

/* Botão ENCOLHER CABEÇALHO — pill cinza idêntica ao toggle, com seta para cima */
.det-header-collapse-btn{
  padding:2px 10px;
  background:#F3F4F6;
  border:1px solid #D1D5DB;
  color:#4B5563;
  border-radius:11px;
  font-size:10px;
  font-weight:700;
  letter-spacing:.4px;
  text-transform:uppercase;
  cursor:pointer;
  font-family:inherit;
  line-height:1;
  transition:background .12s, border-color .12s;
}
/* T2.5 v3.9m (2026-05-14): pill IVA — toggle 0% / 23%. Visualmente cinza
   quando 0, bordô quando 23%. */
.det-iva-pill{
  padding:2px 9px;
  background:#F3F4F6;
  border:1px solid #D1D5DB;
  color:#4B5563;
  border-radius:11px;
  font-size:10.5px;
  font-weight:800;
  letter-spacing:.4px;
  cursor:pointer;
  font-family:inherit;
  line-height:1;
  transition:background .12s, border-color .12s, color .12s;
}
.det-iva-pill:hover{ background:#E5E7EB; border-color:#9CA3AF; }
.det-iva-pill.is-on{
  background:var(--red);
  color:#fff;
  border-color:var(--red);
}
.det-iva-pill.is-on:hover{ background:#600C0C; border-color:#600C0C; }
.det-header-collapse-btn:hover{ background:#E5E7EB; border-color:#9CA3AF; color:#1F2937; }
.det-header-collapse-btn.is-collapsed{ background:#4B5563; color:#fff; border-color:#4B5563; }
.det-header-collapse-btn.is-collapsed:hover{ background:#374151; }

/* Coluna €/un editável (só em modo unitário) */
.atv-eur--editavel{
  cursor:pointer;
  border-radius:4px;
  transition:background .12s;
}
.atv-eur--editavel:hover{
  background:#EFF6FF;
  outline:1px dashed #93C5FD;
}
.atv-eur--editing{ padding:0; }
.atv-eur-input{
  width:100%;
  padding:2px 4px;
  border:1px solid #2563EB;
  border-radius:4px;
  background:#fff;
  font-family:inherit;
  font-size:inherit;
  text-align:right;
  font-variant-numeric:tabular-nums;
  color:var(--ink);
  outline:none;
}

/* T2.5 Fluxo de Caixa it2 (2026-05-13): pequeno badge temporal na legenda da
   timeline (Mês 0 / Meio da obra / +15d / etc.). Acopla ao lado do label. */
.fluxo-timeline-tempo{
  display:inline-block;
  padding:1px 6px;
  font-size:10px;
  font-weight:600;
  letter-spacing:.2px;
  background:#EEF2F6;
  color:#5B6470;
  border-radius:4px;
  font-family:var(--font);
}

/* ───────────────────────────────────────────────────────────────────────────
   T2.5 F5 (2026-05-13) — Drag & Drop dos items via dnd-kit.
   - SortableRow envolve cada linha (det-sub-header, atv-card, atv-card--linha-aux)
   - Cursor 'grab' em hover, 'grabbing' quando se arrasta
   - dnd-dragging: opacidade aplicada via inline style; aqui só ajusta o cursor
   - Indicadores de drop:
       .dnd-drop--before  → linha azul horizontal no topo do row
       .dnd-drop--after   → linha azul horizontal no fundo do row
       .dnd-drop--inside  → halo azul à volta do row (drop como filho)
       .dnd-drop--invalid → variante vermelha (largada bloqueada)
   ─────────────────────────────────────────────────────────────────────────── */
.det-sub-header,
.atv-card{
  position:relative; /* necessário para os pseudo-elementos dos indicadores */
}
/* Cursor de arrastar — só em modo editável (linhas que estão envolvidas em SortableRow). */
.det-cap-body .det-sub-header,
.det-cap-body .atv-card{
  cursor:default;
}
/* Quando está em arrasto activo, cursor passa a grabbing global. */
body.dnd-active,
body.dnd-active *{ cursor:grabbing !important; }
.dnd-dragging{ cursor:grabbing; }

/* T2.5 F5 fix-trevo (2026-05-13): suprimir rodelas/popovers do trevo enquanto
   há um arrasto activo. As rodelas estão num PORTAL fora do row (document.body)
   por isso o seletor é global. Esconde tudo que esteja com a classe da rodela. */
body.dnd-active .pill-trevo-ring,
body.dnd-active .pill-trevo-zone,
body.dnd-active .pill-trevo-popover,
body.dnd-active .pill-trevo-emoji{
  display:none !important;
  pointer-events:none !important;
}

/* Linha azul horizontal — drop antes/depois (mais espessa e com "bola" nos extremos
   para ficar mais legível, conforme feedback "no futuro melhorar visual") */
.dnd-drop--before::before,
.dnd-drop--after::after{
  content:'';
  position:absolute;
  left:8px;
  right:8px;
  height:3px;
  background:#2563EB;
  border-radius:2px;
  box-shadow:0 0 0 1px rgba(37,99,235,0.35), 0 2px 6px rgba(37,99,235,0.25);
  pointer-events:none;
  z-index:5;
}
.dnd-drop--before::before{ top:-2px; }
.dnd-drop--after::after{ bottom:-2px; }

/* Halo azul — drop dentro */
.dnd-drop--inside{
  outline:2px solid #2563EB;
  outline-offset:-2px;
  background:rgba(37,99,235,0.08);
  box-shadow:inset 0 0 12px rgba(37,99,235,0.08);
}

/* Variantes inválidas (vermelho) */
.dnd-drop--invalid.dnd-drop--before::before,
.dnd-drop--invalid.dnd-drop--after::after{
  background:#DC2626;
  box-shadow:0 0 0 1px rgba(220,38,38,0.35), 0 2px 6px rgba(220,38,38,0.25);
}
.dnd-drop--invalid.dnd-drop--inside{
  outline-color:#DC2626;
  background:rgba(220,38,38,0.06);
}

/* T2.5 D&D it2 (2026-05-13): ghost (DragOverlay) — chip que segue o cursor.
   Aparece flutuante com sombra forte. Pequeno, compacto, fácil de seguir. */
.dnd-ghost{
  display:inline-flex;
  align-items:center;
  gap:8px;
  padding:6px 12px;
  background:#fff;
  border:1px solid #2563EB;
  border-radius:8px;
  box-shadow:0 8px 20px rgba(0,0,0,0.15), 0 2px 4px rgba(37,99,235,0.2);
  font-family:var(--font);
  font-size:13px;
  font-weight:600;
  color:var(--ink);
  cursor:grabbing;
  pointer-events:none;
  max-width:380px;
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
}
.dnd-ghost-pill{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  min-width:38px;
  padding:2px 8px;
  background:#2563EB;
  color:#fff;
  font-weight:700;
  border-radius:11px;
  font-size:11px;
  flex-shrink:0;
}
.dnd-ghost-label{
  overflow:hidden;
  text-overflow:ellipsis;
}
/* Cores específicas por kind */
.dnd-ghost--sub{ border-color:#7C3AED; }
.dnd-ghost--sub .dnd-ghost-pill{ background:#7C3AED; }
.dnd-ghost--aux{ border-color:#0D9488; }
.dnd-ghost--aux .dnd-ghost-pill{ background:#0D9488; }
.dnd-ghost--atv{ border-color:#2563EB; }
.dnd-ghost--atv .dnd-ghost-pill{ background:#2563EB; }

/* ============================================================
   T2.5 v3.11 (2026-05-15): BD — Layout split (lista + painel)
   Reutilizado em /bd/materiais, /fornecedores e futuras páginas
   de gestão de BD (subempreiteiros, atividades…).
   ============================================================ */
.bd-split{
  display:flex;
  gap:14px;
  /* T2.5 v3.11r (2026-05-15): flex-start para permitir position:sticky no painel.
     Antes era stretch, que impedia o sticky de funcionar. */
  align-items:flex-start;
  min-height:calc(100vh - 180px);
}
.bd-split-list{
  flex:1 1 auto;
  min-width:0;
  background:#fff;
  border:1px solid var(--ink-7, #e5e7eb);
  border-radius:8px;
}
.bd-split-panel{
  /* Sticky: acompanha o scroll para podermos editar linhas distantes na lista
     da esquerda enquanto vemos o detalhamento à direita. */
  position:sticky;
  top:12px;
  flex:0 0 440px;
  background:#fafbfc;
  border:1px solid var(--ink-7, #e5e7eb);
  border-radius:8px;
  display:flex;
  flex-direction:column;
  max-height:calc(100vh - 24px);
  overflow-y:auto;
}
@media (max-width: 1100px){
  .bd-split-panel{ flex-basis:380px; }
}
@media (max-width: 900px){
  .bd-split{ flex-direction:column; min-height:auto; }
  .bd-split-panel{ flex-basis:auto; }
}

/* ───── Lista (esquerda) ───── */
.tbl--bd{
  width:100%;
  border-collapse:collapse;
  font-size:13px;
}
.tbl--bd thead th{
  position:sticky;
  top:0;
  background:#fafbfc;
  border-bottom:1px solid var(--ink-7, #e5e7eb);
  padding:8px 10px;
  text-align:left;
  font-weight:600;
  font-size:11.5px;
  color:var(--ink-3, #6b7280);
  text-transform:uppercase;
  letter-spacing:.4px;
  z-index:1;
}
.tbl--bd tbody td{
  padding:7px 10px;
  border-bottom:1px solid #f1f3f5;
  vertical-align:middle;
}
.tbl--bd .num{ text-align:right; font-variant-numeric: tabular-nums; }
.bd-list-row{ cursor:pointer; transition: background .12s; }
.bd-list-row:hover{ background:#f5f7fa; }
.bd-list-row.is-selected{
  background:rgba(166,38,57,.10);
  box-shadow: inset 3px 0 0 var(--red, #a62639);
}
.bd-list-row.is-selected td{ color:var(--ink); }

/* ───── Painel (direita) ───── */
.bd-panel-header{
  position:sticky;
  top:0;
  z-index:2;
  background:#fff;
  border-bottom:1px solid var(--ink-7, #e5e7eb);
  padding:14px 16px 10px;
  display:grid;
  grid-template-columns: 1fr auto;
  grid-template-rows: auto auto;
  gap:4px 10px;
  align-items:center;
}
.bd-panel-titulo{
  grid-column: 1;
  grid-row: 1;
  font-size:16px;
  font-weight:700;
  color:var(--ink);
  min-width:0;
}
.bd-panel-meta{
  grid-column: 1;
  grid-row: 2;
  font-size:12px;
  color:var(--ink-3, #6b7280);
  display:flex;
  align-items:center;
  gap:6px;
  flex-wrap:wrap;
}
.bd-panel-meta-sep{ opacity:.5; }
.bd-panel-close{
  grid-column: 2;
  grid-row: 1 / span 2;
  background:transparent;
  border:none;
  font-size:18px;
  color:var(--ink-3, #6b7280);
  cursor:pointer;
  width:30px;
  height:30px;
  border-radius:6px;
  display:flex;
  align-items:center;
  justify-content:center;
}
.bd-panel-close:hover{ background:#f1f3f5; color:var(--ink); }

.bd-panel-section{
  border-bottom:1px solid #f1f3f5;
  padding:10px 16px 14px;
}
.bd-panel-section:last-child{ border-bottom:none; }
.bd-panel-section-header{
  display:flex;
  align-items:center;
  gap:8px;
  margin:2px 0 8px;
}
.bd-panel-section-header h4{
  margin:0;
  font-size:11.5px;
  font-weight:700;
  color:var(--ink-3, #6b7280);
  text-transform:uppercase;
  letter-spacing:.6px;
}
.bd-panel-section-count{
  background:#e5e7eb;
  color:var(--ink-3, #6b7280);
  font-size:10.5px;
  font-weight:700;
  padding:1px 7px;
  border-radius:10px;
  min-width:18px;
  text-align:center;
}
.bd-panel-section-body{
  display:flex;
  flex-direction:column;
  gap:5px;
}
.bd-panel-row{
  display:flex;
  align-items:center;
  gap:10px;
  background:#fff;
  border:1px solid #f1f3f5;
  border-radius:6px;
  padding:6px 10px;
  font-size:12.5px;
}
.bd-panel-row--legacy{ border-style:dashed; }
.bd-panel-row-forn{
  flex:1 1 auto;
  font-weight:600;
  color:var(--ink);
  min-width:0;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.bd-panel-row-preco{
  flex:0 0 auto;
  font-variant-numeric: tabular-nums;
  font-weight:600;
  color:var(--red, #a62639);
}
.bd-panel-row-un{
  flex:0 0 auto;
  font-size:11px;
  font-weight:600;
  color:var(--ink-3, #6b7280);
  letter-spacing:.3px;
  margin-left:-4px;
}

/* T2.5 v3.11j (2026-05-15): linha de preço editável. */
.bd-panel-row--editable{ position:relative; }
.bd-panel-row-preco--editable{
  cursor:pointer;
  padding:1px 4px;
  border-radius:3px;
  transition: background .12s;
}
.bd-panel-row-preco--editable:hover{ background:rgba(166,38,57,.08); }
.bd-panel-input--inline-num{
  width:80px;
  text-align:right;
  font-variant-numeric: tabular-nums;
  font-weight:600;
  color:var(--red, #a62639);
}
/* Pill clicável de unidade — igual à pill da unidade no drawer materiais. */
.bd-panel-row-un-pill{
  flex:0 0 auto;
  background:#F3F4F6;
  color:var(--ink-3, #6b7280);
  border:1px solid transparent;
  border-radius:3px;
  padding:1px 7px;
  font-size:10.5px;
  font-weight:600;
  letter-spacing:.3px;
  text-transform:lowercase;
  cursor:default;
  margin-left:-2px;
  font-family:inherit;
}
.bd-panel-row-un-pill.is-clickable{
  cursor:pointer;
  border-color:transparent;
}
.bd-panel-row-un-pill.is-clickable:hover{
  background:#E5E7EB;
  color:var(--ink);
  border-color:#d6d9dd;
}
.bd-panel-row-un-pill:disabled{ opacity:.65; }
/* Nome do fornecedor + expander (setinha) lado a lado. */
.bd-panel-row-forn{ display:flex; align-items:center; gap:3px; }
.bd-panel-row-forn-nome{
  font-weight:600;
  color:var(--ink);
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
  flex:0 1 auto;
  min-width:0;
}
.bd-panel-row-forn--historico{
  /* Coluna vazia para alinhar (não mostra nome em variações) */
  flex:1 1 auto;
  min-width:0;
}
/* Expander (▾) — agora ao lado do nome, não no fim da linha. */
.bd-panel-row-expander{
  flex:0 0 auto;
  background:transparent;
  border:none;
  color:var(--ink-4, #9ca3af);
  cursor:pointer;
  font-size:10px;
  width:16px;
  height:16px;
  border-radius:3px;
  display:flex;
  align-items:center;
  justify-content:center;
  transition: transform .15s, background .12s, color .12s;
  padding:0;
  line-height:1;
}
.bd-panel-row-expander:hover{ background:#F3F4F6; color:var(--ink); }
.bd-panel-row-expander.is-open{ transform: rotate(180deg); color:var(--red, #a62639); }
/* ✕ só visível em hover da linha. */
.bd-panel-row-x--hover{ opacity:0; transition: opacity .12s; }
.bd-panel-row--editable:hover .bd-panel-row-x--hover{ opacity:1; }
/* Linha histórico (preços extra do mesmo fornecedor) — itálico + sublinhado
   tracejado para distinguir visualmente. T2.5 v3.11m (2026-05-15). */
.bd-panel-row--historico{
  background:transparent;
  border:none;
  margin-left:20px;
  padding-top:2px;
  padding-bottom:2px;
  font-size:11.5px;
  font-style:italic;
  opacity:.85;
}
.bd-panel-row--historico .bd-panel-row-preco,
.bd-panel-row--historico .bd-panel-row-un-pill{
  text-decoration: underline;
  text-decoration-style: dotted;
  text-underline-offset: 2px;
  text-decoration-color: var(--ink-4, #9ca3af);
}

/* T2.5 v3.11n (2026-05-15): célula do Rendimento — input + pill clicável
   da unidade composta material_un/atv_un. Click cicla pelas unidades
   alternativas do BDMaterial e converte rendimento + qty + €/un. */
.mat-rend-cell{
  display:flex;
  flex-direction:row;
  align-items:center;
  gap:4px;
  min-width:0;
  justify-content:flex-end;
}
.mat-input--rend{
  flex:1 1 auto;
  min-width:50px;
  max-width:80px;
}
.mat-rend-un-pill{
  display:inline-block;
  font-size:9.5px;
  font-weight:600;
  color:var(--ink-3, #6b7280);
  background:#F3F4F6;
  border:1px solid transparent;
  border-radius:3px;
  padding:0px 5px;
  letter-spacing:.3px;
  text-transform:lowercase;
  cursor:default;
  font-family:inherit;
  white-space:nowrap;
}
.mat-rend-un-pill.is-clickable{
  cursor:pointer;
}
.mat-rend-un-pill.is-clickable:hover{
  background:#E5E7EB;
  color:var(--ink);
  border-color:#d6d9dd;
}
.mat-rend-un-pill:disabled{ opacity:.7; }

/* ============================================================
   T2.5 v3.11p (2026-05-15): /faturas — tabs + sumário + análise
   ============================================================ */
.faturas-tabs{
  display:flex;
  gap:4px;
  border-bottom:2px solid var(--ink-7, #e5e7eb);
  margin: 4px 0 14px;
}
.faturas-tab{
  background:transparent;
  border:none;
  font-size:13px;
  font-weight:600;
  color:var(--ink-3, #6b7280);
  padding:8px 14px;
  cursor:pointer;
  border-bottom:2px solid transparent;
  margin-bottom:-2px;
  display:flex;
  align-items:center;
  gap:6px;
  transition: color .12s, border-color .12s;
}
.faturas-tab:hover{ color:var(--ink); }
.faturas-tab.is-active{
  color:var(--red, #a62639);
  border-bottom-color:var(--red, #a62639);
}
.faturas-tab-count{
  background:#F3F4F6;
  color:var(--ink-3, #6b7280);
  font-size:10.5px;
  font-weight:700;
  padding:1px 6px;
  border-radius:10px;
  min-width:18px;
  text-align:center;
}
.faturas-tab.is-active .faturas-tab-count{
  background:rgba(166,38,57,.10);
  color:var(--red, #a62639);
}

.faturas-sumario{
  display:grid;
  grid-template-columns: repeat(5, 1fr);
  gap:10px;
  margin: 0 0 14px;
}
.faturas-kpi{
  background:#fff;
  border:1px solid var(--ink-7, #e5e7eb);
  border-radius:6px;
  padding:8px 12px;
  display:flex;
  flex-direction:column;
  gap:2px;
}
.faturas-kpi-label{
  font-size:10px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.5px;
  color:var(--ink-3, #6b7280);
}
.faturas-kpi-value{
  font-size:16px;
  font-weight:700;
  color:var(--ink);
  font-variant-numeric: tabular-nums;
}

.faturas-analise{
  background:#FFF8EE;
  border:1px solid #FFD89A;
  border-radius:6px;
  padding:10px 14px;
  margin: 0 0 14px;
  font-size:12.5px;
}
.faturas-analise-titulo{
  font-weight:700;
  color:#92400E;
  margin-bottom:8px;
}
.faturas-analise-grid{
  display:grid;
  grid-template-columns: repeat(2, 1fr);
  gap:6px 16px;
  color:var(--ink);
}
.faturas-analise-novos{
  margin-top:8px;
  font-size:12px;
}
.faturas-analise-novos summary{
  cursor:pointer;
  color:var(--ink-3, #6b7280);
  user-select:none;
}
.faturas-analise-novos ul{
  margin:6px 0 0 20px;
  padding:0;
  list-style: disc;
  color:var(--ink);
  font-size:11.5px;
}
.faturas-analise-novos li{ padding:2px 0; }

.faturas-texto-cru{
  background:#F3F4F6;
  border-radius:4px;
  padding:10px;
  font-family: 'Courier New', monospace;
  font-size:10.5px;
  line-height:1.4;
  color:var(--ink);
  white-space: pre-wrap;
  max-height:300px;
  overflow-y:auto;
  margin:6px 0 0;
}

/* T2.5 v3.11q: preview do PDF/imagem servido pelo plugin Vite. */
.bd-split-panel--faturas{ flex-basis: 580px; }
@media (max-width: 1300px){ .bd-split-panel--faturas{ flex-basis: 480px; } }
@media (max-width: 1100px){ .bd-split-panel--faturas{ flex-basis: 400px; } }

.faturas-preview{
  width:100%;
  background:#1a1a1a;
  border-radius:6px;
  overflow:hidden;
  min-height:340px;
  max-height:520px;
  display:flex;
  align-items:center;
  justify-content:center;
}
.faturas-preview--expandido{
  max-height: calc(100vh - 200px);
  min-height: calc(100vh - 200px);
}
.faturas-preview-frame{
  width:100%;
  height:520px;
  border:none;
  background:#fff;
}
.faturas-preview--expandido .faturas-preview-frame{
  height: calc(100vh - 200px);
}
.faturas-preview-imgwrap{
  position:relative;
  width:100%;
  height:100%;
  overflow:hidden;
  background:#1a1a1a;
  cursor:grab;
  user-select:none;
}
.faturas-preview-imgwrap.is-grabbing{
  cursor:grabbing;
}
.faturas-preview-imgwrap::after{
  content: attr(data-tip);
  position:absolute;
  left:8px;
  bottom:8px;
  padding:4px 8px;
  font-size:11px;
  color:#e2e8f0;
  background:rgba(0,0,0,0.55);
  border-radius:4px;
  pointer-events:none;
  opacity:0;
  transition: opacity .2s ease;
}
.faturas-preview-imgwrap:hover::after{
  opacity:1;
}
.faturas-preview-img{
  position:absolute;
  top:0;
  left:0;
  max-width:none;
  max-height:none;
  display:block;
  background:#fff;
  user-select:none;
  -webkit-user-drag:none;
}
.faturas-preview-fallback{
  color:#cbd5e1;
  padding:20px;
  font-size:12px;
}

/* Modo preview expandido: painel ocupa toda a largura */
.bd-split--preview-expandido .bd-split-panel{
  flex: 1 1 auto;
  max-width: 100%;
  flex-basis: auto;
}

/* Barra de actions do painel da fatura */
.bd-panel-actions{
  display:flex;
  gap:6px;
  align-items:center;
  flex-wrap:wrap;
  margin-left:auto;
}
.bd-panel-actions--bottom{
  margin: 8px 0 0;
  padding-top: 6px;
  border-top: 1px solid var(--ink-7, #e5e7eb);
}
.bd-panel-btn:disabled{
  opacity: .4;
  cursor: not-allowed;
}

.bd-panel-btn{
  background:transparent;
  border:1px solid var(--ink-7, #e5e7eb);
  color:var(--ink-3, #6b7280);
  font-size:11px;
  font-weight:600;
  padding:3px 9px;
  border-radius:4px;
  cursor:pointer;
  margin-left:auto;
}
.bd-panel-btn:hover{
  border-color:var(--red, #a62639);
  color:var(--red, #a62639);
}

/* Anomalia: linha com obra suspeita */
.faturas-anomalia{
  color:#92400E;
  font-weight:600;
  background:#FEF3C7;
  padding:1px 6px;
  border-radius:3px;
  font-size:11px;
}
.bd-list-row.is-anomalia{
  background:#FFFBEB;
}
.bd-list-row.is-anomalia:hover{
  background:#FEF3C7;
}

/* Badge laranja indicando faturas em standby ao lado do contador da tab */
.faturas-tab-standby{
  display:inline-block;
  margin-left:4px;
  padding:0 5px;
  border-radius:8px;
  background:#FED7AA;
  color:#9A3412;
  font-size:10px;
  font-weight:600;
}

/* NC sem fatura original referida — badge vermelho clicável → /import-faturas */
.badge-fatura-ref-vazia{
  display:inline-block;
  color:#fff;
  background:#DC2626;
  padding:2px 7px;
  border-radius:3px;
  font-size:10.5px;
  font-weight:600;
  text-decoration:none;
  cursor:pointer;
  white-space:nowrap;
}
.badge-fatura-ref-vazia:hover{
  background:#B91C1C;
  text-decoration:none;
}

/* KPI especial para anomalias */
.faturas-kpi--warn{
  background:#FFFBEB;
  border-color:#FDE68A;
}
.faturas-kpi--warn .faturas-kpi-label{ color:#92400E; }
.faturas-kpi--warn .faturas-kpi-value{ color:#92400E; }

.tbl--faturas tbody td{ font-size: 11.5px; }
.tbl--faturas thead th{ font-size: 10.5px; }

/* T2.5 v3.12s (2026-05-16): bloco sticky único (toolbar + tabs)
   nas páginas Documentos / Finanças / SAFT. O sub-toggle Compra/RV fica FORA
   para uniformizar altura entre vistas. O thead da tabela cola por baixo. */
.docs-sticky{
  position: sticky;
  top: 0;
  z-index: 12;
  background: #fff;
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 4px 4px 6px;
  margin: -4px -4px 8px;
  box-shadow: 0 2px 4px rgba(0,0,0,.04);
}
.docs-sticky .toolbar{ margin-bottom: 0; }
.docs-sticky .faturas-tabs{ margin: 0; }
/* Thead das tabelas principais: sticky em cada TH individual.
   Top de 0 porque o scroll é do .app-content e o .docs-sticky cola em top:0
   neste container. Para garantir que o thead cola por baixo do .docs-sticky,
   usamos a altura do bloco (~96px). Background sólido + shadow inferior +
   z-index alto isolam visualmente do tbody. */
.tbl--docs thead th{
  position: -webkit-sticky;
  position: sticky;
  /* CSS variable atualizada em runtime via ResizeObserver no FaturasPage —
     mede a altura real do .docs-sticky para não sobrepor a 1ª linha. */
  top: var(--docs-sticky-h, 96px);
  background: #ffffff;
  border-bottom: 2px solid #cbd5e1;
  box-shadow: 0 2px 4px -1px rgba(0,0,0,.08);
  z-index: 11;
  vertical-align: middle;
  white-space: nowrap;
}
/* Linhas do tbody com altura mínima e fundo branco, para não dar overlap
   visual com o thead sticky quando estão muito perto. */
.tbl--docs tbody tr{
  background: #ffffff;
}
/* Tabelas pequenas dentro de blocos de stats (Por Ano/Tipo/Método em SAF-T
   resumo, e KPIs faturas-sumario): NÃO devem ser sticky. Override do
   .tbl--bd thead th global. */
.faturas-stats-rank .tbl--bd thead th,
.faturas-sumario .tbl--bd thead th{
  position: static;
  top: auto;
  z-index: auto;
}

/* T2.5 v3.12m (2026-05-16): toggle de vistas de estatísticas em /faturas */
.faturas-stats-toggle{
  display:flex; gap:6px; padding:8px 12px 0;
}
.faturas-stats-tab{
  padding:4px 10px;
  border:1px solid #E5E7EB;
  background:#fff;
  border-radius:6px;
  font-size:11px;
  cursor:pointer;
  color:#374151;
}
.faturas-stats-tab.is-active{
  background:#1F2937;
  color:#fff;
  border-color:#1F2937;
}
.faturas-stats-rank{
  margin:8px 12px 12px;
  padding:10px 12px;
  background:#F9FAFB;
  border:1px solid #E5E7EB;
  border-radius:6px;
}
.faturas-stats-rank-titulo{
  font-size:11px; font-weight:600; color:#6b7280; margin-bottom:6px;
}
.faturas-stats-list{
  list-style:none; padding:0; margin:0;
  display:flex; flex-direction:column; gap:4px;
}
.faturas-stats-row{
  display:grid;
  grid-template-columns: minmax(140px, 220px) 1fr 80px 60px;
  gap:8px;
  align-items:center;
  font-size:11.5px;
}
.faturas-stats-row-lbl{
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  font-weight:500;
}
.faturas-stats-bar-wrap{
  height:14px; background:#E5E7EB; border-radius:3px; overflow:hidden;
}
.faturas-stats-bar{
  height:100%; background:linear-gradient(to right, #3B82F6, #1D4ED8);
}
.faturas-stats-row-val{ text-align:right; font-variant-numeric:tabular-nums; font-weight:600; }
.faturas-stats-row-n{ text-align:right; font-size:10.5px; }

/* Distribuição mensal — barras verticais */
.faturas-stats-mes{
  display:flex; align-items:flex-end; gap:6px;
  height:120px;
  padding:0 4px;
}
.faturas-stats-mes-col{
  display:flex; flex-direction:column; align-items:center; flex:1;
  min-width:38px; max-width:64px;
}
.faturas-stats-mes-bar-wrap{
  flex:1; width:100%;
  display:flex; align-items:flex-end;
}
.faturas-stats-mes-bar{
  width:100%;
  background:linear-gradient(to top, #3B82F6, #60A5FA);
  border-radius:3px 3px 0 0;
  min-height:2px;
}
.faturas-stats-mes-lbl{
  font-size:10px; color:#6b7280; margin-top:3px;
}
.faturas-stats-mes-val{
  font-size:9px; color:#9ca3af;
}

/* T2.5 v3.12m (2026-05-16): colunas data/pago/doc afinadas — sem quebra
 * de linha em campos curtos; doc com truncagem à esquerda + tooltip+copy. */
.tbl--faturas td.cell-nowrap,
.tbl--faturas th.cell-nowrap{
  white-space: nowrap;
}
.tbl--faturas td.cell-doc{
  white-space: nowrap;
  cursor: pointer;
  font-family: monospace;
  font-size: 11px;
}
.tbl--faturas td.cell-doc.is-copied{
  background: #DCFCE7;
  transition: background 0.4s;
}
.bd-panel-row-meta{
  flex:0 0 auto;
  font-size:11px;
  color:var(--ink-3, #6b7280);
}
.bd-panel-row-tag{
  font-size:9.5px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.5px;
  background:#f3f4f6;
  color:var(--ink-3, #6b7280);
  padding:1px 5px;
  border-radius:3px;
}
.bd-panel-row-tag--base{
  background:rgba(166,38,57,.10);
  color:var(--red, #a62639);
}
.bd-panel-row-atv{
  flex:1 1 auto;
  font-weight:500;
  min-width:0;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.bd-panel-row-rend{
  flex:0 0 auto;
  font-variant-numeric: tabular-nums;
  font-size:11.5px;
  color:var(--ink-3, #6b7280);
}
.bd-panel-row-pct{
  flex:0 0 auto;
  font-weight:700;
  font-variant-numeric: tabular-nums;
  color:var(--ink);
  min-width:42px;
}
.bd-panel-row-label{
  flex:1 1 auto;
  font-size:11.5px;
  color:var(--ink-3, #6b7280);
  font-style:italic;
}
.bd-panel-row-unidade{
  flex:0 0 auto;
  font-weight:700;
  font-size:13px;
  color:var(--ink);
  background:#f3f4f6;
  padding:2px 8px;
  border-radius:4px;
  letter-spacing:.3px;
}
.bd-panel-row-conv{
  flex:1 1 auto;
  font-size:12.5px;
  color:var(--ink);
  display:inline-flex;
  align-items:center;
  gap:4px;
  flex-wrap:wrap;
}
.bd-panel-row-conv b{ color:var(--red, #a62639); font-weight:700; }
.bd-panel-row-prefix{
  flex:0 0 auto;
  font-size:12.5px;
  color:var(--ink);
}
.bd-panel-row-prefix b{ color:var(--red, #a62639); font-weight:700; }
.bd-panel-row-x{
  flex:0 0 auto;
  background:transparent;
  border:none;
  color:var(--ink-4, #9ca3af);
  cursor:pointer;
  font-size:13px;
  width:22px;
  height:22px;
  border-radius:4px;
  display:flex;
  align-items:center;
  justify-content:center;
}
.bd-panel-row-x:hover{ background:#fee2e2; color:#b91c1c; }
.bd-panel-row-confirm{
  flex:0 0 auto;
  background:transparent;
  border:none;
  color:#059669;
  cursor:pointer;
  font-size:14px;
  width:22px;
  height:22px;
  border-radius:4px;
  display:flex;
  align-items:center;
  justify-content:center;
  font-weight:700;
}
.bd-panel-row-confirm:hover{ background:#d1fae5; }
.bd-panel-row--editing{
  border-style:solid;
  border-color:var(--red, #a62639);
  background:#fffafa;
}
.bd-panel-input{
  background:#fff;
  border:1px solid #d1d5db;
  border-radius:4px;
  padding:3px 7px;
  font-size:12.5px;
  font-family:inherit;
}
.bd-panel-input:focus{
  outline:none;
  border-color:var(--red, #a62639);
  box-shadow:0 0 0 3px rgba(166,38,57,.12);
}
.bd-panel-input--num{ width:64px; text-align:right; font-variant-numeric: tabular-nums; }
.bd-panel-input--un{ width:76px; }
.bd-panel-input--forn{ flex:1 1 auto; min-width:0; }
.bd-panel-input--un-select{
  font-family: inherit;
  cursor: pointer;
  padding: 3px 4px;
  min-width:62px;
}

/* Bolinha de origem do material (azul=fatura / verde=fatura+orcamento).
   T2.5 v3.11i (2026-05-15). Sem bolinha quando é só de orçamentos. */
.mat-origem-dot{
  display:inline-block;
  width:8px;
  height:8px;
  border-radius:50%;
  margin-left:6px;
  vertical-align: middle;
  cursor:help;
}
.mat-origem-dot--azul{ background:#3B82F6; box-shadow: 0 0 0 2px rgba(59,130,246,.15); }
.mat-origem-dot--verde{ background:#10B981; box-shadow: 0 0 0 2px rgba(16,185,129,.15); }
.mat-origem-dot--lg{ width:10px; height:10px; margin-left:8px; }

/* Histórico de preços (mín/médio/máx) no topo da secção Fornecedores. */
.bd-panel-historico{
  display:grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap:6px;
  margin: 0 0 8px;
}
.bd-panel-historico-cell{
  background:#fff;
  border:1px solid var(--ink-7, #e5e7eb);
  border-radius:6px;
  padding:6px 8px;
  text-align:center;
  display:flex;
  flex-direction:column;
  gap:2px;
}
.bd-panel-historico-label{
  font-size:10px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.5px;
  color:var(--ink-3, #6b7280);
}
.bd-panel-historico-value{
  font-size:13px;
  font-weight:700;
  color:var(--red, #a62639);
  font-variant-numeric: tabular-nums;
}
.bd-panel-historico-un{
  font-size:10.5px;
  font-weight:600;
  color:var(--ink-3, #6b7280);
  margin-left:2px;
}

/* Pill de categoria do material (no painel de Materiais) — cor vem inline
   de constants/categoriasMaterial.ts. T2.5 v3.11 (2026-05-15). */
.mat-categoria-pill{
  display:inline-block;
  font-size:11px;
  font-weight:700;
  padding:2px 9px;
  border-radius:10px;
  letter-spacing:.3px;
  background:#F3F4F6;
  color:#6B7280;
  cursor:pointer;
}
.mat-categoria-pill:hover{ filter:brightness(.96); }
.bd-panel-row--addforn{ gap:6px; }

.bd-panel-add-btn{
  align-self:flex-start;
  margin-top:3px;
  background:transparent;
  border:1px dashed #d1d5db;
  color:var(--ink-3, #6b7280);
  font-size:12px;
  font-weight:600;
  padding:5px 12px;
  border-radius:5px;
  cursor:pointer;
  transition: all .12s;
}
.bd-panel-add-btn:hover{
  border-color:var(--red, #a62639);
  color:var(--red, #a62639);
  background:rgba(166,38,57,.05);
}

.bd-panel-hint{
  margin:8px 2px 0;
  font-size:11.5px;
  color:var(--ink-3, #6b7280);
  font-style:italic;
  line-height:1.45;
}
.bd-panel-vazio{
  flex:1;
  display:flex;
  align-items:center;
  justify-content:center;
  padding:24px;
}
.bd-panel-vazio .empty{
  max-width:280px;
  text-align:center;
}

/* ───── Fornecedores: pill de tipo, kvrow contactos, grupos de preços ───── */
.forn-tipo-pill{
  display:inline-block;
  font-size:10.5px;
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:.4px;
  padding:2px 8px;
  border-radius:10px;
  background:#f3f4f6;
  color:var(--ink-3, #6b7280);
}
.forn-tipo-pill--material{ background:rgba(166,38,57,.10); color:var(--red, #a62639); }
.forn-tipo-pill--sub{ background:rgba(124,58,237,.12); color:#7C3AED; }
.forn-tipo-pill--ambos{ background:rgba(37,99,235,.10); color:#2563EB; }
.forn-tipo-pill--btn{
  border:none;
  cursor:pointer;
  font-family:inherit;
}
.forn-tipo-pill--btn:hover{ filter:brightness(.95); }

.bd-panel-kvrow{
  display:flex;
  align-items:flex-start;
  gap:10px;
  padding:5px 0;
  border-bottom:1px solid #f1f3f5;
  font-size:12.5px;
}
.bd-panel-kvrow:last-child{ border-bottom:none; }
.bd-panel-kvrow-key{
  flex:0 0 70px;
  color:var(--ink-3, #6b7280);
  font-size:11px;
  font-weight:600;
  text-transform:uppercase;
  letter-spacing:.4px;
  padding-top:3px;
}

.bd-panel-grupo{
  background:#fff;
  border:1px solid #f1f3f5;
  border-radius:6px;
  padding:6px 10px;
}
.bd-panel-grupo-titulo{
  display:flex;
  align-items:center;
  gap:8px;
  margin-bottom:4px;
  padding-bottom:4px;
  border-bottom:1px solid #f3f4f6;
}
.bd-panel-grupo-nome{
  flex:1 1 auto;
  font-weight:700;
  font-size:13px;
  color:var(--ink);
  min-width:0;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.bd-panel-grupo-un{
  flex:0 0 auto;
  font-size:10.5px;
  font-weight:600;
  color:var(--ink-3, #6b7280);
  background:#f3f4f6;
  padding:1px 6px;
  border-radius:3px;
}
.bd-panel-row--sub{
  border:none;
  background:transparent;
  padding:3px 0;
  font-size:12px;
}

/* T2.5 v3.11x (2026-05-15): /import-faturas — workspace de revisão */
.import-decisao-bar{
  display:flex;
  gap:8px;
  margin:8px 0 12px;
  padding:10px;
  background:#f8fafc;
  border:1px solid #e5e7eb;
  border-radius:6px;
}
.import-btn{
  flex:1;
  display:flex;
  align-items:center;
  justify-content:center;
  gap:6px;
  font-weight:600;
  padding:8px 10px;
  font-size:13px;
  border:1px solid transparent;
}
.import-btn kbd{
  font-size:10px;
  padding:1px 5px;
  background:rgba(0,0,0,0.08);
  border-radius:3px;
  font-family:inherit;
}
.import-btn--aceitar{ background:#ecfdf5; color:#047857; border-color:#a7f3d0; }
.import-btn--aceitar.is-active{ background:#047857; color:#fff; }
.import-btn--standby{ background:#fffbeb; color:#a16207; border-color:#fde68a; }
.import-btn--standby.is-active{ background:#a16207; color:#fff; }
.import-btn--rejeitar{ background:#fef2f2; color:#b91c1c; border-color:#fecaca; }
.import-btn--rejeitar.is-active{ background:#b91c1c; color:#fff; }

.import-overrides{
  display:flex;
  flex-direction:column;
  gap:6px;
  margin-bottom:12px;
  padding:10px;
  background:#f8fafc;
  border:1px solid #e5e7eb;
  border-radius:6px;
}
.import-override-row{
  display:flex;
  align-items:center;
  gap:8px;
}
.import-override-row label{
  width:56px;
  font-size:11px;
  font-weight:600;
  color:#475569;
}
.import-override-row input,
.import-override-row select{
  font-size:12px;
}

/* Incongruências / pontos de atenção */
.import-incongr{
  border-radius:6px;
  padding:10px 12px;
  margin-bottom:10px;
  font-size:12px;
}
.import-incongr--ok{
  background:#ecfdf5;
  color:#047857;
  border:1px solid #a7f3d0;
  font-weight:600;
}
.import-incongr--warn{
  background:#fffbeb;
  color:#92400e;
  border:1px solid #fde68a;
}
.import-incongr-titulo{
  font-weight:700;
  margin-bottom:4px;
}
.import-incongr ul{
  margin:4px 0 0 18px;
  padding:0;
}
.import-incongr li{
  margin:2px 0;
}

/* Grupos visuais (Por Obra / Por Fornecedor) */
.import-grupo{
  margin-bottom:14px;
  border:1px solid #e5e7eb;
  border-radius:6px;
  background:#fff;
  overflow:hidden;
}
.import-grupo > summary{
  cursor:pointer;
  padding:8px 12px;
  background:#f1f5f9;
  font-size:13px;
  list-style:none;
  display:flex;
  align-items:center;
  gap:8px;
}
.import-grupo > summary::-webkit-details-marker{ display:none; }
.import-grupo > summary::before{
  content:'▾';
  color:#64748b;
  font-size:10px;
  transition: transform .15s;
}
.import-grupo:not([open]) > summary::before{
  transform: rotate(-90deg);
}
.import-grupo-count{
  margin-left:auto;
  background:#cbd5e1;
  color:#334155;
  border-radius:10px;
  padding:1px 8px;
  font-size:11px;
  font-weight:600;
}

/* T2.5 v3.12 (2026-05-15): Dialog "Pronta para Envio" — variações BD */
.modal--variacoes-bd{
  max-width:760px;
  width:90vw;
  max-height:90vh;
  display:flex;
  flex-direction:column;
}
.variacoes-section{
  margin-bottom:14px;
  border:1px solid #e5e7eb;
  border-radius:6px;
  background:#fff;
  overflow:hidden;
}
.variacoes-section-titulo{
  margin:0;
  padding:8px 12px;
  font-size:13px;
  font-weight:700;
  background:#f1f5f9;
  color:#334155;
  border-bottom:1px solid #e5e7eb;
  display:flex;
  align-items:center;
  justify-content:space-between;
}
/* v3.12f (2026-05-15): secção dos preços médios estatísticos (aviso) */
.variacoes-section--medio{
  border-color:#fcd34d;
  background:#fffbeb;
}
.variacoes-section--medio .variacoes-section-titulo{
  background:#fef3c7;
  color:#92400e;
  border-bottom-color:#fcd34d;
}
.variacoes-aviso{
  padding:8px 12px;
  font-size:12px;
  color:#92400e;
  background:#fffbeb;
  border-bottom:1px solid #fcd34d;
  line-height:1.45;
}
.variacoes-rejeitar-todos-medios{
  font-size:11px !important;
  padding:3px 8px !important;
  color:#b91c1c !important;
  border:1px solid #fecaca !important;
  background:#fff !important;
}
.variacoes-rejeitar-todos-medios:hover{
  background:#fee2e2 !important;
}
.variacoes-linha{
  display:flex;
  align-items:center;
  gap:12px;
  padding:8px 12px;
  border-top:1px solid #f1f5f9;
}
.variacoes-linha:first-of-type{ border-top:none; }
.variacoes-linha-info{ flex:1; font-size:12px; }
.variacoes-btns{ display:flex; gap:4px; flex-shrink:0; }
.variacoes-btn{
  width:28px; height:28px;
  border:1px solid #e5e7eb;
  background:#fff;
  border-radius:4px;
  font-weight:700;
  cursor:pointer;
  font-size:13px;
}
.variacoes-btn--aceite{ color:#047857; }
.variacoes-btn--aceite.is-active{ background:#047857; color:#fff; border-color:#047857; }
.variacoes-btn--standby{ color:#a16207; }
.variacoes-btn--standby.is-active{ background:#a16207; color:#fff; border-color:#a16207; }
.variacoes-btn--rejeitada{ color:#b91c1c; }
.variacoes-btn--rejeitada.is-active{ background:#b91c1c; color:#fff; border-color:#b91c1c; }

.variacoes-pct--sobe{ color:#b91c1c; font-weight:700; }
.variacoes-pct--desce{ color:#047857; font-weight:700; }

.variacoes-legenda{
  font-size:11px;
  color:#64748b;
  padding:8px 0;
  border-top:1px solid #e5e7eb;
  margin-top:8px;
}

.variacoes-foot{
  display:flex;
  align-items:center;
  gap:8px;
  padding:10px 16px;
  border-top:1px solid #e5e7eb;
  background:#f9fafb;
}

/* Bolinha laranja para registos em standby na /bd/materiais */
.bd-standby-dot{
  display:inline-block;
  width:8px;
  height:8px;
  border-radius:50%;
  background:#f59e0b;
  margin-right:6px;
  flex-shrink:0;
  cursor:help;
}

/* T2.5 v3.11as (2026-05-15): aba API extraiu — UI refeita */
.api-extraiu-toolbar{
  display:flex;
  gap:10px;
  align-items:center;
  margin-bottom:12px;
  padding:10px 12px;
  background:#f8fafc;
  border:1px solid #e5e7eb;
  border-radius:6px;
}
.api-extraiu-kpis{ display:flex; gap:14px; }
.api-kpi{ display:flex; flex-direction:column; align-items:flex-start; gap:2px; }
.api-kpi-label{ font-size:10px; color:#64748b; text-transform:uppercase; letter-spacing:0.4px; }
.api-kpi-value{ font-size:18px; font-weight:700; }
.api-extraiu-split{ gap:14px; }
.api-extraiu-list{ flex:0 0 320px; max-width:320px; }
.api-extraiu-panel{ flex:1; }
.api-list-cards{ display:flex; flex-direction:column; gap:6px; }
.api-list-card{
  padding:8px 10px;
  background:#fff;
  border:1px solid #e5e7eb;
  border-radius:6px;
  cursor:pointer;
  transition: background .15s ease, border-color .15s ease;
}
.api-list-card:hover{ background:#f8fafc; border-color:#cbd5e1; }
.api-list-card.is-selected{ background:#eff6ff; border-color:#3b82f6; }
.api-list-card-head{ display:flex; align-items:center; gap:6px; margin-bottom:6px; }
.api-list-card-est{
  display:inline-flex; align-items:center; justify-content:center;
  width:18px; height:18px; border-radius:50%; color:#fff;
  font-weight:700; font-size:11px;
}
.api-list-card-tipo{
  display:inline-block; padding:2px 7px; border-radius:10px;
  font-size:10px; font-weight:600;
}
.api-list-card-conf{ margin-left:auto; font-size:11px; }
.api-list-card-forn{
  font-weight:600; font-size:12px; color:#0f172a; margin-bottom:3px;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.api-list-card-meta{ display:flex; justify-content:space-between; font-size:11px; color:#64748b; }
.api-list-card-doc{ font-size:10px; font-family: ui-monospace, monospace; margin-top:2px; }
.api-list-card-obra{ font-size:11px; color:#1e40af; margin-top:3px; }
.api-hero{
  padding:14px 16px; background:#fff;
  border:1px solid #e5e7eb; border-left-width:4px;
  border-radius:6px; margin-bottom:10px;
}
.api-hero-tipo{ font-size:12px; font-weight:700; text-transform:uppercase; letter-spacing:0.5px; margin-bottom:4px; }
.api-hero-fornecedor{ font-size:18px; font-weight:700; color:#0f172a; margin-bottom:6px; }
.api-hero-meta{ display:flex; gap:14px; flex-wrap:wrap; align-items:center; font-size:12px; color:#475569; }
.api-hero-valor{ font-size:18px; font-weight:700; color:#047857; margin-left:auto; }
.api-conf-pill{ padding:2px 8px; border-radius:10px; font-size:10px; font-weight:600; }
.api-conf-pill--alta{ background:#d1fae5; color:#047857; }
.api-conf-pill--media{ background:#fef3c7; color:#92400e; }
.api-conf-pill--baixa{ background:#fee2e2; color:#991b1b; }
.api-acoes{ display:flex; gap:8px; margin-bottom:10px; }
.api-btn-acao{ flex:1; padding:10px; font-size:13px; font-weight:600; border:1px solid transparent; }
.api-btn-aceitar{ background:#ecfdf5; color:#047857; border-color:#a7f3d0; }
.api-btn-aceitar.is-active{ background:#047857; color:#fff; }
.api-btn-standby{ background:#fffbeb; color:#a16207; border-color:#fde68a; }
.api-btn-standby.is-active{ background:#a16207; color:#fff; }
.api-btn-rejeitar{ background:#fef2f2; color:#b91c1c; border-color:#fecaca; }
.api-btn-rejeitar.is-active{ background:#b91c1c; color:#fff; }
.api-direcionar{ margin-bottom:10px; padding:12px; background:#fff; border:1px solid #e5e7eb; border-radius:6px; }
.api-section-title{
  font-size:12px; font-weight:700; color:#475569; margin-bottom:8px;
  text-transform:uppercase; letter-spacing:0.4px;
}
.api-direcionar-grid{ display:grid; grid-template-columns: repeat(4, 1fr); gap:8px; }
.api-destino-btn{
  display:flex; flex-direction:column; align-items:center; gap:3px;
  padding:10px; background:#fff; border:1px solid #e5e7eb;
  border-radius:6px; cursor:pointer; transition: all .15s ease;
}
.api-destino-btn:hover{ background:#f8fafc; border-color:#94a3b8; }
.api-destino-btn.is-active{ background:#dbeafe; border-color:#3b82f6; }
.api-destino-icon{ font-size:20px; }
.api-destino-label{ font-size:11px; font-weight:600; color:#0f172a; }
.api-destino-sub{ font-size:10px; color:#64748b; }
.api-card{ background:#fff; border:1px solid #e5e7eb; border-radius:6px; margin-bottom:8px; padding:8px 12px; }
.api-card-head{ font-size:12px; font-weight:600; color:#475569; cursor:pointer; padding:4px 0; user-select:none; }
.api-card[open] .api-card-head{ margin-bottom:8px; border-bottom:1px solid #f1f5f9; padding-bottom:6px; }
.api-fields-grid{ display:grid; grid-template-columns: repeat(2, 1fr); gap:8px; }
.api-field{ display:flex; flex-direction:column; gap:3px; }
.api-field label{ font-size:10px; font-weight:600; color:#64748b; text-transform:uppercase; letter-spacing:0.3px; }
.api-hint{ margin-top:8px; padding:6px 8px; background:#fef3c7; border-radius:4px; font-size:11px; color:#92400e; }
.api-email-ctx{ font-size:12px; display:flex; flex-direction:column; gap:4px; }
.api-email-ctx strong{ color:#475569; margin-right:4px; }
.api-motivo{ padding:8px 10px; background:#f8fafc; border-radius:4px; font-size:12px; color:#475569; line-height:1.5; }
.tbl--api-items{ font-size:11px; width:100%; }
.tbl--api-items th{ font-size:10px; text-transform:uppercase; color:#64748b;
}
.bd-standby-row{
  background:#fffbeb !important;
}

/* T2.5 v3.12b (2026-05-15): pills de atividade no dialog de variações */
.variacoes-atvs{
  display:inline-flex;
  gap:4px;
  align-items:center;
  flex-wrap:wrap;
  margin-right:8px;
}
.variacoes-atv-pill{
  background:#e2e8f0;
  color:#475569;
  border-radius:10px;
  padding:1px 8px;
  font-size:10px;
  font-weight:600;
  font-family:monospace;
  cursor:help;
  white-space:nowrap;
}

/* Bolinha ROXA: material fantasma na drawer ATV (criado no orçamento, não na BD) */
.mat-origem-dot--roxo{
  display:inline-block;
  width:8px;
  height:8px;
  border-radius:50%;
  background:#9333ea;
  margin-left:6px;
  flex-shrink:0;
  cursor:help;
}
/* Check verde: material que veio da BD */
.mat-origem-dot--check{
  display:inline-block;
  margin-left:6px;
  color:#047857;
  font-weight:700;
  font-size:10px;
}
/* v3.12i (2026-05-15): overlay mirror para colocar a bolinha de origem
 *  inline a seguir ao texto no MaterialNomeInput do drawer ATV.
 *  - .mat-nome-overlay tem as MESMAS dimensões/font/padding do textarea
 *  - .mat-nome-overlay-text é invisível mas ocupa o espaço do texto
 *  - .mat-nome-overlay-dot aparece a seguir ao texto, segue conforme o texto cresce */
.mat-nome-overlay{
  position:absolute;
  inset:0;
  padding:2px 4px;
  font-size:12px;
  font-weight:600;
  line-height:1.3;
  white-space:pre-wrap;
  word-break:break-word;
  pointer-events:none;
  font-family:inherit;
}
.mat-nome-overlay-text{
  visibility:hidden;
}
.mat-nome-overlay-dot{
  display:inline-block;
  vertical-align:middle;
  margin-left:6px;
  width:8px;
  height:8px;
  border-radius:50%;
  pointer-events:auto;
  cursor:help;
}
/* cores das bolinhas no overlay */
.mat-nome-overlay-dot.mat-origem-dot--roxo{
  background:#9333ea;
  box-shadow:0 0 0 2px rgba(147,51,234,.15);
}
.mat-nome-overlay-dot.mat-origem-dot--amarelo{
  background:#eab308;
  box-shadow:0 0 0 2px rgba(234,179,8,.18);
}
.mat-nome-overlay-dot.mat-origem-dot--check,
.mat-nome-overlay-dot.mat-origem-dot--check2{
  width:auto;
  height:auto;
  background:transparent;
  box-shadow:none;
  color:#047857;
  font-weight:800;
  font-size:11px;
  line-height:1;
  margin-left:4px;
  letter-spacing:-2px;
}

/* v3.12i (2026-05-15): #13 — modal detalhe do material (botão direito no drawer ATV). */
.modal--mat-detail{
  width:min(720px, 92vw);
  max-height:85vh;
  display:flex;
  flex-direction:column;
}
.modal--mat-detail .modal-body{
  overflow-y:auto;
  padding:16px 18px;
}
.mat-detail-meta{
  display:flex;
  flex-wrap:wrap;
  gap:8px 12px;
  align-items:center;
  font-size:12px;
  color:var(--ink-3, #4b5563);
  margin-bottom:14px;
  padding-bottom:10px;
  border-bottom:1px solid #f1f5f9;
}
.mat-detail-badge{
  font-size:10.5px;
  font-weight:700;
  padding:2px 7px;
  border-radius:4px;
  text-transform:uppercase;
  letter-spacing:.04em;
}
.mat-detail-badge--fatura{ background:#dcfce7; color:#047857; }
.mat-detail-badge--orc{ background:#ecfdf5; color:#10b981; }
.mat-detail-precos{ display:flex; flex-direction:column; gap:12px; }
.mat-detail-forn-group{
  border:1px solid #e5e7eb;
  border-radius:6px;
  overflow:hidden;
}
.mat-detail-forn-nome{
  margin:0;
  padding:6px 10px;
  font-size:12px;
  font-weight:700;
  background:#f8fafc;
  color:#1f2937;
  border-bottom:1px solid #e5e7eb;
}
.mat-detail-table{
  width:100%;
  border-collapse:collapse;
  font-size:12px;
}
.mat-detail-table th{
  text-align:left;
  font-weight:600;
  color:var(--ink-4, #6b7280);
  font-size:10.5px;
  text-transform:uppercase;
  letter-spacing:.04em;
  padding:5px 10px;
  background:#fafbfc;
}
.mat-detail-table td{
  padding:6px 10px;
  border-top:1px solid #f1f5f9;
}
.mat-detail-table tr.is-standby{ background:#fff7ed; }
.mat-detail-legacy{ font-size:12px; }
/* v3.12j (2026-05-15): secção fantasmas (em curso) no modal detalhe */
.mat-detail-fantasmas{
  margin-top:18px;
  padding-top:14px;
  border-top:2px dashed #9333ea;
}
.mat-detail-fantasmas-titulo{
  margin:0 0 10px;
  font-size:12px;
  font-weight:700;
  color:#9333ea;
  text-transform:uppercase;
  letter-spacing:.04em;
}
.mat-detail-fantasmas-bloco{ margin-bottom:12px; }
.mat-detail-fantasmas-bloco-titulo{
  font-size:11px;
  font-weight:600;
  color:#7c3aed;
  margin-bottom:4px;
}
.mat-detail-fantasmas-lista{
  list-style:none;
  padding:0;
  margin:0;
  font-size:12px;
}
.mat-detail-fantasmas-lista li{
  padding:4px 8px;
  border-top:1px solid #f3e8ff;
  background:#faf5ff;
}
.mat-detail-fantasmas-lista li:first-child{ border-top:none; }
.mat-detail-table--fantasma{ background:#faf5ff; }
.mat-detail-table--fantasma th{ background:#f3e8ff; color:#6b21a8; }

/* v3.12k (2026-05-15): #3 — Dialog migração legacy. */
.modal--migracao-legacy{
  width:min(800px, 95vw);
  max-height:90vh;
  display:flex;
  flex-direction:column;
}
.modal--migracao-legacy .modal-body{ overflow-y:auto; padding:16px 18px; }
.migracao-resumo{
  display:flex;
  flex-wrap:wrap;
  gap:6px 4px;
  font-size:13px;
  color:var(--ink-3, #4b5563);
  padding-bottom:10px;
  border-bottom:1px solid #f1f5f9;
  margin-bottom:14px;
}
.migracao-secao{
  margin-top:14px;
  border:1px solid #e5e7eb;
  border-radius:6px;
  overflow:hidden;
}
.migracao-secao-titulo{
  margin:0;
  padding:7px 12px;
  font-size:12px;
  font-weight:700;
  background:#f1f5f9;
  color:#334155;
  border-bottom:1px solid #e5e7eb;
}
.migracao-lista{
  margin:0;
  padding:8px 14px 8px 28px;
  font-size:12.5px;
}
.migracao-lista li{ padding:2px 0; }
.migracao-tabela{
  width:100%;
  border-collapse:collapse;
  font-size:12px;
}
.migracao-tabela th{
  text-align:left;
  padding:5px 10px;
  background:#fafbfc;
  color:var(--ink-4, #6b7280);
  font-size:10.5px;
  text-transform:uppercase;
  letter-spacing:.04em;
  border-bottom:1px solid #e5e7eb;
}
.migracao-tabela td{
  padding:5px 10px;
  border-top:1px solid #f1f5f9;
}
.migracao-novo-badge{
  font-size:9.5px;
  background:#7c3aed;
  color:#fff;
  padding:1px 6px;
  border-radius:3px;
  margin-left:6px;
  font-weight:700;
  letter-spacing:.05em;
}
.migracao-erro{
  margin-top:12px;
  padding:8px 12px;
  background:#fef2f2;
  color:#b91c1c;
  border:1px solid #fecaca;
  border-radius:4px;
  font-size:12px;
}

/* Linha ROXA: variação em curso na /bd/materiais (fantasma) */
.bd-fantasma-row{
  background:#faf5ff !important;
}
.bd-fantasma-dot{
  display:inline-block;
  width:8px;
  height:8px;
  border-radius:50%;
  background:#9333ea;
  margin-right:6px;
  flex-shrink:0;
  cursor:help;
}
/* Linha existente que está EM USO num orçamento em curso */
.bd-em-uso-row{
  box-shadow: inset 3px 0 0 #9333ea;
}

/* ─── T2.5 v3.12e (2026-05-15): Hover ± no preço unitário do drawer ATV ─── */
.mat-preco-cotacao{
  position:relative;
  display:inline-flex;
  align-items:center;
  width:100%;
}
.mat-preco-cotacao .mat-c-eur{
  width:100%;
}
.mat-cotacao-btn{
  position:absolute;
  top:50%;
  transform:translateY(-50%);
  width:18px;
  height:18px;
  padding:0;
  border:none;
  border-radius:50%;
  background:#047857;
  color:#fff;
  font-size:13px;
  font-weight:700;
  line-height:1;
  cursor:pointer;
  opacity:0;
  pointer-events:none;
  transition:opacity .12s ease, background .12s ease;
  display:inline-flex;
  align-items:center;
  justify-content:center;
  z-index:2;
}
.mat-cotacao-btn--minus{ left:-4px; }
.mat-cotacao-btn--plus{ right:-4px; }
.mat-preco-cotacao:hover .mat-cotacao-btn{
  opacity:1;
  pointer-events:auto;
}
.mat-cotacao-btn:hover{
  background:#065f46;
}
/* v3.12g (2026-05-15): cor da célula €/un por modo de cotação.
 *  - medio: azul claro (preço médio estatístico)
 *  - min:   vermelho claro (preço mínimo — pode ser optimista)
 *  - max:   verde claro (preço máximo — mais conservador)
 *  - manual/undef: sem tint (cor base) */
.mat-preco-cotacao[data-modo="medio"] input.mat-c-eur{
  background:#ecfeff;
}
.mat-preco-cotacao[data-modo="min"] input.mat-c-eur{
  background:#fef2f2;
}
.mat-preco-cotacao[data-modo="max"] input.mat-c-eur{
  background:#f0fdf4;
}

/* ═══════════════════════════════════════════════════════════════════════════
   ESTATÍSTICAS MODAL — Boletim Trimestral (2026-05-24 João)
   Modal full-screen, identidade vermelho-vinho Construsud + IBM Plex Mono.
   Gráficos SVG inline. Vê EstatisticasModal.tsx para a estrutura.
   ═══════════════════════════════════════════════════════════════════════════ */

@keyframes statsFadeIn       { from{opacity:0} to{opacity:1} }
@keyframes statsModalIn      { from{opacity:0; transform:scale(.96)} to{opacity:1; transform:scale(1)} }
@keyframes statsBarFill      { from{transform:scaleX(0)} to{transform:scaleX(1)} }
@keyframes statsItemSlideIn  { from{opacity:0; transform:translateY(6px)} to{opacity:1; transform:translateY(0)} }
@keyframes statsBarGrowY     { from{transform:scaleY(0)} to{transform:scaleY(1)} }
@keyframes statsSparkDraw    { from{stroke-dashoffset:200} to{stroke-dashoffset:0} }
@keyframes statsFunnelIn     { from{opacity:0; transform:translateY(8px)} to{opacity:1; transform:translateY(0)} }
@keyframes statsChipIn       { from{opacity:0; transform:scale(.92)} to{opacity:1; transform:scale(1)} }
@keyframes statsTabFadeIn    { from{opacity:0; transform:translateY(4px)} to{opacity:1; transform:translateY(0)} }

.stats-modal-overlay{
  position:fixed; inset:0; z-index:1200;
  background:rgba(20,25,40,.55);
  backdrop-filter:blur(8px);
  -webkit-backdrop-filter:blur(8px);
  display:flex; align-items:stretch; justify-content:center;
  animation:statsFadeIn .24s ease-out;
  padding:24px;
  font-family:var(--font);
}
.stats-modal{
  position:relative;
  flex:1; min-width:0; min-height:0;
  background:#FAFAF7;        /* papel marfim */
  border-radius:12px;
  box-shadow:0 24px 64px rgba(20,25,40,.18), 0 2px 6px rgba(20,25,40,.10);
  display:flex; flex-direction:column;
  overflow:hidden;
  animation:statsModalIn .26s cubic-bezier(.16,1,.3,1);
  max-width:1700px; margin:0 auto;
}

/* ── HEADER ───────────────────────────────────────────── */
.stats-modal-header{
  display:grid;
  grid-template-columns:1fr auto 1fr;
  align-items:center;
  gap:24px;
  padding:18px 32px 16px;
  background:#fff;
  border-bottom:1px solid var(--line);
  position:relative;
}
.stats-modal-header::after{
  content:""; position:absolute; left:32px; right:32px; bottom:-1px;
  height:2px; background:linear-gradient(90deg, var(--red-main) 0, var(--red-main) 64px, transparent 64px);
}
.stats-modal-title-wrap{ min-width:0; }
.stats-modal-eyebrow{
  font:700 10px var(--font); letter-spacing:.16em; text-transform:uppercase;
  color:var(--ink-3); margin-bottom:4px;
}
.stats-modal-title{
  font:900 22px var(--font); letter-spacing:-.01em;
  color:var(--ink); margin:0; line-height:1.1;
}
.stats-year-pills{
  display:inline-flex; gap:4px; padding:4px;
  background:#F2F3F6; border-radius:999px;
}
.stats-year-pill{
  padding:6px 14px; min-width:54px;
  border:none; background:transparent;
  font:700 12px var(--font); color:var(--ink-3);
  border-radius:999px; cursor:pointer;
  transition:background .15s, color .15s;
  font-variant-numeric:tabular-nums;
}
.stats-year-pill:hover{ color:var(--ink); }
.stats-year-pill.is-active{
  background:var(--ink); color:#fff;
  box-shadow:0 1px 2px rgba(20,25,40,.18);
}
.stats-close{
  justify-self:end;
  display:inline-flex; align-items:center; justify-content:center;
  width:36px; height:36px; border-radius:50%;
  background:transparent; border:1px solid var(--line);
  font-size:22px; line-height:1; color:var(--ink-2);
  cursor:pointer;
  transition:transform .2s ease, background .15s, border-color .15s, color .15s;
}
.stats-close:hover{
  background:var(--red-soft); border-color:var(--red-line); color:var(--red-main);
  transform:rotate(90deg);
}

/* ── KPI ROW ──────────────────────────────────────────── */
.stats-kpi-row{
  display:grid;
  grid-template-columns:repeat(5, 1fr);
  gap:14px;
  padding:20px 32px 4px;
  background:#fff;
  border-bottom:1px solid var(--line);
}
@media (max-width:1240px){
  .stats-kpi-row{ grid-template-columns:repeat(3, 1fr); }
}
@media (max-width:760px){
  .stats-kpi-row{ grid-template-columns:repeat(2, 1fr); padding:14px 16px 4px; }
}
.stats-kpi{
  position:relative;
  background:#fff;
  border:1px solid var(--line);
  border-left:3px solid var(--ink-3);
  border-radius:8px;
  padding:14px 16px 12px;
  display:flex; flex-direction:column; gap:6px;
  transition:transform .18s ease, box-shadow .18s ease, border-color .18s;
  overflow:hidden;
}
.stats-kpi:hover{
  transform:translateY(-2px);
  box-shadow:0 8px 24px rgba(122,24,24,.06), 0 2px 6px rgba(20,25,40,.06);
}
.stats-kpi-label{
  font:700 10px var(--font); letter-spacing:.12em; text-transform:uppercase;
  color:var(--ink-3);
}
.stats-kpi-value{
  font:900 30px var(--mono); letter-spacing:-.02em;
  color:var(--ink); line-height:1.05;
  font-variant-numeric:tabular-nums slashed-zero;
  margin-top:2px;
}
.stats-kpi-sub{
  font:600 11px var(--font); color:var(--ink-3);
  margin-top:auto;
}
.stats-kpi-success{ border-left-color:#1F7A3D; }
.stats-kpi-success .stats-kpi-value{ color:#1F7A3D; }
.stats-kpi-warning{ border-left-color:#A77400; }
.stats-kpi-warning .stats-kpi-value{ color:#A77400; }
.stats-kpi-info   { border-left-color:#3C5AA6; }
.stats-kpi-info    .stats-kpi-value{ color:#3C5AA6; }
.stats-kpi-danger { border-left-color:#D62E2E; }
.stats-kpi-danger  .stats-kpi-value{ color:#D62E2E; }

/* Sparkline dentro do KPI */
.stats-spark{
  width:100%; height:28px; display:block; margin-top:2px;
}
.stats-spark-line{
  stroke-dasharray:200;
  animation:statsSparkDraw 1.2s ease-out forwards;
}

/* ── TABS ─────────────────────────────────────────────── */
.stats-tabs{
  display:flex; gap:0;
  padding:0 32px;
  background:#fff;
  border-bottom:1px solid var(--line);
  position:sticky; top:0; z-index:5;
}
.stats-tab{
  position:relative;
  padding:14px 22px;
  background:transparent; border:none;
  font:800 12px var(--font); letter-spacing:.08em; text-transform:uppercase;
  color:var(--ink-3); cursor:pointer;
  transition:color .15s;
}
.stats-tab:hover{ color:var(--ink-2); }
.stats-tab.is-active{ color:var(--red-main); }
.stats-tab.is-active::after{
  content:""; position:absolute; left:22px; right:22px; bottom:-1px;
  height:2px; background:var(--red-main);
  animation:statsFadeIn .2s ease-out;
}

/* ── CONTENT ──────────────────────────────────────────── */
.stats-modal-content{
  flex:1; min-height:0;
  overflow-y:auto;
  padding:24px 32px 40px;
  animation:statsTabFadeIn .26s ease-out;
}
.stats-tab-content{
  display:flex; flex-direction:column; gap:20px;
}
@media (max-width:760px){
  .stats-modal-content{ padding:16px; }
  .stats-modal-header{ padding:14px 16px; grid-template-columns:1fr auto; }
  .stats-year-pills{ grid-column:1 / -1; justify-self:start; }
}

/* ── SECTION ──────────────────────────────────────────── */
.stats-section{
  background:#fff;
  border:1px solid var(--line);
  border-radius:10px;
  padding:18px 20px;
  min-width:0;
}
.stats-section-sm{ padding:18px; }
.stats-section-head{
  display:flex; align-items:baseline; justify-content:space-between;
  gap:12px;
  margin-bottom:14px;
}
.stats-section-head h3{
  font:800 12px var(--font); letter-spacing:.10em; text-transform:uppercase;
  color:var(--ink); margin:0;
}
.stats-section-head h2{
  font:900 18px var(--font); color:var(--ink); margin:0; letter-spacing:-.01em;
}
.stats-section-head-major{
  border-bottom:1px solid var(--line);
  padding-bottom:8px;
  margin-top:6px;
}
.stats-section-meta{
  font:600 11px var(--font); color:var(--ink-3);
  font-variant-numeric:tabular-nums;
}

/* Grelhas */
.stats-grid-2{ display:grid; grid-template-columns:1fr 1fr; gap:14px; }
.stats-grid-3-1{ display:grid; grid-template-columns:2fr 1fr; gap:14px; }
@media (max-width:980px){
  .stats-grid-2,.stats-grid-3-1{ grid-template-columns:1fr; }
}
.stats-grid-fill{ display:grid; gap:14px; }

/* Aside editorial (slot vazio na grelha) */
.stats-section-aside{
  background:linear-gradient(180deg, var(--red-soft) 0%, #fff 100%);
  border:1px solid var(--red-line);
}
.stats-section-aside-eyebrow{
  font:800 10px var(--font); letter-spacing:.14em; text-transform:uppercase;
  color:var(--red-main); margin-bottom:8px;
}
.stats-section-aside-body{
  font:500 12.5px var(--font); color:var(--ink-2); line-height:1.55; margin:0;
}
.stats-section-aside-body strong{ color:var(--ink); font-weight:700; }
.stats-section-aside-body em{ color:var(--red-main); font-style:normal; font-weight:600; }

/* ── DONUT ────────────────────────────────────────────── */
.stats-donut-wrap{
  display:grid;
  grid-template-columns:200px 1fr;
  gap:24px;
  align-items:center;
}
@media (max-width:680px){
  .stats-donut-wrap{ grid-template-columns:1fr; justify-items:center; }
}
.stats-donut{
  width:180px; height:180px;
}
.stats-donut-tlbl{
  font:800 8.5px var(--font); letter-spacing:.16em; text-transform:uppercase;
  fill:var(--ink-3);
}
.stats-donut-tval{
  font:900 16px var(--mono); fill:var(--ink);
  font-variant-numeric:tabular-nums;
}
.stats-donut-legend{
  list-style:none; padding:0; margin:0;
  display:flex; flex-direction:column; gap:6px;
}
.stats-donut-leg-row{
  display:grid;
  grid-template-columns:10px 1fr auto auto;
  gap:10px; align-items:center;
  padding:6px 8px;
  border-radius:6px;
  cursor:pointer;
  transition:background .15s;
  font-size:12.5px;
}
.stats-donut-leg-row:hover, .stats-donut-leg-row.is-hover{
  background:var(--red-soft);
}
.stats-donut-leg-dot{
  width:10px; height:10px; border-radius:2px;
}
.stats-donut-leg-lbl{ color:var(--ink); font-weight:600; }
.stats-donut-leg-pct{
  font:700 11.5px var(--mono); color:var(--ink-3);
  font-variant-numeric:tabular-nums;
}
.stats-donut-leg-val{
  font:700 12px var(--mono); color:var(--ink);
  font-variant-numeric:tabular-nums;
  min-width:70px; text-align:right;
}

/* ── FUNIL — barras horizontais por etapa ───────────── */
.stats-funnel{
  display:flex; flex-direction:column; gap:14px;
  padding:6px 0;
}
.stats-funnel-row{
  display:grid;
  grid-template-columns:150px 1fr 120px;
  grid-template-rows:auto auto;
  gap:6px 14px;
  align-items:center;
  opacity:0;
  animation:statsFunnelIn .4s cubic-bezier(.16,1,.3,1) forwards;
}
.stats-funnel-name{
  display:inline-flex; align-items:center; gap:8px;
  font:800 11.5px var(--font); letter-spacing:.08em; text-transform:uppercase;
  grid-row:1 / span 2;
}
.stats-funnel-dot{
  width:8px; height:8px; border-radius:50%;
  flex-shrink:0;
}
.stats-funnel-track{
  position:relative;
  height:32px;
  background:#F2F3F6;
  border-radius:6px;
  overflow:visible;
}
.stats-funnel-fill{
  height:100%;
  border-radius:6px;
  transform-origin:left;
  animation:statsBarFill .7s cubic-bezier(.16,1,.3,1) backwards;
  display:flex; align-items:center; justify-content:flex-end;
  padding-right:10px;
  min-width:6px;
}
.stats-funnel-count-inside{
  color:#fff;
  font:900 14px var(--mono); font-variant-numeric:tabular-nums;
  text-shadow:0 1px 2px rgba(0,0,0,.20);
}
.stats-funnel-count-outside{
  position:absolute; left:8px; top:50%;
  transform:translateY(-50%);
  font:900 14px var(--mono); color:var(--ink);
  font-variant-numeric:tabular-nums;
}
.stats-funnel-value{
  font:800 14px var(--mono); color:var(--ink);
  text-align:right;
  font-variant-numeric:tabular-nums;
  grid-row:1 / span 2;
}
.stats-funnel-value-bar{
  grid-column:2;
  height:3px;
  background:#F0F2F5;
  border-radius:2px;
  overflow:hidden;
}
.stats-funnel-value-fill{
  height:100%;
  transform-origin:left;
  animation:statsBarFill .7s cubic-bezier(.16,1,.3,1) backwards;
}

@media (max-width:680px){
  .stats-funnel-row{
    grid-template-columns:110px 1fr 100px;
  }
}

/* ── BAR CHART MENSAL ─────────────────────────────────── */
.stats-monthly{ display:flex; flex-direction:column; }
.stats-monthly-area{
  display:grid;
  grid-template-columns:repeat(12, 1fr);
  gap:6px;
  height:160px;
  align-items:end;
  padding:8px 0 0;
  position:relative;
}
.stats-monthly-col{
  display:flex; flex-direction:column; align-items:center;
  height:100%;
  position:relative;
  cursor:default;
}
.stats-monthly-bar-wrap{
  flex:1; width:100%;
  display:flex; align-items:flex-end;
  position:relative;
}
.stats-monthly-bar{
  width:100%;
  background:var(--red-main);
  border-radius:3px 3px 0 0;
  transform-origin:bottom;
  animation:statsBarGrowY .5s cubic-bezier(.16,1,.3,1) backwards;
  transition:filter .15s, background .15s;
}
.stats-monthly-col.is-hover .stats-monthly-bar{
  filter:brightness(1.12);
  background:#9F2424;
}
.stats-monthly-lbl{
  margin-top:6px;
  font:700 10px var(--mono); color:var(--ink-3);
  font-variant-numeric:tabular-nums;
}
.stats-monthly-col.is-hover .stats-monthly-lbl{ color:var(--ink); }
.stats-monthly-tip{
  position:absolute;
  bottom:calc(100% + 8px);
  left:50%; transform:translateX(-50%);
  background:var(--ink); color:#fff;
  padding:8px 12px; border-radius:6px;
  font-size:11px; line-height:1.4;
  white-space:nowrap;
  box-shadow:0 6px 16px rgba(20,25,40,.20);
  z-index:10;
  animation:statsFadeIn .12s ease-out;
  pointer-events:none;
}
.stats-monthly-tip::after{
  content:""; position:absolute; top:100%; left:50%;
  transform:translateX(-50%);
  border:5px solid transparent; border-top-color:var(--ink);
}
.stats-monthly-tip-m{ font:800 10px var(--font); letter-spacing:.08em; text-transform:uppercase; color:#FFF5F5; }
.stats-monthly-tip-v{ font:900 13px var(--mono); margin-top:2px; }
.stats-monthly-tip-c{ font:500 10.5px var(--font); color:#CFD3DC; margin-top:1px; }

/* ── TOP LIST ─────────────────────────────────────────── */
.stats-tl{
  background:#fff;
  border:1px solid var(--line);
  border-radius:10px;
  padding:16px 18px;
  min-width:0;
}
.stats-tl-head{ margin-bottom:12px; }
.stats-tl-title{
  font:800 11.5px var(--font); letter-spacing:.10em; text-transform:uppercase;
  color:var(--ink);
}
.stats-tl-subtitle{
  font:500 11px var(--font); color:var(--ink-3); margin-top:2px;
}
.stats-tl-list{
  list-style:none; padding:0; margin:0;
  display:flex; flex-direction:column; gap:10px;
}
.stats-tl-item{
  display:grid;
  grid-template-columns:28px 1fr;
  gap:12px;
  padding:6px 8px 6px 4px;
  border-radius:6px;
  align-items:start;
  opacity:0;
  animation:statsItemSlideIn .35s cubic-bezier(.16,1,.3,1) forwards;
  transition:background .15s, transform .15s;
}
.stats-tl-item:hover{
  background:var(--red-soft);
  transform:translateX(2px);
}
.stats-tl-rank{
  font:900 18px var(--mono); color:var(--ink-3);
  font-variant-numeric:tabular-nums;
  line-height:1.2;
  text-align:center;
}
.stats-tl-item.rank-1 .stats-tl-rank{ font-size:22px; }
.stats-tl-body{ min-width:0; }
.stats-tl-row{
  display:flex; align-items:baseline; justify-content:space-between; gap:10px;
  margin-bottom:4px;
}
.stats-tl-lbl{
  font:600 12.5px var(--font); color:var(--ink);
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
  min-width:0;
}
.stats-tl-val{
  font:800 12px var(--mono); color:var(--ink);
  font-variant-numeric:tabular-nums;
  white-space:nowrap;
}
.stats-tl-sub{
  font:500 10.5px var(--font); color:var(--ink-3);
  margin-bottom:5px;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.stats-tl-bar{
  height:3px; background:#F0F2F5; border-radius:2px; overflow:hidden;
}
.stats-tl-fill{
  height:100%; background:var(--ink-3); border-radius:2px;
  transform-origin:left;
  animation:statsBarFill .7s cubic-bezier(.16,1,.3,1) backwards;
}

/* ── STAT BOX ─────────────────────────────────────────── */
.stats-box{
  background:#fff;
  border:1px solid var(--line);
  border-left:3px solid var(--ink-3);
  border-radius:10px;
  padding:18px 20px;
  display:flex; flex-direction:column; gap:6px;
  height:100%;
}
.stats-box-lbl{
  font:700 10px var(--font); letter-spacing:.12em; text-transform:uppercase;
  color:var(--ink-3);
}
.stats-box-val{
  font:900 28px var(--mono); color:var(--ink); letter-spacing:-.02em;
  font-variant-numeric:tabular-nums;
}
.stats-box-sub{
  font:500 11px var(--font); color:var(--ink-3);
}
.stats-box-success{ border-left-color:#1F7A3D; }
.stats-box-success .stats-box-val{ color:#1F7A3D; }
.stats-box-info   { border-left-color:#3C5AA6; }
.stats-box-info    .stats-box-val{ color:#3C5AA6; }
.stats-box-warning{ border-left-color:#A77400; }
.stats-box-warning .stats-box-val{ color:#A77400; }
.stats-box-danger { border-left-color:#D62E2E; }
.stats-box-danger  .stats-box-val{ color:#D62E2E; }

/* ── RECORRENTES ──────────────────────────────────────── */
.stats-rec-grid{
  display:flex; flex-wrap:wrap; gap:8px;
}
.stats-rec-chip{
  display:inline-flex; flex-direction:column; gap:2px;
  padding:8px 12px;
  background:#fff;
  border:1px solid var(--red-line);
  border-radius:8px;
  opacity:0;
  animation:statsChipIn .3s cubic-bezier(.16,1,.3,1) forwards;
  transition:transform .15s, box-shadow .15s, background .15s;
  cursor:default;
}
.stats-rec-chip:hover{
  transform:translateY(-2px);
  background:var(--red-soft);
  box-shadow:0 6px 14px rgba(122,24,24,.10);
}
.stats-rec-name{ font:700 12px var(--font); color:var(--ink); }
.stats-rec-meta{
  font:600 10.5px var(--mono); color:var(--ink-3);
  font-variant-numeric:tabular-nums;
}

/* ── QUALIDADE BARS ───────────────────────────────────── */
.stats-quality-grid{
  display:grid;
  grid-template-columns:repeat(4, 1fr);
  gap:14px;
}
@media (max-width:760px){
  .stats-quality-grid{ grid-template-columns:repeat(2, 1fr); }
}
.stats-quality{
  background:#fff;
  border:1px solid var(--line);
  border-radius:8px;
  padding:14px 16px;
}
.stats-quality-head{
  display:flex; align-items:baseline; justify-content:space-between;
  margin-bottom:8px;
}
.stats-quality-lbl{
  font:700 11px var(--font); color:var(--ink-2);
  text-transform:uppercase; letter-spacing:.08em;
}
.stats-quality-val{
  font:900 18px var(--mono); color:var(--ink);
  font-variant-numeric:tabular-nums;
}
.stats-quality-bar{
  height:6px; background:#F0F2F5; border-radius:3px; overflow:hidden;
}
.stats-quality-fill{
  height:100%; border-radius:3px;
  transform-origin:left;
  animation:statsBarFill .8s cubic-bezier(.16,1,.3,1);
}

/* ── EMPTY ────────────────────────────────────────────── */
.stats-empty{
  font:500 12.5px var(--font); color:var(--ink-3);
  font-style:italic;
  padding:14px 6px;
  text-align:center;
}

/* ── FOOTER ───────────────────────────────────────────── */
.stats-modal-footer{
  display:flex; justify-content:space-between; align-items:center;
  padding:10px 32px;
  background:#fff;
  border-top:1px solid var(--line);
  font:600 11px var(--mono); color:var(--ink-3);
  font-variant-numeric:tabular-nums;
}
.stats-modal-stamp{
  display:inline-flex; align-items:center; gap:6px;
}
.stats-modal-stamp::before{
  content:""; width:6px; height:6px; border-radius:50%;
  background:var(--green); display:inline-block;
  box-shadow:0 0 0 3px rgba(43,174,102,.18);
}

/* ═══════════════════════════════════════════════════════════════════════════
   ENVIAR CLIENTE MODAL (2026-05-24 João) — split editor/preview
   ═══════════════════════════════════════════════════════════════════════════ */

@keyframes emailModalIn { from{opacity:0; transform:scale(.97)} to{opacity:1; transform:scale(1)} }
@keyframes emailFadeIn  { from{opacity:0} to{opacity:1} }

.email-modal-overlay{
  position:fixed; inset:0; z-index:1300;
  background:rgba(20,25,40,.55);
  backdrop-filter:blur(8px);
  -webkit-backdrop-filter:blur(8px);
  display:flex; align-items:stretch; justify-content:center;
  padding:24px;
  animation:emailFadeIn .22s ease-out;
  font-family:var(--font);
}
.email-modal{
  flex:1; min-width:0;
  background:#FAFAF7;
  border-radius:12px;
  box-shadow:0 24px 64px rgba(20,25,40,.18);
  display:flex; flex-direction:column;
  overflow:hidden;
  animation:emailModalIn .26s cubic-bezier(.16,1,.3,1);
  max-width:1500px; margin:0 auto;
}

/* HEADER */
.email-modal-header{
  display:flex; align-items:center; justify-content:space-between;
  gap:24px;
  padding:18px 28px;
  background:#fff;
  border-bottom:1px solid var(--line);
  position:relative;
}
.email-modal-header::after{
  content:""; position:absolute; left:28px; bottom:-1px;
  width:64px; height:2px; background:var(--red-main);
}
.email-modal-eyebrow{
  font:700 10px var(--font); letter-spacing:.18em; text-transform:uppercase;
  color:var(--ink-3); margin-bottom:3px;
}
.email-modal-title{
  font:900 18px var(--font); color:var(--ink);
  letter-spacing:-.01em; line-height:1.15;
}
.email-modal-close{
  width:36px; height:36px; border-radius:50%;
  background:transparent; border:1px solid var(--line);
  font-size:22px; color:var(--ink-2);
  display:inline-flex; align-items:center; justify-content:center;
  cursor:pointer;
  transition:transform .2s, background .15s, border-color .15s, color .15s;
}
.email-modal-close:hover{
  background:var(--red-soft); border-color:var(--red-line); color:var(--red-main);
  transform:rotate(90deg);
}
.email-modal-close:disabled{ opacity:.4; cursor:not-allowed; transform:none; }

/* SPLIT */
.email-modal-split{
  flex:1; min-height:0;
  display:grid;
  grid-template-columns:minmax(340px, 1fr) minmax(0, 1.4fr);
  overflow:hidden;
  background:var(--bg);
}
@media (max-width:900px){
  .email-modal-split{ grid-template-columns:1fr; }
}

/* EDIÇÃO (esquerda) */
.email-edit{
  background:#fff;
  border-right:1px solid var(--line);
  overflow-y:auto;
  padding:20px 24px;
}
.email-edit-section{
  padding-bottom:18px;
  margin-bottom:18px;
  border-bottom:1px solid var(--line);
}
.email-edit-section:last-child{ border-bottom:none; margin-bottom:0; }
.email-row{ margin-bottom:12px; }
.email-row:last-child{ margin-bottom:0; }
.email-row label{
  display:block;
  font:700 10px var(--font); letter-spacing:.10em; text-transform:uppercase;
  color:var(--ink-3); margin-bottom:5px;
}
.email-input{
  width:100%;
  padding:8px 12px;
  border:1px solid var(--line-strong);
  border-radius:6px;
  background:#fff;
  color:var(--ink);
  font:500 13px var(--font);
  outline:none;
  transition:border-color .15s, box-shadow .15s;
  box-sizing:border-box;
}
.email-input:focus{
  border-color:var(--red-main);
  box-shadow:0 0 0 3px rgba(122,24,24,.10);
}
.email-input-strong{
  font:700 13.5px var(--font);
  color:var(--ink);
}
select.email-input{
  cursor:pointer;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'><path d='M0 0l5 6 5-6z' fill='%237A8190'/></svg>");
  background-repeat:no-repeat;
  background-position:right 10px center;
  padding-right:28px;
  appearance:none;
  -webkit-appearance:none;
}
.email-textarea{
  width:100%;
  padding:10px 12px;
  border:1px solid var(--line-strong);
  border-radius:6px;
  background:#fff;
  color:var(--ink);
  font:500 13px var(--mono);
  font-variant-numeric:tabular-nums;
  outline:none;
  resize:vertical;
  min-height:96px;
  line-height:1.5;
  transition:border-color .15s, box-shadow .15s;
  box-sizing:border-box;
}
.email-textarea:focus{
  border-color:var(--red-main);
  box-shadow:0 0 0 3px rgba(122,24,24,.10);
}
.email-hint{
  font:500 11px var(--font); color:var(--ink-3);
  margin-top:5px;
}
.email-row-static label{ margin-bottom:3px; }
.email-static-val{
  font:600 13px var(--mono); color:var(--ink-2);
  padding:6px 0;
}

/* PREVIEW (direita) */
.email-preview-wrap{
  background:#FAFAF7;
  overflow-y:auto;
  display:flex; flex-direction:column;
}
.email-preview-meta{
  padding:14px 24px;
  background:#fff;
  border-bottom:1px solid var(--line);
  font:500 12.5px var(--font); color:var(--ink-2);
  line-height:1.7;
  position:sticky; top:0; z-index:2;
}
.email-preview-lbl{
  font:700 10px var(--font); letter-spacing:.10em; text-transform:uppercase;
  color:var(--ink-3); margin-right:6px;
}
.email-preview-subject{
  margin-top:6px; padding-top:8px;
  border-top:1px dashed var(--line);
  font:700 13px var(--font); color:var(--ink);
}
.email-preview-empty{ color:var(--ink-4); font-style:italic; }
.email-preview-body{
  flex:1;
  background:#fff;
  margin:20px 24px;
  padding:32px 36px;
  border-radius:8px;
  border:1px solid var(--line);
  box-shadow:0 2px 8px rgba(20,25,40,.04);
}
.email-preview-body p{ margin:0 0 12px; }
.email-preview-body ul{ padding-left:22px; margin:0 0 14px; }
.email-preview-body li{ margin-bottom:4px; }

/* FOOTER */
.email-modal-footer{
  display:flex; justify-content:space-between; align-items:center;
  gap:18px;
  padding:14px 28px;
  background:#fff;
  border-top:1px solid var(--line);
}
.email-modal-msg{ flex:1; min-width:0; }
.email-err{
  font:600 12.5px var(--font); color:#D62E2E;
  background:#FFF8F8;
  border:1px solid #FBD9D9;
  padding:8px 12px; border-radius:6px;
  display:inline-block;
}
@keyframes emailOkPulse {
  0%   { box-shadow:0 0 0 0 rgba(31,122,61,.30); }
  60%  { box-shadow:0 0 0 6px rgba(31,122,61,0); }
  100% { box-shadow:0 0 0 0 rgba(31,122,61,0); }
}
.email-ok{
  font:700 13px var(--font); color:#1F7A3D;
  background:#F6FDF9;
  border:1.5px solid #2BAE66;
  padding:10px 14px; border-radius:8px;
  display:inline-flex; align-items:center; gap:6px;
  animation:emailOkPulse 1.4s ease-out 2;
}
.email-hint-soft{ font:500 12px var(--font); color:var(--ink-3); }
.email-modal-actions{
  display:inline-flex; gap:10px; flex-shrink:0;
}
.email-btn{
  padding:9px 18px;
  font:700 13px var(--font);
  border-radius:6px;
  cursor:pointer;
  border:1px solid transparent;
  transition:background .15s, border-color .15s, color .15s, transform .12s;
}
.email-btn:disabled{ opacity:.5; cursor:not-allowed; transform:none !important; }
.email-btn-ghost{
  background:transparent;
  color:var(--ink-2);
  border-color:var(--line-strong);
}
.email-btn-ghost:hover:not(:disabled){
  background:var(--bg); color:var(--ink);
}
.email-btn-secondary{
  background:#fff;
  color:var(--red-main);
  border-color:var(--red-line);
}
.email-btn-secondary:hover:not(:disabled){
  background:var(--red-soft); border-color:var(--red-main);
}
.email-btn-dev{
  background:#FFFAF0;
  color:#A77400;
  border-color:#F0D9A4;
  border-style:dashed;
}
.email-btn-dev:hover:not(:disabled){
  background:#FFF4DC; border-color:#A77400;
}
/* Card de conversa Gmail existente — aparece no header do modal Enviar Cliente */
.email-thread-card{
  display:grid;
  grid-template-columns:auto 1fr auto;
  gap:14px;
  align-items:center;
  padding:12px 28px;
  background:#FFFBEC;
  border-bottom:1px solid #F0D9A4;
  animation:emailFadeIn .2s ease-out;
}
.email-thread-card.is-active{
  background:#F6FDF9;
  border-bottom-color:#C6EBD3;
}
.email-thread-icon{
  font-size:22px;
  line-height:1;
}
.email-thread-body{ min-width:0; }
.email-thread-head{
  display:flex; align-items:baseline; gap:10px; flex-wrap:wrap;
  font-size:13px; color:var(--ink);
}
.email-thread-meta{
  font:600 11px var(--mono); color:var(--ink-3);
  font-variant-numeric:tabular-nums;
}
.email-thread-subject{
  font:600 12.5px var(--font); color:var(--ink-2);
  margin-top:3px;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.email-thread-snippet{
  font:500 11.5px var(--font); color:var(--ink-3);
  margin-top:3px; font-style:italic;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis;
}
.email-thread-toggle{
  display:inline-flex; align-items:center; gap:8px;
  font:700 12px var(--font); color:var(--ink-2);
  background:#fff; padding:8px 12px; border-radius:6px;
  border:1px solid var(--line-strong);
  cursor:pointer;
  white-space:nowrap;
}
.email-thread-toggle input{
  width:16px; height:16px; cursor:pointer; accent-color:var(--red-main);
}

.email-btn-test{
  background:#F5F8FD;
  color:#3C5AA6;
  border-color:#B9CCE9;
  border-style:dashed;
}
.email-btn-test:hover:not(:disabled){
  background:#EAF1FB; border-color:#3C5AA6;
}

/* ═══════════════════════════════════════════════════════════════════════════
   ENRIQUECER CLIENTES MODAL (2026-05-24 João)
   ═══════════════════════════════════════════════════════════════════════════ */

.enriq-modal-overlay{
  position:fixed; inset:0; z-index:1300;
  background:rgba(20,25,40,.55);
  backdrop-filter:blur(8px);
  display:flex; align-items:stretch; justify-content:center;
  padding:24px;
  animation:emailFadeIn .22s ease-out;
  font-family:var(--font);
}
.enriq-modal{
  flex:1; min-width:0;
  background:#FAFAF7;
  border-radius:12px;
  box-shadow:0 24px 64px rgba(20,25,40,.18);
  display:flex; flex-direction:column;
  overflow:hidden;
  max-width:1500px; margin:0 auto;
  animation:emailModalIn .26s cubic-bezier(.16,1,.3,1);
}
.enriq-modal-header{
  display:flex; align-items:center; justify-content:space-between;
  gap:24px; padding:18px 28px;
  background:#fff;
  border-bottom:1px solid var(--line);
  position:relative;
}
.enriq-modal-header::after{
  content:""; position:absolute; left:28px; bottom:-1px;
  width:64px; height:2px; background:var(--red-main);
}
.enriq-modal-eyebrow{
  font:700 10px var(--font); letter-spacing:.18em; text-transform:uppercase;
  color:var(--ink-3); margin-bottom:3px;
}
.enriq-modal-title{
  font:900 18px var(--font); color:var(--ink); margin:0; letter-spacing:-.01em;
}
.enriq-modal-sub{
  font:500 12px var(--font); color:var(--ink-3); margin-top:4px;
}
.enriq-modal-close{
  width:36px; height:36px; border-radius:50%;
  background:transparent; border:1px solid var(--line);
  font-size:22px; color:var(--ink-2);
  display:inline-flex; align-items:center; justify-content:center;
  cursor:pointer; transition:transform .2s, background .15s, color .15s;
}
.enriq-modal-close:hover{
  background:var(--red-soft); color:var(--red-main); transform:rotate(90deg);
}

.enriq-modal-toolbar{
  display:flex; gap:10px; align-items:center;
  padding:12px 28px;
  background:#fff;
  border-bottom:1px solid var(--line);
  flex-wrap:wrap;
}
.enriq-search{
  flex:1; min-width:200px; max-width:380px;
  padding:8px 12px; border:1px solid var(--line-strong);
  border-radius:6px; font:500 13px var(--font);
}
.enriq-check-inline{
  display:inline-flex; align-items:center; gap:6px;
  font:600 12px var(--font); color:var(--ink-2); cursor:pointer;
}
.enriq-check-inline input{ accent-color:var(--red-main); }
.enriq-btn{
  padding:7px 14px; font:700 12px var(--font); border-radius:6px;
  border:1px solid var(--line-strong); background:#fff; color:var(--ink-2);
  cursor:pointer; transition:background .15s, color .15s, border-color .15s;
}
.enriq-btn:hover:not(:disabled){ background:var(--bg); color:var(--ink); }
.enriq-btn-ghost{ background:transparent; }
.enriq-btn-primary{
  background:var(--red-main); color:#fff; border-color:var(--red-main);
  padding:9px 20px; font:700 13px var(--font);
  box-shadow:0 2px 6px rgba(122,24,24,.18);
}
.enriq-btn-primary:hover:not(:disabled){
  background:#5e1212; transform:translateY(-1px);
}
.enriq-btn-primary:disabled{ opacity:.5; cursor:not-allowed; }

.enriq-modal-content{
  flex:1; min-height:0; overflow:auto;
  background:#fff;
}
.enriq-empty, .enriq-aviso{
  padding:40px; text-align:center; color:var(--ink-3);
  font:500 13px var(--font);
}
.enriq-aviso{ color:#A77400; background:#FFFAF0; }

.enriq-table{
  width:100%; border-collapse:collapse; font:500 12.5px var(--font);
}
.enriq-table thead th{
  font:700 10px var(--font); letter-spacing:.10em; text-transform:uppercase;
  color:var(--ink-3); text-align:left;
  padding:12px 14px; background:#FAFAF7;
  border-bottom:1px solid var(--line);
  position:sticky; top:0; z-index:2;
}
.enriq-table td{
  padding:12px 14px; border-bottom:1px solid var(--line);
  vertical-align:top;
}
.enriq-cli-nome{ font:700 13px var(--font); color:var(--ink); }
.enriq-cli-meta{ font:500 11px var(--mono); color:var(--ink-3); margin-top:2px; }
.enriq-cell-atual{ color:var(--ink-2); font-size:12px; line-height:1.5; }
.enriq-cell-atual > div{ margin-bottom:2px; }
.enriq-reps-atuais{ margin-top:4px; font-size:11.5px; color:var(--ink-3); }
.enriq-vazio{ color:var(--ink-4); font-style:italic; }

.enriq-cell-sugerido label.enriq-row-check{
  display:flex; align-items:center; gap:6px; flex-wrap:wrap;
  padding:6px 8px; margin-bottom:4px;
  border-radius:6px; cursor:pointer;
  border:1px solid transparent;
  transition:background .15s, border-color .15s;
}
.enriq-cell-sugerido label.enriq-row-check:hover{ background:#F6FDF9; }
.enriq-cell-sugerido label.enriq-row-check.is-on{
  background:#F6FDF9; border-color:#C6EBD3;
}
.enriq-cell-sugerido input[type=checkbox]{
  width:16px; height:16px; cursor:pointer; accent-color:#1F7A3D;
}
.enriq-pill{
  display:inline-flex; align-items:center; justify-content:center;
  width:22px; height:22px; border-radius:50%; font-size:11px;
}
.enriq-pill-email{ background:#EAF1FB; }
.enriq-pill-tel{ background:#F0F9EE; }
.enriq-pill-rep{ background:#FFFAF0; }
.enriq-vs{ color:var(--ink-3); font-size:11.5px; }
.enriq-occ{
  margin-left:auto; font:700 11px var(--mono); color:var(--ink-3);
  background:#F0F2F5; padding:2px 6px; border-radius:4px;
}
.enriq-cell-atividade{
  font:500 11px var(--mono); color:var(--ink-3);
  font-variant-numeric:tabular-nums;
}

.enriq-modal-footer{
  display:flex; justify-content:space-between; align-items:center;
  gap:18px; padding:14px 28px;
  background:#fff; border-top:1px solid var(--line);
}
.enriq-summary{
  font:500 13px var(--font); color:var(--ink-2);
}
.enriq-summary strong{
  font:900 14px var(--mono); color:var(--red-main);
}
.enriq-actions{ display:inline-flex; gap:10px; }

/* Threads backfill modal — stats + pills */
.thread-bf-stats{
  display:flex; gap:24px; padding:14px 28px;
  background:#fff; border-bottom:1px solid var(--line);
}
.thread-bf-stat{
  display:flex; flex-direction:column;
}
.thread-bf-stat strong{
  font:900 22px var(--mono); color:var(--ink);
  font-variant-numeric:tabular-nums;
}
.thread-bf-stat span{
  font:700 10px var(--font); letter-spacing:.10em; text-transform:uppercase;
  color:var(--ink-3);
}
.thread-bf-stat-muted strong{ color:var(--ink-3); }
.thread-bf-row-empty{ opacity:.5; }
.thread-bf-match{
  display:inline-block; padding:2px 8px; border-radius:4px;
  font:700 10px var(--mono); text-transform:uppercase; letter-spacing:.06em;
}
.thread-bf-match-strict{ background:#F6FDF9; color:#1F7A3D; }
.thread-bf-match-loose{ background:#FFFAF0; color:#A77400; }
.thread-bf-match-fallback{ background:#F5F8FD; color:#3C5AA6; }
.thread-bf-pill{
  display:inline-block; padding:2px 8px; border-radius:4px;
  font:700 10.5px var(--font); text-transform:uppercase; letter-spacing:.06em;
}
.thread-bf-pill-done{ background:#F0F2F5; color:var(--ink-3); }
.thread-bf-pill-novo{ background:var(--red-soft); color:var(--red-main); }
.email-btn-primary{
  background:var(--red-main);
  color:#fff;
  border-color:var(--red-main);
  box-shadow:0 2px 6px rgba(122,24,24,.18);
}
.email-btn-primary:hover:not(:disabled){
  background:#5e1212; border-color:#5e1212;
  transform:translateY(-1px);
  box-shadow:0 4px 10px rgba(122,24,24,.25);
}

/* ═══════════════════════════════════════════════════════════════════════════
   DOC UPLOADER — "Arquivo de Obra" (2026-05-25 João)
   2 dropzones (projetos azul-ardósia / fotos âmbar mostarda) + lista + preview.
   Usado inline na NovaPropostaPage E modal a partir do PropostaPanel.
   ═══════════════════════════════════════════════════════════════════════════ */

:root{
  --docup-zone-a:        #3C5AA6;  /* azul-ardósia — Projetos & Documentos */
  --docup-zone-a-bg:     #F5F8FD;
  --docup-zone-a-line:   #B9CCE9;
  --docup-zone-b:        #A77400;  /* âmbar mostarda — Registo Fotográfico */
  --docup-zone-b-bg:     #FFFAF0;
  --docup-zone-b-line:   #F0D9A4;
}

@keyframes docupFadeIn       { from{opacity:0} to{opacity:1} }
@keyframes docupModalIn      { from{opacity:0; transform:scale(.97)} to{opacity:1; transform:scale(1)} }
@keyframes docupRowIn        { from{opacity:0; transform:translateY(-6px)} to{opacity:1; transform:translateY(0)} }
@keyframes docupBarShimmer   { 0%{background-position:-200% 0} 100%{background-position:200% 0} }
@keyframes docupIconPulse    { 0%,100%{transform:scale(1)} 50%{transform:scale(1.04)} }
@keyframes docupZonePulse    { 0%{box-shadow:0 0 0 0 currentColor} 60%{box-shadow:0 0 0 8px transparent} 100%{box-shadow:0 0 0 0 transparent} }
@keyframes docupPaperFly {
  0%   { opacity:0; transform:translate(0,0) rotate(0deg) scale(.6); }
  20%  { opacity:1; }
  100% { opacity:0; transform:translate(var(--dx), var(--dy)) rotate(var(--rot)) scale(.4); }
}

/* ── ROOT (inline ou modal) ─────────────────────────── */
.docup-root{
  display:grid;
  grid-template-columns:1fr;
  gap:0;
  font-family:var(--font);
  background:#FAFAF7;
  border-radius:12px;
  min-height:560px;
  min-height:0;          /* permite encolher dentro de flex parent */
}
.docup-root.has-preview{
  grid-template-columns:1fr 40%;
}
.docup-root--inline{
  border:1px solid var(--line);
  background:#fff;
  overflow:hidden;       /* arredondamento só vale na variante inline */
}
.docup-root--modal{
  background:#FAFAF7;
  height:100%; min-height:0;
}
.docup-main{
  display:flex; flex-direction:column;
  padding:24px;
  gap:16px;
  min-width:0; min-height:0;
  overflow-y:auto;       /* SCROLL ativo no conteúdo principal */
}

@media (max-width:980px){
  .docup-root.has-preview{ grid-template-columns:1fr; }
}

/* ── DUPLICATE BANNER ───────────────────────────────── */
.docup-dup-banner{
  display:flex; align-items:center; gap:14px;
  padding:12px 18px;
  background:#FFFAF0;
  border:1px solid #F0D9A4;
  border-radius:8px;
  animation:docupFadeIn .22s ease-out;
}
.docup-dup-icon{
  font-size:24px; color:#A77400; line-height:1;
}
.docup-dup-body{
  flex:1; min-width:0;
  font:500 13px var(--font); color:var(--ink-2); line-height:1.45;
}
.docup-dup-body strong{ display:block; color:var(--ink); font-weight:700; margin-bottom:2px; }
.docup-dup-body code{
  background:#fff; padding:1px 6px; border-radius:3px;
  font:600 12px var(--mono); border:1px solid var(--line);
}
.docup-dup-actions{ display:inline-flex; gap:8px; flex-shrink:0; }

/* ── ZONAS ──────────────────────────────────────────── */
.docup-zones{
  display:grid;
  grid-template-columns:1fr 1fr;
  gap:16px;
}
@media (max-width:680px){
  .docup-zones{ grid-template-columns:1fr; }
}

.docup-zone{
  position:relative;
  background:#fff;
  border:2px dashed var(--line-strong);
  border-radius:12px;
  padding:36px 24px;
  display:flex; flex-direction:column; align-items:center;
  text-align:center;
  cursor:copy;
  min-height:240px;
  justify-content:center;
  transition:border-color .15s, background .2s, transform .15s, opacity .2s;
  overflow:hidden;  /* contém o confetti */
}
.docup-zone:focus-visible{ outline:2px solid currentColor; outline-offset:2px; }
.docup-zone:hover{ border-color:currentColor; }

.docup-zone[data-sector="desenhos"]{ color:var(--docup-zone-a); }
.docup-zone[data-sector="desenhos"].is-over{
  background:var(--docup-zone-a-bg);
  border:3px solid var(--docup-zone-a);
  transform:scale(1.01);
  animation:docupZonePulse 1s ease-out;
}
.docup-zone[data-sector="fotos"]{ color:var(--docup-zone-b); }
.docup-zone[data-sector="fotos"].is-over{
  background:var(--docup-zone-b-bg);
  border:3px solid var(--docup-zone-b);
  transform:scale(1.01);
  animation:docupZonePulse 1s ease-out;
}
.docup-zone.is-dimmed{ opacity:.45; }

.docup-zone-icon{
  margin-bottom:14px;
  animation:docupIconPulse 3s ease-in-out infinite;
}
.docup-zone-label{
  font:800 11px var(--font); letter-spacing:.12em; text-transform:uppercase;
  margin-bottom:8px;
}
.docup-zone-instr{
  font:500 13px var(--font); color:var(--ink-2);
  margin-bottom:6px;
}
.docup-zone-instr strong{ color:var(--ink); font-weight:700; }
.docup-zone-instr em{ font-style:normal; color:var(--ink-3); font-weight:600; }
.docup-zone-formats{
  font:500 10.5px var(--mono); color:var(--ink-4); letter-spacing:.04em;
}

/* Confetti — mini-papéis a voar */
.docup-confetti{
  position:absolute;
  width:0; height:0;
  pointer-events:none;
}
.docup-confetti span{
  position:absolute;
  width:12px; height:16px;
  background:currentColor; opacity:.85;
  border-radius:1px;
  --dx: calc((var(--i) - 2) * 30px);
  --dy: -120px;
  --rot: calc((var(--i) - 2) * 35deg);
  animation:docupPaperFly .6s cubic-bezier(.16,1,.3,1) forwards;
  animation-delay: calc(var(--i) * 30ms);
}

/* ── LISTAS ─────────────────────────────────────────── */
.docup-lists{
  display:flex; flex-direction:column; gap:14px;
  flex:1; min-height:0;
}
.docup-empty{
  display:flex; align-items:center; justify-content:center; gap:10px;
  padding:32px 16px;
  color:var(--ink-3); font:500 13px var(--font); font-style:italic;
  border:1px dashed var(--line);
  border-radius:8px;
  background:#fff;
}
.docup-empty-icon{ font-size:20px; opacity:.5; }

.docup-group{
  background:#fff;
  border:1px solid var(--line);
  border-radius:8px;
  overflow:hidden;
}
.docup-group--desenhos{ border-left:3px solid var(--docup-zone-a); }
.docup-group--fotos   { border-left:3px solid var(--docup-zone-b); }
.docup-group-head{
  display:flex; align-items:baseline; justify-content:space-between;
  padding:10px 14px;
  background:#FAFAF7;
  border-bottom:1px solid var(--line);
}
.docup-group-label{
  font:800 11px var(--font); letter-spacing:.10em; text-transform:uppercase;
  color:var(--ink);
}
.docup-group-meta{
  font:600 11px var(--mono); color:var(--ink-3);
  font-variant-numeric:tabular-nums;
}
.docup-group-list{
  list-style:none; padding:0; margin:0;
}

/* ── ROW ────────────────────────────────────────────── */
.docup-row{
  display:grid;
  grid-template-columns:24px 1fr 80px 90px 36px;
  align-items:center; gap:10px;
  padding:10px 14px;
  border-bottom:1px solid var(--line);
  cursor:pointer;
  transition:background .15s;
  animation:docupRowIn .25s cubic-bezier(.16,1,.3,1) backwards;
}
.docup-row:last-child{ border-bottom:none; }
.docup-row:hover{ background:#FAFAF7; }
.docup-row.is-selected{
  background:var(--docup-zone-a-bg);
}
.docup-row--fotos.is-selected{ background:var(--docup-zone-b-bg); }

.docup-row-icon{
  font-size:16px; color:var(--docup-zone-a); text-align:center;
}
.docup-row--fotos .docup-row-icon{ color:var(--docup-zone-b); }

.docup-row-name{
  font:600 13px var(--font); color:var(--ink);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.docup-row-size{
  font:500 11.5px var(--mono); color:var(--ink-3);
  font-variant-numeric:tabular-nums;
  text-align:right;
}

.docup-row-status-wrap{
  display:flex; align-items:center; justify-content:flex-end;
}
.docup-row-status{
  font-size:16px; font-weight:700;
  display:inline-flex; align-items:center; justify-content:center;
  width:24px; height:24px; border-radius:50%;
}
.docup-row-status-done { color:#1F7A3D; }
.docup-row-status-error{ color:#D62E2E; }
.docup-row-status-dup  { color:#A77400; }

.docup-row-progress{
  display:flex; align-items:center; gap:6px; width:100%;
}
.docup-row-bar{
  flex:1;
  height:4px; background:#F0F2F5; border-radius:2px; overflow:hidden;
}
.docup-row-bar-fill{
  height:100%;
  background:linear-gradient(90deg, var(--docup-zone-a) 0%, #5470b8 50%, var(--docup-zone-a) 100%);
  background-size:200% 100%;
  animation:docupBarShimmer 1.4s linear infinite;
  border-radius:2px;
  transition:width .2s ease-out;
}
.docup-row--fotos .docup-row-bar-fill{
  background:linear-gradient(90deg, var(--docup-zone-b) 0%, #d4a047 50%, var(--docup-zone-b) 100%);
  background-size:200% 100%;
}
.docup-row-pct{
  font:800 11px var(--mono); color:var(--ink-2);
  font-variant-numeric:tabular-nums;
  min-width:34px; text-align:right;
}

.docup-row-del{
  background:transparent; border:none;
  font-size:14px; cursor:pointer;
  width:30px; height:30px; border-radius:6px;
  display:inline-flex; align-items:center; justify-content:center;
  color:var(--ink-4);
  transition:background .15s, color .15s;
  opacity:.4;
}
.docup-row:hover .docup-row-del{ opacity:1; }
.docup-row-del:hover{ background:var(--red-soft); color:var(--red-main); }
.docup-row-del.is-confirm{
  background:var(--red-main); color:#fff; opacity:1;
}

/* ── PREVIEW ────────────────────────────────────────── */
.docup-preview{
  background:#fff;
  border-left:1px solid var(--line);
  display:flex; flex-direction:column;
  animation:docupFadeIn .28s ease-out;
  min-width:0;
}
.docup-preview-head{
  display:flex; align-items:center; justify-content:space-between;
  padding:14px 18px;
  border-bottom:1px solid var(--line);
}
.docup-preview-name{
  font:700 14px var(--font); color:var(--ink);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
  flex:1; min-width:0;
}
.docup-preview-close{
  width:30px; height:30px; border-radius:50%;
  background:transparent; border:1px solid var(--line);
  font-size:18px; line-height:1; color:var(--ink-2);
  display:inline-flex; align-items:center; justify-content:center;
  cursor:pointer; flex-shrink:0;
  transition:background .15s, transform .2s;
}
.docup-preview-close:hover{ background:var(--bg); transform:rotate(90deg); }

.docup-preview-meta{
  display:flex; align-items:center; gap:8px;
  padding:8px 18px;
  background:#FAFAF7;
  border-bottom:1px solid var(--line);
  font:600 11px var(--mono); color:var(--ink-3);
  font-variant-numeric:tabular-nums;
}
.docup-dot{ opacity:.5; }
.docup-preview-zone{
  padding:1px 7px; border-radius:3px;
  font:800 10px var(--font); letter-spacing:.06em;
}
.docup-preview-zone--desenhos{ background:var(--docup-zone-a-bg); color:var(--docup-zone-a); }
.docup-preview-zone--fotos   { background:var(--docup-zone-b-bg); color:var(--docup-zone-b); }

.docup-preview-body{
  flex:1; min-height:0;
  display:flex; align-items:center; justify-content:center;
  padding:16px;
  background:#F2F3F6;
  overflow:auto;
}
.docup-preview-img{
  max-width:100%; max-height:100%; object-fit:contain;
  background:#fff; padding:8px;
  box-shadow:0 4px 18px rgba(20,25,40,.10);
}
.docup-preview-video{
  max-width:100%; max-height:100%;
  background:#000; border-radius:4px;
}
.docup-preview-frame{
  width:100%; height:100%; min-height:400px;
  border:none; background:#fff;
  box-shadow:0 2px 8px rgba(20,25,40,.06);
}
.docup-preview-frame-text{ background:#fff; }

.docup-preview-other{
  display:flex; flex-direction:column; align-items:center;
  text-align:center; padding:32px; gap:14px;
  color:var(--ink-3);
}
.docup-preview-other-icon{ color:var(--ink-4); }
.docup-preview-other-msg{
  display:flex; flex-direction:column; gap:4px;
  font:500 13px var(--font);
}
.docup-preview-other-msg strong{ color:var(--ink); font-weight:700; }

.docup-preview-actions{
  display:flex; gap:8px; justify-content:flex-end;
  padding:14px 18px;
  border-top:1px solid var(--line);
  background:#FAFAF7;
}

/* ── SUMMARY (inline mode) ──────────────────────────── */
.docup-summary{
  display:flex; justify-content:flex-end;
  padding:10px 0 4px;
  font:600 12px var(--font); color:var(--ink-3);
  border-top:1px dashed var(--line);
}
.docup-summary strong{
  color:var(--ink); font:900 14px var(--mono);
  font-variant-numeric:tabular-nums;
}

/* ── BUTTONS ────────────────────────────────────────── */
.docup-btn{
  padding:8px 16px; font:700 12.5px var(--font); border-radius:6px;
  border:1px solid transparent; cursor:pointer;
  transition:background .15s, color .15s, border-color .15s, transform .12s;
}
.docup-btn:disabled{ opacity:.5; cursor:not-allowed; transform:none !important; }
.docup-btn-ghost{
  background:transparent; color:var(--ink-2);
  border-color:var(--line-strong);
}
.docup-btn-ghost:hover:not(:disabled){ background:var(--bg); color:var(--ink); }
.docup-btn-secondary{
  background:#fff; color:#A77400;
  border-color:#F0D9A4;
}
.docup-btn-secondary:hover:not(:disabled){ background:#FFFAF0; border-color:#A77400; }
.docup-btn-primary{
  background:var(--red-main); color:#fff; border-color:var(--red-main);
  box-shadow:0 2px 6px rgba(122,24,24,.18);
}
.docup-btn-primary:hover:not(:disabled){
  background:#5e1212; transform:translateY(-1px);
  box-shadow:0 4px 10px rgba(122,24,24,.25);
}
.docup-btn-danger{
  background:#FFF8F8; color:#D62E2E;
  border-color:#FBD9D9;
}
.docup-btn-danger:hover:not(:disabled){ background:#FFEBEB; border-color:#D62E2E; }

/* ── MODAL WRAPPER ──────────────────────────────────── */
.docup-modal-overlay{
  position:fixed; inset:0; z-index:1300;
  background:rgba(20,25,40,.55);
  backdrop-filter:blur(8px); -webkit-backdrop-filter:blur(8px);
  display:flex; align-items:stretch; justify-content:center;
  padding:24px;
  animation:docupFadeIn .22s ease-out;
}
.docup-modal{
  flex:1; min-width:0;
  background:#FAFAF7;
  border-radius:12px;
  box-shadow:0 24px 64px rgba(20,25,40,.18);
  display:flex; flex-direction:column;
  overflow:hidden;
  animation:docupModalIn .26s cubic-bezier(.16,1,.3,1);
  max-width:1500px; margin:0 auto;
}
.docup-modal-header{
  display:flex; align-items:center; justify-content:space-between;
  gap:18px;
  padding:18px 28px;
  background:#fff;
  border-bottom:1px solid var(--line);
  position:relative;
}
.docup-modal-header::after{
  content:""; position:absolute; left:28px; bottom:-1px;
  width:64px; height:2px; background:var(--red-main);
}
.docup-modal-eyebrow{
  font:700 10px var(--font); letter-spacing:.18em; text-transform:uppercase;
  color:var(--ink-3); margin-bottom:3px;
}
.docup-modal-title{
  font:900 20px var(--font); color:var(--ink); margin:0; letter-spacing:-.01em;
}
.docup-modal-sub{
  font:500 12px var(--font); color:var(--ink-3); margin-top:3px;
}
.docup-modal-close{
  width:36px; height:36px; border-radius:50%;
  background:transparent; border:1px solid var(--line);
  font-size:22px; line-height:1; color:var(--ink-2);
  display:inline-flex; align-items:center; justify-content:center;
  cursor:pointer; flex-shrink:0;
  transition:background .15s, color .15s, transform .2s;
}
.docup-modal-close:hover{
  background:var(--red-soft); color:var(--red-main); transform:rotate(90deg);
}
.docup-modal-body{
  flex:1; min-height:0; overflow:auto;
  padding:0;
  display:flex; flex-direction:column;
}
.docup-modal-body > .docup-root{
  flex:1; min-height:0;
  border-radius:0; border:none;
}
.docup-modal-footer{
  display:flex; align-items:center; justify-content:space-between; gap:14px;
  padding:14px 28px;
  background:#fff;
  border-top:1px solid var(--line);
}
.docup-modal-hint{
  font:500 12px var(--font); color:var(--ink-3); font-style:italic;
}

/* Notice quando faltam dados da obra (DocUploader inline) */
.docup-notice{
  display:flex; align-items:flex-start; gap:14px;
  padding:14px 18px;
  background:#FFFAF0;
  border:1px solid #F0D9A4;
  border-radius:8px;
}
.docup-notice-icon{
  font-size:18px; color:#A77400; line-height:1;
  width:24px; height:24px; flex-shrink:0;
  display:inline-flex; align-items:center; justify-content:center;
  border-radius:50%; background:#fff;
  border:1px solid #F0D9A4;
}
.docup-notice-body{
  flex:1; min-width:0;
  display:flex; flex-direction:column; gap:2px;
  font:500 12.5px var(--font); color:var(--ink-2); line-height:1.4;
}
.docup-notice-body strong{ color:var(--ink); font-weight:700; }

/* Zonas disabled (quando contexto incompleto) */
.docup-zones.is-disabled .docup-zone{
  cursor:not-allowed;
  opacity:.45;
  pointer-events:none;
}
.docup-zones.is-disabled .docup-zone .docup-zone-icon{ animation:none; }

/* Preview-modal (quando DocUploader está inline, preview vira modal portal) */
.docup-preview-modal-overlay{
  position:fixed; inset:0; z-index:1350;
  background:rgba(20,25,40,.55);
  backdrop-filter:blur(8px); -webkit-backdrop-filter:blur(8px);
  display:flex; align-items:stretch; justify-content:center;
  padding:32px;
  animation:docupFadeIn .22s ease-out;
}
.docup-preview-modal{
  flex:1; max-width:1100px; margin:0 auto;
  background:#fff;
  border-radius:12px;
  box-shadow:0 24px 64px rgba(20,25,40,.24);
  display:flex; flex-direction:column;
  overflow:hidden;
  animation:docupModalIn .26s cubic-bezier(.16,1,.3,1);
}
.docup-preview-modal > .docup-preview{
  flex:1; min-height:0;
  border-left:none;
  border-radius:12px;
}
.docup-preview-modal .docup-preview-body{
  min-height:60vh;
}

/* Inline DocUploader na Nova Proposta */
.np-docs-section{
  margin:18px 0 8px;
  padding:18px 20px;
  background:#FAFAF7;
  border:1px solid var(--line);
  border-radius:10px;
}
.np-section-eyebrow{
  font:800 10px var(--font); letter-spacing:.18em; text-transform:uppercase;
  color:var(--red-main); margin-bottom:4px;
}
.np-section-hint{
  font:500 12px var(--font); color:var(--ink-3); margin-bottom:12px;
  line-height:1.45;
}

/* ===================================================================
   Folha de Ponto (Timesheet) — redesign editorial 2026-05-30
   Identidade Construsud: bordô #7A1818 + IBM Plex Mono nos números.
   =================================================================== */
.ts2 { max-width: 1080px; margin: 0 auto; animation: ts2In .4s ease both; }
@keyframes ts2In { from { opacity:0; transform: translateY(6px);} to {opacity:1; transform:none;} }

.ts2-head {
  display:flex; align-items:flex-end; justify-content:space-between; gap:16px;
  padding: 2px 2px 16px; border-bottom: 2px solid var(--red-main); margin-bottom: 22px;
}
.ts2-title { margin:0; font: 800 30px/1 var(--font); letter-spacing:-.5px; color: var(--ink); }
.ts2-title .dot { color: var(--red-main); }
.ts2-sub { margin: 9px 0 0; font: 600 11px var(--mono); letter-spacing:.08em; text-transform:uppercase; color: var(--ink-3); }
.ts2-fonte { font: 500 11px var(--mono); color: var(--ink-4); white-space:nowrap; }

.ts2-kpis {
  display:grid; grid-template-columns: repeat(4, 1fr); gap:1px;
  background: var(--line); border:1px solid var(--line); border-radius: var(--radius);
  overflow:hidden; margin-bottom: 18px;
}
.ts2-kpi { background: var(--panel); padding: 16px 18px; display:flex; flex-direction:column; gap:5px; position:relative; }
.ts2-kpi::before { content:''; position:absolute; left:0; top:16px; bottom:16px; width:3px; background: var(--red-main); opacity:0; }
.ts2-kpi.is-primary::before { opacity:1; }
.ts2-kpi-label { font: 700 10px var(--font); text-transform:uppercase; letter-spacing:.12em; color: var(--ink-3); }
.ts2-kpi-value { font: 600 26px/1 var(--mono); color: var(--ink); }
.ts2-kpi.is-primary .ts2-kpi-value { color: var(--red-main); }
.ts2-kpi-sub { font: 500 11px var(--font); color: var(--ink-4); }

.ts2-aviso {
  font: 500 12px/1.5 var(--font); color: #854D0E; background:#FEF9C3; border:1px solid #EAB308;
  border-radius:6px; padding:9px 13px; margin-bottom:20px;
}

.ts2-card { background: var(--panel); border:1px solid var(--line); border-radius: var(--radius); margin-bottom: 20px; overflow:hidden; }
.ts2-card-head { display:flex; align-items:center; gap:10px; padding: 13px 18px; border-bottom:1px solid var(--line); }
.ts2-card-head h2 { margin:0; font: 800 12px var(--font); text-transform:uppercase; letter-spacing:.08em; color: var(--ink-2); }
.ts2-card-head .grow { flex:1; }
.ts2-count { font: 500 11px var(--mono); color: var(--ink-4); }

/* Ranking por obra com barras */
.ts2-ranking { padding: 6px 18px 14px; }
.ts2-rank-row {
  display:grid; grid-template-columns: 150px 1fr 110px 64px; align-items:center; gap:14px;
  padding: 9px 0; border-bottom:1px dashed var(--line);
}
.ts2-rank-row:last-child { border-bottom:none; }
.ts2-rank-cod { font: 700 13px var(--font); color: var(--ink); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ts2-rank-bar-wrap { height:10px; background: var(--red-soft); border-radius:6px; overflow:hidden; }
.ts2-rank-bar { height:100%; background: linear-gradient(90deg, var(--red-main), var(--red-mid)); border-radius:6px; transition: width .5s ease; }
.ts2-rank-val { font: 600 13px var(--mono); color: var(--ink); text-align:right; }
.ts2-rank-h { font: 500 12px var(--mono); color: var(--ink-3); text-align:right; }

/* Filtros + pesquisa */
.ts2-search { font: 500 12px var(--font); padding:6px 11px; border:1px solid var(--line-strong); border-radius:6px; background:#fff; min-width:210px; }
.ts2-search:focus { outline:none; border-color: var(--red-main); }
.ts2-filtros { display:inline-flex; gap:4px; }
.ts2-chip { font: 600 11px var(--font); padding:5px 11px; border-radius:20px; border:1px solid var(--line-strong); background:#fff; color: var(--ink-2); }
.ts2-chip:hover { border-color: var(--red-main); color: var(--red-main); }
.ts2-chip.is-active { background: var(--red-main); color:#fff; border-color: var(--red-main); }

/* Tabela de registos */
.ts2-scroll { max-height: 520px; overflow:auto; }
.ts2-tbl { width:100%; border-collapse:collapse; }
.ts2-tbl thead th { position:sticky; top:0; z-index:1; background:#fff; text-align:left; padding:10px 16px; font: 700 10px var(--font); text-transform:uppercase; letter-spacing:.08em; color: var(--ink-3); border-bottom:1px solid var(--line); }
.ts2-tbl th.num, .ts2-tbl td.num { text-align:right; font-family: var(--mono); }
.ts2-tbl tbody td { padding:9px 16px; border-bottom:1px solid var(--line); font: 500 12.5px var(--font); color: var(--ink); }
.ts2-tbl tbody tr:hover td { background: var(--red-soft); }
.ts2-tbl tbody td.muted { color: var(--ink-3); }
.ts2-pill { display:inline-block; padding:2px 9px; border-radius:20px; font: 700 10px var(--font); }
.ts2-badge { margin-left:6px; padding:1px 6px; border-radius:8px; font: 700 10px var(--font); }
.ts2-foot { padding:10px 18px; font: 500 11px var(--mono); color: var(--ink-4); border-top:1px solid var(--line); }

@media (max-width: 760px) {
  .ts2-kpis { grid-template-columns: repeat(2,1fr); }
  .ts2-rank-row { grid-template-columns: 90px 1fr 92px; }
  .ts2-rank-h { display:none; }
  .ts2-card-head { flex-wrap:wrap; }
}

/* ===================================================================
   REDESIGN HANDOFF (Documentos + Timesheet) — 2026-05-30
   Portado do pacote design (docs.css + timesheet.css), scoped sob .csheet
   para não colidir com o resto da app. Tokens locais = fidelidade total.
   =================================================================== */
.csheet{
  --ink-1:#1B1F27; --ink-2:#454B57; --ink-3:#7A8190; --ink-4:#AAB1BD; --ink-5:#CFD3DC;
  --bg:#F5F6F8; --card:#FFFFFF; --hover:#FAFBFC;
  --line:#E6E8EE; --line-strong:#CFD3DC; --line-soft:#F0F1F5;
  --red:#FF3B3B; --red-bordo:#7A1818; --red-mid:#B7372A;
  --red-soft:#FFF5F5; --red-soft-2:#FFEBEB; --red-line:#FBD9D9;
  --st-blue:#3F7BD7; --st-blue-bg:#E8EDF6; --st-blue-fg:#3C5AA6;
  --st-amber:#E8A547; --st-amber-bg:#FFF3D9; --st-amber-fg:#A77400;
  --st-green:#2BAE66; --st-green-bg:#DFF5E6; --st-green-fg:#1F7A3D;
  --st-red:#D62E2E; --st-red-bg:#FFE7E7; --st-red-fg:#C03A2E;
  --st-grey:#9A9399; --st-grey-bg:#F0EEEE; --st-grey-fg:#7A8190;
  --r-sm:5px; --r-md:8px; --r-lg:12px;
  --shadow-sm:0 1px 3px rgba(20,25,40,.05);
  color:var(--ink-1); font-family:var(--font);
  flex:1; min-height:0; display:flex; flex-direction:column;
}
/* só no timesheet: .content vira coluna flex e reduz o padding vertical → ganha altura, topo perto da topbar */
.content:has(.csheet){display:flex;flex-direction:column;height:100vh;box-sizing:border-box;overflow:hidden;padding-top:10px;padding-bottom:12px;}
.csheet *{box-sizing:border-box;}
.csheet, .csheet button, .csheet input, .csheet table, .csheet th, .csheet td, .csheet span, .csheet div{font-family:var(--font);}
.csheet button{font-size:inherit;cursor:pointer;border:none;background:none;color:inherit;}
.csheet .mono{font-family:var(--mono);font-variant-numeric:tabular-nums;}
.csheet .muted{color:var(--ink-3);}
.csheet .grow{flex:1;}
.csheet .eur{font-size:.66em;font-weight:700;color:var(--ink-3);margin-left:1px;}

.csheet .dpage{flex:1;display:flex;flex-direction:column;overflow:hidden;padding:4px 18px 12px;gap:8px;min-height:0;}
.csheet .dpage-head{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-shrink:0;}
.csheet .dpage-title{font-weight:900;font-size:20px;letter-spacing:-.5px;color:var(--ink-1);display:flex;align-items:center;gap:9px;}
/* cabeçalho compacto: reloginho + bolinha falta + por-direcionar */
.csheet .th-clock{display:inline-flex;align-items:center;justify-content:center;width:30px;height:30px;border:1px solid var(--line-strong);border-radius:8px;color:var(--ink-2);background:var(--card);margin-left:2px;}
.csheet .th-clock svg{width:15px;height:15px;}
.csheet .th-clock:hover{border-color:var(--red-bordo);color:var(--red-bordo);background:var(--hover);}
.csheet .th-falta-dot{width:11px;height:11px;border-radius:50%;background:#EAB308;border:1px solid #B88A00;cursor:help;flex-shrink:0;}
.csheet .th-pend{font-size:11.5px;font-weight:700;color:#8A5A00;background:#FFF7E6;border:1px solid #E0A800;border-radius:7px;padding:5px 10px;}
.csheet .th-pend:hover{background:#FCEFCB;border-color:#C99400;}
.csheet .dpage-sub{font-size:12.5px;color:var(--ink-3);margin-top:3px;}

.csheet .dseg{display:inline-flex;background:var(--card);border:1px solid var(--line-strong);border-radius:8px;padding:3px;gap:2px;}
.csheet .dseg-btn{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;font-size:12.5px;font-weight:600;color:var(--ink-3);border-radius:6px;white-space:nowrap;transition:all .12s;}
.csheet .dseg-btn:hover{color:var(--ink-1);}
.csheet .dseg-btn.active{background:var(--ink-1);color:#fff;}
.csheet .dseg.accent .dseg-btn.active{background:var(--red-bordo);}

.csheet .dbtn{display:inline-flex;align-items:center;justify-content:center;gap:7px;padding:8px 13px;font-size:12.5px;font-weight:600;border-radius:7px;border:1px solid var(--line-strong);background:var(--card);color:var(--ink-1);white-space:nowrap;transition:all .12s;}
.csheet .dbtn svg{width:14px;height:14px;}
.csheet .dbtn:hover{background:var(--hover);border-color:var(--ink-4);}
.csheet .dbtn-primary{background:var(--red-bordo);color:#fff;border-color:var(--red-bordo);font-weight:700;}
.csheet .dbtn-primary:hover{background:var(--red-mid);border-color:var(--red-mid);}

.csheet .dchip{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:4px;font-size:10px;font-weight:700;letter-spacing:.3px;text-transform:uppercase;}
.csheet .dchip.obra{background:var(--bg);color:var(--ink-2);border:1px solid var(--line);font-family:var(--mono);text-transform:none;letter-spacing:0;font-weight:600;}

.csheet .ddot{width:9px;height:9px;border-radius:50%;flex-shrink:0;}
.csheet .ddot.ok{background:var(--st-green);} .csheet .ddot.warn{background:var(--st-amber);}
.csheet .ddot.err{background:var(--st-red);} .csheet .ddot.grey{background:var(--st-grey);}
.csheet .dstatus-pill{display:inline-flex;align-items:center;gap:6px;padding:3px 9px 3px 8px;border-radius:999px;font-size:10.5px;font-weight:700;letter-spacing:.3px;white-space:nowrap;}
.csheet .dstatus-pill .ddot{width:7px;height:7px;}
.csheet .dstatus-pill.ok{background:var(--st-green-bg);color:var(--st-green-fg);}
.csheet .dstatus-pill.warn{background:var(--st-amber-bg);color:var(--st-amber-fg);}
.csheet .dstatus-pill.err{background:var(--st-red-bg);color:var(--st-red-fg);}
.csheet .dstatus-pill.grey{background:var(--st-grey-bg);color:var(--st-grey-fg);}

/* split sidebar + detalhe */
.csheet .dsplit{flex:1;display:grid;grid-template-columns:minmax(190px,max-content) 1fr;grid-template-rows:minmax(0,1fr);gap:14px;min-height:0;}
/* coluna esquerda: cabeçalho em cima + sidebar a preencher */
.csheet .dleft{display:flex;flex-direction:column;min-height:0;gap:10px;}
.csheet .dleft .dpage-head{flex-shrink:0;}
.csheet .dleft .dtypelist{flex:1;min-height:0;}
.csheet .dtypelist{background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--shadow-sm);padding:8px;display:flex;flex-direction:column;gap:2px;overflow:hidden;}
.csheet .dtypelist-grouplbl{font-size:9px;font-weight:700;color:var(--ink-4);letter-spacing:1.1px;text-transform:uppercase;padding:12px 10px 6px;}
.csheet .dtype-item{display:flex;align-items:center;gap:10px;padding:9px 11px;border-radius:7px;color:var(--ink-2);transition:all .12s;text-align:left;width:100%;}
.csheet .dtype-item svg{width:16px;height:16px;color:var(--ink-4);flex-shrink:0;}
.csheet .dtype-item .ti-label{flex:1;font-size:13px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.csheet .dtype-item .ti-count{font-family:var(--mono);font-size:11.5px;font-weight:600;color:var(--ink-4);}
.csheet .dtype-item:hover{background:var(--hover);color:var(--ink-1);}
.csheet .dtype-item.active{background:var(--red-soft);color:var(--red-bordo);}
.csheet .dtype-item.active .ti-count{color:var(--red-bordo);}

.csheet .dscope{display:flex;flex-direction:column;gap:3px;padding:4px;}
.csheet .dscope-item{display:flex;align-items:center;gap:10px;padding:10px 11px;border-radius:7px;color:var(--ink-2);text-align:left;transition:all .12s;width:100%;}
.csheet .dscope-item svg{width:17px;height:17px;color:var(--ink-4);flex-shrink:0;}
.csheet .dscope-item .sc-label{flex:1;font-size:13.5px;font-weight:700;}
.csheet .dscope-item:hover{background:var(--hover);color:var(--ink-1);}
.csheet .dscope-item.active{background:var(--red-bordo);color:#fff;}
.csheet .dscope-item.active svg{color:#fff;}
.csheet .dside-div{height:1px;background:var(--line);margin:8px 6px;}

/* tabela */
.csheet .dtable-card{flex:1;display:flex;flex-direction:column;background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--shadow-sm);overflow:hidden;min-height:0;}
.csheet .dtbl-scroll{flex:1;overflow-y:auto;min-height:0;}
.csheet .dtbl{width:100%;border-collapse:collapse;font-size:13px;}
.csheet .dtbl thead th{position:sticky;top:0;z-index:2;text-align:left;font-size:10px;font-weight:700;color:var(--ink-3);letter-spacing:.7px;text-transform:uppercase;padding:10px 14px;background:var(--hover);border-bottom:1px solid var(--line);white-space:nowrap;}
.csheet .dtbl th.r,.csheet .dtbl td.r{text-align:right;}
.csheet .dtbl th.c,.csheet .dtbl td.c{text-align:center;}
.csheet .dtbl tbody td{padding:0 14px;height:46px;border-bottom:1px solid var(--line-soft);vertical-align:middle;color:var(--ink-1);}
.csheet .dtbl tbody tr:last-child td{border-bottom:none;}
.csheet .dtbl tbody tr:hover td{background:var(--hover);}
.csheet .dcell-date{font-family:var(--mono);font-size:12px;color:var(--ink-2);}
.csheet .dcell-val{font-family:var(--mono);font-size:13px;font-weight:700;color:var(--ink-1);}

/* ── pivot detalhe ── */
.csheet .ts-panel-hd{display:flex;align-items:center;gap:10px;padding:12px 16px;border-bottom:1px solid var(--line);background:var(--card);flex-shrink:0;}
.csheet .ts-panel-hd .t{font-weight:800;font-size:14px;letter-spacing:-.2px;color:var(--ink-1);}
.csheet .ts-panel-hd .c{margin-left:auto;font-family:var(--mono);font-size:11px;color:var(--ink-3);}
.csheet .tspv-detail{display:flex;flex-direction:column;gap:14px;min-height:0;}
.csheet .tspv-hd{display:flex;align-items:center;gap:14px;background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--shadow-sm);padding:16px 18px;flex-shrink:0;}
.csheet .tspv-hd .big-av{width:44px;height:44px;border-radius:10px;background:var(--red-soft-2);color:var(--red-bordo);font-size:16px;font-weight:800;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;}
.csheet .tspv-hd .big-code{font-family:var(--mono);font-size:15px;font-weight:700;color:#fff;background:var(--red-bordo);border-radius:7px;padding:8px 11px;}
.csheet .tspv-hd .big-code.muted{background:var(--ink-4);}
.csheet .tspv-hd .nm{font-weight:800;font-size:18px;letter-spacing:-.3px;color:var(--ink-1);}
.csheet .tspv-hd .mt{font-size:12px;color:var(--ink-3);margin-top:2px;}
.csheet .tspv-hd-stats{margin-left:auto;display:flex;gap:26px;}
.csheet .tspv-stat{text-align:right;}
.csheet .tspv-stat .sl{font-size:9px;font-weight:700;color:var(--ink-4);letter-spacing:.8px;text-transform:uppercase;}
.csheet .tspv-stat .sv{font-family:var(--mono);font-size:17px;font-weight:700;color:var(--ink-1);}
.csheet .tspv-stat .sv.accent{color:var(--red-bordo);}
.csheet .tspv-breaks{display:grid;grid-template-columns:1fr 1fr;gap:14px;flex:1;min-height:0;}
.csheet .tspv-break{background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--shadow-sm);overflow:hidden;display:flex;flex-direction:column;min-height:0;}
.csheet .tspv-break-bd{padding:6px 14px 10px;flex:1;overflow-y:auto;min-height:0;}
.csheet .tspv-brow{display:grid;grid-template-columns:minmax(96px,auto) 1fr 104px;gap:14px;align-items:center;min-height:60px;padding:4px 0;border-bottom:1px solid var(--line-soft);}
.csheet .tspv-brow:last-child{border-bottom:none;}
.csheet .tspv-brow .bl{font-size:15px;color:var(--ink-1);font-weight:600;display:flex;align-items:center;gap:8px;min-width:0;}
.csheet .tspv-brow .bl .sub{color:var(--ink-3);font-weight:400;font-size:12.5px;}
.csheet .tspv-brow .bv{font-family:var(--mono);font-size:15px;font-weight:700;color:var(--ink-1);text-align:right;}
.csheet .tspv-brow .bv .bh{display:block;font-size:12px;font-weight:500;color:var(--ink-3);margin-top:2px;}
.csheet .tspv-bar2{height:9px;background:var(--red-soft);border-radius:5px;overflow:hidden;}
.csheet .tspv-bar2 i{display:block;height:100%;background:var(--red-bordo);border-radius:3px;}
.csheet .tspv-bar2.grey i{background:var(--ink-4);}
.csheet .tspv-bar2.err i{background:var(--st-red);}
.csheet .tspv-mini-av{width:22px;height:22px;border-radius:50%;background:var(--bg);border:1px solid var(--line);color:var(--ink-2);font-size:9.5px;font-weight:800;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;}
.csheet .ts-exfunc{font-size:9px;font-weight:700;letter-spacing:.4px;text-transform:uppercase;color:var(--ink-3);background:var(--bg);border:1px solid var(--line);border-radius:3px;padding:1px 5px;margin-left:7px;}
.csheet .ts-est{font-size:9px;font-weight:700;color:#9A6A00;background:#FFF7E6;border:1px solid #F0D08A;border-radius:3px;padding:1px 5px;white-space:nowrap;}
.csheet .ts-falta{font-size:10.5px;font-weight:700;color:#7A4A00;background:#FFF3D6;border:1px solid #E8C77A;border-radius:7px;padding:6px 10px;white-space:nowrap;}
/* botão alerta por direcionar */
.csheet .dir-alerta{background:#FFF7E6;border-color:#E0A800;color:#8A5A00;font-weight:700;}
.csheet .dir-alerta:hover{background:#FCEFCB;border-color:#C99400;}
.csheet .dir-alerta .dir-h{font-family:var(--mono);font-size:11px;opacity:.8;margin-left:2px;}
/* modal direcionar */
.csheet .dir-modal-bg{position:fixed;inset:0;background:rgba(20,18,22,.5);display:flex;align-items:center;justify-content:center;z-index:60;padding:20px;}
.csheet .dir-modal{background:var(--card);border-radius:14px;box-shadow:0 20px 60px rgba(0,0,0,.3);width:min(680px,96vw);max-height:86vh;display:flex;flex-direction:column;overflow:hidden;}
.csheet .dir-modal-hd{display:flex;align-items:center;justify-content:space-between;padding:18px 22px;border-bottom:1px solid var(--line);}
.csheet .dir-modal-t{font-size:18px;font-weight:800;color:var(--ink-1);}
.csheet .dir-modal-s{font-size:12px;color:var(--ink-3);margin-top:3px;}
.csheet .dir-x{font-size:16px;color:var(--ink-3);border:1px solid var(--line);border-radius:8px;width:32px;height:32px;}
.csheet .dir-x:hover{background:var(--hover);color:var(--ink-1);}
.csheet .dir-modal-bd{overflow-y:auto;padding:8px 14px 14px;}
.csheet .dir-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 8px;border-bottom:1px solid var(--line-soft);}
.csheet .dir-row:last-child{border-bottom:none;}
.csheet .dir-info{min-width:0;}
.csheet .dir-func{font-size:14px;font-weight:700;color:var(--ink-1);display:block;}
.csheet .dir-meta{font-size:11.5px;color:var(--ink-3);}
.csheet .dir-sel{font-size:12px;padding:6px 8px;border:1px solid #E0A800;border-radius:7px;background:#FFFBEB;max-width:280px;flex-shrink:0;}
/* modal por dia */
.csheet .dir-grupo{border:1px solid var(--line);border-radius:10px;margin:8px 0;overflow:hidden;}
.csheet .dir-grupo-hd{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 12px;background:var(--hover);border-bottom:1px solid var(--line);}
.csheet .dir-grupo-hd .dir-func{font-size:13.5px;font-weight:800;color:var(--ink-1);}
.csheet .dir-sel-todos{max-width:200px;background:var(--card);border-color:var(--line-strong);font-size:11px;}
.csheet .dir-dia{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:7px 12px;border-bottom:1px solid var(--line-soft);}
.csheet .dir-dia:last-child{border-bottom:none;}
.csheet .dir-dia-info{display:flex;align-items:baseline;gap:8px;min-width:0;}
.csheet .dir-dia-d{font-size:12.5px;font-weight:700;color:var(--ink-1);text-transform:capitalize;white-space:nowrap;}
.csheet .dir-dia-raw{font-size:11.5px;color:var(--ink-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.csheet .ts-obraref{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--ink-2);}
.csheet .ts-obraref .ts-code{font-family:var(--mono);font-weight:700;color:var(--ink-1);font-size:12px;}

/* Aba Funcionário — convenção da obra (nº em cima destaque, nome em baixo, como Documentos) */
.csheet .ts-obra2{min-width:0;min-height:33px;display:flex;flex-direction:column;justify-content:center;}
.csheet .ts-obra2 .o-num{font-size:15px;font-weight:700;color:var(--ink-1);line-height:1.25;font-family:var(--mono);}
.csheet .ts-obra2 .o-num.o-func{font-family:var(--font);}   /* nome de funcionário em Lato, não mono */
.csheet .ts-obra2 .o-nome{font-size:12.5px;color:var(--ink-3);line-height:1.25;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:230px;}
/* valor + horas à direita (sem barra) */
.csheet .cc-val{text-align:right;font-family:var(--mono);white-space:nowrap;flex-shrink:0;}
.csheet .cc-val .v{font-size:15px;font-weight:700;color:#9A4A52;}
.csheet .cc-val .h{display:block;font-size:12.5px;color:var(--ink-3);margin-top:2px;}
/* card centro de custo — linha (altura consistente entre funcionário e obra) */
.csheet .cc-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 3px;min-height:56px;border-bottom:1px solid var(--line-soft);}
.csheet .cc-row.cg-nota{min-height:0;}
.csheet .cc-row:last-child{border-bottom:none;}
.csheet .cc-row.cc-click{cursor:pointer;border-radius:7px;padding:12px 8px;transition:background .1s;}
.csheet .cc-row.cc-click:hover{background:var(--hover);}
.csheet .cc-row.sel{background:var(--red-soft);}
.csheet .cc-row.sel .o-num,.csheet .cc-row.sel .cc-val .v{color:var(--red-bordo);}
.csheet .cc-row.cc-cg .o-num{font-size:15px;}
.csheet .cc-row.cg-nota{padding:7px 8px 7px 26px;background:var(--bg);border-bottom:1px solid var(--line-soft);cursor:default;}
.csheet .cc-row.cg-nota .cg-nota-t{font-size:12.5px;color:var(--ink-2);text-transform:capitalize;}
/* indicador de filtro no histórico */
.csheet .hist-filtro{font-size:11px;font-weight:700;color:var(--red-bordo);background:var(--red-soft);border:1px solid var(--red-soft-2);border-radius:6px;padding:3px 8px;white-space:nowrap;}
.csheet .hist-filtro:hover{background:var(--red-soft-2);}
/* pesquisa na sidebar */
.csheet .ts-busca-wrap{position:relative;margin:6px 4px 2px;}
.csheet .ts-busca{width:100%;font-family:var(--font);font-size:12.5px;padding:7px 26px 7px 10px;border:1px solid var(--line-strong);border-radius:8px;background:var(--card);color:var(--ink-1);}
.csheet .ts-busca:focus{outline:none;border-color:var(--red-bordo);}
.csheet .ts-busca-x{position:absolute;right:7px;top:50%;transform:translateY(-50%);font-size:11px;color:var(--ink-4);}
.csheet .ts-busca-x:hover{color:var(--red-bordo);}
/* ordenar na sidebar / cards */
.csheet .side-sort{display:flex;align-items:center;gap:3px;padding:4px 4px 6px;flex-wrap:wrap;}
.csheet .side-sort-lbl{font-size:9px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:var(--ink-4);margin-right:2px;}
.csheet .side-sort-btn{display:inline-flex;align-items:center;gap:2px;font-size:11px;font-weight:700;color:var(--ink-3);padding:3px 7px;border-radius:6px;border:1px solid var(--line-strong);background:var(--card);}
.csheet .side-sort-btn:hover{color:var(--ink-1);border-color:var(--ink-4);}
.csheet .side-sort-btn.active{background:var(--ink-1);color:#fff;border-color:var(--ink-1);}
.csheet .side-cli-hdr{font-size:10px;font-weight:800;letter-spacing:.6px;text-transform:uppercase;color:var(--red-bordo);padding:9px 8px 3px;border-top:1px solid var(--line-soft);margin-top:2px;}
.csheet .side-cli-hdr:first-child{border-top:none;margin-top:0;}
/* secções do Centro de custo (Em aberto / Concluídas) */
.csheet .side-sec-hdr{display:flex;align-items:center;justify-content:space-between;font-size:10px;font-weight:800;letter-spacing:.8px;text-transform:uppercase;color:var(--ink-4);padding:11px 8px 4px;margin-top:4px;border-top:1px solid var(--line);}
.csheet .side-sec-hdr.aberto{color:var(--st-green-fg);}
.csheet .side-sec-hdr .side-sec-n{font-family:var(--mono);color:var(--ink-4);}
/* pesquisa pequena no cabeçalho dos cards (Resumo) */
.csheet .card-busca{margin-left:auto;font-family:var(--font);font-size:11.5px;padding:4px 8px;border:1px solid var(--line-strong);border-radius:6px;background:var(--card);color:var(--ink-1);max-width:130px;}
.csheet .card-busca:focus{outline:none;border-color:var(--red-bordo);}

/* listagem de funcionários na sidebar — só nome (destaque) + custo·horas em baixo */
.csheet .dtype-item.func-it{padding:9px 10px;}
.csheet .func-it .fi-main{display:flex;flex-direction:column;min-width:0;gap:2px;}
.csheet .func-it .fi-name{font-size:15px;font-weight:700;color:var(--ink-1);line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.csheet .func-it .fi-name.fi-obra{white-space:nowrap;}   /* obra: nº+nome numa linha; a sidebar cresce p/ caber (max-content) */
.csheet .func-it .fi-cod{font-family:var(--mono);font-weight:700;color:var(--ink-1);}   /* número preto negrito */
.csheet .func-it .fi-onome{font-weight:400;color:var(--ink-2);}                          /* nome cinzento, sem negrito */
.csheet .dtype-item.func-it.active .fi-cod,.csheet .dtype-item.func-it.active .fi-onome{color:var(--red-bordo);}
.csheet .func-it .fi-sub{display:flex;flex-wrap:wrap;gap:4px;line-height:1.2;}
.csheet .func-it .fi-pill{font-family:var(--mono);font-size:11px;font-weight:600;color:var(--ink-3);background:var(--bg);border:1px solid var(--line);border-radius:5px;padding:1px 6px;white-space:nowrap;}
.csheet .dtype-item.func-it.active .fi-name{color:var(--red-bordo);}
.csheet .dtype-item.func-it.active .ts-obra2 .o-num{color:var(--red-bordo);}
.csheet .dtype-item.func-it.active .ts-obra2 .o-nome{color:var(--red-mid);}
.csheet .dtype-item.func-it .ts-obra2 .o-nome{white-space:normal;max-width:none;}
.csheet .dtype-item.func-it.active .fi-pill{background:var(--card);border-color:var(--red-soft);color:var(--red-mid);}
/* botão Ex-funcionários (abre/fecha) */
.csheet .ex-toggle{display:flex;align-items:center;gap:7px;width:100%;text-align:left;padding:8px 10px;font-size:9px;font-weight:700;color:var(--ink-4);letter-spacing:1.1px;text-transform:uppercase;border-radius:7px;}
.csheet .ex-toggle:hover{background:var(--hover);color:var(--ink-2);}
.csheet .ex-toggle .hm-car{color:var(--ink-4);transition:transform .15s;}
.csheet .ex-toggle .hm-car.open{transform:rotate(90deg);}
.csheet .ex-toggle .ex-n{margin-left:auto;font-family:var(--mono);letter-spacing:0;}

/* ordenação do card centro de custo */
.csheet .cc-sort{margin-left:auto;display:inline-flex;align-items:center;gap:3px;}
.csheet .cc-sort-lbl{display:inline-flex;align-items:center;gap:3px;font-size:9.5px;font-weight:700;letter-spacing:.4px;text-transform:uppercase;color:var(--ink-4);margin-right:4px;}
.csheet .cc-sort-lbl svg{width:12px;height:12px;}
.csheet .cc-sort-btn{display:inline-flex;align-items:center;gap:3px;font-size:11.5px;font-weight:700;color:var(--ink-3);padding:3px 8px;border-radius:6px;border:1px solid var(--line-strong);background:var(--card);}
.csheet .cc-sort-btn:hover{color:var(--ink-1);border-color:var(--ink-4);}
.csheet .cc-sort-btn.active{background:var(--ink-1);color:#fff;border-color:var(--ink-1);}
.csheet .cc-sort-ar{font-size:8px;line-height:1;}

/* histórico — acordeão Ano → Mês → Dia */
.csheet .hm{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;text-align:left;padding:10px 3px;border-bottom:1px solid var(--line-soft);}
.csheet .hm:hover{background:var(--hover);}
.csheet .hm .hm-t{display:flex;align-items:center;gap:8px;color:var(--ink-1);}
.csheet .hm .hm-car{color:var(--ink-4);transition:transform .15s;flex-shrink:0;}
.csheet .hm .hm-car.open{transform:rotate(90deg);}
.csheet .hm .hm-v{font-family:var(--mono);font-size:12px;color:var(--ink-3);white-space:nowrap;}
.csheet .hm-ano .hm-t{font-size:14px;font-weight:800;}
.csheet .hm-mes-wrap{padding-left:14px;border-left:2px solid var(--line-soft);margin-left:4px;}
.csheet .hm-mes .hm-t{font-size:12.5px;font-weight:700;text-transform:capitalize;}
/* aba Obra: nível funcionário dentro do mês */
.csheet .hm-func-wrap{padding-left:14px;border-left:2px solid var(--line-soft);margin-left:4px;}
.csheet .hm-func .hm-t{font-size:12px;font-weight:700;}
/* histórico — bloco de dia */
.csheet .hd-day{padding:7px 3px 7px 28px;border-bottom:1px solid var(--line-soft);background:var(--bg);}
.csheet .hd-day:last-child{border-bottom:none;}
.csheet .hd-day .hd-date{font-size:11.5px;font-weight:700;color:var(--ink-2);text-transform:capitalize;margin-bottom:4px;letter-spacing:.2px;}
.csheet .hd-day .hd-date.hd-semdia{color:var(--ink-4);font-weight:600;text-transform:none;font-style:italic;}
.csheet .hd-line{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:5px 0;}
/* ── Calendário do mês (grelha de dias) ── */
.csheet .cal{display:flex;flex-direction:column;gap:7px;padding:10px 12px 14px;}
.csheet .cal-wd{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:6px;}
.csheet .cal-wd span{font-size:9px;font-weight:800;letter-spacing:.7px;text-transform:uppercase;color:var(--ink-4);text-align:center;}
.csheet .cal-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:6px;}
.csheet .cal-cell{min-width:0;overflow:hidden;border:1px solid var(--line);border-radius:9px;padding:5px 5px 6px;display:flex;flex-direction:column;gap:3px;background:var(--card);transition:border-color .12s,box-shadow .12s;}
.csheet .cal-cell.cal-empty{border:none;background:transparent;}
/* dias do mês anterior/seguinte (preenchem a grelha p/ altura igual) — esbatidos */
.csheet .cal-cell.cal-out{background:var(--ink-5,#f2f2f0);border-color:transparent;opacity:.5;}
.csheet .cal-cell.cal-out .cal-d{color:var(--ink-4);font-weight:600;}
.csheet .cal-cell.fim{background:var(--bg);}
/* ── zoom do dia (clicar no card amplia) ── */
.csheet .cal-cell.cal-clic{cursor:default;}
.csheet .cal-cell.cal-clic:hover{border-color:var(--red-bordo);box-shadow:0 4px 14px rgba(122,24,24,.12);}
.csheet .cal-zoom-back{position:fixed;inset:0;background:rgba(20,25,40,.45);backdrop-filter:blur(2px);display:flex;align-items:center;justify-content:center;z-index:200;animation:calzfade .14s ease;cursor:zoom-out;}
.csheet .cal-zoom{background:var(--card);border:1px solid var(--line-strong);border-radius:14px;box-shadow:0 24px 70px rgba(15,18,25,.4);width:min(540px,92vw);max-height:84vh;display:flex;flex-direction:column;overflow:hidden;animation:calzin .2s cubic-bezier(.2,.7,.3,1);}
.csheet .cal-zoom-hd{display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding:16px 20px;border-bottom:1px solid var(--line);background:var(--hover);}
.csheet .cal-zoom-d{font-weight:900;font-size:20px;color:var(--ink-1);font-variant-numeric:tabular-nums;letter-spacing:-.5px;}
.csheet .cal-zoom-tot{font-family:var(--mono);font-size:14px;font-weight:700;color:var(--red-bordo);}
.csheet .cal-zoom-pills{padding:14px 18px;display:flex;flex-direction:column;gap:7px;overflow-y:auto;}
.csheet .cal-zoom-pills .cal-pill{font-size:13px;padding:7px 13px;line-height:1.4;white-space:normal;align-items:flex-start;}
.csheet .cal-zoom-pills .cal-pill b{font-size:13px;white-space:nowrap;}
.csheet .cal-zoom-pills .cal-pill .cal-pill-sub{overflow:visible;text-overflow:clip;white-space:normal;}
.csheet .cal-zoom-pills .cal-pill .cal-pill-h{font-size:12.5px;white-space:nowrap;}
@keyframes calzfade{from{opacity:0}to{opacity:1}}
@keyframes calzin{from{opacity:0;transform:scale(.55)}to{opacity:1;transform:scale(1)}}
.csheet .cal-cell.tem{border-color:var(--line-strong);}
.csheet .cal-cell.tem:hover{border-color:var(--red-bordo);box-shadow:0 3px 10px rgba(122,24,24,.08);}
.csheet .cal-top{display:flex;align-items:center;gap:4px;}
.csheet .cal-d{font-size:11px;font-weight:700;color:var(--ink-4);line-height:1;font-variant-numeric:tabular-nums;}
.csheet .cal-cell.tem .cal-d{color:var(--ink-1);}
.csheet .cal-est{font-size:10px;font-weight:800;color:#C99400;line-height:1;}
.csheet .cal-mais-top{font-size:9px;font-weight:800;color:#8A5A00;background:#FFF3D6;border:1px solid #E8C77A;border-radius:4px;padding:0 4px;cursor:help;}
/* dia passado sem registo → falta informação */
.csheet .cal-cell.cal-falta{background:#FFF6F4;border-color:#F3C9C0;border-style:dashed;}
.csheet .cal-falta-ic{font-size:8.5px;font-weight:800;color:#B23A2E;background:#FCE3DE;border:1px solid #F0B5AC;border-radius:4px;padding:0 4px;cursor:help;letter-spacing:.2px;}
.csheet .cal-tot{margin-left:auto;font-size:9.5px;font-weight:700;color:var(--ink-3);font-family:var(--mono);}
.csheet .cal-pills{display:flex;flex-direction:column;gap:2px;flex:1;overflow:hidden;}
.csheet .cal-pill{display:flex;align-items:baseline;gap:3px;font-size:9.5px;line-height:1.45;color:var(--ink-2);background:var(--red-soft);border-radius:4px;padding:1px 5px;white-space:nowrap;overflow:hidden;}
.csheet .cal-pill b{font-family:var(--mono);color:var(--red-bordo);font-weight:700;min-width:0;overflow:hidden;text-overflow:ellipsis;}
.csheet .cal-pill .cal-pill-sub{min-width:0;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;color:var(--ink-3);}
.csheet .cal-pill .cal-pill-h{font-family:var(--mono);color:var(--ink-2);flex-shrink:0;padding-left:3px;}
.csheet .cal-mais{font-size:9px;color:var(--ink-4);font-weight:700;padding-left:4px;}
.csheet .cal-custo{font-size:10px;font-weight:700;color:#9A4A52;font-family:var(--mono);text-align:right;margin-top:2px;border-top:1px solid var(--line-soft);padding-top:3px;}

/* Resumo: calendário navegável (cima) + cards (50%, baixo) */
.csheet .res-cal{flex:7;min-height:0;display:flex;flex-direction:column;background:var(--card);border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--shadow-sm);overflow:hidden;}
.csheet .res-cal-hd{display:flex;align-items:center;gap:10px;padding:10px 16px;border-bottom:1px solid var(--line);flex-shrink:0;}
.csheet .res-cal-t{font-size:15px;font-weight:800;color:var(--ink-1);text-transform:capitalize;min-width:130px;text-align:center;}
.csheet .res-cal-sub{font-size:11px;color:var(--ink-4);font-family:var(--mono);}
.csheet .res-cal-stats{display:flex;gap:22px;margin-left:auto;}
.csheet .res-cal-stats .tspv-stat .sl{font-size:8.5px;}
.csheet .res-cal-stats .tspv-stat .sv{font-size:14px;}
.csheet .res-nav{width:28px;height:28px;border:1px solid var(--line-strong);border-radius:8px;background:var(--card);color:var(--ink-1);font-size:16px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.csheet .res-nav:hover:not(:disabled){background:var(--hover);border-color:var(--red-bordo);color:var(--red-bordo);}
.csheet .res-nav:disabled{opacity:.35;cursor:default;}
.csheet .res-cal-bd{flex:1;overflow:hidden;min-height:0;}
/* calendário compacto (Resumo): 6 linhas a encher os 70%, estático, sem scroll */
.csheet .cal-compacto{height:100%;padding:8px 10px 10px;}
.csheet .cal-compacto .cal-grid{flex:1;min-height:0;}
.csheet .cal-compacto .cal-cell{min-height:0;}
/* dia com muitas linhas: topo+custo fixos, lista de pills scrolla DENTRO do dia (sem tooltip, sem cortar) */
.csheet .cal-compacto .cal-top{flex-shrink:0;}
.csheet .cal-compacto .cal-custo{flex-shrink:0;}
.csheet .cal-compacto .cal-pills{overflow-y:auto;min-height:0;}
.csheet .cal-compacto .cal-pill{font-size:9px;padding:0 4px;line-height:1.35;overflow:visible;}
.csheet .cal-compacto .cal-pill .cal-pill-sub{overflow:visible;text-overflow:clip;}   /* pills à vista inteiras, sem cortar */
.csheet .cal-compacto .cal-custo{font-size:9px;padding-top:2px;margin-top:1px;}
.csheet .cal-compacto .cal-d{font-size:10px;}
.csheet .res-cards{flex:3;min-height:0;display:flex;}
.csheet .res-cards .tspv-breaks{flex:1;min-height:0;}

/* calendário de pesquisa por data */
.csheet .hist-cal{font-family:var(--font);font-size:11.5px;padding:3px 6px;border:1px solid var(--line-strong);border-radius:6px;background:var(--card);color:var(--ink-1);}
.csheet .hist-clear{margin-left:6px;font-size:11px;color:var(--ink-3);border:1px solid var(--line);border-radius:5px;padding:2px 7px;background:var(--card);}
.csheet .hist-clear:hover{color:var(--red-bordo);border-color:var(--red-bordo);}

@media (max-width: 820px){
  .csheet{height:auto;}
  .csheet .dsplit{grid-template-columns:1fr;}
  .csheet .tspv-breaks{grid-template-columns:1fr;}
  .csheet .tspv-hd-stats{gap:16px;}
}

/* ═══ Submeter Horas — modal folha diária (handoff). Tudo scopado em .shmodal (zero conflito). ═══ */
.shmodal{
  --ink-1:#1B1F27;--ink-2:#454B57;--ink-3:#7A8190;--ink-4:#AAB1BD;--ink-5:#CFD3DC;
  --bg:#F5F6F8;--card:#FFFFFF;--hover:#FAFBFC;--line:#E6E8EE;--line-strong:#CFD3DC;--line-soft:#F0F1F5;
  --red:#FF3B3B;--red-bordo:#7A1818;--red-mid:#B7372A;--red-soft:#FFF5F5;--red-soft-2:#FFEBEB;--red-line:#FBD9D9;
  --st-blue:#3F7BD7;--st-blue-bg:#E8EDF6;--st-blue-fg:#3C5AA6;--st-amber:#E8A547;--st-amber-bg:#FFF3D9;--st-amber-fg:#A77400;
  --st-green:#2BAE66;--st-green-bg:#DFF5E6;--st-green-fg:#1F7A3D;--st-red:#D62E2E;--st-red-bg:#FFE7E7;--st-red-fg:#C03A2E;
  --st-grey:#9A9399;--st-grey-bg:#F0EEEE;--st-grey-fg:#7A8190;--r-md:8px;
  --shadow-md:0 1px 3px rgba(20,25,40,.06),0 4px 14px rgba(20,25,40,.05);
  position:fixed;inset:0;background:rgba(20,15,8,.42);backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center;z-index:120;padding:24px;font-family:var(--font);color:var(--ink-1);
}
.shmodal *{box-sizing:border-box;}
.shmodal .dmodal{background:var(--card);border-radius:14px;box-shadow:0 24px 80px rgba(15,18,25,.34);display:flex;flex-direction:column;overflow:hidden;width:min(1200px,96vw);height:92vh;}
.shmodal .dmodal-hd{display:flex;align-items:center;gap:12px;padding:16px 22px;border-bottom:1px solid var(--line);flex-shrink:0;}
.shmodal .dmodal-hd .mk{width:34px;height:34px;border-radius:9px;background:var(--red-soft-2);color:var(--red-bordo);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.shmodal .dmodal-hd .mk svg{width:18px;height:18px;}
.shmodal .dmodal-hd .t{font-weight:800;font-size:17px;letter-spacing:-.3px;}
.shmodal .dmodal-hd .s{font-size:12px;color:var(--ink-3);margin-top:1px;}
.shmodal .dmodal-x{margin-left:auto;width:32px;height:32px;border-radius:7px;display:flex;align-items:center;justify-content:center;color:var(--ink-3);border:1px solid var(--line);background:var(--card);cursor:pointer;}
.shmodal .dmodal-x:hover{background:var(--red-soft-2);color:var(--red-bordo);border-color:var(--red-line);}
.shmodal .dmodal-x svg{width:15px;height:15px;}
.shmodal .dday-bar{display:flex;align-items:center;gap:10px;padding:11px 16px;background:var(--hover);border-bottom:1px solid var(--line);flex-shrink:0;}
.shmodal .dday-nav{width:34px;height:34px;border-radius:8px;border:1px solid var(--line-strong);background:var(--card);display:flex;align-items:center;justify-content:center;color:var(--ink-2);cursor:pointer;}
.shmodal .dday-nav:hover{background:var(--red-soft);color:var(--red-bordo);border-color:var(--red-line);}
.shmodal .dday-nav svg{width:16px;height:16px;}
.shmodal .dday-cur{font-weight:800;font-size:15px;letter-spacing:-.2px;text-transform:capitalize;}
.shmodal .dday-sub{font-size:11.5px;color:var(--ink-3);}
.shmodal .dbody{flex:1;display:flex;min-height:0;}
.shmodal .dflow-scroll{flex:1;overflow-y:auto;padding:20px 22px;min-height:0;}
.shmodal .dundo{display:flex;align-items:center;gap:12px;padding:10px 14px;background:var(--ink-1);color:#fff;border-radius:10px;font-size:13px;font-weight:600;margin-bottom:11px;}
.shmodal .dundo .ub{margin-left:auto;color:#fff;font-weight:800;font-size:12.5px;text-decoration:underline;cursor:pointer;background:none;}
.shmodal .demp-list{display:flex;flex-direction:column;gap:11px;}
.shmodal .demp{border:1px solid var(--line);border-radius:11px;background:var(--card);overflow:hidden;box-shadow:inset 3px 0 0 var(--st-red);}
.shmodal .demp.fechado{box-shadow:inset 3px 0 0 var(--st-green);}
.shmodal .demp-head{display:flex;align-items:center;gap:11px;padding:9px 13px;background:var(--hover);border-bottom:1px solid var(--line-soft);cursor:pointer;}
.shmodal .demp-chev{display:flex;align-items:center;color:var(--ink-4);flex-shrink:0;}
.shmodal .demp-chev svg{width:16px;height:16px;transition:transform .18s;}
.shmodal .ts-av{width:26px;height:26px;border-radius:50%;background:var(--red-soft-2);color:var(--red-bordo);font-size:11px;font-weight:800;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;}
.shmodal .demp-head .nm{font-weight:800;font-size:13.5px;}
.shmodal .demp-head .tx{font-family:var(--mono);font-size:11px;color:var(--ink-3);}
.shmodal .demp-head .sub{margin-left:auto;display:flex;align-items:center;gap:10px;}
.shmodal .demp-head .sub .sh{font-family:var(--mono);font-size:13px;font-weight:700;}
.shmodal .demp-head .sub .sc{font-family:var(--mono);font-size:10.5px;color:var(--ink-3);}
.shmodal .ddot{width:9px;height:9px;border-radius:50%;flex-shrink:0;}
.shmodal .ddot.ok{background:var(--st-green);}
.shmodal .ddot.err{background:var(--st-red);}
.shmodal .demp-tools{display:flex;align-items:center;gap:6px;}
.shmodal .demp-fechar{display:inline-flex;align-items:center;gap:5px;padding:5px 10px;border-radius:7px;border:1px solid var(--line-strong);background:var(--card);font-size:11px;font-weight:700;color:var(--st-red-fg);cursor:pointer;}
.shmodal .demp-fechar.on{background:var(--st-green-bg);color:var(--st-green-fg);border-color:#BFE3CD;}
.shmodal .demp-fechar:disabled{opacity:.4;cursor:not-allowed;}
.shmodal .demp-fechar.auto{cursor:default;}
.shmodal .demp-fechar svg{width:13px;height:13px;}
.shmodal .demp-ibtn{width:28px;height:28px;border-radius:6px;display:flex;align-items:center;justify-content:center;color:var(--ink-4);border:1px solid transparent;background:none;cursor:pointer;}
.shmodal .demp-ibtn:hover{background:var(--hover);color:var(--red-bordo);border-color:var(--line);}
.shmodal .demp-ibtn svg{width:15px;height:15px;}
.shmodal .estado-seg{display:flex;flex-wrap:wrap;gap:5px;padding:9px 13px;border-bottom:1px solid var(--line-soft);background:var(--hover);}
.shmodal .estado-pill{display:inline-flex;align-items:center;gap:5px;padding:5px 10px;border-radius:999px;border:1px solid var(--line);background:var(--card);font-size:11px;font-weight:700;color:var(--ink-3);cursor:pointer;}
.shmodal .estado-pill:hover{border-color:var(--line-strong);color:var(--ink-1);}
.shmodal .estado-pill.on.ok{background:var(--st-green-bg);color:var(--st-green-fg);border-color:#BFE3CD;}
.shmodal .estado-pill.on.grey{background:var(--st-grey-bg);color:var(--st-grey-fg);border-color:#D8D4D4;}
.shmodal .estado-pill.on.blue{background:var(--st-blue-bg);color:var(--st-blue-fg);border-color:#C5D6EE;}
.shmodal .estado-pill.on.amber{background:var(--st-amber-bg);color:var(--st-amber-fg);border-color:#F0E0B8;}
.shmodal .estado-pill.on.err{background:var(--st-red-bg);color:var(--st-red-fg);border-color:#F2C9C9;}
.shmodal .demp-lines{padding:10px 13px;display:flex;flex-direction:column;gap:8px;}
.shmodal .demp-line{display:grid;grid-template-columns:320px 104px 1fr 30px;gap:9px;align-items:center;}
.shmodal .demp-line .dinput.sel{width:100%;}
.shmodal .demp.copyopen{overflow:visible;}
.shmodal .demp-copy-pop{z-index:200;}
.shmodal .demp-copy-scroll{max-height:210px;overflow-y:auto;}
.shmodal .lin-desc{padding:8px 10px;border:1px solid var(--line);border-radius:7px;background:var(--card);font-size:12px;font-family:var(--font);color:var(--ink-1);}
.shmodal .demp-x{width:28px;height:28px;border-radius:6px;display:flex;align-items:center;justify-content:center;color:var(--ink-4);border:1px solid transparent;background:none;cursor:pointer;flex-shrink:0;}
.shmodal .demp-x:hover{background:var(--red-soft-2);color:var(--red-bordo);}
.shmodal .demp-x svg{width:15px;height:15px;}
.shmodal .demp-addcc{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;font-weight:600;color:var(--ink-3);align-self:flex-start;padding:5px 4px;background:none;cursor:pointer;}
.shmodal .demp-addcc:hover{color:var(--red-bordo);}
.shmodal .demp-addcc svg{width:13px;height:13px;}
.shmodal .demp-empty-cc{font-size:11.5px;color:var(--ink-4);font-style:italic;padding:4px 2px;}
.shmodal .demp-note{padding:11px 13px;font-size:12px;color:var(--ink-3);font-style:italic;display:flex;align-items:center;gap:8px;}
.shmodal .demp-note svg{width:14px;height:14px;color:var(--ink-4);}
.shmodal .demp-justif{padding:11px 13px;}
.shmodal .demp-justif label{font-size:11px;font-weight:700;color:var(--st-amber-fg);display:flex;align-items:center;gap:6px;margin-bottom:6px;}
.shmodal .demp-justif label svg{width:13px;height:13px;}
.shmodal .demp-justif textarea{width:100%;min-height:58px;padding:9px 11px;border:1px solid var(--line-strong);border-radius:7px;font-family:var(--font);font-size:12.5px;color:var(--ink-1);resize:vertical;}
.shmodal .demp-extra{padding:10px 13px;border-top:1px solid var(--line-soft);display:flex;flex-direction:column;gap:9px;background:var(--hover);}
.shmodal .demp-frow{display:flex;align-items:center;gap:9px;}
.shmodal .demp-frow .lbl{font-size:11px;font-weight:700;color:var(--ink-3);min-width:130px;display:inline-flex;align-items:center;gap:6px;}
.shmodal .demp-frow .lbl svg{width:13px;height:13px;color:var(--ink-4);}
.shmodal .demp-copywrap{position:relative;}
.shmodal .demp-copy-pop{position:absolute;top:calc(100% + 5px);right:0;z-index:40;background:var(--card);border:1px solid var(--line-strong);border-radius:9px;box-shadow:var(--shadow-md);width:236px;overflow:hidden;}
.shmodal .demp-copy-hd{padding:9px 12px;font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.6px;color:var(--ink-4);border-bottom:1px solid var(--line-soft);}
.shmodal .demp-copy-opt{display:flex;align-items:center;gap:9px;padding:7px 12px;font-size:12.5px;color:var(--ink-1);width:100%;text-align:left;cursor:pointer;background:none;}
.shmodal .demp-copy-opt:hover{background:var(--hover);}
.shmodal .demp-copy-opt input{accent-color:var(--red-bordo);width:15px;height:15px;}
.shmodal .demp-copy-ft{padding:10px 12px;border-top:1px solid var(--line-soft);display:flex;gap:8px;}
.shmodal .demp-addbar{display:flex;align-items:center;gap:10px;padding:11px 13px;border:1px dashed var(--line-strong);border-radius:11px;background:var(--hover);margin-top:12px;}
.shmodal .dinput{width:100%;padding:8px 12px;border:1px solid var(--line-strong);border-radius:7px;background:var(--card);font-size:13px;color:var(--ink-1);font-family:var(--font);}
.shmodal .dinput::placeholder{color:var(--ink-4);}
.shmodal .dinput:focus{outline:none;border-color:var(--red-bordo);box-shadow:0 0 0 3px rgba(122,24,24,.08);}
.shmodal .dinput.sel{cursor:pointer;}
.shmodal .dinput-money{font-family:var(--mono);font-weight:700;text-align:right;}
.shmodal .ts-stepper{display:flex;align-items:center;border:1px solid var(--line-strong);border-radius:7px;overflow:hidden;background:var(--card);}
.shmodal .ts-stepper button{width:30px;height:34px;display:flex;align-items:center;justify-content:center;color:var(--ink-3);background:none;cursor:pointer;}
.shmodal .ts-stepper button:hover{background:var(--hover);color:var(--red-bordo);}
.shmodal .ts-stepper input{width:100%;border:none;text-align:center;font-family:var(--mono);font-size:13.5px;font-weight:700;color:var(--ink-1);background:none;outline:none;}
.shmodal .ts-stepper .u{font-size:11px;color:var(--ink-4);padding-right:9px;font-weight:600;}
.shmodal .dbtn{display:inline-flex;align-items:center;justify-content:center;gap:7px;padding:8px 13px;font-size:12.5px;font-weight:600;border-radius:7px;border:1px solid var(--line-strong);background:var(--card);color:var(--ink-1);white-space:nowrap;cursor:pointer;}
.shmodal .dbtn svg{width:14px;height:14px;}
.shmodal .dbtn:hover{background:var(--hover);border-color:var(--ink-4);}
.shmodal .dbtn-primary{background:var(--red-bordo);color:#fff;border-color:var(--red-bordo);font-weight:700;}
.shmodal .dbtn-primary:hover{background:var(--red-mid);border-color:var(--red-mid);}
.shmodal .dbtn-sm{padding:5px 9px;font-size:11.5px;}
.shmodal .dbtn-lg{padding:11px 14px;font-size:13.5px;}
.shmodal .dbtn:disabled{opacity:.5;cursor:not-allowed;}
.shmodal .dchip-obra{display:inline-flex;align-items:center;padding:2px 8px;border-radius:4px;font-size:10px;background:var(--bg);color:var(--ink-2);border:1px solid var(--line);font-family:var(--mono);font-weight:600;}
.shmodal .tspv-mini-av{width:22px;height:22px;border-radius:50%;background:var(--bg);border:1px solid var(--line);color:var(--ink-2);font-size:9.5px;font-weight:800;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;}
.shmodal .grouplbl{font-size:9px;font-weight:700;color:var(--ink-4);letter-spacing:1.1px;text-transform:uppercase;padding-bottom:8px;}
.shmodal .ts-resumo{width:384px;flex-shrink:0;border-left:1px solid var(--line);display:flex;flex-direction:column;overflow:hidden;background:var(--card);}
.shmodal .ts-resumo-hd{padding:14px 18px;border-bottom:1px solid var(--line);background:var(--hover);}
.shmodal .ts-resumo-hd .t{font-weight:800;font-size:13px;letter-spacing:.3px;text-transform:uppercase;}
.shmodal .ts-resumo-hd .s{font-size:11.5px;color:var(--ink-3);margin-top:2px;text-transform:capitalize;}
.shmodal .ts-resumo-bd{flex:1;padding:16px 18px;display:flex;flex-direction:column;gap:2px;overflow-y:auto;}
.shmodal .ts-resumo-ft{padding:14px 18px;border-top:1px solid var(--line);display:flex;flex-direction:column;gap:8px;}
.shmodal .ts-resumo-ft .row{display:flex;gap:8px;}
.shmodal .ts-resumo-ft .dbtn{flex:1;}
.shmodal .ts-rrow{display:flex;align-items:center;justify-content:space-between;padding:9px 0;border-bottom:1px solid var(--line-soft);font-size:13px;}
.shmodal .ts-rrow .k{color:var(--ink-2);display:inline-flex;align-items:center;gap:7px;}
.shmodal .ts-rrow .k .dot{width:8px;height:8px;border-radius:50%;}
.shmodal .ts-rrow .v{font-family:var(--mono);font-weight:700;color:var(--ink-1);font-variant-numeric:tabular-nums;}
.shmodal .ts-rtot{margin-top:8px;padding:14px 0 4px;border-top:2px solid var(--ink-1);display:flex;align-items:flex-end;justify-content:space-between;}
.shmodal .ts-rtot .k{font-size:10px;font-weight:800;letter-spacing:1px;text-transform:uppercase;color:var(--ink-3);}
.shmodal .ts-rtot .v{font-weight:900;font-size:28px;letter-spacing:-1px;color:var(--red-bordo);line-height:1;}
.shmodal .ts-rtot .v .eur{font-size:.6em;}
@media(max-width:900px){.shmodal .dbody{flex-direction:column;}.shmodal .ts-resumo{width:auto;border-left:none;border-top:1px solid var(--line);}}
