/* SMX IQ MVP - Color+Defects prototype
   Tokens: Amethyst Foundations (GitLab amethyst-mobile ref=main):
     packages/foundations/src/primitives.ts, cornerRadius.ts, spacing.ts
   Medidas de componente: Paper "SMX IQ MVP - WIP"
     listas 1S88-0 / 1LPP-0 / 1XRD-0, filters open state 1KJ4-0 / 1KHO-0 / 18R6-2,
     date range calendar 27JI-2, defect detail side bar 8CU-1.
   Iconografía: packages/native-icons (icons.js). */

:root{
  /* primitives */
  --prim-0:#ffffff; --prim-25:#fcfcfc; --prim-50:#fafafa; --prim-100:#f4f4f5; --prim-200:#e4e4e7;
  --prim-300:#d1d1d6; --prim-400:#a0a0ab; --prim-500:#70707b; --prim-600:#51525c;
  --prim-700:#3f3f46; --prim-800:#26272b; --prim-900:#18181b;
  --p-25:#fbf9ff; --p-50:#f7f2ff; --p-100:#f0e5ff; --p-200:#e2ccff; --p-300:#caabfc;
  --p-400:#a37cf7; --p-500:#885fec; --p-600:#683fd3; --p-700:#522cbd; --p-800:#3f278f; --p-900:#31226b;
  --magic-25:#f6f2ff; --magic-50:#ede4ff; --magic-100:#dfcfff; --magic-200:#bf9eff;
  --magic-300:#8e56ff; --magic-400:#6e25ff; --magic-500:#5e0dff; --magic-600:#5100f1;
  --magic-700:#3f00bc; --magic-800:#24006b; --magic-900:#120036;
  --s-25:#f6fef9; --s-50:#ecfdf3; --s-100:#d1fadf; --s-300:#85e9b3; --s-500:#2ab775; --s-600:#039855; --s-700:#027a48; --s-800:#05603a;
  --w-25:#fffcf5; --w-50:#fffaeb; --w-100:#fef0c7; --w-200:#fedf89; --w-500:#f79009; --w-600:#dc6803; --w-700:#b54708; --w-800:#93370d;
  --crit-50:#fef3f2; --crit-100:#fee4e2; --crit-500:#f04438; --crit-600:#d92d20;
  --info-50:#eff4ff; --info-500:#2970ff; --info-600:#155eef;
  --acc1-500:#15b79e; --acc2-500:#06aed4;
  --sage:#68a384;

  /* surface */
  --app-bg:#ffffff;
  --card:#ffffff;
  --bg-muted:#f4f4f5;           /* = primitive-neutral-100 */
  --border:#e4e4e7;             /* = primitive-neutral-200 */
  --border-strong:#d1d1d6;
  --text:#18181b;               /* neutral-900 */
  --text-2:#51525c;             /* neutral-600 */
  --text-3:#70707b;             /* neutral-500 */
  --text-4:#a3a3a3;
  --text-inverse:#ffffff;

  /* roles */
  --brand:#683fd3;              /* primary-600, a marca */
  --brand-hover:#522cbd;        /* primary-700 */
  --active-pill:#f0e5ff;        /* primary-100 */
  --passed-bg:#ecfdf3; --passed-text:#027a48;   /* success-50 / 700 */
  --caution-bg:#fef0c7; --caution-text:#93370d; /* warning-100 / 800 */
  --proceed-bg:#ecfdf3; --proceed-text:#027a48;

  /* radii (cornerRadius.ts): sm 4, md 8, lg 12, pill 200 */
  --radius-sm:4px;
  --radius-md:8px;
  --radius-lg:12px;
  --radius-card:12px;
  --radius-pill:200px;
  --radius-btn:8px;

  --shadow-card:0 1px 3px rgba(24,24,27,.08);
  --shadow-menu:0 8px 16px #1018281a;
  --shadow-drawer:-8px 0 32px rgba(16,24,40,.16);
  --shadow-cal:0 2px 4px -1px #00000033,0 4px 5px #00000024,0 1px 10px #0000001f;
}
*{margin:0;padding:0;box-sizing:border-box}
html,body{height:100%}
body{font-family:'Inter',sans-serif;font-size:.875rem;color:var(--text);background:var(--app-bg);-webkit-font-smoothing:antialiased}
::selection{background:var(--p-100)}
button,input,select,textarea{font-family:inherit;color:inherit}
svg{display:block}

/* ===== App shell ===== */
#app{display:grid;grid-template-columns:242px 1fr;grid-template-rows:64px minmax(0,1fr);height:100vh;overflow:hidden}

/* Sidebar: 242, py-16, gap-16, border-right neutral-200. Os itens medem 240 de
   largura com paddingInline 8; o pill (radius 8) vive no Content (224x40). */
#sidebar{grid-row:1 / -1;background:var(--prim-0);border-right:1px solid var(--prim-200);display:flex;flex-direction:column;padding:16px 0;gap:16px;position:relative}
#sidebar .brand{padding:8px 0 0 16px;display:flex;align-items:center}
#sidebar .brand img{width:132.26px;height:16px;display:block}
#sidebar nav{display:flex;flex-direction:column;align-items:flex-start;width:100%}
.nav-head{display:flex;align-items:center;height:40px;padding:4px 16px;font-size:12px;line-height:16px;font-weight:500;color:var(--prim-600)}
.nav-item{display:flex;align-items:center;height:40px;width:240px;flex:0 0 40px;padding:0 8px;border:0;background:none;cursor:pointer;text-align:left}
.nav-item .nav-content{display:flex;align-items:center;gap:8px;width:100%;height:40px;padding:8px 12px;border-radius:8px;
  font-size:14px;line-height:20px;font-weight:500;color:var(--prim-900)}
.nav-item .ico{width:16px;height:16px;flex:0 0 16px;display:grid;place-items:center;color:var(--prim-800)}
.nav-item:hover .nav-content{background:var(--prim-100)}
.nav-item.active .nav-content{background:var(--p-100)}
#sidebar .spacer{flex:1}
/* Button Icon 31x31, absolute left 16 bottom 16, bg neutral-25, radius 100px */
#sidebar .foot{display:flex;align-items:center;justify-content:center;width:31px;height:31px;border-radius:100px;background:var(--prim-25);
  position:absolute;left:16px;bottom:16px;color:var(--prim-600)}
#sidebar .foot:hover{background:var(--prim-100)}

/* Topbar: 64, paddingInline 16, bg neutral-25, border-bottom neutral-200.
   Crumb: botão home 38x38 (fill #3F484A) + chevron 10x10 + label 14/28 semibold #5E0DFF. */
#topbar{grid-column:2;display:flex;align-items:center;height:64px;padding:0 16px;background:var(--prim-25);border-bottom:1px solid var(--border)}
#topbar .crumb{display:flex;align-items:center;gap:0}
#topbar .crumb .home{width:38px;height:38px;margin:0 2px 0 0;display:grid;place-items:center;border-radius:8px;color:#000;background:none;border:0;cursor:pointer}
#topbar .crumb .chev{display:inline-flex;width:10px;height:10px;color:#000}
#topbar .crumb .lbl{margin:0 8px;font-size:14px;line-height:28px;color:var(--prim-600);text-decoration:none;cursor:pointer}
/* Por decisao do Diogo (19 Set): o que e clicavel fica no roxo da marca (primary-600) e a
   pagina actual em neutral-600. Ao contrario do Paper (1SHL-0), que tem o inverso. */
