/* table-frame.css — shared list-table framing (1 Sep 2026).
   The CARD around a list table carries no chrome; the 1px frame sits on the table
   itself (left/right/bottom) and continues onto the pagination bar. No line runs
   across the top of the table, and no rule under the grey header row.
   Loaded AFTER each page's own <style>-equivalent links, so every selector is
   specificity-safe against page-local `.card` / `.table thead th` rules. */
.body .card:has(>.cb>.table),.body .card:has(>.cb>#connTable),.body .card:has(>.cb>.invtblwrap),.body .card:has(>.cb>.ctblscroll),.body .card:has(>.cb>.tblwrap),.body .card.listcard{border:none;border-radius:0;box-shadow:none;}
.body .card>.cb>.table,.body .card>.cb>#connTable>.table,.body .card>.cb>.invtblwrap,.body .card>.cb>.ctblscroll,.body .card>.cb>.tblwrap{border-left:1px solid var(--line);border-right:1px solid var(--line);border-bottom:1px solid var(--line-2);}
.body .card>.cb>#connTable{border:none;}
.body .card>.pgbar,.body .card>.lpgbar,.body .card>.cb>.pgbar,.body .card>.cb>.lpgbar{border-left:1px solid var(--line);border-right:1px solid var(--line);border-bottom:1px solid var(--line);}
.body .table thead th{border-bottom:none;}
.body .table thead th.act{text-align:right;}
/* select column: sit the checkbox tight against the first data column */
.body .table th.cbcell,.body .table td.cbcell{padding-right:0;}
.body .table th.cbcell+th,.body .table td.cbcell+td{padding-left:8px;}
/* two-line stacked cells (Customer Name / Company Type, CLI / Username, Tariff / Network,
   Date / Time …) — a touch more air between the two lines */
/* margin, not row-gap: the truncation pass (table-responsive.js `.abz-trunc`) turns these
   cells into display:block, where row-gap is inert */
.body .table td :is(.c2,.u-c2,.c2l,.ct2)>:nth-child(2){margin-top:2px;}
/* KPI strip → table title gap = 18px, the same rhythm as the sub-tab rail above it */
.body #kpis,.body .kpis{margin-bottom:18px;}
/* the title / search / actions rail above a list table finishes flush with the TABLE's
   right frame line (7 Sep 2026) — the TITLE keeps its normal inset, so only the trailing
   action buttons align with the table edge */
.body .card:has(>.cb>.table)>.ch.chrow,.body .card:has(>.cb>#connTable)>.ch.chrow,.body .card:has(>.cb>.invtblwrap)>.ch.chrow,.body .card:has(>.cb>.ctblscroll)>.ch.chrow,.body .card:has(>.cb>.tblwrap)>.ch.chrow{padding-right:0;}
.body .cb:has(>.table)>.sectoolbar,.body .cb:has(>#connTable)>.sectoolbar,.body .cb:has(>.invtblwrap)>.sectoolbar,.body .cb:has(>.ctblscroll)>.sectoolbar,.body .cb:has(>.tblwrap)>.sectoolbar{padding-right:0;}
.body .card>.cb:has(>.sectoolbar){padding-top:0;}
/* every list-table rail reads like Connections' .ch.chrow: 16px title inset, flush with
   the table's right frame line, 12px of air before the table */
.body .cb>.sectoolbar{padding-left:16px;padding-right:0;margin-bottom:12px;}
.body .card:has(>.cb>.table)>.ch.chrow,.body .card:has(>.cb>#connTable)>.ch.chrow,.body .card:has(>.cb>.invtblwrap)>.ch.chrow,.body .card:has(>.cb>.ctblscroll)>.ch.chrow,.body .card:has(>.cb>.tblwrap)>.ch.chrow{padding-top:0;}
