/* components.css — shared component library. Consumes tokens.css. */

/* ════════════════════════════════════════════════════════════════════════
   MOBILE SHELL — top bar + off-canvas drawer   (active only < 1024px)
   ────────────────────────────────────────────────────────────────────────
   REBUILT to be SELF-CONTAINED + UNIVERSAL. It must render identically on any
   phone / browser regardless of:
     (a) which design tokens happen to be defined on the page,
     (b) whether the browser supports backdrop-filter,
     (c) the desktop `.sidebar` / `html.sidebar-collapsed` cascade.

   Design decisions that make it universal:
     • Every surface is FULLY OPAQUE. The old drawer used a 58%-transparent
       token + backdrop-filter blur to *look* solid. On browsers without
       backdrop-filter (many Android / in-app webviews) the drawer was
       see-through → the dashboard showed through it → "content outside the
       menu / doubled inputs". Opaque kills that on every device.
     • A LOCAL palette (`--m-*`) is defined right here, so colours never depend
       on the global token cascade being present or correct.
     • Critical box-model values are explicit px (no var-only padding that
       collapses to an invalid value when a token is missing).
     • All layout rules carry `!important` so they beat the desktop sidebar and
       the collapsed-rail rules no matter the load order.
   ════════════════════════════════════════════════════════════════════════ */

/* Local, always-defined palette for the mobile shell (themed). */
.app-topbar, .app-drawer, .drawer-overlay {
  /* Escada de superfícies, versão OPACA. Estas superfícies não podem ser
     translúcidas (ver a nota acima: sem backdrop-filter o drawer fica a ver-se
     através), por isso usa-se a forma opaca de rgba(30,30,38,0.94) → #1e1e26.
     O #0d0d14 anterior era MAIS ESCURO que a página (#15151b) — invertia a
     escada: o drawer afundava em vez de subir. */
  --m-bg:        #1e1e26;   /* topbar/drawer — forma opaca do rgba(30,30,38,0.94) */
  --m-bg-raise:  #24242d;   /* inputs, pickers — o degrau do cartão               */
  --m-border:    rgba(255,255,255,0.10);
  --m-text-1:    #f2f2f5;
  --m-text-2:    #c9c9d4;
  --m-text-3:    #a0a0b0;   /* era #6a6a7c, muito abaixo do piso #8e8e9c */
  --m-brand:     #9c8ff5;
  --m-brand-rgb: 156,143,245;
  --m-hover:     rgba(255,255,255,0.06);  /* no escuro o hover LEVANTA */
}
[data-theme="light"] .app-topbar,
[data-theme="light"] .app-drawer,
[data-theme="light"] .drawer-overlay {
  --m-bg:       #ffffff;
  --m-bg-raise: #f4f4f8;
  --m-border:   #ececf1;
  --m-text-1:   #14141c;
  --m-text-2:   #4b4b5c;
  --m-text-3:   #6e6e80;
  --m-brand:    #6c5fd0;
  --m-brand-rgb:108,95,208;
  --m-hover:    rgba(20,20,40,0.05);   /* no claro o hover AFUNDA */
}

/* Topbar hidden on desktop; drawer is the normal sidebar; overlay gone. */
.app-topbar { display:none; }
@media (min-width:1024px){ .drawer-overlay{ display:none !important; } }