#topbar .crumb a.lbl{color:var(--p-600);font-weight:600;text-decoration:none;cursor:pointer}
#topbar .right{margin-left:auto;display:flex;align-items:center;gap:4px}
#topbar .globe{width:38px;height:38px;display:grid;place-items:center;color:#3f484a;cursor:pointer;border-radius:8px}
#topbar .avatar{width:32px;height:32px;border-radius:200px;background:var(--prim-100);display:grid;place-items:center;
  font-weight:400;font-size:14px;line-height:18px;color:#3f484a;letter-spacing:1.2px}

/* Content: p-24, gap-40 entre bloques (Paper). Em baixo ha mais margem para a pagina nao
   acabar colada a tabela. */
#main{grid-column:2;grid-row:2;overflow:auto;padding:24px 24px 72px;display:flex;flex-direction:column;gap:40px}
/* Os filhos não podem encolher: sem isto, a coluna flex comprime a tabela quando o conteúdo
   não cabe e o #main nunca rola até ela (era o que fazia o tab Batch parecer vazio). */
#main>*{margin:0;flex:0 0 auto}
.metric-rows{display:flex;flex-direction:column;gap:16px}

/* ===== Page head: back 48x48 radius 200 border neutral-300, titulo 26/34 600 ===== */
.page-head{display:flex;align-items:center;gap:16px}
.page-head .back{width:48px;height:48px;border:1px solid var(--prim-300);border-radius:200px;background:var(--prim-0);cursor:pointer;display:grid;place-items:center;color:var(--prim-900)}
.page-head h1{font-size:26px;line-height:34px;font-weight:600;color:var(--text)}

/* ===== Buttons ===== */
.btn{display:inline-flex;align-items:center;gap:8px;height:40px;padding:0 20px;border-radius:200px;border:1px solid transparent;font-size:14px;font-weight:500;cursor:pointer;background:none;color:var(--text)}
.btn-primary{background:var(--brand);color:#fff}
.btn-primary:hover{background:var(--brand-hover)}
/* "Download Report" do caseHeader (Paper 1SJE-0): 200x64, padding 12/16, gap 16, 16px */
.btn-report{width:200px;height:64px;flex:0 0 200px;justify-content:center;gap:16px;padding:12px 16px;border:1px solid var(--brand);
  font-size:16px;line-height:20px;font-weight:500;background:var(--brand);color:var(--text-inverse)}
.btn-report:hover{background:var(--brand-hover);border-color:var(--brand-hover)}

/* ===== Toolbar + segmented de datas (48 alto, activo primary-600) ===== */
.toolbar{display:flex;align-items:center;justify-content:space-between;height:48px}
.seg{display:inline-flex;align-items:stretch}
.seg .seg-b{display:inline-flex;align-items:center;justify-content:center;gap:8px;height:48px;min-width:112px;padding:12px 16px;
  border:1px solid var(--prim-200);border-left:0;border-right:0;background:var(--prim-25);color:var(--prim-900);
  font-size:16px;line-height:20px;font-weight:500;cursor:pointer}
.seg .seg-b:first-child{border-left:1px solid var(--prim-200);border-radius:200px 0 0 200px}
.seg .seg-b.last{border-right:1px solid var(--prim-200);border-radius:0 200px 200px 0}
.seg .seg-b.active{background:var(--brand);border-color:var(--brand);color:#fff}
.seg .seg-b.active .cal{color:#fff}
.seg .cal{display:inline-flex;align-items:center;color:var(--prim-600)}
.seg .seg-b:hover:not(.active){background:var(--prim-100)}

.btn-filters{display:inline-flex;align-items:center;gap:8px;height:48px;padding:12px 16px;border-radius:200px;cursor:pointer;
  background:var(--prim-25);border:1px solid var(--prim-200);color:var(--prim-900);font-size:16px;line-height:20px;font-weight:500}
.btn-filters svg{color:var(--prim-800)}
.btn-filters:hover{background:var(--prim-100)}
.btn-filters.on{background:var(--prim-0);border-color:var(--brand);color:var(--brand)}
.btn-filters.on svg{color:var(--brand)}

/* ===== Filter bar (Paper 1KJ4-0 / 1KHO-0 / 18R6-2) ===== */
.filterbar{display:none;align-items:flex-start;gap:16px;padding:16px;border-radius:12px;background:var(--prim-50);border:1px solid var(--prim-200)}
.filterbar.open{display:flex}
.f-field{position:relative;display:flex;flex-direction:column;gap:6px;flex:1 1 0;min-width:0}
.f-lbl{font-size:12px;line-height:18px;font-weight:500;color:var(--prim-600)}
.f-ctl{display:flex;align-items:center;justify-content:space-between;gap:8px;height:40px;padding:0 12px;border-radius:8px;background:#fff;border:1px solid var(--prim-300);cursor:pointer}
.f-field.open .f-ctl{outline:2px solid var(--magic-300);outline-offset:-2px;border-color:transparent}
.f-val{flex:1;font-size:14px;line-height:20px;font-weight:500;color:var(--prim-900);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.f-chev{display:inline-flex;color:var(--prim-500)}
.f-input{height:40px;padding:0 12px;border-radius:8px;background:#fff;border:1px solid var(--prim-300);font-size:14px;color:var(--prim-900);width:100%}
.f-input:focus{outline:2px solid var(--magic-300);outline-offset:-2px;border-color:transparent}
.f-input::placeholder{color:var(--prim-400)}
.f-menu{position:absolute;z-index:30;top:calc(100% + 6px);left:0;width:361px;max-height:190px;overflow:auto;padding:4px;
  border-radius:8px;background:#fff;border:1px solid var(--prim-200);box-shadow:var(--shadow-menu)}
.fd-item{display:flex;align-items:center;height:36px;padding:0 12px;border-radius:6px;font-size:14px;line-height:20px;color:var(--prim-900);cursor:pointer;white-space:nowrap}
.fd-item:hover{background:var(--prim-100)}
.fd-item.on{background:var(--p-100);color:var(--brand);font-weight:600}

/* ===== Date range calendar (Paper 27JI-2) =====
   Abre como popover ancorado ao botão Custom (como no FACT), por baixo dele:
   o anchor é o wrapper do botão e o painel sai do fluxo, por cima do conteúdo. */
.custom-anchor{position:relative;display:inline-flex}
.cal-wrap{position:absolute;top:calc(100% + 8px);left:0;z-index:40}
.cal-panel{width:296px;height:402px;display:flex;flex-direction:column;border-radius:16px;overflow:hidden;background:#fff;box-shadow:var(--shadow-cal)}
.cal-head{height:62px;flex:0 0 62px;display:flex;align-items:center;justify-content:space-between;padding:0 8px}
.cal-period{height:40px;display:inline-flex;align-items:center;gap:4px;padding:0 8px;border:0;background:none;cursor:pointer;
  font-size:14px;line-height:20px;font-weight:700;color:var(--text-2)}
.cal-caret{width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid var(--text-2)}
.cal-nav{display:flex;align-items:center}
.cal-arrow{width:40px;height:40px;display:grid;place-items:center;border:0;background:none;color:var(--text-2);cursor:pointer}
.cal-arrow:disabled{color:var(--prim-300);cursor:default}
.cal-wd{display:flex;align-items:center;height:25px;flex:0 0 25px;padding:0 8px;border-bottom:1px solid var(--border);color:var(--text-2)}
.cal-wd div{width:40px;display:flex;align-items:center;justify-content:center;font-size:14px;line-height:20px}
.cal-grid{display:grid;grid-template-columns:repeat(7,40px);padding:0 8px;flex:1;align-content:start}
.cal-grid.years,.cal-grid.months{grid-template-columns:repeat(3,1fr);gap:4px;padding:8px;align-content:center}
.cal-c{width:40px;height:40px;display:flex;align-items:center;justify-content:center}
.cal-c.band{background:var(--bg-muted)}
.cal-c.band-start{background:var(--bg-muted);border-radius:999px 0 0 999px}
.cal-c.band-end{background:var(--bg-muted);border-radius:0 999px 999px 0}
.cal-c.today .cal-pill{background:var(--bg-muted)}
.cal-c.off .cal-pill{color:var(--prim-300)}
.cal-c:not(.off):hover .cal-pill{background:var(--bg-muted)}
.cal-pill{width:36px;height:36px;display:flex;align-items:center;justify-content:center;border-radius:999px;
  font-size:14px;line-height:20px;font-weight:400;color:var(--text);cursor:pointer}
.cal-pill.sel{background:var(--magic-400);color:var(--text-inverse)}
.cal-y,.cal-m{height:56px;border:0;border-radius:8px;background:none;font-size:14px;font-weight:500;color:var(--text);cursor:pointer}
.cal-y:hover,.cal-m:hover{background:var(--prim-100)}
.cal-y.on,.cal-m.on{background:var(--p-100);color:var(--brand)}
.cal-actions{height:48px;flex:0 0 48px;display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:0 8px 8px}
.cal-cancel,.cal-apply{height:40px;display:inline-flex;align-items:center;justify-content:center;padding:0 12px;border-radius:8px;
  border:0;font-size:16px;line-height:20px;font-weight:500;cursor:pointer}
.cal-cancel{background:none;color:var(--text)}
.cal-cancel:hover{background:var(--prim-100)}
.cal-apply{background:var(--brand);color:var(--text-inverse)}
.cal-apply:hover{background:var(--brand-hover)}

/* ===== Cards (DS Card.tsx: bg surfaceContainerLow=neutral-50, border outlineVariant=neutral-300, radius md=8) ===== */
.card{background:var(--prim-50);border:1px solid var(--prim-300);border-radius:var(--radius-md);padding:16px;display:flex;flex-direction:column;gap:16px}
.card .card-head{display:flex;align-items:center;gap:12px}
.card .card-head h3{font-size:22px;line-height:28px;font-weight:600;color:var(--p-800)}
.chip{width:48px;height:48px;flex:0 0 48px;border-radius:999px;background:#fff;border:1px solid var(--prim-300);display:grid;place-items:center;color:var(--p-800)}

/* ===== Info card ===== */
.info-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:24px}
.info-field{display:flex;flex-direction:column;gap:4px}
.info-field .lbl{font-size:12px;line-height:16px;color:var(--prim-600);font-weight:400}
.info-field .val{font-size:14px;line-height:20px;font-weight:500;color:var(--prim-900);display:flex;align-items:center;gap:8px}
.info-field .swatch{width:12px;height:12px;border-radius:200px;background:var(--sage);flex:0 0 12px}

/* ===== Detail tabs (Paper caseHeader 1SJ4-0 / SegmentedButton 1SJ5-0)
   8px de padding, gap 4, radius 200, bg neutral-100, border neutral-200.
   Tab 48 alto, padding 4/16, radius 200; ativo bg branco + primary-600.
   Batch detail: 4 tabs de 112 fixos. Roll detail: 2 tabs que repartem a largura. ===== */
.detail-bar{display:flex;align-items:center;justify-content:space-between;gap:40px}
.detail-tabs{display:inline-flex;align-items:flex-start;padding:8px;border-radius:200px;background:var(--prim-100);border:1px solid var(--prim-200);gap:4px}
.detail-tabs button{display:inline-flex;align-items:center;justify-content:center;height:48px;padding:4px 16px;border-radius:200px;border:0;background:none;
  font-family:inherit;font-size:16px;line-height:20px;font-weight:500;color:var(--prim-600);cursor:pointer;white-space:nowrap}
.detail-tabs button.active{background:var(--prim-0);color:var(--brand)}
.detail-tabs.tabs-fixed button{width:112px;flex:0 0 112px}
.detail-tabs.tabs-fluid{display:flex;flex:1}
.detail-tabs.tabs-fluid button{flex:1}

/* ===== Metric cards (mesmo tratamento do Card) ===== */
.metrics{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px}
.metric{display:flex;flex-direction:column;gap:16px;padding:16px;background:var(--prim-50);border:1px solid var(--prim-300);border-radius:var(--radius-md)}
.metric .m-label{display:flex;align-items:center;gap:8px;font-size:16px;line-height:20px;font-weight:600;color:var(--p-800)}
.metric .m-label .ico{width:32px;height:32px;flex:0 0 32px;border-radius:999px;background:var(--prim-0);border:1px solid var(--prim-300);display:grid;place-items:center;color:var(--p-800)}
.metric .m-value{font-size:26px;line-height:34px;font-weight:600;color:var(--prim-900)}

/* Roll metrics */
.roll-metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px;align-items:stretch}
.roll-metrics .stack{display:flex;flex-direction:column;gap:16px}
.roll-metrics .stack .metric{padding:12px 16px}
.roll-metrics .stack .metric .m-value{font-size:20px;line-height:28px}
/* Cards Grade / Consistency / Conformity (Paper 210N-0): 260x268, conteudo ao centro,
   badge 64x64, titulo 22/28 600 primary-800, apoio 14/18 neutral-700. */
.roll-metrics .eval{background:var(--prim-50);border:1px solid var(--prim-300);border-radius:var(--radius-md);
  display:flex;flex-direction:column;align-items:center;justify-content:center;padding:16px;gap:16px}
.roll-metrics .eval .badge{width:64px;height:64px;flex:0 0 64px;border-radius:200px;display:grid;place-items:center;
  font-size:26px;line-height:32px;font-weight:500}
.roll-metrics .eval .e-title{font-size:22px;line-height:28px;font-weight:600;color:var(--p-800)}
.roll-metrics .eval .e-sub{font-size:14px;line-height:18px;text-align:center;color:var(--prim-700)}

/* ===== Pills =====
   Conclusion (Paper 1SAB-0): py-2 px-8, radius 4, 12/16 500, gap 4, icone 12.
     Caution  -> warning-100 / warning-800 (icone #B54708)
     Proceed  -> neutral-100 / neutral-700 (icone neutral-600)
   Metric pills (Defect / Consistency / Conformity): py-2 px-6, 12/18 500.
     Passed   -> neutral-100 / neutral-700
     Caution / Defect > 3% -> warning-100 / warning-800
   (O Paper NAO usa success-50 nestas tabelas: medido no artboard 1S88-0.) */
.pill{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:var(--radius-sm);font-size:12px;line-height:16px;font-weight:500}
.pill.passed{background:var(--prim-100);color:var(--prim-700)}
.pill.proceed{background:var(--prim-100);color:var(--prim-700)}
.pill.caution{background:var(--w-100);color:var(--w-800)}
.pill .glyph{width:12px;height:12px;display:inline-flex}
.pill.metric-pill{padding:2px 6px;line-height:18px;letter-spacing:-.01em}
.pill.metric-pill.passed{background:var(--prim-100);color:var(--prim-700)}
.pill.metric-pill.caution{background:var(--w-100);color:var(--w-800)}
.pill.defect-high{background:var(--w-100);color:var(--w-800);padding:2px 6px;line-height:18px;letter-spacing:-.01em}
.pill.inprog-pill{background:none;padding:0;color:var(--magic-500)}
.badge-shade{width:28px;height:28px;border-radius:8px;background:#fff;border:1px solid var(--border);display:grid;place-items:center;font-weight:700;color:var(--brand);font-size:14px}
/* Shade Group: texto simples, sem badge (Paper 1TR9-0) */
.shade-txt{font-size:12px;line-height:16px;font-weight:500;color:var(--prim-900)}

/* ===== Table (thead 38 neutral-50, rows 72) =====
   Largura da 1a coluna por lista (medida no Paper: PO 192, Batches 146, Rolls 122);
   as restantes repartem o resto em partes iguais, como nos artboards. */
.table-wrap{overflow:auto;background:#fff;border:1px solid var(--prim-200);border-radius:var(--radius-lg)}
/* Layout automatico: as colunas crescem com o conteudo. Com `fixed` as colunas ficavam todas
   iguais e as cabeceiras longas cortavam-se (Length Position, Width Position, Affected Area).
   O handoff pede uma grelha por fraccoes por coluna; isto e o equivalente num <table>, e as
   celulas continuam com nowrap + ellipsis para nao esticar. */
table{width:100%;border-collapse:collapse;font-size:14px;table-layout:auto}
thead th{height:38px;padding:16px;text-align:left;background:var(--prim-50);border-bottom:1px solid var(--prim-200);
  color:#525252;font-size:12px;line-height:16px;font-weight:400;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
thead th:first-child{width:var(--first-w,146px)}
thead th .asc{color:#525252;font-size:12px;margin-left:4px}
thead th.sorted{color:var(--text-2)}
thead th.sorted .asc{color:var(--brand)}
thead th.th-sort{cursor:pointer;user-select:none}
thead th.th-sort:hover{color:var(--text-2)}
tbody td{height:72px;padding:16px;border-bottom:1px solid var(--prim-200);color:var(--text);white-space:nowrap;
  font-weight:500;overflow:hidden;text-overflow:ellipsis}
tbody tr:last-child td{border-bottom:none}
tbody tr{cursor:pointer}
tbody tr:hover{background:var(--prim-50)}
tbody tr.no-rows{cursor:default}
tbody tr.no-rows td{text-align:center;color:var(--text-3);height:auto;padding:32px}
.row-id{display:inline-flex;align-items:center;gap:8px}
.row-id .tile{width:32px;height:32px;padding:8px;border-radius:16px;background:var(--magic-100);display:grid;place-items:center;color:var(--p-800)}
.mono{font-weight:500;color:var(--text)}
.cell-link{color:var(--brand);cursor:pointer}
.cell-link:hover{text-decoration:underline}
.inprog{display:inline-flex;align-items:center;gap:6px;color:var(--magic-500);font-size:14px;line-height:20px;font-weight:500}
.inprog::before{content:"";width:6px;height:6px;border-radius:32px;background:var(--magic-500)}
/* Coluna Date em curso, como no FACT: o texto "In Progress" pisca e por tras dele aparece a data
   de inicio da inspeccao. Nas linhas terminadas a data e a de fim. */
.inprog-date{position:relative;display:inline-block}
.inprog-date .id-at{color:var(--text)}
.inprog-date .id-lbl{position:absolute;inset:0;display:inline-flex;align-items:center;gap:6px;
  background:var(--prim-0);color:var(--magic-500);font-size:14px;line-height:20px;font-weight:500;
  animation:inprog-blink 2.4s ease-in-out infinite}
.inprog-date .id-lbl i{width:6px;height:6px;flex:0 0 6px;border-radius:32px;background:var(--magic-500)}
tbody tr:hover .inprog-date .id-lbl{background:var(--prim-50)}
@keyframes inprog-blink{0%,40%{opacity:1}55%,90%{opacity:0}100%{opacity:1}}
/* Cor do fio na coluna Color (Paper 1LPP-0): 12x12, rounded-50%, gap 4 com o texto */
.dot{display:inline-block;width:12px;height:12px;border-radius:200px;background:var(--brand);margin-right:4px;vertical-align:-1px}
.dot.sage{background:var(--sage)}

/* ===== Pagination (Paper 1SFV-0: h-68, px-24, bg neutral-25) =====
   "1-5" 14/20 500 neutral-700 + "of 10" 14/20 500 #A3A3A3 (gap 4).
   Botões prev/next 38x38 de altura, px-12, radius 8, bg branco, border neutral-200,
   box-shadow #1018280D 0 1px 2px, icone 16. Números 40x40, radius 8, gap 2;
   ativo bg #F6F2FF e texto #5100F1. ===== */
.pager{display:flex;align-items:center;justify-content:space-between;height:68px;padding:0 24px;background:var(--prim-25)}
/* display:block de proposito: com flex, o espaco em branco antes do "of" era eliminado e as
   duas partes ficavam coladas. O Paper usa gap de 4px; o espaco de texto da ~3,5px. */
.pager .info{display:block;font-size:14px;line-height:20px;font-weight:500;color:var(--prim-700)}
.pager .info .of{color:#a3a3a3}
.pager .controls{display:flex;align-items:center;gap:20px}
.pager .pages{display:flex;gap:2px}
.pager .pbtn{height:38px;padding:0 12px;border:1px solid var(--prim-200);border-radius:8px;background:var(--prim-0);cursor:pointer;display:grid;place-items:center;
  color:#525252;box-shadow:0 1px 2px #1018280d}
.pager .pbtn:disabled{color:#d6d6d6;border-color:#d6d6d6;cursor:default}
.pager .page-num{width:40px;height:40px;border:0;background:none;border-radius:8px;cursor:pointer;color:#525252;
  font-size:14px;line-height:18px;font-weight:500;display:grid;place-items:center}
.pager .page-num.active{background:#f6f2ff;color:#5100f1}

/* ===== Analytics cards do PO detail (Paper 1LYS-0): 367x184, donut 100 + legenda ===== */
.analytics{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:24px}
.a-card{display:flex;flex-direction:column;gap:16px;padding:16px;background:var(--prim-50);border:1px solid var(--prim-300);border-radius:var(--radius-md)}
.a-card .a-head{display:flex;align-items:center;gap:8px}
.a-card .a-head .ico{width:32px;height:32px;flex:0 0 32px;border-radius:999px;background:var(--prim-0);border:1px solid var(--prim-300);display:grid;place-items:center;color:var(--p-800)}
.a-card .a-title{font-size:16px;line-height:20px;font-weight:600;color:var(--p-800)}
.a-body{display:flex;align-items:center;justify-content:center;align-self:stretch;gap:16px}
.a-legend{display:flex;flex-direction:column;gap:8px}
.a-leg{display:flex;align-items:center;gap:8px;font-size:14px;line-height:20px;font-weight:500;color:var(--prim-900);white-space:nowrap}
.a-leg .sw{width:10px;height:10px;flex:0 0 10px;border-radius:200px}

/* ===== Color Inspection: estrutura nova (mockup "Roll Scroll", 20 Set 2026) =====
   Substitui o desenho do Paper 275E-0 / 275Z-0. O eixo e o da maquina: o tecido entra em
   cima e desce, por isso o metro mais recente esta no topo e os 0 m em baixo. Cada
   parametro tem uma pista por camara. Uma unica janela rola as quatro colunas, a coluna
   de metros e o vail; o minimapa da direita mostra o rolo inteiro e navega.
   Cores: rampas Amethyst. O mockup pintava o chrome com cinzentos Untitled UI (#EAECF0,
   #98A2B3, #344054, #F1F3F7, #D0D5DD) que nao existem no Amethyst; a traducao esta em
   cada regra. Zero hex novo. */
.ci-card{border-radius:8px;padding:16px;display:flex;flex-direction:column;gap:16px;
  background:var(--prim-50);border:1px solid var(--prim-300);
  box-shadow:1px 0 2px #0000001a,-1px 1px 2px #0000000d}
/* cabecalho: icone em badge redondo + titulo, como no Paper 2ACH-1 */
.ci-head{display:flex;align-items:center;gap:8px}
.ci-head .badge{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;
  border-radius:200px;padding:8px;background:var(--prim-0);border:1px solid var(--prim-300)}
.ci-head h3{font-size:14px;line-height:20px;font-weight:600;color:var(--p-800);margin:0}

/* --- banda de topo: vista / desvios / produzido / modo --- */
.ci-top{display:flex;flex-wrap:wrap;align-items:center;gap:12px;justify-content:space-between;
  padding:0 4px 16px;border-bottom:1px solid var(--prim-200)}
.ci-stat{display:flex;flex-direction:column;gap:4px}
.ci-stat .k{font-size:12px;line-height:16px;font-weight:400;color:var(--prim-600)}
.ci-stat .v{font-size:14px;line-height:20px;font-weight:500;font-variant-numeric:tabular-nums;color:var(--prim-900)}
.ci-sep{width:1px;height:34px;background:var(--prim-200)}
.ci-live{position:relative;display:inline-flex;width:10px;height:10px;flex:0 0 10px}
.ci-live i{position:absolute;inset:0;border-radius:200px;background:var(--s-500);display:block}
.ci-live i:first-child{animation:ciLiveRing 2s cubic-bezier(.2,0,0,1) infinite}
.ci-live i:last-child{position:relative}
@keyframes ciLiveRing{0%{transform:scale(1);opacity:.55}70%,100%{transform:scale(2.6);opacity:0}}
.ci-chip{margin-left:auto;display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;
  color:var(--p-700);background:var(--p-50);border-radius:200px;padding:6px 12px}
.ci-modes{display:flex}
.ci-modes button{font-family:inherit;font-size:14px;line-height:20px;font-weight:500;height:40px;
  min-width:112px;width:112px;padding:0 16px;border:1px solid var(--prim-200);cursor:pointer;
  background:var(--prim-25);color:var(--prim-900);transition:background 140ms cubic-bezier(.2,0,0,1)}
.ci-modes button:first-child{border-radius:200px 0 0 200px}
.ci-modes button:last-child{border-radius:0 200px 200px 0}
.ci-modes button.on{color:var(--prim-0)}

/* --- legenda de severidade --- */
.ci-legend{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding:0 4px 16px;
  border-bottom:1px solid var(--prim-200);background:var(--prim-25)}
.ci-legend .k{font-size:12px;line-height:16px;font-weight:400;color:var(--prim-600)}
.ci-legend .lv{display:inline-flex;align-items:center;gap:6px;font-size:14px;line-height:20px;
  font-weight:500;color:var(--prim-900)}
.ci-legend .lv i{width:20px;border-radius:2px;display:block}
.ci-legend .hint{font-size:12px;line-height:16px;font-weight:400;color:var(--prim-600)}

/* --- faixa fixa REF: uma carta por parametro, com a regua de camaras ---
   Altura 168 fixa (REF_H do handoff): e o que alinha a faixa com a etiqueta "todo o rolo"
   do minimapa, que tem a mesma altura. */
.ci-refband{display:grid;grid-template-columns:repeat(4,minmax(0,1fr)) 64px;gap:12px;
  padding:0 8px 0 0;align-items:end}
.ci-refcard{height:168px;border:1.5px solid var(--prim-200);border-bottom:0;border-radius:4px 4px 0 0;
  background:var(--prim-0);box-sizing:border-box;display:flex;flex-direction:column;overflow:hidden}
/* etiqueta: pilula magic-100 com a pastilha branca "REF" e o nome do metodo; icone a direita */
.ci-refcard .top{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px}
.ci-refcard .top svg{flex:0 0 40px;height:40px;background:var(--prim-100);border-radius:4px}
.ci-refcard .pill{display:inline-flex;align-items:center;gap:4px;padding:4px 8px 4px 4px;
  border-radius:6px;background:var(--magic-100);width:fit-content;min-width:0}
.ci-refcard .pill .ref{display:inline-flex;align-items:center;padding:0 4px;border-radius:4px;
  background:var(--prim-0);font-size:12px;line-height:16px;font-weight:500;color:var(--magic-600)}
.ci-refcard .pill .name{font-size:12px;line-height:16px;font-weight:500;color:var(--magic-600);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* o texto de apoio encosta ao fundo da carta, como no desenho */
.ci-refcard .subwrap{flex:1 1 auto;display:flex;flex-direction:column;justify-content:flex-end;
  min-height:0;padding:0 12px 16px}
.ci-refcard .sub{font-size:12px;line-height:16px;color:var(--prim-700)}
.ci-camstrip{display:grid;border-top:1px solid var(--prim-200)}
.ci-camstrip span{text-align:center;font-size:12px;font-weight:600;padding:6px 0;color:var(--prim-700);
  border-right:1px solid var(--prim-200)}
.ci-camstrip span:last-child{border-right:0}
.ci-camstrip span.is-ref{font-weight:700;color:var(--p-700);background:var(--p-100)}
.ci-camstrip span.is-off{color:var(--prim-400);background:var(--prim-100)}
.ci-refband .meth{font-size:12px;font-weight:600;color:var(--prim-500);line-height:1.3;padding-bottom:6px}

/* --- corpo: colunas + metros, e o minimapa a direita --- */
.ci-main{display:flex;align-items:stretch;padding-top:16px}
.ci-body{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:0}
.ci-cols{display:grid;grid-template-columns:repeat(4,minmax(0,1fr)) 64px;gap:12px;padding-right:8px;
  height:18px;align-items:center}
.ci-cols span{font-size:13px;font-weight:700;color:var(--brand);text-align:center;line-height:18px}
.ci-window{position:relative}
.ci-viewport{position:relative;height:var(--ci-win,560px);overflow:hidden;
  scrollbar-width:none;touch-action:pan-y}
.ci-viewport::-webkit-scrollbar{width:0;height:0}
.ci-lanes{position:relative;display:grid;grid-template-columns:repeat(4,minmax(0,1fr)) 64px;gap:12px;
  padding-right:8px}
.ci-lane{position:relative;background:var(--prim-100);border-radius:4px;overflow:hidden}
.ci-lane .div{position:absolute;top:0;bottom:0;width:1px;background:var(--prim-200)}
/* a camara que nao entra: tracejado diagonal, como no prototipo (repeating-linear-gradient
   a 135 graus, passo 6px). Cores do mockup (#ECEEF2 / #F1F3F7) traduzidas para a rampa neutral. */
.ci-lane .hatch{position:absolute;top:0;bottom:0;
  background:repeating-linear-gradient(135deg,var(--prim-200) 0 6px,var(--prim-100) 6px 12px)}
.ci-lane .refzone{position:absolute;top:0;bottom:0;background:var(--p-50);
  border-right:1.5px dashed var(--brand);box-sizing:border-box}
.ci-lane .refzone.both{border-left:1.5px dashed var(--brand)}
.ci-lane .reffoot{position:absolute;left:0;right:0;bottom:0;height:4px;background:var(--brand)}
.ci-lane .reffoot-lbl{position:absolute;left:6px;bottom:10px;font-size:12px;font-weight:700;
  letter-spacing:.04em;color:var(--brand);white-space:nowrap}
/* eixo 'up': os 0 m passam a ser no topo, por isso a marca da REF muda de borda */
.ci-lane .reffoot.up{bottom:auto;top:0}
.ci-lane .reffoot-lbl.up{bottom:auto;top:10px}
.ci-bar{position:absolute;border-radius:2px;display:block}
.ci-meters{position:relative}
.ci-tick{position:absolute;left:0;right:0;display:flex;align-items:center;gap:6px}
.ci-tick i{height:1px;display:block}
.ci-tick b{font-size:12px;font-weight:400;font-variant-numeric:tabular-nums;color:var(--prim-700)}
.ci-tick.major b{font-weight:600;color:var(--prim-700)}
/* vail do que ainda nao foi produzido: opaco, como no handoff (o que esta por produzir
   nao se ve, so a linha do que ja saiu) */
.ci-vail{position:absolute;left:0;right:0;top:0;background:var(--prim-0);border-bottom:2px dashed var(--prim-300);
  z-index:2;display:flex;align-items:flex-end;justify-content:center;padding-bottom:8px;box-sizing:border-box}
.ci-vail span{font-size:12px;font-weight:600;color:var(--prim-400)}
/* eixo 'up': o vail ancora no fundo e a linha tracejada passa a ser em cima */
.ci-vail.up{top:auto;bottom:0;border-bottom:0;border-top:2px dashed var(--prim-300);
  align-items:flex-start;padding:8px 0 0}
/* etiquetas de borda: o que esta fora do ecra */
.ci-peek{position:absolute;left:0;right:80px;display:flex;justify-content:center;pointer-events:none;
  opacity:0;transition:opacity 200ms cubic-bezier(.2,0,0,1)}
.ci-peek.up{top:0}
.ci-peek.down{bottom:0}
.ci-peek span{font-size:12px;font-weight:600;color:#fff;background:#101828d1;padding:3px 12px;
  font-variant-numeric:tabular-nums;animation:ciPulseEdge 2.4s cubic-bezier(.2,0,0,1) infinite}
.ci-peek.up span{border-radius:0 0 8px 8px}
.ci-peek.down span{border-radius:8px 8px 0 0}
@keyframes ciPulseEdge{0%,100%{opacity:.55}50%{opacity:1}}
/* botao de voltar a seguir o tecido: so em producao e so quando o dedo largou o seguimento */
.ci-follow{position:absolute;left:0;right:80px;top:12px;display:none;justify-content:center}
.ci-follow.on{display:flex}
.ci-follow button{font-family:inherit;font-size:13px;font-weight:600;color:#fff;background:var(--brand);
  border:0;border-radius:200px;height:40px;padding:0 18px;cursor:pointer;
  box-shadow:0 4px 12px #1018282e;transition:background 140ms cubic-bezier(.2,0,0,1),transform 85ms cubic-bezier(.2,0,0,1)}
.ci-follow button:hover{background:var(--p-700)}
.ci-follow button:active{transform:scale(.965)}
/* mira de metro, partilhada pelas quatro colunas */
.ci-cross{position:absolute;left:0;right:0;top:0;height:0;pointer-events:none;opacity:0;
  transition:opacity 160ms cubic-bezier(.2,0,0,1);will-change:transform,opacity}
.ci-cross i{position:absolute;left:0;right:72px;top:-1px;height:2px;background:var(--brand);display:block}
.ci-cross b{position:absolute;right:0;top:-11px;font-size:12px;font-weight:700;color:#fff;background:var(--brand);
  border-radius:4px;padding:1px 6px;font-variant-numeric:tabular-nums}
/* minimapa: o rolo inteiro, com a janela por cima */
.ci-mini-wrap{flex:0 0 96px;display:flex;flex-direction:column;gap:0;margin-left:16px}
.ci-mini-head{height:168px;display:flex;align-items:flex-end;justify-content:center;padding-bottom:6px;
  box-sizing:border-box;font-size:12px;font-weight:600;color:var(--prim-500)}
.ci-mini{position:relative;background:var(--prim-100);border-radius:4px;cursor:pointer;
  touch-action:none;user-select:none;overflow:hidden}
.ci-mini .lanes{position:absolute;left:6px;top:0;bottom:0;right:30px;display:grid;
  grid-template-columns:repeat(4,minmax(0,1fr));gap:3px}
.ci-mini .lanes>div{position:relative}
.ci-mini .lane-bar{position:absolute;left:0;right:0;border-radius:1px;display:block}
.ci-mini .ticks{position:absolute;right:0;top:0;bottom:0;width:26px}
.ci-mini .ticks span{position:absolute;right:0;font-size:11px;color:var(--prim-500);
  font-variant-numeric:tabular-nums;transform:translateY(-50%)}
.ci-mini .vail{position:absolute;left:0;right:0;top:0;background:#ffffffdb;
  border-bottom:1px dashed var(--prim-300);box-sizing:border-box}
/* eixo 'up': mesma inversao, no minimapa */
.ci-mini .vail.up{top:auto;bottom:0;border-bottom:0;border-top:1px dashed var(--prim-300)}
.ci-mini .win{position:absolute;left:0;right:0;border:2px solid var(--brand);border-radius:4px;
  background:#683fd31a;box-sizing:border-box;will-change:transform}
@media (prefers-reduced-motion:reduce){.ci-live i:first-child,.ci-peek span{animation:none}}


/* ===== Pagina do Defect Inspection (Paper 21E3-0): coluna do mapa a esquerda, tabela a direita */
/* ===== Defect Inspection: painel do mapa (handoff "Defect Scroll", 20 Set 2026) =====
   Substitui o painel estreito "Defect end to End" (dwMap) que vinha do Paper. Tres colunas
   coladas: eixo de metros (52, fora do scroller, movido por transform), o mapa do tecido
   (200, onde a horizontal e a largura real do rolo) e o minimapa do rolo inteiro (58).
   O eixo e o da maquina: ROLL_M no topo, 0 m no fundo.
   Cores: rampas Amethyst. O handoff da valores Untitled-UI que nao existem no sistema
   (#EAECF0, #98A2B3, #F1F3F7, #E7E9EE, #4A2AA0...) e a traducao esta em cada regra. */
/* O cartao, o cabecalho, a faixa de topo e a legenda sao os mesmos nos dois cartoes (2ACH-1 e
   2DEO-1 partilham o chrome, e o cabecalho e o componente 2F4W-1), por isso usam as classes
   .ci-*. O modo activo e verde nos dois: o verde e o modo de producao. */
.ci-modes button.on{background:var(--s-600);border-color:var(--s-600)}
.ci-legend .lv i{display:block;flex:0 0 auto}
/* corpo: mapa a esquerda com largura fixa, tabela a ocupar o resto */
.df-body{position:relative;display:flex;align-items:flex-start;gap:20px;padding:16px 4px 0}
.df-mapcol{flex:0 0 auto;display:flex;flex-direction:column;gap:10px}
.df-label{font-size:14px;line-height:20px;font-weight:500;color:var(--prim-900);
  height:18px;white-space:nowrap}
.df-maprow{position:relative;display:flex;gap:8px}
.df-axis{width:52px;position:relative;height:560px;overflow:hidden}
.df-axis-in{position:absolute;inset:0}
.df-tick{position:absolute;right:0;display:flex;align-items:center;gap:6px;transform:translateY(-50%)}
.df-tick b{font-size:12px;font-variant-numeric:tabular-nums;color:var(--prim-700);font-weight:400}
.df-tick.major b{font-weight:600}
.df-tick i{height:1px;display:block}
.df-scroll{position:relative;width:200px;height:560px;overflow:hidden;
  scrollbar-width:none;touch-action:pan-y;background:var(--prim-100);border-radius:4px}
.df-scroll::-webkit-scrollbar{width:0;height:0}
.df-canvas{position:relative;width:200px}
.df-guide{position:absolute;top:0;bottom:0;width:1px}
.df-mark{position:absolute;transform:translate(-50%,-50%);box-sizing:border-box;cursor:pointer}
.df-mark.sel{box-shadow:0 0 0 3px #683fd380}
/* vao do que ainda nao foi produzido */
.df-vail{position:absolute;left:0;right:0;top:0;background:var(--prim-0);
  border-bottom:2px dashed var(--prim-300);z-index:2;display:flex;align-items:flex-end;
  justify-content:center;padding-bottom:8px;box-sizing:border-box}
.df-vail span{font-size:12px;font-weight:600;color:var(--prim-400)}
/* eixo 'up': o vail ancora no fundo e a linha tracejada passa a ser em cima */
.df-vail.up{top:auto;bottom:0;border-bottom:0;border-top:2px dashed var(--prim-300);
  align-items:flex-start;padding:8px 0 0}
/* mira de metro, por cima do mapa */
.df-cross{position:absolute;left:0;right:0;top:0;height:0;pointer-events:none;opacity:0;
  transition:opacity 160ms cubic-bezier(.2,0,0,1);will-change:transform,opacity;z-index:3}
.df-cross i{position:absolute;left:0;right:0;top:-1px;height:2px;background:var(--brand);display:block}
.df-cross b{position:absolute;left:50%;top:-11px;transform:translateX(-50%);font-size:12px;font-weight:700;
  color:#fff;background:var(--brand);border-radius:4px;padding:1px 6px;font-variant-numeric:tabular-nums}
/* etiquetas de borda */
.df-peek{position:absolute;left:0;right:0;display:flex;justify-content:center;pointer-events:none;
  opacity:0;transition:opacity 200ms cubic-bezier(.2,0,0,1);z-index:3}
.df-peek.up{top:0}
.df-peek.down{bottom:0}
.df-peek span{font-size:12px;font-weight:600;color:#fff;background:#101828d1;padding:3px 10px;
  font-variant-numeric:tabular-nums;animation:ciPulseEdge 2.4s cubic-bezier(.2,0,0,1) infinite}
.df-peek.up span{border-radius:0 0 8px 8px}
.df-peek.down span{border-radius:8px 8px 0 0}
/* botao de voltar a seguir o tecido */
.df-follow{position:absolute;left:0;right:0;top:12px;display:none;justify-content:center;z-index:4}
.df-follow.on{display:flex}
.df-follow button{font-family:inherit;font-size:13px;font-weight:600;color:#fff;background:var(--brand);
  border:0;border-radius:200px;height:40px;padding:0 16px;cursor:pointer;
  box-shadow:0 4px 12px #1018282e;transition:background 140ms cubic-bezier(.2,0,0,1),transform 85ms cubic-bezier(.2,0,0,1)}
.df-follow button:hover{background:var(--p-700)}
.df-follow button:active{transform:scale(.965)}
/* minimapa: miniatura fiel do rolo, com o indicador da janela */
.df-mini{position:relative;width:58px;height:560px;background:var(--prim-100);border-radius:4px;
  cursor:pointer;touch-action:none;user-select:none}
.df-mini-marks{position:absolute;left:4px;right:26px;top:0;bottom:0}
.df-mini-dot{position:absolute;width:5px;height:5px;border-radius:200px;transform:translate(-50%,-50%)}
.df-mini-ticks{position:absolute;right:2px;top:0;bottom:0;width:22px}
.df-mini-ticks span{position:absolute;right:0;font-size:11px;color:var(--prim-500);
  font-variant-numeric:tabular-nums;transform:translateY(-50%)}
.df-mini-vail{position:absolute;left:0;right:0;top:0;background:#ffffffdb;
  border-bottom:1px dashed var(--prim-300);box-sizing:border-box}
.df-mini-vail.up{top:auto;bottom:0;border-bottom:0;border-top:1px dashed var(--prim-300)}
.df-mini-win{position:absolute;left:0;right:0;top:0;border:2px solid var(--brand);border-radius:4px;
  background:#683fd31a;box-sizing:border-box;will-change:transform}
/* coluna da tabela */
.df-tablecol{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:10px}
.df-tablecol>.table-wrap{flex:1 1 auto;min-width:0}
/* linha seleccionada na tabela (o motor de listas poem a classe via cfg.tr) */
tr.is-sel{background:#683fd314;box-shadow:inset 3px 0 0 var(--brand)}
tr.is-sel:hover{background:#683fd31f}
/* Entrada de um defeito novo, so em modo Live. Duracoes do handoff: marca 420 ms, halo
   2 x 1,6 s (toca durante 1,2 m), contador de pontos 700 ms, linha 1200 ms. */
.df-mark.off{opacity:0;pointer-events:none}
.df-mark.in{animation:kMarkIn 420ms cubic-bezier(.2,0,0,1)}
.df-halo{position:absolute;left:50%;top:50%;width:26px;height:26px;border:2px solid;
  border-radius:200px;transform:translate(-50%,-50%);pointer-events:none;
  animation:kHalo 1.6s cubic-bezier(.2,0,0,1) 2}
.df-stat .v.flash{animation:kFlash 700ms cubic-bezier(.2,0,0,1)}
tbody tr.rowin{animation:kRowIn 1200ms cubic-bezier(.2,0,0,1)}
@keyframes kMarkIn{0%{transform:translate(-50%,-50%) scale(.2);opacity:0}
  35%{transform:translate(-50%,-50%) scale(1.35);opacity:1}
  100%{transform:translate(-50%,-50%) scale(1);opacity:1}}
@keyframes kHalo{0%{transform:translate(-50%,-50%) scale(.6);opacity:.7}
  100%{transform:translate(-50%,-50%) scale(3.4);opacity:0}}
@keyframes kFlash{from{color:var(--brand)}to{color:var(--prim-900)}}
@keyframes kRowIn{from{background:#683fd324}to{background:transparent}}
@media (prefers-reduced-motion:reduce){
  .df-peek span,.df-mark.in,.df-halo,.df-stat .v.flash,tbody tr.rowin{animation:none}
}

/* ===== Charts / legend / color tiles ===== */
.chart-card{background:var(--prim-50);border:1px solid var(--prim-300);border-radius:var(--radius-md);padding:16px;overflow:auto}
.chart-card h3{font-size:16px;line-height:20px;font-weight:600;color:var(--p-800);margin-bottom:12px}
.legend{display:flex;align-items:center;gap:16px;font-size:12px;color:var(--text-3)}
.legend-line{display:inline-block;border-top:2px solid var(--crit-500);width:40px}
.color-tiles{display:flex;gap:12px;font-size:13px;color:var(--text-2)}
.color-tiles .ct{flex:1;border:1px dashed var(--border-strong);border-radius:8px;padding:48px 8px;text-align:center;display:flex;flex-direction:column;gap:4px}
.color-tiles .ct span{font-size:11px;color:var(--text-3)}

/* ===== Side bar de defecto (Paper 8CU-1) ===== */
#scrim{position:fixed;inset:0;background:rgba(16,24,40,.32);z-index:50}
#scrim[hidden]{display:none}
#drawer{position:fixed;top:0;right:0;bottom:0;z-index:60;width:min(970px,78vw);overflow:auto;background:#fff;
  box-shadow:var(--shadow-drawer);padding:32px;display:flex;flex-direction:column;gap:32px}
#drawer[hidden]{display:none}
/* Painel do defeito (handoff "Defect Scroll"): identidade, meta em quatro cartoes, tabs de
   iluminacao, miniatura "No rolo" com o rolo inteiro, frame grande, tira das 8 camaras e
   accoes. O mecanismo do drawer e o mesmo (abre pela linha ou pela marca, fecha no X e no
   scrim); o conteudo e que mudou. Cores: rampas Amethyst. */
.dx-head{display:flex;align-items:center;justify-content:space-between;gap:16px}
.dx-id{font-size:26px;line-height:34px;font-weight:600;color:var(--prim-900);flex:1;min-width:0;
  font-variant-numeric:tabular-nums}
.dx-close{width:40px;height:40px;display:grid;place-items:center;border:0;background:none;padding:0;
  cursor:pointer;color:var(--prim-500);flex:0 0 40px}
.dx-close:hover{color:var(--prim-900)}
.dx-meta{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:16px}
.dx-mcard{display:flex;flex-direction:column;gap:16px;padding:16px;border:1px solid var(--prim-300);
  border-radius:8px;background:var(--prim-50);box-sizing:border-box}
.dx-mk{font-size:14px;line-height:20px;font-weight:600;color:var(--p-800)}
.dx-mv{font-size:16px;line-height:34px;font-weight:600;font-variant-numeric:tabular-nums;color:var(--prim-900);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dx-tabs{display:flex;gap:3px;padding:12px 0 0}
.dx-tab{flex:1 1 0;font-family:inherit;font-size:13px;font-weight:600;height:36px;border:0;border-radius:200px;
  cursor:pointer;background:var(--prim-100);color:var(--prim-500);transition:background 140ms cubic-bezier(.2,0,0,1)}
.dx-tab.on{background:var(--p-100);color:var(--p-700)}
.dx-body{display:flex;flex-direction:column;gap:14px;padding-top:14px}
.dx-row{display:flex;gap:14px;align-items:stretch}
.dx-thumbwrap{flex:0 0 96px;display:flex;flex-direction:column;gap:6px}
.dx-k{font-size:14px;line-height:20px;font-weight:500;color:var(--prim-900)}
.dx-thumb{position:relative;flex:1 1 auto;min-height:190px;background:var(--prim-100);border-radius:4px;overflow:hidden}
.dx-tmark{position:absolute;box-sizing:border-box;transform:translate(-50%,-50%)}
.dx-box{position:absolute;left:4px;right:4px;height:26px;border:2px solid var(--brand);border-radius:4px;
  background:#683fd314;box-sizing:border-box;transform:translateY(-50%)}
.dx-framewrap{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:6px}
/* Textura de substituicao: no prototipo sao texturas CSS, nao fotografias. Faltam os bitmaps
   das camaras (8 camaras x 4 iluminacoes) — o layout e o que esta aqui. */
.dx-frame{position:relative;flex:1 1 auto;min-height:190px;border:3px solid var(--brand);border-radius:4px;
  background-color:var(--prim-400);
  background-image:repeating-linear-gradient(90deg,rgba(255,255,255,.22) 0 1px,rgba(0,0,0,.14) 1px 3px),
    repeating-linear-gradient(0deg,rgba(255,255,255,.1) 0 2px,rgba(0,0,0,.07) 2px 5px);
  box-sizing:border-box;overflow:hidden}
.dx-ov{position:absolute;border:2px solid;transform:translate(-50%,-50%);box-sizing:border-box}
.dx-light{position:absolute;left:8px;bottom:8px;font-size:11px;font-weight:600;color:#fff;background:#10182899;
  border-radius:4px;padding:2px 7px}
.dx-strip{display:flex;gap:10px;align-items:stretch}
.dx-stripaxis{flex:0 0 62px;display:flex;flex-direction:column}
.dx-stripaxis .h{height:26px;display:flex;align-items:center;font-size:12px;font-weight:600;color:var(--prim-700)}
.dx-stripaxis .t{position:relative;flex:1 1 auto;min-height:170px}
.dx-stripaxis .t span{position:absolute;left:0;right:0;display:flex;flex-direction:column;align-items:flex-end;gap:3px}
.dx-stripaxis .t b{font-size:11px;font-weight:400;font-variant-numeric:tabular-nums;color:var(--prim-500)}
.dx-stripaxis .t i{height:1px;background:var(--prim-200);align-self:stretch}
.dx-stripcol{flex:1 1 auto;min-width:0;display:flex;flex-direction:column}
.dx-camnos{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:2px;height:26px;align-items:center}
.dx-camnos span{font-size:11px;font-weight:600;color:var(--prim-500);text-align:center}
.dx-cams{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:2px;border:2px dashed var(--crit-500);
  border-radius:3px;padding:2px;background:var(--prim-100)}
.dx-cam{position:relative;font-family:inherit;height:62px;border:1px solid transparent;border-radius:2px;cursor:pointer;
  padding:0;box-sizing:border-box;overflow:hidden;background-color:var(--prim-400);
  background-image:repeating-linear-gradient(90deg,rgba(255,255,255,.2) 0 1px,rgba(0,0,0,.13) 1px 3px)}
.dx-cam.hit{background-color:var(--prim-500)}
.dx-cam.on{border:2px solid var(--brand)}
.dx-cam .d{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:18px;height:18px;
  border-radius:200px;box-sizing:border-box}
.dx-cam .n{position:absolute;right:3px;bottom:2px;font-size:10px;font-weight:700;color:#fff;background:#1018288c;
  border-radius:2px;padding:0 3px}
.dx-sel{position:relative;flex:1 1 auto;min-height:108px;background:var(--prim-25);border-radius:0 0 3px 3px}
.dx-sel i{position:absolute;top:0;width:12.5%;height:56px;border:2px solid var(--brand);border-radius:0 0 4px 4px;
  background:var(--prim-0);box-sizing:border-box;display:block}
.dx-note{font-size:12px;color:var(--prim-500)}
.dx-actions{display:flex;gap:8px;padding-top:4px}
.dx-btn{font-family:inherit;font-size:13px;font-weight:600;height:40px;padding:0 16px;border-radius:8px;
  border:1px solid var(--prim-300);cursor:pointer;background:var(--prim-0);color:var(--prim-700)}
.dx-btn:hover{background:var(--prim-50)}
.dx-btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}
.dx-btn.primary:hover{background:var(--p-700)}
.dx-btn.ghost{margin-left:auto;color:var(--prim-500)}

/* ===== Responsivo dentro do preview ===== */
@media(max-width:1200px){
  #main{padding:16px;gap:24px}
  .filterbar{flex-wrap:wrap}
  .dx-meta{grid-template-columns:repeat(2,minmax(0,1fr))}
  .dx-row{flex-direction:column}
  .dx-thumbwrap{flex:0 0 auto}
  .dx-thumb{min-height:120px}
  #drawer{width:92vw;padding:20px}
}