@media (max-width:1023.98px){

  /* ── Mobile top bar ─────────────────────────────────────────────────── */
  .app-topbar {
    display:flex; align-items:center;
    position:sticky; top:0; z-index:90;
    height:calc(56px + env(safe-area-inset-top, 0px));
    padding:env(safe-area-inset-top, 0px) 14px 0;
    background:var(--m-bg);                       /* opaque */
    border-bottom:1px solid var(--m-border);
  }
  .app-topbar .hamburger {
    /* 44px é o alvo de toque mínimo do HANDOFF §2. */
    display:grid; place-items:center; width:var(--tap,44px); height:var(--tap,44px);
    border-radius:10px; border:1px solid var(--m-border);
    background:var(--m-hover); color:var(--m-text-1);
    cursor:pointer; -webkit-tap-highlight-color:transparent;
  }
  .app-topbar .hamburger span,
  .app-topbar .hamburger span::before,
  .app-topbar .hamburger span::after {
    content:''; display:block; width:18px; height:2px; border-radius:2px;
    background:var(--m-text-1);
  }
  .app-topbar .hamburger span { position:relative; }
  .app-topbar .hamburger span::before { position:absolute; top:-6px; left:0; }
  .app-topbar .hamburger span::after  { position:absolute; top:6px;  left:0; }
  .app-topbar__brand {
    position:absolute; left:50%; transform:translateX(-50%);
    display:flex; align-items:center; gap:8px; pointer-events:none;
  }
  .app-topbar__brand strong { font-size:15px; font-weight:700; color:var(--m-text-1); white-space:nowrap; }
  .app-topbar__logo-img { width:26px; height:26px; border-radius:7px; display:block; }

  /* ── Backdrop overlay ───────────────────────────────────────────────── */
  .drawer-overlay {
    position:fixed; inset:0; z-index:199;
    background:rgba(0,0,0,0.74);        /* darker — fully veils the dashboard
                                           widgets that used to peek (look "cut")
                                           in the strip beside the drawer */
    opacity:0; pointer-events:none;
    transition:opacity 200ms ease;
  }
  body.drawer-open .drawer-overlay { opacity:1; pointer-events:auto; }
  body.drawer-open { overflow:hidden; }

  /* ── Drawer shell  (the <aside class="sidebar app-drawer">) ──────────── */
  /* Matched at three specificity levels so the collapsed-rail rules in
     dashboard.css can never win a property back. */
  .app-drawer,
  .app-drawer.sidebar,
  html.sidebar-collapsed .app-drawer.sidebar {
    position:fixed !important;
    top:0 !important; left:0 !important; right:auto !important; bottom:0 !important;
    z-index:200 !important;
    width:86vw !important; max-width:320px !important; min-width:0 !important;
    height:100% !important; max-height:100% !important;
    margin:0 !important;
    transform:translateX(-100%);
    transition:transform 260ms cubic-bezier(.4,0,.2,1);
    background:var(--m-bg) !important;            /* OPAQUE — never see-through */
    /* Kill any inherited blur from dashboard.css .sidebar. With an opaque bg the
       blur is invisible anyway, but backdrop-filter on a fixed element triggers
       ghosting / double-paint on some mobile webviews — drop it entirely. */
    -webkit-backdrop-filter:none !important; backdrop-filter:none !important;
    border:0 !important;
    border-right:1px solid var(--m-border) !important;
    box-shadow:6px 0 30px rgba(0,0,0,0.5) !important;
    display:flex !important; flex-direction:column !important; flex-wrap:nowrap !important;
    align-items:stretch !important; gap:0 !important;
    padding:0 0 max(16px, env(safe-area-inset-bottom, 0px)) !important;
    overflow-x:hidden !important; overflow-y:auto !important;
    -webkit-overflow-scrolling:touch; overscroll-behavior:contain;
    animation:none !important;                    /* kill desktop .sidebar fade-in */
  }
  body.drawer-open .app-drawer,
  body.drawer-open .app-drawer.sidebar { transform:translateX(0) !important; }

  /* ── Logo header ────────────────────────────────────────────────────── */
  .app-drawer .sidebar-logo {
    display:flex !important; align-items:center; gap:11px;
    padding:18px 20px !important; margin:0 !important;
    border-bottom:1px solid var(--m-border) !important;
    flex-shrink:0 !important;
  }
  .app-drawer .logo-text { display:block !important; }
  .app-drawer .logo-name { color:var(--m-text-1) !important; }
  .app-drawer .sidebar-toggle { display:none !important; }   /* desktop collapse tab */

  /* ── Section labels + dividers ──────────────────────────────────────── */
  .app-drawer .sidebar-group-label {
    display:block !important;
    padding:14px 20px 6px !important; margin:0 !important;
    font-size:11px !important; letter-spacing:1.4px !important; text-transform:uppercase;
    color:var(--m-text-3) !important;
  }
  .app-drawer .sidebar-divider {
    display:block !important;
    border:0 !important; border-top:1px solid var(--m-border) !important;
    margin:8px 0 !important;
  }

  /* ── Nav ────────────────────────────────────────────────────────────── */
  .app-drawer .sidebar-nav {
    display:flex !important; flex-direction:column !important;
    gap:2px !important; padding:4px 10px !important;
    flex-shrink:0 !important;
  }
  .app-drawer .nav-item {
    position:relative !important;
    display:flex !important; align-items:center !important; justify-content:flex-start !important;
    gap:11px !important;
    width:100% !important; box-sizing:border-box !important;
    padding:11px 12px !important; margin:0 !important;
    border-radius:10px !important;
    font-size:14px !important; font-weight:500 !important; line-height:1.2 !important;
    white-space:nowrap !important; overflow:hidden !important; text-overflow:ellipsis !important;
    color:var(--m-text-2) !important;
    -webkit-tap-highlight-color:transparent;
      min-height:var(--tap,44px) !important;   /* alvo de toque HANDOFF §2 */
}
  .app-drawer .nav-item:hover { background:var(--m-hover) !important; color:var(--m-text-1) !important; }
  .app-drawer .nav-item .nav-icon {
    width:17px !important; height:17px !important; margin:0 !important; flex-shrink:0 !important;
  }
  .app-drawer .nav-item::after { display:none !important; }   /* no collapse tooltip */

  /* Active state — opaque-safe gradient pill + indicator bar pinned INSIDE.
     The `html.sidebar-collapsed …` twins are REQUIRED: dashboard.css paints its
     own active treatment for the collapsed desktop rail (a brand tint plus a
     ring) at a higher specificity (0,3,1) than `.app-drawer .nav-item.active`
     (0,3,0). If the collapsed class is left on <html> (it persists from
     desktop), that rail treatment wins inside the drawer and overrides the
     drawer's own pill and left indicator bar. Matching
     `html.sidebar-collapsed .app-drawer …` (0,4,1) reclaims the drawer pill +
     a visible icon on every device. */
  .app-drawer .nav-item.active,
  html.sidebar-collapsed .app-drawer .nav-item.active {
    background:linear-gradient(135deg, rgba(var(--m-brand-rgb),0.24), rgba(var(--m-brand-rgb),0.07)) !important;
    box-shadow:none !important;
    color:var(--m-text-1) !important;
  }
  .app-drawer .nav-item.active::before,
  html.sidebar-collapsed .app-drawer .nav-item.active::before {
    content:'' !important; display:block !important;
    position:absolute !important; left:0 !important; right:auto !important; top:50% !important;
    width:3px !important; height:18px !important; margin-top:-9px !important;
    background:var(--m-brand) !important; border-radius:0 2px 2px 0 !important;
  }
  .app-drawer .nav-item.active .nav-icon,
  html.sidebar-collapsed .app-drawer .nav-item.active .nav-icon {
    color:var(--m-brand) !important;          /* stays visible on the dark pill */
  }

  /* EDITORIAL (escuro) — item activo em grafite, como no resto do produto;
     o indicador lateral e a tinta lavanda eram do skin antigo. */
  :root:not([data-theme="light"]) .app-drawer .nav-item.active,
  html.sidebar-collapsed:not([data-theme="light"]) .app-drawer .nav-item.active {
    background:var(--active-grad, linear-gradient(180deg, #3c3c48, #26262e)) !important;
    box-shadow:var(--active-shadow, none) !important;
    color:var(--active-fg, #f5f5f8) !important;
  }
  :root:not([data-theme="light"]) .app-drawer .nav-item.active::before,
  html.sidebar-collapsed:not([data-theme="light"]) .app-drawer .nav-item.active::before {
    content:none !important;
  }
  :root:not([data-theme="light"]) .app-drawer .nav-item.active .nav-icon,
  html.sidebar-collapsed:not([data-theme="light"]) .app-drawer .nav-item.active .nav-icon {
    color:currentColor !important;
  }

  /* EDITORIAL (light) — o item activo é a pastilha quase-preta, tal como no
     desktop; o indicador lateral deixa de fazer sentido sobre ela. */
  [data-theme="light"] .app-drawer .nav-item.active,
  html.sidebar-collapsed[data-theme="light"] .app-drawer .nav-item.active {
    background:var(--active-grad) !important;
    box-shadow:var(--active-shadow) !important;
    color:var(--active-fg) !important;
  }
  [data-theme="light"] .app-drawer .nav-item.active::before,
  html.sidebar-collapsed[data-theme="light"] .app-drawer .nav-item.active::before {
    content:none !important;
  }
  [data-theme="light"] .app-drawer .nav-item.active .nav-icon,
  html.sidebar-collapsed[data-theme="light"] .app-drawer .nav-item.active .nav-icon {
    color:currentColor !important;
  }

  /* Live dot */
  .app-drawer .nav-live-dot { display:block !important; margin-left:auto !important; flex-shrink:0 !important; }
  .app-drawer .live-label   { display:inline !important; }
  .app-drawer .live-dot::after { display:block !important; }

  /* ── Account picker ─────────────────────────────────────────────────── */
  html.sidebar-collapsed .app-drawer .account-area,
  .app-drawer .account-area { display:block !important; padding:0 14px !important; }
  .app-drawer .account-select,
  .app-drawer .acct-pick-wrap {
    display:block !important;
    width:100% !important; max-width:100% !important; box-sizing:border-box !important;
    margin:6px 0 !important; min-width:0 !important;
  }

  /* ── PDF report section ─────────────────────────────────────────────── */
  .app-drawer .pdf-section { display:block !important; padding:0 14px !important; }
  .app-drawer .pdf-section .date-input,
  .app-drawer .pdf-section input,
  .app-drawer .pdf-section button {
    width:100% !important; max-width:100% !important; box-sizing:border-box !important;
  }

  /* ── Tips / hints / footer ──────────────────────────────────────────── */
  .app-drawer .sidebar-tip   { display:block !important; }
  .app-drawer .shortcut-hint { display:inline !important; }
  .app-drawer .sidebar-footer {
    margin:auto 0 0 !important; padding:12px 20px !important;
    justify-content:flex-start !important;
  }

  /* Un-hide everything the collapsed-rail rules try to hide inside the drawer */
  html.sidebar-collapsed .app-drawer .logo-text,
  html.sidebar-collapsed .app-drawer .sidebar-group-label,
  html.sidebar-collapsed .app-drawer .sidebar-divider,
  html.sidebar-collapsed .app-drawer .pdf-section,
  html.sidebar-collapsed .app-drawer .account-select,
  html.sidebar-collapsed .app-drawer .account-area,
  html.sidebar-collapsed .app-drawer .sidebar-tip,
  html.sidebar-collapsed .app-drawer .live-label,
  html.sidebar-collapsed .app-drawer .shortcut-hint { display:revert !important; }
}

/* ── Stat card ── */
/* A borda do cartão é --border-card (0.075), não --border-glass (0.10): a régua
   que separa conteúdo é mais forte que o contorno do próprio cartão. */
.stat-card { background:var(--glass-1); border:1px solid var(--border-card);
  border-radius:var(--radius); padding:var(--space-5);
  box-shadow:var(--elev-1); }
.stat-card__label { font-size:var(--fs-xs); letter-spacing:1.5px; text-transform:uppercase;
  color:var(--text-3); font-weight:700; }
.stat-card__value { font-size:var(--fs-2xl); font-weight:800; line-height:1.05;
  font-variant-numeric:tabular-nums; color:var(--text-1); }
.stat-card__value.is-profit { color:var(--profit); }
.stat-card__value.is-loss { color:var(--loss); }

/* ── Buttons ── */
.btn { display:inline-flex; align-items:center; justify-content:center; gap:var(--space-2);
  font-weight:700; font-size:var(--fs-sm); border-radius:var(--radius-sm);
  padding:10px 16px; min-height:40px; border:1px solid transparent; cursor:pointer;
  transition:filter var(--dur-fast) var(--ease); }
.btn:hover { filter:brightness(1.08); }
.btn--primary { background:var(--cta-grad); color:var(--cta-fg); box-shadow:var(--cta-shadow); }
.btn--secondary { background:transparent; border-color:var(--border-glass-2); color:var(--text-1); }
.btn--ghost { background:var(--overlay-low); color:var(--text-2); }
@media (max-width:639.98px){ .btn { width:100%; min-height:44px; } }

/* ── Inputs / selects ── */
.field { width:100%; background:var(--overlay-low); color:var(--text-1);
  border:1px solid var(--border-glass); border-radius:var(--radius-sm);
  padding:10px 12px; min-height:40px; }
.field:focus-visible { outline:2px solid var(--brand); outline-offset:1px; }
[data-theme="light"] .field { color-scheme:light; }

/* ── Table: horizontal-scroll wrapper (tablet/desktop) ── */
.table-scroll { width:100%; overflow-x:auto; -webkit-overflow-scrolling:touch; }
.table-scroll table { width:100%; border-collapse:collapse; }
/* Um cabeçalho sticky tem de TAPAR as linhas que passam por baixo. Estava em
   --overlay-subtle (rgba(255,255,255,0.022) no escuro) — 97,8% transparente,
   ou seja, as linhas atravessavam-no em scroll. --card-flat é a cor sólida do
   degrau do cartão, que é onde estas tabelas assentam. */
.table-scroll th { position:sticky; top:0; background:var(--card-flat);
  font-size:var(--fs-xs); letter-spacing:1px; text-transform:uppercase; color:var(--text-3);
  text-align:left; padding:10px 12px; white-space:nowrap; }
.table-scroll td { padding:10px 12px; border-top:1px solid var(--border-glass);
  white-space:nowrap; font-variant-numeric:tabular-nums; }

/* ── Mobile: stacked cards (apply class .table-cards-mobile to a table) ── */
@media (max-width:639.98px){
  .table-cards-mobile thead { display:none; }
  .table-cards-mobile tr { display:block; margin-bottom:var(--space-3);
    border:1px solid var(--border-glass); border-radius:var(--radius-sm);
    background:var(--glass-1); padding:var(--space-2) var(--space-3); }
  .table-cards-mobile td { display:flex; justify-content:space-between; gap:var(--space-4);
    border:0; padding:6px 0; white-space:normal; }
  .table-cards-mobile td::before { content:attr(data-label); color:var(--text-3);
    font-size:var(--fs-xs); letter-spacing:.5px; text-transform:uppercase; font-weight:700; }
}

/* ── Dialog: centered desktop, bottom-sheet on mobile ── */
dialog.sheet { border:0; padding:0; background:transparent; }
dialog.sheet::backdrop { background:rgba(0,0,0,.55); }
dialog.sheet .sheet__body { background:var(--glass-1); color:var(--text-1);
  border:1px solid var(--border-glass); border-radius:var(--radius);
  padding:var(--space-6); width:min(92vw,440px); }
@media (max-width:639.98px){
  dialog.sheet { margin:auto auto 0; }
  dialog.sheet .sheet__body { width:100vw; border-radius:var(--radius-lg) var(--radius-lg) 0 0; }
}

/* ── Tabs (scrollable on mobile) ── */
.tabs { display:flex; gap:var(--space-2); overflow-x:auto; scroll-snap-type:x proximity;
  border-bottom:1px solid var(--border-glass); }
.tabs .tab { scroll-snap-align:start; white-space:nowrap; padding:10px 14px;
  color:var(--text-2); font-weight:700; font-size:var(--fs-sm); border-bottom:2px solid transparent; }
.tabs .tab.is-active { color:var(--text-1); border-bottom-color:var(--brand); }

/* ── Toast ── */
.toast { position:fixed; z-index:var(--z-toast); left:50%; bottom:24px; transform:translateX(-50%);
  background:var(--glass-1); border:1px solid var(--border-glass); border-radius:var(--radius-sm);
  padding:12px 16px; box-shadow:0 8px 32px var(--shadow-strong); }

/* ── Effects polish (Cobalt Frost) — shared components, all pages ───────── */
.stat-card { transition: box-shadow var(--dur) var(--ease), transform var(--dur) var(--ease), border-color var(--dur) var(--ease); }
.stat-card:hover { transform: translateY(-2px); box-shadow: var(--elev-2); border-color: var(--border-glass-2); }
.btn--primary { box-shadow: var(--glow-brand); }
.btn--primary:hover { box-shadow: var(--glow-brand), var(--elev-1); }
.field:focus-visible { box-shadow: var(--ring); }

/* ════════════════════════════════════════════════════════════════════════
   TOGGLE — componente partilhado (MT5 · AUTO  e  Settings · 2 MIN RULE).
   Escrito UMA vez; as duas páginas usam-no. HANDOFF §4.

   Valores lidos de MT5 Accounts Editorial.dc.html:185 (ligado):
     width:34px;height:19px;border-radius:999px;padding:2px;
     background:linear-gradient(180deg,#3ABE84,#10744E);
     justify-content:flex-end;box-shadow:inset 0 1px 2px rgba(0,0,0,0.18)
   e :261 (desligado):
     background:#E4E4EC;justify-content:flex-start;
     box-shadow:inset 0 1px 2px rgba(0,0,0,0.06)
   knob (em ambos):
     width:15px;height:15px;border-radius:50%;background:#FFFFFF;
     box-shadow:0 1px 2px rgba(20,20,40,0.35)
   ════════════════════════════════════════════════════════════════════════ */
.ed-toggle {
  display: inline-flex; align-items: center;
  width: 34px; height: 19px;
  border-radius: 999px; padding: 2px;
  border: 0; cursor: pointer;
  justify-content: flex-start;
  background: var(--toggle-off);
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.06);
  transition: background .18s var(--ease), justify-content .18s var(--ease);
}
.ed-toggle::after {
  content: '';
  width: 15px; height: 15px;
  border-radius: 50%;
  background: var(--toggle-knob);
  box-shadow: var(--toggle-knob-shadow);
  transition: transform .18s var(--ease);
}
.ed-toggle[aria-checked="true"] {
  background: var(--toggle-on);
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.18);
}
.ed-toggle[aria-checked="true"]::after { transform: translateX(15px); }
.ed-toggle:focus-visible { outline: none; box-shadow: var(--ring); }
.ed-toggle:disabled { opacity: .45; cursor: not-allowed; }
/* Aqui existia `:root:not([data-theme="light"]) .ed-toggle { background: … }`.
   Especificidade (0,3,0) contra os (0,2,0) de .ed-toggle[aria-checked="true"]:
   ganhava sempre, e a ordem no ficheiro não tinha voto nenhum. No escuro um
   interruptor LIGADO saía cinzento — o AUTO do MT5 mentia sobre o próprio
   estado. Os quatro valores são agora tokens por tema, sem override nenhum,
   por isso o estado volta a ser quem decide a cor. */

/* ════════════════════════════════════════════════════════════════════════
   GRELHA DE KPIs COM RÉGUAS — componente partilhado. HANDOFF §5.
   O mesmo padrão em quatro sítios; escrito UMA vez:
     MT5 Accounts Editorial.dc.html:156   repeat(3,minmax(min-content,1fr))
     Open Positions Editorial.dc.html:186 repeat(3,minmax(min-content,1fr))
     Rebates Editorial.dc.html:192        repeat(4,…) + border-top
     Slippage Editorial.dc.html:181       repeat(4,…)
   Célula: padding:26px 26px; border-right:1px solid #ECECF1 (nenhuma na última)
   Rótulo: font-size:9.5px;font-weight:700;letter-spacing:0.14em;color:#6E6E80;
           margin-bottom:11px
   Valor : clamp(24px,2.6vw,38px)  ·  variante -sm: clamp(21px,2.1vw,30px)

   minmax(min-content,1fr) — nunca 1fr seco. Foi a causa nº1 de transbordos:
   com 1fr a coluna encolhe abaixo do número e o valor sai da célula.
   ════════════════════════════════════════════════════════════════════════ */
.ed-kpis {
  display: grid;
  grid-template-columns: repeat(var(--kpi-cols, 3), minmax(min-content, 1fr));
  border-bottom: 1px solid var(--border-glass);
}
.ed-kpis--ruled-top { border-top: 1px solid var(--border-glass); }
.ed-kpi {
  padding: 26px 26px;
  border-right: 1px solid var(--border-glass);
  min-width: 0;
}
.ed-kpi:last-child { border-right: none; }
.ed-kpi-label {
  font-size: var(--fs-micro, 9.5px);
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--text-3);
  margin-bottom: 11px;
}
.ed-kpi-value {
  font-size: var(--fs-metric, clamp(24px, 2.6vw, 38px));
  font-weight: 600;
  letter-spacing: -0.025em;
  white-space: nowrap;
  color: var(--text-1);
  font-variant-numeric: tabular-nums;
}
.ed-kpis--sm .ed-kpi-value { font-size: var(--fs-metric-sm, clamp(21px, 2.1vw, 30px)); }
.ed-kpi-value.is-up   { color: var(--profit); }
.ed-kpi-value.is-down { color: var(--loss); }
.ed-kpi-value.is-fee  { color: var(--rebate-yellow); }
.ed-kpi-sub { font-size: 12.5px; color: var(--text-3); margin-top: 9px; }

/* Telemóvel: 2 colunas e as réguas passam a horizontais (HANDOFF §9). */
@media (max-width: 639.98px) {
  .ed-kpis { grid-template-columns: repeat(2, minmax(min-content, 1fr)); }
  .ed-kpi { padding: 18px 16px; }
  .ed-kpi:nth-child(2n) { border-right: none; }
  .ed-kpi:not(:nth-last-child(-n+2)) { border-bottom: 1px solid var(--border-glass); }
}
