/* ===========================================================
 * components.css — UI-omskinning, Etapp 0 (Pilot)
 *
 * Ett ställe för återkommande mönster från UI-inventeringen.
 * Lagras EFTER style.css i app/layout.tsx så reglerna här
 * vinner i kaskaden där samma klasser definieras tidigare.
 *
 * Alla värden via tokens.css. Inga råa hexar. Inga sid-specifika
 * media-queries — sidorna ska konsumera dessa klasser och bli
 * responsiva by default.
 *
 * BREAKPOINTS (synkad mellan komponenter):
 *   • 760px — split → kolumn (matchar lev-faktura #381)
 *   • 480px — telefon (en kolumn, kompakt padding)
 *
 * STANDARD-VAL för datatabell på mobil: HORISONTELL SCROLL
 * (.table-wrapper får -webkit-overflow-scrolling: touch).
 * Stack-på-mobil-varianten (.data-table--stack) införs i etapp
 * 1 för listor som har naturliga "rad-kort"-representationer
 * (faktura/kvittolistor).
 * =========================================================== */


/* ─── 1. Page header — Fraunces större för designharmoni ─────── */

.page-header {
  margin-bottom: var(--space-8);
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--space-3);
}

.page-title {
  font-family: var(--font-heading);
  font-size: var(--fs-h2);
  font-weight: 600;
  letter-spacing: -.015em;
  color: var(--text-primary);
  line-height: 1.1;
  margin: 0;
}

.page-subtitle {
  font-size: var(--fs-body);
  color: var(--text-secondary);
  margin-top: var(--space-1);
  letter-spacing: 0;
}


/* ─── 2. Surface card — mjuk, ljus, landningssidans känsla ───── */

.card {
  background: var(--surface-card);
  border: 1px solid var(--line);
  /* ⚠️ FACIT: 12 px och INGEN skugga. Kortet var 18 px med skugga; mockupen
   * ritar platta kort som hålls samman av sin kant. --radius-lg finns kvar
   * för modalerna, som facit inte ritar. */
  border-radius: var(--radius);
  overflow: hidden;   /* så hörnen på header-bakgrund kapas */
  /* ROTORSAKSFIXEN (docs/KORT_INRE_PADDING_DIAGNOS.md): .card var paddinglös
     och förlitade sig på att författaren kände till .card-body-konventionen —
     rå class="card" gav klistrande innehåll (lager #720, auth #521,
     avskrivningsvyn …). Nu är RÄTT padding default; kant-till-kant kräver
     explicit .card--flush (aktivt, granskningsbart beslut). */
  padding: var(--card-pad-y) var(--card-pad-x);
}

/* Strukturerade kort (.card-header/.card-body sätter sin egen padding som
   förr) ska INTE dubbelpaddas — :has-neutraliseringen gör dem BIT-IDENTISKA
   utan migrering. (:has stöds i plattformens målmiljö: Chrome/Edge 105+,
   Safari 15.4+, Firefox 121+ — samma nivå som redan använda 100dvh/clamp.) */
.card:has(> .card-header),
.card:has(> .card-body) {
  padding: 0;
}

/* Explicit kant-till-kant (tabell-/listkort där innehållet ska nå ramen). */
.card--flush { padding: 0; }

.card-header {
  padding: var(--space-5) var(--space-6);
  border-bottom: 1px solid var(--line);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  flex-wrap: wrap;
}

.card-title {
  font-family: var(--font-body);
  font-size: var(--fs-md);
  font-weight: 600;
  color: var(--text-primary);
  letter-spacing: 0;
}

.card-body { padding: var(--space-5) var(--space-6); }


/* ─── 3. Stat-cards — display-stort tal i Fraunces ──────────── */

.stats-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--space-5);
  margin-bottom: var(--space-8);
}
@media (max-width: 760px) {
  .stats-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 480px) {
  .stats-grid { grid-template-columns: 1fr; }
}

.stat-card {
  background: var(--surface-card);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  padding: var(--space-6);
  box-shadow: var(--shadow);
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}

.stat-label {
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--text-secondary);
  margin-bottom: 0;
}

.stat-value {
  font-family: var(--font-heading);
  font-size: var(--fs-display);
  font-weight: 600;
  line-height: 1.05;
  color: var(--text-primary);
  letter-spacing: -.015em;
}
.stat-value.green { color: var(--success); }
.stat-value.red   { color: var(--danger);  }


/* ─── 4. Responsiv två-kolumn — grid-2 ──────────────────────── */

.grid-2 {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-6);
}
@media (max-width: 760px) {
  .grid-2 { grid-template-columns: 1fr; }
}


/* ─── 5. Datatabell — horisontell scroll på mobil ───────────── */

.table-wrapper {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}

table {
  width: 100%;
  border-collapse: collapse;
}

thead th {
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--text-secondary);
  padding: var(--space-3) var(--space-5);
  text-align: left;
  background: var(--surface-inset);
  border-bottom: 1px solid var(--line);
}

tbody tr {
  border-bottom: 1px solid var(--line);
  transition: background .12s ease;
}
tbody tr:last-child { border-bottom: none; }
tbody tr:hover { background: var(--hover-tint); }

tbody td {
  padding: var(--space-4) var(--space-5);
  font-size: var(--fs-body);
  color: var(--text-body);
}


/* ─── 6. Knapphierarki — landningssidans cirkulära form ─────── */

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 7px;
  /* ⚠️⚠️ FACIT: 8 px hörn, inte piller. Plattformens knappar var runda
   * (999px) sedan landningssidans formspråk; mockupen ritar en rundad
   * rektangel. Det här är omritningens enskilt mest spridda ändring — 78
   * filer bär `.btn`. */
  padding: 8px 14px;
  min-height: var(--tap-target);
  border-radius: var(--radius-sm);
  font-family: var(--font-body);
  font-size: 13.5px;
  /* ⚠️ VIKTEN LIGGER PÅ VARIANTEN. Facits bas-knapp ärver sin vikt; bara
   * primärknappen är 600. En sekundärknapp som väger lika mycket som en
   * primär gör hierarkin osynlig. */
  font-weight: 400;
  background: var(--paper);
  color: var(--text);
  border: 1px solid var(--line-stark);
  cursor: pointer;
  transition: background .15s, box-shadow .15s, transform .15s, border-color .15s;
  text-decoration: none;
  white-space: nowrap;
}
/* ⚠️⚠️ `display: inline-flex` OVANFÖR ÖVERTRUMFAR UA-STYLETS `[hidden]`, och
 * en knapp som satts `hidden` i JS ritas ändå. Samma fel som filter-panelen
 * dokumenterar i §25 — där löstes det med `:not([hidden])`, här räcker en egen
 * regel eftersom basdisplayen ska gälla i övrigt.
 *
 * ⚠️ Det syntes inte i enhetsproven: `el.hidden` var true hela tiden, alltså
 * grönt, medan webbläsaren ritade knappen. Mätt i Chromium — «Ta bort kontot»
 * stod synlig i ett formulär som inte hade något att ta bort. */
.btn[hidden] { display: none; }

/* ⚠️⚠️ FÖRTÄTNING PÅ PEKDON, ALDRIG PÅ FINGER.
 *
 * 44 px (--tap-target) är WCAG:s rekommendation för ett FINGER. Med mus är den
 * bara luft: knappraderna blev höga och kortens fötter tunga. Taket sänks
 * därför bara där ingen grov pekare finns.
 *
 * ⚠️ VILLKORET ÄR PEKDONET, INTE SKÄRMBREDDEN. En surfplatta i landskap är
 * bred OCH har finger; en breddbrytpunkt hade krympt knappen just där den
 * behövs som mest. `any-pointer: coarse` är sant så snart NÅGON av enhetens
 * pekare är grov — en pekskärmsbärbar behåller alltså 44 px.
 *
 * ⚠️ .btn-sm ligger kvar på 32 px och behåller sin skillnad mot .btn.
 * ⚠️ Regeln rör 78 filer. Den prövas i webbläsaren på inställningarna, byråvyn
 * och avstämningen — de två sistnämnda har de tätaste knappraderna. */
@media (pointer: fine) and (not (any-pointer: coarse)) {
  .btn { min-height: 36px; padding: 6px 13px; }
}

.btn:focus-visible {
  outline: none;
  box-shadow: var(--focus-ring);
}

/* ⚠️ EN <a class="btn"> ÄR EN LÄNK för webbläsaren, och UA-stilen färgar
   :link blå och :visited LILA. Ingen :visited-regel fanns i stilarna alls,
   så varje knapp utan variantklass blev en vanlig länk med knappform — och
   lila så fort någon klickat på den en gång.

   Regeln gör knappen immun oavsett variant: den ärver sin varants färg i
   alla länktillstånd. Varianterna upprepas efteråt eftersom `.btn:visited`
   annars vinner på specificitet över `.btn-primary`. */
.btn:link,
.btn:visited { color: inherit; text-decoration: none; }
.btn-primary:link,
.btn-primary:visited { color: var(--paper); }
.btn-secondary:link,
.btn-secondary:visited { color: var(--text-primary); }
.btn-danger:link,
.btn-danger:visited { color: var(--paper); }

/* ⚠️ `var(--brand)`, INTE `var(--info)`. De var olika färger: --info pekar på
 * --blue och --brand pekade (via style.css) på marinblått. Primärknappen
 * följde alltså inte varumärkesfärgen — den följde en informationsfärg som
 * råkade vara blå. Nu en källa.
 * ⚠️ SKUGGAN UTGÅR — facit ritar platta knappar. */
.btn-primary {
  background: var(--brand);
  border-color: var(--brand);
  color: var(--paper);
  font-weight: 600;
}
.btn-primary:hover {
  background: var(--blue-deep);
  border-color: var(--blue-deep);
}

.btn-secondary {
  background: var(--paper);
  color: var(--text);
  border-color: var(--line-stark);
}
.btn-secondary:hover {
  border-color: var(--text-primary);
  background: var(--hover-tint);
}

.btn-danger {
  background: var(--danger);
  color: var(--paper);
}
.btn-danger:hover { background: var(--danger-deep); }

/* ⚠️ FACIT: ghost är brandfärgad text utan ram — en länk med knappform. Den
 * var svart, alltså omöjlig att skilja från en sekundärknapp utan ram. */
.btn-ghost {
  background: transparent;
  color: var(--brand);
  border-color: transparent;
}
.btn-ghost:hover { background: var(--hover-tint); }

/* Kompakt variant — minst 36px höjd, fortfarande gott för tumtryck
   när den ligger i en sekundär actions-rad (t.ex. "Visa alla" intill
   en card-header eller en tabellrads-knapp). */
.btn-sm {
  padding: 5px 10px;
  min-height: 32px;
  font-size: 12.5px;
}

/* ⚠️ EN IKONKNAPP ÄR EN KVADRAT på tumtryckets mått (WCAG).
 *
 * ⚠️⚠️ BREDDEN HÄR RÄCKER INTE. En senare rad i §21 sätter `width: auto` på
 * `.btn` med samma specificitet och vann på ordning ensam — se noten där, och
 * ändra inte den här raden i tron att den är den enda som bestämmer. */
.btn-icon {
  padding: 0;
  width: var(--tap-target);
  min-height: var(--tap-target);
  border-radius: 999px;
}


/* ─── 7. Badges — semantiska tokens ─────────────────────────── */

.badge {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  padding: 4px var(--space-3);
  border-radius: 999px;
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: .01em;
}

.badge-green  { background: var(--success-soft); color: var(--success-deep); }
.badge-yellow { background: var(--warning-soft); color: var(--warning-deep); }
.badge-red    { background: var(--danger-soft);  color: var(--danger-deep);  }
.badge-blue   { background: var(--info-soft);    color: var(--info-deep);    }
.badge-gray   { background: var(--surface-inset); color: var(--text-secondary); }
/* badge-amber (docs/BOKSLUT_MASTER_DETAIL.md, commit 4): "Påbörjat"-status i
   bokslut.js/bokslut-skal.js använde denna klass utan motsvarande regel —
   ostylad/default utseende innan denna rad. Samma semantik som badge-yellow. */
.badge-amber  { background: var(--warning-soft); color: var(--warning-deep); }

/* FLAGGAS: badge-orange/-teal har ingen passande befintlig token —
   används av lev-faktura-AI-statusbadges. Konvertera till
   --info-soft eller introducera --secondary-* i etapp 1. */


/* ─── 8. Empty-state ──────────────────────────────────────── */

.empty-state {
  text-align: center;
  padding: var(--space-12) var(--space-5);
  color: var(--text-secondary);
}
.empty-state svg {
  width: 48px; height: 48px;
  opacity: .35;
  margin-bottom: var(--space-3);
  color: var(--text-secondary);
}
.empty-state p {
  font-size: var(--fs-body);
  color: var(--text-secondary);
  margin: 0;
}


/* ============================================================
 * ETAPP 0B — komponenter receipts-pilot konsumerar
 * (utdrag ur etapp 1-listan — resten väntar tills etapp 1)
 * ============================================================ */


/* ─── 9. Section header — eyebrow + titel + actions ─────────── */

.section-header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--space-4);
  flex-wrap: wrap;
  margin-bottom: var(--space-5);
}
.section-header__main { min-width: 0; flex: 1 1 320px; }
.section-header__actions {
  display: flex;
  gap: var(--space-2);
  flex-wrap: wrap;
}
.section-header__eyebrow {
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--info-deep);
}
.section-header__title {
  font-family: var(--font-heading);
  font-size: var(--fs-h2);
  font-weight: 600;
  line-height: 1.1;
  letter-spacing: -.015em;
  color: var(--text-primary);
  margin: var(--space-1) 0 0;
}
.section-header__lead {
  font-size: var(--fs-body);
  color: var(--text-secondary);
  margin-top: var(--space-2);
}


/* ─── 10. List row — generaliserat .attest-row ──────────────── */

/* Vi *aliasar* .attest-* så befintliga sidor (inkorg, arkiv) ärver
   automatiskt. Nya sidor använder .list-row. När alla sidor migrerat
   kan .attest-*-aliaserna tas bort (sannolikt etapp 7+). */
.list-row,
.attest-row {
  display: flex;
  align-items: center;
  gap: var(--space-4);
  padding: var(--space-4) var(--space-5);
  border-bottom: 1px solid var(--line);
  transition: background .12s ease;
}
.list-row:last-child,
.attest-row:last-child { border-bottom: none; }
.list-row:hover,
.attest-row:hover { background: var(--hover-tint); }

.list-row__ico,
.attest-ico {
  width: 36px; height: 36px;
  border-radius: var(--radius);
  background: var(--surface-inset);
  color: var(--text-primary);
  display: grid;
  place-items: center;
  flex-shrink: 0;
}
.list-row__ico svg,
.attest-ico svg { width: 18px; height: 18px; }

.list-row__main,
.attest-main {
  flex: 1;
  min-width: 0;
}
.list-row__title,
.attest-titel {
  font-size: var(--fs-md);
  font-weight: 600;
  color: var(--text-primary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.list-row__sub,
.attest-sub {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  margin-top: 2px;
}

.list-row__actions,
.attest-actions {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  flex-wrap: wrap;
}

@media (max-width: 760px) {
  /* Listrader stack:as på mobil så att actions hamnar under main */
  .list-row,
  .attest-row {
    flex-wrap: wrap;
  }
  .list-row__actions,
  .attest-actions {
    width: 100%;
    justify-content: flex-end;
  }
}


/* ─── 11. Datatabell — stack-på-mobil-VARIANTEN ─────────────── */

/* STANDARD-VAL: <table class="data-table data-table--stack"> blir
 * rad-kort på <= 760px. Datacellerna får data-label-attribut som
 * blir den vänstra "etiketten" på mobil.
 *
 * Detta är mobilstandarden för listor med naturliga rad-kort.
 * .table-wrapper (horisontell scroll) finns kvar för listor som
 * inte stack:as bra (t.ex. SIE/rapport-utskrifter).
 *
 * Markup-konvention:
 *   <table class="data-table data-table--stack">
 *     <thead>
 *       <tr><th>Datum</th><th>Belopp</th>…</tr>
 *     </thead>
 *     <tbody>
 *       <tr>
 *         <td data-label="Datum">…</td>
 *         <td data-label="Belopp">…</td>
 *       </tr>
 *     </tbody>
 *   </table>
 */
.data-table { width: 100%; border-collapse: collapse; }

@media (max-width: 760px) {
  .data-table--stack thead { display: none; }
  .data-table--stack tbody { display: block; }
  .data-table--stack tbody tr {
    display: block;
    background: var(--surface-card);
    border: 1px solid var(--line);
    border-radius: var(--radius);
    padding: var(--space-3) var(--space-4);
    margin-bottom: var(--space-3);
    box-shadow: var(--shadow);
  }
  .data-table--stack tbody tr:hover {
    background: var(--surface-card); /* override hover-tint på mobil */
  }
  .data-table--stack tbody td {
    display: flex;
    justify-content: space-between;
    align-items: center;
    gap: var(--space-3);
    padding: var(--space-2) 0;
    border: none;
    font-size: var(--fs-body);
  }
  .data-table--stack tbody td::before {
    content: attr(data-label);
    flex-shrink: 0;
    font-size: var(--fs-eyebrow);
    font-weight: 600;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: var(--text-secondary);
  }
  .data-table--stack tbody td:empty,
  .data-table--stack tbody td[data-label=""] { display: none; }
  /* ⚠️⚠️ TITELCELLEN FÅR HELA BREDDEN OCH TAPPAR SIN ETIKETT.
   *
   * Mätt vid 375 px: «PROVEL, INC. (Provel Electronics Nordic AB)» blev 28 px brett
   * och 259 px högt — TOLV RADER, ett ord per rad. Etiketten har
   * `flex-shrink: 0` och tar sin bredd först; värdet fick resten och krympte
   * till min-content, alltså längsta ordet. Samma mekanism som gav kontofältet
   * 92 px i #996.
   *
   * ⚠️ ETIKETTEN «LEVERANTÖR» UTGÅR. Namnet är kortets viktigaste uppgift och
   * behöver ingen rubrik — det är uppenbart vad det är. Etiketten stod dessutom
   * för halva orsaken till brytningen.
   *
   * ⚠️ `min-width: 0` PÅ BÅDA NIVÅERNA. Cellen är själv en flex-post och raden
   * inuti en till; utan bådas nollställning krymper ingen av dem under sitt
   * innehåll och ellipsen slår aldrig till. Samma tvåstegsfälla som
   * `.lf-grid--valuta` i #997. */
  .data-table--stack tbody td.cell-title {
    flex-direction: column;
    align-items: stretch;
    min-width: 0;
  }
  .data-table--stack tbody td.cell-title::before { content: none; }
  /* ⚠️⚠️ RADEN MÅSTE BLI BLOCK-FLEX FÖR ATT NAMNET SKA KUNNA KLIPPAS.
   * `.cell-title__row` är `inline-flex` — den är shrink-to-fit och VÄXER med
   * sitt innehåll, så spannet inuti aldrig får en bunden bredd och
   * `text-overflow` har ingenting att verka på. Mätt: en tredubblad sträng gav
   * fortfarande scrollWidth === clientWidth. Som block-flex ärver raden cellens
   * 292 px och namnet kan krympa inom den. */
  .data-table--stack tbody td.cell-title .cell-title__row {
    display: flex;
    min-width: 0;
    flex-wrap: nowrap;
  }
  /* ⚠️ Namnet krymper, ikonerna och statusen gör det inte — de har sin egen
   * storlek och ska behålla den. Utan `min-width: 0` här krymper spannet aldrig
   * under sitt innehåll, vilket är hela fällan en våning ned. */
  .data-table--stack tbody td.cell-title .cell-title__namn {
    flex: 1 1 auto;
    min-width: 0;
  }
  /* När en cell innehåller åtgärder (knappar) — låt dem ta full bredd
     under etiketten */
  .data-table--stack tbody td.has-actions { flex-direction: column; align-items: stretch; }
  .data-table--stack tbody td.has-actions::before { margin-bottom: var(--space-1); }
}


/* ─── 12. Status-chip — tokeniserade varianter ─────────────── */

/* Ett tokeniserat chip med modifierare. Receipts-pilot mappar de 8
 * DB-statusvärdena via klassnamn (.status-chip + .status-chip--<variant>).
 * Tidigare hade vi 8 hex-färgpar i style.css — nu sex semantiska
 * varianter ger same+klarare visuell hierarki. */
.status-chip {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 3px var(--space-3);
  border-radius: 999px;
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: .01em;
  white-space: nowrap;
}
.status-chip--neutral    { background: var(--surface-inset); color: var(--text-secondary); }
.status-chip--processing { background: var(--info-soft);     color: var(--info-deep); animation: status-chip-pulse 1.5s ease-in-out infinite; }
.status-chip--warning    { background: var(--warning-soft);  color: var(--warning-deep); }
.status-chip--danger     { background: var(--danger-soft);   color: var(--danger-deep); }
.status-chip--success    { background: var(--success-soft);  color: var(--success-deep); }
.status-chip--success-strong { background: var(--success);   color: var(--paper); }

/* ⚠️ Märket i verifikatlistan. Låg vikt med flit: det är en upplysning om att
   banken bekräftat raden, inte en varning — och det står bredvid beskrivningen
   i en tabell som redan bär status och bilagsikon. Se
   public/js/pages/bokforing.js. */
.ver-avstamd { margin-left: 6px; font-size: 11.5px; white-space: nowrap; }

@keyframes status-chip-pulse {
  0%, 100% { opacity: 1; }
  50%      { opacity: .58; }
}


/* ─── 13. Helpers för smutsande inline-styles ──────────────── */

.helper-text {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  margin-top: var(--space-1);
}
.row-sub {
  font-size: var(--fs-eyebrow);
  color: var(--text-secondary);
  margin-top: 2px;
}
/* Andra raden i en KOLUMNRUBRIK. Egen klass i stället för .row-sub, som
   sitter i celler och ärver deras vikt; en rubrik är fet och skulle göra
   underraden lika tung som rubriken själv. */
.th-sub {
  display: block;
  font-size: var(--fs-eyebrow);
  font-weight: 400;
  color: var(--text-secondary);
  margin-top: 2px;
  white-space: nowrap;
}
/* Specialfall: löpnummer i cell-title som bara visas på mobil. På desktop
 * finns numret redan i sin egen kolumn — undvik dubbletten. */
.cell-nr-mobil { display: none; }
@media (max-width: 760px) {
  .cell-nr-mobil { display: block; }
}

/* Cell-title med inline-element bredvid titeln (t.ex. bilaga-ikon, status-tag). */
.cell-title__row {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  flex-wrap: wrap;
}
/* ⚠️⚠️ NAMNET KLIPPS MED ELLIPS, DET BRYTS INTE.
 *
 * Ett långt leverantörsnamn bröts på varje ord (12 rader vid 375 px). Ellips
 * håller kortet på en rad och `title` bär hela namnet — se markupen i
 * leverantorsfakturor.js för mätningen.
 *
 * ⚠️ `min-width: 0` behövs på föräldrarna för att det här ska verka; utan dem
 * krymper boxen aldrig under sitt innehåll och det finns inget att klippa. */
.cell-title__namn {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Bilaga-ikon: synlig BARA på mobil i cell-title (desktop har egen kolumn).
 * Desktop visar den i .cell-bilaga-kolumnen i st.f. */
.cell-title__bilaga-mobil { display: none; }
@media (max-width: 760px) {
  .cell-title__bilaga-mobil { display: inline-flex; }
}
/* Status-tag visad inline bredvid titeln — på desktop ENDAST (mobil
 * har en egen status-rad i .row-sub i .cell-title). Möjliggör att
 * sidan tar bort sin Status-kolumn helt (std #22 "märk undantaget"). */
.cell-title__status-desktop { display: inline-flex; }
@media (max-width: 760px) {
  .cell-title__status-desktop { display: none; }
}
.bilaga-ikon {
  color: var(--info);
  flex-shrink: 0;
  vertical-align: -2px;
}
.cell-bilaga {
  width: 32px;
  text-align: center;
}
/* GEM-DUBBLETT-FIX: på mobil visas ikonen inline i .cell-title (via
 * .cell-title__bilaga-mobil). Kolumn-cellen MÅSTE gömmas dubbelt-säkert
 * — data-mobile="hide" beror på .data-table--stack-scope:n, vilket inte
 * alltid hjälpte vid varierande table-klass-kombinationer. Klass-baserad
 * regel fångar oberoende av föräldraklassen. */
@media (max-width: 760px) {
  .cell-bilaga { display: none !important; }
}

/* Inline status-tag — liten "pill"-text bredvid titeln. Används BARA
 * för avvikande status (std #22 "märk undantaget, inte normen").
 * Varianter speglar row--variant-systemet. */
.status-tag {
  display: inline-flex;
  align-items: center;
  padding: 1px var(--space-2);
  font-size: 11px;
  font-weight: 600;
  line-height: 1.4;
  border-radius: 999px;
  letter-spacing: .02em;
  white-space: nowrap;
  flex-shrink: 0;
}
.status-tag--warning {
  background: var(--warning-soft);
  color: var(--warning-deep);
}
.status-tag--danger {
  background: var(--danger-soft);
  color: var(--danger-deep);
}
.status-tag--processing {
  background: var(--blue-soft);
  color: var(--info);
}
.status-tag--success {
  background: var(--success-soft);
  color: var(--success-deep);
}
.status-tag--success-strong {
  background: var(--success);
  color: var(--paper);
}
.status-tag--neutral {
  background: var(--surface-inset);
  color: var(--text-secondary);
}
.action-group {
  display: flex;
  gap: var(--space-2);
  flex-wrap: wrap;
}
.action-group--end { justify-content: flex-end; }
.action-group--inline-cell {
  display: inline-flex;
  margin-left: var(--space-2);
}


/* ─── 14. Tom-state-kort (centrerat innehåll i en .card) ───── */

.card--empty {
  text-align: center;
  padding: var(--space-8) var(--space-5);
  color: var(--text-secondary);
}


/* ============================================================
 * ETAPP 0B — JUSTERINGAR EFTER GRANSKNING (uppdaterad standard)
 *
 * Ändringar:
 *   • Status flyttas FRÅN chip-kolumn TILL radfärg (vänsterkant
 *     + svag bakgrundstoning) + klartext i radens underrad.
 *     Etapp 1-sidor konsumerar samma row--variant-mönster.
 *   • Mobilkort blir kompaktare via mindre padding + möjlighet att
 *     dölja kolumner via data-mobile="hide".
 *
 * VIKTIGT (a11y):
 *   • Färg får ALDRIG vara enda bäraren — alltid kombinerad med
 *     status i klartext i raden.
 * ============================================================ */


/* ─── 15. Rad-status-varianter (för list-row OCH tabellrader) ─ */

/* DESKTOP-STANDARD (etapp 0B runda 2): bara 3px färgad vänsterkant.
 * Ingen bakgrundstoning på desktop — hela raden upplevs annars för
 * mättad. MOBIL behåller svag --*-soft-bg eftersom mobilkortet är
 * fysiskt avskilt och drar nytta av tonen.
 *
 * Mönstret är identiskt för .list-row och för <tr> i en .data-table —
 * inkommande etapper kan applicera samma klassnamn på båda. */

.row--success    { box-shadow: inset 3px 0 0 0 var(--success);  }
.row--warning    { box-shadow: inset 3px 0 0 0 var(--warning);  }
.row--danger     { box-shadow: inset 3px 0 0 0 var(--danger);   }
.row--processing { box-shadow: inset 3px 0 0 0 var(--info);     }
.row--neutral    { box-shadow: inset 3px 0 0 0 var(--text-secondary); }
.row--success-strong { box-shadow: inset 3px 0 0 0 var(--success-deep); }

/* Mobil-stack: svag bg-toning syns endast under 760px */
@media (max-width: 760px) {
  .row--success        { background: var(--success-soft); }
  .row--warning        { background: var(--warning-soft); }
  .row--danger         { background: var(--danger-soft);  }
  .row--processing     { background: var(--info-soft);    }
  .row--success-strong { background: var(--success-soft); }
}

/* Hover ska INTE radera radfärgen — bara förstärka den. */
.list-row.row--success:hover,
.list-row.row--warning:hover,
.list-row.row--danger:hover,
.list-row.row--processing:hover,
.list-row.row--neutral:hover,
.list-row.row--success-strong:hover,
.data-table tbody tr.row--success:hover,
.data-table tbody tr.row--warning:hover,
.data-table tbody tr.row--danger:hover,
.data-table tbody tr.row--processing:hover,
.data-table tbody tr.row--neutral:hover,
.data-table tbody tr.row--success-strong:hover { background: var(--hover-tint); }

/* Processing-pulse — diskret kant-färg-pulsning, inte bg, inte
   opacity, så raderna inte hoppar och desktop fortsatt utan bg. */
.row--processing {
  animation: row-pulse 1.8s ease-in-out infinite;
}
@keyframes row-pulse {
  0%, 100% { box-shadow: inset 3px 0 0 0 var(--info); }
  50%      { box-shadow: inset 3px 0 0 0 var(--blue-soft); }
}

/* Status-i-klartext i radens underrad (mobil-mönstret). Färg får
   INTE vara enda bäraren av status. */
.row-status-text {
  font-size: var(--fs-eyebrow);
  letter-spacing: .04em;
  color: var(--text-secondary);
  font-weight: 600;
}


/* ─── 16. View-chips ("Att hantera" / "Bokförda" / "Alla") ──── */

/* Tre primära vy-chipsen som filtrerar listan på statusgrupper.
   Mönstret ärvs av etapp 1-sidor (lev-fakturor, kundfakturor):
     • Default: "Att hantera" — alla statusar utom slutpunkter
     • "Bokförda" / motsvarande slutpunkt
     • "Alla"
   Statuschipsen från filter-row är finjustering inom vald vy.

   Klient-side filtrering (inte server-query) — listan hämtas en gång
   så räknare för andra vyer kan beräknas utan extra rundresor. */

.view-chips {
  display: flex;
  gap: var(--space-2);
  flex-wrap: wrap;
  margin-bottom: var(--space-3);
}


/* ─── 17. Kompaktare data-table--stack på mobil ─────────────── */

/* Override:ar och ersätter regelblocket i komponent #11.
   Standard uppdaterad (Etapp 0B-justeringen):
     • Mindre padding (12px) och gap (4px) per kort
     • data-mobile="hide" på en <td> döljer den helt på mobil
     • första cell-raden ska vara titel + belopp (titel-vänster,
       belopp-höger) — markup-konventionen är att titel-cellen INTE
       får data-label (den blir radens "namn") och beloppet får
       data-label="Belopp" men renderas till höger via td.text-right.
   Mål: ett kort ≈ 2 rader högt, flera kort per skärm. */

@media (max-width: 760px) {
  /* Kompaktare yttre padding och inre vertikal-rytm */
  .data-table--stack tbody tr {
    padding: var(--space-3);
    gap: 2px;
    margin-bottom: var(--space-2);
  }
  .data-table--stack tbody td {
    padding: var(--space-1) 0;
    font-size: var(--fs-body);
    line-height: 1.35;
  }
  .data-table--stack tbody td::before {
    font-size: 10px;
    letter-spacing: .12em;
  }
  /* Cell som ska vara dold på mobil */
  .data-table--stack tbody td[data-mobile="hide"] { display: none; }

  /* Cell utan data-label-värde (eller med tom data-label) renderas
     utan etiketten — för "titel-cellen" som inte vill ha "Datum:"-
     prefix. Inkluderar fall där data-label saknas helt. */
  .data-table--stack tbody td:not([data-label]),
  .data-table--stack tbody td[data-label=""] { display: flex; }
  .data-table--stack tbody td:not([data-label])::before,
  .data-table--stack tbody td[data-label=""]::before { content: none; }

  /* Höjd-/typografi-finish för title-cellen */
  .data-table--stack tbody td.cell-title {
    font-weight: 600;
    color: var(--text-primary);
    font-size: var(--fs-md);
  }
  /* Belopp till höger i samma kort på första raden (om passande
     plats) — receipts använder text-right på beloppscellen som
     redan finns. */
}

/* ── --tight: kompaktare mobilkort för korta, många rader ────
 *
 * Verifikat (och liknande historie-listor) har korta, ensartade
 * rader och tjänar på TÄTARE kort så att fler ryms per skärm.
 * Lev-fakturor/kvitton har längre rader och behåller den vanliga
 * densiteten. Sidor väljer densitet via klass:
 *   <table class="data-table data-table--stack data-table--stack--tight">
 *
 * --tight justerar vertikala rytmen + skalar ned underradens
 * typografi men ändrar INTE layout-strukturen — alla regler från
 * #11 + #17 fortsätter gälla. */
@media (max-width: 760px) {
  .data-table--stack.data-table--stack--tight tbody tr {
    padding: var(--space-2) var(--space-3);
    gap: 0;
    margin-bottom: var(--space-1);
  }
  .data-table--stack.data-table--stack--tight tbody td {
    padding: 1px 0;
    font-size: var(--fs-sm);
    line-height: 1.25;
  }
  .data-table--stack.data-table--stack--tight tbody td::before {
    font-size: 9px;
  }
  .data-table--stack.data-table--stack--tight tbody td.cell-title {
    font-size: var(--fs-body);
  }
  /* Underraden i cell-title är muted + ännu mindre på tight. */
  .data-table--stack.data-table--stack--tight tbody td.cell-title .row-sub {
    font-size: 11px;
    color: var(--text-secondary);
    margin-top: 1px;
  }
}


/* ─── 18. Layout-härdning mot innehållstryck (STANDARD) ───────
 *
 * Mobil-layout spricker när lång obruten text (felmeddelanden,
 * filnamn, base64-blob) flödar ut. Standard: ska vara OMÖJLIGT
 * för innehåll att spränga layouten oavsett status/textlängd.
 *
 *   • min-width: 0 på flex-barn — bryter default 'auto' som
 *     hindrar shrink under content-min-size och därmed expanderar
 *     föräldern utanför skärmen.
 *   • overflow-wrap: anywhere — låter textbrytning ske var som helst
 *     (inkl. mitt i ord), aggressivare än normal word-break.
 *   • max-width: 100% — sista skyddsnätet.
 *
 * Etapp 1: alla nya komponenter som tar emot text MÅSTE klara
 * det här testet — kasta in en 200-tecken-utan-mellanslag-sträng
 * och verifiera att raden inte sprängs.
 * ============================================================ */

.list-row,
.attest-row { min-width: 0; max-width: 100%; }

.list-row > *,
.attest-row > * { min-width: 0; }

.list-row__main, .list-row__title, .list-row__sub,
.attest-main, .attest-titel, .attest-sub,
.row-status-text,
.helper-text {
  min-width: 0;
  max-width: 100%;
  overflow-wrap: anywhere;
  word-break: break-word;
}

.data-table { table-layout: auto; max-width: 100%; }

/* DESKTOP-STANDARD (Etapp 0B runda 4):
 * Tabellceller bryter ALDRIG teckenvis som default — datum/belopp/
 * status/konto är formaterade och korta, ska visas som hela tokens.
 * Long-text-celler (titel/beskrivning) OPT-IN via .cell-title eller
 * .cell-text för att TILLÅTA brytning av extrema strängar (filnamn
 * utan mellanslag, base64, etc).
 *
 * Tidigare runda 2-regeln "overflow-wrap: anywhere på alla td" satte
 * datum-/beloppskolumner i teckenvis brytning ("20" / "26" / ...) på
 * klämda kolumnbredder — bytte alltså en bugg (mobil-spräng) mot en
 * annan (desktop-tecken-bryt). Den här standarden scopar regeln till
 * RÄTT celler. */
.data-table tbody td {
  min-width: 0;
  white-space: nowrap;
}

/* DESKTOP-DENSITET — NY BAS (#425):
 * Listor (verifikat, kvitton, lev-fakturor, kundfakturor m.fl.) är
 * ARBETSVERKTYG, inte läsupplevelser. Default-rytmen är därför KOMPAKT
 * på desktop — tätare radavstånd + mindre text → fler rader synliga,
 * mindre scroll, snabbare överblick.
 *
 * Override:ar de generella `thead th`/`tbody td`-baseline-värdena
 * (var(--space-3) var(--space-5) / var(--space-4) var(--space-5)) för
 * ALLA `.data-table`-konsumenter samtidigt. Per-sida-opt-in behövs
 * inte → migrerade listor ärver detta direkt utan markup-ändringar.
 *
 * Mobilstacken (.data-table--stack på <= 760px) håller fortfarande sin
 * generösare card-padding (touch-friendly + readability). --tight-
 * varianten kvarstår som mobil-extra-tät opt-in.
 *
 * Status-taggar/gem-ikon/row-färgskanten klipps inte: de har egen
 * inre padding/box-shadow och påverkas inte av cell-paddingen. Touch-
 * targets på checkboxar/btn-icon (>= 44px) styrs mobil-only i
 * .receipts-checkbox-col-blocket och påverkas inte heller. */
.data-table thead th {
  padding: var(--space-2) var(--space-3);
}
.data-table tbody td {
  padding: var(--space-2) var(--space-3);
  font-size: var(--fs-sm);
}

/* Text-tunga celler — opt-in till brytning. Används på Beskrivning/
   Anteckning/etc. */
.data-table tbody td.cell-text {
  white-space: normal;
  overflow-wrap: anywhere;
  word-break: break-word;
  max-width: 100%;
}

/* ⚠️⚠️ NAMNCELLEN KLIPPS MED ELLIPS — DEN BRYTS INTE.
 *
 * ⚠️ MÄTT FÖRE: ett namn på 200 tecken utan mellanslag gav i leverantörslistan
 * vid 1440 px en namnkolumn på 617 px och en rad på 98,6 px mot 48,5 px för en
 * vanlig rad — FEM rader text. Tabellen växte däremot INTE (1198 px = omslagets
 * 1198 px): #998:s `overflow-wrap: anywhere` band redan bredden, för en sträng
 * som får brytas var som helst har en minsta innehållsbredd på ett tecken.
 * Felet är alltså inte längre bredden utan HÖJDEN — en rad som sväljer två.
 *
 * ⚠️⚠️ VARFÖR PÅ `td.cell-title` OCH INTE I VARJE LISTA. #998 byggde
 * `.cell-title__namn` (ellips + title + min-width-kedjan) men hann bara sätta
 * den i leverantorsfakturor.js — EN av tjugoen namnceller. En fix i markupen
 * hade krävt tjugo ändringar och missat den tjugoförsta; regeln här når alla
 * genom klassen de redan delar. Listan som har komponenten påverkas inte: dess
 * cell innehåller element, och `text-overflow` verkar bara på cellens EGNA
 * inline-innehåll.
 *
 * ⚠️ `max-width` behövs. Med `nowrap` blir strängens minsta innehållsbredd hela
 * strängen igen, och då växer tabellen ut i `.table-wrapper`s rullning — precis
 * felet som fanns FÖRE #998. Gränsen binder kolumnen; ellipsen gör det läsbart.
 *
 * ⚠️ BESKRIVNINGSCELLER (`.cell-text`) BRYTS SOM FÖRUT. En beskrivning är
 * flerradig till sin natur; ett namn är det inte. */
.data-table tbody td.cell-title {
  max-width: 32ch;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Kryssrute-kolumn: fast smal bredd så rader MED och UTAN kryssruta
   får samma kolumnlayout. Andra kolumner stjäls inte utrymme av
   kryssrute-cellen. */
.data-table thead th.receipts-checkbox-col,
.data-table tbody td.receipts-checkbox-col,
.data-table thead th.list-row__check,
.data-table tbody td.list-row__check {
  width: var(--tap-target);
  min-width: var(--tap-target);
  padding: 0;
  text-align: center;
}

/* MOBIL-STACK: kortets celler är vertikalt staplade. Anywhere-brytning
   gäller BARA text-tunga celler (.cell-title / .cell-text) — så att
   långa filnamn/beskrivningar bryter rätt UTAN att identifierare
   (ver.nr/LF-nr), datum och belopp bryter teckenvis. Tidigare regel
   (anywhere på ALLA td) gav vertikalt staplade siffror i smala kort:
   bytte mobil-spräng-buggen mot en mobil-bryt-bugg. Den här är fixen.
   F12 (200-tecken-utan-mellanslag-test) körs mot .cell-title. */
@media (max-width: 760px) {
  .data-table--stack tbody tr { min-width: 0; max-width: 100%; }
  .data-table--stack tbody td.cell-text {
    white-space: normal;
    overflow-wrap: anywhere;
    word-break: break-word;
  }
  /* ⚠️⚠️ KORTET BINDS AV TABELLEN, INTE AV CELLEN — och det tog tre mätningar.
   *
   * `max-width: 100%` på cellen gav en tabell på 2290 px i ett 375 px fönster:
   * en procent räknas mot cellens egen box, och den boxen växer med innehållet.
   * `calc(100vw - 32px)` gav 369 px mot omslagets 327 — bättre, men fortfarande
   * en gissning om sidans marginaler.
   *
   * Rätt nivå är TABELLEN. I stacken är raderna kort, inte ett rutnät, så
   * kolumnfördelningen betyder ingenting: `table-layout: fixed` med `width:
   * 100 %` binder tabellen till omslaget, och då binder cellens procent i sin
   * tur namnet. En fix på cellnivå kunde aldrig nå dit. */
  .data-table--stack { table-layout: fixed; width: 100%; }
  .data-table--stack tbody td.cell-title { max-width: 100%; }
}

/* Underrader i cell-title som bär identifierare (ver.nr / LF-nr) får
 * ALDRIG brytas teckenvis — formaterat token-värde. Tag-elementen
 * bredvid (status-tag etc) har egen nowrap så hela enheten håller ihop
 * eller wrappar som ett block. */
.row-sub.cell-nr-mobil {
  white-space: nowrap;
  overflow-wrap: normal;
  word-break: normal;
}


/* ─── 19. Status-cell i tabell — egen smal kolumn på desktop ──
 *
 * STANDARD från Etapp 0B runda 2: status visas som EGEN smal
 * kolumn (litet, muted) i tabellen — namnet håller sig till en
 * rad. Mobil-stack:en behåller datum-och-status-på-rad-2-mönstret
 * via data-label.
 */
.cell-status {
  width: 120px;
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  white-space: nowrap;
}
@media (max-width: 760px) {
  .cell-status { width: auto; white-space: normal; }
}


/* ─── Filter-dropdown (std #25 reviderad) ───────────────────
 *
 * Panel: position fixed, position sätts via JS (anchored mot
 * triggern). Display defaultar till INGENTING — bara :not([hidden])
 * får display: flex. Tidigare regel `.filter-dropdown__panel
 * { display: flex }` övertrumfade UA-stylet `[hidden]
 * { display: none }` så panelen syntes ALLTID.
 *
 * Trigger: kan stå i th (region, desktop) eller filter-baren
 * (shell, mobil). Båda får samma `data-filter-dropdown-trigger=
 * "<panelId>"` så sidans delegerade handler hanterar dem identiskt.
 */
.filter-dropdown__trigger {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  background: transparent;
  border: 0;
  padding: 0;
  font: inherit;
  color: inherit;
  cursor: pointer;
  min-height: var(--tap-target);
}
.filter-dropdown__trigger:focus-visible {
  outline: 2px solid var(--info);
  outline-offset: 2px;
  border-radius: var(--radius);
}
.filter-dropdown__icon {
  width: 14px;
  height: 14px;
  opacity: 0.55;
  flex-shrink: 0;
}
.filter-dropdown__trigger.is-active .filter-dropdown__icon,
.filter-dropdown__trigger[aria-expanded="true"] .filter-dropdown__icon {
  opacity: 1;
  color: var(--info);
}
.filter-dropdown__count {
  font-size: var(--fs-sm);
  color: var(--info);
  font-weight: 600;
}

/* PANELEN — fixed position, position via JS. Default = utan display-
 * regel; `:not([hidden])` aktiverar flex. [hidden] behåller därmed
 * sitt UA-standardbeteende (display: none). */
.filter-dropdown__panel {
  position: fixed;
  z-index: 1000;
  min-width: 220px;
  max-width: min(320px, 90vw);
  background: var(--surface-card);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
  padding: 10px;
}
.filter-dropdown__panel:not([hidden]) {
  display: flex;
  flex-direction: column;
  gap: 0;
}
.filter-dropdown__panel label {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  font-size: var(--fs-body);
  font-weight: 400;
  color: var(--text-primary);
  white-space: nowrap;
  cursor: pointer;
  padding: 6px 0;
  /* Tap-target gäller BARA mobil (--mobile-trigger öppnar samma panel
   * — där behöver raderna tumvänlig höjd). Desktop använder pekare och
   * får vara tätare; en 7-statusars meny ska kännas som en meny, inte
   * en formulärsida. */
}
.filter-dropdown__panel label input { flex-shrink: 0; }
.filter-dropdown__panel .filter-dropdown__rensa {
  margin-top: 6px;
  align-self: flex-start;
  background: transparent;
  border: 0;
  padding: 4px var(--space-2);
  color: var(--info);
  cursor: pointer;
  font-size: var(--fs-sm);
}
.filter-dropdown__panel .filter-dropdown__rensa:hover { text-decoration: underline; }

/* Mobil-tap-target: tumvänlig höjd bara här. */
@media (max-width: 760px) {
  .filter-dropdown__panel label {
    min-height: var(--tap-target);
    padding: 8px 0;
  }
  .filter-dropdown__panel .filter-dropdown__rensa {
    min-height: var(--tap-target);
    padding: 8px var(--space-2);
  }
}

/* Mobil-trigger: kompakt knapp i filter-baren (eftersom <th> är dold
 * av .data-table--stack). Syns bara ≤760px. */
.filter-dropdown__trigger--mobile {
  display: none;
  padding: 6px var(--space-3);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--surface-card);
  min-height: 36px;
}
@media (max-width: 760px) {
  .filter-dropdown__trigger--mobile { display: inline-flex; }
}


/* ─── 20. Datum-filter (från/till) bredvid view-chips ────────── */

.filter-bar {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  flex-wrap: wrap;
  margin-bottom: var(--space-4);
}
.filter-bar__group {
  display: flex;
  align-items: center;
  gap: var(--space-2);
}

/* ⚠️⚠️ FILTREN FÄLLS IHOP PÅ MOBIL — 633 px innan första fakturan.
 *
 * Mätt vid 375 px: rubrik, «Registrera faktura», fyra chips, två datumfält,
 * sökfält, sorteringsväljare och en summarad tog 633 px INNAN första kortet.
 * På en lista med EN faktura började den under vikningen.
 *
 * ⚠️ DESKTOP FÄLLER INTE IHOP NÅGOT. Över 760 px räcker bredden för allt på en
 * rad, och en utfällning där hade varit ett extra klick utan vinst. Rubriken
 * göms och kroppen visas oavsett `open` — `<details>` respekterar `display`. */
.filter-bar__falla { display: contents; }
.filter-bar__falla-rub { display: none; }
/* ⚠️ På desktop är kroppen «genomskinlig»: dess barn blir direkta poster i
 * .filter-bar och raden ser exakt ut som förut. `is-oppen` spelar ingen roll
 * här — över 760 px fälls ingenting ihop. */
.filter-bar__falla-kropp { display: contents; }
@media (max-width: 760px) {
  .filter-bar__falla {
    display: block;
    width: 100%;
    border: 1px solid var(--line);
    border-radius: var(--radius);
    background: var(--surface-card);
  }
  .filter-bar__falla-rub {
    display: flex;
    width: 100%;
    background: none;
    border: none;
    text-align: left;
    align-items: center;
    gap: var(--space-2);
    padding: var(--space-2) var(--space-3);
    font-size: var(--fs-sm);
    font-weight: 600;
    color: var(--text-secondary);
    cursor: pointer;
    /* ⚠️ Tryckytan är hela raden, inte bara texten. */
    min-height: var(--tap-target);
  }
  /* ⚠️ «filter aktivt» till höger, i varningsfärg — den säger VARFÖR listan är
   * kortare än man väntade sig. Utan den är en tom lista oförklarlig. */
  .filter-bar__falla-markering {
    margin-left: auto;
    font-size: var(--fs-eyebrow);
    text-transform: uppercase;
    letter-spacing: .08em;
    color: var(--warning-deep);
  }
  /* ⚠️⚠️ HOPFÄLLD SOM FÖRVAL, UTFÄLLD MED KLASSEN. Att låta CSS äga
   * synligheten är hela skälet till att det inte är ett <details>: den taggen
   * döljer sitt innehåll själv, och den regeln går inte att häva över
   * brytpunkten. */
  .filter-bar__falla-kropp { display: none; }
  .filter-bar__falla.is-oppen .filter-bar__falla-kropp {
    display: flex;
    flex-direction: column;
    gap: var(--space-3);
    padding: 0 var(--space-3) var(--space-3);
  }
  /* Fälten tar hela bredden i utfällt läge — de delar ingen rad med något. */
  .filter-bar__falla-kropp .filter-bar__group { flex-wrap: wrap; }
  .filter-bar__falla-kropp .filter-date { flex: 1 1 0; min-width: 0; }
  .filter-bar__falla-kropp .filter-search { flex: 1 1 100%; min-width: 0; }
}
.filter-bar__label {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  font-weight: 500;
}
.filter-bar input[type="text"].filter-date {
  font-size: var(--fs-body);
  padding: 6px var(--space-3);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--surface-card);
  color: var(--text-body);
  min-height: 36px;
  width: 130px;
}
.filter-bar input[type="text"].filter-date:focus {
  outline: none;
  border-color: var(--info);
  box-shadow: var(--focus-ring);
}
@media (max-width: 480px) {
  .filter-bar input[type="text"].filter-date { width: 100%; }
  .filter-bar__group { width: 100%; flex-wrap: wrap; }
}

/* Generell filter-select (per-serie / per-kategori-dropdown) i filter-baren.
 * Samma höjd och kantformer som filter-date — visuell linje genom raden. */
.filter-bar select.filter-select {
  font-size: var(--fs-body);
  padding: 6px var(--space-3);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--surface-card);
  color: var(--text-body);
  min-height: 36px;
}
.filter-bar select.filter-select:focus {
  outline: none;
  border-color: var(--info);
  box-shadow: var(--focus-ring);
}
@media (max-width: 480px) {
  .filter-bar select.filter-select { width: 100%; }
}

/* Notice-banner med klickbar pil (t.ex. "Utkast att granska" → att-granska-vy).
 * Återanvänder .alert + .alert-info-tonen men beter sig som en knapp. */
.att-granska-banner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  width: 100%;
  margin-bottom: var(--space-4);
  cursor: pointer;
  text-align: left;
  font: inherit;
}
.att-granska-banner__chevron {
  font-size: var(--fs-lead);
  line-height: 1;
}

/* Diskret summarad i filter-baren (std #23 — listsidor får en summa när den
 * tillför något utöver chips-räknarna). Aldrig stat-kort-markup. */
.filter-bar__summary {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  margin-left: auto;
  white-space: nowrap;
}
@media (max-width: 760px) {
  .filter-bar__summary {
    width: 100%;
    margin-left: 0;
  }
}


/* ─── 21. Knapp-hierarki STANDARD för detaljvyer ──────────────
 *
 * STANDARD: Auto-bredd inline på desktop, full bredd i mobil-
 * stack (<=760px). Höjd kvar 44px (--tap-target).
 *
 * Hierarki per detalj-vy:
 *   • Primär (1 max)        — .btn-primary, höger i actions-rad
 *   • Sekundär outline     — .btn-secondary (Spara, neutral handling)
 *   • Flödesåtgärd (varning) — .btn-warning (Avvisa) — outline amber
 *   • Destruktiv (1 max)    — .btn-ghost-danger separerad LÄNGST VÄNSTER
 *                             — röd text utan fyllnad, in-app confirm.
 *
 * REGEL: max EN röd åtgärd per vy. Aldrig två destruktivt-lika
 * intill varandra (Avvisa + Radera bredvid varandra → Avvisa
 * blir warning, Radera blir ghost-danger).
 */

/* Auto-bredd på desktop — knappar tar bara plats för innehållet */
.btn { width: auto; }

/* ⚠️⚠️ UTOM IKONKNAPPEN, SOM ÄR EN KVADRAT — och som raden ovan tyst släppte.
 *
 * `.btn-icon` sätter `width: var(--tap-target)` långt ovanför, med samma
 * specificitet. Den här raden ligger senare i filen och vann därför på ordning
 * ensam: varje knapp med både `.btn` och `.btn-icon` fick `width: auto`, alltså
 * sitt innehåll. Ikonen är 18 px.
 *
 * ⚠️ MÄTT I CHROMIUM på inkorgens åtgärdsrad vid 1280 px: papperskorgen blev
 * 20 px bred — höjden stod kvar på 44, så felet såg ut som en smal knapp och
 * inte som en halverad träffyta. 44 px är tumtrycket, inte en åsikt (WCAG).
 *
 * ⚠️ SPECIFICITETEN LÖSER DET, INTE ORDNINGEN. Att flytta `.btn-icon` hit ned
 * hade fungerat tills nästa rad om `.btn` skrivs under den. */
.btn.btn-icon { width: var(--tap-target); }

.btn-stack {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  flex-wrap: wrap;
}
.btn-stack--space-between { justify-content: space-between; }
.btn-stack__sep { flex: 1; }

@media (max-width: 760px) {
  /* I mobil-stack: knappar full bredd, stackade vertikalt.
     Radera-knappen (ghost-danger) hamnar sist via visuell
     separation (margin-top eller flex-order). */
  .btn-stack {
    flex-direction: column;
    align-items: stretch;
    gap: var(--space-2);
  }
  .btn-stack__sep { display: none; }
  .btn-stack .btn { width: 100%; }
  /* Säkerställ att destruktiv ligger sist på mobil oavsett DOM-ordning */
  .btn-stack .btn-ghost-danger { order: 99; margin-top: var(--space-3); }
}

/* Outline-warning — amber text + kant, för flödesåtgärder som
   "Avvisa". Inte röd eftersom det är ett FLÖDE, inte destruktivt. */
.btn-warning {
  background: transparent;
  color: var(--warning-deep);
  border-color: var(--warning);
}
.btn-warning:hover {
  background: var(--warning-soft);
  border-color: var(--warning-deep);
}
.btn-warning:focus-visible {
  box-shadow: 0 0 0 3px rgba(245,158,11,.30);
}

/* Ghost-danger — röd text utan fyllnad, för destruktiv åtgärd
   som "Radera". Endast EN per vy. */
.btn-ghost-danger {
  background: transparent;
  color: var(--danger-deep);
  border-color: transparent;
}
.btn-ghost-danger:hover {
  background: var(--danger-soft);
  color: var(--danger-deep);
}
.btn-ghost-danger:focus-visible {
  box-shadow: 0 0 0 3px rgba(220,38,38,.30);
}


/* ─── 22. Form-spacing STANDARD (Etapp 0B runda 3) ───────────
 *
 * Strammare luft mellan formulär-rader och fält. Använt av
 * receipts-detalj.js + framtida etapp 1-2 sidor. Riktmärke: tät
 * men läsbar, label nära sitt fält, sektioner skiljs med måttlig
 * luft — INTE dubbla tomrader.
 *
 * Vänta med .form-group / .form-row komplett mönster till etapp 1
 * (de behöver mer designarbete). Detta är en första standard som
 * stramar åt visning av befintliga utskrifter.
 */

/* Lägre vertikal rytm i formulär — ärvs av <form>-noder med
   klassen .form-stack samt vissa befintliga detalj-formulär. */
.form-stack,
.receipt-edit-form {
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}
.form-stack > label,
.receipt-edit-form > label {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
  font-size: var(--fs-sm);
  font-weight: 500;
  color: var(--text-secondary);
}
.form-stack > label > input,
.form-stack > label > select,
.form-stack > label > textarea,
.receipt-edit-form > label > input,
.receipt-edit-form > label > select,
.receipt-edit-form > label > textarea {
  font-size: var(--fs-body);
  color: var(--text-body);
}
/* Sektions-separator: lägg .form-section runt ett block av
   relaterade fält så får det måttlig luft ovanför, ALDRIG dubbla
   tomrader. */
.form-section { margin-top: var(--space-5); }
.form-section + .form-section { margin-top: var(--space-6); }


/* ─── 23. Bulk-checkbox touch-target ─────────────────────────
 *
 * Mobil-spec: kryssrutor minst 44px touch-yta. Själva input:t
 * kan visuellt vara 20-24px — det är PADDING runt som lyfter
 * träffytan utan att flytta layouten.
 */
.receipts-checkbox-col input[type="checkbox"],
.list-row__check input[type="checkbox"] {
  width: 20px;
  height: 20px;
  cursor: pointer;
  margin: 0;
}
@media (max-width: 760px) {
  .receipts-checkbox-col,
  .list-row__check {
    min-width: var(--tap-target);
    min-height: var(--tap-target);
    display: flex;
    align-items: center;
    justify-content: center;
  }
}


/* ─── 24. Sortering — desktop th-rubriker, mobil select ─────
 *
 * STANDARD i tabell-mönstret. Etapp 1-listor (lev-fakturor, kund-
 * fakturor) ärver detta direkt.
 *
 * Desktop: klickbara th med data-sort="<field>". Aktiv kolumn får
 * aria-sort="ascending|descending" + synlig pil-indikator.
 *
 * Mobil: <select class="sort-mobile"> i filter-baren. Delad state
 * — samma sort-param i URL driver båda.
 *
 * Default: datum fallande (nyast först). Endast EN aktiv kolumn.
 */

.data-table thead th[data-sort] {
  cursor: pointer;
  user-select: none;
  position: relative;
  padding-right: var(--space-6);
  transition: color .12s ease;
}
.data-table thead th[data-sort]:hover { color: var(--text-primary); }
.data-table thead th[data-sort]:focus-visible {
  outline: none;
  box-shadow: var(--focus-ring);
  border-radius: var(--radius);
}

.sort-indicator {
  position: absolute;
  right: var(--space-3);
  top: 50%;
  transform: translateY(-50%);
  font-size: 11px;
  line-height: 1;
  opacity: 0;
  transition: opacity .12s ease;
  color: var(--text-secondary);
}
.data-table thead th[data-sort]:hover .sort-indicator { opacity: .45; }
.data-table thead th[aria-sort] .sort-indicator { opacity: 1; color: var(--info-deep); }

/* Mobil-sort-select i filter-baren. Döljs på desktop, syns på <=760px
   eftersom tabell-rubrikerna då är gömda av .data-table--stack. */
.sort-mobile { display: none; }
@media (max-width: 760px) {
  .sort-mobile {
    display: inline-flex;
    align-items: center;
    gap: var(--space-2);
    font-size: var(--fs-sm);
    color: var(--text-secondary);
  }
  .sort-mobile select {
    font-size: var(--fs-body);
    padding: 6px var(--space-3);
    border: 1px solid var(--line);
    border-radius: var(--radius);
    background: var(--surface-card);
    color: var(--text-body);
    min-height: 36px;
  }
}


/* ─── 25. Paginering — klient-side pipeline ─────────────────
 *
 * STANDARD i tabell-mönstret. Pipeline: filtrera → sortera →
 * paginera. Sidstorlek 20/50/100 (default 20). Vy-chip-räknare
 * speglar TOTALEN efter filter, inte synlig sida.
 *
 * Mobil ≤760px: numrerade sidor + sidstorleks-väljare döljs.
 * Kvar: prev/next + "X av Y". Touch-targets ≥44px på knapparna.
 */

.pagination {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-4);
  flex-wrap: wrap;
  margin-top: var(--space-4);
  padding: var(--space-3) 0;
}
.pagination__info {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
}
.pagination__page-size {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  font-size: var(--fs-sm);
  color: var(--text-secondary);
}
.pagination__page-size select {
  font-size: var(--fs-body);
  padding: 4px var(--space-3);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--surface-card);
  color: var(--text-body);
  min-height: 36px;
}
.pagination__nav {
  display: flex;
  align-items: center;
  gap: var(--space-2);
}
.pagination__pages {
  display: inline-flex;
  align-items: center;
  gap: 4px;
}
.pagination__page {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: var(--tap-target);
  min-height: var(--tap-target);
  padding: 0 var(--space-3);
  border-radius: var(--radius);
  background: transparent;
  border: 1.5px solid transparent;
  font-family: var(--font-body);
  font-size: var(--fs-body);
  font-weight: 500;
  color: var(--text-body);
  cursor: pointer;
  transition: background .12s, border-color .12s, color .12s;
}
.pagination__page:hover { background: var(--hover-tint); }
.pagination__page--active {
  background: var(--info);
  border-color: var(--info);
  color: var(--paper);
  font-weight: 600;
}
.pagination__page--active:hover { background: var(--info-deep); }
.pagination__page--ellipsis {
  cursor: default;
  color: var(--text-secondary);
}
.pagination__page--ellipsis:hover { background: transparent; }
.pagination__nav .btn:disabled,
.pagination__page:disabled {
  opacity: .4;
  cursor: not-allowed;
  pointer-events: none;
}

/* ⚠️⚠️ HOPPFÄLTET ERSÄTTER SIDNUMREN — och bara där de faktiskt döljs. Över
 * brytpunkten finns sidnumren, och två vägar till samma sida är en väg för
 * mycket. Fältet ritas bara av anropare som ber om det (`sidhopp: true`), så
 * regeln kan inte påverka en vy som inte har det. */
.pagination__hopp { display: none; align-items: center; gap: 6px; font-size: var(--fs-sm); }
.pagination__hopp input {
  width: 3.5em; text-align: center; padding: 6px 8px;
  min-height: var(--tap-target);
  border: 1px solid var(--line); border-radius: var(--radius);
  font: inherit; font-variant-numeric: tabular-nums;
}

@media (max-width: 760px) {
  .pagination { gap: var(--space-3); }
  .pagination__page-size { display: none; }
  .pagination__pages { display: none; }
  /* ⚠️ #877: det som DÖLJS måste ha en ersättare som SYNS. Sidnumren
   * försvann här utan att något trädde in — med 438 rader och 50 per sida är
   * sida 6 sju klick bort med bara Föregående/Nästa. */
  .pagination__hopp { display: flex; }
  .pagination__info {
    flex: 1;
    text-align: center;
    font-size: var(--fs-sm);
  }

  /* ⚠️ TUMNÅBARHET. Mätt vid 375px före den här regeln: Föregående/Nästa
     36,0px och sorterbara kolumnrubriker 35,2px — under --tap-target (44px,
     WCAG). På desktop pekar man med en muspekare på några pixlar; på telefon
     med en tumme på ~10 mm, och 36px är inte en träffyta utan en chansning.

     ⚠️ REGELN SITTER PÅ DEN DELADE MARKUPEN, inte på komponentfilen.
     .pagination och th[data-sort] skrivs av lib/list-tabell.js OCH av de sju
     egna kopiorna av mönstret (bokforing, fakturering, leverantorsfakturor,
     receipts, betalningar, anlaggningsregister, anstallda). Alla åtta får
     alltså tumnåbara kontroller av samma tre deklarationer — ingen av
     JS-filerna rörs. Att i stället scopa till komponenten hade gett två
     listor med 44px och sex med 36px i samma app.

     Bara padding och min-height ändras: kolumnbredder, radhöjder och
     kolumnantal står still, så inget layoutbrott i de breda vyerna. */
  .pagination__nav .btn { min-height: var(--tap-target); }
  /* height på en tabellcell är enligt spec ett MINIMUM, inte ett tak — raden
     växer om innehållet är högre. Därför inte padding: en fast padding hade
     behövt räknas om varje gång radtypografin ändras. */
  .data-table thead th[data-sort] { height: var(--tap-target); }
}


/* ─── 26. Bulk-bar — info om val rensat vid sidbyte ────────── */

.bulk-action-bar__notice {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  font-style: italic;
}

/* Desktop vs mobil-text växling i .pagination__info */
.pagination__info-mobile { display: none; }
@media (max-width: 760px) {
  .pagination__info-desktop { display: none; }
  .pagination__info-mobile  { display: inline; }
}


/* ─── 27. Bulk är desktop-mönster — mobil använder detaljvyn ──
 *
 * STANDARD (Etapp 0B runda 5):
 *   • Bulk-åtgärder (mass-markera + mass-bokföra) är ett DESKTOP-
 *     mönster. Touch-flöden på mobil är inte rustade för flerklicks-
 *     val — bättre att konsulten öppnar kvitton ett i taget i
 *     detaljvyn där bokföring redan finns (PR #399 standard #13).
 *   • Kryssrute-kolumnen DÖLJS helt på mobil i .data-table--stack.
 *     Kortet blir kompakt och fri från ett extra meta-fält.
 *   • Bulk-action-bar DÖLJS helt på mobil — ingen "Bokför valda"-knapp.
 *
 * Etapp 1 ärver: lev-fakturor/kundfakturor som inför bulk får samma
 * desktop-only-behandling.
 */
@media (max-width: 760px) {
  .data-table--stack thead th.receipts-checkbox-col,
  .data-table--stack tbody td.receipts-checkbox-col,
  .data-table--stack thead th.list-row__check,
  .data-table--stack tbody td.list-row__check { display: none; }

  /* Bulk-bar gömd helt — varken vid markering eller notice */
  .bulk-action-bar { display: none; }
  .bulk-action-bar__notice { display: none; }
}


/* ─── 28. Sök-input i filter-bar ─────────────────────────────── */

.filter-bar input[type="search"].filter-search {
  font-size: var(--fs-body);
  padding: 6px var(--space-3);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--surface-card);
  color: var(--text-body);
  min-height: 36px;
  width: auto;
  min-width: 200px;
}
.filter-bar input[type="search"].filter-search:focus {
  outline: none;
  border-color: var(--info);
  box-shadow: var(--focus-ring);
}
@media (max-width: 480px) {
  .filter-bar input[type="search"].filter-search { width: 100%; }
}


/* ═══ ETAPP 2 — DETALJVY-KOMPONENTER (pilot: kundfaktura-detalj) ═══ */

/* ─── 26. Modal-storlekar (std) ───────────────────────────────
 *
 * Basen .modal (style.css) har max-width: 560px. Varianterna sätter
 * explicit storlek per användning:
 *   --sm  480px — bekräftelser med ett fält (skäl-textarea, datum)
 *   --md  680px — formulär med rader (ny faktura)
 *   --lg  840px — breda tabeller / förhandsvisning
 *
 * Mobil ≤760px: alla modal-storlekar går till nära-fullskärm med
 * 100dvh-beteendet från inkorgens preview-modal (dvh hanterar
 * mobil-browserns adressfält korrekt; vh klipper). */
.modal--sm { max-width: 480px; }
.modal--md { max-width: 680px; }
.modal--lg { max-width: 840px; }
@media (max-width: 760px) {
  .modal--sm, .modal--md, .modal--lg {
    max-width: 100%;
    width: 100%;
    max-height: 100dvh;
    border-radius: 0;
  }
  .modal-overlay:has(.modal--sm),
  .modal-overlay:has(.modal--md),
  .modal-overlay:has(.modal--lg) {
    padding: 0;
    align-items: stretch;
  }
}

/* ─── 27. Form-standard: .form-section / .form-group / .form-row ──
 *
 * Kompletterar #22-utkastet (form-stack). Tät men läsbar:
 *   .form-section — grupp av relaterade fält med sektionsluft
 *   .form-group   — label + kontroll + ev. hjälptext/fel
 *   .form-row     — flera form-groups sida vid sida, kollapsar på mobil
 *
 * Alla inputs i .form-group är 100 % breda inom sin grupp (mobil
 * B-klass: inga fasta bredder som spränger små skärmar). */
.form-row {
  display: flex;
  gap: var(--space-3);
  flex-wrap: wrap;
}
.form-row > .form-group {
  flex: 1 1 180px;
  min-width: 0;
  margin-bottom: 0;
}
.form-row + .form-row,
.form-row + .form-group,
.form-group + .form-row { margin-top: var(--space-3); }
.form-group > input,
.form-group > select,
.form-group > textarea {
  width: 100%;
  max-width: 100%;
}
/*
 * Ett fält med en åtgärd bredvid sig — t.ex. org.nr + «Hämta från Bolagsverket».
 *
 * ⚠️⚠️ TRE REGLER SKREVS, EN ÖVERLEVDE PROBNINGEN. Utöver den här hade blocket
 * `> input { flex: 1 1 auto; min-width: 0 }` och `> .btn { flex: 0 0 auto;
 * white-space: nowrap }`. Båda togs bort en i taget med provet igång — på
 * 1440 px OCH på 390 px — och INGEN av dem fällde något: fältet fyller raden och
 * knappen ryms ändå, för bredden kommer från reglerna ovan. Att låta dem stå
 * kvar hade varit tre rader som ser ut som ett skydd och inte är det.
 *
 * ⚠️ DEN HÄR RADEN ÄR MÄTT NÖDVÄNDIG: tas hela blocket bort faller
 * test/browser/bolagsverket-forhandsvisning.browser.test.ts — utan flex hamnar
 * knappen under fältet i stället för bredvid.
 */
.falt-med-knapp {
  display: flex;
  gap: var(--space-2);
  align-items: center;
}
/* Valet mellan registrets och fakturans värde, per uppgift. */
.avvikelse-val {
  display: flex;
  gap: var(--space-2);
  align-items: baseline;
  cursor: pointer;
}
.ai-kort__avvikelser { margin-top: var(--space-3); }

/* Valet mellan flera verksamheter på samma identitetsbeteckning. */
.bv-val {
  display: flex;
  gap: var(--space-2);
  align-items: baseline;
  padding: 2px 0;
}
.form-group .form-error {
  margin-top: var(--space-1);
  font-size: var(--fs-sm);
  color: var(--danger-deep);
}
.form-group .helper-text { margin-top: var(--space-1); }
/* type="search" ingår INTE i style.css:s globala fältregel (att lägga till
 * den globalt skulle övertrumfa .reg-search m.fl. — specificitet 0-1-1 mot
 * 0-1-0). Scopa i stället till .form-group så sökfält i formulärstandarden
 * får samma utseende som övriga fält (lager-listans sökruta, #720). */
/* Lager-formulärens fältrader (#720-styling): .form-group i inline-layouter
 * (flex med align-items:end / täta grids) — global margin-bottom:16px skulle
 * feljustera fält mot knappar i end-justerade rader (jfr .bk-modal-grid). */
.lager-faltrad .form-group { margin-bottom: 0; }
.form-group > input[type="search"] {
  padding: 9px 12px;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  font-size: 13.5px;
  font-family: var(--font-body);
  color: var(--text);
  background: var(--paper);
  transition: border-color .15s, box-shadow .15s;
  outline: none;
}

/* ─── 28. Meta-grid — etikett/värde-rutnät för detaljvyer ─────
 *
 * Generaliserad .kfd-meta-grid: 3 kolumner desktop, 2 på surfplatta,
 * 1 på mobil. Etikett som overline, värde i brödtext.
 *
 * Etapp 2-skala: detaljvyer är ARBETSYTOR, inte landningssidor —
 * tätare vertikal rytm än stat-grid. */
.meta-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-3) var(--space-5);
  margin-bottom: var(--space-4);
}
.meta-grid__label {
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .5px;
  color: var(--text-secondary);
  margin-bottom: 2px;
}
.meta-grid__value {
  font-size: var(--fs-body);
  color: var(--text-primary);
  overflow-wrap: anywhere;
  min-width: 0;
}
.meta-grid__value .meta-grid__sub {
  color: var(--text-secondary);
  font-size: var(--fs-sm);
}
@media (max-width: 760px) {
  .meta-grid {
    grid-template-columns: repeat(2, 1fr);
    gap: var(--space-3);
  }
}
@media (max-width: 480px) {
  .meta-grid {
    grid-template-columns: 1fr;
    gap: var(--space-2);
  }
}

/* ─── 29. Summary-stack — högerställda summeringsrader ────────
 *
 * Generaliserad .kfd-summor: label/value-par i högerkolumn med
 * totalrad markerad via border-top. Tabular-nums för belopp.
 * Tätare än landningssidans stat-rader. */
.summary-stack {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: var(--space-1);
  padding: var(--space-3) 0;
}

/* VMB-märkning på avyttringsfaktura (lagkrav 9a kap ML) — visas tydligt
   under summeringen. Faktatext, ej hjälptext. */
.kfd-vmb-markning {
  margin-top:    var(--space-3);
  padding:       var(--space-2) var(--space-3);
  border-left:   3px solid var(--warning-deep);
  background:    var(--warning-soft);
  color:         var(--warning-deep);
  border-radius: var(--radius);
  font-size:     var(--fs-sm);
  font-weight:   500;
}
.summary-stack__row {
  display: flex;
  gap: var(--space-6);
  font-size: var(--fs-body);
}
.summary-stack__label {
  color: var(--text-secondary);
  min-width: 110px;
  text-align: right;
}
.summary-stack__value {
  min-width: 100px;
  text-align: right;
  font-variant-numeric: tabular-nums;
}
.summary-stack__row--total {
  font-weight: 700;
  font-size: var(--fs-md);
  border-top: 2px solid var(--line);
  padding-top: var(--space-2);
  margin-top: 2px;
}

/* ─── 30. Detaljvy-header: nyckelvärde + tillbaka-länk ────────
 *
 * .page-header__keyvalue — detaljvyns viktigaste siffra (totalbelopp)
 * synlig direkt i headern utan scroll. Fraunces, men SKALAD NER
 * mot stat-value: detaljvyer är arbetsytor, totalen ska vara synlig
 * men inte dominerande.
 *
 * .back-link — diskret tillbaka-navigation ovanför page-header.
 * EN navigationsväg per vy (ingen Stäng-dubblett). */
.page-header__keyvalue {
  font-family: var(--font-heading);
  font-size: clamp(1.4rem, 2.6vw, 1.7rem);
  font-weight: 600;
  color: var(--ink);
  letter-spacing: -.015em;
  line-height: 1.15;
  text-align: right;
  white-space: nowrap;
}
.page-header__keyvalue-label {
  display: block;
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  font-family: var(--font);
  text-transform: uppercase;
  letter-spacing: .5px;
  color: var(--text-secondary);
  margin-bottom: 2px;
}
.back-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: var(--text-secondary);
  font-size: var(--fs-sm);
  text-decoration: none;
  margin-bottom: var(--space-3);
}
.back-link:hover { color: var(--text-primary); }

/* ─── 31. Detaljvyns åtgärdsrad (knapp-hierarki #21) ──────────
 *
 * .detail-actions — destruktiv åtgärd (ghost-danger) längst till
 * vänster, separerad; flödesåtgärder + primär till höger.
 * Mobil: ärver .btn-stack-mönstret (full bredd, destruktiv sist). */
.detail-actions {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  flex-wrap: wrap;
  margin-bottom: var(--space-4);
}
.detail-actions__destructive { margin-right: auto; }
@media (max-width: 760px) {
  .detail-actions { flex-direction: column; align-items: stretch; }
  .detail-actions .btn { width: 100%; }
  .detail-actions__destructive { margin-right: 0; order: 99; margin-top: var(--space-3); }
}

/* ─── 32. Modal-formulärets hjälpklasser (ny/redigera faktura) ──
 *
 * .form-group--anchor — position-context för autocomplete-dropdown
 * (kund-sök).
 *
 * .kf-rader-tabell är ny-/redigera-faktura-modalens rad-tabell.
 * Den ÄRVER .data-table--stack-beteendet på mobil (samma standard
 * som detaljvyns radtabell, std #33).
 *
 * KOLUMNBREDDER (desktop): beskrivning flytande; antal/à-pris
 * snäva men läsbara; moms-kolumnen RYMMER "25 %" inom selecten utan
 * att klippa; belopp högerställd nowrap; ta-bort-kolumnen är fast
 * tap-target-bredd. */
/* ══ Kundfaktura-formuläret ════════════════════════════════════════════════
 * ⚠️ HÖJDEN ÄR NEDSKUREN INOM FORMULÄRET, inte i plattformens fältstil. Samma
 * innehåll på mindre yta gör att hela formuläret ryms utan att rulla på en
 * vanlig skärm; att ändra fälthöjden globalt vore en annan ändring med en
 * annan räckvidd. */
.kf-form .form-group > input,
.kf-form .form-group > select {
  min-height: 36px;
  padding-top: 5px;
  padding-bottom: 5px;
}
.kf-form .form-group > label { margin-bottom: 2px; }

/* ⚠️ FYRA FÄLT PÅ TOPPRADEN. `flex: 1 1 180px` låter fälten radbryta till två
 * och två så fort raden blir smalare än ~760 px; på en vanlig skärm ska de
 * fyra stå bredvid varandra, och kursfältet lägger sig först när valutan
 * kräver det. */
.kf-form .form-row--4 > .form-group { flex: 1 1 0; min-width: 150px; }

/* Serien fakturan bokförs i — står överst, före första fältet. */
.kf-serie {
  margin: 0 0 var(--space-3);
  font-size: var(--fs-sm);
  color: var(--text-muted);
}
.kf-serie__forval { color: var(--warning-text); }

/* Sammanfattningen i panelens rubrikrad — svarar utan att man öppnar. */
.kf-sekt-sam {
  margin-left: auto;
  padding-right: var(--space-2);
  font-size: var(--fs-sm);
  color: var(--text-muted);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-width: 0;
}

/* Summeringsrutan — högerställd, och den visar HUR beloppet blev till. */
.kf-summa { display: flex; justify-content: flex-end; margin-top: var(--space-3); }
.kf-summa__ruta {
  min-width: 260px;
  padding: var(--space-3);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--surface-card);
}
.kf-summa__rad {
  display: flex;
  justify-content: space-between;
  gap: var(--space-3);
  padding: 2px 0;
  font-size: var(--fs-sm);
}
.kf-summa__tot {
  margin-top: var(--space-2);
  padding-top: var(--space-2);
  border-top: 1px solid var(--line);
  font-size: var(--fs-body);
}

/* ⚠️ «Saknas» är ett BESKED, inte ett värde — det ska synas som ett sådant.
 * Titeln på cellen säger vilken momskod och radtyp som saknar konto och var
 * cellen fylls i; «– saknas –» sa ingetdera. */
.kf-rader-tabell .r-konto--saknas { color: var(--warning-text); }

/* ── E-fakturans hinderrad i kundfakturans detaljvy ─────────────────────────
 * ⚠️⚠️ EN RAD, INTE EN PANEL. Panelen tog halva skärmen ovanför fakturaraderna
 * — det man öppnat vyn för att se — för information som oftast är «ingenting
 * att göra». Raden ritas bara när något HINDRAR sändningen. */
.kfd-ef-rad {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  flex-wrap: wrap;
  margin: var(--space-3) 0;
  padding: var(--space-2) var(--space-3);
  /* ⚠️ Endast definierade variabler — en fallback räddar deklarationen men
   *    gör hexen till den faktiska färgen, och då ligger färgvalet här i
   *    stället för i tokens.css. */
  border: 1px solid var(--danger-deep);
  border-left-width: 3px;
  border-radius: var(--radius);
  background: var(--danger-bg);
  font-size: var(--fs-sm);
}
.kfd-ef-rad__mark { color: var(--danger-text); }
/* ⚠️ `min-width: 0` — utan den kan texten inte krympa, och raden spiller i
 *    sidled på en smal skärm i stället för att brytas. */
.kfd-ef-rad__text { flex: 1 1 260px; min-width: 0; }
.kfd-ef-rad__regel {
  margin-left: var(--space-2);
  font-size: var(--fs-xs);
  color: var(--text-muted);
}

.form-group--anchor { position: relative; }

/* ⚠️⚠️ TABELLEN HAR EN MINSTA BREDD, och regionen runt den rullar i sidled.
 * Utan minsta bredd krymper Beskrivning till NOLL på en smal skärm — mätt vid
 * 900 px: kolumnen blev 0 px och fältet 18 px. En kolumn som försvinner är
 * värre än en rullist; vid 1280 px och uppåt ryms allt och regionen rullar
 * inte alls. 234 px är beskrivningens minsta läsbara bredd; resten är
 * kolumnernas fasta mått (64+110+96+140+110+110+44). */
/* ⚠️ `min-width: 0` är det som gör att regionen RULLAR i stället för att växa.
 * Utan den sträcker sig regionen till tabellens minsta bredd och skjuter hela
 * SIDAN i sidled — mätt vid 900 px: 276 px sidspill och noll rullning i
 * regionen. Ett flex/grid-barn har `min-width: auto` som standard. */
.kf-rader-region { overflow-x: auto; max-width: 100%; min-width: 0; }
.kf-rader-tabell { table-layout: fixed; width: 100%; min-width: 908px; }
/* ⚠️⚠️ REGLERNA LÅG EN KOLUMN FEL. Konto-kolumnen lades till mellan Moms och
 * Belopp, men nth-child-reglerna flyttades inte med: nth-child(6) pekade på
 * Konto och Belopp föll utan bredd. Mätt vid 1280 px: Beskrivning och Belopp
 * delade på 209 px var, och vid 900 px kollapsade båda till 27 px.
 * Kolumnnumren nedan står mot rubrikraden i kundfaktura-formular.js:
 * 1 Beskrivning · 2 Antal · 3 Enhet · 4 À-pris · 5 Moms · 6 Konto · 7 Belopp. */
.kf-rader-tabell th:nth-child(2), .kf-rader-tabell td:nth-child(2) { width: 64px; }   /* Antal */
.kf-rader-tabell th:nth-child(3), .kf-rader-tabell td:nth-child(3) { width: 110px; position: relative; }   /* Enhet (fritext + autocomplete) */
.kf-rader-tabell th:nth-child(4), .kf-rader-tabell td:nth-child(4) { width: 96px; }   /* À-pris */
/* ⚠️⚠️ MOMSVÄLJAREN MÅSTE RYMMA MOMSKODENS NAMN. Kolumnen var 92 px och
 * väljaren 68 px, medan den längsta etiketten («Försäljning 25 %») kräver
 * 97 px ren text — alltså klipptes koden mitt i. Att i stället visa bara
 * satsen vore värre: FORS_25 och EU_MOMSPLIKTIG_25 har samma sats men olika
 * konton, och två olika koder som ser likadana ut i väljaren är ett fel som
 * inte går att upptäcka på ytan. 140 px = 97 text + väljarens pil + cellens
 * padding. */
.kf-rader-tabell th:nth-child(5), .kf-rader-tabell td:nth-child(5) { width: 140px; }   /* Moms */
.kf-rader-tabell th:nth-child(6), .kf-rader-tabell td:nth-child(6) { width: 110px; }  /* Konto */
.kf-rader-tabell th:nth-child(7), .kf-rader-tabell td:nth-child(7) { width: 110px; white-space: nowrap; }  /* Belopp */
.kf-rader-tabell .kf-rader__rm { width: var(--tap-target); text-align: center; }
/* ⚠️⚠️ CELLENS EGEN PADDING FÅR INTE LIGGA UTANPÅ TAP-TARGETEN. Ta-bort-cellen
 * är exakt en tap-target bred, och knappen inuti är också det — med cellens
 * 6px/var(--space-2)-padding sköt knappen ut 12 px utanför tabellen och gav en
 * VÅGRÄT RULLIST VID VARJE BREDD, mätt 900, 1280, 1440 och 1920 px. Det var
 * inte beskrivningsfältet som tvingade fram rullisten. */
.kf-rader-tabell td.kf-rader__rm { padding-left: 0; padding-right: 0; }

.kf-rader-tabell td { padding: 6px var(--space-2); }
.kf-rader-tabell td input,
.kf-rader-tabell td select {
  width: 100%;
  max-width: 100%;
  padding: 6px var(--space-2);
  font-size: var(--fs-sm);
}
/* Belopp-cellen visar bara text — inget input-padding. */
.kf-rader-tabell td .r-belopp { font-size: var(--fs-sm); }
/* Ta-bort-knappen ärver btn-icon (≥44px tap-target). */
.kf-rader-tabell .btn-rm { width: var(--tap-target); min-height: var(--tap-target); }
/* Teckenräknaren under beskrivningen — syns bara nära gränsen, och ska inte
 * växa raden när den tänds (den ligger i en cell som redan har luft under). */
.kf-rader-tabell .r-besk-kvar {
  margin-top: 2px;
  font-size: var(--fs-xs);
  line-height: 1.2;
}
.kf-rader-tabell .r-text-kvar {
  margin-top: 2px;
  font-size: var(--fs-xs);
  line-height: 1.2;
}

/* ── Textraden: en cell över hela bredden, utan antal/pris/moms ──────────── */
/**
 * ⚠️ FÄLTET FYLLER CELLEN. Textraden finns för att rymma mer än benämningens
 * 44 tecken; ett inmatningsfält med kolumnbredd hade gett tillbaka samma
 * trängsel i en annan kolumn.
 *
 * ⚠️ `table-layout: fixed` gäller i kolumnläget och läser kolumnbredderna ur
 * FÖRSTA raden — därför behöver den här cellen ingen egen bredd, bara `width:
 * auto` så att spannet får det som blir över.
 */
.kf-rader-tabell td.kf-textrad__cell { width: auto; }
.kf-rader-tabell td.kf-textrad__cell .r-text { width: 100%; }

/* Detaljvyns motsvarighet — samma rad, utan fält. */
.kfd-rader-tabell .kfd-textrad td { color: var(--text-secondary); }

/* Knapparna under radtabellen: bryt till två rader när bredden inte räcker. */
.kf-rader-knappar {
  display: flex;
  flex-wrap: wrap;
  gap: var(--space-2);
  margin-top: var(--space-4);
}

/* ── Tre kollapsbara sektioner i kundfaktura-formuläret (0194) —
 * återanvänder .lf-extra-toggle/.lf-extra-panel-mönstret men utanför
 * lev-fakturans kort. Neutraliserar togglens negativa sido-marginal
 * (den förutsätter ett kort med var(--space-3)-padding) så den inte
 * spränger 375px, och ger panelen eget luft-utrymme. ── */
.kf-sektioner { margin-top: var(--space-3); }
.kf-sektioner .lf-extra-toggle { margin-left: 0; margin-right: 0; }
.kf-sektioner .lf-extra-panel { padding: var(--space-3) 0 var(--space-1); }
.kf-sektioner .lf-extra-panel .form-row:not(:first-child) { margin-top: var(--space-2); }

/* ── ROT/RUT-radväljaren (PR 1) — knapp + utfällbar panel i
 * beskrivningscellen. Panelen är en kompakt grid som kollapsar till
 * en kolumn på smala skärmar (mobil 375px).
 *
 * 375px-FIXEN (justerings-PR): stack-standarden gör cellerna till
 * FLEX-RADER på mobil (.data-table--stack td { display:flex; ... }) →
 * ROT/RUT-blocket lades BREDVID beskrivnings-inputen och panelens
 * minmax(170px)-kolumner kunde inte krympa → tabellen sprängde 375px.
 * Fix: cellen får wrap:a, blocket tar FULL BREDD på egen rad och
 * panelen är enkolumnig på mobil. min(170px, 100%) skyddar även smala
 * desktop-celler. ── */
.r-rotrut { margin-top: var(--space-1); }
.r-rotrut-btn { min-height: var(--tap-target); }
.r-rotrut-panel {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(170px, 100%), 1fr));
  gap: var(--space-2);
  margin-top: var(--space-2);
  padding: var(--space-3);
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  max-width: 100%;
  min-width: 0;
}
.r-rotrut-panel .form-group { margin-bottom: 0; }
.r-rotrut-panel label { font-size: var(--fs-sm); }

@media (max-width: 760px) {
  .kf-rader-tabell td.cell-title { flex-wrap: wrap; }
  .kf-rader-tabell .r-rotrut {
    flex-basis: 100%;
    min-width: 0;
    max-width: 100%;
  }
  .r-rotrut-panel { grid-template-columns: 1fr; }
}

@media (max-width: 760px) {
  /* table-layout: fixed ärver kolumnbredderna även när stack:en är
   * aktiv — bryt fastlagda bredder så cell-stack:en kan rendera
   * cellerna fullbredd. */
  .kf-rader-tabell { table-layout: auto; }
  /**
   * ⚠️⚠️ MINSTA BREDDEN MÅSTE NOLLSTÄLLAS HÄR — annars tvingas tabellen till
   * 908 px också i stack-läget, där cellerna ska vara fullbreda.
   *
   * ⚠️⚠️ MÄTT, och det var det som klippte etiketterna: vid 375 px blev
   * tabellen 908 px och regionen rullade 630 px i sidled. Varje cell var då
   * 882 px bred med sin etikett längst till vänster, så det enda som syntes av
   * ANTAL, À-PRIS, MOMS, KONTO och BELOPP var svansarna «T», «IS», «S», «O»,
   * «PP». Etiketterna låg inte kvar — de hade rullat ut åt vänster.
   *
   * ⚠️ MINSTA BREDDEN HÖR TILL KOLUMNLÄGET, inte till tabellen. Den finns för
   * att Beskrivning inte ska krympa till noll när kolumnerna står bredvid
   * varandra; i stack-läget finns inga kolumner att skydda.
   */
  .kf-rader-tabell { min-width: 0; }
  .kf-rader-region { overflow-x: visible; }
  .kf-rader-tabell th:nth-child(n), .kf-rader-tabell td:nth-child(n) { width: auto; }
  /* Touch-target + iOS-zoom-skydd på inputs/selects (#427). Padding/fs
   * från desktop-regeln ovan räcker inte för 44px min-height på alla
   * enheter, och fs < 16px triggar iOS-Safari-zoom-in på fokus. */
  .kf-rader-tabell td input,
  .kf-rader-tabell td select {
    min-height: var(--tap-target);
    font-size: 16px;
  }
}

/* Legacy: ver-rader (bokföring) — inline-bredder via klass. */
.ver-rader th.ver-rader__antal  { width: 70px; }
.ver-rader th.ver-rader__apris  { width: 100px; }
.ver-rader th.ver-rader__moms   { width: 80px; }
.ver-rader th.ver-rader__belopp { width: 90px; }
.ver-rader td input,
.ver-rader td select {
  width: 100%;
  max-width: 100%;
  padding: 6px var(--space-2);
}

/* ─── 33. Detaljvy-page — overflow-skydd + TÄT arbetsyta-skala (#429) ──
 *
 * .detail-page wrappar alla etapp 2-detaljvyer (kundfaktura, verifikat,
 * kvitto). Tre syften:
 *
 *   1. INGEN HORISONTELL SCROLL på sidan (samma anda som #398:s
 *      mobil-härdning). Innehåll som inte ryms måste antingen stack:as
 *      (data-table--stack) eller få intern scroll inom sitt kort.
 *
 *   2. TÄT arbetsyta-skala (#429): detaljvyer är ARBETSVERKTYG, inte
 *      läsupplevelser. Stramare än landningssidan PÅ ALLA NIVÅER:
 *      page-header → sektion → kort → form-grupp → label.
 *      Sektionsgränser markeras med EN måttlig lucka, inte staplade
 *      marginaler. Märkbart mer innehåll per skärm.
 *
 *   3. Touch-target och läsbarhet OFÖRÄNDRADE: 44px-höjd på inputs
 *      (#427), löptext-line-height orörd. Tighter = mindre LUFT, inte
 *      mindre KLICKYTOR eller text.
 *
 * Skala (rationella språng — varje nivå ungefär halvbredd från ovan):
 *
 *   .page-header    → margin-bottom: var(--space-3)
 *   .section-header → margin-bottom: var(--space-3)
 *   .card-body      → padding:        var(--space-3) var(--space-4)
 *                     (mobil ≤480:    var(--space-2) var(--space-3))
 *   .form-section   → margin-top:     var(--space-3)
 *   .form-section + .form-section → margin-top: var(--space-4)
 *   .form-group     → margin-bottom: var(--space-2)
 *   .form-group label → margin-bottom: 3px (var: 5px globalt)
 *   .form-row + .form-row → margin-top: var(--space-2)
 *   .meta-grid      → gap: var(--space-2) var(--space-4); mb: var(--space-3)
 *   .summary-stack  → padding: var(--space-2) 0
 */
.detail-page {
  max-width: 100%;
  overflow-x: clip;
}
.detail-page .page-header { margin-bottom: var(--space-3); }
/* Två knappar i sidhuvudet (leverantörsfakturorna, attest PR 4): bredvid varandra, och radbrytning i mobilen. */
.page-header__knappar { display: flex; gap: var(--space-2); flex-wrap: wrap; align-items: center; }
.detail-page .card-body { padding: var(--space-3) var(--space-4); }
@media (max-width: 480px) {
  .detail-page .card-body { padding: var(--space-2) var(--space-3); }
}

/* Form-rytm: tätare per-grupp + tätare sektionsavstånd. Overrider de
 * globala .form-group/label-marginalerna (style.css:847/849) BARA inom
 * .detail-page. Landningssidor/inställningar behåller sin generösa
 * läs-skala. */
.detail-page .form-group { margin-bottom: var(--space-1); }
.detail-page .form-group > label,
.detail-page .form-group > span:first-child,
.detail-page label > span:first-child { margin-bottom: 2px; }
.detail-page .form-row + .form-row,
.detail-page .form-row + .form-group,
.detail-page .form-group + .form-row { margin-top: 6px; }
.detail-page .form-section { margin-top: var(--space-3); }
.detail-page .form-section + .form-section { margin-top: var(--space-4); }

/* TÄT FORMULÄRRYTM #430 — desktop input/select/btn-höjd ned till ~32px.
 * Mellanrummen mellan grupper ska vara TYDLIGT MINDRE än fälthöjden
 * (~⅓). Tidigare gav default 9px/12px-padding ~38px → mellanrum (8px)
 * nästan lika stort som fältet → "luftiga" formulär som krockade med
 * arbetsyta-andan.
 *
 * Mobil OFÖRÄNDRAD (#427-kravet): 44px touch + font-size 16px (annars
 * zoomar iOS-Safari in på input-fokus). Tabellrader (.kf-rader-tabell,
 * .data-table--rader) ärver desktop-tightningen → formulär och tabeller
 * får samma rytm.
 *
 * Scopas till BÅDE .detail-page OCH .modal så formulärrutor i
 * modaler (motboka, "Ändra", kundfakturarads-modal m.fl.) följer samma
 * skala. */
@media (min-width: 761px) {
  .detail-page input[type="text"],
  .detail-page input[type="number"],
  .detail-page input[type="date"],
  .detail-page input[type="email"],
  .detail-page input[type="tel"],
  .detail-page input[type="password"],
  .detail-page select,
  .detail-page textarea,
  .modal input[type="text"],
  .modal input[type="number"],
  .modal input[type="date"],
  .modal input[type="email"],
  .modal input[type="tel"],
  .modal input[type="password"],
  .modal select,
  .modal textarea {
    padding: 5px 10px;
    font-size: var(--fs-sm);
    min-height: 32px;
    line-height: 1.3;
  }
  .detail-page .btn,
  .modal .btn {
    padding: 6px 14px;
    font-size: var(--fs-sm);
  }
  .detail-page .btn-sm,
  .modal .btn-sm {
    padding: 4px 10px;
    font-size: 12px;
  }
}

/* Mobil: 44px touch-target + 16px font för ALLA inputs/selects i
 * detalj-/modal-kontext (utvidgar #427-skyddet bortom data-table--rader). */
@media (max-width: 760px) {
  .detail-page input[type="text"],
  .detail-page input[type="number"],
  .detail-page input[type="date"],
  .detail-page input[type="email"],
  .detail-page input[type="tel"],
  .detail-page input[type="password"],
  .detail-page select,
  .modal input[type="text"],
  .modal input[type="number"],
  .modal input[type="date"],
  .modal input[type="email"],
  .modal input[type="tel"],
  .modal input[type="password"],
  .modal select {
    min-height: var(--tap-target);
    font-size: 16px;
  }
  .detail-page .btn,
  .modal .btn { min-height: var(--tap-target); }
}

/* Meta-grid + summary-stack i detalj-kontext: tätare gap. */
.detail-page .meta-grid {
  gap: var(--space-2) var(--space-4);
  margin-bottom: var(--space-3);
}
@media (max-width: 760px) {
  .detail-page .meta-grid { gap: var(--space-2); }
}
.detail-page .summary-stack { padding: var(--space-2) 0; }

/* Sektionsrubriker hör till sitt innehåll — INTE flyta mellan. */
.detail-page .section-header { margin-bottom: var(--space-3); }

/* Säkerhetsnät: tabeller inom detaljvyer som SAKNAR stack-behandling
 * faller tillbaka till intern horisontell scroll i sitt eget kort
 * (.table-wrapper). Sidans body scrollar INTE i sidled. */
.detail-page .table-wrapper {
  max-width: 100%;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}

/* .data-table--stack--lineitem — belopps-rader på mobil
 *
 * Std-tillägg till #33. För rader som är "PRIS-rader" (fakturarader,
 * lev-faktura-kontering, kvittorader): mobilkortet komprimeras till
 *   Rad 1: BESKRIVNING (fet, bryts) + BELOPP höger (fet, nowrap)
 *   Rad 2: muted metarad "antal enhet × à-pris · moms %"
 * Tätare densitet än bas-stack (data-table--stack--tight-anda).
 *
 * Markup-konvention:
 *   <td class="cell-title cell-lineitem__title" data-label="Beskrivning">
 *     Beskrivning
 *     <span class="cell-lineitem__meta">2 h × 750 kr · 25 %</span>
 *   </td>
 *   ...
 *   <td class="cell-amount cell-lineitem__amount" data-label="Belopp">
 *     1 500 kr
 *   </td>
 *
 * Antal/Enhet/À-pris/Moms-cellerna döljs på mobil eftersom de finns i
 * meta-raden — desktop visar dem som vanligt i sin egen kolumn. */
.cell-lineitem__meta {
  display: none;
}
.cell-amount { white-space: nowrap; }

@media (max-width: 760px) {
  .data-table--stack--lineitem tbody tr {
    padding: var(--space-2) var(--space-3);
    gap: 0;
    margin-bottom: var(--space-2);
    /* Lyfter belopp-cellen upp på rad 1 via grid. */
    display: grid;
    grid-template-columns: 1fr auto;
    align-items: start;
  }
  /* Titel-cellen tar vänster kolumn och spänner rad 1; meta-spanen
   * blir rad 2 inom samma cell. */
  .data-table--stack--lineitem tbody td.cell-lineitem__title {
    grid-column: 1;
    grid-row: 1;
    font-weight: 600;
    font-size: var(--fs-body);
    padding: 0;
    display: block;
    min-width: 0;
  }
  .data-table--stack--lineitem tbody td.cell-lineitem__title::before {
    display: none;
  }
  .data-table--stack--lineitem tbody td.cell-lineitem__amount {
    grid-column: 2;
    grid-row: 1;
    font-weight: 600;
    font-size: var(--fs-body);
    padding: 0;
    text-align: right;
    white-space: nowrap;
    display: block;
  }
  .data-table--stack--lineitem tbody td.cell-lineitem__amount::before {
    display: none;
  }
  /* Meta-raden under titeln — muted, kompakt. */
  .data-table--stack--lineitem .cell-lineitem__meta {
    display: block;
    margin-top: 2px;
    font-size: var(--fs-sm);
    font-weight: 400;
    color: var(--text-secondary);
  }
  /* Övriga cellerna (Antal, Enhet, À-pris, Moms) finns redan i meta-
   * raden ovan — dölj dem på mobil för att undvika dubbeltext. */
  .data-table--stack--lineitem tbody td:not(.cell-lineitem__title):not(.cell-lineitem__amount) {
    display: none;
  }
}

/* Modal-varianten med inputs ska INTE komprimera till lineitem på mobil —
 * användaren behöver redigera varje fält. Stacken används som vanligt
 * (rad 1 beskrivning, rad 2+ antal/enhet/à-pris/moms/belopp). */
@media (max-width: 760px) {
  .kf-rader-tabell.data-table--stack--lineitem tbody tr {
    display: block;
    grid-template-columns: none;
  }
  .kf-rader-tabell tbody td:not(.cell-lineitem__title):not(.cell-lineitem__amount) {
    display: flex;
  }
  .kf-rader-tabell tbody td.cell-lineitem__title,
  .kf-rader-tabell tbody td.cell-lineitem__amount {
    grid-column: auto;
    grid-row: auto;
  }
  .kf-rader-tabell .cell-lineitem__meta {
    display: none;
  }
}

/* Detaljvyns rad-tabell desktop — Enhet-kolumnen är breddare än
 * #416-versionen eftersom enhetstexten nu är fritext (kan vara
 * "förpackningar", "licenser" etc). Ellipsis vid extrema längder. */
.kfd-rader-tabell th:nth-child(3),
.kfd-rader-tabell td:nth-child(3) {
  width: 110px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 110px;
}

/* .data-table--rader — DUBBELBOKFÖRINGS-RADER på mobil (kompakt tabell)
 *
 * Std-tillägg till #33. Verifikatrader läses via BÅDA debet/kredit-
 * kolumnerna (tvåkolumnsbelopp). Lineitem-mönstret komprimerar bort
 * just det — det är ett mönster för EN-BELOPPSRADER (fakturarader,
 * kvitton). För dubbelbokföring behåller vi TABELLFORMEN på mobil och
 * göm sidokolumner med data-mobile="hide" istället för att linearisera.
 *
 *   Mobil-kolumner: Konto · Debet · Kredit
 *   Hidden:         Benämning, Transaktionsinfo, Kontosaldo
 *   Kontonamn:      som .row-sub i konto-cellen (synligt enbart på mobil)
 *
 * Genomstrukna rader (.row--struck) fungerar oförändrat.
 *
 * Markup-konvention:
 *   <table class="data-table data-table--rader">
 *     <thead><tr>
 *       <th>Konto</th>
 *       <th data-mobile="hide">Benämning</th>
 *       <th data-mobile="hide">Transaktionsinfo</th>
 *       <th class="text-right">Debet</th>
 *       <th class="text-right">Kredit</th>
 *       <th class="text-right" data-mobile="hide">Kontosaldo</th>
 *     </tr></thead>
 *     <tbody><tr>
 *       <td>1510<span class="row-sub cell-konto__namn">Kundfordringar</span></td>
 *       <td data-mobile="hide">Kundfordringar</td>
 *       …
 *     </tr></tbody>
 *   </table>
 */
/* Desktop-densitet: stramare padding så tabellen ryms i .detail-split__left
 * även med underlag-panelen öppen (~360px höger). Namn som row-sub i
 * konto-cellen — Benämning-kolumnen är borttagen helt. Tinfo ellipsis:as
 * via .cell-tinfo så långa beskrivningar inte breddar tabellen. */
.data-table--rader th,
.data-table--rader td {
  padding: var(--space-2) var(--space-3);
}

/* Smala kolumner enligt cell-matrisen (#18 + #33-tillägg):
 *   .cell-konto   ~72px (BAS-konton är 4 siffror; namn-row-sub bryts under)
 *   .cell-belopp  ~130px (rymmer "18 159,75" m. andningsrum, nowrap; #436)
 *   .cell-tinfo   ellipsis 240px (fulltext i title)
 * Med smala kolumner ryms tabellen i .detail-split__left även med under-
 * lagspanelen öppen, OCH Benämning-kolumnen återupptas i läsläget utan
 * att återinföra sidledsscrollen.
 *
 * STANDARD-REGEL (#18-tillägg, #426/#427): fasta kolumn-/inputbredder
 * är DESKTOP-EGENSKAPER. I mobilstacken är alla rad-fält ALLTID
 * fullbredda (mobilskärmen ger inte plats för komprimering, och
 * inputfönster < 44px bryter touch-targets). Wrap:a därför ALLA fixed
 * widths i `@media (min-width: 761px)` så de inte läcker till stacken.
 * Konsumenter (verifikat ny/redigera, kf-rader-tabell, framtida liknande)
 * följer samma mönster.
 */
@media (min-width: 761px) {
  .data-table--rader .cell-konto {
    width: 72px;
    white-space: nowrap;
  }
  .data-table--rader td.cell-konto {
    vertical-align: top;
  }
  .data-table--rader .cell-belopp {
    width: 130px;
    /* HARD FLOOR (#437): belopp ger ALDRIG vika när panelen kläms.
     * table-layout: auto krymper annars kolumnen proportionellt →
     * talet kapas. min-width tvingar fältet att behålla sin storlek;
     * Benämning får ge vika i st.f. (regel nedan).
     *
     * Behållit 130px (var tillfälligt höjt till 150 i #449 för
     * italic-rotorsakshypotes; #450 backar — den riktiga rotorsaken
     * var font-style: italic på auto-rader, inte cellbredd. Italic
     * borttagen → 130px räcker även för "1 999 999,75" normal). */
    min-width: 130px;
    white-space: nowrap;
  }
  /* Benämning ger vika FÖRST när panelen tar bredd (#437). Ellipsis +
   * title-attribut bevarar läsbarhet för hela namnet vid hover. */
  .data-table--rader td.cell-text {
    max-width: 200px;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    overflow-wrap: normal;
    word-break: normal;
  }
  .data-table--rader .cell-tinfo {
    max-width: 240px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  /* Edit/ny-läget: input.r-konto begränsad till 4-siffriga BAS-koder
   * på desktop. Dropdown-listan ankras via .form-group--anchor (cell-vid),
   * så vi smalna BARA inputen — autocomplete behåller sin egen bredd. */
  .data-table--rader .cell-konto input.r-konto {
    width: 56px;
    font-family: var(--font-mono, monospace);
    text-align: left;
  }
  .data-table--rader .cell-belopp input.r-debet,
  .data-table--rader .cell-belopp input.r-kredit {
    /* INGEN max-width — fyller hela cellen (130px) så manuell + auto
     * får IDENTISK bredd. Tidigare 120px införde en synlig storleks-
     * skillnad mot auto-rader (som fick max-width:none i #448). #450
     * konsoliderar — en delad regel, bara disabled-attributet skiljer
     * auto från manuell. */
    width: 100%;
    text-align: right;
  }
  .data-table--rader .r-namn {
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;
  }
}

/* Kontonamnet som row-sub i konto-cellen — synligt BARA på mobil där
 * Benämning-kolumnen göms (data-mobile="hide"). På desktop visas namnet
 * i sin egen kolumn → dubblett undviks. */
.data-table--rader .cell-konto__namn {
  display: none;
  font-size: 11px;
  color: var(--text-secondary);
  font-weight: 400;
  font-family: var(--font-sans, inherit);
  line-height: 1.2;
  margin-top: 1px;
}
.data-table--rader .cell-amount__tom {
  color: var(--text-secondary);
}

/* Mobil: inputs fyller hela stack-cellen, ≥44px touch-target. Inget
 * font-size < 16px på inputs (annars zoomar iOS-Safari in). */
@media (max-width: 760px) {
  .data-table--rader td input,
  .data-table--rader td select {
    width: 100%;
    min-height: var(--tap-target);
    font-size: 16px;
  }
  /* Tätare radkort (#428): default-stack-paddingen ger för mycket luft i
   * verifikatets editor — kortet känns "tomt" mellan inputs. Strama åt
   * yttre kort-padding + cell-gap; behåll inputs 44px-höjd via min-height
   * ovan. */
  .data-table--rader.data-table--stack tbody tr {
    padding: var(--space-2);
    gap: 4px;
    margin-bottom: var(--space-2);
  }
  .data-table--rader.data-table--stack tbody td {
    padding: 2px 0;
  }
  .data-table--rader.data-table--stack tbody td::before {
    font-size: 10px;
  }
}

@media (max-width: 760px) {
  .data-table--rader thead th[data-mobile="hide"],
  .data-table--rader tbody td[data-mobile="hide"] {
    display: none;
  }
  /* Kontonamnet visas alltid (även mobil) — bara typografi-finish här. */
  .data-table--rader .cell-konto__namn {
    display: block;
    font-size: 11px;
    color: var(--text-secondary);
    font-weight: 400;
    margin-top: 1px;
    line-height: 1.2;
    /* row-sub ärver font-family från tbody (sans), kontonumret ovan
     * är font-mono. row-sub i konto-cellen ska INTE vara mono. */
    font-family: var(--font-sans, inherit);
  }
  /* Kompaktera densiteten — verifikat-rader är många och korta. */
  .data-table--rader {
    font-size: var(--fs-sm);
  }
  .data-table--rader th,
  .data-table--rader td {
    padding: var(--space-1) var(--space-2);
    vertical-align: top;
  }
  .data-table--rader td.cell-amount,
  .data-table--rader td.text-right {
    white-space: nowrap;
  }
}

/* ─── 34. Autocomplete-dropdown — .konto-dropdown / .konto-option ──
 *
 * Standard-komponent för dropdown-listor under text-inputs
 * (konto-sök i bokföring, kund-sök i ny faktura-modalen,
 * leverantör-sök etc). Kräver `position: relative` på föräldern
 * (.form-group--anchor eller motsvarande).
 *
 * BAKGRUND: stilarna har historiskt varit inline-injicerade av
 * bokforing.js:s injectStyles(). Det betydde att alla ANDRA sidor
 * (ny faktura, lev-faktura osv) hade ostylda dropdowns som inte
 * syntes om användaren inte besökt /bokforing först — en
 * regressions-fälla. Här är de en riktig standard-komponent.
 *
 * Default = display:none → JS sätter style.display='block' när
 * träffar finns. (Långsiktigt: byt till [hidden]-attribut + en
 * :not([hidden])-regel i stil med filter-dropdown #25.) */
.konto-dropdown {
  display: none;
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  z-index: 200;
  background: var(--surface-card);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
  min-width: 260px;
  max-height: 240px;
  overflow-y: auto;
  /* ⚠️⚠️ RULLNINGEN STANNAR I LISTAN. Utan `contain` fortsätter hjulet i sidan
     bakom när listan nått sitt slut — och på en portal-lista, som ligger
     `position: fixed`, stänger den rullningen dessutom listan. Mätt: elva
     artikelträffar ger 484 px innehåll i en ruta på 240. */
  overscroll-behavior: contain;
  margin-top: 2px;
}
/* Portal-varianten (PR #539) — renderas i <body> och positioneras med
   position:fixed av libben. Override de in-place-positions så styling
   förblir konsekvent men klippet av föräldra-overflow:hidden undviks.
   ⚠️ z-index ÖVER MODALERNA (PS-2, P4). Här stod 1000 med texten «hög nog
   att ligga ovanför modaler» — men modalerna ligger på 2000
   (public/js/lib/confirm-modal.js, .bokslut-avst.dialogyta). En sökväljare i
   en dialog ritade alltså sin lista BAKOM dialogen: träffarna fanns i DOM:en
   och syntes inte. */
.konto-dropdown.konto-dropdown--portal {
  position: fixed;
  top: auto;
  left: auto;
  right: auto;
  z-index: 2100;
  margin: 0;
}
.konto-option {
  padding: 8px var(--space-3);
  font-size: var(--fs-sm);
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: var(--space-3);
  min-height: var(--tap-target);
  /* Default: en rad, ellipsis vid trångt — kundnr/orgnr stannar
   * efter namnet med ett tunt skiljetecken. */
  flex-wrap: nowrap;
  white-space: nowrap;
}
.konto-option:hover,
.konto-option.active {
  background: var(--hover-tint);
}
/* En rad som syns men inte går att välja (`opts.inaktiv`, PS-2 P4): kunden
 * saknar VAT-nummer. Skälet står efter namnet, och raden reagerar inte på hover. */
.konto-option--inaktiv { cursor: not-allowed; color: var(--text-secondary); }
.konto-option--inaktiv:hover { background: transparent; }
.konto-option .konto-inaktiv { margin-left: auto; font-size: var(--fs-xs, 12px); color: var(--text-secondary); }
/* Gruppenrubrik i en sökväljare («Förslag från fakturan», «Alla»).
 * Ingen .konto-option — pilarna och klicken hoppar över den. */
.konto-option-rubrik {
  padding: 6px var(--space-3) 2px;
  font-size: var(--fs-xs, 12px);
  font-weight: 600;
  color: var(--text-secondary);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
/* Bokföring-konto-mönstret (rad 1665+ i bokforing.js): konto-nr +
 * konto-namn på samma rad. Behålls för bakåtkompatibilitet. */
.konto-option .konto-nr {
  font-family: var(--font-mono, monospace);
  font-weight: 600;
  min-width: 40px;
}
.konto-option .konto-namn {
  color: var(--text-secondary);
}
/* Etapp 2-mönstret (kund-autocomplete): namn fet vänsterställd,
 * meta (kundnr · orgnr) muted till höger på SAMMA rad. */
.konto-option__namn {
  font-weight: 600;
  color: var(--text-primary);
  overflow: hidden;
  text-overflow: ellipsis;
  min-width: 0;
  flex: 0 1 auto;
}
.konto-option__meta {
  color: var(--text-secondary);
  font-size: var(--fs-eyebrow);
  margin-left: auto;
  flex-shrink: 0;
}
/* Mobil: om båda inte ryms — låt meta bryta ned till rad 2.
 * Touch-target uppfylls fortsatt via min-height. */
@media (max-width: 480px) {
  .konto-option {
    flex-wrap: wrap;
    white-space: normal;
  }
  .konto-option__meta {
    margin-left: 0;
    flex-basis: 100%;
  }
}

/* ─── 35. Fältets val-status (helper-text data-state) ─────────
 *
 * Helper-text under autocomplete-fält som speglar val-staten:
 *   data-state=""        — default ("Skriv för att söka…")
 *   data-state="pending" — varning (text utan match, måste välja)
 *   data-state="ok"      — bekräftelse (kund vald)
 *
 * Komplement till disabled-knapp-mönstret #21: när knappen är aktiv
 * men submit-validering kan slå behöver användaren se VARFÖR direkt
 * i fältets område, inte bara efter klick. */
.helper-text[data-state="pending"] {
  color: var(--warning-deep);
}


/* ═══ ETAPP 2 — VERIFIKAT-DETALJ / NY / REDIGERA (std #36 + co) ═══ */

/* ─── 36. .detail-split — vänster huvudinnehåll + höger sidopanel ──
 *
 * Generaliserad split-layout för detaljvyer som har en bilage-/
 * underlag-panel eller annan kontext-panel till höger. Designad
 * mot verifikat-detaljen (första riktiga konsumenten). Lev-faktura-
 * detaljens .lf-split aliasas till samma mönster så den ärver
 * automatiskt vid sin egen migration; verifikat-detaljens .ver-split
 * är också alias så befintliga klassnamn fortsätter fungera men
 * pekar mot std-CSS:en.
 *
 * BREAKPOINT 760px (matchar #381 och övriga komponenter).
 *
 * Höger-panelen är default-stängd via .detail-split__right[hidden]
 * (eller legacy-klassen .bilaga-dold/.is-collapsed). Toggle:as via
 * en knapp i page-headern. På mobil staplas panelen UNDER huvud-
 * innehållet med max-height:50vh + intern scroll så den inte tar
 * över hela vyn (samma mönster som lev-faktura).
 *
 *  Markup-konvention:
 *
 *    <div class="detail-split">
 *      <div class="detail-split__left">…</div>
 *      <div class="detail-split__handle"></div>   <!-- desktop resize, dold mobil -->
 *      <div class="detail-split__right" hidden>…</div>
 *    </div>
 */
.detail-split,
.lf-split,
.ver-split {
  display: flex;
  align-items: stretch;
  min-height: 0;
  gap: 0;
}
.detail-split__left,
.lf-split-left,
.ver-split-left {
  flex: 1 1 0;
  min-width: 0;
  display: flex;
  flex-direction: column;
}
.detail-split__handle,
.ver-resize-handle {
  width: 5px;
  flex-shrink: 0;
  cursor: col-resize;
  background: var(--line);
  align-self: stretch;
  transition: background .1s;
}
.detail-split__handle:hover,
.detail-split__handle.aktiv,
.ver-resize-handle:hover,
.ver-resize-handle.aktiv {
  background: var(--info);
}
.detail-split__right,
.lf-split-right,
.ver-split-right {
  width: 360px;
  flex-shrink: 0;
  background: var(--surface-card);
  border: 1px solid var(--line);
  border-left: none;
  border-radius: 0 var(--radius) var(--radius) 0;
  box-shadow: var(--shadow);
  display: flex;
  flex-direction: column;
  overflow: hidden;
  transition: width .15s;
}
/* Stängd panel: width 0 + border/skugga bort. Stöder:
 *   - hidden-attr (std för synlighet)
 *   - .is-collapsed (legacy)
 *   - .bilaga-dold (JS-mekanismen som verifikat/lev-faktura använder).
 * REGRESSION-FIX (#425): tidigare saknades .detail-split__right.bilaga-dold
 * i selektorn → JS-klassen tog inte effekt på den nya komponenten medan
 * den fortsatte funka på legacy-aliasen .ver-split-right/.lf-split-right.
 * Detaljens markup hade dessutom `hidden` hårdkodat → toggle togglade
 * BARA klassen, [hidden] låg kvar → panelen gick inte att öppna. */
.detail-split__right[hidden],
.detail-split__right.is-collapsed,
.detail-split__right.bilaga-dold,
.lf-split-right.bilaga-dold,
.ver-split-right.bilaga-dold {
  display: flex;          /* hidden:attr-default är display:none — vi vill ha animationen */
  width: 0 !important;
  border: none;
  box-shadow: none;
  min-height: 0;
  overflow: hidden;
}
.detail-split__handle.is-collapsed,
.detail-split__handle.bilaga-dold,
.ver-resize-handle.bilaga-dold {
  cursor: default;
  background: transparent;
}

/* Mobil — staplad layout, panel ovan/under huvudinnehållet med
 * intern scroll och egen border-radius. Handle:n göms (ingen vettig
 * funktion vid stack). */
@media (max-width: 760px) {
  .detail-split,
  .lf-split,
  .ver-split {
    flex-direction: column;
    align-items: stretch;
    height: auto;
    overflow: visible;
  }
  .detail-split__left,
  .lf-split-left,
  .ver-split-left { height: auto; overflow: visible; }
  .detail-split__right,
  .lf-split-right,
  .ver-split-right {
    width: 100%;
    max-height: 50vh;
    overflow-y: auto;
    flex-shrink: 1;
    border-left: 1px solid var(--line);
    border-radius: var(--radius);
    margin-top: var(--space-3);
  }
  .detail-split__right[hidden],
  .detail-split__right.is-collapsed,
  .lf-split-right.bilaga-dold,
  .ver-split-right.bilaga-dold { display: none; }
  .detail-split__handle,
  .ver-resize-handle { display: none; }
}

/* Lev-faktura-detalj — TVÅPANELS-layout (regression-fix): vänsterkolumnen
 * (förslag + kontering + spara/bokföra/avbryt) scrollar som EN enhet och når
 * knapparna längst ner; höger PDF/JPG-underlag står FAST i FULL storlek (med
 * inzoomning). Föregångaren använde position:sticky + align-self:flex-start UTAN
 * definierad höjd → höger panels flex-barn (iframe/bild med flex:1) kollapsade
 * (~10 % i hörnet, zoom-UI dolt) och sidscroll-beroendet gjorde knapparna
 * onåbara. Nu: bunden höjd på splitten + intern scroll vänster, höger stretchad.
 * SCOPAD till .lf-detail-page → verifikat-detaljen (delar .detail-split) orörd.
 * (Desktop ≥761px; mobil ≤760px behåller den staplade layouten ovan.) */
/* ⚠️⚠️ HÄR STOD HÖJDEN OCKSÅ, OCH DEN VAR DÖD. Tre deklarationer i det här
 * blocket skrevs över av ett block tusen rader längre ned med SAMMA
 * specificitet (0,2,0) och utan mediafråga — senare regel vinner:
 *
 *   höjden        calc(100vh - topbaren - 2 × sidluften)   →  calc(100vh - 112px)
 *   golvhöjden    360px                                    →  0
 *   vänsterspalt  overflow-y: auto                         →  overflow: hidden
 *
 * ⚠️ Uppmätt: `getComputedStyle('.lf-detail-page .detail-split__left').overflowY`
 * är `hidden`, och splitten är 968 px vid 1080 — alltså 1080 − 112, inte
 * uttrycket ovan. Kommentarens löfte «scrollar som EN enhet och når knapparna»
 * beskrev alltså en regel som inte gällde.
 *
 * ⚠️ De döda raderna är borttagna så det finns EN källa. Värdet är oförändrat;
 * det som gäller står i block 44 nedan. De två uttrycken skiljer sig först
 * under ca 1120 px fönsterbredd, där sidluften klampas ned — att byta det
 * hårda talet mot tokens är en riktig förbättring men flyttar layouten, och
 * hör inte hit.
 *
 * ⚠️ Kvar här står bara det som FAKTISKT gäller: justeringen och de två
 * `min-height: 0` som gör att flexbarnen får krympa.
 *
 * Bakgrunden: föregångaren använde sticky + align-self utan definierad höjd →
 * höger panels flexbarn kollapsade (~10 % i hörnet, zoomreglagen dolda) och
 * sidscroll-beroendet gjorde knapparna onåbara.
 * SCOPAD till .lf-detail-page → verifikat-detaljen (delar layouten) orörd.
 * (Desktop ≥761px; mobil ≤760px behåller den staplade layouten ovan.) */
@media (min-width: 761px) {
  .lf-detail-page .detail-split {
    align-items: stretch;                   /* båda kolumnerna full höjd */
  }
  .lf-detail-page .detail-split__left { min-height: 0; }
  .lf-detail-page .detail-split__right {
    min-height: 0;                          /* full höjd (stretch) → underlag + zoom syns */
  }
}


/* ─── 37. .voucher-totals — summa/differens-band under bokföringstabell ──
 *
 * Horisontellt band med Summa debet / Summa kredit / Differens.
 * Plats: under voucher-tabellen (både läs- och redigeringsläge).
 * Differens får färgklass .balance-indicator--ok/--off (#38). */
.voucher-totals {
  display: flex;
  justify-content: flex-end;
  gap: var(--space-6);
  padding: var(--space-2) var(--space-4);
  border-top: 1px solid var(--line);
  font-size: var(--fs-sm);
  flex-wrap: wrap;
}
.voucher-totals__cell {
  display: inline-flex;
  gap: var(--space-2);
}
.voucher-totals__label { color: var(--text-secondary); }
.voucher-totals__value {
  font-variant-numeric: tabular-nums;
  font-weight: 600;
}
@media (max-width: 480px) {
  .voucher-totals {
    flex-direction: column;
    align-items: flex-end;
    gap: var(--space-1);
  }
}


/* ─── 38. .balance-indicator — debet/kredit-balans ─────────────
 *
 * --ok  = balansen är ren (debet = kredit eller |diff| < 0.01)
 * --off = avvikelse (rött, kräver åtgärd). Används i voucher-totals
 * och kan återanvändas av andra bokföringsformulär (t.ex. lev-
 * faktura-kontering, motboknings-flöden). */
.balance-indicator--ok  { color: var(--success-deep); }
.balance-indicator--off { color: var(--danger-deep); }


/* ─── 39. .attach-panel — bilage-/underlag-galleri ────────────
 *
 * Generaliserad från verifikat-detaljens bilaga-panel — också för
 * lev-faktura-underlag och kvitto-bilder i framtiden. Strukturen:
 *
 *   <div class="attach-panel">
 *     <div class="attach-panel__header">
 *       <span>Underlag</span>
 *       <button class="btn btn-secondary btn-sm">+ Lägg till</button>
 *     </div>
 *     <div class="attach-panel__list">
 *       <div class="attach-panel__item">
 *         <img class="attach-panel__thumb" src="…">
 *         <div class="attach-panel__item-footer">
 *           <span class="attach-panel__item-name">filnamn.jpg</span>
 *           <button class="btn btn-ghost btn-sm">Ta bort</button>
 *         </div>
 *       </div>
 *     </div>
 *     <div class="attach-panel__dropzone">Dra hit eller klicka…</div>
 *   </div>
 *
 * Legacy-aliaser (.bilaga-panel-header → __header etc) finns i sista
 * blocket i sektionen så bokforing.js-städningen blir gradvis. */
.attach-panel {
  display: flex;
  flex-direction: column;
  height: 100%;
}
.attach-panel__header {
  padding: var(--space-3) var(--space-4);
  border-bottom: 1px solid var(--line);
  font-size: var(--fs-eyebrow);
  font-weight: 700;
  color: var(--text-secondary);
  text-transform: uppercase;
  letter-spacing: .5px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--space-2);
  flex-shrink: 0;
}
.attach-panel__list {
  flex: 1;
  overflow-y: auto;
  padding: var(--space-3);
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}
.attach-panel__item {
  border: 1px solid var(--line);
  border-radius: var(--radius);
  overflow: hidden;
  background: var(--surface-card);
}
.attach-panel__thumb {
  width: 100%;
  height: auto;
  display: block;
  cursor: zoom-in;
}
.attach-panel__item-footer {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: var(--space-2) var(--space-3);
  font-size: var(--fs-sm);
  border-top: 1px solid var(--line);
  gap: var(--space-2);
}
.attach-panel__item-name {
  color: var(--text-secondary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-width: 0;
  flex: 1;
}
.attach-panel__dropzone {
  border: 2px dashed var(--line);
  border-radius: var(--radius);
  padding: var(--space-5) var(--space-3);
  margin: var(--space-3);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-2);
  cursor: pointer;
  transition: border-color .15s, background .15s;
  color: var(--text-secondary);
  text-align: center;
  font-size: var(--fs-sm);
}
.attach-panel__dropzone:hover,
.attach-panel__dropzone.drag-over {
  border-color: var(--info);
  background: var(--hover-tint);
}

/* Legacy-aliaser från bokforing.js:s injectVerStyles. Hänger med
 * tills bilaga-bindningarna i koden själv städas (samma logik som
 * .lf-split-aliaserna ovan). */
.bilaga-panel-header,
.attach-panel__header { /* delar samma stil */ }
.bilaga-lista { /* alias */
  flex: 1;
  overflow-y: auto;
  padding: var(--space-3);
  display: flex;
  flex-direction: column;
  gap: var(--space-3);
}
.bilaga-item {
  border: 1px solid var(--line);
  border-radius: var(--radius);
  overflow: hidden;
  background: var(--surface-card);
}
.bilaga-thumb { width: 100%; height: auto; display: block; cursor: zoom-in; }
.bilaga-item-footer {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: var(--space-2) var(--space-3);
  font-size: var(--fs-sm);
  border-top: 1px solid var(--line);
}
.bilaga-item-namn {
  color: var(--text-secondary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 180px;
}
.bilaga-upload-zone {
  border: 2px dashed var(--line);
  border-radius: var(--radius);
  padding: var(--space-5) var(--space-3);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-2);
  cursor: pointer;
  transition: border-color .15s;
  color: var(--text-secondary);
}
.bilaga-upload-zone:hover,
.bilaga-upload-zone.drag-over { border-color: var(--info); }


/* ─── 40. Voucher-rad utility: genomstruken rad (BFL-rättelse) ──
 *
 * När en bokförd voucher rättas via motbokning markeras strukna
 * rader på audit-trail. Visas både i läs- och redigeringsläget. */
.ver-struck,
.row--struck,
tr.row--struck td {
  text-decoration: line-through;
  color: var(--text-secondary);
}


/* ─── 41. Voucher-header (form-row stack för Beskrivning/Serie/Datum) ──
 *
 * Mönstret från ritaNy/ritaRedigera. Ärver .form-row men har
 * specifik flex-fördelning: beskrivning större (flex:2), serie
 * fast bredd, datum fast bredd. */
.voucher-header .form-group { min-width: 180px; }
.voucher-header .voucher-header__beskrivning { flex: 2 1 280px; }

/* Inline FY-varning under bokföringsdatum (#458): tight under inputet,
 * mindre vertikal margin än standard-alert så formuläret inte hoppar. */
.datum-fy-warning-slot:empty { display: none; }
.datum-fy-warning {
  margin-top: 6px;
  margin-bottom: 0;
  padding: 8px 12px;
  font-size: 12.5px;
  line-height: 1.4;
}


/* ─── 42. lev-faktura-detalj — flyttat från injectStyles() (#431) ──
 *
 * Etapp 2-städning av leverantörsfaktura-detaljen. Tidigare injicerade
 * detaljen ~92 rader CSS i document.head via injectStyles() (F16-fällan
 * — delade komponenter får inte sprida sin egen CSS inline). Reglerna
 * flyttade hit som standardstilar; selektorerna scope:as till
 * .lf-detail-page för att inte läcka. */

/* Topbar-raden i detaljvyns kort. */
.lf-detail-page .lf-topbar {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-2) var(--space-3);
  border-bottom: 1px solid var(--line);
  flex-shrink: 0;
}
/* ⚠️⚠️ `min-width: 0` — UTAN DEN SPRACK RADEN NÄR «Radera» FLYTTADE HIT.
 *
 * En flex-post har `min-width: auto` som förval och krymper då ALDRIG under sitt
 * min-content-mått. Rubrikblocket ville ha 171 px på en 375 px skärm, så den
 * fjärde posten hamnade 19 px utanför viewporten i stället för att raden
 * fördelade om bredden. Felet fångades av «INGENTING STICKER UT UR SKÄRMEN» i
 * levfaktura-mobil.browser.test.ts — en vakt från #984 som gjorde sitt jobb.
 *
 * ⚠️ MÄTT ATT DET RÄCKER: blocket går 171 → 107 px, raden slutar vid 331 av 375,
 * och toppradens HÖJD är oförändrad 81 px — texten radbryts inom samma två rader
 * den redan använde. `flex-wrap: wrap` hade också fungerat men kostat en rad
 * till i en topprad som numera är fäst, alltså permanent viewport. */
.lf-detail-page .lf-topbar__main { min-width: 0; }
.lf-detail-page .lf-topbar__rubrik {
  font-size: 13px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .5px;
  color: var(--text-primary);
}
.lf-detail-page .lf-topbar__meta {
  font-size: 12px;
  color: var(--text-secondary);
}
.lf-detail-page .lf-topbar__meta--paid { color: var(--success-deep); }
.lf-detail-page .lf-topbar__back {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: var(--text-secondary);
  font-size: 13px;
  text-decoration: none;
  white-space: nowrap;
}
.lf-detail-page .lf-topbar__back:hover { color: var(--success); }

/* Scrollyta (formulär + tabell). */
.lf-detail-page .lf-scroll {
  flex: 1;
  overflow-y: auto;
  overflow-x: hidden;
  padding: var(--space-2) var(--space-3);
}

/* ⚠️⚠️ SUMMARADEN I TABELLEN — facit levfaktura-vy-v2.html `tr.sumrad`.
 *
 * Linje ÖVER och ingen under: raden hör till tabellen men är inte en post i
 * den. Talen står i sina egna kolumner och behöver därför ingen etikett —
 * «Summa debet» bredvid kolumnen den beskriver tvingade ögat att leta efter
 * vilken kolumn talet hörde till. */
.lf-detail-page .lf-sumrad td {
  border-top: 1.5px solid var(--text-primary);
  border-bottom: none;
  padding-top: 6px;
  font-weight: 650;
  background: var(--surface-card);
}
/* ⚠️ «Balanserad» är radens SVAR, inte en fjärde summa — därför i
 *    benämningskolumnen och i framgångsfärg, inte som ett tal. */
.lf-detail-page .lf-sumrad__svar { color: var(--success-deep); font-weight: 650; }

/* ⚠️⚠️ SUMMARADEN STAPLAS MED RESTEN PÅ MOBIL — och utan den här regeln gick
 * radeditorn sönder, mätt.
 *
 * `data-table--stack` gör `tbody` till `display: block` men rör inte `tfoot`.
 * En `tfoot` med sex celler behåller därför tabellens riktiga kolumnmodell, och
 * den modellen slår igenom på raderna ovanför: debet och kredit hamnade under
 * varandra (mätt y=1106 mot 1178) och borttagningsknappen krympte till 3 px i
 * en 27 px cell. Probat genom att ta bort `tfoot` — då blev båda gröna igen.
 *
 * ⚠️ Samma regler som `tbody` får, inte egna: summaraden ska läsas som en rad i
 * tabellen och inte som en egen ruta med egna vanor. */
@media (max-width: 760px) {
  .lf-detail-page .lf-rader-tabell tfoot { display: block; }
  .lf-detail-page .lf-sumrad {
    display: flex;
    flex-wrap: wrap;
    align-items: baseline;
    gap: var(--space-2);
    border-top: 1.5px solid var(--text-primary);
    padding-top: var(--space-2);
    margin-top: var(--space-2);
  }
  .lf-detail-page .lf-sumrad td { border-top: none; padding: 0; }
  /* ⚠️ Tomma celler tar ingen plats i ett flexläge — annars står summorna med
   *    två osynliga hål emellan sig. */
  .lf-detail-page .lf-sumrad td:empty { display: none; }
  .lf-detail-page .lf-sumrad__svar { flex: 1 1 100%; }
}

/* ⚠️⚠️ HUVUDETS TRE RADER — FLEX, INTE RUTNÄT, OCH SKÄLET ÄR MÄTT.
 *
 * ⚠️⚠️ FELET SOM BYTET RÄTTAR: ett rutnät med fasta spår tål inte ett barn som
 * kan försvinna. Beloppsraden hade SEX spår men FEM synliga barn, eftersom
 * fältet för belopp i vald valuta är dolt så länge valutan är kronor — och ett
 * `display: none`-barn tar inget spår. Varje senare fält gled ett steg vänster:
 *
 *   spåren        130  130   90  130  130  190
 *   kronor        valuta kurs TOTAL moms momstyp   (190 oanvänt)
 *   utländsk      valuta belopp kurs TOTAL moms momstyp
 *
 * ⚠️ Följden var mätt: totalfältet fick 90 px där dess etikett kräver 95,3 och
 * bröts till två rader, `align-items: start` lade fältet 18,7 px lägre än
 * grannarnas, och raden blev 75,5 px i stället för 60,8. Momstypens breda spår
 * användes aldrig i normalfallet.
 *
 * ⚠️ Och eftersom spåren blir lika breda under 1401 px försvann felet där —
 * huvudet var alltså 14,7 px HÖGRE på en bred skärm än på en smal.
 *
 * ⚠️ MED FLEX BOR BREDDEN HOS FÄLTET, inte hos dess plats i raden. Ett dolt
 * fält tar ingen plats och flyttar ingen annan. Samma mönster som plattformens
 * `.form-row`, som varit flex hela tiden — det var huvudet som avvek.
 *
 * ⚠️ DÄRFÖR HAR VARJE FÄLT EN EGEN KLASS och inte `:nth-child()`: en väljare
 * som räknar barn är samma fel en våning ned, och blir fel i samma stund som
 * ett fält döljs. */
.lf-detail-page .lf-huvudrad {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-bottom: 9px;
  /* ⚠️ `start`: celler med olika höga kontroller (inköpslandets knappar, en
     varningsrad under referensen) bottenjusterades förut och lyfte då den ena
     cellens ETIKETT — mätt 65 px isär på 1920. Etiketterna är det man läser
     raden efter. */
  align-items: flex-start;
}
.lf-detail-page .lf-huvudrad:last-of-type { margin-bottom: 0; }
/* Förvalet: fältet är sin egen bredd och varken växer eller krymper. */
.lf-detail-page .lf-huvudrad > * {
  flex: 0 0 auto;
  min-width: 0;
  margin-bottom: 0;
}

/* ⚠️⚠️ BREDDERNA ÄR RÄKNADE UR MÄTNINGEN, inte ur ett facit och inte ur ögat.
 *
 * ⚠️⚠️ FELET SOM RÄTTAS: beloppsraden använde 610 px av 1354 tillgängliga
 * medan TRE av dess fält klipptes. Leverantörsfältet hade 924 px och behövde
 * 213,4 för sin längsta rimliga sträng; fakturanumret hade 958 och behövde
 * 153,6. Överskottet låg där ingen behövde det.
 *
 * ⚠️ «Behöver» nedan = textens bredd vid 13,5 px plus 22 px ram och luft, mätt
 * med fältets egen font. För datumfälten tillkommer 32 px till kalenderknappen
 * — den ligger INUTI fältet, och utan den posten var talen fel.
 *
 *   Leverantör          behöver 213,4  («Svenska Handelsbanken AB (publ)»)
 *   Inköpsland          tre knappar, 157,9 uppmätt
 *   Betalas till        behöver 234,2  («IBAN SE65 1200 0000 0138 2137 035»)
 *   Fakturanummer       behöver 153,6  («INV-2026-0001-SE-001»)
 *   Fakturadatum        behöver 107,4  (63,4 + 10 + 32 + 2)
 *   Förfaller           behöver 107,4
 *   Betalningsreferens  behöver 157,9  (tjugo siffror)
 *   Valuta              behöver 173    («SEK — Svenska kronor»)
 *   Belopp i valuta     behöver  73
 *   Kurs                behöver  66,2  («10,8085»)
 *   Total               behöver  95,3  — ETIKETTEN, inte talet, är det breda
 *   Moms                behöver  79,8
 *   Momstyp             behöver 170,5  («Omvänd skattskyldighet» plus pilen)
 *
 * ⚠️ BARA TVÅ FÄLT ÄR FLEXIBLA. Ett leverantörsnamn och ett fakturanummer har
 * ingen övre gräns i praktiken; resten är tal, datum och koder med kända
 * längder, och ett fält som är bredare än sitt innehåll säger inget mer.
 *
 * ⚠️ INGA BREDD-BRYTPUNKTER MELLAN 761 OCH UPPÅT. Fälten krymper inte längre
 * med skärmen — de var redan räknade till vad innehållet kräver, och att
 * krympa dem därifrån är att välja klippning igen. Raden bryter i stället av
 * sig själv; det är vad `flex-wrap` är till för. */
/* ⚠️⚠️ TVÅ TAL PER FÄLT: den bekväma bredden och GOLVET.
 *
 * `flex-basis` är den bekväma bredden — den fältet har när det finns plats.
 * `min-width` är det uppmätta behovet plus ett par pixlar, och under det går
 * fältet aldrig.
 *
 * ⚠️⚠️ OCH GOLVET RÄCKER INTE FÖR ATT HÅLLA IHOP RADEN — det är mätt, inte
 * antaget. En flexrad med ombrytning bestämmer radbrytningen på `flex-basis`,
 * INTE på den krympta bredden: ett fält som inte får plats med sin bekväma
 * bredd flyttas ned, och krympningen sker först därefter, mellan dem som blev
 * kvar. Uppmätt vid 1280 px med panelen öppen: beloppsradens golv summerar till
 * 638 px av 714 tillgängliga, och raden bröt ändå.
 *
 * ⚠️ DÄRFÖR EN BRYTPUNKT, och den är RÄKNAD: vid 1400 px med panelen öppen är
 * innehållsytan 834 px medan rad 1 bekvämt behöver 800. Där tar bekvämligheten
 * slut, och under den går fälten ned på sitt golv i stället för att raden
 * bryter. Huvudet blir då 174,4 px ned till 1200 px i stället för 299,8 från
 * 1360 och nedåt.
 *
 * ⚠️ BRYTPUNKTEN MÄTER FÖNSTRET, INTE SPALTEN, och det är en känd svaghet:
 * panelen är dragbar, så en bred skärm med en bred panel får en smal spalt som
 * brytpunkten inte känner till. Golvet fångar det fallet — inget klipps — men
 * raden bryter tidigare än den hade behövt. En containerfråga hade mätt rätt
 * sak; kodbasen har ingen i dag, och att införa det mönstret hör inte hit.
 *
 * ⚠️ Golvet är inte en gissning om vad som «ser trångt ut» — det är strängen
 * som faktiskt står i fältet. Går det under golvet klipps ett tecken. */
.lf-detail-page .lf-f--lev { flex: 1 1 280px; min-width: 216px; }
.lf-detail-page .lf-f--fnr { flex: 1 1 180px; min-width: 156px; }

.lf-detail-page .lf-f--land     { flex: 0 1 210px; min-width: 160px; }
.lf-detail-page .lf-f--betalvag { flex: 0 1 290px; min-width: 236px; }
.lf-detail-page .lf-f--fdatum,
.lf-detail-page .lf-f--forfall  { flex: 0 1 145px; min-width: 110px; }
.lf-detail-page .lf-f--ref      { flex: 0 1 175px; min-width: 160px; }
.lf-detail-page .lf-huvudrad--3 > .valuta-group { flex: 0 1 185px; min-width: 175px; }
.lf-detail-page .lf-f--belopp   { flex: 0 1 125px; min-width:  80px; }
.lf-detail-page .lf-f--kurs     { flex: 0 1 105px; min-width:  70px; }
.lf-detail-page .lf-f--total    { flex: 0 1 115px; min-width:  98px; }
.lf-detail-page .lf-f--moms     { flex: 0 1 115px; min-width:  82px; }
.lf-detail-page .lf-f--momstyp  { flex: 0 1 185px; min-width: 173px; }

/* ⚠️ Golvet som bekväm bredd: fälten är exakt så breda som innehållet kräver,
 *    och raden håller ihop i stället för att bryta. Talen är samma `min-width`
 *    som ovan — EN uppsättning mått, inte två. */
@media (max-width: 1400px) {
  .lf-detail-page .lf-f--lev      { flex-basis: 216px; }
  .lf-detail-page .lf-f--fnr      { flex-basis: 156px; }
  .lf-detail-page .lf-f--land     { flex-basis: 160px; }
  .lf-detail-page .lf-f--betalvag { flex-basis: 236px; }
  .lf-detail-page .lf-f--fdatum,
  .lf-detail-page .lf-f--forfall  { flex-basis: 110px; }
  .lf-detail-page .lf-f--ref      { flex-basis: 160px; }
  .lf-detail-page .lf-huvudrad--3 > .valuta-group { flex-basis: 175px; }
  .lf-detail-page .lf-f--belopp   { flex-basis:  80px; }
  .lf-detail-page .lf-f--kurs     { flex-basis:  70px; }
  .lf-detail-page .lf-f--total    { flex-basis:  98px; }
  .lf-detail-page .lf-f--moms     { flex-basis:  82px; }
  .lf-detail-page .lf-f--momstyp  { flex-basis: 173px; }
}

@media (max-width: 760px) {
  .lf-detail-page .lf-huvudrad > * { flex: 0 1 calc(50% - 5px); }
  /* ⚠️⚠️ VALUTAN FÅR HELA RADEN PÅ MOBIL, och det är mätt sedan tidigare: i
   * tvåkolumnsläget blev fältet 71 px brett medan värdet är 169 — «Svenska
   * kronor (SEK)» klipptes till «Svensl». Kurs och de övriga talen delar nästa
   * rad; de rymmer sig i halva bredden. */
  .lf-detail-page .lf-huvudrad--3 > .valuta-group { flex: 0 1 100%; }
  /* ⚠️ Och betalvägen av samma skäl, mätt vid 375 px: ett IBAN är 212 px och
   *    fältet blev 130 i tvåspaltsläget — 120 px klipptes bort. Ett kontonummer
   *    som inte går att läsa helt är inte ett kontonummer. */
  .lf-detail-page .lf-f--betalvag { flex: 0 1 100%; }
}

/* Form-rader: kompakta grid-layouter inom detaljen. */
/* ⚠️⚠️ TVÅ KOLUMNER, INTE FYRA. Betalning och Plusgiro flyttade till
   betalningsraden längst ned; kvar är leverantören och inköpslandet.
   ⚠️ Inköpslandets tre knappar («Sverige | EU | Utanför EU») mätte 141 px och
   fick 130 — kolumnen är nu `auto` och tar den bredd knapparna behöver. */
.lf-detail-page .lf-grid--meta {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 6px;
  /* ⚠️ `start`, av samma skäl som betalningsraden nedan: bottenjustering av
     celler med olika höga kontroller lyfter den ena cellens etikett, och det
     är etiketterna man läser raden efter. */
  align-items: start;
  margin-bottom: 6px;
}
/* ⚠️⚠️ BETALNINGSRADEN — och `align-items: start` är RÄTTNINGEN, inte en detalj.
   Med `end` bottenjusteras celler av olika höjd, och en cell med hjälptext under
   sitt fält får då sin ETIKETT att rida uppåt: mätt på 1920 låg «Betalning»-
   etiketten på y=592 medan inköpslandets knappar låg på y=657 — 65 px isär, med
   båda underkanterna på 689. Det såg ut som ett trasigt rutnät och var en
   justeringsregel. Toppjustering radar upp etiketterna. */
.lf-detail-page .lf-grid--betalning {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 6px;
  align-items: start;
  margin-bottom: 6px;
}
@media (max-width: 760px) {
  .lf-detail-page .lf-grid--betalning { grid-template-columns: 1fr 1fr; }
}
.lf-detail-page .lf-grid--belopp {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr;
  gap: 6px;
  margin-bottom: 6px;
}
/* ⚠️⚠️ TVÅ SPÅR FÖR TVÅ FÄLT. Raden bar fyra spår och har alltid haft två barn
 * — «Vår referens» och «Leverantörens referens». Mätt i den öppnade panelen:
 * vid 1920 var spåren 424 px styck, alltså två fält på 424 och 848 px tom rad;
 * vid 1440 var de 304. Två referensfält som ryms på en tredjedel av sin plats,
 * medan namn av typen «Anna Andersson, ekonomiavdelningen» klipptes.
 *
 * ⚠️ FYRA SPÅR HADE ETT SKÄL — FAST FÖR EN ANNAN RAD. Kommentaren nedanför
 * motiverar fyra spår för `.lf-grid--valuta`, så att den ligger i linje med
 * `.lf-grid--belopp` kolumn för kolumn. De två raderna sitter i SKILDA kort:
 * valutan i beloppsraden, den här i panelen «Fler uppgifter — referenser». Det
 * fanns alltså inget att ligga i linje med.
 *
 * ⚠️ Mediafrågan längre ned fäller ihop den till två spår vid ≤760 px — där var
 * raden alltså hel hela tiden, och en mätning gjord bara på telefon hade sagt
 * att allt var bra. */
.lf-detail-page .lf-grid--extra {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 6px;
  margin-bottom: 6px;
}
/* Fyra fält (Valuta · Belopp i vald valuta · Kurs · Momstyp) i FYRA kolumner —
 * samma spår som .lf-grid--extra direkt ovanför, så de två raderna i panelen
 * "Ytterligare uppgifter" ligger i linje kolumn för kolumn. Tidigare stod här
 * `70px 90px 1fr`: tre spår för fyra fält → Valuta klämdes till 70px, Kurs fick
 * allt överskott (1fr) och Momstyp föll ned på en implicit rad i 70px-spåret. */
.lf-detail-page .lf-grid--valuta {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr;
  gap: 6px;
}
.lf-detail-page .lf-grid--tillagg {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: var(--space-2);
  margin-top: var(--space-3);
  padding-top: var(--space-3);
  border-top: 1px solid var(--line);
}
@media (max-width: 760px) {
  .lf-detail-page .lf-grid--meta,
  .lf-detail-page .lf-grid--belopp,
  .lf-detail-page .lf-grid--extra,
  .lf-detail-page .lf-grid--valuta,
  .lf-detail-page .lf-grid--tillagg {
    grid-template-columns: 1fr 1fr;
  }
  /* ⚠️⚠️ VALUTAN FÅR HELA RADEN PÅ MOBIL, och det är mätt: i tvåkolumnsläget
     blev fältet 71 px brett medan värdet är 169 — «Svenska kronor (SEK)»
     klipptes till «Svensl». Kurs och Total delar nästa rad; de är tal och
     rymmer sig i halva bredden.

     ⚠️⚠️ TVÅ REGLER, INTE EN, och det är mätt. `.lf-grid--valuta` är SJÄLV en
     post i `.lf-grid--belopp` — med bara den inre regeln blev fältet 132 px,
     för det inre rutnätet fick halva förälderns bredd. Båda måste spänna. */
  .lf-detail-page .lf-grid--belopp > .lf-grid--valuta {
    grid-column: 1 / -1;
  }
  .lf-detail-page .lf-grid--valuta > .valuta-group {
    grid-column: 1 / -1;
  }
}

/* Inköpsland-toggle: tre knappar i en pill. */
.lf-toggle-group {
  display: inline-flex;
  border: 1px solid var(--line);
  border-radius: 6px;
  overflow: hidden;
}
.lf-toggle-btn {
  padding: 3px 9px;
  font-size: 11px;
  font-weight: 500;
  font-family: var(--font-body);
  background: var(--surface-card);
  color: var(--text-secondary);
  border: none;
  cursor: pointer;
  transition: background .15s, color .15s;
  border-right: 1px solid var(--line);
}
.lf-toggle-btn:last-child { border-right: none; }
.lf-toggle-btn.vald {
  background: var(--success);
  color: var(--paper);
}

/* Ytterligare uppgifter — kollapsbar. */
.lf-extra-toggle {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 6px var(--space-3);
  font-size: 10px;
  font-weight: 600;
  color: var(--text-secondary);
  text-transform: uppercase;
  letter-spacing: .4px;
  cursor: pointer;
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  user-select: none;
  background: var(--surface-inset);
  margin: 4px calc(var(--space-3) * -1) 0;
}
.lf-extra-toggle:hover { color: var(--text-primary); }
.lf-chevron {
  transition: transform .2s;
  margin-left: auto;
}
.lf-extra-toggle.is-open .lf-chevron { transform: rotate(180deg); }

/* Konteringsregister-rubrik och summa-rad. */
.lf-konto-section { margin-top: var(--space-4); border-top: 1px solid var(--line); padding-top: var(--space-3); }
.lf-konto-section__title {
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .5px;
  color: var(--text-secondary);
  margin-bottom: var(--space-2);
}
.lf-konto-summa {
  display: flex;
  justify-content: flex-end;
  gap: 32px;
  padding: var(--space-2) 0;
  font-size: 13px;
  border-top: 1px solid var(--line);
}

/* Inleverans-underrad (lager, diagnos DEL D): visas under en konteringsrad
 * när radens konto är ett lagerkonto. Dämpad bakgrund = härledd/valfri
 * tilläggsinfo (samma signalspråk som auto-raderna nedan). Fälten ligger i
 * .form-group så plattformens fältstyling gäller (ej native). */
.lf-inl-rad .lf-inl-cell {
  background: var(--surface-inset);
  padding: var(--space-2) var(--space-3);
}
.lf-inl-falt {
  display: flex;
  align-items: flex-end;
  gap: var(--space-3);
  flex-wrap: wrap;
}
.lf-inl-falt .form-group { margin: 0; }
.lf-inl-falt .r-antal { max-width: 120px; }
/* Sökbar artikelväljare: växer och fyller raden; söktextinput full bredd. */
.lf-inl-artikel-group { flex: 1 1 220px; min-width: 0; }
.lf-inl-artikel-group .r-artikel-sok { width: 100%; box-sizing: border-box; }

/* Skapa-ny-artikel-modal: två kolumner, stackar på smal mobil (375px). */
.lf-artikelmodal-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-3);
}
.lf-artikelmodal-grid .lf-artikelmodal-full { grid-column: 1 / -1; }
.lf-artikelmodal-grid .form-group { margin: 0; }
.lf-artikelmodal-grid input,
.lf-artikelmodal-grid textarea { width: 100%; box-sizing: border-box; }
@media (max-width: 480px) {
  .lf-artikelmodal-grid { grid-template-columns: 1fr; }
}
.lf-inl-etikett {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  padding-bottom: var(--space-2);
  white-space: nowrap;
}

/* ⚠️⚠️ (i)-KNAPPEN SOM ERSATTE EN HEL TABELLRAD.
 *
 * Förklaringen låg som en egen <tr> per fakturarad och upprepade samma mening
 * varje gång: sex fakturarader blev arton tabellrader, och fakturan gick inte
 * att överblicka. Nu fälls samma text ut på klick, i cellen som redan finns.
 *
 * ⚠️ 24 px, inte mindre: knappen ska gå att träffa med tummen, och den sitter
 * inuti en etikett med `white-space: nowrap` — därför `inline-flex`, så att den
 * inte bryter raden. */
.lf-inl-info {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  margin-left: var(--space-2);
  padding: 0;
  border: 1px solid var(--line);
  border-radius: 50%;
  background: var(--surface-card);
  color: var(--text-secondary);
  font-size: var(--fs-eyebrow);
  font-style: italic;
  font-weight: 700;
  line-height: 1;
  cursor: pointer;
  vertical-align: middle;
}
.lf-inl-info:hover { color: var(--text-primary); border-color: var(--text-secondary); }
.lf-inl-info[aria-expanded="true"] {
  background: var(--surface-inset);
  color: var(--text-primary);
}

/* ⚠️ Den utfällda texten bryter normalt — till skillnad från etiketten, som är
 *    nowrap. Utan den raden ärver hjälptexten nowrap och spränger tabellen. */
.lf-inl-hjalp {
  white-space: normal;
  margin-top: var(--space-2);
  max-width: 68ch;
}
@media (max-width: 640px) {
  .lf-inl-falt { flex-direction: column; align-items: stretch; }
  .lf-inl-falt .r-antal { max-width: none; }
}

/* Auto-rader (osparbara, härleds från belopp/inköpsland).
 *
 * BARA visuell särdrag (dämpad bakgrund + text), INGA bredd-/storleks-
 * skillnader mot manuella rader. font-style: italic borttagen i #450:
 * DevTools-bevis från användaren visade att italic var ROTORSAKEN till
 * kapningen av "1 999 999,75" — italic-glyphen tar mer plats än
 * normal vid samma punkt-storlek. Normal text är dessutom mer läsbar
 * för belopp. Auto-radens disabled-attribut + denna dämpade visual
 * räcker som signal om att raden är härledd. */
input.r-auto-amt {
  background: var(--surface-inset);
  color: var(--text-secondary);
}

/* Leverantörsväljare-anchor.
 *
 * ⚠️ Regeln som spände listan över cellen (`top: 100%; left: 0; right: 0`) är
 * borta: listan ritas i <body> sedan den portalerades, så väljaren matchade
 * ingenting längre. En stilregel som inte kan träffa något är sämre än ingen —
 * nästa läsare tror att den styr placeringen. Placeringen bor i
 * lib/lista-portal.js. */
.lf-lev-wrap { position: relative; }

/* Åtgärdsbar längst ned i detalj-vyns kort. */
.lf-detail-page .lf-actionbar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: var(--space-2) var(--space-3);
  border-top: 1px solid var(--line);
  flex-shrink: 0;
  background: var(--surface-card);
  gap: var(--space-2);
  flex-wrap: wrap;
}
.lf-detail-page .lf-actionbar__group {
  display: flex;
  gap: var(--space-2);
  flex-wrap: wrap;
}

/* ⚠️⚠️ KNAPPRADEN FÄSTS I UNDERKANTEN PÅ MOBIL — 375 px.
 *
 * ⚠️ MÄTNINGEN SOM MOTIVERAR DET: «Bokför» började vid 2 762 px i den vy etapp
 * 3 lämnade, alltså 3,4 skärmar att skrolla för att nå knappen man trycker på
 * varje gång. Blocken krympte i den här etappen — men vyn är ändå 2 831 px och
 * knappraden börjar vid 2 462. Kortare vy räcker inte; en fäst rad löser det
 * oavsett hur lång vyn blir.
 *
 * ⚠️ SIDAN SCROLLAR, INTE PANELEN, under 761 px (`.detail-split` har bunden
 * höjd först över brytpunkten). Därför `position: sticky` mot sidans rullning
 * och inte en fast överlagring: raden ligger kvar i flödet, tar sin plats sist
 * i panelen, och kan inte lägga sig över något som står under den.
 *
 * ⚠️ SKUGGAN BÄR BESKEDET att det finns mer ovanför. Utan den ser den fästa
 * raden ut som vyns slut — och då slutar man skrolla vid den.
 *
 * ⚠️ TOPPRADEN FÄSTS OCKSÅ, och det är en FÖLJD av att «Avbryt» togs bort:
 * tillbakapilen är nu enda vägen ur vyn utan att spara, och den låg 2 400 px
 * upp. `top` är den globala topbarens höjd (`.topbar` är sticky top:0, 56 px);
 * z-index under dess 50 så menyn aldrig hamnar bakom kortets rad. */
@media (max-width: 760px) {
  .lf-detail-page .lf-actionbar {
    position: sticky;
    bottom: 0;
    z-index: 20;
    box-shadow: 0 -4px 14px rgba(15, 23, 42, .09);
  }
  .lf-detail-page .lf-topbar {
    position: sticky;
    top: var(--topbar-h);
    z-index: 20;
    background: var(--surface-card);
  }
}

/* ── Tolkningskortets fyra varianter (facit v7) ─────────────────────────────
   ⚠️ FÄRGEN BÄR INTE BETYDELSEN ENSAM. En färgblind läsare ser inte skillnad
   på ett rött och ett grönt kort — rubriken säger vad som gäller, och den
   kommer ur TOLKNINGSLAGEN. Färgen är en förstärkning, inte budskapet.
   ⚠️ Tokennamnen är uppslagna i tokens.css, inte gissade: två gissade namn i
   den här serien fångades av CSS-vakten, och uppslaget kostar sekunder. */
.ai-kort.tolkkort--arbetar {
  border-color: var(--brand);
  background:   var(--brand-light);
}
.ai-kort.tolkkort--fel {
  border-color: var(--danger-deep);
  background:   var(--danger-soft);
}
.ai-kort.tolkkort--klar {
  border-color: var(--success-deep);
  background:   var(--success-soft);
}
.ai-kort .tolkkort__brod {
  margin: 0 0 var(--space-2);
  font-size: 12.5px;
}
/* ⚠️ PULSEN SITTER BARA PÅ ARBETSLÄGENA. Puls betyder «systemet arbetar,
   vänta»; på ett fel är det en lögn, och att pulsa i evighet på något dött är
   precis vad nollbytefelet levde på. Villkoret står i tabellen, inte här. */
.ai-kort .tolkkort__puls {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--brand);
  animation: tolkkort-puls 1.4s infinite;
}
@keyframes tolkkort-puls {
  0%, 100% { opacity: .3; }
  50%      { opacity: 1; }
}
@media (prefers-reduced-motion: reduce) {
  /* ⚠️ En blinkande prick är rörelse. Den som bett om mindre rörelse ska få
     en stilla prick — inte ingen prick, för då försvinner signalen. */
  .ai-kort .tolkkort__puls { animation: none; opacity: .7; }
}

/* ── Auto-rader i konteringseditorn (facit v7) ──────────────────────────────
   Moms- och leverantörsskuldsraderna härleds ur fakturans huvud och går inte
   att redigera. ⚠️ De var redan avstängda men såg ut som rader man råkat låsa;
   märket säger VARFÖR. */
.lf-detail-page .autorad > td {
  /* ⚠️ --surface-inset är repots token för nedsänkta ytor (tabellhuvuden,
     badges). Jag skrev först `var(--surface-muted, #fbfcfd)` — en variabel som
     inte finns, räddad av en fallback som därmed BLIR färgen. Vakten fällde
     det, precis som den gjorde för --danger i etapp 1. */
  background: var(--surface-inset);
}
.lf-detail-page .autorad__las {
  font-size: 10.5px;
  text-transform: uppercase;
  letter-spacing: .05em;
  font-weight: 650;
  color: var(--muted-svag);
}

/* ── Detaljvyns fyra avdelningar (facit v7) ─────────────────────────────────
   ⚠️ INGEN WIZARD. Allt syns samtidigt; rubriken säger vilket beslut man är i.
   Avdelningarna skiljs av en linje, inte av numrering — en siffra hade antytt
   en ordning man måste följa, och den finns inte. */
.lf-detail-page .lf-steg {
  border-top: 1px solid var(--line);
}
.lf-detail-page .lf-steg:first-of-type {
  border-top: none;
}
.lf-detail-page .lf-steg__rub {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-3) var(--space-4) var(--space-2);
}
.lf-detail-page .lf-steg__rub h3 {
  font-size: 13.5px;
  font-weight: 650;
  margin: 0;
}
/* ⚠️ Klarmärket står kvar för de rubriker som FINNS kvar («Fakturan» på en
   e-faktura). «Vem», «Vad» och «Hur den konteras» utgår i mobilomritningen v2,
   och deras märken med dem — de upprepade något som står i fältet två rader ned. */
.lf-detail-page .lf-steg__klar {
  margin-left: auto;
  font-size: 11.5px;
  font-weight: 650;
  color: var(--success-deep);
}
.lf-detail-page .lf-steg__kropp {
  padding: 0 var(--space-4) var(--space-3);
}
/* ⚠️⚠️ ETT BLOCK UTAN RUBRIKRAD BEHÖVER SIN ÖVRE LUFT TILLBAKA.
   Padding-top låg på `.lf-steg__rub`; utan den klistrar fälten mot linjen som
   skiljer blocken åt, och grupperingen — det som faktiskt löste stökigheten i
   etapp 2 — försvinner med rubriken. Linjen (`border-top` ovan) och den här
   luften är vad som håller ihop blocken nu. */
.lf-detail-page .lf-steg--utan-rubrik > .lf-steg__kropp {
  padding-top: var(--space-4);
}

/* ⚠️ ETT LÅST FÄLT SKA SE LÅST UT. Bankgirot hämtas ur leverantörsregistret
   och hade samma form som fälten runt omkring — alltså såg det redigerbart ut,
   och den som ändrade det undrade varför ingenting hände. Streckad ram är
   samma signal som facit ger de låsta fälten på en bokförd faktura. */
/* ⚠️ Radens namn på borttagningsknappen är DOLT SOM FÖRVAL och visas bara i
   stack-läget (≤760 px). På desktop är cellen 69 px i en tabell med radtäthet —
   en textknapp per rad hade brutit tabellen. Se stack-reglerna längre ned. */
.lf-detail-page .r-rm__text { display: none; }

.lf-detail-page .lf-falt--las:disabled,
.lf-detail-page .lf-falt--las[disabled] {
  border-style: dashed;
}

/* ── E-fakturans detaljvy (facit v7) ────────────────────────────────────────
   ⚠️ AVSÄNDARENS FÄLT SER LÅSTA UT, av samma skäl som den bokförda fakturans:
   de var redan `disabled` men såg ut som fält man råkat låsa. Streckad ram
   säger att låsningen är avsiktlig — det är någon annans faktura. */
.lf-detail-page .lf-steg--avsandare input:disabled,
.lf-detail-page .lf-steg--avsandare select:disabled {
  border-style: dashed;
}
/* ⚠️ Noten står under fälten, inte över: den svarar på frågan man ställer
   EFTER att ha försökt skriva i ett av dem. */
.lf-detail-page .lf-avsandarnot {
  margin-top: var(--space-3);
}
/* Konteringens knappar — «+ Lägg till rad» och genvägen — på samma rad,
   men brytbara. ⚠️ Genvägens text bär leverantörens namn och kan bli lång. */
.lf-detail-page .lf-konto-knappar {
  display: flex;
  gap: var(--space-2);
  flex-wrap: wrap;
  align-items: center;
}

/* ── Verifikatrutan på en bokförd faktura (facit v7) ────────────────────────
   ⚠️ STÅR ÖVERST, före avdelningarna. På en bokförd faktura är det första man
   vill veta vad som HÄNDE — inte vad som ska avgöras. */
.lf-detail-page .lf-ver {
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  overflow: hidden;
  margin: var(--space-3) var(--space-4);
}
.lf-detail-page .lf-ver__rubrik {
  /* ⚠️ Samma form som tabellhuvudena i vyn: versal, gles, på nedsänkt yta.
     Rutan är en LISTA över det som hänt, inte ett larm. */
  padding: var(--space-2) var(--space-3) var(--space-1);
  font-size: 10.5px;
  text-transform: uppercase;
  letter-spacing: .05em;
  font-weight: 650;
  color: var(--muted-svag);
  background: var(--surface-inset);
}
.lf-detail-page .lf-ver__rad {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  flex-wrap: wrap;
  padding: var(--space-2) var(--space-3);
  border-top: 1px solid var(--line);
  font-size: var(--fs-sm);
}
.lf-detail-page .lf-ver__nr {
  font-weight: 650;
  /* ⚠️ Numret är radens identitet och ska gå att läsa i en kolumn med andra —
     därför tabellsiffror HÄR och inte på hela raden. */
  font-variant-numeric: tabular-nums;
}
.lf-detail-page .lf-ver__text {
  color: var(--text-secondary);
}
.lf-detail-page .lf-ver__oppna {
  margin-left: auto;
}
/* ⚠️⚠️ KREDITGRADEN ÄR EN SAMMANFATTNING, INTE EN HÄNDELSE — den står därför
   under raderna och utan verifikatnummer. Raderna säger vad som hänt; den här
   raden säger vad de tillsammans BLEV.

   ⚠️ SAMMA NEDSÄNKTA YTA SOM RUBRIKEN, så att den läses som rutans ram och inte
   som en fjärde händelse. */
.lf-detail-page .lf-ver__kreditgrad {
  padding: var(--space-2) var(--space-3);
  border-top: 1px solid var(--line);
  background: var(--surface-inset);
  font-size: var(--fs-sm);
  font-weight: 650;
  color: var(--text-secondary);
}
/* ⚠️ Överkreditering är inget fel som spärras — men den ska SYNAS. En
   kreditnota större än fakturan betyder att någon behöver titta. */
.lf-detail-page .lf-ver__kreditgrad--over {
  color: var(--danger);
}

/* ⚠️⚠️ ETT BOKFÖRT VERIFIKAT KAN INTE ÄNDRAS — det kan bara motbokas eller
   krediteras. Fälten var redan `disabled`, men såg ut som fält man råkat låsa.
   Streckad ram säger att låsningen är avsiktlig och varaktig.

   ⚠️ KLASSEN SITTER PÅ ROTEN, så regeln gäller också fält som läggs till
   senare — ett fält som glömmer sin egen låsklass är precis det som gör att
   halva vyn ser låst ut och halva inte. */
.lf-detail-page.is-laast input:disabled,
.lf-detail-page.is-laast select:disabled,
.lf-detail-page.is-laast textarea:disabled {
  border-style: dashed;
}

/* ── Attestrutan i «Bokför»-avdelningen (facit v7) ──────────────────────────
   ⚠️ RUTAN RITAS BARA när leverantören kräver attest. Därför får den kosta
   utrymme: den som ser den behöver läsa den. */
.lf-detail-page .lf-attest {
  margin-top: var(--space-3);
}
.lf-detail-page .lf-attest__larm.alert,
.lf-detail-page .lf-attest__avslag.alert {
  margin-bottom: var(--space-3);
}
/* ⚠️ Orsaken är den som registrerade fakturans ENDA besked om vad som ska
   rättas. Den får därför egen rad, inte en parentes efter datumet. */
.lf-detail-page .lf-attest__orsak {
  margin-top: var(--space-1);
  font-weight: 400;
}
.lf-detail-page .lf-attest__rad {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  flex-wrap: wrap;
}
.lf-detail-page .lf-attest__etikett {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
}
/* ⚠️ Väljaren växer, etiketten inte. Namnen är olika långa och ett fält som
   byter bredd när man byter person läser som ett fel. */
.lf-detail-page .lf-attest__valj {
  flex: 1 1 220px;
  min-width: 0;
}
.lf-detail-page .lf-attest__registrerad,
.lf-detail-page .lf-attest__ansvarig {
  margin-top: var(--space-2);
}
/* ⚠️ Den attesterade rutan har ingen egen färg. «Attesterad 2026-01-27 av
   Lina» är ett faktum, inte ett larm — en grön ruta hade firat att en
   kontroll gjorts, vilket är det normala fallet. */
.lf-detail-page .lf-attest__klartext {
  font-size: var(--fs-sm);
}

/* Låst ångra-knapp med sitt skäl bredvid.
   ⚠️ Skälet står som text, inte bara som title: en avstängd knapp med en
   förklaring man måste hovra fram är ingen förklaring på pekskärm. */
.lf-detail-page .lf-angra-last {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  flex-wrap: wrap;
}
.lf-detail-page .lf-angra-last__skal {
  max-width: 42ch;
}

/* Betaldialogens periodbesked. Neutralt när datumet duger, varnande när det
   inte går att bokföra — och knappen är låst så länge det står något här. */
.lf-betald-datum-besked--fel {
  /* ⚠️ INGEN FALLBACK. --danger är definierad i tokens.css; en fallback hade
     dessutom lagt in en ANNAN hex än tokenet, och den hexen blir den faktiska
     färgen om variabeln någon gång försvinner. Vakten i
     test/unit/css-odefinierade-variabler.test.ts fällde just detta. */
  color: var(--danger);
}

/* Splitlayoutens left har en card-look — wrappar formuläret. */
.lf-detail-page .detail-split__left {
  background: var(--surface-card);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  overflow: hidden;
}
.lf-detail-page .detail-split {
  height: calc(100vh - 112px);
  min-height: 0;
  overflow: hidden;
}
@media (max-width: 760px) {
  .lf-detail-page .detail-split {
    height: auto;
    overflow: visible;
  }
  .lf-detail-page .detail-split__left {
    height: auto;
    overflow: visible;
  }
}


/* Småklasser för lev-faktura-detaljens layout (#431). */
.lf-detail-page .lf-alert-slot { flex-shrink: 0; padding: 0 var(--space-3); }
.lf-detail-page .lf-alert-slot .alert { margin-bottom: var(--space-2); }
.lf-detail-page .lf-ai-slot { flex-shrink: 0; padding: 0 var(--space-3); }
.lf-detail-page .lf-extra-panel { padding-top: var(--space-2); }
.lf-detail-page .lf-lagg-till-btn { margin-top: 4px; }

/* attach-panel: empty-state när faktura inte är sparad. */
.attach-panel__empty {
  padding: var(--space-4);
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  text-align: center;
  margin-top: var(--space-4);
}

/* lev-faktura-topbar mittsektion. */
.lf-detail-page .lf-topbar__main {
  display: flex;
  align-items: baseline;
  gap: var(--space-2);
  flex: 1;
  flex-wrap: wrap;
}

/* KONTERING-RADERNAS DENSITET = LISTVYNS (#432) ─────────────────────
 * Konteringsregister i detaljvyer (lev-faktura, verifikat, kvitto) ska
 * ha samma vertikala rytm som bokföringens LISTVY. Listdensiteten
 * (#33b/#425): tbody td padding var(--space-2) var(--space-3) + font
 * --fs-sm. Med 32px input (#430) i en td blir radhöjden ~48px, listans
 * är ~30px → ute ur takt.
 *
 * Här tightare: td padding 2px vertikalt (cellen blir nästan kollapsad),
 * input min-height 26px, padding 2px 6px → radhöjd ~30px. Bara desktop.
 * Mobil orörd (#427 — 44px touch-target + 16px font).
 */
/* KONTERING-RADERNAS DENSITET — INTE @media-scopad (#434-fix)
 *
 * RECON (#434, empirisk via jsdom): #432-regeln för densiteten låg inom
 * `@media (min-width: 761px)`-wrap som av oklar anledning INTE matchade
 * konsekvent i utkast/granska-läget — bas-regeln i style.css
 * (`input { padding: 9px 12px; font-size: 13.5px }`, specificitet (0,1,1))
 * vann. JSDOM-testet (test/unit/lev-faktura-densitet-recon.test.ts)
 * isolerade: identisk regel UTAN media-wrap matchar (computed height=26px,
 * padding=2px 6px); MED wrap blir det 9px 12px = bas-regeln. Bokfört-
 * läget såg "rätt" eftersom disabled-inputs visuellt smälter in.
 *
 * Fix: regeln scope:as på `.detail-page` (utan media) — gäller alla
 * detaljvyer (lev-faktura, verifikat, kvitto). Mobil-skyddet (#427:
 * 44px touch + 16px font) ligger i egen @max-width-regel med samma
 * specificitet → vinner via media-match. INGA defensiva lager till.
 *
 * UTKAST/BOKFÖRT/GRANSKA-LÄGEN: nu identiska eftersom regeln matchar
 * oberoende av input-state och rita() ritar samma markup för alla.
 */
.detail-page .data-table--rader tbody td {
  padding: 2px var(--space-3);
}
.detail-page .data-table--rader thead th {
  padding: var(--space-1) var(--space-3);
}
.detail-page .data-table--rader td input[type="text"],
.detail-page .data-table--rader td input[type="number"],
.detail-page .data-table--rader td select,
.detail-page .data-table--rader td input.r-konto,
.detail-page .data-table--rader td input.r-debet,
.detail-page .data-table--rader td input.r-kredit,
.detail-page .data-table--rader td input.r-tinfo {
  min-height: 26px;
  height: 26px;
  padding: 2px 6px;
  line-height: 1.2;
  font-size: var(--fs-sm);
}

/* AUTO-RAD-OVERRIDE BORTTAGEN (#450)
 *
 * #446/#448 lade en padding/max-width-override för r-auto-amt eftersom
 * italic kapades. Användarens devtools-bevis (#450) visade att italic
 * SJÄLV var rotorsaken — inte padding eller max-width. När italic är
 * borta (se input.r-auto-amt-regeln ovan, rad ~2892) räcker den delade
 * regeln på rad ~2176 (width 100%, ingen max-width) för båda rad-typer.
 *
 * Auto + manuell har nu IDENTISK bredd/storlek/padding — bara
 * disabled-attributet + dämpad bakgrund/färg skiljer dem. En delad
 * regel, ingen parallell.
 */

/* TA BORT NUMBER-SPINNERS GLOBALT (#436)
 *
 * Upp/ned-pilarna (±0,01) stör mer än hjälper på belopp/antal-fält.
 * Plattformsbred CSS — gäller alla number-inputs (verifikat-rader,
 * faktura-modal, lev-faktura, kvitto, lön m.fl.). Tangentbord +
 * validering oförändrade — bara visuell/interaktiv borttagning.
 */
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
  -webkit-appearance: none;
  margin: 0;
}
input[type="number"] {
  -moz-appearance: textfield;
  appearance: textfield;
}

/* KONTO-CELLEN — VÄNSTERLINJERA INPUT OCH SPAN (#436)
 *
 * RECON: auto-rader (_insertAutoTr) renderar konto som <span class="font-mono">,
 * user-rader (laggTillRad) som <input class="r-konto">. Input har bas-
 * regelns border (1px) + #434:s padding (6px left). Span saknar både.
 * → konto-text på user-rad börjar ~7px höger om auto-rad → ur linje.
 *
 * FIX: spannen får samma box-modell — padding + transparent border —
 * så texten startar på samma x-position. Höjd matchar inputens 26px
 * så cell-baseline blir likadan oavsett rad-typ.
 */
.detail-page .data-table--rader td.cell-konto > span.font-mono {
  display: inline-block;
  box-sizing: border-box;
  padding: 2px 6px;
  border: 1px solid transparent;
  height: 26px;
  line-height: 20px;
  vertical-align: middle;
}

/* TA-BORT-KNAPPEN (#435): user-raderna (laggTillRad) har en .btn-icon
 * .r-rm-knapp i sista cellen. Bas-regeln .btn-icon { width: 44px;
 * min-height: 44px; } driver upp HELA radhöjden till 44px (touch-target)
 * och får user-rader att se ~50% högre ut än auto-rader (~30px).
 *
 * Fix på samma princip som densiteten ovan: tät desktop UTAN @media,
 * mobil-touch-target via @max-width-override. Knappen blir 24×24px
 * desktop = matchar input-höjden (26px) → radhöjd identisk med auto-
 * raderna. Mobil-touch-target (#427) behålls. */
.detail-page .data-table--rader .btn-icon.r-rm {
  width: 24px;
  min-height: 24px;
  height: 24px;
  padding: 0;
  font-size: 14px;
}

/* Mobil-skydd: 44px touch-target + 16px font.
 * Samma selektor-specificitet (0,3,2) som desktop-regeln ovan — vinner
 * via media-query-match på mobil. Återställer height: auto så att
 * inputs kan växa till touch-targetet. */
@media (max-width: 760px) {
  .detail-page .data-table--rader td input[type="text"],
  .detail-page .data-table--rader td input[type="number"],
  .detail-page .data-table--rader td select,
  .detail-page .data-table--rader td input.r-konto,
  .detail-page .data-table--rader td input.r-debet,
  .detail-page .data-table--rader td input.r-kredit,
  .detail-page .data-table--rader td input.r-tinfo {
    min-height: var(--tap-target);
    height: auto;
    padding: 6px 8px;
    font-size: 16px;
  }
  /* Touch-target på ta-bort-knappen återställs på mobil. */
  .detail-page .data-table--rader .btn-icon.r-rm {
    width: var(--tap-target);
    min-height: var(--tap-target);
    height: var(--tap-target);
    font-size: 16px;
  }
}


/* ─── 43. AI-granskningskortet — etapp 2-skin (#432) ──────────────
 *
 * Kompakta förslagsrader med intern scroll så kortet aldrig växer
 * under skärmkanten. Försvinner när AI-förslaget tillämpats — då
 * visar detaljvyn en liten AI-ikon vid konteringsrubriken (.ai-marker)
 * istället. */

.ai-kort {
  border-color: var(--info-soft);
  margin-bottom: var(--space-3);
}
.ai-kort__header {
  background: rgba(37, 99, 235, .04);
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--space-2);
  flex-wrap: wrap;
}
.ai-kort__title-row {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  flex-wrap: wrap;
}
.ai-kort__placeholder-alert { margin-bottom: var(--space-3); }

.ai-kort__lev-section { margin-bottom: var(--space-3); }
.ai-kort__lev-heading {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  margin-bottom: var(--space-1);
}
.ai-kort__lev-info {
  background: var(--surface-inset);
  padding: var(--space-2) var(--space-3);
  border-radius: var(--radius);
  font-size: 12.5px;
}
.ai-kort__lev-actions {
  display: flex;
  gap: var(--space-2);
  margin-top: var(--space-2);
  flex-wrap: wrap;
  align-items: center;
}
/* Leverantörssökningen (artikelsökningens komponent) tar raden; knapparna
 * bryts under den på smal skärm. */
.ai-kort__lev-sok {
  flex: 1;
  min-width: 200px;
}
.ai-kort__lev-select {
  width: 100%;
}

/* Förslags-sektionen: tabellen i tät listdensitet + INTERN SCROLL. */
.ai-kort__forslag-heading {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  margin-bottom: var(--space-1);
}
.ai-kort__forslag-scroll {
  border: 1px solid var(--line);
  border-radius: var(--radius);
  overflow: auto;
  /* Maxhöjd så kortet aldrig växer under skärmkanten oavsett radantal.
   * Räknat på ~6-7 rader plus thead/summa-rader: 240px. Hellre lite
   * mer scroll än en sida som flödar ner. */
  max-height: 240px;
  -webkit-overflow-scrolling: touch;
}
.ai-kort__forslag-tabell {
  width: 100%;
  font-size: 12.5px;
}
.ai-kort__forslag-tabell thead th {
  background: var(--surface-inset);
  padding: 4px var(--space-2);
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--text-secondary);
  text-align: left;
  position: sticky;
  top: 0;
  z-index: 1;
}
.ai-kort__forslag-tabell tbody td {
  padding: 4px var(--space-2);
  border-top: 1px solid var(--line);
}
.ai-kort__forslag-summa td {
  border-top: 2px solid var(--line) !important;
  font-weight: 600;
}
.ai-kort__forslag-brutto td {
  font-weight: 600;
}

.ai-kort__forslag-actions {
  display: flex;
  gap: var(--space-2);
  margin-top: var(--space-2);
  flex-wrap: wrap;
  align-items: center;
}

/* Kurs-banner (utländsk valuta). */
.ai-kort__kurs-banner {
  margin-top: var(--space-3);
  padding: var(--space-2) var(--space-3);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--surface-inset);
}
.ai-kort__kurs-label {
  font-size: 12.5px;
  font-weight: 600;
  display: block;
  margin-bottom: 4px;
}
.ai-kort__kurs-row {
  display: flex;
  gap: var(--space-2);
  align-items: center;
  flex-wrap: wrap;
}
.ai-kort__kurs-row input {
  width: 140px;
}
.ai-kort__kurs-status {
  font-size: 12px;
  color: var(--text-secondary);
}

.ai-conf-pill { font-size: 10px; padding: 0 4px; }


/* ─── 44. AI-ikon i listrader (#434) ───────────────────────────────
 *
 * Listans ✨-ikon på AI-konterade fakturarader. Konsoliderat från
 * detaljvyns "konteringsrubrik-markör" (borttagen i #434 — nyttan
 * fanns enbart i listan). Asterisk-distinktionen (orörd/redigerad)
 * utgår också.
 *
 * Bara ikon-stilning återstår: .cell-ai-kolumnen (rad 4615) bestämmer
 * positionen; .cell-title__ai-mobil (samma fil) renderar mobil-inline-
 * placeringen.
 */
.ai-marker__icon {
  width: 12px;
  height: 12px;
  flex-shrink: 0;
  display: inline-block;
  color: var(--info-deep);
}


/* ─── 45. Källunderlag inline i attach-panel (#432 — punkt 3) ───
 *
 * .attach-panel renderar nu KÄLLUNDERLAGET (PDF/bild) som egen sektion
 * överst, sedan eventuella vanliga bilagor under. Källunderlaget kommer
 * från supplier_invoices.underlag_blob_pathname via API-routen
 * /api/leverantorsfakturor/{id}/underlag som strömmar bloben inline.
 *
 *   <div class="attach-panel">
 *     <div class="attach-panel__source-section">    <!-- NY -->
 *       <div class="attach-panel__source-header">Källunderlag</div>
 *       <iframe class="attach-panel__source-pdf" …>   för PDF
 *       <img    class="attach-panel__source-img" …>   för bild
 *       <div class="attach-panel__source-meta">filnamn</div>
 *     </div>
 *     <div class="attach-panel__source-divider"></div>
 *     <div class="attach-panel__header">…</div>     <!-- ÖVRIGA BILAGOR -->
 *     …
 *   </div>
 */
.attach-panel__source-section {
  border-bottom: 1px solid var(--line);
  padding: 0;
  display: flex;
  flex-direction: column;
  flex-shrink: 0;
}
.attach-panel__source-header {
  padding: var(--space-3) var(--space-4);
  font-size: var(--fs-eyebrow);
  font-weight: 700;
  color: var(--info-deep);
  text-transform: uppercase;
  letter-spacing: .5px;
}
.attach-panel__source-pdf {
  width: 100%;
  min-height: 320px;
  border: none;
  background: var(--surface-inset);
}
/* ⚠⚠ ZOOMYTAN. Bilden skalas med `width` i procent, inte med `transform:
 * scale()`. Skälet är SKÄRPAN, inte rullningen: `width` låter webbläsaren
 * rendera om bilden i den nya storleken medan `scale()` förstorar den redan
 * renderade bitmappen. För ett kvitto som ska LÄSAS är det hela poängen.
 * ⚠️ (En tidigare version av den här kommentaren påstod att en transform inte
 * ger rullningslister. Probat — fel; transformerad överskjutning räknas till
 * rullbar yta, så båda varianterna går att panorera.) */
.attach-panel__source-yta {
  overflow: auto;
  max-height: 60vh;
  background: var(--surface-inset);
  -webkit-overflow-scrolling: touch;
}
.attach-panel__source-yta.kan-panorera { cursor: grab; }
.attach-panel__source-yta.panorerar    { cursor: grabbing; user-select: none; }

.attach-panel__source-img {
  width: 100%;
  height: auto;
  display: block;
  background: var(--surface-inset);
  cursor: zoom-in;
  /* ⚠️ Ingen max-width: 100% — den hade tagit bort hela zoomen genom att
   *    klämma tillbaka bilden till ytans bredd. */
  max-width: none;
}

/* ⚠️ Verktygsraden ligger i flödet ovanför bilden, inte som ett överlägg:
 *    ett överlägg hade täckt just den del av kvittot man zoomat in på. */
.attach-panel__zoomverktyg {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-2) var(--space-4);
  border-bottom: 1px solid var(--line);
}
.attach-panel__zoomverktyg button {
  width: 28px;
  height: 28px;
  padding: 0;
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  background: var(--surface-card);
  color: var(--text-primary);
  font-size: var(--fs-body);
  line-height: 1;
  cursor: pointer;
}
.attach-panel__zoomverktyg button:hover { border-color: var(--text-secondary); }
.attach-zoom-niva {
  min-width: 5ch;
  text-align: center;
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  font-variant-numeric: tabular-nums;
}
.attach-panel__source-meta {
  padding: var(--space-1) var(--space-3);
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.attach-panel__source-mobile-fallback {
  padding: var(--space-4) var(--space-3);
  text-align: center;
}
.attach-panel__source-mobile-fallback a {
  display: inline-flex;
  align-items: center;
  gap: 4px;
}

/* Mobil: PDF i iframe är pixiel-instabil — visa "Öppna i ny flik"-länk
 * i stället. Bilder funkar ok inline. */
@media (max-width: 760px) {
  .attach-panel__source-pdf {
    display: none;
  }
}


/* ─── 46. AI-markör i listrader (#433-1b) ─────────────────────────
 *
 * Liten ✨-ikon på fakturarader vars kontering tillämpats från AI.
 * Mönstret speglar gem-ikonen (cell-bilaga / #426): fast smal kolumn
 * desktop, inline vid titeln på mobil (EN gång — punkt 1a-läxan om
 * dubblettrisk).
 *
 * Distinktionen orörd/redigerad (asterisk) är detalj-exklusiv så listans
 * rendering förblir billig (klient-side O(rader) per faktura räcker).
 */
.cell-ai {
  width: 32px;
  text-align: center;
}
/* Mobil: göm kolumnen — dubblettsäkrad på samma sätt som .cell-bilaga
 * (klass-baserad regel oberoende av stack-scopet, #426-fixen). */
@media (max-width: 760px) {
  .cell-ai { display: none !important; }
}

/* Inline-ikon i titel-cellen — synlig BARA mobil (desktop har egen kolumn). */
.cell-title__ai-mobil { display: none; }
@media (max-width: 760px) {
  .cell-title__ai-mobil { display: inline-flex; }
}


/* ─── 47. Attach-panel — källunderlag full höjd (#433-2) ──────────
 *
 * När fakturan har KOPPLAT källunderlag tar den sektionen hela panel-
 * höjden — preview viktigast. Drop-zonen ersätts av en kompakt
 * "Bifoga fler underlag"-knapp i panel-headern. Tomt-läge oförändrat
 * (drop-zonen som tidigare när inget innehåll finns).
 *
 * Standardregel — gäller alla .attach-panel-konsumenter (lev-faktura
 * först, verifikat-detalj ärver).
 */
.attach-panel--source-fill .attach-panel__source-section {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  min-height: 0;
}
.attach-panel--source-fill .attach-panel__source-pdf,
.attach-panel--source-fill .attach-panel__source-img {
  flex: 1 1 auto;
  min-height: 0;
}
.attach-panel--source-fill .attach-panel__source-pdf {
  height: 100%;
}
/* ⚠️⚠️ BILDEN HAR INGET HÖJDTAK — och det är hela zoomen.
 *
 * ⚠️⚠️ HÄR STOD `max-height: 100%` OCH `object-fit: contain`, och följden var
 * mätt: procenten löstes mot zoomytans tak (60vh = 648 px vid 1080), så bilden
 * kunde aldrig bli högre än så. `contain` brevlådade sedan de verkliga
 * pixlarna innanför den utsträckta boxen. Uppmätt för ett kvitto i A4:
 *
 *   nivå   boxen        MÅLAD BILD     lodrätt överskott
 *   100 %  359×507,8    359×507,8      0
 *   200 %  718×648      458,1×648      0
 *   300 %  1077×648     458,1×648      0
 *   400 %  1436×648     458,1×648      0
 *
 * Alltså: identisk bild vid 200, 300 och 400 %, och det gick ALDRIG att rulla
 * nedåt. Allt över ca 127 % lade bara till tom marginal i sidled.
 *
 * ⚠️ Utan taket växer bilden med sin proportion och ytan rullar i båda led —
 * 200 % ger 718×1015,6 med 368 px att rulla, 300 % ger 1077×1523,4 med 875.
 *
 * ⚠️ `height: auto` står kvar: bredden styr, höjden följer. */
.attach-panel--source-fill .attach-panel__source-img {
  height: auto;
}
/* Övriga bilagor + dropzone får kompakt botten-sektion när källunderlag finns. */
.attach-panel--source-fill .attach-panel__list { flex: 0 0 auto; max-height: 30vh; }
.attach-panel--source-fill .attach-panel__dropzone[hidden] { display: none; }


/* ─── 48. Register-utility-klasser (#438 — etapp 3a-1) ────────────
 *
 * Små utility-klasser från register-utils.js, flyttade hit från inline-
 * styles. Konsumenter: artiklar/projekt/integrationer (wrappers över
 * byggRegisterSida) — samma generella registerlista. */

.reg-toolbar--full {
  margin: 0;
  width: 100%;
}
.reg-alert {
  margin: var(--space-5);
}
.reg-actions-col {
  width: 80px;
}
.reg-actions-col--narrow {
  width: 48px;
}
.reg-row-actions {
  display: flex;
  gap: 6px;
}
.row-clickable {
  cursor: pointer;
}
.empty-state__icon {
  font-size: 48px;
  margin: 0 0 var(--space-3);
}
.empty-state__title {
  margin: 0 0 var(--space-2);
}
.empty-state__lead {
  color: var(--text-secondary);
  margin: 0 0 var(--space-5);
}


/* ─── 49. Betalningar-/payment-batches-utility (#438) ────────────── */
.bet-alert        { margin-bottom: var(--space-4); }
.bet-stats        { margin-bottom: var(--space-6); }
.bet-actions-col  { width: 110px; }
/* Betalningsspärrad leverantör i urvalslistan: synlig men ej valbar. */
.bet-sparr-note   { margin: var(--space-3) var(--space-4) 0; }
.bet-rad--sparrad td { opacity: .72; }
.bet-sparr-ikon   { font-size: var(--fs-sm, 13px); }
.bet-sparr-badge  { margin-left: var(--space-2); }
.stats-grid--3    { grid-template-columns: repeat(3, 1fr); }

/* ── Betalningslistan: filter/sortering + orsaker + mobil-kort ─────────── */
.bet-filter        { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-3); padding: var(--space-4); border-bottom: 1px solid var(--line); }
.bet-filter .filter-input,
.bet-filter .filter-num,
.bet-filter .filter-select,
.bet-filter .filter-date {
  height: 34px; padding: 0 var(--space-3); border: 1px solid var(--line);
  border-radius: var(--radius, 8px); background: var(--surface);
  color: var(--text-primary); font-family: var(--font-body); font-size: var(--fs-sm, 14px);
}
.bet-filter .filter-input { min-width: 220px; flex: 1 1 220px; }
.bet-filter .filter-num   { width: 84px; }
.bet-filter__summary,
.bet-filter [data-filter-summary] { flex-basis: 100%; margin-top: var(--space-1); }
.bet-listregion { overflow-x: auto; }

/* Sorterbara kolumnrubriker (samma mönster som leverantörsfakturalistan). */
.bet-tabell .th-sortable { cursor: pointer; white-space: nowrap; user-select: none; }
.bet-tabell .th-sortable:hover { color: var(--brand); }
.bet-tabell .sort-indicator { margin-left: 4px; color: var(--text-muted); font-size: var(--fs-sm, 12px); }

/* Uteslutna rader: tydligt markerade, ALDRIG dolda (skälet till utebliven betalning). */
.bet-rad--utesluten td { background: var(--danger-bg); }
.bet-utesluten-ikon { font-size: var(--fs-sm, 13px); }
.bet-orsaker { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
.bet-orsak-badge { white-space: normal; }
.bet-utanfor { color: var(--text-secondary); font-size: var(--fs-sm, 13px); margin: 0 var(--space-3); }

/* Mobil 375px: filter-baren staplar, listan blir stackade kort (data-table--stack
   sköter label:värde). Orsaks-badgar och markering får ALDRIG döljas. */
@media (max-width: 600px) {
  .bet-filter { flex-direction: column; align-items: stretch; }
  .bet-filter .filter-bar__group { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; }
  .bet-filter .filter-input,
  .bet-filter .filter-num { width: 100%; flex: 1 1 auto; }
  .bet-filter .filter-num { min-width: 0; }
  .bet-listregion { overflow-x: visible; }
  .bet-tabell .bet-orsaker { margin-top: var(--space-2); }
  .bet-tabell .bet-orsak-badge { display: inline-block; }
}

/* Mobil-toolbar ("Markera alla") syns bara på mobil (theaden är dold av stacken). */
.bet-mobil-toolbar { display: none; }

/* ── C1: MARKERING PÅ MOBIL ────────────────────────────────────────────
   Den delade .data-table--stack-regeln (komponent #24) DÖLJER
   receipts-checkbox-col + .bulk-action-bar på ≤760px (bulk = desktop-only
   för lev-/kundlistorna). Betalningar ÄR en mobil-markeringslista → återställ
   dem, scopat till .bet-tabell / #bet-bulkbar så andra listor är oförändrade. */
@media (max-width: 760px) {
  /* Checkrutan tillbaka som tumnåbart 44px-mål, uppe till höger i kortet. */
  .bet-tabell.data-table--stack tbody tr { position: relative; padding-right: 52px; }
  .bet-tabell.data-table--stack tbody td.receipts-checkbox-col {
    display: flex; position: absolute; top: var(--space-2); right: var(--space-2);
    min-width: var(--tap-target, 44px); min-height: var(--tap-target, 44px);
    align-items: center; justify-content: center; margin: 0; padding: 0;
  }
  .bet-tabell.data-table--stack tbody td.receipts-checkbox-col::before { content: none; }
  .bet-tabell.data-table--stack tbody td.receipts-checkbox-col input[type="checkbox"] { width: 22px; height: 22px; }

  /* Bulk-baren tillbaka (scopad) + fast längst ned, full-breddsknapp. */
  #bet-bulkbar .bulk-action-bar {
    display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center;
    position: sticky; bottom: 0; z-index: 5;
    background: var(--surface-card); border-top: 1px solid var(--line);
    padding: var(--space-3);
  }
  #bet-bulkbar .bulk-action-bar .btn { width: 100%; }

  /* "Markera alla" på mobil (thead-checkboxen är dold). */
  .bet-mobil-toolbar { display: flex; align-items: center; padding: var(--space-1) 0 var(--space-3); }
  .bet-mobil-markera { display: flex; align-items: center; gap: var(--space-2);
    min-height: var(--tap-target, 44px); cursor: pointer; font-size: var(--fs-sm, 14px); }
  .bet-mobil-markera input[type="checkbox"] { width: 22px; height: 22px; }
}

/* ── Statuskort: Att betala + Förfallna (två kort) ─────────────────────── */
.bet-stats { grid-template-columns: repeat(2, 1fr); }
@media (max-width: 600px) {
  /* Stapla vertikalt i stående; hel text, ingen ellips (antal OCH summa ryms). */
  .bet-stats { grid-template-columns: 1fr; }
  .bet-stats .stat-value { font-size: var(--fs-h2, 1.5rem); line-height: 1.15; overflow-wrap: anywhere; }
}

/* ── C7: betaldatum-väljare i urvalet (bulk-baren) ─────────────────────── */
.bet-betaldatum { display: flex; flex-direction: column; gap: 2px; }
.bet-betaldatum label { font-size: var(--fs-sm, 13px); font-weight: 600; color: var(--text-secondary); }
.bet-betaldatum input[type="date"] {
  min-height: 40px; padding: 0 var(--space-2); border: 1px solid var(--line);
  border-radius: var(--radius, 8px); background: var(--surface);
  color: var(--text-primary); font-family: var(--font-body); font-size: var(--fs-sm, 14px);
}
/* Justerings-/varningsnotis: ALDRIG dold — visar när pengarna lämnar kontot. */
@media (max-width: 760px) {
  #bet-bulkbar .bet-betaldatum { width: 100%; }
  #bet-bulkbar .bet-betaldatum input[type="date"] { width: 100%; min-height: var(--tap-target, 44px); }
}

/* ── Betaldag-kolumn i listan (per faktura, före filskapande) ──────────── */
.bet-betaldag-input {
  box-sizing: border-box; min-width: 0; max-width: 100%;
  min-height: 34px; padding: 0 var(--space-2); border: 1px solid var(--line);
  border-radius: var(--radius, 8px); background: var(--surface);
  color: var(--text-primary); font-family: var(--font-body); font-size: var(--fs-sm, 14px);
}
/* Notis wrappar ALLTID (lång varningstext får aldrig spränga kortet i sidled). */
.bet-betaldag-notis { font-size: var(--fs-sm, 12px); margin-top: 2px; max-width: 100%; overflow-wrap: anywhere; }
.bet-notis-flytt   { color: var(--text-secondary); }
.bet-notis-varning { color: var(--danger); font-weight: 600; }
.bet-atgard { background: none; border: none; padding: 0; color: var(--brand);
  font: inherit; text-decoration: underline; cursor: pointer; }
/* Låst betaldag (fakturan i en batch): läsbart + lås-ikon, ALDRIG dolt.
 * ⚠️ display:inline-block så att nowrap-innehållet räknas som elementets
 * min-bredd av tabellalgoritmen — en ren inline-span kan komprimeras och
 * klippas när kolumnerna konkurrerar om utrymmet. */
.bet-betaldag-last { color: var(--text-secondary); white-space: nowrap; display: inline-block; }
/* ⚠️ Kolumnen får ALDRIG bli smalare än ett helt datum. Efter filskapandet
 * innehåller kolumnen bara låsta värden — det redigerbara date-fältet, som
 * annars håller kolumnen öppen med sin intrinsiska bredd, finns då inte kvar
 * på någon rad. Utan golv kan tabellalgoritmen krympa kolumnen och klippa
 * datumet till "2026-". Gäller BÅDA lägena: samma golv för låst och
 * redigerbart, så bredden inte skiljer sig mellan dem. */
.bet-betaldag-cell { min-width: 7.5rem; }
@media (max-width: 760px) {
  /* ⚠️ ROT till sidled-spräng: <table> är kvar som display:table i stack-läget →
     tabell-algoritmen sträcker den till innehållets min-bredd (bl.a. date-inputens
     intrinsiska min) TROTS width:100%, och den absoluta checkrutan hamnade utanför
     vyn. Gör bet-tabellen till ett blockelement på mobil (scopat — andra listor
     orörda) så den fyller exakt containern. */
  .bet-tabell.data-table--stack { display: block; width: 100%; max-width: 100%; }
  .bet-tabell.data-table--stack tbody tr { max-width: 100%; }
  /* ⚠️ Stacken (#24) gör td:n till en flex-RAD → input + notis låg sida vid sida
     och sprängde kortet i sidled (och sköt den absoluta checkrutan ut ur vyn).
     Stapla betaldag-cellens innehåll vertikalt (som .has-actions) så fältet blir
     full bredd och varningstexten wrappar under. */
  .bet-tabell.data-table--stack tbody td.bet-betaldag-cell {
    flex-direction: column; align-items: stretch; gap: var(--space-1); min-width: 0;
  }
  .bet-tabell.data-table--stack tbody td.bet-betaldag-cell::before { margin-bottom: 2px; }
  /* Tumnåbart fält på mobil; notis/varning aldrig dold (stackens kort visar dem). */
  .bet-tabell .bet-betaldag-input { width: 100%; min-height: var(--tap-target, 44px); }
  /* Orsaks-badgar (utesluten-rader) wrappar till EGEN rad INNANFÖR kortet i stället
     för att sträcka leverantörscellen och tränga ut badge/checkruta ur vyn. */
  .bet-tabell.data-table--stack tbody td[data-label="Leverantör"] { flex-wrap: wrap; min-width: 0; }
  .bet-tabell .bet-orsaker { flex-basis: 100%; margin-top: var(--space-1); }
  .bet-tabell .bet-orsak-badge { white-space: normal; overflow-wrap: anywhere; }
}


/* ─── 50. Transaktioner-listutility (#438 — etapp 3a-1) ────────── */
.tr-search-input  { width: 220px; margin: 0; }
.tr-col-datum     { width: 110px; white-space: nowrap; }
.tr-col-ver       { width: 90px;  white-space: nowrap; }
.tr-col-konto     { width: 80px; }
.tr-col-belopp    { width: 120px; white-space: nowrap; }


/* ─── 52. Integrationer-grid (#438 — etapp 3a-1) ───────────────── */
.integration-grid              { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: var(--space-4); }
.integration-card__body        { text-align: center; padding: var(--space-5); }
.integration-card__icon        { font-size: 40px; margin-bottom: var(--space-3); }
.integration-card__title       { font-weight: 600; margin-bottom: var(--space-2); }
.integration-card__desc        { margin-bottom: var(--space-4); }

@media (max-width: 760px) {
  .stats-grid--4 { grid-template-columns: repeat(2, 1fr); }
}


/* ─── 53. Tidrapporter-listutility (#438 — etapp 3a-1) ─────────── */
.tr-row__cta                 { color: var(--brand); font-size: var(--fs-sm); white-space: nowrap; }
.tr-row__badges              { display: flex; gap: var(--space-1); flex-wrap: wrap; margin-top: var(--space-2); }
.tr-period-filter            { padding: var(--space-4); margin-bottom: var(--space-3); }
.tr-period-filter__row       { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); }
.tr-period-filter__label     { font-size: var(--fs-sm); font-weight: 600; }
.tr-period-filter__select    { font-size: var(--fs-md); padding: var(--space-2) var(--space-2); }
.tr-period-filter__year      { width: 90px; font-size: var(--fs-md); padding: var(--space-2); }
.tr-period-filter__help      { margin: var(--space-3) 0 0; }


/* ─── 54. Arkiv-listutility (#438 — etapp 3a-1) ───────────────── */
.arkiv-sok                   { display: flex; gap: var(--space-2); flex-wrap: wrap; margin-bottom: var(--space-3); }
.arkiv-sok__input            { flex: 1; min-width: 200px; font-size: var(--fs-md); padding: var(--space-3) var(--space-3); border: 1px solid var(--border); border-radius: var(--radius); }
.arkiv-status                { margin-bottom: var(--space-2); }
.arkiv-anteckning            { margin-top: var(--space-1); font-size: var(--fs-sm); color: var(--text-primary); }
.arkiv-taggar                { margin-top: var(--space-2); display: flex; flex-wrap: wrap; gap: var(--space-1); }
.arkiv-preview-title         { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.arkiv-preview-footer        { display: flex; justify-content: flex-end; }
.arkiv-preview-mobile        { text-align: center; padding: var(--space-6) var(--space-4); }
.arkiv-preview-mobile__hint  { font-size: var(--fs-md); margin-bottom: var(--space-3); }
.arkiv-preview-fallback      { padding: var(--space-6); text-align: center; }


/* ─── 55. Payment-batches-utility (#439 — etapp 3a-2) ──────────── */
.btn-link--back              { font-size: var(--fs-sm); color: var(--text-muted); text-decoration: none; }
.btn-link--back:hover        { text-decoration: underline; }

.pb-title-spaced             { margin-top: var(--space-2); }
.pb-alert                    { margin-top: var(--space-4); }

.pb-col-datum                { width: 110px; white-space: nowrap; }
.pb-col-msgid                { width: 140px; }
.pb-col-bank                 { width: 120px; }
.pb-col-status               { width: 110px; }
.pb-col-belopp               { width: 130px; white-space: nowrap; }
.pb-col-faktura              { width: 110px; }
.pb-col-bgpg                 { width: 100px; }
.pb-col-ocr                  { width: 110px; }
.pb-actions-col              { width: 100px; }
.pb-row-actions-col          { width: 90px; }
.pb-msgid                    { font-size: var(--fs-sm); }

.pb-debitor-card             { padding: var(--space-4); margin-bottom: var(--space-4); }
.pb-debitor-card__title      { margin: 0 0 var(--space-3); font-size: var(--fs-md); font-weight: 600; }
.pb-debitor-card__dl         { margin: 0; }

.pb-action-status            { margin-top: var(--space-3); }
.pb-action-status__alert     { display: flex; flex-direction: column; gap: var(--space-1); }
.pb-action-status__fallback  { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; margin-top: var(--space-2); }


/* ─── 56. Kontoplan-utility (#439 — etapp 3a-2) ───────────────── */
.kp-card-body                { padding-bottom: 0; }
.kp-toolbar                  { margin-bottom: var(--space-3); }
.kp-search-input             { max-width: 320px; }
.kp-tabs                     { margin-bottom: 0; }

.kp-col-nr                   { width: 90px; }
.kp-col-typ                  { width: 110px; }
.kp-col-moms                 { width: 130px; }
.kp-col-sru                  { width: 80px; }
.kp-col-status               { width: 100px; }
.kp-code                     { font-size: var(--fs-sm); }

.kp-active-label             { display: inline-flex; align-items: center; gap: var(--space-2); cursor: pointer; }
.kp-active-label--disabled   { cursor: default; }
.kp-active-toggle            { width: 16px; height: 16px; }

.kp-edit-btn                 { padding: var(--space-1) var(--space-2); }

.kp-form-group--number       { width: 140px; }
.kp-form-group--name         { flex: 1; }
.kp-form-group--type         { width: 160px; }
.kp-form-group--sru          { width: 120px; }
.kp-form-group--active       { width: 90px; }
.kp-form-active-wrap         { padding-top: var(--space-2); }

.kp-modal-error              { margin-top: var(--space-3); }
.kp-locked-hint              { margin-top: var(--space-2); font-style: italic; }


/* ─── 57. .data-table--compact-list — tät skummbar lista (#441) ──── *
 *
 * För långa uppslagslistor där bara 1-2 fält räknas — radlista,
 * INTE kort. Kontoplanen (~2000 rader) är typfallet; andra
 * kandidater: artiklar, BAS-kataloger, framtida katalog-listor.
 *
 * Desktop: klassen är no-op — vanlig data-table-rendering.
 * Mobil: thead dolt, varje rad = flex-rad med hårfin skiljelinje
 * (1px var(--line)) mot nästa. INGEN per-rad-ram, ingen skugga,
 * ingen radie, ingen kort-marginal — raden är tunn och tappbar
 * (~36-44px höjd, 44px tap-target via padding).
 *
 * Layout per rad: identifierare vänster (mono, dämpad, nowrap,
 * fast bredd), huvudtext mitten (ellipsis), ev. status-markör
 * höger. #22-andan: bara inaktiva taggas (Inaktiv-etikett), aktiva
 * utan brus.
 *
 * Använd tillsammans med modifieraren .kp-list-card på den
 * omslutande .card för att strippa kort-chrome (border/shadow/
 * radius/padding) på mobil så listan känns edge-to-edge.
 */
@media (max-width: 760px) {
  /* Strippa kort-chrome — listan ska kännas edge-to-edge */
  .kp-list-card {
    background: transparent;
    border: 0;
    box-shadow: none;
    border-radius: 0;
    padding: 0;
  }

  .data-table--compact-list thead { display: none; }
  .data-table--compact-list,
  .data-table--compact-list tbody { display: block; width: 100%; }
  .data-table--compact-list tr {
    display: flex;
    align-items: center;
    gap: var(--space-3);
    padding: var(--space-2) var(--space-4);
    border-bottom: 1px solid var(--line);
    min-height: 44px;
    background: transparent;
    box-shadow: none;
    border-radius: 0;
    margin: 0;
  }
  .data-table--compact-list tr:last-child { border-bottom: none; }
  .data-table--compact-list td {
    display: block;
    padding: 0;
    border: 0;
    background: transparent;
  }
  .data-table--compact-list td[data-mobile="hide"] { display: none; }
  /* Rensa data-label-prefix (om någon hamnat från .data-table--stack-mönstret) */
  .data-table--compact-list td::before { content: none; display: none; }

  /* Identifierare — kompakt, dämpad, nowrap, fast bredd */
  .data-table--compact-list td.font-mono {
    flex: 0 0 auto;
    font-size: var(--fs-sm);
    color: var(--text-muted);
    min-width: 56px;
    white-space: nowrap;
  }

  /* Huvudtext — fyller resten, truncates */
  .data-table--compact-list td.cell-title {
    flex: 1;
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    font-weight: 500;
  }

  /* Status-markör höger */
  .data-table--compact-list td:last-child {
    flex: 0 0 auto;
    margin-left: auto;
  }
}

/* Inaktiv rad — dämpad text (gäller både desktop och mobil) */
.kp-row-inactive td,
.kp-row-inactive td.font-mono,
.kp-row-inactive td.cell-title { color: var(--text-muted); }

/* Inaktiv-etikett (#22-andan — bara inaktiva taggas) */
.kp-status-tag--inactive {
  display: inline-block;
  font-size: var(--fs-sm);
  padding: 2px var(--space-2);
  border-radius: var(--radius);
  background: var(--surface-inset);
  color: var(--text-muted);
}


/* ─── 58. Auth-sidlayout (#443 — etapp 3a-2-auth) ──────────────── *
 *
 * Centrerad-kort-layout för auth-sidor (login, register, byt-losenord,
 * aktivera, invitations, waiting-approval). Använder befintliga
 * komponentklasser (.card, .form-group, .btn-primary, .alert,
 * .helper-text) — denna sektion lägger bara till sidlayout-wrappers
 * och en handful små utilities. Samma visuella språk på alla 6 så de
 * känns som en familj.
 */
/* ── Fristående sidor (utanför .main-content) — rotorsaksfixen ──────────────
   .standalone-page är den DELADE wrappern för routes utanför SPA-skalet
   (login/register/aktivera m.fl.): samma sidluft-tokens som .main-content →
   EN definition av padding i hela plattformen. Inloggnings-grenen av den
   återkommande padding-buggen kan inte återuppstå: nya fristående sidor
   använder denna klass i stället för att uppfinna egen padding. */
.standalone-page {
  min-height: 100dvh;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--bg);
  padding: var(--page-pad-y) var(--page-pad-x);
}

.auth-page {
  min-height: 100dvh;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--bg);
  /* Sidluft via delade tokens (var: --space-6/--space-5 hårdkopplat) */
  padding: var(--page-pad-y) var(--page-pad-x);
}

/* Login-vyn: subtil gradient + brand-block ovanför kortet.
   Övriga auth-vyer (register, invitations m.fl.) ärver bas-stilen. */
.auth-page--login {
  flex-direction: column;
  gap: var(--space-6);
  /* Subtil cream→paper-toning med blå accent högst upp — modern och
     lugn, matchar plattformens token-palett (--blue, --cream). */
  background:
    radial-gradient(60% 50% at 50% 0%, rgba(37,99,235,.07) 0%, transparent 70%),
    linear-gradient(180deg, var(--cream) 0%, var(--paper) 100%);
}
.auth-brand {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  padding: 0 var(--space-2);
}
.auth-brand__logo {
  width: 48px;
  height: 48px;
  border-radius: var(--radius);
  background: linear-gradient(135deg, var(--blue) 0%, var(--blue-deep) 100%);
  color: var(--paper);
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-heading);
  font-size: 26px;
  font-weight: 700;
  box-shadow: 0 6px 16px -6px rgba(37,99,235,.45);
  letter-spacing: -1px;
}
.auth-brand__text { line-height: 1.2; }
.auth-brand__name {
  font-family: var(--font-heading);
  font-size: var(--fs-md);
  font-weight: 700;
  color: var(--text-primary);
  letter-spacing: -0.01em;
}
.auth-brand__tag {
  font-size: var(--fs-eyebrow);
  color: var(--text-secondary);
  margin-top: 2px;
}

/* ── Varumärkesraden med den BREDA logotypen (app/components/auth-varumarke.tsx)
   ⚠️⚠️ ERSÄTTER .auth-brand (ikonbricka + text). Klasserna ovan står kvar tills
   register- och inbjudningssidorna följt efter. */
.auth-varumarke {
  width: 100%;
  max-width: 400px;      /* ⚠️ Kortets bredd — raden ska stå i linje med det. */
  display: flex;
  justify-content: center;
  align-items: center;
}
/**
 * ⚠️⚠️ BREDDEN ÄR BUNDEN ÅT BÅDA HÅLL, och det är hela poängen.
 *
 * `max-width: 100%` binder mot varumärkesraden (som i sin tur är kortets
 * bredd), `max-height` binder resningen, och `width/height: auto` bevarar
 * höjd–bredd-förhållandet. En MYCKET bred logotyp krymps därför av bredden och
 * blir proportionerligt låg; en hög och smal krymps av höjden. I inget av
 * fallen kan bilden tvinga fram vågrät rullning på 375 px — utan `max-width`
 * hade en 1200 px bred fil gjort just det, och sidan hade rullat i sidled på
 * den enda yta en utomstående ser.
 */
.auth-varumarke__bild {
  max-width: 100%;
  max-height: 52px;
  width: auto;
  height: auto;
  /* ⚠️ `display: block` — en inline-bild ärver radhöjdens extra utrymme under
     sig, och raden hade blivit några pixlar högre än den ser ut. */
  display: block;
}
/* ⚠️ RESERVEN: bolagets namn som text, aldrig ett trasigt bildelement. Samma
   resning som logotypen skulle ha haft, så sidan inte hoppar. */
.auth-varumarke__namn {
  font-family: var(--font-heading);
  font-size: var(--fs-h3);
  font-weight: 700;
  color: var(--text-primary);
  letter-spacing: -0.01em;
  line-height: 52px;
}

.auth-card {
  width: 100%;
  /* ⚠️ 400 px, inte 420. Ett inloggningskort som breder ut sig ser ut som ett
     formulär man tappat bort; bredden är densamma på mobil och desktop, så
     sidan är EN vy och inte två. */
  max-width: 400px;
  /* MEDVETEN AVVIKELSE från .card-defaulten (--card-pad-*): inloggningskortet
     är generösare (28 px, Fortnox/Visma-stil). Regeln definieras efter .card
     och vinner cascaden — ingen dubbelpadding. */
  padding: var(--space-7);
  /* ⚠️⚠️ INGEN SKUGGA. Plattformens `.card` har 12 px radie och ingen skugga —
     inloggningen var det ENDA stället med en, alltså den enda ytan som såg ut
     att komma från ett annat system. Raden stod här förut som
     `box-shadow: var(--shadow-lg)` med motiveringen «branschstandard»; att
     likna Fortnox är inte ett skäl att avvika från sin egen. */
}
.auth-card--wide { max-width: 560px; }

/* ⚠️⚠️ FOTEN PÅ DE UTLOGGADE SIDORNA (app/components/auth-fot.tsx).
   ⚠️ Bredden följer kortets, så texten står i linje med det ovanför och inte
   löper ut i sidluften på desktop. */
.auth-fot {
  width: 100%;
  max-width: 400px;
  text-align: center;
  font-size: var(--fs-eyebrow);
  color: var(--text-secondary);
  /* ⚠️ Luft OVANFÖR, inte under: foten är sidans sista rad och `.auth-page`
     centrerar innehållet — en undermarginal hade flyttat hela stapeln uppåt. */
  margin-top: calc(var(--space-2) * -1);
}
.auth-fot__lank {
  color: var(--text-secondary);
  text-decoration: underline;
}
.auth-fot__lank:hover { color: var(--text-primary); }

/* ⚠️⚠️ LÖSENORDSFÄLTET MED ÖGA (commit 3). Ögat ligger INUTI fältets ram, inte
   bredvid det: en knapp utanför hade gjort raden bredare än de andra fälten och
   brutit formulärets vänsterkant.
   ⚠️ `position: relative` på omslaget, inte på fältet — ett fält med
   positionering ärver inte `width: 100%` lika förutsägbart i alla webbläsare. */
.falt-med-oga {
  position: relative;
  display: block;
}
/* ⚠️ Plats åt knappen, så texten aldrig hamnar under den. Ett långt lösenord
   rullar i fältet och skulle annars försvinna bakom ikonen. */
.falt-med-oga input {
  width: 100%;
  padding-right: 46px;
}
.oga-knapp {
  position: absolute;
  right: 5px;
  top: 50%;
  transform: translateY(-50%);
  /* ⚠️ 36 px — under 44 px men knappen ligger INNE i ett 46 px högt fält, så
     träffytan är fältets. Större hade den täckt texten den ska avslöja. */
  width: 36px;
  height: 36px;
  border: none;
  background: none;
  cursor: pointer;
  color: var(--text-secondary);
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--radius-sm);
  font-size: 16px;
  line-height: 1;
}
.oga-knapp:hover { background: var(--surface-inset); color: var(--text-primary); }
.oga-knapp:focus-visible { outline: 2px solid var(--brand); outline-offset: -2px; }

.auth-card__title {
  font-size: var(--fs-h3);
  font-weight: 700;
  color: var(--text-primary);
  margin: 0 0 var(--space-4);
}
.auth-card__lead {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  line-height: 1.5;
  margin: 0 0 var(--space-5);
}
.auth-card__delrubrik {
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--text-primary);
  margin: 0 0 var(--space-2);
}
.auth-card__footer-link {
  display: block;
  text-align: center;
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  margin-top: var(--space-5);
}
.auth-link {
  color: var(--brand);
  text-decoration: none;
}
.auth-link:hover { text-decoration: underline; }
.auth-link-muted {
  color: var(--text-secondary);
  font-size: var(--fs-sm);
  text-decoration: underline;
}

/* Kodsteget (inloggningssäkerheten commit 3): koden, «lita på enheten»,
   «börja om». Inga nya färger — samma tokens som resten av kortet. */
/* ⚠️⚠️ input.kodfalt, INTE .kodfalt (småfix 8-rättelse). Sedan fältet fick
   type="text" (för plattformens ram) träffas det av den globala fältregeln
   `input[type="text"]` (specificitet 0,1,1), som slår en naken klass (0,1,0)
   och klädde av kodens distinkta stil — stora, spärrade siffror blev vanlig
   fältstorlek. `input.kodfalt` är 0,1,1 och ligger EFTER style.css, så koden
   behåller sin stil och får ändå ramen, bakgrunden och hörnen ur den globala
   regeln (som .kodfalt inte rör). Prov: test/browser/kodfalt-stil.browser.test.ts. */
input.kodfalt {
  font-size: var(--fs-h3);
  letter-spacing: 0.4em;
  text-align: center;
  font-variant-numeric: tabular-nums;
}
.auth-kryss {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  min-height: 44px;
  margin: 0 0 var(--space-3);
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  cursor: pointer;
}
.auth-link--knapp {
  background: none;
  border: 0;
  padding: 0;
  font: inherit;
  cursor: pointer;
}

/* Stepper — register-flödets steg 1/2 */
.auth-stepper {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  margin-bottom: var(--space-6);
  font-size: var(--fs-sm);
}
.auth-stepper__step--active   { font-weight: 700; color: var(--brand); }
.auth-stepper__step--inactive { color: var(--text-muted); }
.auth-stepper__line           { flex: 1; height: 1px; background: var(--line); }

/* Full-width-variant av .btn — generisk */
.btn-block { width: 100%; justify-content: center; }

/* Action-rad: backbutton + primärknapp */
.auth-action-row {
  display: flex;
  gap: var(--space-2);
  margin-top: var(--space-3);
}
.auth-action-row .btn-block { flex: 1; }

/* Module-väljare (register, invitations) */
.auth-module-list {
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: var(--space-3);
  background: var(--surface-inset);
}
.auth-module-row {
  display: flex;
  gap: var(--space-3);
  align-items: flex-start;
  cursor: pointer;
  padding: var(--space-2) 0;
}
.auth-module-row__title { font-weight: 500; font-size: var(--fs-sm); }
.auth-module-row__desc  { font-size: var(--fs-eyebrow); color: var(--text-secondary); }

/* Lösenords-checklista (byt-losenord, aktivera) */
.auth-pwd-checklist {
  list-style: none;
  padding: 0;
  margin: var(--space-2) 0 0;
  font-size: var(--fs-eyebrow);
}
.auth-pwd-checklist li {
  color: var(--text-muted);
  padding: 2px 0;
}
.auth-pwd-checklist li.is-ok { color: var(--success); }

/* Status-rad (waiting-approval) */
.auth-status-list {
  border: 1px solid var(--line);
  border-radius: var(--radius);
  overflow: hidden;
  margin-bottom: var(--space-3);
}
.auth-status-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-3) var(--space-4);
  border-bottom: 1px solid var(--line);
  font-size: var(--fs-sm);
}
.auth-status-row:last-child { border-bottom: none; }
.auth-status-row__state--pending  { color: var(--warning); }
.auth-status-row__state--approved { color: var(--success); }
.auth-status-row__state--rejected { color: var(--danger); }

/* Meddelande-box (invitations - inbjudningsmeddelande) */
.auth-message-box {
  background: var(--surface-inset);
  padding: var(--space-3) var(--space-4);
  border-radius: var(--radius);
  margin-top: var(--space-4);
  font-size: var(--fs-sm);
}

/* Readonly-input (invitation pre-fyllt email) */
.input--readonly {
  background: var(--surface-inset);
  cursor: not-allowed;
}

/* Hjälptext under fält */
.auth-field-hint {
  font-size: var(--fs-eyebrow);
  color: var(--text-secondary);
  margin-top: var(--space-1);
}


/* ─── 59. Detalj-form-mönster (#447 — etapp 3b) ─────────────── *
 *
 * Delas av kunder-detalj + leverantor-detalj (identiska form-mönster:
 * back-link, tabs, form-grid, toggle-knappar, section-headings). Båda
 * sidorna hade tidigare egen injectStyles (F16-fälla) med samma värden
 * — konsoliderat hit. Återanvänd vid framtida liknande form-detaljvyer.
 */

/* Tabs-strip inom form-detalj (Grunduppgifter / Faktureringsuppgifter etc.) */
.detail-form-tabs {
  display: flex;
  border-bottom: 1px solid var(--line);
  margin-bottom: var(--space-6);
}
.detail-form-tabs__btn {
  padding: var(--space-3) var(--space-5);
  font-size: var(--fs-sm);
  font-weight: 500;
  color: var(--text-muted);
  background: none;
  border: none;
  cursor: pointer;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  transition: color .15s, border-color .15s;
  font-family: var(--font-body);
}
.detail-form-tabs__btn:hover { color: var(--text-primary); }
.detail-form-tabs__btn.is-active {
  color: var(--brand);
  border-bottom-color: var(--brand);
}

/* Form-grid — två-kolumns layout med valbar 3-kolumns variant */
.detail-form-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-5) var(--space-7);
}
.detail-form-grid--3col { grid-template-columns: 1fr 1fr 1fr; }
.detail-form-grid--tight { gap: var(--space-3) var(--space-6); }
.detail-form-grid__full { grid-column: 1 / -1; }

/* Sektionsrubrik inom grid:en (Betalinformation, Bokföring etc) */
.detail-form-grid__section {
  grid-column: 1 / -1;
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .5px;
  color: var(--text-muted);
  padding-top: var(--space-2);
  border-top: 1px solid var(--line);
  margin: var(--space-1) 0 0;
}

/* Toggle-knappgrupp (Ja/Nej, Aktiv/Inaktiv etc) */
.detail-form-toggle-group {
  display: inline-flex;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  overflow: hidden;
}
.detail-form-toggle-btn {
  padding: var(--space-2) var(--space-4);
  font-size: var(--fs-sm);
  font-weight: 500;
  font-family: var(--font-body);
  background: var(--surface-card);
  color: var(--text-muted);
  border: none;
  cursor: pointer;
  transition: background .15s, color .15s;
  border-right: 1px solid var(--line);
}
.detail-form-toggle-btn:last-child { border-right: none; }
.detail-form-toggle-btn.is-active {
  background: var(--brand);
  color: var(--paper);
}

/* Postnummer + ort på samma cell (smal postnr-prefix) */
.detail-form-postnr-ort {
  display: grid;
  grid-template-columns: 130px 1fr;
  gap: var(--space-3);
}

/* Action-rad i sidhuvudet (Spara/Avbryt/Radera) */
.detail-actions-bar {
  display: flex;
  gap: var(--space-3);
  align-items: center;
}

/* Inline alert med marg under (för spara-feedback) */
.detail-form-alert { margin-bottom: var(--space-4); }


/* ─── 60. Anläggningsregister-modal (#447 — etapp 3b) ──────── */
.anl-modal               { max-width: 540px; }
.anl-form-group--big     { flex: 2; }
.anl-form-group--small   { flex: 1; }
.anl-cell-konto-info     { font-size: var(--fs-eyebrow); }
.anl-row-actions         { display: flex; gap: var(--space-1); }
.anl-actions-col         { width: 80px; }
.anl-checkbox-row        { align-items: center; gap: var(--space-6); }
.anl-checkbox-label      { display: flex; align-items: center; gap: var(--space-2); cursor: pointer; }
.anl-error               { margin-top: var(--space-2); }
/* Direktavdrag (Fas 2): auto-förslagsbanner i utkast-vyn */
.anl-direkt-forslag      { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); margin-bottom: var(--space-3); }

/* Skattemässig avskrivning (Fas 3) */
.anl-skatt-arvaljare     { min-width: 140px; }
.anl-skatt-rad           { display: flex; justify-content: space-between; align-items: baseline; gap: var(--space-4); padding: var(--space-2) 0; border-bottom: 1px solid var(--border); }
.anl-skatt-rad:last-child { border-bottom: none; }
.anl-skatt-rad--sum      { font-weight: 600; border-top: 1px solid var(--border); border-bottom: none; margin-top: var(--space-1); padding-top: var(--space-3); }
.anl-skatt-regler        { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-4); margin-bottom: var(--space-4); }
.anl-skatt-vald          { border: 2px solid var(--brand); }
.anl-skatt-badge         { display: inline-block; font-size: 12px; font-weight: 600; color: var(--white); background: var(--brand); border-radius: 999px; padding: 2px 8px; margin-left: var(--space-2); }
.anl-skatt-ib-rad        { align-items: end; }
.anl-skatt-ib-spara      { display: flex; align-items: flex-end; }
@media (max-width: 640px) {
  .anl-skatt-regler      { grid-template-columns: 1fr; }
}
.stats-grid--3-anl       { grid-template-columns: repeat(3, 1fr); margin-bottom: var(--space-6); }
@media (max-width: 540px) {
  /* På smala viewports stackar de 3 stat-korten under varandra istället
     för att spränga skärmen i sidled (375px iPhone-SE-baseline). */
  .stats-grid--3-anl     { grid-template-columns: 1fr; }
}

/* ── Detaljvy för enskild anläggningstillgång (PR #535) ────────────── */
.anl-row-clickable       { cursor: pointer; }
.anl-row-clickable:hover { background: var(--surface-inset); }
.anl-detalj-card         {
  padding:       var(--space-5) var(--space-6);
  margin-bottom: var(--space-4);
}
.anl-detalj-h            {
  font-size:   var(--fs-lg);
  font-weight: 600;
  margin:      0 0 var(--space-3) 0;
}
.anl-detalj-actions      {
  display: flex; justify-content: flex-end; gap: var(--space-2);
  margin: var(--space-4) 0;
}
/* Konto-fält: bara EN form-group per rad (autocomplete-input). Fältet
   visar "nr – namn" i vilo, växlar till bara nr vid fokus.
   PR #538 tog bort den dubblerade "Bokförs på"-eko-raden — input
   visar nu valt konto med namn direkt. */
.anl-konto-rad           { align-items: flex-end; gap: var(--space-4); }
.anl-konto-input-group   {
  position: relative;
  /* Långa kontonamn ska inte spränga viewport på mobil 375px. text-overflow
     på input går via white-space + overflow när fältet inte är i fokus —
     vid fokus visar webbläsaren ändå hela texten i edit-läget. */
  max-width: 100%;
}
.anl-link                { color: var(--brand); text-decoration: underline; }

/* Kategori-tabb i inställningar (PR #541) */
.anl-kat-card             { margin-bottom: var(--space-4); }
.anl-kat-actions          { display: flex; justify-content: flex-end; margin-top: var(--space-3); }
.installningar-card-footer { display: flex; justify-content: flex-end; margin-top: var(--space-3); }

/* Anläggningsnummer-prefix (PR #541) */
.anl-nummer-prefix { color: var(--text-secondary); font-weight: 500; font-size: 0.85em; }

/* Bokslut-flik (BOKSLUT_SLUTFIX): label + "Återställ till standard"-länk på
   samma rad. flex-wrap så det inte klipps på mobil 375px. */
.bsk-label { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: var(--space-2); }
.bsk-reset { font-size: var(--fs-sm); white-space: nowrap; }
.th--nummer        { width: 56px; }

/* Avskrivningsvyns per-tillgång preview-tabell (#544) — kompakt så
   många tillgångar får plats. font-size matchar fs-sm för täthet. */
.avskr-preview-table td,
.avskr-preview-table th { font-size: var(--fs-sm); }

/* Las-banner när avskrivning påbörjats (#545 Del 3) — informerar om
   att vissa fält är låsta. Disabled-fält ärver Browser-default-graytone. */
.anl-las-banner { margin-bottom: var(--space-4); }

/* Lev-faktura → anläggning-matchnings-banner (#547 Del 2) */
.lf-anl-matchningar  { margin: var(--space-3) 0; }
.lf-anl-banner       {
  background:    var(--surface-inset);
  border:        1px solid var(--line);
  border-radius: var(--radius);
  padding:       var(--space-3) var(--space-4);
  /* ⚠⚠ TAKET ÄR INTE KOSMETIK — UTAN DET GÅR KNAPPARNA INTE ATT NÅ.
   *
   * Panelen (.detail-split__left) har FAST höjd och `overflow: hidden`, och
   * bannern är syskon EFTER .lf-scroll — alltså utanför den enda yta som
   * rullar. Växte den fritt kröks rullytan till noll och resten klipptes bort
   * av panelen: ingen rullning uppstod någonstans, för ingen behållare hade
   * fått lov att rulla.
   *
   * ⚠⚠ MÄTT vid 1440×1080 (panelen 968 px): tio kandidatrader gav 1 377 px,
   * tjugo 2 678 px. Redan vid TIO låg sista radens «Inleverera» utanför
   * panelen, och knappraden med «Bokför» trängdes ut med den.
   * test/browser/levfaktura-inleveransbanner-hojd.browser.test.ts mäter det.
   *
   * ⚠ 40vh och inte ett pixeltal: taket ska följa fönstret, och panelen är
   * själv räknad ur 100vh. På en låg skärm blir taket lågt av samma skäl som
   * panelen gör det.
   *
   * ⚠ Gäller BÅDA bannrarna — anläggningens delar klassen och har samma
   * växtsätt. Ett undantag för den ena hade varit ett gap att vakta. */
  max-height:    40vh;
  overflow-y:    auto;
}
.lf-anl-rad {
  display:        flex;
  justify-content: space-between;
  align-items:    center;
  gap:            var(--space-3);
  padding-top:    var(--space-2);
  flex-wrap:      wrap;
}
.lf-anl-rad__info { font-size: var(--fs-sm); }

/* Lager-spegeln av bannern ovan (diagnos DEL D, #695 = mall): samma
 * banner/rad-klasser återanvänds; detta är inline-fälten som lagrets
 * ifyllnad behöver — anläggningen navigerar till ett utkastformulär i
 * stället. FLERRADS-läget: en .lm-rad per artikel (en klumprad på lager-
 * kontot kan bära flera artiklar) med BELOPP per rad (à-pris/total —
 * bara varukostnaden, frakt hålls utanför lagervärdet). */
.lf-lager-rad { display: block; }
.lm-rad {
  display:     flex;
  align-items: flex-end;
  gap:         var(--space-3);
  flex-wrap:   wrap;
  margin-top:  var(--space-2);
}
.lm-rad .lm-artikel { min-width: 220px; }
.lm-rad .lm-antal   { width: 100px; }
.lm-rad .lm-belopp  { width: 150px; }
.lm-kvar { font-weight: 600; }
@media (max-width: 640px) {
  .lm-rad { flex-direction: column; align-items: stretch; }
  .lm-rad .lm-antal, .lm-rad .lm-belopp { width: 100%; }
}

/* Status-badges (#546 Fas 4a) — visas bredvid benämning i lista och
   som etikett i detaljvyn. Färg på intent: grå (inactive), röd-mjuk
   (scrapped/sold), gul (written_down). */
.anl-status-badge {
  display:        inline-block;
  margin-left:    var(--space-2);
  padding:        2px 8px;
  border-radius:  10px;
  font-size:      var(--fs-eyebrow);
  font-weight:    600;
  text-transform: none;
  vertical-align: middle;
}
.anl-status-scrapped { background: var(--danger-soft); color: var(--danger-deep); }
.anl-status-sold     { background: var(--success-soft); color: var(--success-deep); }
.anl-status-written  { background: var(--warning-soft); color: var(--warning-deep); }
.anl-status-inactive { background: var(--surface-inset); color: var(--text-secondary); }

/* Status-pill — fem-stegs livscykelstatus i lista + detaljvy (delad
   härledning i lib/anlaggning-status.js). Variant mappar på samma
   intent-tokens som row--variant-systemet. */
.anl-status-pill {
  display:        inline-block;
  padding:        2px 8px;
  border-radius:  10px;
  font-size:      var(--fs-eyebrow);
  font-weight:    600;
  white-space:    nowrap;
  vertical-align: middle;
}
.page-title .anl-status-pill { margin-left: var(--space-2); }
.anl-status-pill--success { background: var(--success-soft); color: var(--success-deep); }
.anl-status-pill--warning { background: var(--warning-soft); color: var(--warning-deep); }
.anl-status-pill--neutral { background: var(--surface-inset); color: var(--text-secondary); }

/* Avyttrad rad (sold/scrapped) — hela raden gråas, samma dämpning som
   låsta fält i detaljvyn (#544). Fortfarande klickbar (öppnar historik). */
.anl-row-avyttrad td { color: var(--text-secondary); }
.anl-row-avyttrad .cell-title { color: var(--text-secondary); font-weight: 400; }
.anl-row-avyttrad { background: var(--surface-inset); }
.anl-row-avyttrad:hover { background: var(--hover-tint); }

/* Avyttrings-knappraden i Grunduppgifter (flyttad från egen box) — ligger
   under Anteckningar, högerställda knappar med förklarande hjälptext. */
.anl-avyttring-rad {
  display:        flex;
  justify-content: space-between;
  align-items:    center;
  gap:            var(--space-3);
  flex-wrap:      wrap;
  margin-top:     var(--space-3);
  padding-top:    var(--space-3);
  border-top:     1px solid var(--line);
}
.anl-avyttring-knappar { display: flex; gap: var(--space-2); flex-wrap: wrap; }

/* Tabbar i detaljvyn (PR #536) — egna URL:er, browser-back funkar. */
.anl-tabs {
  display:        flex;
  gap:            var(--space-1);
  border-bottom:  1px solid var(--line);
  margin-bottom:  var(--space-4);
}
.anl-tab {
  padding:        var(--space-2) var(--space-4);
  color:          var(--text-secondary);
  text-decoration: none;
  border-bottom:  2px solid transparent;
  font-weight:    500;
  margin-bottom:  -1px;
}
.anl-tab:hover { color: var(--text-primary); }
.anl-tab--active {
  color:          var(--brand);
  border-bottom-color: var(--brand);
}
/* Mobil-fix (docs/BOKSLUT_MASTER_DETAIL.md, generalisering av tabs-mobile.js):
   samma <select>-ersättning som .tabs (style.css) — måste stå EFTER
   .anl-tabs-regeln ovan (samma fil) för att vinna cascaden, eftersom
   components.css laddas efter style.css. */
@media (max-width: 640px) {
  .anl-tabs { display: none; }
}

/* ── Avskrivningsvy (#/avskrivningar) ────────────────────────────── */
/* Den gamla punkt-paddingen (var(--space-5) var(--space-6)) är RENSAD —
   .card har numera samma padding som DEFAULT via --card-pad-* (rotorsaks-
   fixen, docs/KORT_INRE_PADDING_DIAGNOS.md), så egenlösningen var redundant.
   Kvar är bara stegens vertikala rytm. */
.avskr-step                 {
  margin-bottom: var(--space-4);
}
.avskr-step-title           {
  font-size:    var(--fs-lg);
  font-weight:  600;
  margin:       0 0 var(--space-3) 0;
}
.avskr-check-col            { width: 36px; text-align: center; }
.avskr-asset-toolbar        {
  display:      flex;
  gap:          var(--space-2);
  margin-bottom: var(--space-3);
}
.avskr-future-warning       { margin-top: var(--space-3); }
.avskr-preview              { margin-top: var(--space-4); }
.avskr-preview-summary      {
  background:    var(--surface-card);
  border:        1px solid var(--line);
  border-radius: var(--radius-lg);
  padding:       var(--space-4);
  margin-bottom: var(--space-4);
  display:       flex;
  justify-content: space-between;
  align-items:   center;
  gap:           var(--space-3);
  flex-wrap:     wrap;
}
.avskr-preview-total        { display: flex; flex-direction: column; gap: var(--space-1); }
.avskr-preview-meta         { color: var(--text-muted); font-size: var(--fs-sm); }
.avskr-preview-h            {
  font-size:   var(--fs-md);
  font-weight: 600;
  margin:      var(--space-4) 0 var(--space-2) 0;
}
.avskr-confirm-actions      {
  margin-top: var(--space-4);
  display:    flex;
  justify-content: flex-end;
}


/* ─── 61. Tidrapporter-detalj (#447 — etapp 3b) ────────────── *
 *
 * Konsult-detaljvy: status-info, summering, godkänn/avvisa-knappar,
 * kalender-edit-modal. 51 inline-styles + 23 hex konsoliderade.
 */
.trd-page-header           { margin-bottom: var(--space-3); }
.trd-title                 { font-size: var(--fs-h3); margin: 0 0 var(--space-1); }
.trd-meta-row              { font-size: var(--fs-sm); color: var(--text-muted); margin-bottom: var(--space-1); }
.trd-meta-row--last        { margin-bottom: var(--space-4); }
.trd-status-paid           { margin-top: var(--space-2); }   /* alert--warning förstärks via danger-overlay */
.trd-status-paid.alert     { background: var(--danger-soft); border-left: 4px solid var(--danger); }
.trd-status-approved-info  { font-size: var(--fs-sm); color: var(--success-deep); }
.trd-status-rejected.alert { margin-top: var(--space-2); }
.trd-reopen-hint.alert     { margin-top: var(--space-2); font-size: var(--fs-sm); }

.trd-summary-card          { padding: var(--space-4) var(--space-5); }
.trd-summary-header        {
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: .5px;
  margin-bottom: var(--space-2);
}
.trd-summary-row           { display: flex; justify-content: space-between; padding: 3px 0; }
.trd-summary-total         {
  display: flex;
  justify-content: space-between;
  padding-top: var(--space-2);
  margin-top: var(--space-1);
  border-top: 1px solid var(--border);
  font-weight: 600;
}
.trd-summary-empty         { color: var(--text-muted); margin: 0; }

.trd-action-bar            { display: flex; gap: var(--space-2); flex-wrap: wrap; margin-top: var(--space-4); }

/* Kalender-modal */
.trd-kal-overlay           {
  position: fixed; inset: 0;
  background: rgba(0,0,0,.5);
  display: flex; align-items: flex-end; justify-content: center;
  z-index: 1000;
}
.trd-kal-box               {
  background: var(--surface-card);
  border-radius: var(--radius-lg) var(--radius-lg) 0 0;
  padding: var(--space-4);
  width: 100%;
  max-width: 720px;
  max-height: 90vh;
  overflow-y: auto;
}
.trd-kal-header            {
  display: flex; justify-content: space-between; align-items: center;
  margin-bottom: var(--space-3);
  position: sticky; top: 0;
  background: var(--surface-card);
  padding-bottom: var(--space-2);
  border-bottom: 1px solid var(--line);
}
.trd-kal-title             { font-size: var(--fs-lg); margin: 0; }
.trd-kal-subtitle          { font-size: var(--fs-eyebrow); color: var(--text-muted); margin-top: 2px; }
.trd-kal-banner.alert      { margin: 0 0 var(--space-3); font-size: var(--fs-sm); }
.trd-kal-banner--erroneous { background: var(--warning-soft); border-left: 4px solid var(--warning-deep); padding: var(--space-3); }
.trd-kal-banner__title     { margin-bottom: var(--space-2); }
.trd-kal-banner__hint      { font-size: var(--fs-eyebrow); color: var(--warning-deep); margin-top: var(--space-2); }

.trd-bulk-section          {
  margin: 0 0 var(--space-3);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: var(--space-2) var(--space-3);
  background: var(--surface-inset);
}
.trd-bulk-section__summary { cursor: pointer; font-weight: 600; font-size: var(--fs-sm); }
.trd-bulk-grid             {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-2);
  margin-top: var(--space-2);
  font-size: var(--fs-sm);
}
.trd-bulk-grid__full       { grid-column: span 2; display: flex; align-items: center; gap: var(--space-2); margin-top: var(--space-1); }
.trd-bulk-input            { width: 100%; padding: var(--space-1); font-size: var(--fs-sm); }
.trd-bulk-fill-btn         { width: 100%; margin-top: var(--space-2); }
.trd-bulk-hint             { font-size: var(--fs-eyebrow); color: var(--text-muted); margin: var(--space-2) 0 0; }

.trd-per-day-hint          { font-size: var(--fs-eyebrow); color: var(--text-muted); margin: 0 0 var(--space-2); }
.trd-day-rows              { font-size: var(--fs-sm); }
.trd-day-row               {
  display: flex; align-items: center; gap: var(--space-2);
  padding: var(--space-2) var(--space-1);
  border-bottom: 1px solid var(--border);
}
.trd-day-row--weekend      { background: var(--surface-inset); }
.trd-day-row__label        { min-width: 60px; font-size: var(--fs-sm); }
.trd-day-row__dow          { color: var(--text-muted); }
.trd-hours-input           { width: 65px; font-size: var(--fs-sm); padding: var(--space-1); }
.trd-leave-select          { flex: 1; font-size: var(--fs-sm); padding: var(--space-1); }
.trd-save-btn-sm           { font-size: var(--fs-eyebrow); padding: var(--space-1) var(--space-2); }
.trd-erroneous-badge       {
  font-size: var(--fs-eyebrow);
  color: var(--danger-deep);
  background: var(--danger-soft);
  padding: 2px var(--space-2);
  border-radius: var(--radius);
  margin-left: var(--space-1);
}

/* Avvisa-modal (centrerad, fast bredd) */
.trd-avvisa-overlay        {
  position: fixed; inset: 0;
  background: rgba(0,0,0,.5);
  display: flex; align-items: center; justify-content: center;
  z-index: 1000;
}
.trd-avvisa-box            {
  background: var(--surface-card);
  border-radius: var(--radius);
  padding: var(--space-6);
  width: 100%; max-width: 480px;
  margin: var(--space-4);
}
.trd-avvisa-title          { font-size: var(--fs-md); margin: 0 0 var(--space-3); }
.trd-avvisa-lead           { font-size: var(--fs-md); color: var(--text-primary); margin: 0 0 var(--space-3); }
.trd-avvisa-textarea       {
  width: 100%; padding: var(--space-3);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  font-family: inherit;
  font-size: var(--fs-md);
}
.trd-avvisa-actions        { display: flex; gap: var(--space-2); margin-top: var(--space-4); justify-content: flex-end; }


/* ─── 62. Medlemmar + medlems-modal (#449 — etapp 3b-2) ─────── *
 *
 * /medlemmar-sidan: medlemslista, pending-inbjudningar, invite-modal,
 * hantera-medlem-modal med farliga åtgärder. 36 inline-styles + 13
 * hex konsoliderade. RBAC-flöden orörda (server-guards är solida —
 * sista-ägare, self-demote, promote-demoterar-andra).
 */
.mlm-card-spaced       { margin-bottom: var(--space-4); }
.mlm-section-title     { margin-top: 0; }
.mlm-status-active     { color: var(--text-muted); font-size: var(--fs-eyebrow); }
.mlm-status-inactive   {
  background: var(--danger-soft);
  color: var(--danger-deep);
  padding: 2px var(--space-2);
  border-radius: var(--radius-pill, 8px);
  font-size: var(--fs-eyebrow);
}

/* Modal-innehåll (invite + hantera-medlem) — använder standard
 * .modal--md från sektion #56, ingen egen wrap-klass behövs (#450). */
.mlm-modules-box       {
  padding: var(--space-3);
  background: var(--surface-inset);
  border-radius: var(--radius);
}
.mlm-module-label      {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  padding: var(--space-1) 0;
}
.mlm-error-text        { color: var(--danger); font-size: var(--fs-sm); }

/* Farliga åtgärder-zon (botten av hantera-medlem-modal) */
.mlm-danger-zone       {
  padding: var(--space-4) var(--space-5);
  border-top: 1px solid var(--line);
  background: var(--danger-soft);
}
.mlm-danger-zone__title{
  margin: 0 0 var(--space-2);
  color: var(--danger-deep);
  font-size: var(--fs-md);
}
.mlm-danger-zone__hint {
  margin: 0 0 var(--space-2);
  font-size: var(--fs-sm);
  color: var(--text-muted);
}
.mlm-danger-zone__hint--italic {
  font-style: italic;
  margin: 0;
}
.mlm-danger-zone__buttons {
  display: flex;
  gap: var(--space-2);
  flex-wrap: wrap;
}

/* Deactivate-knappen (varning) + Activate-knappen (success) */
.mlm-btn-deactivate {
  background: var(--warning-soft);
  color: var(--warning-deep);
  border: 1px solid var(--warning);
}
.mlm-btn-deactivate:hover {
  background: var(--warning);
  color: var(--paper);
}
.mlm-btn-activate {
  background: var(--success-soft);
  color: var(--success-deep);
  border: 1px solid var(--success);
}
.mlm-btn-activate:hover {
  background: var(--success);
  color: var(--paper);
}

/* Bredbordstabell-rad klickbar */
.mlm-row-clickable     { cursor: pointer; }


/* ─── 63. Rapport-tabeller (#452 — etapp 3c-1) ────────────────── *
 *
 * Resultaträkning + Balansräkning (ÅRL-uppställning). injectStyles-
 * F16-fällan i rapporter.js städad — alla regler hit. Skärm-CSS,
 * INTE print (jämför drilldown som whitelistades för A4-print).
 *
 * Tabellerna har sektion-rubriker (colspan), delsumma-rader,
 * mellansumma-rader (RÖRELSERESULTAT etc.) och totalsummor
 * (SUMMA TILLGÅNGAR etc.). Stack-stil olämplig pga colspan på
 * sektionsrader → mobil-strategin är att DÖLJA jämförelse-kolumner
 * via data-mobile="hide" och behålla horisontell layout. Kontorad
 * + belopp prioriteras.
 */
/* Framstegsrad för rapport-körning: spinner + "Arbetar… (Xs)" + Avbryt. */
.rp-arbetar {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-4) 0;
  color: var(--text-secondary);
}

.rapport-table {
  width: 100%;
  font-size: var(--fs-sm);
}
.rapport-table thead th    { padding: var(--space-2) var(--space-4); }
.rapport-table tbody td    { padding: var(--space-2) var(--space-4); }
.rapport-table td.text-right { white-space: nowrap; }

/* Namn-kolumnen får ellipsis när trångt — desktop håller 320px
 * max, mobil 160px (skärmen ger inte plats för långa namn). */
.rapport-table tbody td:nth-child(2) {
  max-width: 320px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Klickbara konto-rader → drilldown (öppnar i ny flik) */
.rapport-rad-klickbar         { cursor: pointer; }
.rapport-rad-klickbar:hover   { background: var(--surface-inset); }

/* Sektion-rubrik (nettoomsättning, ravaror, personal etc.) */
.rapport-section-row          {
  background: var(--surface-inset);
  font-weight: 600;
}

/* Delsumma per sektion (italic + bottom-border) */
.rapport-section-sum          {
  font-style: italic;
  border-bottom: 1px solid var(--border);
}

/* Mellansumma (RÖRELSERESULTAT, FINANSNETTO, etc.) */
.rapport-mellan-row           {
  font-weight: 700;
  border-top: 2px solid var(--border);
  background: var(--surface-inset);
}

/* Balans-rapportens huvudgrupp-rubrik (Anläggningstillgångar etc.) */
.rapport-huvud-row            {
  font-weight: 700;
  background: var(--surface-inset);
}
.rapport-huvud-row td:first-child { padding-top: var(--space-3); }

/* Huvudgrupp-summa (Summa anläggningstillgångar etc.) */
.rapport-huvud-sum            {
  font-weight: 700;
  border-top: 2px solid var(--border);
}

/* Totalsumma (SUMMA TILLGÅNGAR / SUMMA EGET KAPITAL OCH SKULDER) */
.rapport-total-row            {
  font-weight: 700;
  border-top: 3px double var(--border);
  background: var(--surface-inset);
}

/* Tomrum mellan sektioner (ej-klassificerade-skiljare) */
.rapport-spacer-cell          { padding-top: var(--space-3); }

/* Sammanfattnings-kort (Årets resultat / Beräknat resultat) */
.rapport-summary-card         {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--space-6);
}
.rapport-summary-card__label  { font-size: var(--fs-md); font-weight: 600; }
.rapport-summary-card__value  { font-size: var(--fs-md); font-weight: 600; }
.rapport-summary-card__value--positive { color: var(--success); }
.rapport-summary-card__value--negative { color: var(--danger); }
.rapport-summary-card__value-block {
  display: flex; flex-direction: column;
  align-items: flex-end;
  gap: var(--space-1);
}
.rapport-summary-card__value-block .main {
  font-size: 22px;
  font-weight: 700;
}
.rapport-summary-card__value-block .sub {
  font-size: var(--fs-sm);
  color: var(--text-muted);
}

/* Info-rad (Bokfört årets resultat 8990–8999) */
.rapport-info-row             {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.rapport-info-row__label      { font-size: var(--fs-md); color: var(--text-muted); }
.rapport-info-row__value      { font-size: var(--fs-md); font-weight: 600; }

/* Mobil: dölj jämförelse-kolumner via data-mobile="hide" + dölj
 * delsumme-rader-belopp som inte motsvarar synlig kolumn. Behåller
 * horisontell tabell-layout (colspan funkar inte med stack). */
@media (max-width: 760px) {
  .rapport-table th[data-mobile="hide"],
  .rapport-table td[data-mobile="hide"] { display: none; }
  .rapport-table thead th    { padding: var(--space-2) var(--space-3); }
  .rapport-table tbody td    { padding: var(--space-2) var(--space-3); }
  .rapport-table tbody td:nth-child(2) { max-width: 160px; }

  .rapport-summary-card      { gap: var(--space-3); flex-wrap: wrap; }
  .rapport-summary-card__value-block .main { font-size: var(--fs-h3); }
}


/* ─── 64. IB-diff-banner + räkenskapsår-actions (#454) ─────── */
.ib-diff-banner {
  display: flex;
  gap: var(--space-3);
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  margin-bottom: var(--space-4);
}
.ib-diff-banner__msg { flex: 1; min-width: 240px; }

.ry-action-stack {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--space-1);
}


/* ─── 65. Serie-info-ikon (#455) ──────────────────────────── */
.serie-info-ikon {
  margin-left: var(--space-1);
  color: var(--info);
  cursor: help;
  font-size: var(--fs-sm);
}


/* ─── 66. Inkorgen — presentationsskal (etapp 3c-2 PR A) ───────
 *
 * Bryter ut inline-styles ur inkorg.js till tokens/komponentklasser.
 * Logiken (AI-triage, blob-upload, routning, arkivering) är orörd —
 * bara presentationsskalet städas. Arkivera-modalen ärver storlek
 * från .modal--md (#56). Preview-modalens egna .inkorg-preview-modal-
 * stilar (style.css) lämnas orörda — viewport-fit-flex-mönstret är
 * specifikt för dokumentförhandsvisning. */

/* Upload-kortet runt dropzonen. */
.inkorg-upload-card { margin-bottom: var(--space-4); }

/* Dropzonen — drag-och-släpp-yta + klickbar. */
.inkorg-dropzone {
  border: 2px dashed var(--line);
  border-radius: var(--radius-lg);
  padding: var(--space-6) var(--space-4);
  text-align: center;
  cursor: pointer;
  transition: border-color .15s, background .15s;
  background: var(--surface-page);
}
.inkorg-dropzone--aktiv {
  border-color: var(--brand);
  background: rgba(37, 99, 235, .06);
}
.inkorg-dropzone__ikon {
  width: 36px;
  height: 36px;
  color: var(--brand);
  margin-bottom: var(--space-2);
}
.inkorg-dropzone__titel {
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--text-primary);
  margin-bottom: var(--space-1);
}
.inkorg-dropzone__hint {
  font-size: 12.5px;
  color: var(--text-secondary);
}
.inkorg-dropzone__hint-action {
  color: var(--brand);
  text-decoration: underline;
}
.inkorg-dropzone__input { display: none; }

/* Upload-status — staplade alert-rader under dropzonen. */
.inkorg-upload-status { margin-top: var(--space-3); }
.inkorg-upload-status .alert { margin-bottom: var(--space-1); }
.inkorg-upload-status__link {
  color: inherit;
  text-decoration: underline;
}
/* Retry-knappen sitter längst till höger i alert-raden — synlig först
 * när upload misslyckats (PR B). */
.upl-retry {
  margin-left: auto;
  padding: 0;
  font-size: var(--fs-sm);
}

/* Klickbar yta i listraden — öppnar preview. */
.inkorg-preview-trigger { cursor: pointer; }

/* Tom-state ("Allt är hanterat"). */
.inkorg-empty-state {
  text-align: center;
  padding: var(--space-12) var(--space-5);
}
.inkorg-empty-state__ikon {
  width: 48px;
  height: 48px;
  margin: 0 auto var(--space-4);
  opacity: .5;
  color: var(--text-secondary);
}
.inkorg-empty-state__titel {
  font-size: 15px;
  font-weight: 600;
  color: var(--text-primary);
  margin-bottom: var(--space-1);
}
.inkorg-empty-state__text { color: var(--text-secondary); }

/* Preview-modalens rubrik — ellipsis vid långa filnamn. */
.inkorg-preview-modal__titel {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-width: 0;
}

/* Fallback för icke-stödda mime-typer. */
.inkorg-preview-fallback {
  padding: var(--space-6);
  text-align: center;
  color: var(--text-secondary);
}

/* PDF-fallback för mobila webbläsare (iframe renderas tomt). */
.inkorg-preview-mobile-pdf {
  text-align: center;
  padding: var(--space-6) var(--space-4);
}
.inkorg-preview-mobile-pdf__msg {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  margin-bottom: var(--space-4);
}
.inkorg-preview-mobile-pdf__btn {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
}

/* Dämpad radera-knapp i listrad + modal-fot. */
.btn-radera { color: var(--text-secondary); }

/* Arkivera-modalen — storleken kommer från .modal--md. */
.inkorg-arkiv-modal__inledning {
  margin-bottom: var(--space-3);
  font-size: 13px;
}
.inkorg-arkiv-modal__faltgrupp { margin-bottom: var(--space-3); }
.inkorg-arkiv-modal__faltgrupp:last-child { margin-bottom: 0; }
.inkorg-arkiv-modal__label {
  font-weight: 600;
  font-size: 12.5px;
}
.inkorg-arkiv-modal__label-extra {
  font-weight: 400;
  color: var(--text-secondary);
}
.inkorg-arkiv-modal__hint {
  font-size: 11.5px;
  color: var(--text-secondary);
  margin-top: var(--space-1);
}
.inkorg-arkiv-modal__input,
.inkorg-arkiv-modal__textarea {
  width: 100%;
  font-size: 13px;
  padding: var(--space-1) var(--space-2);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  font-family: inherit;
  box-sizing: border-box;
}
.inkorg-arkiv-modal__textarea { resize: vertical; }


/* ─── 67. Global vertikal komprimering — desktop bas-skala ───────
 *
 * Stramare DELAD skala för alla generella ytor (listsidor,
 * inställningar, formulärsidor utanför .detail-page, dashboard)
 * så att kommande etapp 3-sidor ärver tätheten utan att klämma de
 * redan-strama detaljvyerna.
 *
 * SCOPE: @media (min-width: 761px) — mobil OFÖRÄNDRAD. Mobil
 * tappar inte vertikal luft (#427-skyddet håller tap-targets +
 * iOS-zoom-skydd intakta).
 *
 * SPECIFICITET: bas-klasserna (.page-header, .card-body, .form-
 * group, etc.) har specificitet 0,1,0. .detail-page-overriderna
 * i sektion #56 har 0,2,0 → vinner alltid → detail-skalan
 * (#413/#429/#430) är OFÖRÄNDRAD.
 *
 * BEHÅLLNINGAR (explicit oförändrade):
 *   • 44 px tap-targets (input/select/btn min-height-regler).
 *   • Bas-input-padding (9 px 12 px) → inga klämda fält.
 *   • Label margin-bottom (5 px global) → klick-yta intakt.
 *   • Löptext-line-height (1.5 / 1.45) → läsbarhet orörd.
 *
 * RIKTMÄRKE: en typisk bas-sida tappar ~30–40 % vertikal luft
 * över första fold:en. Skalan blir konsistent: detail > base ≈ 1,3×
 * tätare än landning, men landning fortfarande lite luftigare än
 * detail (önskat — bas-sidor är inte arbetsverktyg på samma sätt).
 *
 * FLAGGA: .form-group margin-bottom landar på --space-3 (12 px) i
 * detta steg. Om det fortfarande känns luftigt efter test —
 * nästa snäpp är 10 px (snappas till samma --space som tabellen
 * eller introducera --space-2-5 om mönstret återkommer).
 */
@media (min-width: 761px) {
  /* Page-header: störst luftbespariing (32 → 20 px = −12 px). */
  .page-header { margin-bottom: var(--space-5); }

  /* Card-yttre och inre padding: 20 24 → 16 20. */
  .card-header { padding: var(--space-4) var(--space-5); }
  .card-body   { padding: var(--space-4) var(--space-5); }

  /* Form-rytm: 16 → 12 px per grupp, 20 → 16 px per sektion,
   * 24 → 20 px mellan sektioner. */
  .form-group { margin-bottom: var(--space-3); }
  .form-section { margin-top: var(--space-4); }
  .form-section + .form-section { margin-top: var(--space-5); }

  /* Dashboard: stats-grid 32 → 24 px bottom, 20 → 16 px gap. */
  .stats-grid {
    gap: var(--space-4);
    margin-bottom: var(--space-6);
  }
  .stat-card { padding: var(--space-5); }

  /* Två-kolumn-layout: 24 → 20 px gap. */
  .grid-2 { gap: var(--space-5); }
}


/* ─── 68. Min profil (#/min-profil) ─────────────────────────────
 *
 * Personliga uppgifter — namn/mejl (readonly), telefon (editerbar)
 * + spara-knapp med inline-status. Lösenord-byte länkar till
 * befintliga /byt-losenord. Telefon-fältet är PR 1 i lön-tab-
 * borttagningsplanen — AGI-kontakt (PR 2) hämtas härifrån. */
.min-profil-actions {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  margin-top: var(--space-2);
}
.min-profil-status--ok  { color: var(--success-deep); }
.min-profil-status--fel { color: var(--danger-deep); }


/* ─── 69. Anställda — org-inställning i header (#/anstallda) ────
 *
 * "Standardutbetalningsdag för nya anställda" är en legitim org-
 * inställning (förvalt värde för anstallda-form.js när nya anställda
 * skapas). PR 4 — lön-tab-borttagningen — flyttar UI:t hit från den
 * borttagna lön-tabben. Liten kompakt rad ovanför listan, inte ett
 * helt kort. */
.anstallda-orgsetting {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  flex-wrap: wrap;
  margin-bottom: var(--space-4);
}
.anstallda-orgsetting__label {
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--text-primary);
  margin: 0;
}
.anstallda-orgsetting__input {
  width: 70px;
  flex: 0 0 auto;
}
.anstallda-orgsetting__hint {
  flex-basis: 100%;
  margin-top: 0;
}
.anstallda-orgsetting__status--ok  { color: var(--success-deep); }
.anstallda-orgsetting__status--fel { color: var(--danger-deep); }

/* Verksamhetens kommun och skattetabell per år (lön 1b-ii, B6) — samma
 * kompakta rad som lönedagen, med årets rader och en rad att lägga till. */
.anstallda-kommun { flex-direction: column; align-items: stretch; gap: var(--space-2); max-width: 100%; min-width: 0; }
.anstallda-kommun__huvud { display: flex; flex-direction: column; gap: 2px; }
.anstallda-kommun__tabell { width: 100%; max-width: 640px; table-layout: fixed; font-size: var(--fs-sm); border-collapse: collapse; }
.anstallda-kommun__tabell th, .anstallda-kommun__tabell td { padding: 4px var(--space-3) 4px 0; text-align: left; vertical-align: top; overflow-wrap: anywhere; }
.anstallda-kommun__tabell th:nth-child(1), .anstallda-kommun__tabell th:nth-child(3) { width: 5em; }
.anstallda-kommun__tabell th { color: var(--muted); font-weight: 600; }
.anstallda-kommun__rod { color: var(--danger-deep); font-weight: 600; }
.anstallda-kommun__tom { margin: 0; font-size: var(--fs-sm); }
.anstallda-kommun__ny { display: flex; flex-wrap: wrap; gap: var(--space-2) var(--space-3); align-items: flex-end; }
.anstallda-kommun__ny label { display: flex; flex-direction: column; gap: 2px; font-size: var(--fs-sm); font-weight: 600; margin: 0; }
.anstallda-kommun__ny label.anstallda-checkbox-label { flex-direction: row; align-items: center; font-weight: 400; }
.anstallda-kommun__ny input[type="number"] { width: 90px; }
.anstallda-kommun__ny input[type="text"] { width: 200px; max-width: 100%; }
.anstallda-col-skatt { white-space: nowrap; }

/* Anställd-listans sökruta + kolumnsortering. Speglar transaktioner-sökets
 * placering i .card-header och bokföringslistans th[data-sort]-mönster. */
.anstallda-search-input { width: 240px; margin: 0; }
.anstallda-table thead th[data-sort] {
  cursor: pointer;
  user-select: none;
  position: relative;
  padding-right: var(--space-6);
  transition: color .12s ease;
}
.anstallda-table thead th[data-sort]:hover { color: var(--text-primary); }
.anstallda-table thead th[data-sort]:focus-visible {
  outline: none;
  box-shadow: var(--focus-ring);
  border-radius: var(--radius);
}
.anstallda-table .sort-indicator {
  position: absolute;
  right: var(--space-3);
  top: 50%;
  transform: translateY(-50%);
  font-size: 11px;
  line-height: 1;
  opacity: 0;
  transition: opacity .12s ease;
  color: var(--text-secondary);
}
.anstallda-table thead th[data-sort]:hover .sort-indicator { opacity: .45; }
.anstallda-table thead th[aria-sort] .sort-indicator { opacity: 1; color: var(--info-deep); }
@media (max-width: 600px) {
  .anstallda-search-input { width: 100%; }
}


/* ─── 70. Inställningar — etapp 3c PR A städstilar ──────────────
 *
 * Stöd för Företag / Moduler / Import-Export-tabbarna. Bryter ut
 * inline-styles till klasser så att kommande PR B/C (övriga tabbar)
 * kan ärva samma mönster.
 *
 * orgNr-låset (BFL-identitet) hanteras på två lager: UI-readonly +
 * server-422 i PUT /api/orgs/current. CSS-readonly-stilen kommer
 * från det globala input:read-only-mönstret som etablerades i #465. */

/* Full-bredds-row i .form-grid-2 — ersätter style="grid-column:1/-1". */
.form-grid-2__full { grid-column: 1 / -1; }

/* Faktureringsinställningar (bokföringsfliken) — grupperade fält. */
.form-fieldset { border: 1px solid var(--border); border-radius: var(--radius); padding: var(--space-3) var(--space-4); margin: 0 0 var(--space-4); }
.form-fieldset > legend { padding: 0 var(--space-2); font-weight: 600; font-size: var(--fs-sm); color: var(--text-secondary); }
.fakt-check { display: flex; align-items: center; gap: var(--space-2); margin: var(--space-1) 0; }
/* Mobil 375px: tvåkolumnsrutnätet staplar. */
@media (max-width: 480px) {
  .form-fieldset .form-grid-2 { grid-template-columns: 1fr; }
}

/* Checkbox-rad i form-grid-2 (F-skatt-mönstret): label-flex med
 * top-offset så checkbox-raden hänger ihop med inputs i grid-rytmen. */
.installningar-checkbox-row {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  cursor: pointer;
  margin-top: var(--space-6);
}

/* Card-header-subtitle (muted-text efter card-title). */
.installningar-card-subtitle {
  font-size: 12px;
  color: var(--text-secondary);
}

/* ─── Momskodsmatrisen — en tabell, inte 50 formulärfält ──────────────────
 *
 * ⚠️⚠️ FÄLTENS MIN-BREDD ÄR DET SOM BÄR, och det är MÄTT. `table { width: 100% }`
 * gör att sju kolumner KRYMPER i stället för att rulla: utan `min-width` på
 * inputen blir fälten 40 px breda — inte bara på 375 px utan även på 1440 —
 * och tabellen ser trasig ut utan att någonting spiller. Med min-bredden blir
 * tabellen bredare än sin behållare, `.table-wrapper` rullar, och sidans body
 * står stilla. Samma lärdom som #877/#891.
 *
 * ⚠️ EN MIN-BREDD PÅ SJÄLVA TABELLEN STOD HÄR FÖRST, med kommentaren att den
 * var "hela poängen". Proben visade att den var HELT INERT — fältens min-bredd
 * gör redan jobbet. Den är borttagen: en regel som inte gör något, med en
 * kommentar som säger att den gör allt, är sämre än ingen regel.
 */
.mk-tabell td,
.mk-tabell th[scope="row"] {
  vertical-align: top;
}
/* Rubrikcellen på egen rad ser rörigare ut bruten — rent presentationsval. */
.mk-tabell th[scope="row"] {
  white-space: nowrap;
}
.mk-tabell .mk-konto {
  width: 100%;
  min-width: 112px;
}
/* ⚠️ En cell som ligger kvar på sitt STANDARDVÄRDE tonas ner. Det är så en org
 * ser sina AVVIKELSER i stället för en vägg av likadana kontonummer. Värdet
 * står kvar i fältet — ingenting döljs, ingenting skrivs om. */
.mk-tabell .mk-konto--standard {
  color: var(--text-secondary);
}
/* ⚠️⚠️ ÖVERLÄGG, INTE EN RAD I FLÖDET. Listan låg i cellen och sköt ner hela
   tabellen; öppnades kontoväljarens lista ovanpå stod två listor på varandra
   med dubbelskriven text. Föräldern (.inst-kontofalt) är position: relative. */
.mk-kandidater {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  z-index: 5;
  margin-top: 2px;
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  padding: 6px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 6px;
  box-shadow: 0 6px 18px rgba(27, 36, 48, .14);
}
.mk-kandidater[hidden] { display: none; }

/* Hjälptext över fält-grupper (t.ex. logo-uppladdning). */
.installningar-hjalptext {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  margin: 0 0 var(--space-3);
}

/* Hjälptext under låst fält (orgNr) eller annan kontext-info. */
.installningar-locked-hint {
  display: block;
  font-size: 11.5px;
  color: var(--text-secondary);
  margin-top: var(--space-1);
}

/* Logotyp-platshållare (legacy TODO-rad — kvar för bakåtkomp.). */
.logotyp-placeholder {
  padding: var(--space-3);
  background: var(--surface-inset);
  border-radius: var(--radius);
  font-size: 13px;
  color: var(--text-secondary);
}

/* Logotyp-uppladdning i Företag-tabben. Tre varianter (wide/square/icon)
   i grid på desktop, staplade på mobil. */
.logotyp-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-4);
  align-items: start;
}
.logotyp-block {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  padding: var(--space-3);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--surface-card);
}
.logotyp-block__label {
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--text-primary);
}
.logotyp-block__hint {
  font-size: var(--fs-eyebrow);
  color: var(--text-secondary);
  line-height: 1.4;
  min-height: 2.2em;  /* lika höjd över blocken */
}
.logotyp-preview {
  border: 1px dashed var(--line);
  border-radius: var(--radius);
  background: var(--surface-inset);
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}
.logotyp-preview img {
  max-width:  100%;
  max-height: 100%;
  object-fit: contain;
}
/* Variant-specifika preview-mått matchar varianternas naturliga form. */
.logotyp-preview--wide   { width: 100%;  height: 80px;  }
.logotyp-preview--square { width: 120px; height: 120px; margin: 0 auto; }
.logotyp-preview--icon   { width: 80px;  height: 80px;  margin: 0 auto; }
.logotyp-tom {
  font-size: var(--fs-eyebrow);
  color: var(--text-secondary);
  text-align: center;
  padding: var(--space-2);
}
.logotyp-actions {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  flex-wrap: wrap;
}
.logotyp-file-input {
  /* Visuellt dolt men tillgängligt (klick via <label for>) */
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  border: 0;
}
.logotyp-knapp { cursor: pointer; }
.logotyp-knapp-radera {
  background: var(--danger-soft);
  color: var(--danger-deep);
  border: 1px solid var(--danger);
}
.logotyp-knapp-radera:hover {
  background: var(--danger);
  color: var(--paper);
}
.logotyp-status { width: 100%; }
.logotyp-status:empty { display: none; }
.logotyp-format { width: 100%; }
.logotyp-format:empty { display: none; }

/* ⚠️ PROVET PÅ HUR IKONEN SER UT I MENYN. Remsan har sidomenyns egen mörka
   ton, för en 28-pixelsruta mot vitt papper visar inte samma sak som samma
   ruta mot menyns bakgrund — en mörk logotyp kan se skarp ut här och
   försvinna där. Själva rutan ärver .sidebar-logo-img/.sidebar-logo-initial
   ur style.css; måtten sätts alltså EN gång, av menyn. */
.logotyp-menyprov {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  width: 100%;
  padding: var(--space-2);
  border-radius: var(--radius);
  /* Ingen reservfärg: --sidebar-bg sätts i style.css :root, som laddas före
     den här filen i app/layout.tsx. En literal här hade varit en andra
     sanning om menyns färg, och den som ändrar tonen ändrar bara en av dem. */
  background: var(--sidebar-bg);
}
.logotyp-menyprov__ruta {
  display: flex;
  align-items: center;
  flex-shrink: 0;
}
.logotyp-menyprov__text {
  font-size: var(--fs-eyebrow);
  color: rgba(255,255,255,.72);
  line-height: 1.35;
}

/* Val av logo-variant för kundfaktura-rendering. Ligger under
   varianten-griden så valet uppenbart hör ihop med dem. */
.logotyp-faktura-val {
  margin-top: var(--space-4);
  padding: var(--space-3);
  background: var(--surface-inset);
  border-radius: var(--radius);
}
.logotyp-faktura-val__label {
  display: block;
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--text-primary);
  margin-bottom: var(--space-2);
}
.logotyp-faktura-val__radios {
  display: flex;
  gap: var(--space-4);
  flex-wrap: wrap;
}
.logotyp-faktura-val__radio {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  font-size: var(--fs-sm);
  cursor: pointer;
}
.logotyp-faktura-val__hint {
  margin: var(--space-2) 0 0;
  font-size: var(--fs-eyebrow);
  color: var(--text-secondary);
}

@media (max-width: 600px) {
  .logotyp-grid { grid-template-columns: 1fr; }
  .logotyp-actions { width: 100%; }
  .logotyp-faktura-val__radios { flex-direction: column; gap: var(--space-2); }
}

/* Moduler-tabb — request-list + status-meta. */
.modules-request-list {
  padding: var(--space-3);
  background: var(--surface-inset);
  border-radius: var(--radius);
}
.modules-request-row {
  display: flex;
  gap: var(--space-3);
  align-items: flex-start;
  padding: var(--space-1) 0;
  cursor: pointer;
}
.modules-request-row__checkbox { margin-top: 3px; flex: 0 0 auto; }
.modules-request-row__desc {
  font-size: 12px;
  color: var(--text-secondary);
}
.modules-request-error {
  color: var(--danger-deep);
  font-size: 13px;
  min-height: 1em;
}
.modules-status-meta {
  font-size: 11px;
  color: var(--text-secondary);
  margin-top: var(--space-1);
}
.modules-lead { font-size: 13px; color: var(--text-secondary); }
.modules-list  { margin-top: var(--space-3); }
.modules-request-actions {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  margin-top: var(--space-2);
}

/* Inställningar — section-rubriker i Import/Export-tabben. */
.installningar-section { margin-top: var(--space-6); }
.installningar-section--divided {
  padding-top: var(--space-6);
  border-top: 1px solid var(--line);
  margin-top: var(--space-8);
}
.installningar-section__heading {
  font-size: 15px;
  margin: 0 0 var(--space-1);
}
.installningar-section__lead {
  color: var(--text-secondary);
  font-size: 13px;
  margin: 0 0 var(--space-3);
}
.installningar-section__hint {
  margin-top: var(--space-2);
  font-size: 12px;
  color: var(--text-secondary);
  font-style: italic;
}


/* ─── 71. Inställningar — etapp 3c PR B (Bankkonton/Räkenskapsår/
 *      Periodstängning) ────────────────────────────────────────
 *
 * Bryter ut inline-styles + bygger bk-modalen på den delade .modal-
 * standarden istället för en lokal inline-implementation.
 *
 * VAKTHUNDAR — kommentar:
 *   • Räkenskapsår: handlers/endpoint-anrop (stäng/återöppna/rulla-om-IB)
 *     är OFÖRÄNDRADE — bara klasser/markup byter. Den delade
 *     ib-diff-banner.js-helpern (#458) röras inte.
 *   • Bankkonton: IBAN-/avtals-ID-validering är server-side i
 *     /api/orgs/current/bank-accounts — inga frontend-ändringar i
 *     valideringen. medUpptagen läggs runt mutations-anropen.
 *   • Periodstängning: LIFO-spärren ligger i /api/perioder/stang —
 *     UI:t skickar bara år/månad/reason. Spärren är server-side.
 */

/* Tabell-cell-meddelanden (loading/empty/error i tom tabell). */
.table-cell-message {
  padding: var(--space-5);
  text-align: center;
  color: var(--text-secondary);
}
.table-cell-alert { margin: var(--space-3); }

/* Räkenskapsår-tabben */
.ry-preset-row {
  display: flex;
  gap: var(--space-2);
  margin-bottom: var(--space-3);
  flex-wrap: wrap;
}
.ry-preview {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  margin-bottom: var(--space-3);
  min-height: 1.2em;
}
.ry-skapa-msg { margin-top: var(--space-3); }
.ry-banner-slot { margin-bottom: var(--space-4); }
.ry-card--lista { margin-top: var(--space-4); }

/* Periodstängning-tabben */
.ps-form-grow { flex: 1; min-width: 200px; }
.ps-ar-input  { width: 120px; }
.ps-stang-msg { margin-top: var(--space-3); }
.ps-card--lista { margin-top: var(--space-4); }
.ps-actions-col { width: 90px; }

/* Bankkonton-tabben — listans tabell + tom-state */
.bk-empty {
  padding: var(--space-5);
  text-align: center;
}
.bk-table th.th--narrow { width: 80px; }              /* fix: selektorn saknade punkt → matchade aldrig */
.bk-table td.td--center { text-align: center; }
.bk-table-actions {
  display: inline-flex;
  gap: var(--space-1);
}

/* Bankkonton-modalen — ärver .modal modal--md för storlek. Det här
 * är 2-col-formgrid INNE i .modal-body. */
.bk-modal-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-3) var(--space-4);
}
@media (max-width: 560px) {
  .bk-modal-grid { grid-template-columns: 1fr; }
}
.bk-modal-grid__full { grid-column: 1 / -1; }
.bk-modal-grid .form-group { margin-bottom: 0; }
.bk-modal-grid .helper-text { margin-top: var(--space-1); }

/* Inline alert i modal-body (#bk-modal-err innan formuläret). */
.bk-modal-err:empty { display: none; }
.bk-modal-err .alert { margin: 0 0 var(--space-3); }

/* Checkbox-rad inom bk-modal (utan top-margin från Företag-tabbens
 * grid-rytm). */
.bk-modal-checkbox-row {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  cursor: pointer;
}

/* Listrad-klick: ersätter listradsknappar (Ändra/X) — radering bara
 * via modal-detalj (#397-mönstret, skydd för pain.001-data). */
.bk-row { cursor: pointer; }
.bk-row:hover { background: var(--hover-tint); }
.bk-row:focus-visible {
  outline: 2px solid var(--brand);
  outline-offset: -2px;
}


/* ─── 72. Inställningar — etapp 3c PR C (Serier / Std-serie /
 *      Utlägg) + UX-fixar från PR B-test ─────────────────────── */

/* Spara-status-text bredvid spara-knapp — delad av serier-/utlägg-/
 * moduldefaults-footers + ev. fler. */
.spara-status {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  min-height: 1em;
}
.spara-status--ok  { color: var(--success-deep); }
.spara-status--fel { color: var(--danger-deep); }

/* Card-footer (action-rad i nedre delen av kort). Två varianter:
 *   • bas: margin-top, ingen border (samma kort, andra raden)
 *   • --divided: border-top + padding (avgränsad sektion) */
.installningar-card-footer {
  margin-top: var(--space-4);
  display: flex;
  justify-content: flex-end;
  gap: var(--space-2);
  align-items: center;
}
.installningar-card-footer--divided {
  margin-top: 0;
  padding: var(--space-3) var(--space-4);
  border-top: 1px solid var(--line);
}

/* Serier-tabellens kolumn-bredder + cell-stil.
   FIX (desktop-PR A): selektorerna saknade punkt (`th--kod` matchar aldrig
   `<th class="th--kod">`) → kolumnerna delade lika på full bredd och sträcktes
   ut. Nu punkt-prefixade + tabell-tak + centrerade kryssrutor + kapat namn-fält
   → tät, läsbar tabell i stället för full-bredds-utsträckning. */
.serier-table               { width: auto; max-width: 720px; }
.serier-table th.th--kod    { width: 60px; }
.serier-table th.th--aktiv  { width: 120px; text-align: center; }
.serier-table th.th--manuell{ width: 180px; text-align: center; }
.serier-table td.td--kod    { font-weight: 600; }
.serier-table td.td--center { text-align: center; }
.serier-table .s-namn       { max-width: 320px; width: 100%; }

/* Utläggskonto-sektionen */
.utlagg-select-wrap { max-width: 420px; }
.utlagg-empty-msg   {
  margin-top: var(--space-2);
  font-size: var(--fs-sm);
}
.utlagg-empty-msg[hidden] { display: none; }

/* ── ROT/RUT-statusfliken (PR 4) — nyckeltalskort + tabell ── */
.rr-nyckeltal {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(200px, 100%), 1fr));
  gap: var(--space-3);
  margin-bottom: var(--space-4);
}
.rr-nyckeltal__varde { font-size: var(--fs-h2, 1.5rem); font-weight: 700; }
.rr-tabell .rr-valj { width: 36px; }
.rr-tabell .rr-handling { white-space: nowrap; }
@media (max-width: 760px) {
  .rr-tabell .rr-handling { white-space: normal; }
}

/* ROT/RUT-kontots tomma-kontoplan-varning: .alert sätter display:flex som
 * annars ÖVERTRUMFAR hidden-attributet (UA-regeln [hidden]{display:none}
 * förlorar mot klass-display) → en tom gul ruta syntes alltid. Samma
 * skyddsregel som utläggskontots. */
.rotrut-skv-empty-msg[hidden] { display: none; }

/* Inline-alert i kort-body (utan extra margin). */
.installningar-inline-alert { margin: 0; }

/* Modal-footer-split: knappgrupp vänster + höger (PR C bankkonto-
 * radering i modal). */
.modal-footer--split { justify-content: space-between; }
.modal-footer-left,
.modal-footer-right {
  display: flex;
  gap: var(--space-2);
  align-items: center;
}


/* ─── 73. Lön-paketet — skal (etapp 3d) ─────────────────────────
 * Delade markup-mönster som tidigare smutsade lon.js, lon-detalj.js,
 * lon-semesterskuld.js, lon-semesterarsavslut.js och anstalld/lon/*.
 * Inga nya hexar — allt går via tokens. Prefix .lon-* så de inte
 * krockar med andra moduler.
 * ─────────────────────────────────────────────────────────── */

/* Wrappers: konsult-vyns max-bredd och centrering för smal/medium/wide.
 * overflow-x: clip håller wizard-sidor inom viewporten — om en inre
 * tabell/banner/inline-row skulle överrymma så scrollar den inuti sitt
 * eget block (.lon-card--scrollx) i stället för att tvinga page-scroll
 * sidleds. Mobil-säker — matchar #413-standarden från detaljvyerna.
 *
 * --full: bred wizard-layout som nyttjar desktop-yta. Capp:ad vid 1600 px
 * så ultrawide-skärmar inte sträcker rad-längden bortom läsbart. Används
 * av semester-wizards där anställd-tabellen är bred (10+ kolumner). */
.lon-wrap         { max-width: 880px;  overflow-x: clip; }
.lon-wrap--wide   { max-width: 1000px; overflow-x: clip; }
.lon-wrap--narrow { max-width: 640px;  overflow-x: clip; }
.lon-wrap--full   { max-width: 1100px; overflow-x: clip; }   /* desktop-PR A: 1600 var i praktiken otakat på vanliga skärmar */

/* "Eyebrow"-rubrik i lönespec-sektioner (uppercase, dämpad). */
.lon-eyebrow {
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  color: var(--text-secondary);
  text-transform: uppercase;
  letter-spacing: .04em;
  margin-bottom: var(--space-3);
}

/* Padding-utility för kort som inte är .card-header/.card-body. */
.lon-card-pad    { padding: var(--space-4); }
.lon-card-pad-lg { padding: var(--space-6); }
.lon-card--stack { margin-bottom: var(--space-4); }
.lon-card--center {
  padding: var(--space-6);
  text-align: center;
}

/* Inset-tabell (totaler / preview-summor). Mjuk yta, kompakt cell. */
.lon-totals-table {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--fs-sm);
}
.lon-totals-table td {
  padding: var(--space-1) 0;
  vertical-align: baseline;
}
.lon-totals-table .lon-totals-table__label { color: var(--text-secondary); }
.lon-totals-table .lon-totals-table__value {
  text-align: right;
  font-weight: 600;
}
.lon-totals-table tr.lon-totals-row--sum td {
  border-top: 1px solid var(--line);
  padding-top: var(--space-2);
  font-weight: 600;
}
.lon-totals-table .lon-totals-value--ok  { color: var(--success-deep); }
.lon-totals-table .lon-totals-value--warn { color: var(--warning-deep); }

/* Liten textstil (info/hint) återanvänds av många små noter. */
.lon-info-text {
  margin: 0;
  font-size: var(--fs-sm);
  color: var(--text-secondary);
}
.lon-info-text--xs    { font-size: var(--fs-eyebrow); }
.lon-info-text--ok    { color: var(--success-deep); font-weight: 600; }
.lon-info-text--warn  { color: var(--warning-deep); font-weight: 600; }
.lon-info-text--danger{ color: var(--danger-deep);  font-weight: 600; }
.lon-info-text--center{ text-align: center; }
.lon-info-text--stack { margin-top: var(--space-2); }
.lon-info-text--inline{ display: inline; }
.lon-info-text--p1    { padding: var(--space-1) 0; }
.lon-info-text--right { text-align: right; }

/* Lite eyebrow-meta (datatabell hint / per-emp meta). */
.lon-meta-line {
  font-size: var(--fs-eyebrow);
  color: var(--text-secondary);
  margin-top: 2px;
}
.lon-meta-line--warn {
  color: var(--danger-deep);
  margin-top: var(--space-1);
}

/* Per-anställd cell — text-right + small font för dense table. */
.lon-cell--right { text-align: right; font-size: var(--fs-sm); }
.lon-cell--brand { color: var(--brand); }
.lon-cell--ok    { color: var(--success-deep); }
.lon-cell--warn  { color: var(--warning-deep); }
.lon-cell--muted { color: var(--text-secondary); }
.lon-cell--num-input { min-width: 180px; }
.lon-cell--num-input .lon-num-input {
  width: 70px;
  font-size: var(--fs-sm);
}
.lon-cell--num-stack {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
}
.lon-cell--inset { background: var(--surface-inset); }

/* Tabellrad i Semesterskuld-vyn (delim på borderfärg). */
.lon-skuld-row { border-bottom: 1px solid var(--line); }
.lon-skuld-row th,
.lon-skuld-row td { text-align: left; padding: 6px var(--space-1); }
.lon-skuld-row th.lon-skuld-cell--right,
.lon-skuld-row td.lon-skuld-cell--right { text-align: right; }
.lon-skuld-row td.lon-skuld-cell--muted { color: var(--text-secondary); }

/* Klickbar rad (cursor + hover) — list-row light. */
.lon-row-clickable { cursor: pointer; }

/* "Inkomstinfo"-rad i body med fetare text. */
.lon-key-line {
  margin: 0;
  font-size: var(--fs-sm);
  color: var(--text-body);
}
.lon-key-line__date {
  font-size: var(--fs-md);
  font-weight: 600;
}
.lon-key-line__hint {
  color: var(--text-secondary);
  font-size: var(--fs-eyebrow);
  margin-left: var(--space-1);
}

/* Modal-bredder (matchar projektets befintliga modal-sizes #1553). */
.lon-modal--sm { max-width: 480px; }
.lon-modal--md { max-width: 500px; }
.lon-modal--mdp { max-width: 600px; }
.lon-modal--lg { max-width: 640px; }
.lon-modal--xl { max-width: 700px; }

/* Filter-bar med "skjut till höger"-kluster. */
.lon-actionbar {
  margin: var(--space-4) 0;
  display: flex;
  gap: var(--space-3);
  align-items: center;
  flex-wrap: wrap;
}
.lon-actionbar__right {
  margin-left: auto;
  display: flex;
  gap: var(--space-2);
}
.lon-actionbar--simple { margin: var(--space-4) 0; }

/* Compact 2-kol grid för "label:värde"-summor (AGI preview). */
.lon-kv-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--space-2);
}

/* Inline-rad (label + chips i radform). */
.lon-inline-row {
  display: flex;
  gap: var(--space-3);
  align-items: center;
  flex-wrap: wrap;
}
.lon-inline-row--tight { gap: var(--space-2); }

/* Form-rader: "två inputs på samma rad" (start-date + start-time). */
.lon-form-row {
  display: flex;
  gap: var(--space-3);
}
.lon-form-row > .form-group { flex: 1; }
.lon-form-row .lon-flex-1 { flex: 1; }
.lon-form-row .lon-flex-2 { flex: 2; }
.lon-form-row--tight { gap: var(--space-2); }

/* Endags-banner (varning i exp-create) — varning-soft yta.
 * Hidden-läge styrs via [hidden] eller .lon-endags-banner[hidden]. */
.lon-endags-banner {
  background: var(--warning-soft);
  border: 1px solid var(--warning);
  color: var(--warning-deep);
  padding: var(--space-3);
  border-radius: 6px;
  margin-bottom: var(--space-4);
  font-size: var(--fs-sm);
}

/* Receipt-rad inom exp-create-modalen. */
.lon-receipt-row {
  border: 1px solid var(--line);
  padding: var(--space-3);
  margin-bottom: var(--space-2);
  border-radius: 6px;
  background: var(--surface-inset);
}
.lon-receipt-row__head {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: var(--space-2);
}
.lon-receipt-row__body { flex: 1; }
.lon-receipt-row__amount {
  font-size: var(--fs-sm);
  margin-top: var(--space-1);
}
.lon-receipt-row__ok {
  font-size: var(--fs-sm);
  color: var(--success-deep);
  margin-top: var(--space-1);
}
.lon-receipt-row__decl {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  margin-top: var(--space-1);
}

/* Receipt-inline-form (öppnas inom modalen). */
.lon-receipt-form {
  border: 2px solid var(--brand);
  padding: var(--space-4);
  margin-bottom: var(--space-2);
  border-radius: 6px;
  background: var(--info-soft);
}
.lon-receipt-form h4 { margin-top: 0; }

/* Filupload-rad och dess preview (img/PDF-stub). */
.lon-file-row {
  display: flex;
  gap: var(--space-2);
  align-items: center;
}
.lon-file-hidden { display: none; }
.lon-file-name {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
}
.lon-file-preview { margin-top: var(--space-2); }
.lon-file-preview img,
.lon-preview-img {
  max-width: 200px;
  max-height: 150px;
  border: 1px solid var(--line);
  border-radius: 4px;
}
.lon-preview-img--lg {
  max-width: 300px;
  max-height: 200px;
  border: 1px solid var(--line);
  border-radius: 4px;
}
.lon-preview-img--clickable { cursor: pointer; }
.lon-preview-pdf {
  padding: var(--space-2) var(--space-3);
  border: 1px solid var(--line);
  border-radius: 4px;
  display: inline-block;
  font-size: var(--fs-sm);
}
.lon-preview-pdf--lg {
  padding: var(--space-3);
  border: 1px solid var(--line);
  border-radius: 4px;
  text-decoration: none;
  display: inline-block;
}

/* "Sammanfattning"-kort på inset-yta. */
.lon-summary-card {
  margin-top: var(--space-4);
  background: var(--surface-inset);
}
.lon-summary-card h3 { margin-top: 0; }

/* Form-sektions-bryt (mileage → utlägg) — överliggande rad. */
.lon-form-section {
  margin-top: var(--space-6);
  padding-top: var(--space-4);
  border-top: 1px solid var(--line);
}
.lon-form-section__head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: var(--space-2);
}

/* Inline-fel (bredvid form-fält / kort), röd liten text. */
.lon-inline-error {
  margin-top: var(--space-2);
  color: var(--danger-deep);
  font-size: var(--fs-sm);
}

/* Granska-modalens dag-/kvittolista. */
.lon-doc-list {
  list-style: none;
  padding: 0;
  margin: 0;
}
.lon-doc-list__item {
  padding: var(--space-2) 0;
  border-top: 1px solid var(--line);
}
.lon-doc-list__item--row {
  display: flex;
  justify-content: space-between;
  padding: var(--space-2) 0;
  border-top: 1px solid var(--line);
}
.lon-doc-list__head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
}
.lon-doc-list__meta {
  display: flex;
  justify-content: space-between;
  font-size: var(--fs-sm);
  color: var(--text-body);
  margin-top: 2px;
}

/* AGI-row submitted-toggle + checkbox-rad. */
.lon-toggle-row {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
}

/* Avbruten-rad: efterföljande korrigeringslänk. */
.lon-cancelled-hint {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  margin-left: var(--space-2);
}

/* Avvisa-modalens textarea — bredd 100% + sane border. */
.lon-textarea--full {
  width: 100%;
  padding: var(--space-2);
  border: 1px solid var(--line);
  border-radius: 6px;
  font-family: inherit;
  font-size: var(--fs-body);
}

/* Avvisa-modalen ligger ovanpå granska-modalen. */
.lon-overlay--stacked { z-index: 1100; }

/* Bas-20-triangel (semesterårsavslut). */
.lon-bas20-icon {
  cursor: pointer;
  color: var(--warning);
  font-size: var(--fs-lg);
  margin-left: 6px;
  user-select: none;
}

/* Bubbel-tooltip (semesterårsavslut) — Float position styrs i JS. */
.lon-tooltip-bubble {
  position: absolute;
  background: var(--ink);
  color: var(--text-on-dark);
  padding: 6px var(--space-3);
  border-radius: 4px;
  font-size: var(--fs-sm);
  line-height: 1.4;
  max-width: 240px;
  box-shadow: var(--shadow);
  z-index: 1000;
  white-space: normal;
}

/* Semesterårsavslut "avslutad"-info-kort. */
.lon-avslutad-info {
  padding: var(--space-5);
  background: var(--success-soft);
  border-left: 4px solid var(--success-deep);
  margin-bottom: var(--space-4);
}
.lon-avslutad-info p { margin: 0; }
.lon-avslutad-info p + p { margin-top: var(--space-2); }

/* Avslut-årgångsrad. */
.lon-argang-row {
  font-size: var(--fs-sm);
  padding: 2px 0;
}
.lon-argang-row__exp {
  color: var(--text-secondary);
}

/* Center-loader inom .card. */
.lon-loader {
  padding: var(--space-6);
  text-align: center;
  color: var(--text-secondary);
}

/* Anställd-vyns "Utbetalas"-hero. */
.lon-utbet-hero {
  background: var(--brand);
  color: var(--paper);
  border-radius: 8px;
  padding: var(--space-6);
  margin-bottom: var(--space-4);
  text-align: center;
}
.lon-utbet-hero__eyebrow {
  font-size: var(--fs-eyebrow);
  opacity: .7;
  text-transform: uppercase;
  letter-spacing: .04em;
}
.lon-utbet-hero__amount {
  font-size: 32px;
  font-weight: 700;
  margin: 6px 0;
  font-family: var(--font-heading);
}
.lon-utbet-hero__date {
  font-size: var(--fs-sm);
  opacity: .9;
}
.lon-utbet-hero__bank {
  font-size: var(--fs-sm);
  opacity: .7;
  margin-top: var(--space-2);
}

/* Anställd-vyns lönespec rad-typer. */
.lon-row {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  padding: var(--space-1) 0;
  font-size: var(--fs-body);
}
.lon-row__label { color: var(--text-body); }
.lon-row__value { color: var(--text-primary); }

.lon-row--bold {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  padding: var(--space-2) 0 var(--space-1);
  margin-top: var(--space-1);
  border-top: 1px solid var(--line);
  font-size: var(--fs-md);
  font-weight: 600;
}

/* Anställd: utlägg-rad (utlägg-recept). */
.lon-utlagg-row {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  padding: 6px 0;
  font-size: var(--fs-body);
  gap: var(--space-3);
}
.lon-utlagg-row__supplier {
  color: var(--text-primary);
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.lon-utlagg-row__date {
  color: var(--text-secondary);
  font-size: var(--fs-sm);
  white-space: nowrap;
}
.lon-utlagg-row__amount {
  color: var(--text-primary);
  white-space: nowrap;
}
.lon-utlagg-row__arrow {
  margin-left: var(--space-1);
  color: var(--brand);
}

/* Anställd: "Sektion"-titel ovanför kort. */
.lon-section-title {
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  color: var(--text-secondary);
  text-transform: uppercase;
  letter-spacing: .04em;
  margin-bottom: var(--space-3);
}

/* Anställd: "Arbetsgivare"-värden. */
.lon-org-name {
  font-size: var(--fs-body);
  color: var(--text-primary);
  margin-bottom: var(--space-1);
}
.lon-org-orgnr {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
}

/* Anställd-listan: år-grupp + årsrubrik. */
.lon-year-group { margin-bottom: var(--space-6); }
.lon-year-heading {
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--text-secondary);
  text-transform: uppercase;
  letter-spacing: .04em;
  margin-bottom: var(--space-2);
}

/* Anställd-listan: rad-länken. */
.lon-list-link {
  text-decoration: none;
  color: inherit;
  display: block;
}
.lon-list-card {
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.lon-list-card__right { text-align: right; }
.lon-list-card__amount {
  font-size: var(--fs-md);
  font-weight: 600;
  color: var(--text-primary);
}
.lon-list-card__arrow {
  font-size: var(--fs-sm);
  color: var(--brand);
  margin-top: var(--space-1);
}

/* Anställd: tillbaka-länk + PDF-länk-knapp. */
.lon-back-link {
  color: var(--brand);
  font-size: var(--fs-sm);
  text-decoration: none;
  display: inline-block;
  margin-bottom: var(--space-3);
}
.lon-pdf-link {
  display: inline-block;
  padding: var(--space-3) var(--space-6);
  background: var(--paper);
  border: 1px solid var(--brand);
  color: var(--brand);
  border-radius: 6px;
  text-decoration: none;
  font-weight: 500;
  font-size: var(--fs-sm);
}
.lon-pdf-wrap {
  margin-top: var(--space-6);
  text-align: center;
}
.lon-title--inner {
  font-size: var(--fs-lg);
}

/* Lon-detalj: redovisar tabellraden för procent-vacation. */
.lon-pvp-table {
  width: 100%;
  font-size: var(--fs-sm);
  border-collapse: collapse;
  background: var(--surface-inset);
  border: 1px solid var(--line);
  border-radius: 4px;
}
.lon-pvp-table td {
  padding: var(--space-1) var(--space-2);
}
.lon-pvp-table td:first-child {
  color: var(--text-body);
}
.lon-pvp-table td:last-child {
  text-align: right;
}
.lon-pvp-row--divider td { border-top: 1px solid var(--line); }
.lon-pvp-row--sum td {
  border-top: 1px solid var(--line);
  font-weight: 600;
}

/* Lon-detalj: disabled "auto"-fält (semestertillägg). */
.lon-input--disabled-auto {
  background: var(--surface-inset);
  color: var(--text-body);
}

/* Lon-detalj: action-bar för status-knappar. */
.lon-action-bar {
  margin-top: var(--space-4);
  display: flex;
  gap: var(--space-2);
  flex-wrap: wrap;
}
.lon-status-extra-margin { margin-left: var(--space-2); }

/* Full-bredd-knapp (mobile-first action). */
.lon-btn-full { width: 100%; }
.lon-btn--flex { flex: 1; min-width: 180px; }
.lon-btn--sm   { font-size: var(--fs-sm); }

/* Marginal till alert som körs ovanpå container utan padding. */
.lon-alert-margin { margin: var(--space-4); }

/* Tabellrad-skala (semesterårsavslut → compact). */
.lon-table--compact { font-size: var(--fs-sm); min-width: 100%; }

/* Scroll-bar för stora horisontella tabeller i kortet. */
.lon-card--scrollx { overflow-x: auto; }

/* Bold label (formulär-rad-titel). */
.lon-label--bold { font-weight: 600; }

/* Smal år-input (4 siffror). */
.lon-input--year { width: 90px; padding: 6px; font-size: var(--fs-body); }

/* Liten badge-storlek (xs-chip i argangar-rad). */
.lon-badge--xs { font-size: 10px; }

/* Cell-xs (mycket liten skala — argang-text). */
.lon-cell--xs { font-size: var(--fs-eyebrow); }

/* Lon-detalj specifika klasser. */
.lon-warn-li { display: list-item; margin: 2px 0; }
.lon-warn-body { margin-top: 6px; }
.lon-warn-list {
  list-style: disc;
  padding-left: 20px;
  margin: var(--space-2) 0 6px;
}
.lon-warn-foot {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
}
.lon-alert--hard {
  background: var(--danger-soft);
  border-left: 4px solid var(--danger-deep);
}
.lon-row-strong { font-weight: bold; }
.lon-voucher-note {
  display: block;
  color: var(--text-secondary);
}
.lon-cell-expense { font-size: var(--fs-sm); }
.lon-cell--bold { font-weight: bold; }
.lon-hint-info {
  margin-top: var(--space-4);
  font-size: var(--fs-sm);
}

/* Småskal-utilities som dyker upp många gånger i SPA:n. */
.lon-card--gap-sm { margin-top: var(--space-2); }
.lon-h3--mt-lg   { margin-top: var(--space-6); }
.lon-h4--stack   { margin-top: var(--space-4); }
.lon-stack-top   { margin-top: var(--space-2); }
.lon-info-text--sm     { font-size: var(--fs-sm); }
.lon-info-text--avvisa { margin: 0 0 var(--space-3); }
.lon-doc-list__note    { margin: 0 0 var(--space-2); }
.lon-select--full      { width: 100%; }

/* Måltidsraden i exp-create (per dag). */
.lon-meal-day {
  display: flex;
  gap: var(--space-4);
  align-items: center;
  margin-bottom: var(--space-2);
  flex-wrap: wrap;
}
.lon-meal-day__head { min-width: 180px; }

/* Anställd-lönespec: liten not under bilförmånen. */
.lon-benefit-note {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  margin-top: var(--space-1);
  margin-bottom: var(--space-1);
}

/* Anställd-lönespec: AGA-blockets margin-top. */
.lon-org-aga-wrap { margin-top: var(--space-3); }

/* ─────────────────────────────────────────────────────────────────
 * Sektion #74 — Moms-paketet skal (etapp 3e PR A)
 *
 * Ersätter 28+ inline-styles och 4 hex i public/js/pages/moms.js med
 * token-driven utility-klasser. RÖR INTE moms-engine, moms-koder eller
 * moms-eskd — det är myndighetskänslig SKV-export (snapshot i declarations-
 * tabellen, behandlas som AGI). Endast markup/spacing/färg-tokens här.
 *
 * Färg-mappning (de 4 hex → tokens):
 *   #f0fdf4 (success bg-light) → var(--success-soft)
 *   #166534 (success text-dark) → var(--success-deep)
 *   #86efac (success border)    → var(--success-deep)
 *   #f3f4f6 (light gray bg)     → var(--surface-inset)
 *   #4b5563 (text-secondary)    → var(--text-secondary)
 *
 * Befintliga .moms-*-klasser i style.css (hero/period-meta/box-table/
 * frequency-options/etc.) är intakta — denna sektion lägger till NYA
 * utility-klasser för spacing/lists/modaler.
 * ───────────────────────────────────────────────────────────────── */

/* Tabs-marginal (tidigare style="margin-bottom:24px"). */
.moms-tabs--stack { margin-bottom: var(--space-6); }

/* Generiska stack-marginalvarianter för alerts/cards/sections. */
.moms-stack--3 { margin-bottom: var(--space-3); }
.moms-stack--4 { margin-bottom: var(--space-4); }
.moms-card--stack { margin-top: var(--space-5); }
.moms-actions-wrap { margin: var(--space-4) 0; }

/* Period-väljare-label (tidigare inline font-size+color+margin). */
.moms-period-label {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  margin-right: var(--space-2);
}

/* "Baserat på N bokföringsrader" foot-note. */
.moms-meta-foot {
  margin-top: var(--space-3);
  font-size: var(--fs-eyebrow);
  color: var(--text-secondary);
}

/* Inset-box för deklara-bekräftelse + post-deklaration nästa-steg.
 * Tidigare style="background:#f3f4f6" → surface-inset. */
.moms-info-box {
  margin: var(--space-4) 0;
  padding: var(--space-4);
  background: var(--surface-inset);
  border-radius: var(--radius);
  font-size: var(--fs-sm);
}
.moms-info-box--lg { padding: var(--space-4); }
.moms-info-box__head {
  margin: 0 0 var(--space-2);
  font-weight: 500;
}
.moms-info-list {
  margin: 0;
  padding-left: var(--space-5);
  line-height: 1.6;
}
.moms-info-list--lg {
  margin: 0;
  padding-left: var(--space-5);
  line-height: 1.7;
  font-size: var(--fs-sm);
  color: var(--text-secondary);
}

/* Råd under deklara-confirm ("Du behöver fortfarande …"). */
.moms-note-small {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  line-height: 1.5;
}
.moms-num-list {
  margin: var(--space-1) 0 0;
  padding-left: var(--space-5);
}
.moms-row-line { margin: var(--space-1) 0; }

/* Empty-state i historik-fliken. */
.moms-empty-state {
  text-align: center;
  padding: var(--space-10) var(--space-6);
  color: var(--text-secondary);
}
.moms-empty-state-text {
  color: var(--text-secondary);
  font-style: italic;
}

/* Inställningar-info-alert under formuläret. */
.moms-info-installningar {
  margin-top: var(--space-5);
  font-size: var(--fs-sm);
}

/* Modal-storleksvarianter (moms har egna än lön-paketet). */
.moms-modal--sm { max-width: 480px; }
.moms-modal--md { max-width: 520px; }
.moms-modal--lg { max-width: 580px; }

/* Post-deklaration: stor checkmark + status-text. */
.moms-success-block {
  text-align: center;
  padding: var(--space-4) 0;
}
.moms-success-icon {
  font-size: 48px;
  line-height: 1;
  margin-bottom: var(--space-3);
}
.moms-success-text {
  margin: 0;
  font-size: var(--fs-md);
}

/* Foot-note under inset-box. */
.moms-foot-note {
  margin: 0;
  font-size: var(--fs-sm);
  color: var(--text-secondary);
}

/* Deklaration-detalj modal: period-meta + eyebrow-rubriker. */
.moms-modal-meta { margin-bottom: var(--space-5); }
.moms-modal-section { margin: var(--space-5) 0; }
.moms-modal-section--top { margin-top: var(--space-5); }
.moms-modal-eyebrow {
  font-size: var(--fs-eyebrow);
  text-transform: uppercase;
  letter-spacing: .03em;
  color: var(--text-secondary);
  margin: 0 0 var(--space-2);
}
.moms-modal-eyebrow--lg { margin: 0 0 var(--space-3); }

/* Verifikat-lista i detalj-modalen. */
.moms-verifikat-list {
  margin: 0;
  padding-left: var(--space-5);
  font-size: var(--fs-sm);
  line-height: 1.8;
}
.moms-link { color: var(--success); }
.moms-link-desc {
  color: var(--text-secondary);
  font-size: var(--fs-sm);
}

/* Anteckning-rad i detalj-modalen. */
.moms-note-box {
  margin: var(--space-4) 0;
  padding: var(--space-3);
  background: var(--bg);
  border-radius: 6px;
  font-size: var(--fs-sm);
}

/* "Markera som betald"-knappen längst ner i detalj-modalen. */
.moms-modal-action {
  margin-top: var(--space-6);
  padding-top: var(--space-4);
  border-top: 1px solid var(--border);
}

/* Bekräftelse-modal: error-slot under footer. */
.moms-bek-err { padding: 0 var(--space-5) var(--space-4); }

/* Småutilities: vikt + inline-knapp-mellanslag + hjälptext. */
.moms-meta-value--strong { font-weight: 600; }
.moms-btn--inline { margin-left: var(--space-2); }
.moms-help-inline {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  margin-left: var(--space-2);
}

/* Klickbar historik-rad (cursor: pointer ovanpå hover-regeln i style.css). */
.moms-historik-row { cursor: pointer; }

/* ─────────────────────────────────────────────────────────────────
 * Medföljande: semester-wizard-tabeller (semesterårsavslut +
 * semesterskuld) — mindre rubriker + tajtare kolumn-padding så
 * tabellen ryms bredvid vänstermenyn (220 px) på ~1440 px desktop
 * utan intern scroll. Scope:ad till .lon-table--compact (används
 * bara av dessa två wizard-tabeller). Mobil oförändrad — i smala
 * fönster faller fortfarande tillbaka på .lon-card--scrollx.
 * ───────────────────────────────────────────────────────────────── */
.lon-table--compact thead th {
  font-size: var(--fs-sm);
  padding: var(--space-2) var(--space-2);
  letter-spacing: 0;
}
.lon-table--compact tbody td {
  padding: var(--space-2) var(--space-2);
}

/* ─────────────────────────────────────────────────────────────────
 * Sektion #75 — Anstallda-form skal (etapp 3e PR C)
 *
 * Ersätter 57 inline-styles + 27 hex i public/js/pages/anstallda-form.js.
 * RÖR INTE personal-number-Luhn, validators/bank, schema-mappning öre↔kr,
 * workSchedule-härledning eller semester-beräkningsparametrar — det är
 * GDPR/legal-kritisk validering+persistens. Endast markup/spacing/färg-
 * tokens här.
 *
 * Färg-mappning (27 hex → tokens):
 *   Banner-aktiv (success):
 *     #E8F7EF → var(--success-soft)
 *     #00A550 → var(--success)
 *     #1a202c → var(--text-primary)
 *   Banner-inbjuden (warning):
 *     #FFFFF0 → var(--warning-soft)
 *     #D69E2E → var(--warning)
 *   Banner-utgangen (danger):
 *     #FFF5F5 → var(--danger-soft)
 *     #FCA5A5 → var(--danger)
 *     #991B1B → var(--danger-deep)
 *   Banner-ingen (neutral):
 *     #F7FAFC → var(--surface-inset)
 *     #E2E8F0 → var(--border)
 *     #4a5568 → var(--text-secondary)
 *   Schedule-chip:
 *     #cbd5e0 → var(--border)
 *     #EFF6FF → var(--info-soft)
 *   Invite-modaler: använder standard .modal-overlay + .modal-regler
 *     från style.css (modal-dismiss-vägen) — rgba(0,0,0,.5)/#fff/#ccc
 *     försvinner därmed
 *   Semester-overview (vacation-balance card):
 *     #F0FFF4 → var(--success-soft)
 *     #9AE6B4 → var(--success)
 *     #22543d → var(--success-deep)
 *     #ECFDF5 → var(--success-soft)
 *     #10b981 → var(--success)
 *     #FEF3C7 → var(--warning-soft)
 *     #d97706 → var(--warning)
 *     #92400e → var(--warning-deep)
 *     #E0E7FF → var(--info-soft)
 *     #3730A3 → var(--info-deep)
 *     #f1f5f9 → var(--surface-inset)
 *     #64748b → var(--text-secondary)
 *     #9b2c2c → var(--danger-deep)
 * ───────────────────────────────────────────────────────────────── */

/* Form-error-banner — tidigare style="display:none". */
.anstallda-form-error[hidden] { display: none; }

/* Portal-inbjudan-banner: gemensam bas + varianter per status. */
.anstallda-portal-banner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  padding: var(--space-3) var(--space-4);
  border-radius: 6px;
  margin-bottom: var(--space-4);
  font-size: var(--fs-sm);
}
.anstallda-portal-banner__msg {
  font-size: var(--fs-sm);
  color: var(--text-primary);
}
.anstallda-portal-banner--aktiv {
  background: var(--success-soft);
  border: 1px solid var(--success);
}
.anstallda-portal-banner--inbjuden {
  background: var(--warning-soft);
  border: 1px solid var(--warning);
}
.anstallda-portal-banner--utgangen {
  background: var(--danger-soft);
  border: 1px solid var(--danger);
}
.anstallda-portal-banner--utgangen .anstallda-portal-banner__msg {
  color: var(--danger-deep);
}
.anstallda-portal-banner--ingen {
  background: var(--surface-inset);
  border: 1px solid var(--border);
}
.anstallda-portal-banner--ingen .anstallda-portal-banner__msg {
  color: var(--text-secondary);
}

/* Field-warning för samordningsnummer-detektion (visuell tilstånd via hidden). */
.anstallda-warning[hidden] { display: none; }

/* Sjuklönsraden — döljs när lönetyp != hourly. */
.anstallda-row--toggle[hidden] { display: none; }

/* Sjuklöns-checkbox-label (display:flex inline). */
.anstallda-checkbox-label {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  cursor: pointer;
}

/* Skatt och avgift (lön 1b-ii): skattesättet som tre radioknappar, härledda
 * värden som text, och raden «I nästa körning» med samma chip som körningen. */
.anstallda-skattesatt { display: flex; flex-wrap: wrap; gap: var(--space-2) var(--space-4); }
.anstallda-radio { display: flex; align-items: center; gap: var(--space-2); cursor: pointer; margin: 0; font-weight: 400; }
.anstallda-harledd { padding: 8px 0; font-size: var(--fs-md); }
.anstallda-harledd .form-hint { display: block; }
.anstallda-nasta { display: flex; align-items: center; flex-wrap: wrap; gap: var(--space-2); padding: 8px 0; }
.anstallda-nasta > span:first-child { color: var(--muted); font-size: var(--fs-sm); }
.anstallda-underrubrik { margin: var(--space-4) 0 var(--space-2); font-size: var(--fs-md); font-weight: 650; }
.anstallda-beslut { display: flex; flex-direction: column; gap: 2px; padding: 6px 0; border-bottom: 1px solid var(--border); }
.anstallda-beslut-ny { display: flex; flex-wrap: wrap; gap: var(--space-2) var(--space-3); align-items: flex-end; margin-top: var(--space-2); }
.anstallda-beslut-ny label { display: flex; flex-direction: column; gap: 2px; font-size: var(--fs-sm); font-weight: 600; margin: 0; }
.anstallda-beslut-ny input[type="number"] { width: 90px; }

/* Veckoschema: chips-grid. */
.anstallda-work-schedule {
  display: flex;
  gap: 6px;
  flex-wrap: wrap;
}
.anstallda-work-day {
  display: flex;
  align-items: center;
  gap: var(--space-1);
  padding: 6px var(--space-2);
  border: 1px solid var(--border);
  border-radius: 4px;
  cursor: pointer;
  font-size: var(--fs-sm);
  background: var(--paper);
}
.anstallda-work-day.is-active {
  background: var(--info-soft);
}

/* Workplace-fields-toggle — döljs när "använd företagets adress" är på. */
.anstallda-workplace-fields[hidden] { display: none; }

/* Invite-modal: utility-klasser för intern layout (modalen själv är
 * standard .modal-overlay + .modal från style.css → modal-dismiss
 * fungerar out-of-the-box). */
.anstallda-invite-modal__heading {
  margin: 0 0 var(--space-3);
  font-size: var(--fs-lg);
  color: var(--text-primary);
}
.anstallda-invite-modal__text {
  color: var(--text-secondary);
  line-height: 1.6;
  margin: 0 0 var(--space-4);
}
.anstallda-invite-modal__label {
  display: block;
  font-size: var(--fs-sm);
  margin-bottom: 6px;
}
.anstallda-invite-modal__input {
  width: 100%;
  padding: var(--space-2) var(--space-3);
  border: 1px solid var(--border);
  border-radius: 4px;
  font-size: var(--fs-body);
  margin-bottom: var(--space-4);
}

/* ── Semester-översikt (renderSemesterOverview) ─────────────────── */
.semester-overview {
  margin-bottom: 1rem;
  background: var(--success-soft);
  border: 1px solid var(--success);
}
.semester-overview__head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  margin-bottom: 6px;
  gap: var(--space-2);
  flex-wrap: wrap;
}
.semester-overview__title {
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--success-deep);
}
.semester-overview__metod {
  font-size: var(--fs-eyebrow);
  color: var(--text-secondary);
}
.semester-overview__horizont {
  font-size: var(--fs-eyebrow);
  color: var(--text-secondary);
  margin-bottom: var(--space-2);
}
.semester-overview__horizont-note {
  font-size: 10px;
  color: var(--text-secondary);
}
.semester-overview__row {
  display: flex;
  gap: var(--space-6);
  flex-wrap: wrap;
  font-size: var(--fs-body);
}
.semester-overview__row--small {
  display: flex;
  gap: var(--space-6);
  flex-wrap: wrap;
  font-size: var(--fs-sm);
}
.semester-overview__row-label { color: var(--text-secondary); }
.semester-overview__adj,
.semester-overview__unpaid {
  font-size: var(--fs-eyebrow);
  margin-top: var(--space-1);
}
.semester-overview__adj { color: var(--text-secondary); }
.semester-overview__unpaid { color: var(--danger-deep); }

/* Loading-state-card för semester-balansen. */
.semester-overview-loading {
  margin-bottom: 1rem;
  background: var(--success-soft);
  border: 1px solid var(--success);
}
.semester-overview-loading__text {
  font-size: var(--fs-sm);
  color: var(--success-deep);
}

/* Procentregel-block (16b §) — semesterlöneskuld-detaljer. */
.semester-procent {
  margin-top: var(--space-3);
  padding-top: var(--space-3);
  border-top: 1px dashed var(--success);
}
.semester-procent__title {
  font-size: var(--fs-eyebrow);
  font-weight: 600;
  color: var(--success-deep);
  margin-bottom: 6px;
}
.semester-procent__fiktiv {
  font-size: var(--fs-sm);
  color: var(--success-deep);
  margin-top: var(--space-1);
  padding: 6px var(--space-2);
  background: var(--success-soft);
  border-left: 3px solid var(--success);
  border-radius: 2px;
}
.semester-procent__cols {
  font-size: 11px;
  color: var(--text-secondary);
  margin-top: 6px;
}
.semester-procent__runs {
  font-size: 11px;
  color: var(--text-secondary);
  margin-top: var(--space-1);
}
.semester-procent__warning {
  font-size: 11px;
  color: var(--warning-deep);
  background: var(--warning-soft);
  border-left: 3px solid var(--warning);
  padding: 6px var(--space-2);
  margin-top: var(--space-2);
  border-radius: 2px;
}
.semester-procent__missing {
  font-size: var(--fs-sm);
  color: var(--danger-deep);
}

/* Run-id-chip (de små "abcdef12"-chipsen för payroll-runs). */
.semester-run-chip {
  display: inline-block;
  padding: 2px 6px;
  background: var(--info-soft);
  color: var(--info-deep);
  border-radius: 3px;
  font-size: 11px;
  margin: 2px;
}


/* ─────────────────────────────────────────────────────────────────
 * Sektion #76 — GDPR-maskering (PR 2)
 *
 * Maskerar PNR/bank/lön i UI by default. "Visa"-toggle avmaskar fullt
 * värde inline. Skyddar mot över-axeln-titt och skärmdump — RBAC (PR 1)
 * skyddar själva åtkomsten.
 *
 * Två mönster:
 *   .masked-text   — read-only-visning (lista, detalj, audit-log)
 *   .masked-field  — input-wrap (form): swap mellan display + input
 *
 * Båda har samma toggle-knapp .masked-toggle.
 * ───────────────────────────────────────────────────────────────── */

.masked-text {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
}
.masked-text__display {
  font-family: var(--font-body);
  letter-spacing: 0;
}

.masked-toggle {
  background: none;
  border: 1px solid var(--border);
  color: var(--text-secondary);
  font-size: var(--fs-eyebrow);
  padding: 2px var(--space-2);
  border-radius: 4px;
  cursor: pointer;
  line-height: 1.2;
  transition: color .12s ease, border-color .12s ease;
}
.masked-toggle:hover {
  color: var(--text-primary);
  border-color: var(--text-secondary);
}
.masked-toggle:focus-visible {
  outline: none;
  box-shadow: var(--focus-ring);
}

/* Form-input-varianten: två element som swap:ar via HTML `hidden`-attribut.
 * Display-span syns default, input syns när revealed. Input behåller
 * sitt riktiga värde hela tiden så form-submit får rätt data.
 *
 * `hidden` är browser-garanterat (samma effekt som display:none men kan
 * inte överskrivas av globala CSS-regler — t.ex. `.form-field input`
 * med högre specificitet). Klassen .is-revealed sätts ändå för styling-
 * hooks om någon vill stila revealed-state separat. */
.masked-field {
  display: flex;
  align-items: center;
  gap: var(--space-2);
}
.masked-field__display {
  flex: 1;
  font-family: var(--font-body);
  padding: var(--space-2) var(--space-3);
  border: 1px solid var(--border);
  border-radius: 4px;
  background: var(--surface-inset);
  color: var(--text-secondary);
}
.masked-field__input { flex: 1; }
/* Säkerhetsnät: även om global `.form-field input` skulle sätta display
 * tar [hidden] över via attribute-selektor + standard-semantik. */
.masked-field__display[hidden],
.masked-field__input[hidden] { display: none; }

/* Salary-specific styling — visas centrerat i tabeller. */
.masked-text--salary { display: inline-flex; }
.masked-text--salary .masked-text__display {
  font-weight: 600;
  color: var(--text-primary);
}


/* Smal select-variant — för kort-värdes-fält som mallnamn där fullbredd
 * ser ut som ett glapp på desktop. Mobil får fortfarande 100 % bredd
 * (samma mönster som sökfälten: kompakt desktop, fullbredd mobil). */
.select--narrow { width: 280px; max-width: 100%; }
@media (max-width: 600px) {
  .select--narrow { width: 100%; }
}

/* ── Anställd-portal: lön self-service-polish (YTD + år-filter + ladda ner) ── */
/* Listkort: stapla huvudrad (period+belopp) över ladda-ner-knappen. */
.lon-list-card {
  flex-direction: column;
  align-items: stretch;
  gap: var(--space-2);
}
.lon-list-card__main {
  display: flex;
  justify-content: space-between;
  align-items: center;
  width: 100%;
}
.lon-dl-btn {
  align-self: flex-end;
  font-size: var(--fs-sm);
  color: var(--brand);
  text-decoration: none;
  font-weight: 500;
  padding: var(--space-1) var(--space-2);
}
.lon-dl-btn:active { opacity: 0.7; }

/* YTD-kort */
.lon-ytd-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-2);
  margin-top: var(--space-2);
}
.lon-ytd-cell {
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.lon-ytd-cell__label {
  font-size: var(--fs-xs, 12px);
  color: var(--text-secondary);
}
.lon-ytd-cell__value {
  font-size: var(--fs-md);
  font-weight: 600;
  color: var(--text-primary);
}

/* År-filter-flikar */
.lon-year-tabs {
  display: flex;
  gap: var(--space-2);
  flex-wrap: wrap;
  margin-bottom: var(--space-3);
}
.lon-year-tab {
  padding: var(--space-1) var(--space-3);
  border: 1px solid var(--line);
  border-radius: 999px;
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  text-decoration: none;
  background: var(--surface-card);
}
.lon-year-tab--active {
  background: var(--brand);
  color: var(--paper);
  border-color: var(--brand);
}

/* Lönekörnings-översikt: visa/dölj avbrutna-toggle. */
.lon-runs-toolbar {
  display: flex;
  justify-content: flex-end;
  margin-bottom: var(--space-2);
}
.lon-show-cancelled {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  cursor: pointer;
}

/* ═══════════════════════════════════════════════════════════════════════
   DESKTOP-LAYOUT — opt-in breddtak + förtätning (desktop-PR A)
   Referens: docs/DESKTOP_GENOMGANG_RECON.md. Rör EJ .main-content globalt.
   MOBIL: alla max-width > 375px → 100% (ingen effekt); .field-grid kollapsar
   INTRINSISKT till 1 kolumn utan media query. Inget mobilt regresserar.
   ═══════════════════════════════════════════════════════════════════════ */

/* Yttersta vy-wrapper. Sätts opt-in per route på router-staging (app.js),
   ELLER manuellt som klass på en vys yttersta <div>. */
.content-max         { max-width: 1040px; margin-inline: auto; }
.content-max--narrow { max-width: 760px;  margin-inline: auto; }
.content-max--wide   { max-width: 1200px; margin-inline: auto; }
.content-max--tight  { max-width: 820px;  margin-inline: auto; }

/* Intrinsiskt responsiv kolumnläggning för glesa poster (formulärfält,
   konto-block, kort). N kolumner på desktop, 1 på mobil — utan media query. */
.field-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: var(--space-3) var(--space-4);
}
.field-grid--sm   { grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); }
.field-grid__full { grid-column: 1 / -1; }

/* Etikett↔värde med tak (ersätter space-between-utsträckning). */
.kv-row      { display: grid; grid-template-columns: 1fr auto; gap: var(--space-3); max-width: 640px; }
.kv-row__val { text-align: right; font-variant-numeric: tabular-nums; }

/* Smala tabeller krymper till innehåll i stället för width:100%. */
.table-compact           { width: auto; max-width: 720px; }
.table-compact .col-text { max-width: 320px; }

@media (min-width: 1024px) {
  /* ⚠️⚠️ DEN KOMPAKTA DESKTOP-KNAPPEN UTGÅR. Regeln satte 38 px höjd och
   * --fs-sm över 1024 px och slog därmed ut facits mått i precis den bredd
   * där vyerna mest används — .btn såg 8 px och 13,5 px ut i källtexten och
   * ritade 13,6 px och 38 px på skärmen. Facit har ETT knappmått vid alla
   * bredder, och 44 px är dessutom träffytan som resten av huset räknar med.
   * `.btn-sm` står kvar: 32 px är facits mått, inte en desktop-avvikelse. */
  .btn-sm { min-height: 32px; }
  /* Opt-in desktop-förtätad spacing på capade vyer. */
  .content-max--dense { --space-6: 20px; --space-8: 24px; --space-10: 32px; }
}

/* ── E-faktura (Peppol) — kort + förkontroller på kundfaktura-detalj ────────── */
.kfd-ef-huvud {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  flex-wrap: wrap;
  margin-bottom: var(--space-2);
}
.kfd-ef-kontroller {
  list-style: none;
  margin: var(--space-3) 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}
.kfd-ef-kontroll {
  display: flex;
  align-items: flex-start;
  gap: var(--space-2);
  font-size: var(--fs-sm);
}
.kfd-ef-kontroll__mark {
  flex: 0 0 auto;
  font-weight: 700;
  line-height: 1.4;
}
.kfd-ef-kontroll--ok    .kfd-ef-kontroll__mark { color: var(--success); }
.kfd-ef-kontroll--fel   .kfd-ef-kontroll__mark { color: var(--danger); }
.kfd-ef-kontroll--avtal .kfd-ef-kontroll__mark { color: var(--warning); }
.kfd-ef-kontroll .helper-text { display: block; }
/* Åtgärdslänken under ett hinder — egen rad, så den inte klistras ihop med
   förklaringen på smal skärm. */
.kfd-ef-kontroll__lank {
  display: inline-block;
  margin-top: 2px;
  font-size: var(--fs-sm);
}

/* ⚠️ «Inget hindrar sändningen» — ett kort besked i stället för en lista över
   uppfyllda kontroller. Samma mjuka statusyta som resten av huset, men utan
   kantfärg: det här är ett normaltillstånd, inte något att uppmärksamma. */
.kfd-ef-klar {
  margin: var(--space-3) 0;
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--success-deep);
}

/* ── Saknade Peppol-fält ────────────────────────────────────────────────────
 *
 * ⚠️⚠️ STOPP OCH VARNING SKA GÅ ATT SKILJA ÅT PÅ AVSTÅND. Blandas de ihop får
 * användaren antingen en varning som borde blockera eller ett stopp som inte
 * behövde finnas. Skillnaden bärs av kantfärgen OCH av rubriken — inte av
 * färgen ensam, som en färgblind läsare inte ser.
 *
 * ⚠️ Plattformens tokens rakt av. Ingen ny form: samma radie, samma mjuka
 * statusytor som resten av huset.
 */
.kfd-ef-saknatgrupp {
  margin: var(--space-3) 0;
  padding: var(--space-3) var(--space-4);
  border-radius: var(--radius);
  border-left: 3px solid transparent;
}
.kfd-ef-saknatgrupp--stopp {
  background: var(--danger-soft);
  border-left-color: var(--danger-deep);
}
.kfd-ef-saknatgrupp--varning {
  background: var(--warning-soft);
  border-left-color: var(--warning-deep);
}
.kfd-ef-saknatgrupp__rubrik {
  margin: 0 0 var(--space-2);
  font-weight: 650;
  font-size: var(--fs-sm);
}
.kfd-ef-saknatgrupp--stopp   .kfd-ef-saknatgrupp__rubrik { color: var(--danger-deep); }
.kfd-ef-saknatgrupp--varning .kfd-ef-saknatgrupp__rubrik { color: var(--warning-deep); }
.kfd-ef-saknatgrupp ul {
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; gap: var(--space-2);
}
.kfd-ef-saknat {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 2px var(--space-3);
  align-items: baseline;
  font-size: var(--fs-sm);
}
.kfd-ef-saknat__falt { font-weight: 600; overflow-wrap: anywhere; }
/* ⚠️ ÅTGÄRDEN SPÄNNER BÅDA KOLUMNERNA — den är det som gör beskedet
 * användbart, och får inte klämmas ihop bredvid regelkoden. */
.kfd-ef-saknat .helper-text { grid-column: 1 / -1; }
/* Regelkoden är en referens, inte ett meddelande — dämpad och monospace. */
.kfd-ef-saknat__regel {
  font-size: var(--fs-xs);
  color: var(--text-secondary);
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  white-space: nowrap;
}

/* ⚠️ PÅ SMAL SKÄRM FÅR REGELKODEN EN EGEN RAD. Med `1fr auto` klämdes
 * fältnamnet ihop bredvid en kod som inte får brytas — mätt vid 375 px:
 * "Organisationsnumret 5569999999 har fel k…" klipptes. Namnet är det som
 * betyder något; koden är en referens och tål att stå under. */
@media (max-width: 760px) {
  .kfd-ef-saknat { grid-template-columns: 1fr; }
  .kfd-ef-saknat__regel { justify-self: start; }
}

/* ── Rapport-ramverk (Fler rapporter-fliken + generisk rapport-render) ──────── */
.rp-ramverk { display: flex; flex-direction: column; gap: var(--space-3); }
.rp-ramverk .detail-actions { flex-wrap: wrap; gap: var(--space-2); }
.rp-rapport { margin-top: var(--space-4); }
.rp-huvud { margin-bottom: var(--space-3); }
.rp-titel { font-size: var(--fs-lg); font-weight: 700; }
.rapport-table .rp-sektion td { font-weight: 700; padding-top: var(--space-3); }
.rapport-table .rp-summa td,
.rapport-table .rp-slutsumma td { font-weight: 700; border-top: 1px solid var(--border); }
.rapport-table .rp-slutsumma td { border-top-width: 2px; }
.rapport-table .rp-fet td { font-weight: 600; }
.rapport-table .rp-cell { padding: var(--space-1) var(--space-2); }
/* Datumfilter-varning (utanför räkenskapsåret) — inline, ej native. */
.rp-datum { display: flex; flex-direction: column; gap: var(--space-2); }
.rp-datum-varning {
  margin: 0;
  padding: var(--space-2) var(--space-3);
  font-size: var(--fs-sm);
  color: var(--warning-deep);
  background: var(--warning-soft);
  border: 1px solid var(--warning);
  border-radius: var(--radius);
}
@media (max-width: 375px) {
  .rp-ramverk .detail-actions .btn { flex: 1 1 100%; }
}

/* ⚠️ `.avst-ib-rad` OCH `.avst-ub-rad` ÄR BORTTAGNA — de var döda. Den
 * radbaserade IB/UB-layouten ersattes av tvåkolumnsvyn, där saldona står i
 * kolumnernas topp och fot. Reglerna blev kvar och matchade ingenting i någon
 * vy. Den ena av dem bar dessutom `color: #fff` utan token — den enda råa
 * hexen i avstämningens block, och den ritades aldrig.
 *
 * ⚠️ RÖR INTE `.avst-flikar`, `.avst-flik`, `.avst-underlag-period` eller
 * `.avst-underlag-rad` längre ned i filen. De bär `avst-`-prefix men tillhör
 * `public/js/pages/bokslut-avstamning.js`, en annan sida. En städning av
 * "alla .avst-*" river den. */

/* ── Avstämning (PR 2) — matchning: saldo-kontroll, kopplad post,
 *    kandidatlista i koppla-modalen. ── */
.text-danger { color: var(--danger-deep); }
.avst-check-rad {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  flex-wrap: wrap;
  font-weight: 600;
}
/* ⚠️ KONTROLLERAD-NOTISEN LIGGER I SALDOKONTROLLRADEN, högerställd. Den är
 * ett påstående OM avstämningen och hörde aldrig hemma på en egen rad under
 * pagineringen. Vikten är lägre — den dokumenterar, den varnar inte. */
.avst-kontrollerad {
  margin-left: auto; font-weight: 400; font-size: 12.5px; color: var(--muted);
}
.avst-check-ok {
  background: var(--success-soft);
  color: var(--success-deep);
  border-top: 1px solid var(--border);
}
.avst-check-diff {
  background: var(--danger-soft);
  color: var(--danger-deep);
  border-top: 1px solid var(--border);
}
/* ⚠️ «Går inte att jämföra» — ett TREDJE läge, inte en avvikelse. Neutral
   färg med flit: ritas det rött letar läsaren efter ett fel i bokföringen,
   och felet ligger i uppgifterna. Se lib/avstamning/saldokontroll.ts. */
.avst-check-okand {
  background: var(--surface-alt);
  color: var(--muted);
  border-top: 1px solid var(--border);
}
.avst-verlank {
  font-weight: 600;
  text-decoration: none;
}
.avst-verlank:hover { text-decoration: underline; }
.avst-kandidatlista {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
  max-height: 320px;
  overflow-y: auto;
  margin-bottom: var(--space-3);
}
.avst-kandidat {
  display: flex;
  align-items: baseline;
  gap: var(--space-2);
  padding: var(--space-2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  cursor: pointer;
}
.avst-kandidat:hover { background: var(--brand-light); }

/* ══ DASHBOARD (widgets, etapp 1) ═══════════════════════════════════════════
   Hero-KPI (navy), tabulära/mono-siffror, eyebrow-labels, jorddämpat.
   12-kolumnersgrid på desktop; en kolumn på mobil (375px). ── */
.dash-header { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--space-4); }
.dash-eyebrow {
  font-size: var(--fs-eyebrow);
  letter-spacing: .12em;
  text-transform: uppercase;
  font-weight: 600;
  color: var(--text-secondary);
}
.dash-mono { font-variant-numeric: tabular-nums; font-feature-settings: 'tnum'; }

.dash-grid {
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  gap: var(--space-4);
}
.dash-widget {
  grid-column: span 12;
  background: var(--surface-card);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: var(--space-5);
  min-width: 0;
}
/* ⚠️ Hälsoraden är 6 / 3 / 3: likviditeten dubbelt så bred som vardera
   KPI-kortet. Fyra lika breda kort gav "Att få in" och "Att betala" mer luft
   än de har innehåll till. */
.dash-widget[data-span="3"] { grid-column: span 3; }
.dash-widget[data-span="4"] { grid-column: span 4; }
.dash-widget[data-span="6"] { grid-column: span 6; }
/* ⚠️ MÄTT: regeln för span 8 SAKNADES. `intakterPerKund` har kolumnspann 8
   och föll därför tyst tillbaka på `.dash-widget`s span 12 — kortet var
   fullbrett utan att någon hade skrivit det. Ett spann utan regel är en tyst
   fullbredd; testet i test/browser/dashboard-layout.browser.test.ts går nu
   igenom HELA registret och mäter renderad andel. */
.dash-widget[data-span="8"] { grid-column: span 8; }
.dash-widget[data-span="12"] { grid-column: span 12; }
.dash-widget-titel {
  font-family: var(--font-heading);
  font-size: 1.05rem;
  margin: 0 0 var(--space-3);
}
.dash-tom, .dash-hero-tom { color: var(--text-secondary); font-size: var(--fs-sm); padding: var(--space-2) 0; }

/* Hero (likviditet) — navy, stor mono-siffra. */
.dash-widget--hero {
  background: linear-gradient(155deg, var(--ink) 0%, #223049 100%);
  color: #fff;
  border-color: transparent;
}
.dash-widget--hero .dash-eyebrow { color: rgba(255,255,255,.6); }
.dash-hero-belopp {
  font-size: clamp(2.2rem, 6vw, 3.2rem);
  font-weight: 700;
  letter-spacing: -.02em;
  line-height: 1.05;
  margin: var(--space-2) 0 var(--space-4);
}
.dash-hero-konton { display: flex; flex-direction: column; gap: 4px; }
.dash-hero-rad {
  display: flex; justify-content: space-between; gap: var(--space-4);
  font-size: var(--fs-sm); color: rgba(255,255,255,.82);
  padding: 4px 0; border-top: 1px solid rgba(255,255,255,.1);
}

/* KPI-widgets (att få in / betala / resultat). */
.dash-kpi-belopp { font-size: 1.9rem; font-weight: 700; letter-spacing: -.01em; }
.dash-kpi-under { color: var(--text-secondary); font-size: var(--fs-sm); margin-top: 2px; }
.dash-kpi-forfallet { color: var(--danger-deep); font-size: var(--fs-sm); font-weight: 600; margin-top: var(--space-2); }
.dash-lank { display: inline-block; margin-top: var(--space-3); font-size: var(--fs-sm); font-weight: 600; text-decoration: none; }
.dash-lank:hover { text-decoration: underline; }

/* Att hantera — lista med antal + genväg. */
.dash-hantera-lista { display: flex; flex-direction: column; gap: var(--space-2); }
.dash-hantera-rad {
  display: flex; align-items: center; gap: var(--space-3);
  padding: var(--space-2) var(--space-3);
  border: 1px solid var(--border); border-radius: var(--radius);
  text-decoration: none; color: var(--text-primary);
}
.dash-hantera-rad:hover { background: var(--surface-inset); }
.dash-hantera-antal {
  min-width: 2rem; text-align: center; font-weight: 700; font-variant-numeric: tabular-nums;
  background: var(--brand-light); color: var(--brand); border-radius: var(--radius);
  padding: 2px 6px;
}
.dash-hantera-etikett { flex: 1; }
.dash-hantera-pil { color: var(--text-secondary); }
/* Fail-closed-felruta: betalnings-urvalet kunde inte beräknas serverside. */
.dash-hantera-fel {
  padding: var(--space-2) var(--space-3);
  border: 1px solid var(--danger); border-radius: var(--radius);
  background: var(--danger-light); color: var(--danger-deep);
  font-size: var(--fs-sm);
}

/* Deadlines. */
.dash-deadline-lista { display: flex; flex-direction: column; gap: var(--space-2); }
.dash-deadline {
  display: block; text-decoration: none; color: var(--text-primary);
  padding: var(--space-3); border: 1px solid var(--border); border-left-width: 3px; border-radius: var(--radius);
}
.dash-deadline--warning { border-left-color: var(--warning); }
.dash-deadline--danger  { border-left-color: var(--danger); }
.dash-deadline--neutral { border-left-color: var(--brand); }
.dash-deadline-titel { font-weight: 600; }
.dash-deadline-period { color: var(--text-secondary); font-size: var(--fs-sm); }
.dash-deadline-datum { font-size: var(--fs-sm); margin-top: 4px; }

@media (max-width: 900px) {
  .dash-widget[data-span="3"], .dash-widget[data-span="4"],
  .dash-widget[data-span="6"], .dash-widget[data-span="8"] { grid-column: span 12; }
}
@media (max-width: 375px) {
  .dash-grid { gap: var(--space-3); }
  .dash-widget { padding: var(--space-4); }
}

/* Dashboard redigeringsläge. */
/* Påminnelseflikens åtgärdsknappar — radbryts snyggt på smala skärmar (375px). */
.dash-paminn-atgard { display: flex; flex-wrap: wrap; gap: var(--space-2); justify-content: flex-end; }

/* Kundfaktura-formulärets knapprad: Avbryt · Spara · split (Bokför ▾). */
.kf-actions { display: flex; flex-wrap: wrap; gap: 8px; justify-content: flex-end; align-items: center; }
.kf-split { position: relative; display: inline-flex; }
/* Huvuddel + pil sitter ihop som en knapp (delad kant i mitten). */
.kf-split-main { border-top-right-radius: 0; border-bottom-right-radius: 0; }
.kf-split-caret { border-top-left-radius: 0; border-bottom-left-radius: 0; margin-left: -1px; padding-left: 10px; padding-right: 10px; }
/* Default STÄNGD: ingen display här → UA-regeln [hidden]{display:none} vinner.
 * :not([hidden]) aktiverar flex (samma mönster som filter-dropdown #25 — en
 * `display: flex` i basregeln övertrumfar annars [hidden] och menyn syns alltid). */
.kf-split-meny {
  position: absolute; right: 0; bottom: calc(100% + 4px); z-index: 30; min-width: 100%;
  background: var(--surface-card); border: 1px solid var(--border); border-radius: var(--radius);
  box-shadow: 0 6px 20px rgba(0,0,0,.12); overflow: hidden; white-space: nowrap;
}
.kf-split-meny:not([hidden]) { display: flex; flex-direction: column; }
.kf-split-val { background: none; border: none; text-align: left; padding: 8px 14px; font-size: var(--fs-sm); cursor: pointer; color: var(--text-primary); }
.kf-split-val:hover { background: var(--surface-hover, rgba(0,0,0,.05)); }
/* Mobil 375px: knapparna staplar i full bredd, splitten fyller raden. */
@media (max-width: 480px) {
  .kf-actions { justify-content: stretch; }
  .kf-actions > .btn, .kf-split { flex: 1 1 100%; }
  .kf-split { display: flex; }
  .kf-split-main { flex: 1; }
}

/* Kreditfaktura-modal (delvis): läges-val + radval. Staplar naturligt på mobil. */
.kfk-val { display: flex; flex-wrap: wrap; gap: var(--space-2) var(--space-4); }
.kfk-val label { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-sm); cursor: pointer; }
.kfk-rad { display: flex; align-items: flex-start; gap: 8px; padding: 6px 0; font-size: var(--fs-sm); cursor: pointer; }
.kfk-rad input { margin-top: 3px; flex: 0 0 auto; }
@media (max-width: 480px) {
  .kfk-val { flex-direction: column; gap: var(--space-2); }
}

.dash-redig-banner {
  background: var(--surface-inset);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: var(--space-3) var(--space-4);
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  margin-bottom: var(--space-4);
}
.dash-redig-lista { display: flex; flex-direction: column; gap: var(--space-2); }
.dash-redig-kort {
  display: flex; align-items: center; justify-content: space-between; gap: var(--space-3);
  padding: var(--space-3) var(--space-4);
  background: var(--surface-card);
  border: 1px solid var(--border); border-radius: var(--radius);
}
.dash-redig-titel { font-weight: 600; }
.dash-redig-ktrl { display: flex; align-items: center; gap: var(--space-2); }
.dash-redig-jmf {
  display: inline-flex; align-items: center; gap: var(--space-1);
  font-size: var(--fs-xs); color: var(--text-secondary); white-space: nowrap; cursor: pointer;
}
.dash-redig-jmf input { cursor: pointer; }
.dash-redig-rubrik { font-family: var(--font-heading); font-size: 1rem; margin: var(--space-5) 0 var(--space-3); }
.dash-redig-bibliotek { display: flex; flex-wrap: wrap; gap: var(--space-2); }

/* Dashboard etapp 3 — grupp 1 (kunder/fakturor): stapellista, åldersanalys,
   stort mätetal. Alla i platform-tokens; skalar 375px → desktop. */
.dash-bars { display: flex; flex-direction: column; gap: var(--space-2); }
.dash-bar-rad { display: grid; grid-template-columns: minmax(4.5rem, 8rem) 1fr auto; align-items: center; gap: var(--space-2); }
.dash-bar-namn { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-sm); }
.dash-bar-spar { height: 8px; border-radius: 4px; background: var(--surface-sunken, rgba(0,0,0,.06)); overflow: hidden; }
.dash-bar-fyll { display: block; height: 100%; border-radius: 4px; background: var(--brand); }
.dash-bar-varde { font-size: var(--fs-sm); white-space: nowrap; }

.dash-aging-stapel { display: flex; height: 12px; border-radius: 6px; overflow: hidden; margin-bottom: var(--space-3); background: var(--surface-sunken, rgba(0,0,0,.06)); }
.dash-aging-seg { display: block; height: 100%; }
.dash-aging-lista { display: flex; flex-direction: column; gap: var(--space-1); }
.dash-aging-rad { display: grid; grid-template-columns: auto 1fr auto auto; align-items: center; gap: var(--space-2); font-size: var(--fs-sm); }
.dash-aging-prick { width: 10px; height: 10px; border-radius: 50%; flex: none; }
.dash-aging-namn { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dash-aging-antal { color: var(--text-secondary); font-size: var(--fs-xs); }
.dash-aging-belopp { white-space: nowrap; }

.dash-metric-stor { font-family: var(--font-heading); font-size: 2rem; line-height: 1.1; margin-bottom: var(--space-1); }
.dash-metric-enhet { font-size: 1rem; color: var(--text-secondary); }

/* Grupp 3 — prognos / ställning / nyckeltal. */
.dash-prognos-nu { display: flex; justify-content: space-between; align-items: baseline; font-weight: 600; padding-bottom: var(--space-2); border-bottom: 1px solid var(--border); }
.dash-prognos-lista { display: flex; flex-direction: column; gap: var(--space-1); margin-top: var(--space-2); }
.dash-prognos-rad { display: flex; justify-content: space-between; align-items: baseline; }
.dash-prognos-horisont { color: var(--text-secondary); font-size: var(--fs-sm); }
.dash-est-badge { display: inline-block; font-size: var(--fs-xs); font-weight: 600; text-transform: uppercase; letter-spacing: .03em; padding: 1px 6px; border-radius: 999px; background: var(--warning-bg); color: var(--warning-fg, #8a6d1f); }
.dash-est-not { margin-top: var(--space-3); font-size: var(--fs-xs); color: var(--text-secondary); line-height: 1.4; }
.dash-nyckeltal { display: flex; gap: var(--space-4); }
.dash-nyckeltal-cell { flex: 1; }
.dash-nyckeltal-varde { font-family: var(--font-heading); font-size: 1.6rem; line-height: 1.1; }
.dash-nyckeltal-etikett { font-size: var(--fs-sm); color: var(--text-secondary); }

/* Insikts-widget — roterande härledda observationer. */
.dash-insikter { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--space-3); }
.dash-insikt { font-size: var(--fs-sm); line-height: 1.4; padding-left: var(--space-3); border-left: 2px solid var(--brass, #b08d57); }

/* Dashboard etapp 2 — kontonamn-ellipsis + förfallna-tabell mobil. */
.dash-hero-konto {
  max-width: 60%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* Förfallna: riktig tabell även på mobil; fakturanr-kolumnen döljs smått. */
@media (max-width: 560px) {
  .dash-forfallna-tabell .dash-col-mobildold { display: none; }
}

/* Dashboard etapp 2 — grafer (staplar, donut, linje, sparkline). */
.dash-spark { width: 100%; height: 26px; display: block; margin: var(--space-2) 0; }

.dash-bars { display: flex; align-items: flex-end; gap: 6px; height: 150px; padding-top: var(--space-2); }
.dash-bar-col { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 6px; height: 100%; justify-content: flex-end; }
.dash-bar { width: 100%; min-height: 2px; border-radius: 3px 3px 0 0; background: var(--brand); }
.dash-bar--neg { background: var(--danger-soft); border: 1px solid var(--danger); }
.dash-bar-cap { font-size: 10px; color: var(--text-secondary); }

.dash-donut-wrap { display: flex; align-items: center; gap: var(--space-4); flex-wrap: wrap; }
.dash-donut { width: 120px; height: 120px; border-radius: 50%; flex-shrink: 0; position: relative; }
.dash-donut::after { content: ""; position: absolute; inset: 24px; background: var(--surface-card); border-radius: 50%; }
.dash-legend { display: flex; flex-direction: column; gap: 8px; font-size: var(--fs-sm); min-width: 0; flex: 1; }
.dash-legend-rad { display: flex; align-items: center; gap: 8px; }
.dash-legend-sw { width: 10px; height: 10px; border-radius: 2px; flex-shrink: 0; }
.dash-legend-namn { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dash-legend-pct { color: var(--text-secondary); margin-left: auto; }

.dash-linje svg { width: 100%; height: 130px; display: block; }
.dash-linje-etiketter { display: flex; justify-content: space-between; font-size: 11px; color: var(--text-secondary); margin-top: 6px; }

@media (max-width: 375px) {
  .dash-bars { height: 110px; }
  .dash-donut { width: 96px; height: 96px; }
  .dash-donut::after { inset: 20px; }
}

/* Dashboard etapp 2 — drag-och-släpp i redigeringsläget. */
.dash-redig-kort[draggable="true"] { cursor: grab; }
.dash-redig-handtag { color: var(--text-secondary); cursor: grab; user-select: none; margin-right: var(--space-1); }
.dash-redig-kort.dash-drar { opacity: .5; }
.dash-redig-kort.dash-drop-over { outline: 2px dashed var(--brand); outline-offset: 2px; }

/* Dashboard etapp 2 — sektions-eyebrow med hårfin avdelare (mockupen). */
.dash-eyebrow-sektion {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  font-size: var(--fs-eyebrow);
  letter-spacing: .12em;
  text-transform: uppercase;
  font-weight: 600;
  color: var(--text-secondary);
  margin: var(--space-6) 0 var(--space-3);
}
.dash-eyebrow-sektion::after {
  content: "";
  flex: 1;
  height: 1px;
  background: var(--border);
}
.dash-grid + .dash-eyebrow-sektion { margin-top: var(--space-6); }

/* Dashboard etapp 3 — SVG-diagram med axlar (delad grafik.js). */
.dash-graf { width: 100%; height: auto; max-height: 200px; display: block; }
.dash-graf-grid { stroke: var(--border); stroke-width: .35; opacity: .7; }
/* Nollinjen tydligt kraftigare än stödlinjerna (upp/ner-referens). */
.dash-graf-noll { stroke: var(--text-secondary); stroke-width: 1; }
.dash-graf-ytext { font-size: 7px; fill: var(--text-secondary); text-anchor: end; dominant-baseline: middle; }
.dash-graf-xtext { font-size: 7px; fill: var(--text-secondary); text-anchor: middle; }
.dash-graf-stapel { fill: var(--brand); }
.dash-graf-stapel--neg { fill: var(--danger); }
.dash-graf-linje { stroke: var(--brand); stroke-width: 1.4; }
.dash-graf-yta { fill: var(--brand-light); stroke: none; }
.dash-graf-punkt { fill: var(--brand); }
.dash-graf-jmf { stroke: var(--brass, #b08d57); stroke-width: 1.2; stroke-dasharray: 3 2; }
.dash-graf-legend { font-size: var(--fs-sm); color: var(--text-secondary); margin-top: var(--space-2); display: flex; align-items: center; gap: 6px; }
.dash-graf-legend--tom { font-style: italic; }
.dash-graf-legend-jmf { display: inline-block; width: 14px; height: 0; border-top: 2px dashed var(--brass, #b08d57); }
.dash-graf-legend-lin { display: inline-block; width: 14px; height: 0; border-top: 2px solid var(--brand); }

.dash-graf-stapel--pos { fill: var(--success); }
/* Hel-höjds hover-band per x-kolumn: osynligt men "målat" (fill-opacity:0) så
   det tar emot pekhändelser tillförlitligt → native <title>-tooltip för hela
   tidpunkten. Svag markering vid hover som affordans. */
.dash-graf-hover { fill: var(--brand); fill-opacity: 0; pointer-events: all; cursor: crosshair; }
.dash-graf-hover:hover { fill-opacity: .06; }

/* ── Artikel-import (Inställningar → Import/Export) ───────────────────── */
.imp-art-rad { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-3); margin-top: var(--space-3); }
.imp-art-fil-grupp { min-width: 0; flex: 1 1 220px; }
.imp-art-fil-grupp input[type="file"] { max-width: 100%; }
@media (max-width: 480px) {
  .imp-art-rad { flex-direction: column; align-items: stretch; }
  .imp-art-rad .btn { width: 100%; }
}

/* ── Importguide (artiklar) — stegvis, återanvänder SIE:s wiz-step ──────── */
.imp-guide { max-width: 900px; margin: 0 auto; }
.imp-guide__titel { margin-top: 0; }
.imp-guide__lead { color: var(--text-secondary); margin-bottom: var(--space-4); }
.imp-guide__steg { display: flex; flex-wrap: wrap; gap: var(--space-3); margin: var(--space-4) 0; }
/* wiz-step: samma mönster/känsla som SIE-importens stegindikator. */
.wiz-step { padding: 8px 16px; border-radius: var(--radius, 6px); background: var(--surface-inset); color: var(--text-secondary); font-size: var(--fs-sm, 14px); }
.wiz-step.active { background: var(--brand-navy, #1a365d); color: #fff; }
.wiz-step.done { background: #d1fae5; color: #065f46; }
.imp-guide__kort { padding: var(--space-5); }
.imp-guide__innehall .imp-ignorerad td { color: var(--text-secondary); }
.imp-guide__fel { color: var(--danger); margin-top: var(--space-3); }
.imp-guide__nav { display: flex; justify-content: space-between; align-items: center; gap: var(--space-3); margin-top: var(--space-4); }
.imp-guide__nav-hoger { display: flex; gap: var(--space-2); }
@media (max-width: 480px) {
  .imp-guide__steg { flex-direction: column; }
  .imp-guide__nav { flex-direction: column-reverse; align-items: stretch; }
  .imp-guide__nav-hoger { flex-direction: column; }
  .imp-guide__nav .btn { width: 100%; }
}

/* ── Importguide: redigerbar preview + filter ──────────────────────────── */
.imp-valj-rad { display: flex; flex-wrap: wrap; gap: var(--space-2); }
.imp-valj-rad .btn { flex: 0 1 auto; }
@media (max-width: 480px) { .imp-valj-rad { flex-direction: column; align-items: stretch; } }
/* Fältutökad granskning: full bredd + sticky identitet/huvud + horisontell scroll + radpanel */
/* Granska-steget spränger wizardens 900px-tak och fyller innehållsytan (som redan
   tar hänsyn till sidomenyn, kollapsad eller ej) — så breda tabeller får plats. */
.imp-guide--bred { max-width: none; }
/* .imp-guide ligger i .content-max (1040px-tak som standard). Lyft taket helt
   just när det breda granska-steget är aktivt (klassen togglas i steg 3) → kortet
   fyller HELA innehållsytan och flexar med skärmbredden (minus sidomeny). */
.content-max:has(.imp-guide--bred) { max-width: none; }
.imp-guide__kort--bred { max-width: none; }
.imp-tabell-scroll { overflow-x: auto; max-width: 100%; }
/* ⚠️ .imp-tabell--bred är RADPANELSLÄGET (kund/lev), inte bara "bred tabell":
 * read-only tabell + redigering i modal, och på mobil kollapsar
 * detaljkolumnerna bort eftersom panelen bär dem. Vyer som bara behöver
 * bredden (Visma) sätter config.kraverFullBredd och får .imp-guide__kort--bred
 * + .imp-tabell-scroll UTAN den här klassen — de har ingen panel att kollapsa
 * kolumnerna till. */
.imp-tabell--bred { min-width: max-content; border-collapse: separate; border-spacing: 0; }
.imp-tabell--bred th, .imp-tabell--bred td { white-space: nowrap; padding: 6px 10px; border-bottom: 1px solid var(--border); text-align: left; vertical-align: top; }
.imp-tabell--bred thead th { position: sticky; top: 0; z-index: 2; background: var(--surface); }
.imp-tabell--bred .imp-stick { position: sticky; left: 0; z-index: 3; background: var(--surface); box-shadow: 1px 0 0 var(--border); }
.imp-tabell--bred thead .imp-stick { z-index: 4; }
.imp-tabell--bred .imp-ident { display: flex; flex-direction: column; min-width: 140px; }
.imp-tabell--bred .imp-ident__nr { font-weight: 600; }
.imp-tabell--bred .imp-ident__namn { color: var(--text-secondary); font-size: var(--fs-sm, 13px); }
.imp-tabell--bred tbody .imp-rad { cursor: pointer; }
.imp-tabell--bred tbody .imp-rad:hover td { background: var(--surface-hover, #f3f4f6); }
.imp-tabell--bred tbody .imp-rad:hover .imp-stick { background: var(--surface-hover, #f3f4f6); }
.imp-tabell--bred tbody .imp-rad--vald .imp-stick { box-shadow: 1px 0 0 var(--brand-navy, #1a365d), inset 3px 0 0 var(--brand-navy, #1a365d); }
/* Radredigering = centrerad modal-overlay (växer med innehållet, alltid i vy
   oavsett hur lång tabellen är). Bakgrundsklick/Escape/Stäng stänger. */
.imp-radpanel {
  position: fixed; inset: 0; z-index: 1000;
  display: flex; align-items: flex-start; justify-content: center;
  padding: clamp(16px, 6vh, 64px) 16px;
  background: rgba(17, 24, 39, .55);
  overflow-y: auto; overscroll-behavior: contain;
}
.imp-radpanel[hidden] { display: none; }
.imp-radpanel__dialog {
  width: min(920px, 100%);
  max-height: calc(100vh - clamp(32px, 12vh, 128px));
  display: flex; flex-direction: column;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg, 12px);
  box-shadow: 0 24px 64px rgba(0, 0, 0, .32);
  padding: var(--space-5);
}
.imp-radpanel__huvud { display: flex; align-items: center; gap: var(--space-2); justify-content: space-between; margin-bottom: var(--space-3); flex: 0 0 auto; }
.imp-radpanel__body { overflow-y: auto; flex: 1 1 auto; min-height: 0; }
.imp-panel-grupp { margin-top: var(--space-2); }
body.imp-modal-open { overflow: hidden; }   /* lås bakgrundsscroll medan modalen är öppen */
/* Mobil 375px: kollapsa till identitet + status + anmärkning; detaljer i panelen (ingen scroll-röra) */
@media (max-width: 600px) {
  .imp-tabell--bred { min-width: 100%; }
  .imp-tabell--bred td[data-f], .imp-tabell--bred thead th:nth-child(n+3):nth-last-child(n+2) { display: none; }
  .imp-tabell--bred .imp-ident { min-width: 0; }
  .imp-radpanel { padding: 0; }
  .imp-radpanel__dialog { width: 100%; max-height: 100vh; border-radius: 0; padding: var(--space-4); }
  .detail-form-grid { grid-template-columns: 1fr; }   /* ett fält per rad på liten skärm */
}
/* ── Visma: notiser + källgrupp ──────────────────────────────────────────────
 * Notiserna (mängdrabatter, orgnr-avvikelse, artiklar utan pris) ligger över
 * filterraden och går inte att stänga — tyst bortfall är förbjudet.
 * Källbrickan är previewens huvudindelning: "Endast prislista" betyder tunna
 * uppgifter, och den signalen får aldrig gå förlorad bland de fullständiga. */
.imp-notis { margin: var(--space-2) 0; }
/* Systemväljaren i steg 1 — radioknappar som kort. Wrappar på 375px och
   staplar hellre än att krympa träffytan. */
.imp-system { display: flex; flex-wrap: wrap; gap: var(--space-2); margin: var(--space-3) 0; }
.imp-system__val {
  display: flex; align-items: center; gap: var(--space-2);
  padding: 10px 16px; min-height: 44px;
  border: 1px solid var(--border); border-radius: var(--radius, 8px);
  background: var(--surface); cursor: pointer;
}
.imp-system__val--vald { border-color: var(--brand-navy, #1a365d); box-shadow: inset 0 0 0 1px var(--brand-navy, #1a365d); }
@media (max-width: 480px) {
  .imp-system { flex-direction: column; }
  .imp-system__val { width: 100%; }
}
.imp-kalla {
  display: inline-block; white-space: nowrap;
  padding: 2px 8px; border-radius: 999px;
  font-size: var(--fs-sm, 13px); line-height: 1.5;
  border: 1px solid var(--border); color: var(--text-secondary);
}
.imp-kalla--bada { border-color: var(--success); color: var(--success); }
.imp-kalla--endast_prislista { border-color: var(--warning); color: var(--warning); }
.imp-filter-rad { display: flex; flex-wrap: wrap; gap: var(--space-2); margin: var(--space-3) 0; }
.imp-filter { padding: 6px 14px; border: 1px solid var(--border); border-radius: 999px; background: var(--surface); color: var(--text-secondary); font-size: var(--fs-sm, 14px); cursor: pointer; }
.imp-filter--aktiv { background: var(--brand-navy, #1a365d); color: #fff; border-color: var(--brand-navy, #1a365d); }
.imp-tabell .imp-in { width: 100%; min-width: 90px; box-sizing: border-box; padding: 4px 6px; }
.imp-tabell .imp-in--pris { min-width: 80px; text-align: right; }
.imp-tabell .imp-in--konto { min-width: 90px; }
/* Enhetsfältet är kort (st/m/met) men får inte klippas på 375px. */
.imp-tabell .imp-in--enhet { min-width: 60px; }
/* Benämningen är radens längsta värde (Visma tillåter 60 tecken) och ska ha
   mest plats av kolumnerna. Längre värden scrollar inne i fältet — samma
   beteende som Fortnox-artikelimporten, och hela värdet är kvar. */
.imp-tabell .imp-in--benamning { min-width: 220px; }
.imp-tabell td.imp-moms { white-space: nowrap; color: var(--text-secondary); }
.imp-rad--fel { background: var(--danger-bg); }
.imp-rad--dubblett { background: var(--surface-inset); }
@media (max-width: 640px) {
  /* data-table--stack ger redan kort-layout på mobil; inputs blir fullbredd. */
  .imp-tabell .imp-in { min-width: 0; }
}

/* ── Bokslutets avstämning: underflikar (Balanskonton / Underlag) ────────────
 * BFL-underlagskontrollen ligger som en underflik i avstämningen — inte i
 * momsmodulen. Underlagskravet är BFL, inte moms.
 * Flikraden wrappar på smal skärm; periodväljaren staplar under 480px. */
.avst-flikar {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  border-bottom: 1px solid var(--line);
  margin-bottom: var(--space-3);
}
.avst-flik {
  appearance: none;
  background: none;
  border: none;
  border-bottom: 2px solid transparent;
  padding: 8px 14px;
  font: inherit;
  font-size: 14px;
  color: var(--muted);
  cursor: pointer;
}
.avst-flik:hover { color: var(--ink); }
.avst-flik.vald {
  color: var(--ink);
  font-weight: 600;
  border-bottom-color: var(--brand);
}
.avst-underlag-period {
  display: flex;
  flex-wrap: wrap;
  align-items: end;
  gap: var(--space-2);
  margin-bottom: var(--space-2);
}
.avst-underlag-period .form-group { margin-bottom: 0; }
@media (max-width: 480px) {
  .avst-underlag-period { flex-direction: column; align-items: stretch; }
  .avst-underlag-period .btn { width: 100%; }
}

/* Underlagslistans radtitel WRAPPAR i stället för att ellipseras: leverantörens
 * namn är det man identifierar posten med, och på 375px klipptes långa namn. */
.avst-underlag-rad .list-row__title {
  white-space: normal;
  overflow: visible;
  text-overflow: clip;
  overflow-wrap: anywhere;
}

/* ── Fältnivå-varning (t.ex. ogiltig OCR-referens) ─────────────────────
 * VARNAR, blockerar aldrig — fältet och formuläret förblir användbara.
 * Skild från .form-error: den senare markerar något som stoppar sparandet.
 * white-space: normal + overflow-wrap säkrar att texten wrappar i stället
 * för att spränga .form-group på 375px. */
.falt-varning {
  margin-top: 4px;
  font-size: var(--fs-sm, 13px);
  color: var(--warning-text);
  white-space: normal;
  overflow-wrap: anywhere;
}
.falt-varning[hidden] { display: none; }

/* ⚠️ Mobil sorteringsväljare (lib/list-tabell.js). thead döljs under
   mobilbrytpunkten i .data-table--stack, så de klickbara kolumnrubrikerna är
   onåbara där — selecten är enda vägen till sortering på telefon. */
.lista-mobilsort { display: none; align-items: center; gap: 8px; }
.lista-mobilsort select { min-height: 44px; }
@media (max-width: 768px) {
  .lista-mobilsort { display: flex; }
}

/* ─── 27. Tumnåbar kryssruta i en tabellcell ────────────────────────────────
   ⚠️ MÄTT: en naken <input type="checkbox"> är 13×13 px i Chromium. Ett
   `padding:12px` runt den ger 12+13+12 = 37 px — under WCAG:s 44 px, och
   det såg ut att räcka. Samma räknefel gjordes i #838 och rättades i #842.

   ⚠️ DÄRFÖR SÄTTS MÅLET DIREKT, INTE VIA PADDING. min-width/min-height
   binder ytan till --tap-target oavsett hur stor rutan råkar renderas i en
   viss webbläsare eller zoomnivå; padding binder den till rutans storlek.

   Gäller BÅDA bredder: en kryssruta träffas med tumme på mobil och med
   muspekare på desktop, men cellen är lika liten i båda fallen. */
.tap-kryssruta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width:  var(--tap-target);
  min-height: var(--tap-target);
  cursor: pointer;
}

/* ⚠️ Kryssruta MED TEXT bredvid sig. Bredden kommer från texten, men höjden
   kom från radhöjden — mätt till 19 px på lagerlistans "Endast varningar".
   Bredd är alltså inte problemet här; höjd är. */
.tap-etikett {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  min-height: var(--tap-target);
  cursor: pointer;
  white-space: nowrap;
}

/* ── Redovisningsbyrå-kortet (#/installningar → Företag) ──────────────────
   Rad med byråns namn till vänster och handlingsknappar till höger.

   ⚠️ STAPLAR PÅ SMAL SKÄRM. Namn + org.nr + två datum + roll blir en lång
   metarad; ligger knapparna kvar bredvid den klämmer de ihop texten till
   ett par tecken per rad. Brytpunkten är densamma som för .form-actions
   i style.css, så kortet beter sig som resten av inställningssidan. */
.byra-koppling {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 16px;
  padding: 12px 0;
}
.byra-koppling + .byra-koppling { border-top: 1px solid var(--border); }
.byra-koppling__info { min-width: 0; }
.byra-koppling__namn { font-weight: 600; }
.byra-koppling__meta {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  overflow-wrap: anywhere;
}
.byra-koppling__knappar { display: flex; gap: 8px; flex-shrink: 0; }
/* Skälet till att en knapp är otillgänglig — inte en hjälptext utan
   svaret på "varför kan jag inte klicka". */
.byra-koppling__skal {
  font-size: var(--fs-sm);
  color: var(--text-secondary);
  margin: 0 0 12px;
}

@media (max-width: 768px) {
  .byra-koppling { flex-direction: column; gap: 12px; }
  .byra-koppling__knappar { width: 100%; }
  .byra-koppling__knappar .btn { flex: 1; }
}

/* ── Byråns konsulter: modulåtkomst per konsult ───────────────────────────
   ⚠️ INGEN EGEN VISUELL VOKABULÄR. Raden återanvänder .byra-koppling__info,
   .byra-koppling__namn/__meta och .tap-etikett rakt av — det här är samma
   sorts uppgift i samma kort, och en andra formgivning hade sagt att det
   vore något annat.

   ⚠️ KRYSSRUTORNA FLÖDAR. Antalet moduler varierar med vad organisationen
   fått godkänt (1–9); en fast kolumnindelning hade lämnat hål eller klämt. */
.byra-konsulter { border-top: 1px solid var(--border); margin-top: 4px; }
.byra-konsulter__rubrik {
  font-weight: 600;
  margin: 16px 0 4px;
}
.byra-konsult { padding: 12px 0; }
.byra-konsult + .byra-konsult { border-top: 1px solid var(--border); }
.byra-konsult__toggle { margin-top: 8px; }
.byra-konsult__moduler {
  display: flex;
  flex-wrap: wrap;
  gap: 4px 20px;
  margin: 4px 0 0 24px;
}
.byra-konsult__moduler[hidden] { display: none; }
.byra-konsult__handling { margin-top: 12px; }
.byra-konsult__fel { margin-top: 12px; }

@media (max-width: 768px) {
  /* Staplat: 20px kolumnavstånd på 375px klämde etiketterna till två rader. */
  .byra-konsult__moduler { flex-direction: column; gap: 0; }
  .byra-konsult__handling .btn { width: 100%; }
}

/* ── Uppstartsfrågorna (/onboarding) ──────────────────────────────────────
   ⚠️ INGEN EGEN VISUELL VOKABULÄR. Allt nedan bygger på plattformens
   befintliga tokens (--text-secondary, --border, --primary, --fs-sm) och
   komponenter (.auth-page, .card, .form-group, .btn). Onboardingen ska se ut
   som produkten, inte som en separat sida — det som tillkommer är hierarki
   och förlopp, inte ett nytt formspråk.

   ⚠️ BREDDEN KOMMER UR PLATTFORMENS EGEN MODIFIERARE `.auth-card--wide`
   (560 px), inte ur en egen regel. Konsultens formulärläge visar elva frågor
   på en skärm och ett 420 px-kort hade gjort det till en rulltrappa —
   men behovet fanns redan och hade redan ett namn. */
.onb-falt { margin-bottom: 20px; }
.onb-etikett { display: block; font-weight: 600; margin-bottom: 6px; }
.onb-steg { font-size: var(--fs-sm); color: var(--text-secondary); margin-bottom: 16px; }

.onb-datumpar { display: flex; align-items: center; gap: 10px; }
/* Fälten är plattformens datumfält: omslaget är radens del, inte fältet. */
.onb-datumpar > .smart-date-wrapper { flex: 1; min-width: 0; }
.onb-till { color: var(--text-secondary); flex-shrink: 0; }

.onb-janej { display: flex; gap: 20px; }
.onb-janej label { display: flex; align-items: center; gap: 6px; }

.onb-knapprad { display: flex; gap: 10px; justify-content: space-between; }
.onb-knapprad .btn { flex: 1; }

/* 375 px: datumparet staplar hellre än klämmer ihop två date-fält till
   oläsbarhet. Mätt på renderade rektanglar i webbläsartestet. */
@media (max-width: 480px) {
  .onb-datumpar { flex-direction: column; align-items: stretch; }
  .onb-till { text-align: center; }
}


/* ── Uppstarten: hierarki, förlopp och avslutning ─────────────────────────
   ⚠️ TRE NIVÅER I STÄLLET FÖR EN. Före: rubrik + fält + knapp, allt i samma
   vikt. Nu bär eyebrow'en KONTEXTEN (vilket bolag, vilket flöde), rubriken
   FRÅGAN, och hjälptexten KONSEKVENSEN. Ögat hittar frågan först, vilket är
   det enda man behöver läsa för att kunna svara. */
.onb-eyebrow {
  font-size: var(--fs-sm);
  font-weight: 600;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--text-secondary);
  margin: 0 0 4px;
}

/* ⚠️ SIDANS NAMN ÄR RUBRIKEN i wizardläget (PR 10c). Först var rubriken
   företagsnamnet och frågan en liten etikett — då läste man rubriken i onödan
   vid varje steg och letade efter frågan. Sedan blev FRÅGAN rubriken, vilket
   dubblerade fältets egen <label>. Nu bär rubriken gruppen ("Företaget",
   "Räkenskapsår och moms") och varje fält bär sin etikett. */
.onb-fraga { margin-bottom: 20px; }

/* ⚠️ FÖRLOPPET RÄKNAS UR DE TILLÄMPLIGA FRÅGORNA, inte ur en fast siffra:
   antalet varierar med orgens moduler, och "3 av 9" hade varit fel för
   varannan organisation. En wizard utan synligt slut känns oändlig. */
.onb-forlopp { margin-bottom: 24px; }
.onb-forlopp__spar {
  height: 4px;
  border-radius: 999px;
  background: var(--border);
  overflow: hidden;
}
.onb-forlopp__fyllt {
  height: 100%;
  background: var(--primary, #2563eb);
  transition: width .2s ease;
}
.onb-forlopp__text {
  margin: 6px 0 0;
  font-size: var(--fs-sm);
  color: var(--text-secondary);
}

/* Fältfel står vid sitt fält, inte som en banner högst upp — den som skrev
   fel ska se var. .alert är för sidbrett fel och blev för tungt här. */
.onb-faltfel {
  margin: 6px 0 0;
  font-size: var(--fs-sm);
  color: var(--danger);
}

.onb-bred { width: 100%; }

/* Avslutningen: en lista med vägar vidare, ingen av dem obligatorisk. */
.onb-importlista { list-style: none; padding: 0; margin: 20px 0; }
.onb-import { padding: 12px 0; border-top: 1px solid var(--border); }
.onb-import__lank { font-weight: 600; }
.onb-import__text {
  margin: 4px 0 0;
  font-size: var(--fs-sm);
  color: var(--text-secondary);
}

@media (prefers-reduced-motion: reduce) {
  .onb-forlopp__fyllt { transition: none; }
}

/* ─── 28. Byråns uppdragssida + klientlista (v7) ─────────────────────────────
   Former och etiketter ur byravy-deadlines-v7.html: klarkälla-badges
   (härledd/modul/manuell), arv/överstyrd-chips, brytare, overifierad-märke.
   Färgerna mappas mot tokens — inga nya hex utanför paletten. */
.uppdrag-kalla {
  display: inline-block; font-size: 10.5px; text-transform: uppercase;
  letter-spacing: .06em; font-weight: 650; padding: 2px 7px; border-radius: 4px;
  white-space: nowrap;
}
.uppdrag-kalla--harledd { background: var(--bg-secondary, #eef1f5); color: var(--text-secondary); }
.uppdrag-kalla--modul   { background: var(--primary-50, #eaf1f8); color: var(--primary, #1f4e79); }
.uppdrag-kalla--manuell { background: #f0eaf8; color: #6b46a8; }

.uppdrag-arv, .uppdrag-overstyrd {
  display: inline-block; font-size: 11.5px; padding: 1px 7px; border-radius: 4px;
  white-space: nowrap;
}
.uppdrag-arv {
  background: var(--bg-secondary, #f2f4f7); color: var(--text-secondary);
  border: 1px solid var(--border);
}
.uppdrag-overstyrd {
  background: var(--primary-50, #eaf1f8); color: var(--primary, #1f4e79);
  border: 1px solid #cfe0f0; font-weight: 600;
}
.uppdrag-overifierad {
  display: inline-block; font-size: 10.5px; text-transform: uppercase;
  letter-spacing: .06em; font-weight: 650; padding: 2px 7px; border-radius: 4px;
  background: #fdf6e3; color: #8a6a08; margin-left: 6px;
}

/* Brytaren — ⚠️ min-höjd via --tap-target (samma läxa som #842: padding
   runt ett litet element ger 37 px, min-mått ger 44). */
.uppdrag-brytare {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: var(--tap-target, 44px); min-height: var(--tap-target, 44px);
  background: none; border: none; cursor: pointer; padding: 0;
}
.uppdrag-brytare__spar {
  width: 32px; height: 18px; border-radius: 10px;
  background: var(--primary, #1f4e79); position: relative; flex: none;
}
.uppdrag-brytare__spar::after {
  content: ""; position: absolute; top: 2px; right: 2px;
  width: 14px; height: 14px; border-radius: 50%; background: #fff;
}
.uppdrag-brytare--av .uppdrag-brytare__spar { background: var(--line-stark); }
.uppdrag-brytare--av .uppdrag-brytare__spar::after { right: auto; left: 2px; }

.uppdrag-rad--av td { opacity: .45; }
.uppdrag-rad--av td:first-child { opacity: 1; }

.uppdrag-periodval { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; }
.uppdrag-klar { font-size: 12.5px; white-space: nowrap; display: inline-flex; align-items: center; gap: 8px; }

.klientlista-nr { display: block; font-weight: 400; font-size: 11.5px; color: var(--text-tertiary, #8b95a6); margin-top: 1px; }
.klientlista-dampad { color: var(--text-tertiary, #8b95a6); }
.klientlista-status {
  display: inline-block; font-size: 11.5px; padding: 1px 7px; border-radius: 4px;
  background: var(--bg-secondary, #f2f4f7); color: var(--text-secondary);
  border: 1px solid var(--border);
}
.klientlista-status--ja {
  background: var(--success-50, #ecf6f0); color: var(--success);
  border: none; font-weight: 600;
}

/* ══ BYRÅVYN v9 ═══════════════════════════════════════════════════════════
 *
 * ⚠️ PALETTEN ÄR KOPIERAD VERBATIM ur byravy-deadlines-v9.html :root.
 * Varje hexvärde är identiskt med designfilen (docs/design/byravy-v9.html),
 * och test/unit/v9-designtrohet.test.ts jämför dem hex för hex. En "nästan
 * samma" nyans ur plattformens palett är exakt vad som gjorde v7-bygget
 * otroget: --danger är #dc2626, men v9:s byrårött är #b3402f.
 *
 * ⚠️ EGET NAMNRUM (--byravy-*). v9:s namn är korta och generiska (--text,
 * --kant) och hade krockat med plattformens tokens. Prefixet är därför inte
 * kosmetiskt — utan det ändrar byråvyns palett hela produkten.
 *
 * ⚠️ FORM, INTE FÄRG, bär innebörden: romb = uppdrag, prick = härlett ur
 * data. Färgen är förstärkning. Röd–grön färgblindhet utesluter var tolfte
 * man, och en byrå läser den här tabellen hela dagarna.
 */
/* ⚠️⚠️ TOKENS PÅ :root, INTE PÅ .byravy. De låg tidigare på .byravy — och
   dialogerna renderas i document.body, utanför den. Variablerna var därför
   odefinierade där: `background: var(--byravy-lugn)` blev ogiltig och
   färgprickarna genomskinliga. UPPMÄTT i Chromium: rgba(0, 0, 0, 0) på varje
   swatch och ärvd rgb(39, 54, 74) på formerna, i stället för v12:s färger.
   Prefixet finns just för att namnen inte ska krocka globalt, så :root är
   säkert — typografin nedan stannar däremot på .byravy, för den gäller vyn
   och inte hela produkten. */
:root {
  --byravy-bg: #f6f7f9;
  --byravy-yta: #ffffff;
  --byravy-kant: #e3e7ed;
  --byravy-kant-stark: #cbd3dd;
  --byravy-text: #1b2430;
  --byravy-text-svag: #697588;
  --byravy-text-svagast: #8b95a6;
  --byravy-bla: #1f4e79;
  --byravy-bla-ljus: #eaf1f8;
  --byravy-lugn: #5a6678;
  --byravy-snart: #8a6a08;
  --byravy-snart-yta: #fdf6e3;
  --byravy-byra: #b3402f;
  --byravy-byra-yta: #fdeeec;
  --byravy-lag: #7d1a10;
  --byravy-lag-yta: #f6dcd8;
  --byravy-klar: #2e7d51;
  --byravy-klar-yta: #ecf6f0;
  --byravy-pagaende: #6b46a8;
}

.byravy {
  color: var(--byravy-text);
  /* v10:s systemfont-stack och tabular-nums — siffror i kolumn ska stå i lod. */
  font: 15px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, system-ui, sans-serif;
  font-variant-numeric: tabular-nums;
}

/* ⚠️ FLYTANDE BREDD (v9). Ett fast tak lämnade 240 px oanvänd yta på en
   1440-skärm och klämde uppdragssidans tio kolumner under v9:s egen
   min-width. Innehållet får den plats skärmen ger, med marginal kvar. */
.content-max--byravy { max-width: min(1760px, 100%); margin-inline: auto; }
/* ⚠️ Samma flytande tak som byråvyns, utan byrånamnet — "följ skärmen, lämna
 * marginal". Används av avstämningen, se public/js/layout-config.js. */
.content-max--flytande { max-width: min(1760px, 100%); margin-inline: auto; }

.byravy .kort {
  background: var(--byravy-yta); border: 1px solid var(--byravy-kant);
  border-radius: 9px; overflow: hidden;
}
.byravy .verktygsrad {
  display: flex; gap: 10px; align-items: center; flex-wrap: wrap;
  padding: 11px 14px; border-bottom: 1px solid var(--byravy-kant); background: #fbfcfd;
}
.byravy .valj {
  font: inherit; font-size: 13px; padding: 5px 9px;
  border: 1px solid var(--byravy-kant-stark); border-radius: 6px;
  background: var(--byravy-yta); color: var(--byravy-text);
}
.byravy .sok {
  font: inherit; font-size: 13px; padding: 5px 10px;
  border: 1px solid var(--byravy-kant-stark); border-radius: 6px;
  background: var(--byravy-yta); min-width: 220px;
}
.byravy .etikett {
  font-size: 12px; color: var(--byravy-text-svagast); text-transform: uppercase;
  letter-spacing: .05em; font-weight: 600;
}
.byravy .hoger { margin-left: auto; display: flex; gap: 8px; align-items: center; }

/* ⚠️ TOMMA BAND RENDERAS INTE (v9). "Försenat: Inget" lär ögat att zonen
   sällan betyder något, och den dagen den gör det hoppar blicken över den.
   Regeln sitter i JS — CSS här beskriver bara bandet som HAR innehåll. */
.byravy .band { border-bottom: 1px solid var(--byravy-kant); background: var(--byravy-byra-yta); }
.byravy .band-huvud {
  display: flex; align-items: baseline; gap: 10px; padding: 10px 14px 8px;
  font-size: 13px; font-weight: 650; color: var(--byravy-byra);
}
.byravy .band-huvud .antal { font-weight: 500; color: var(--byravy-text-svag); }
.byravy .band-rad {
  display: grid; grid-template-columns: 180px 148px 1fr auto; gap: 12px;
  align-items: center; padding: 8px 14px; border-top: 1px solid rgba(179,64,47,.18);
  font-size: 13.5px; cursor: pointer; width: 100%; text-align: left;
  background: none; border-left: 0; border-right: 0; border-bottom: 0; font-family: inherit;
}
.byravy .band-rad:hover { background: rgba(255,255,255,.5); }
.byravy .band-rad .klient { font-weight: 600; }
.byravy .band-rad .eskalering { font-size: 12.5px; color: var(--byravy-text-svag); text-align: right; }
.byravy .band.lag { background: var(--byravy-lag-yta); }
.byravy .band.lag .band-huvud { color: var(--byravy-lag); }
.byravy .band.lag .band-rad { border-top-color: rgba(125,26,16,.2); }

/* ⚠️ BREDA TABELLER RULLAR I SIN BEHÅLLARE, aldrig genom avhuggen text. */
.byravy .rulle { overflow-x: auto; }
.byravy table { border-collapse: collapse; width: 100%; min-width: 1080px; }
.byravy table.smal { min-width: 820px; }
.byravy th {
  font-size: 11.5px; text-transform: uppercase; letter-spacing: .055em;
  font-weight: 650; color: var(--byravy-text-svagast); text-align: left;
  padding: 10px 10px 8px; border-bottom: 1px solid var(--byravy-kant-stark);
  white-space: nowrap;
}
.byravy th.sorterad { color: var(--byravy-bla); }
.byravy th.sorterad::after { content: " ↑"; font-size: 10px; }
.byravy th.klick { cursor: pointer; }
.byravy td { padding: 9px 10px; border-bottom: 1px solid var(--byravy-kant); vertical-align: top; }
.byravy tbody tr:last-child td { border-bottom: none; }
.byravy tr:hover td { background: #fafbfc; }
.byravy td.klient { font-weight: 600; font-size: 14px; white-space: nowrap; }
/* ⚠️ KLIENTNAMNET ÄR EN KNAPP i tabellen — en <td> med click-handler är
   varken tabbbar eller uppläsbar. Formen är v10:s td.klient. */
.byravy .byravy-namn {
  font: inherit; font-weight: 650; color: inherit; background: none;
  border: 0; padding: 0; cursor: pointer; text-align: left;
}
.byravy .byravy-namn:hover { text-decoration: underline; }
/* ⚠️⚠️ ELLIPS PÅ LÅNGA KLIENTNAMN — BARA NÄR PLATSEN TAR SLUT (bokslutsperioder
   etapp 3). Hela namnet står i title. Namnkolumnen fick byråvyn att rulla 7 px
   vid 1440 med vanliga namn.
   ⚠️ GRIDEN ÄR TRICKET: `minmax(0, 1fr)` gör namnets minsta bidrag till
   kolumnen noll och dess största bidrag hela namnet; `min-width: 190px` sätter
   golvet. Tabellens auto-layout ger då namnet full bredd när det ryms och
   krymper det mot 190 px först när tabellen annars hade rullat. Ett fast
   max-width hade huggit av namn även på en bred skärm. */
.byravy td.klient .klientnamn { display: grid; grid-template-columns: minmax(0, 1fr); min-width: 190px; }
.byravy .byravy-namn, .byravy td.klient .nr {
  display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.byravy .byravy-namn:focus-visible { outline: 2px solid var(--byravy-bla); outline-offset: 2px; }

.byravy td.klient .nr {
  display: block; font-weight: 400; font-size: 11.5px;
  color: var(--byravy-text-svagast); margin-top: 1px;
}

/* ⚠️ CELLEN ÄR EN LÄNK till arbetet — knapp, inte dekoration, så den är
   tabbbar och uppläsbar. INGEN radexpansion någonstans. */
.byravy .cell {
  display: flex; flex-direction: column; gap: 1px; cursor: pointer; min-width: 100px;
  background: none; border: 0; padding: 0; font: inherit; color: inherit; text-align: left;
}
.byravy .cell .datum {
  font-size: 13px; font-weight: 600; display: flex; align-items: center;
  gap: 5px; white-space: nowrap;
}
.byravy .cell .under { font-size: 11.5px; color: var(--byravy-text-svagast); white-space: nowrap; }
.byravy .cell.tom .datum { color: var(--byravy-text-svagast); font-weight: 400; }
.byravy .cell.tom { cursor: default; }
.byravy .cell.inkorg { min-width: 76px; }
.byravy .cell.inkorg .datum, .byravy .cell.inkorg .form { color: var(--byravy-lugn); }
.byravy .cell:focus-visible { outline: 2px solid var(--byravy-bla); outline-offset: 2px; }
/* ⚠️⚠️ AVSTÄMNINGSRADEN i Bokslut-cellen (etapp 3). Periodlistans färger —
   blå granskad, grön avstämd, grå pågår, gul efter påminnelsegränsen — och
   den BRYTS inom kolumnen i stället för att bredda den. */
.byravy .avstrad {
  display: block; margin-top: 4px; padding: 0; border: 0; background: none;
  font: inherit; font-size: 11.5px; font-weight: 600; line-height: 1.35;
  text-align: left; cursor: pointer; white-space: normal;
}
.byravy .avstrad:hover { text-decoration: underline; }
.byravy .avstrad:focus-visible { outline: 2px solid var(--byravy-bla); outline-offset: 2px; }
.byravy .avstrad--granskad { color: var(--brand); }
.byravy .avstrad--avstamd  { color: var(--success-deep); }
.byravy .avstrad--pagar    { color: var(--muted); }
.byravy .avstrad--sen      { color: var(--warning-deep); }

.byravy .form { font-size: 10px; line-height: 1; }
.byravy .romb::before { content: "◆"; }
.byravy .prick::before { content: "●"; }

.byravy .lugn .datum, .byravy .lugn .form { color: var(--byravy-lugn); }
.byravy .snart .datum, .byravy .snart .form { color: var(--byravy-snart); }
.byravy .klar .datum, .byravy .klar .form { color: var(--byravy-klar); }
.byravy .forsenad-byra .datum, .byravy .forsenad-byra .form { color: var(--byravy-byra); }
.byravy .forsenad-lag .datum {
  color: #fff; background: var(--byravy-lag); padding: 1px 6px;
  border-radius: 4px; align-self: flex-start;
}
.byravy .forsenad-lag .form { color: #fff; }

/* Yttersta gränsen — streckad, alltid under byråns eget datum. */
.byravy .lagrad {
  display: inline-flex; align-items: center; gap: 4px; font-size: 11.5px;
  color: var(--byravy-text-svagast); border-top: 1px dashed var(--byravy-kant-stark);
  padding-top: 2px; margin-top: 2px; white-space: nowrap;
}
.byravy .lagrad b { font-weight: 600; color: var(--byravy-lugn); }

.byravy .vantar {
  display: inline-block; font-size: 11px; padding: 1px 6px; border-radius: 4px;
  background: var(--byravy-bla-ljus); color: var(--byravy-bla); font-weight: 600;
}

.byravy .teckenrad {
  display: flex; gap: 22px; flex-wrap: wrap; padding: 11px 14px;
  border-top: 1px solid var(--byravy-kant); background: #fbfcfd;
  font-size: 12.5px; color: var(--byravy-text-svag);
}
.byravy .teckenrad span { display: inline-flex; align-items: center; gap: 6px; }
.byravy .swatch { width: 9px; height: 9px; border-radius: 50%; display: inline-block; }

.byravy .instab td { vertical-align: middle; }
.byravy .instab tr.av td { opacity: .45; }
.byravy .instab tr.av td:first-child { opacity: 1; }
.byravy .regel { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.byravy .talruta {
  width: 52px; font: inherit; font-size: 13px; padding: 4px 7px; text-align: right;
  border: 1px solid var(--byravy-kant-stark); border-radius: 5px; background: var(--byravy-yta);
}
.byravy .las {
  display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px;
  color: var(--byravy-text-svag); background: #f2f4f7;
  border: 1px solid var(--byravy-kant); border-radius: 5px; padding: 3px 8px;
}
.byravy .foljd { font-size: 12.5px; color: var(--byravy-text-svag); margin-top: 3px; }
.byravy .regeltyp {
  display: inline-block; font-size: 10.5px; text-transform: uppercase;
  letter-spacing: .06em; font-weight: 650; padding: 2px 7px; border-radius: 4px;
}
.byravy .regeltyp.behov { background: #f0eaf8; color: var(--byravy-pagaende); }

.byravy .kalla {
  display: inline-block; font-size: 10.5px; text-transform: uppercase;
  letter-spacing: .06em; font-weight: 650; padding: 2px 7px;
  border-radius: 4px; white-space: nowrap;
}
.byravy .kalla.harledd { background: #eef1f5; color: var(--byravy-text-svag); }
.byravy .kalla.modul   { background: var(--byravy-bla-ljus); color: var(--byravy-bla); }
.byravy .kalla.manuell { background: #f0eaf8; color: var(--byravy-pagaende); }

/* ⚠️ ARV mot ÖVERSTYRD — samma märke bakom en regel som bakom en
   handläggare. Formen ÄR svaret på "vilket värde gäller", inte en etikett. */
.byravy .arv {
  display: inline-block; font-size: 11.5px; padding: 1px 7px; border-radius: 4px;
  background: #f2f4f7; color: var(--byravy-text-svag); border: 1px solid var(--byravy-kant);
}
.byravy .overstyrd {
  display: inline-block; font-size: 11.5px; padding: 1px 7px; border-radius: 4px;
  background: var(--byravy-bla-ljus); color: var(--byravy-bla);
  border: 1px solid #cfe0f0; font-weight: 600;
}
.byravy .aterstall {
  font: inherit; font-size: 12.5px; background: none; border: none;
  color: var(--byravy-bla); cursor: pointer; padding: 0;
  text-decoration: underline; text-underline-offset: 2px;
}
.byravy .knapp {
  font: inherit; font-size: 13px; padding: 6px 12px;
  border: 1px solid var(--byravy-kant-stark); border-radius: 6px;
  background: var(--byravy-yta); color: var(--byravy-bla); font-weight: 600; cursor: pointer;
}
.byravy .knapp.primar { background: var(--byravy-bla); border-color: var(--byravy-bla); color: #fff; }

.byravy .brytare {
  display: inline-flex; align-items: center; gap: 7px; font-size: 13px;
  white-space: nowrap; background: none; border: 0; padding: 0; cursor: pointer;
}
.byravy .brytare .spar {
  width: 32px; height: 18px; border-radius: 10px;
  background: var(--byravy-bla); position: relative; flex: none;
}
.byravy .brytare .spar::after {
  content: ""; position: absolute; top: 2px; right: 2px; width: 14px; height: 14px;
  border-radius: 50%; background: #fff;
}
.byravy .brytare.av .spar { background: var(--byravy-kant-stark); }
.byravy .brytare.av .spar::after { right: auto; left: 2px; }
.byravy .brytare:focus-visible { outline: 2px solid var(--byravy-bla); outline-offset: 2px; }

/* ⚠️ TOMLÄGET SYNS. En tom tabell utan besked är fail-open: läsaren drar
   slutsatsen "inga klienter" oavsett vad som faktiskt hände. */
.byravy .tomlage {
  padding: 16px 14px; font-size: 13.5px; color: var(--byravy-text-svag);
  border-top: 1px solid var(--byravy-kant); background: #fbfcfd;
}
.byravy .tomlage b { color: var(--byravy-text); font-weight: 650; display: block; margin-bottom: 3px; }

.byravy .fotnot {
  padding: 12px 14px; border-top: 1px solid var(--byravy-kant); background: #fbfcfd;
  font-size: 12.5px; color: var(--byravy-text-svag);
}
.byravy .overifierad {
  display: inline-block; font-size: 10.5px; text-transform: uppercase;
  letter-spacing: .06em; font-weight: 650; padding: 2px 7px; border-radius: 4px;
  background: var(--byravy-snart-yta); color: var(--byravy-snart);
}
.byravy .status-i-byravyn {
  display: inline-block; font-size: 11.5px; padding: 1px 7px; border-radius: 4px;
  font-weight: 600; background: var(--byravy-klar-yta); color: var(--byravy-klar);
}
.byravy .status-ej-byravyn {
  display: inline-block; font-size: 11.5px; padding: 1px 7px; border-radius: 4px;
  background: #f2f4f7; color: var(--byravy-text-svag); border: 1px solid var(--byravy-kant);
}

.byravy h2 { font-size: 17px; font-weight: 640; letter-spacing: -.01em; margin: 0 0 2px; }
.byravy .sektionshuvud { margin-bottom: 14px; }
.byravy .sektionshuvud p {
  font-size: 13.5px; color: var(--byravy-text-svag); margin: 4px 0 0; max-width: 74ch;
}

/* ⚠️ RESERVLÄGET (#869) — fail-closed. Ingen klientlista alls när
   hämtningen faller: en byråvy utan rött läser som att inget är försenat. */
.byravy-fellage { display: flex; gap: 10px; flex-wrap: wrap; padding: 4px 0 8px; }

@media (max-width: 640px) {
  .byravy .band-rad { grid-template-columns: 1fr; gap: 2px; }
  .byravy .band-rad .eskalering { text-align: left; }
}

/* ⚠️ MOBILKORTEN (v10). Brytpunkt 900 px, mätt på båda sidor. Nio kolumner
   staplade blir nio rader per klient; kortet visar bara det som brinner.

   ⚠️⚠️ REGELN MÅSTE GÄLLA STATUSMATRISEN OCH INGEN ANNAN TABELL. Skriven som
   `.byravy .rulle table` dolde den VARJE tabell under `.byravy` — och kort
   finns bara i byråvyn. Klientlistan och uppdragssidan förlorade därmed hela
   sitt innehåll under 900 px: verktygsrad, sedan tom yta. Ingen felruta,
   inget tomläge, ingen rubrikrad — skärmen påstod att byrån saknade klienter.
   Enligt v10 rullar de två vågrätt i sin behållare i stället, vilket
   `.byravy .rulle { overflow-x: auto }` redan ger dem.

   Därav `.matris`: bara byråvyns egen tabell byts mot kort. */
.byravy .mobilkort { display: none; }
@media (max-width: 900px) {
  .byravy .rulle.matris table { display: none; }
  .byravy .mobilkort { display: block; }
}
.byravy .mobilkort > .kortrad {
  padding: 11px 13px; border-bottom: 1px solid var(--byravy-kant);
}
.byravy .mobilkort > .kortrad:last-child { border-bottom: none; }
/* ⚠️ NAMNET ÄR KNAPPEN, inte kortet. En <button> får inte innehålla knappar,
   och taggarna är knappar — så kortet är en behållare och namnet målet. */
.byravy .mobilrad {
  font-size: 14.5px; font-weight: 650; margin-bottom: 7px; cursor: pointer;
  background: none; border: 0; padding: 0; font-family: inherit;
  color: inherit; text-align: left; display: block; width: 100%;
}
.byravy .mobilrad:focus-visible { outline: 2px solid var(--byravy-bla); outline-offset: 2px; }
.byravy .mobilrad .nr {
  display: block; font-weight: 400; font-size: 11.5px;
  color: var(--byravy-text-svagast); margin-top: 1px;
}
.byravy .mobiltaggar { display: flex; flex-wrap: wrap; gap: 6px; }

/* ── Produktens navigering (v12) ──────────────────────────────────────────
   ⚠️ TVÅ LÄGEN, INTE TRE. Byråvyn och Klienter är jämbördiga. Uppdragssidan
   hör till en enskild klient och nås genom att klicka på henne — den har
   .smulor tillbaka i stället. Hade den varit ett tredje navläge hade den
   behövt betyda något utan vald klient, och det gör den inte. */
.byravy .huvudnav { display: flex; gap: 4px; align-items: center; padding: 0 0 14px; }
.byravy .huvudnav a {
  font-size: 14px; font-weight: 600; padding: 7px 14px; border-radius: 7px;
  color: var(--byravy-text-svag); text-decoration: none;
}
.byravy .huvudnav a.pa { background: var(--byravy-bla-ljus); color: var(--byravy-bla); }
.byravy .huvudnav a:hover { color: var(--byravy-text); }
.byravy .smulor { font-size: 13px; color: var(--byravy-text-svag); padding: 0 0 12px; }
.byravy .smulor a { color: var(--byravy-bla); text-decoration: none; }
.byravy .smulor b { color: var(--byravy-text); font-weight: 600; }

/* ⚠️ PRODUKTENS ENDA IKON. Teckenförklaringen behövs de första gångerna och
   blir brus därefter — bakom ikonen finns den kvar för den som behöver den,
   utan att kosta plats varje dag. Inför inga andra ikoner. */
.byravy .infoknapp {
  width: 26px; height: 26px; border-radius: 50%;
  border: 1px solid var(--byravy-kant-stark); background: var(--byravy-yta);
  color: var(--byravy-text-svag); font: italic 600 14px/1 Georgia, serif;
  cursor: pointer; display: inline-flex; align-items: center;
  justify-content: center; flex: none;
}
.byravy .infoknapp:hover { color: var(--byravy-bla); border-color: var(--byravy-bla); }
.byravy .infoknapp:focus-visible { outline: 2px solid var(--byravy-bla); outline-offset: 2px; }
.teckenlista { display: flex; flex-direction: column; gap: 9px; font-size: 13.5px; }
.teckenlista span { display: inline-flex; align-items: center; gap: 9px; }
.teckenlista .form { font-size: 10px; line-height: 1; }
.teckenlista .romb::before { content: "◆"; }
.teckenlista .prick::before { content: "●"; }
.teckenlista .swatch { width: 9px; height: 9px; border-radius: 50%; display: inline-block; }

/* ── Dialoger (v10) ────────────────────────────────────────────────────────
   ⚠️ SPEGLAR v10:s dialog-klasser. Formen bärs av plattformens befintliga
   modal (confirm-modal.js) — det här är innehållets struktur, inte en ny
   komponent: huvud med rubrik och konsekvenstext, kropp med fält, fot med
   Avbryt och den primära knappen. */
.byravy .dialog-huvud { padding: 16px 18px 4px; }
.byravy .dialog-huvud h3 { font-size: 15.5px; font-weight: 650; margin: 0 0 4px; }
.byravy .dialog-huvud p { font-size: 13px; color: var(--byravy-text-svag); margin: 0; }
.byravy .dialog-kropp { padding: 12px 18px 16px; display: flex; flex-direction: column; gap: 12px; }
.byravy .dialog .valj { width: 100%; }
.byravy .forhandsvisning {
  border: 1px solid var(--byravy-kant); border-radius: 7px; padding: 10px 12px;
  font-size: 13px; display: flex; flex-direction: column; gap: 5px; background: #fbfcfd;
}
.byravy .forhandsvisning .rad { display: flex; justify-content: space-between; gap: 12px; }
.byravy .forhandsvisning .rad span:last-child { color: var(--byravy-text-svag); }
.byravy .dialog-fot {
  display: flex; justify-content: flex-end; gap: 8px; padding: 12px 18px;
  border-top: 1px solid var(--byravy-kant); background: #fbfcfd;
}
.byravy .konsekvens { font-size: 12.5px; color: var(--byravy-text-svag); }

/* ⚠️ MOBILTAGGEN BÄR STATUS (v10). Utan färg och form slås byråns rött och
   lagens ihop så fort skärmen blir smal, och vyn tappar sin bärande premiss:
   "vi är sena" och "det kan ha kostat klienten pengar" ser likadana ut.
   Lagens rött är FYLLT (vit text på mörkröd botten), byråns en KONTUR på
   ljus botten — exakt som i cellen. */
.byravy .mobiltagg {
  display: inline-flex; align-items: center; gap: 5px; font-size: 12px;
  font-weight: 600; padding: 3px 8px; border-radius: 5px;
  border: 1px solid currentColor; white-space: nowrap;
  font-family: inherit; background: none; cursor: pointer;
}
.byravy .mobiltagg .form { font-size: 9px; }
.byravy .mobiltagg .nardatum { font-weight: 500; opacity: .85; }
.byravy .mobiltagg.lugn { color: var(--byravy-lugn); }
.byravy .mobiltagg.snart { color: var(--byravy-snart); background: var(--byravy-snart-yta); }
.byravy .mobiltagg.forsenad-byra { color: var(--byravy-byra); background: var(--byravy-byra-yta); }
.byravy .mobiltagg.forsenad-lag { color: #fff; background: var(--byravy-lag); border-color: var(--byravy-lag); }
.byravy .mobiltagg.klar { color: var(--byravy-klar); }
.byravy .mobilinget { font-size: 12.5px; color: var(--byravy-text-svagast); }
/* ⚠️ Avstämningsraden i mobilkortet (etapp 3) — samma knapp som i tabellen,
   med tummens storlek. */
.byravy .mobilavst { display: flex; align-items: center; gap: 8px; margin-top: 8px; flex-wrap: wrap; }
.byravy .mobilavst-etikett { font-size: 12.5px; color: var(--byravy-text-svag); }
.byravy .mobilavst .avstrad { margin-top: 0; min-height: var(--tap-target); font-size: 13px; }
/* ══ SLUT BYRÅVYN v9 ═══════════════════════════════════════════════════ */

/* ── Inkorgens avsändarvy: adress, avsändarrader, brevrader (PR 11b) ────────
   ⚠️ MARKUPEN BYGGS I 11c. CSS:en ligger här redan eftersom mobilbeteendet
   (v1 punkt 9) är MÄTT i test/browser/inkorg-avsandare-mobil.browser.test.ts
   vid 1440 / 641 / 639 / 375 px — och en mätning kräver en kaskad att mäta.
   Reglerna är inerta utan markup.

   ⚠️ Tokens ur .byravy-familjen, ingen ny visuell vokabulär. */
.inkorg-adressrad {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  padding: 14px 16px;
  border-bottom: 1px solid var(--byravy-kant);
  background: #fbfcfd;
}

/* ⚠️⚠️ ADRESSEN BRYTER MITT I STRÄNGEN, den rullar aldrig och huggs aldrig av.
   En avkortad adress är oanvändbar: den ska gå att LÄSA och KOPIERA, och
   `sjokvist.23746@underlag.mdrcons…` är varken. `anywhere` bryter även utan
   avstavningspunkt, vilket `break-word` inte gör i en lång sammansatt sträng. */
.inkorg-adress {
  font: 600 15px/1 ui-monospace, SFMono-Regular, Menlo, monospace;
  background: var(--byravy-yta);
  border: 1px solid var(--byravy-kant-stark);
  border-radius: 7px;
  padding: 9px 13px;
  color: var(--byravy-text);
  letter-spacing: -.01em;
  overflow-wrap: anywhere;
  min-width: 0;
}

.inkorg-avsandarrad {
  display: grid;
  /* ⚠️⚠️ minmax(0, …), INTE minmax(220px, …). Designens 220/240 px är MINIMI-
     bredder, och strax ovanför brytpunkten (641 px) summerar de plus knapparna
     till mer än viewporten — sidan började rulla vågrätt. Mätt: scrollWidth
     663 mot clientWidth 641. Med 0 som golv behåller kolumnerna sitt
     1:2-förhållande på breda skärmar men får krympa i stället för att spränga
     bredden, och innehållet bryter i stället (overflow-wrap nedan). */
  grid-template-columns: minmax(0, 1fr) minmax(0, 2fr) auto;
  gap: 14px; align-items: center; padding: 12px 16px;
  border-bottom: 1px solid var(--byravy-kant);
}
.inkorg-avsandarrad:last-of-type { border-bottom: none; }
.inkorg-avsandare { font-size: 14px; font-weight: 600; overflow-wrap: anywhere; min-width: 0; }
.inkorg-avsandare .avsnamn {
  display: block; font-weight: 400; font-size: 12px;
  color: var(--byravy-text-svagast); margin-top: 2px;
}
.inkorg-brev { font-size: 13px; color: var(--byravy-text); min-width: 0; }
.inkorg-brev .meta {
  display: block; font-size: 11.5px; color: var(--byravy-text-svagast); margin-top: 2px;
}
.inkorg-atgard { display: flex; gap: 8px; justify-content: flex-end; flex-wrap: wrap; }

.inkorg-brevlista { padding: 0 16px 12px; display: flex; flex-direction: column; gap: 6px; }
.inkorg-brevrad {
  display: grid; grid-template-columns: auto 1fr auto; gap: 12px; align-items: center;
  font-size: 12.5px; color: var(--byravy-text-svag); background: #fbfcfd;
  border: 1px solid var(--byravy-kant); border-radius: 6px; padding: 7px 11px;
}
.inkorg-brevrad b { color: var(--byravy-text); font-weight: 600; }
.inkorg-brevatgard { display: flex; gap: 14px; }

/* ⚠️ BARA DET SOM AVVIKER MÄRKS (v1 punkt 8). Det finns MED FLIT ingen grön
   "DKIM verifierad"-klass här: nästan alla brev klarar verifieringen, och ett
   märke på var och en är brus som bekräftar normalläget. Det omvända behövs —
   en godkänd avsändare vars brev inte kunde verifieras måste synas, annars
   läses raden som en okänd avsändare. */
.inkorg-overifierad {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 11px; font-weight: 650; padding: 1px 7px; border-radius: 4px;
  background: var(--byravy-byra-yta); color: var(--byravy-byra);
}

/* Miniatyren renderas på servern; klassen är bara en ram runt bilden. */
.inkorg-miniatyr {
  width: 34px; height: 44px; border: 1px solid var(--byravy-kant-stark);
  border-radius: 4px; background: #fff; flex: none;
  display: flex; align-items: center; justify-content: center;
  font-size: 9px; font-weight: 650; color: var(--byravy-text-svagast);
  letter-spacing: .04em; overflow: hidden; cursor: pointer;
}
.inkorg-miniatyr.ingen { border-style: dashed; cursor: default; }

@media (max-width: 640px) {
  .inkorg-adressrad { gap: 8px; flex-direction: column; align-items: stretch; }
  .inkorg-adress { font-size: 13px; padding: 8px 10px; width: 100%; line-height: 1.4; }
  /* ⚠️ Knapparna DELAR bredden i stället för att staplas — två fullbreda
     knappar under varandra gör raden dubbelt så hög utan att bli tydligare. */
  .inkorg-avsandarrad { grid-template-columns: 1fr; gap: 8px; padding: 14px 16px; }
  .inkorg-atgard { justify-content: flex-start; }
  .inkorg-atgard .btn, .inkorg-atgard .knapp { flex: 1; text-align: center; }
  .inkorg-brevrad { grid-template-columns: auto 1fr; }
  .inkorg-brevrad .inkorg-brevatgard { grid-column: 1 / -1; }
}

/* ── Avsändarvyns tillkommande delar (PR 11c) ─────────────────────────────
   CSS:en för adressraden, avsändarraderna och brevraderna kom i 11b; här
   tillkommer flikarna, verktygsraden och sidbilden. */
.inkorg-flikar {
  display: flex; gap: 2px; margin-bottom: 22px;
  border-bottom: 1px solid var(--byravy-kant);
}
.inkorg-flikar a {
  font-size: 13.5px; padding: 8px 14px;
  color: var(--byravy-text-svag); text-decoration: none;
  border-bottom: 2px solid transparent; margin-bottom: -1px;
}
.inkorg-flikar a.pa {
  color: var(--byravy-bla); border-bottom-color: var(--byravy-bla); font-weight: 600;
}
.inkorg-flikar a:hover { color: var(--byravy-text); }

.inkorg-verktygsrad {
  display: flex; gap: 10px; align-items: center; flex-wrap: wrap;
  padding: 11px 14px; border-bottom: 1px solid var(--byravy-kant); background: #fbfcfd;
}
.inkorg-hoger { margin-left: auto; display: flex; gap: 8px; align-items: center;
  font-size: 12.5px; color: var(--byravy-text-svag); }

/* ⚠️ Miniatyren visar en SERVERRENDERAD bild. Originalfilen når aldrig
   webbläsaren medan brevet är i karantän — se rutten. */
.inkorg-miniatyr img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* Dialogens sida: A4-proportion så en halvladdad bild inte hoppar. */
.inkorg-sida {
  width: 100%; aspect-ratio: 1 / 1.414; object-fit: contain;
  border: 1px solid var(--byravy-kant-stark); border-radius: 6px;
  background: #fff; display: block;
}

/* ⚠️⚠️ OFULLSTÄNDIGT ÄR INTE SAMMA SAK SOM OVERIFIERAT (PR 11d). Det ena
   handlar om avsändaren, det andra om leveransen: brevet kom fram men dess
   filer gjorde det inte. Egen färg — lagens mörkröda — eftersom ett underlag
   som saknas är allvarligare än en avsändare man inte kunnat styrka. */
.inkorg-ofullstandigt {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 11px; font-weight: 650; padding: 1px 7px; border-radius: 4px;
  background: var(--byravy-lag-yta); color: var(--byravy-lag);
  margin-left: 6px;
}

/* ⚠️⚠️ AVVISAD BILAGA ÄR ETT EGET LÄGE (PR 11c-forts). Den föll tidigare
   igenom till samma streckade "–" som "inga bilagor", och de två betyder
   motsatta saker: att avsändaren inte skickade något, respektive att hen
   skickade något vi inte tog emot. Byråns röda — det är ett underlag som
   saknas, men inget lagbrott. */
.inkorg-miniatyr.avvisad {
  border-style: dashed;
  border-color: var(--byravy-byra);
  color: var(--byravy-byra);
  background: var(--byravy-byra-yta);
  cursor: default;
}

/* ═══ FACITS CHIPS, FÄLT OCH SIFFERSTEG ════════════════════════════════════
 * docs/design/avstamning-omritning-v1.html. Reglerna ligger i components.css
 * eftersom den laddas SIST (app/layout.tsx:58-60) — samma klasser definieras
 * i style.css, och en ändring i fel fil ser rätt ut i en granskning och
 * ritar ingenting.
 */

/* ⚠️ CHIPSEN VAR REDAN PILLER. Det som ändras är storlek och kant: 36 px
 * höjd (tumnåbart utan att bli en knapp), 13 px text och kontrollkanten
 * --line-stark i stället för ytkanten --line. */
.filter-chip {
  padding: 6px 12px;
  min-height: 36px;
  font-size: 13px;
  border-color: var(--line-stark);
  display: inline-flex;
  align-items: center;
  gap: 7px;
}
/* ⚠️⚠️ TREDJE GÅNGEN SAMMA FÄLLA — och den här gången stod chipet synligt i
 * drift. «Tolkas (0)» stod kvar i verktygsraden i varje organisation utan
 * pågående tolkningar, trots att `chipDoljVidNoll` fanns just för att gömma
 * det. Regeln står nu i den samlade listan längst ned i filen, tillsammans med
 * de sju andra som VAKTEN hittade. Se test/browser/hidden-doljer.browser.test.ts. */

/* ⚠️⚠️ DEN HÄR REGELN SAKNADES HELT. Avstämningen och ROT/RUT-faktureringen
 * märker sitt valda chip med `is-active`, men den enda stylade aktiv-klassen
 * hette `filter-chip-active`. Det VALDA chipet såg alltså exakt ut som de
 * ovalda — i statusraden och i mobilväljaren, alltså på båda ställen där
 * valet är hela poängen. Facits `.chip.pa` är den saknade regeln. */
.filter-chip.is-active {
  background: var(--brand-light);
  border-color: var(--brand);
  color: var(--brand);
  font-weight: 600;
}
.filter-chip.is-active:hover {
  background: var(--brand-light);
  border-color: var(--brand);
}

/* ⚠️ FÄLT OCH VÄLJARE — facits `.valj`, `.falt` och `.sok`. Samma hörn som
 * knappen (8 px), samma kant, samma texthöjd; en rad med en knapp och ett
 * fält bredvid varandra ska läsas som en rad, inte som två sorters ting. */
.filter-select {
  border-radius: var(--radius-sm);
  border: 1px solid var(--line-stark);
  background: var(--paper);
  color: var(--text);
  font-family: var(--font-body);
  font-size: 13.5px;
  padding: 7px 10px;
  min-height: var(--tap-target);
}

/* ═══ FASTA SIFFERSTEG DÄR TAL JÄMFÖRS KOLUMNVIS ═══════════════════════════
 *
 * ⚠️ SKÄLET ÄR KOLUMNER AV TAL. Med proportionella siffror är 1 smalare än 8
 * (mätt i Schibsted Grotesk: 5,5 px mot 9,27 px vid 16 px), så belopp och
 * datum vandrar i sidled rad för rad och en kolumn slutar vara en kolumn.
 *
 * ⚠️⚠️ LÄRDOMEN FRÅN #930 STÅR KVAR: `font-variant-numeric` ÄRVS INTE IN I
 * FORMULÄRKONTROLLER. `button`, `input`, `select` och `textarea` får
 * webbläsarens egen typsnittsstil, och den nollställer egenskapen. Därför
 * står de UTSKRIVNA nedan — inte som `inherit` under en body-regel, utan med
 * värdet satt. Mätt i avstämningen: chipsens antal, sidknapparna och
 * sidstorleksväljaren stod kvar på `normal` medan varje cell runt dem hade
 * ändrats.
 *
 * ⚠️⚠️ REGELN LÅG PÅ `body` OCH VAR FÖR BRED — det var #930:s misstag, inte
 * typsnittets fel. RÄTTELSE AV EN FELAKTIG FÖRKLARING: här stod «Egenskapen
 * rör bara siffror; bokstäverna är oförändrade.» Det stämmer inte för
 * Schibsted Grotesk. Mätt i Chromium med den riktiga typsnittsfilen, vid
 * 16 px:
 *
 *              utan tnum    med tnum
 *   komma        4,25 px     10,16 px
 *   punkt        4,48 px     10,16 px
 *   kolon        4,48 px     10,16 px
 *
 * Typsnittets `tnum`-uppsättning byter alltså ut SKILJETECKNEN mot siffbreda
 * varianter. På body gav det luft kring kommat i «100,00 kr», kring punkten i
 * «info@provbolaget.se» och kring kolonet i «https://». (Fraunces är opåverkat.)
 *
 * ⚠️ EN KOMMENTAR SOM BESKRIVER FEL MEKANISM ÄR VÄRRE ÄN INGEN — den läses
 * som en förklaring och stoppar nästa felsökning innan den börjat. Den gamla
 * meningen kostade ett helt felsökningsvarv i #984.
 *
 * ⚠️ DET BREDA KOMMAT STANNAR I BELOPPSKOLUMNER, och det är avsiktligt: i en
 * kolumn där ALLA rader har det linjerar decimalerna, och det är hela skälet
 * till att funktionen finns. Det är i löptext den inte hör hemma.
 *
 * ⚠️ `.text-right` ÄR HUSETS KONVENTION FÖR NUMERISKA KOLUMNER, inte en
 * gissning: samtliga `data-label` på högerställda celler i public/js är
 * Belopp, Debet, Kredit, Total, À-pris, Moms, Antal, SKV-del, Kvar och
 * Kontosaldo. Vakten i test/browser/tabular-nums-rackvidd.browser.test.ts
 * håller listan ärlig.
 *
 * ⚠️ De ~20 enskilda `font-variant-numeric`-deklarationerna på egna klasser
 * (.kv-row__val, .plan-rad__belopp, .bokslut-avst .summa .tal m.fl.) står
 * kvar orörda — de var alltid rätt scopade. */
/* ⚠️⚠️ LISTAN ÄR MÄTT, INTE GISSAD. Första försöket bar bara `.text-right`
 * och formulärkontrollerna — och test/browser/avstamning-lasbarhet fällde med
 * sex röda: datumceller, saldon i kolumntopp och kolumnfot, pagineringens
 * räknare och markeringsfotens antal är alla VÄNSTERSTÄLLDA tal som förlorade
 * egenskapen. Det var vakten som gjorde sitt jobb, och raderna nedan är dess
 * svar. En yta som bär tal och saknas här ska läggas till med sitt skäl. */
.text-right,
.cell-amount,
.cell-belopp,
.cell-konto,
/* Numeriska kolumner enligt husets data-label-konvention (11–14 filer var). */
td[data-label="Datum"],
td[data-label="Konto"],
td[data-label="Nr"],
td[data-label="Verifikat"],
td[data-label="Artikelnr"],
/* Saldon och summor: kolumntopp, kolumnfot, markeringsfot. */
[data-saldotyp],
.avst-kolumn__topp strong,
.avst-kolumn__fot strong,
[data-markeringsfot] strong,
/* Plattformens pagineringsräknare — «1–50 av 231». */
.pagination__info,
button, input, select, textarea { font-variant-numeric: tabular-nums; }

/* ═══ AVSTÄMNINGEN — FACITS MÅTT ══════════════════════════════════════════
 * docs/design/avstamning-omritning-v1.html.
 *
 * ⚠️ ALLT HÄR ÄR SCOPAT TILL `.avst-vy`. Tabelltypografin, statusraden och
 * pagineringens knappar är HUSETS klasser; facit ritar dem bara för den här
 * vyn, och åtta andra vyer delar dem. En ändring av basklasserna hade varit
 * en plattformsändring förklädd till en vyomritning.
 *
 * ⚠️ FYRA REGLER SOM STOD HÄR UTGICK I COMMIT 1 och ägs nu av plattformen:
 * tabular-nums (två) och 12 px-radien på .card/.filter-select.
 */

/* ── Tabellen ──────────────────────────────────────────────────────────── */
.avst-vy .avst-kolumn table { font-size: 13.5px; }
.avst-vy .avst-kolumn thead th {
  font-size: 11px; text-transform: uppercase; letter-spacing: .05em;
  font-weight: 650; color: var(--muted-svag);
  padding: 9px 10px; background: var(--paper);
  border-bottom: 1px solid var(--line); white-space: nowrap;
}
.avst-vy .avst-kolumn tbody td { padding: 9px 10px; font-size: 13.5px; }
.avst-vy .avst-kolumn tbody tr:hover td { background: #fafbfc; }
.avst-vy .avst-kolumn .text-right { white-space: nowrap; }
/* Löpande saldo är underordnad information — raden läses på belopp. */
.avst-vy td[data-saldotyp] { color: var(--muted); }
.avst-vy .avst-verlank { color: var(--brand); font-weight: 600; }

/* ── KOLUMNBREDDER ─────────────────────────────────────────────────────────
 *
 * ⚠️⚠️ ROTORSAKEN TILL DEN LODRÄTA REMSAN. Tabellen är `table-layout: auto`
 * utan breddstyrning: webbläsaren ger varje kolumn sin MIN-CONTENT-bredd och
 * fördelar resten. Och eftersom textcellen bär `overflow-wrap: anywhere` är
 * dess min-content EN BOKSTAV — kolumnen kollapsar alltså till det smalaste
 * som är MÖJLIGT, inte till det som är läsbart. Mätt före: 52 px.
 *
 * ⚠️ `overflow-wrap: anywhere` ÄR INTE FELET. Det är rätt för en 38 tecken
 * lång sträng utan mellanslag — men bara när kolumnen HAR en bredd att bryta
 * inom. Utan bredd blir mjuk brytning teckenbrytning.
 *
 * MÖNSTRET: sifferkolumnerna krymper till sitt innehåll (`width: 1%` +
 * nowrap), textkolumnen tar allt som blir över (`width: 100%`).
 */
.avst-vy .avst-kolumn td[data-label="Text"],
.avst-vy .avst-kolumn th:nth-child(4) { width: 100%; }

/* ⚠️ `width: 1%` MED nowrap = krymp till innehållet. Utan nowrap bryter
 * cellen i stället, och 1 % blir bokstavligt. Datumet bröt på sina egna
 * BINDESTRECK — "2026-03-28" blev nio radhöjder högt. */
.avst-vy .avst-kolumn td[data-label="Datum"],
.avst-vy .avst-kolumn td[data-label="Verifikat"],
.avst-vy .avst-kolumn td[data-label="Belopp"],
.avst-vy .avst-kolumn td[data-saldotyp],
.avst-vy .avst-kolumn td[data-label="Status"] {
  width: 1%;
  white-space: nowrap;
}

/* ⚠️ MJUK BRYTNING, ALDRIG TECKENBRYTNING. `anywhere` bryter var som helst
 * NÄR DET BEHÖVS; `break-word` gjorde detsamma men är utfasad. Ordgränser
 * föredras alltid först — det är webbläsarens egen ordning. */
.avst-vy .avst-kolumn td[data-label="Text"] {
  white-space: normal;
  overflow-wrap: anywhere;
  word-break: normal;
  min-width: 140px;
}

/* ⚠️ TÄTARE VÅGRÄT LUFT I TABELLEN — 6 px i stället för 10. Med sex kolumner
 * är 4 px per sida × 12 kanter 48 px, och de går rakt av textkolumnen. */
.avst-vy .avst-kolumn thead th,
.avst-vy .avst-kolumn tbody td { padding-left: 6px; padding-right: 6px; }
.avst-vy .avst-kolumn thead th:first-child,
.avst-vy .avst-kolumn tbody td:first-child { padding-left: 14px; }
.avst-vy .avst-kolumn thead th:last-child,
.avst-vy .avst-kolumn tbody td:last-child { padding-right: 14px; }

/* ⚠️⚠️ SLÄPMÄRKET FÅR HAMNA UNDER DATUMET, MEN CELLEN BEHÅLLER `nowrap`.
 *
 * Mitt första försök satte `white-space: normal` på cellen och nowrap på
 * "allt utom chipet" — men DATUMET ÄR EN NAKEN TEXTNOD, och en väljare når
 * inte textnoder. Datumet bröt då på sina egna BINDESTRECK: «2026-03-28» blev
 * fyra radhöjder. Provet fällde det.
 *
 * Rätt grepp: cellen är `nowrap` (ärvs av textnoden), och chipet blir ett
 * BLOCK — ett blockelement bryter raden oavsett white-space. Chipet syns,
 * datumkolumnen förblir en rad bred, och bevarandekrav 3 från #930 håller. */
.avst-vy .avst-kolumn td[data-label="Datum"] .avst-slapmark {
  display: block; width: fit-content; margin-left: 0; margin-top: 2px;
}


/* ── Kolumnernas topp och fot ──────────────────────────────────────────── */
.avst-vy .avst-kolumn__topp,
.avst-vy .avst-kolumn__fot { padding: 12px 16px; background: var(--yta-svag); }
.avst-vy .avst-kolumn__ib { font-size: 12.5px; }
.avst-vy .avst-kolumn__ib strong { font-weight: 650; }
/* ⚠️ "IB saknas" är ett EGET LÄGE, inte ett tomt tal — samma form som
   bokslutsavstämningens `.ibsaknas`. Se beslut B5. */
.avst-vy .avst-ibsaknas {
  font-size: 11.5px; color: var(--warning-deep); background: var(--warning-soft);
  border-radius: 4px; padding: 2px 7px; white-space: nowrap; font-weight: 600;
}
.avst-vy .avst-kolumn__fot { font-size: 13px; color: var(--muted); }
.avst-vy .avst-kolumn__fot strong { color: var(--text); font-size: 15px; font-weight: 650; }

/* ── Saldoavvikelser (småfixar 2, S5) ──────────────────────────────────── */
/* En rad före dagens första rad: bruten saldokedja, eller ett hopp mot
 * föregående dags slutsaldo. Varningsgul som de släpande, men en hel rad. */
.avst-vy tr.avst-saldoavvikelse td {
  background: var(--warning-soft); color: var(--warning-deep);
  font-size: 12.5px; line-height: 1.4; padding: 6px 10px;
}
.avst-vy .avst-avvikelsemark { font-weight: 650; margin-right: 6px; }

/* ── Släpande poster ───────────────────────────────────────────────────── */
/* ⚠️ `--slapande`, INTE `--warning-soft`. De var samma färg fram till facit,
 * som flyttar varningsgulen till #fdf6e3 och behåller den här. */
.avst-vy tr.avst-slapande { background: var(--slapande); }
.avst-vy tr.avst-slapande:hover td { background: #fdf6dd; }
.avst-vy .avst-slapmark {
  font-size: 10.5px; font-weight: 650; color: var(--warning-deep);
  background: var(--paper); border: 1px solid var(--slapande-kant);
  border-radius: 4px; padding: 1px 5px; margin-left: 6px; white-space: nowrap;
}

/* ── Statusraden ───────────────────────────────────────────────────────── */
/* ⚠️ EGEN KLASS, INTE `.filter-bar`. Nio vyer delar filterraden och behåller
 * sin form; avstämningens statusrad är en variant med kortets padding och en
 * skiljelinje nedåt. */
.avst-statusrad {
  display: flex; gap: 10px; align-items: center; flex-wrap: wrap;
  padding: 12px 16px; border-bottom: 1px solid var(--line);
}
.avst-statusrad__hoger { margin-left: auto; }
.avst-antal { color: var(--muted); font-weight: 600; }
.filter-chip.is-active .avst-antal { color: var(--brand); }
/* Facits färgprick per läge — statusen syns innan man läser etiketten. */
.avst-prick { width: 8px; height: 8px; border-radius: 50%; display: inline-block; }
.avst-prick[data-lage="matchad"]  { background: var(--success-deep); }
.avst-prick[data-lage="diff"]     { background: var(--warning-deep); }
.avst-prick[data-lage="forslag"]  { background: var(--warning-deep); }
.avst-prick[data-lage="omatchad"] { background: var(--danger-deep); }
/* Avfärdad (0281) — grått, plattformens tokens. */
.avst-prick[data-lage="avfardad"] { background: var(--muted); }
/* Före avstämningsstart (0283) — samma grå, plattformens token. */
.avst-prick[data-lage="fore_start"] { background: var(--muted); }
.avst-avfardad-info { font-size: 12px; color: var(--muted); overflow-wrap: anywhere; }
.avf-etikett { display: block; font-size: 13px; font-weight: 600; color: var(--ink); margin-top: 14px; }
.avf-hjalp { font-size: 12.5px; color: var(--muted); margin: 8px 0 0; }
/* ⚠️ 220 px gäller BARA här — övriga sökfält rörs inte. */
.avst-sok { min-width: 220px; }

/* ── Mobilväljaren ─────────────────────────────────────────────────────── */
.avst-mobilvaljare {
  display: none; gap: 8px; padding: 10px 16px; border-bottom: 1px solid var(--line);
}

/* ── Ö-3-raden ─────────────────────────────────────────────────────────── */
/* ⚠️⚠️ PÅ KORTNIVÅ, OVANFÖR KOLUMNERNA. Den låg inuti bokföringskolumnen —
 * alltså i en av två kolumner som byter plats på mobil. Strecket kunde stå
 * kvar medan förklaringen låg i den dolda kolumnen, och ett streck utan
 * förklaring läses som noll. */
.avst-intetsaldo {
  display: flex; align-items: flex-start; gap: 8px; margin: 0;
  padding: 10px 16px; background: var(--warning-soft);
  border-bottom: 1px solid var(--line);
  font-size: 12.5px; color: var(--warning-deep);
}

/* ── Statuschipsen på raden ────────────────────────────────────────────── */
.avst-vy .avst-radatgard .status-chip {
  font-size: 11.5px; font-weight: 650; padding: 2px 8px;
}

/* ── Saldokontrollen ───────────────────────────────────────────────────── */
.avst-vy .avst-check-rad { padding: 12px 16px; font-size: 13.5px; }
.avst-vy .avst-check-ok   { background: var(--success-soft); color: var(--success-deep); }
.avst-vy .avst-check-diff { background: var(--warning-soft); color: var(--warning-deep); }
/* ⚠️ «Går inte att jämföra» är ett TREDJE läge, inte en avvikelse. Neutral
   färg med flit: ritas det som en varning letar läsaren efter ett fel i
   bokföringen, och felet ligger i uppgifterna. Se lib/avstamning/saldokontroll.ts. */
.avst-vy .avst-check-okand { background: var(--surface-alt); color: var(--muted); }
.avst-vy .avst-kontrollerad { font-size: 12.5px; }

/* ── Pagineringen ──────────────────────────────────────────────────────── */
.avst-vy .pagination { padding: 12px 16px; font-size: 13px; color: var(--muted); }
.avst-vy .pagination__page {
  min-width: 36px; min-height: 36px; padding: 0 8px;
  border: 1px solid var(--line-stark); border-radius: var(--radius-sm);
  background: var(--paper); font-size: 13px;
}
.avst-vy .pagination__page--active {
  background: var(--brand); border-color: var(--brand); color: var(--paper); font-weight: 650;
}
.avst-klampad {
  font-size: 12.5px; color: var(--warning-deep);
  display: inline-flex; align-items: center; gap: 5px;
}

/* ── Markeringsfoten ───────────────────────────────────────────────────── */
.avst-vy .avst-markeringsfot {
  padding: 12px 16px; gap: 14px;
  border-top: 2px solid var(--brand);
  box-shadow: 0 -4px 12px rgba(27, 36, 48, .06);
}
.avst-vy .avst-markeringsfot strong { font-size: 15px; }

/* ═══ AVSTÄMNINGENS KONTORAD ═══════════════════════════════════════════════
 *
 * Väljaren, metaraden och importknappen på en rad. Ersätter chipsraden, som
 * tog tre rader med sex konton och långa banknamn.
 *
 * ⚠️ METARADEN BÄR ANTALET. Det var chipsens enda unika uppgift; försvinner
 * den är väljaren en försämring, inte en förbättring.
 */
.avst-kontorad {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  background: var(--paper); border: 1px solid var(--line);
  border-radius: var(--radius); padding: 12px 16px; margin-bottom: 14px;
}
.avst-kontovalj { font-weight: 600; max-width: 100%; }
.avst-kontometa {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  font-size: 13px; color: var(--muted);
}
.avst-kontometa strong { color: var(--ink); }
.avst-kontolank { color: var(--brand); text-decoration: none; font-weight: 600; }
.avst-kontolank:hover { text-decoration: underline; }
/* ⚠️ `margin-left:auto` skjuter importknappen till kanten på breda skärmar
 * och släpper taget när raden bryts — se mobilblocket längst ned. */
.avst-kontorad__hoger { margin-left: auto; display: flex; gap: 8px; align-items: center; }

/* ═══ AVSTÄMNINGENS VERKTYGSRAD ════════════════════════════════════════════
 *
 * ⚠️⚠️ TVÅ GRUPPER, INTE EN BLANDAD RAD. Överst «vad som visas» (period,
 * oavstämt sedan, gränsvisning), under «vad man gör» (matcha, rapport,
 * kontrollera) — med den sparade inställningen bredvid den knapp den styr.
 * Förut låg en INSTÄLLNING som skriver till servern mitt bland fyra
 * HANDLINGAR, och de såg likadana ut.
 *
 * ⚠️ SKILJELINJEN ÄR EN LINJE, INTE EN RUTA. Två kort hade sagt att det är
 * två olika saker; en linje säger att det är två delar av samma verktyg.
 */
.avst-verktyg {
  background: var(--paper); border: 1px solid var(--line);
  border-radius: var(--radius); padding: 12px 16px; margin-bottom: 14px;
}
.avst-verktygsgrupp { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
.avst-verktygsgrupp + .avst-verktygsgrupp {
  margin-top: 10px; padding-top: 10px; border-top: 1px solid var(--line);
}
.avst-verktygsgrupp__hoger { margin-left: auto; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }

/* ⚠️ ETIKETTEN ÄR EN ETIKETT, INTE EN KNAPP. Versalerna och det lilla
 * graderade avståndet skiljer «Period» från de kontroller den namnger —
 * i den gamla raden hade `filter-bar__label` samma vikt som knapptexten. */
.avst-etikett {
  font-size: 12px; color: var(--muted); text-transform: uppercase;
  letter-spacing: .05em; font-weight: 650;
}
.avst-gransvisning { margin-left: auto; }

/* ⚠️⚠️ MÄRKNINGEN SÄGER ATT ÄNDRINGEN BESTÅR. «Tillåten datumskillnad»
 * skriver till servern och gäller nästa gång också; utan märkningen ser den
 * ut som ett filter man kan pilla på. */
/* ⚠️ KONSEKVENSTEXT — vad som GÄLLER, inte hur vyn fungerar. Den bryter till
 * en egen rad i gruppen (`flex-basis: 100%`) så att den läses som ett
 * påstående om inställningen, inte som ännu en kontroll bredvid den. */
.avst-konsekvens {
  flex-basis: 100%; font-size: 12.5px; color: var(--muted); margin-top: 2px;
}

.avst-instmark {
  font-size: 10.5px; text-transform: uppercase; letter-spacing: .05em;
  font-weight: 650; color: var(--muted); background: var(--cream-2);
  border-radius: 4px; padding: 2px 6px; white-space: nowrap;
}

/* ═══ AVSTÄMNINGENS TVÅ KOLUMNER ═══════════════════════════════════════════
 *
 * ⚠️⚠️ MOBILLÄGET DÖLJER INGENTING UTAN ERSÄTTNING. Lärdomen från #877: en
 * mediaregel som bara gömmer en kolumn ger en tom yta som ser lugn ut. Här
 * gäller därför BÅDA riktningarna samtidigt: under brytpunkten visas EN kolumn
 * i taget OCH väljaren som byter mellan dem tänds. Försvinner väljaren är
 * halva funktionen borta, och det är precis vad provet mäter.
 */
/* ⚠️⚠️ EN FOG, INTE ETT MELLANRUM. Kolumnerna var `<section>`-element med 16 px
 * luft mellan sig och såg ut att ligga UTANFÖR kortet, fast de låg i det. Med
 * 1 px fog mot rutnätets bakgrund läses de som två rutor av samma yta — samma
 * grepp som en tabellinje, och utan en extra ram runt vardera. */
.avst-kolumner {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1px;
  background: var(--line);
  align-items: stretch;
}
/* ⚠️ Utan `min-width: 0` spränger tabellen rutan. `background` behövs för att
 * fogen ska synas — utan den lyser rutnätets linjefärg genom hela kolumnen. */
.avst-kolumn { min-width: 0; background: var(--paper); display: flex; flex-direction: column; }
.avst-kolumn__topp,
.avst-kolumn__fot {
  display: flex; justify-content: space-between; align-items: baseline;
  gap: 12px; padding: 10px 14px;
}
.avst-kolumn__topp { border-bottom: 1px solid var(--line); }
.avst-kolumn__fot  { border-top: 1px solid var(--line); font-size: 14px; margin-top: auto; }
.avst-kolumn__topp h3 { font-size: 15px; margin: 0; }
/* ⚠️ `.avst-kolumn__ib` HADE INGEN CSS. Den bär kolumnens ingående saldo och
 * stod bredvid ett `<strong>` som ÄR format — de två talen på samma rad hade
 * olika tyngd av en slump, inte av ett beslut. */
.avst-kolumn__ib { font-size: 12.5px; color: var(--muted); white-space: nowrap; }
.avst-kolumn__ib strong { color: var(--text); font-weight: 650; }

/* ⚠️⚠️ CHIP OCH ÅTGÄRD PÅ SAMMA RAD, HÖGERSTÄLLDA. Vid 900 px bröts knapparna
 * ned under chipet och raden blev dubbelt så hög — med femtio rader på
 * skärmen är det halva sidan. */
.avst-radatgard {
  display: flex; align-items: center; gap: 6px; justify-content: flex-end;
  flex-wrap: nowrap; white-space: nowrap;
}

/* ⚠️ RULLEN ÄR PER KOLUMN. Ett brett kontoutdrag får rulla i sin egen ruta —
 * aldrig spränga sidan, som då skulle rulla i sidled i sin helhet. */
.avst-rulle { overflow-x: auto; max-width: 100%; }

/* Släpande poster ur en tidigare period — får inte se ut som nya.
 *
 * ⚠️ `--slapande-bg` FANNS INTE. Skrivningen såg ut som en token med fallback;
 * i praktiken var #fffbeb själva färgen. `--warning-soft` ÄR #fffbeb — bytet
 * är alltså pixelidentiskt och gör bara att färgen får ett namn i systemet.
 *
 * ⚠️ FÄRGEN LIGGER PÅ RADEN, inte på cellerna. En `<tr>`-bakgrund målas bakom
 * genomskinliga `<td>` — det syns, men går bara att MÄTA på raden. */
.avst-slapande { background: var(--warning-soft); }
.avst-slapmark { font-size: 11px; }

/* ⚠️ Ö-3: strecket när saldot inte kan visas. Förklaringen står i
 * .avst-saldoskal ovanför tabellen — ett streck utan förklaring läses som
 * noll, och noll är ett belopp. */
.avst-intet-saldo { color: var(--muted); }
.avst-saldoskal { padding: 8px 14px; margin: 0; }

.avst-markering { width: 36px; }
.avst-markeringsfot {
  position: sticky; bottom: 0; z-index: 5;
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap;
  /* ⚠️ `--card-bg` FANNS INTE — #fff var färgen. `--paper` är #ffffff. */
  padding: 10px 14px; background: var(--paper);
  border-top: 2px solid var(--line);
}

/* ⚠️ VÄLJAREN FINNS BARA UNDER BRYTPUNKTEN — över den syns båda kolumnerna
 * och den vore ett val utan innebörd. */
.avst-mobilvaljare { display: none; }

/* ⚠️⚠️ 760 PX, INTE 640 — EN BRYTPUNKT, INTE TVÅ.
 *
 * Kolumnerna staplade vid 640 medan tabellerna blev radkort redan vid 760
 * (husets `.data-table--stack`). I bandet 641–760 gällde alltså den ena
 * regeln men inte den andra: varje rad var ett KORT — ett format byggt för
 * full bredd, med etikett till vänster och värde till höger — inuti en
 * kolumn på halva skärmen. Mätt i provet: ~320 px vid 700, ~294 px vid 645.
 *
 * ⚠️ TALET ÄR HUSETS, INTE VYNS. 760 är där `.data-table--stack`,
 * pagineringen och modalerna redan byter form. Att flytta vyns egen regel
 * till samma tal är att sluta ha en egen brytpunkt — inte att införa en ny.
 *
 * ⚠️ FLIKRADEN LIGGER KVAR PÅ 640 (style.css). Den är en delad regel för
 * hela huset och byts mot en `<select>`, alltså en ersättning och inte en
 * försvinnande funktion. Att flytta den hade rört varje flikad vy.
 */
@media (max-width: 760px) {
  .avst-kolumner { grid-template-columns: 1fr; }
  .avst-mobilvaljare { display: flex; }
  /* ⚠️ EN KOLUMN I TAGET, och den andra är NÅBAR via väljaren ovan.
   * Markeringarna överlever bytet (de bor i JS, inte i DOM), så en människa
   * kan markera på ena sidan, byta, och markera på den andra. */
  /* ⚠️ `data-visar` — behållarens TILLSTÅND. Den hette förr `data-mobilsida`,
   * samma namn som knapparnas HANDLING, och ett svep på attributet band då en
   * klicklyssnare på behållaren: varje klick inuti kolumnerna ritade om vyn
   * och åt upp markeringen. Ett namn, en betydelse. */
  .avst-kolumner[data-visar="bank"] .avst-kolumn[data-kolumn="bokforing"] { display: none; }
  .avst-kolumner[data-visar="bokforing"] .avst-kolumn[data-kolumn="bank"] { display: none; }
}

/* ══ REGELVERKET (#/bokforing/regler) ═══════════════════════════════════════
 *
 * ⚠️⚠️ ÅTTA VARIABLER ANVÄNDES HÄR UTAN ATT VARA DEFINIERADE, och en
 * odefinierad variabel UTAN fallback gör hela deklarationen ogiltig — webb-
 * läsaren kastar den TYST. `.plan-chip`, `.plan-vagran`, `.del-summa[data-ok]`
 * och `.regel-lage--aktiv` ritades alltså helt utan sina statusfärger, på den
 * flik man klickar sig till från avstämningen. De pekar nu om till befintliga
 * tokens (tokens.css) — inga nya färger, bara namn som finns.
 *
 * ⚠️ RÅ 8 px → var(--radius-sm). Samma tal, men nu med ett namn: regelverket
 * var den enda modulen som skrev sitt hörnmått rakt i regeln.
 *
 * ⚠️ REGELVERKET HAR INGEN MOCKUP. Det följer tokens och delade komponenter
 * och uppfinner ingen egen form.
 *
 * ⚠️ MOBILLÄGET DÖLJER INGENTING UTAN ERSÄTTNING. Det enda som byter FORM under
 * 760 px är tabellerna (.data-table--stack blir radkort, husets mönster) —
 * ingen kontroll försvinner. Promille-summan och förhandsgranskningens
 * kontering måste gå att läsa i alla bredder, och de radbryts i stället för att
 * skäras av.
 */

.regler-topp { display: flex; flex-wrap: wrap; gap: 12px; align-items: flex-end;
  justify-content: space-between; margin-bottom: 16px; }
.regler-topp__val { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; }
.regler-raderade { display: inline-flex; align-items: center; gap: 6px;
  font-size: 13px; color: var(--text-muted); }

.regel-lage { display: inline-block; padding: 2px 8px; border-radius: 999px;
  font-size: 12px; font-weight: 600; border: 1px solid transparent; }
/* ⚠️ TRE LÄGEN, TRE UTSEENDEN — inaktiv och raderad betyder olika saker. */
.regel-lage--aktiv   { background: var(--success-bg); color: var(--success-text); }
.regel-lage--inaktiv { background: var(--surface-alt); color: var(--text-muted);
  border-color: var(--border); }
.regel-lage--raderad { background: transparent; color: var(--text-muted);
  border-color: var(--border); text-decoration: line-through; }
.regler-tabell tr[data-lage="raderad"] .regel-namn { text-decoration: line-through;
  color: var(--text-muted); }
.regel-knappar { display: flex; flex-wrap: wrap; gap: 6px; }

.regler-kor { margin-top: 28px; padding-top: 20px; border-top: 1px solid var(--border); }
.regler-kor__knappar { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }

/* ── Förhandsgranskningen ─────────────────────────────────────────────────── */
.plan__topp { display: flex; flex-wrap: wrap; gap: 12px; align-items: center;
  justify-content: space-between; margin-bottom: 12px; }
.plan__chips { display: flex; flex-wrap: wrap; gap: 6px; }
.plan-chip { padding: 3px 10px; border-radius: 999px; font-size: 12px;
  background: var(--surface-alt); border: 1px solid var(--border); }
.plan__summa { font-size: 14px; }

/* ⚠️ VÄGRAN ÄR ETT BESKED, inte en tom lista. Posterna står kvar under den. */
.plan-vagran { display: flex; flex-direction: column; gap: 4px; padding: 12px 14px;
  margin-bottom: 12px; border-radius: var(--radius-sm);
  background: var(--warning-bg); border: 1px solid var(--warning-border);
  color: var(--warning-text); }

.plan__kor { display: flex; flex-wrap: wrap; gap: 10px; align-items: center;
  margin-bottom: 16px; }

.plan-lista { list-style: none; margin: 0; padding: 0;
  display: flex; flex-direction: column; gap: 8px; }
.plan-rad { border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 10px 12px;
  background: var(--surface); }
.plan-rad__topp { display: grid; gap: 8px; align-items: baseline;
  grid-template-columns: 100px 1fr auto 96px; }
.plan-rad__datum { font-variant-numeric: tabular-nums; color: var(--text-muted);
  font-size: 13px; }
.plan-rad__text { overflow-wrap: anywhere; }
.plan-rad__belopp { font-variant-numeric: tabular-nums; }
.plan-rad__utfall { font-size: 12px; font-weight: 600; text-align: right; }
.plan-rad__utfall--planerad      { color: var(--success-text); }
.plan-rad__utfall--konflikt      { color: var(--warning-text); }
.plan-rad__utfall--kontering_fel { color: var(--danger-text); }
.plan-rad__skal { margin-top: 6px; font-size: 13px; color: var(--text-muted);
  overflow-wrap: anywhere; }

.plan-kontering { margin-top: 8px; padding-top: 8px; border-top: 1px dashed var(--border); }
.plan-kontering__rubrik { font-size: 13px; color: var(--text-muted); margin-bottom: 6px;
  overflow-wrap: anywhere; }
.plan-kontering__huvud,
.plan-kontering__rad { display: grid; grid-template-columns: 1fr 110px 110px; gap: 8px; }
.plan-kontering__huvud { font-size: 12px; color: var(--text-muted); }
.plan-kontering__rad { font-variant-numeric: tabular-nums; }

/* ── Formuläret ───────────────────────────────────────────────────────────── */
.form-grid { display: grid; gap: 14px; grid-template-columns: repeat(3, minmax(0, 1fr));
  margin-bottom: 20px; }
.form-grid .field { display: flex; flex-direction: column; gap: 4px; }
.form-grid .field--bred { grid-column: 1 / -1; }
.del-tabell .input-sm { width: 100%; }

/* ⚠️ SUMMAN SYNS LÖPANDE och färgas efter om regeln går att spara. */
.del-summa { display: flex; flex-wrap: wrap; gap: 16px; align-items: center;
  margin-top: 12px; padding: 10px 14px; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--surface-alt); }
.del-summa[data-ok="1"] { border-color: var(--success-border); background: var(--success-bg);
  color: var(--success-text); }
.del-summa[data-ok="0"] { border-color: var(--warning-border); background: var(--warning-bg);
  color: var(--warning-text); }

.del-exempel { display: flex; flex-wrap: wrap; gap: 12px; align-items: baseline;
  margin-top: 10px; font-size: 13px; }
.del-exempel__rubrik { font-weight: 600; }
.del-exempel__post { font-variant-numeric: tabular-nums; }

.regel-retro { margin-top: 20px; padding: 12px 14px; border: 1px solid var(--border);
  border-radius: var(--radius-sm); }
.regel-retro legend { font-size: 13px; font-weight: 600; padding: 0 6px; }
.regel-retro label { display: block; margin: 6px 0; }

.form-actions { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 20px; }

@media (max-width: 760px) {
  /* ⚠️ FÄLTEN STAPLAS, de tas inte bort. */
  .form-grid { grid-template-columns: 1fr; }
  /* ⚠️ KONTERINGEN MÅSTE GÅ ATT LÄSA: kolumnerna krymper, raden består. */
  .plan-kontering__huvud,
  .plan-kontering__rad { grid-template-columns: 1fr 84px 84px; }
  .plan-rad__topp { grid-template-columns: 1fr auto; }
  .plan-rad__datum { grid-column: 1; }
  .plan-rad__utfall { text-align: left; }
}

@media (max-width: 480px) {
  .plan-rad { padding: 8px 10px; }
  .plan-kontering__huvud,
  .plan-kontering__rad { grid-template-columns: 1fr 72px 72px; font-size: 13px; }
  /* ⚠️ SUMMAN RADBRYTS I STÄLLET FÖR ATT SKÄRAS AV — den är hela skälet att
   * formuläret går att lita på. */
  .del-summa { flex-direction: column; align-items: flex-start; gap: 4px; }
}

/* ── Förhandsgranskningens filter och sidfot ─────────────────────────────── */
.plan-chip { padding: 3px 10px; border-radius: 999px; font-size: 12px;
  background: var(--surface-alt); border: 1px solid var(--border);
  color: var(--text); cursor: pointer; }
.plan-chip--vald { background: var(--brand); border-color: var(--brand); color: #fff; }

.plan-fot { display: flex; flex-wrap: wrap; gap: 12px; align-items: center;
  justify-content: space-between; margin-top: 14px; padding-top: 12px;
  border-top: 1px solid var(--border); font-size: 13px; }
.plan-fot__sidor { display: flex; gap: 8px; align-items: center; }
/* ⚠️ KLAMPNINGEN SYNS — den får inte tryckas undan när det blir trångt. */
.plan-fot__klamp { color: var(--warning-text); }

@media (max-width: 760px) {
  /* ⚠️ INGENTING DÖLJS: sidfoten staplas, den krymper inte bort sidbytet. */
  .plan-fot { flex-direction: column; align-items: flex-start; gap: 8px; }
}

/* ══ BOKSLUTETS AVSTÄMNING (v3) ═══════════════════════════════════════════════
 *
 * ⚠️⚠️ NAMNKROCKEN, IGEN. Det här är `public/js/pages/bokslut-avstamning.js` —
 * INTE kontoavstämningen i bokföringen (.avst-vy, #918–#930). Blocket ovan med
 * `.avst-flikar` / `.avst-underlag-*` tillhör också DEN HÄR sidan trots
 * prefixet; se varningen vid `.avst-ib-rad`.
 *
 * ⚠️⚠️ ALLT ÄR SCOPAT TILL `.bokslut-avst`. Facits klassnamn är avsiktligt
 * korta (.nr, .kalla, .chip, .rulle, .kort, .diff, .lage) och FEM av dem finns
 * redan i plattformen — mätt: .nr ×5, .kalla ×4, .rulle ×4, .chip ×1, .kort ×1.
 * Oscopade hade de rivit andra vyer. Namnen är identiska med facit; roten är
 * det som håller dem isär, samma lösning som .avst-vy fick i #930.
 *
 * ⚠️ INGA NYA FÄRGER. Varje token i facits :root finns redan i tokens.css med
 * IDENTISKT hexvärde — brand #2563eb, line #e5e8ee, muted #5b6776,
 * success-deep #2e7d51, warning-deep #8a6a08, danger-deep #b3402f, och
 * resten. Blocket använder var(), aldrig hex.
 *
 * ⚠️ tabular-nums SÄTTS ENSKILT PÅ button/input/select. Formulärkontroller
 * ärver INTE font-variant-numeric från sin förälder — fyndet i #930. Varje
 * kontroll som visar ett tal har därför sin egen deklaration.
 * ═══════════════════════════════════════════════════════════════════════════ */
.bokslut-avst .flikrad {
  display: flex; gap: 2px; border-bottom: 1px solid var(--line);
  margin-bottom: var(--space-4); flex-wrap: wrap;
}
.bokslut-avst .flikrad button {
  font: inherit; font-size: 14px; padding: 9px 16px; color: var(--muted);
  background: none; border: none; border-bottom: 2px solid transparent;
  margin-bottom: -1px; font-weight: 600; cursor: pointer;
  display: inline-flex; align-items: center; gap: 8px;
}
.bokslut-avst .flikrad button.pa { color: var(--brand); border-bottom-color: var(--brand); }
.bokslut-avst .flikrad .rakn {
  font-size: 12px; font-weight: 650; background: #eef1f5; color: var(--muted);
  border-radius: 999px; padding: 1px 8px; font-variant-numeric: tabular-nums;
}
.bokslut-avst .flikrad button.pa .rakn { background: var(--brand-light); color: var(--brand); }

/* ── sammanfattning: fyra rutor ── */
.bokslut-avst .summa {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 1px;
  background: var(--line); border: 1px solid var(--line); border-radius: var(--radius);
  overflow: hidden; margin-bottom: var(--space-4);
}
.bokslut-avst .summa > div { background: var(--paper); padding: 13px 16px; }
.bokslut-avst .summa .rubrik { font-size: 12px; color: var(--muted); margin-bottom: 3px; }
.bokslut-avst .summa .tal { font-size: 20px; font-weight: 650; font-variant-numeric: tabular-nums; }
.bokslut-avst .summa .under { font-size: 12px; color: var(--muted); margin-top: 2px; }
.bokslut-avst .summa .tal--ok   { color: var(--success-deep); }
.bokslut-avst .summa .tal--varn { color: var(--warning-deep); }
.bokslut-avst .summa .tal--fara { color: var(--danger-deep); }
/* ⚠️ EGEN BAKGRUND MED FLIT: "Avstämda med differens" är bokslutets viktigaste
 * siffra — ett medvetet beslut någon ska kunna hitta ett år senare. */
.bokslut-avst .summa div.markerad { background: var(--warning-soft); }

.bokslut-avst .kort {
  background: var(--paper); border: 1px solid var(--line);
  border-radius: var(--radius); overflow: hidden;
}
.bokslut-avst .verktyg {
  display: flex; gap: 10px; align-items: center; flex-wrap: wrap;
  padding: 11px 16px; border-bottom: 1px solid var(--line); background: #fbfcfd;
}
.bokslut-avst .chip {
  font: inherit; font-size: 13px; padding: 6px 12px; border-radius: 999px;
  border: 1px solid #cbd3dd; background: var(--paper); color: var(--text);
  cursor: pointer; display: inline-flex; align-items: center; gap: 7px; min-height: 36px;
  font-variant-numeric: tabular-nums;
}
.bokslut-avst .chip .antal { font-variant-numeric: tabular-nums; color: var(--muted); font-weight: 600; }
.bokslut-avst .chip.pa { background: var(--brand-light); border-color: var(--brand); color: var(--brand); font-weight: 600; }
.bokslut-avst .chip.pa .antal { color: var(--brand); }
.bokslut-avst .sok {
  font: inherit; font-size: 13.5px; padding: 7px 12px; border: 1px solid #cbd3dd;
  border-radius: var(--radius-sm); min-width: 200px; min-height: var(--tap-target);
}
.bokslut-avst .etikett {
  font-size: 12px; color: #8b95a6; text-transform: uppercase;
  letter-spacing: .05em; font-weight: 650;
}
.bokslut-avst .hoger { margin-left: auto; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.bokslut-avst .valj {
  font: inherit; font-size: 13.5px; padding: 7px 10px; border: 1px solid #cbd3dd;
  border-radius: var(--radius-sm); background: var(--paper); color: var(--text);
  min-height: var(--tap-target); font-variant-numeric: tabular-nums;
}

.bokslut-avst .rulle { overflow-x: auto; }
/* ⚠️ Bredd och grad sätts i colgroup-blocket längre ned — se rotorsaken där. */
.bokslut-avst table { border-collapse: collapse; width: 100%; }
.bokslut-avst th {
  text-transform: uppercase; letter-spacing: .04em; font-weight: 650;
  color: #8b95a6; text-align: left;
  border-bottom: 1px solid var(--line); white-space: nowrap; background: var(--paper);
}
.bokslut-avst th.tal, .bokslut-avst td.tal { text-align: right; }
.bokslut-avst td { border-bottom: 1px solid var(--line); vertical-align: middle; }
.bokslut-avst tbody tr:last-child td { border-bottom: none; }
.bokslut-avst tbody tr:hover td { background: #fafbfc; }
.bokslut-avst .tal { font-variant-numeric: tabular-nums; white-space: nowrap; }
.bokslut-avst .neg { color: var(--danger-deep); }
.bokslut-avst .svag { color: var(--muted); }
.bokslut-avst .kontocell .nr { font-weight: 650; font-variant-numeric: tabular-nums; }
.bokslut-avst .kontocell .namn { color: var(--muted); }

.bokslut-avst .forandring { display: inline-flex; align-items: center; gap: 6px; justify-content: flex-end; }
.bokslut-avst .forandring a {
  color: var(--brand); text-decoration: none; font-size: 11.5px;
  font-weight: 600; white-space: nowrap;
}
.bokslut-avst .forandring a:hover { text-decoration: underline; }

/* ⚠️ "IB saknas" är ett EGET LÄGE, inte ett tomt tal. Se beslut B4. */
.bokslut-avst .ibsaknas {
  font-size: 11.5px; color: var(--warning-deep); background: var(--warning-soft);
  border-radius: 4px; padding: 2px 7px; white-space: nowrap; font-weight: 600;
}
.bokslut-avst .diff { font-weight: 650; }
.bokslut-avst .diff--noll { color: var(--success-deep); }
.bokslut-avst .diff--fel  { color: var(--danger-deep); }

.bokslut-avst .lage {
  font-size: 11.5px; font-weight: 650; padding: 3px 9px; border-radius: 999px;
  white-space: nowrap; display: inline-flex; align-items: center; gap: 5px;
}
.bokslut-avst .lage--ostamd { background: #eef1f5; color: var(--muted); }
.bokslut-avst .lage--ok     { background: var(--success-soft); color: var(--success-deep); }
.bokslut-avst .lage--diff   { background: var(--warning-soft); color: var(--warning-deep); }
.bokslut-avst .lage--last   { background: var(--brand-light); color: var(--brand); }

.bokslut-avst .kalla {
  display: inline-flex; align-items: center; gap: 6px; font-size: 12px;
  color: var(--brand); background: var(--brand-light); border-radius: var(--radius-sm);
  padding: 4px 9px; white-space: nowrap; cursor: pointer;
  border: 1px solid transparent; font-weight: 600; font: inherit;
  font-size: 12px; font-variant-numeric: tabular-nums;
}
/* ⚠️ INGEN KNAPP SOM INTE KAN GÖRA NÅGOT. En källa utan fråga får ett låst
 * läge — samma princip som "Sköts av klienten" i byråvyn. */
.bokslut-avst .kalla--ingen { background: #f4f6f8; color: var(--muted); cursor: default; font-weight: 400; }
.bokslut-avst .kalla--manuell { background: #f0eaf8; color: #6b46a8; }
.bokslut-avst .radatgard { display: flex; gap: 6px; justify-content: flex-end; align-items: center; }

.bokslut-avst .skalrad {
  font-size: 12px; color: var(--warning-deep); background: var(--warning-soft);
  padding: 6px 10px 8px 10px; border-top: 1px dashed #e8dcae;
}
.bokslut-avst .skalrad b { font-weight: 650; }

.bokslut-avst .fot {
  display: flex; gap: 14px; align-items: center; flex-wrap: wrap;
  padding: 12px 16px; border-top: 1px solid var(--line); background: #fbfcfd; font-size: 13px;
}
.bokslut-avst .fot b { font-variant-numeric: tabular-nums; }

/* ── dialogernas innehåll (ritas i confirm-modalens kropp) ── */
.bokslut-avst-dialog .valrad,
.valrad {
  display: flex; align-items: center; gap: 10px; padding: 9px 11px;
  border: 1px solid var(--line); border-radius: var(--radius-sm);
  cursor: pointer; background: var(--paper);
}
.valrad:hover { border-color: var(--brand); }
.valrad.vald { border-color: var(--brand); background: var(--brand-light); }
.valrad .txt { flex: 1; min-width: 0; }
.valrad .txt b { display: block; font-size: 13.5px; }
.valrad .txt span { font-size: 12px; color: var(--muted); }
.valrad .bel { font-variant-numeric: tabular-nums; font-weight: 650; white-space: nowrap; }
.filruta {
  border: 1px dashed #cbd3dd; border-radius: var(--radius-sm); padding: 16px;
  text-align: center; font-size: 13px; color: var(--muted); background: #fbfcfd;
}
.underlagslista { display: flex; flex-direction: column; gap: 7px; }
.ulrad {
  display: flex; align-items: center; gap: 10px; font-size: 13px; padding: 7px 10px;
  background: #fbfcfd; border: 1px solid var(--line); border-radius: var(--radius-sm);
}
.ulrad .bel { margin-left: auto; font-variant-numeric: tabular-nums; font-weight: 650; }
.ulrad .ta { color: var(--danger-deep); cursor: pointer; font-size: 12px; background: none; border: none; font: inherit; }
.forhands {
  border: 1px solid var(--line); border-radius: 7px; padding: 10px 12px; font-size: 13px;
  display: flex; flex-direction: column; gap: 5px; background: #fbfcfd;
}
.forhands .rad { display: flex; justify-content: space-between; gap: 12px; }
.forhands .rad span:last-child { font-variant-numeric: tabular-nums; font-weight: 600; }
.konsekvens { font-size: 12.5px; color: var(--warning-deep); }

/* ── mobilkort under 760 px ── */
.bokslut-avst .mkort { padding: 12px 14px; border-bottom: 1px solid var(--line); }
.bokslut-avst .mkort:last-child { border-bottom: none; }
.bokslut-avst .mkort__topp {
  display: flex; justify-content: space-between; align-items: flex-start;
  gap: 10px; margin-bottom: 8px;
}
/* ⚠️ Kontonamnet får EGEN RAD i kortet. I dagens tabell klipps det med
 * text-overflow: ellipsis på 375 px — "1510 Kundfordr…". */
.bokslut-avst .mkort .kontocell { white-space: normal; }
.bokslut-avst .mrad { display: flex; justify-content: space-between; font-size: 13px; padding: 2px 0; gap: 10px; }
.bokslut-avst .mrad span:last-child { font-variant-numeric: tabular-nums; font-weight: 600; }
.bokslut-avst .mrad--diff { border-top: 1px solid var(--line); margin-top: 5px; padding-top: 6px; }
.bokslut-avst .mkort__atg { display: flex; gap: 8px; margin-top: 9px; }
.bokslut-avst .mkort__atg .btn { flex: 1; justify-content: center; }
.bokslut-avst .mobil { display: none; }
@media (max-width: 760px) {
  .bokslut-avst .rulle { display: none; }
  .bokslut-avst .mobil { display: block; }
  /* ⚠️⚠️ ELLIPSEN ÄR TABELLENS PROBLEM, INTE KORTETS. I tabellen konkurrerar
   * kontonamnet med åtta andra kolumner om bredden; i ett radkort har det
   * hela raden. Facit: "Kontonamnet klipps med ellips i dagens vy — här får
   * det egen rad." Utan den här regeln hade mobilläget ärvt en klippning det
   * inte har någon anledning till. */
  .bokslut-avst .mobil .kontocell .namn {
    white-space: normal; overflow: visible; text-overflow: clip;
  }
  .bokslut-avst .verktyg { padding: 10px 12px; }
  .bokslut-avst .chip { min-height: 32px; }
  .bokslut-avst .sok { min-width: 0; flex: 1 1 100%; }
}

/* ⚠️ BREDDTAK FÖR BOKSLUTETS AVSTÄMNING — och BARA för den.
 * Tabellen har nio kolumner och min-width 1060 px. Under `.content-max--wide`
 * (1200 px) fick vyn vågrät rullning på en 1920-skärm trots att bredden fanns.
 * De övriga sju bokslutsstegen delar 'wide' och rörs inte — samma hållning som
 * #930, där `.content-max--wide` lämnades orörd. Facit: min(1600px, 100%). */
.content-max--bokslut-avst { max-width: min(1600px, 100%); margin-inline: auto; }

/* ⚠️⚠️ ROTORSAKEN VAR `table-layout: auto`, INTE TAKET — och `width: 1%` var
 * en lindring av följden, inte en fix av orsaken.
 *
 * `width: 1%` ber auto-layouten om "så smal som innehållet tillåter", men
 * auto-layouten bestämmer fortfarande själv: den läser hela tabellens innehåll
 * och delar ut bredd efter min-content. Uppmätt EFTER #943 krävde tabellen
 * fortfarande 1167 px, medan skalet ger 1139 px vid 1440 (1440 − 220 px meny
 * − 2 × 32 px sidluft − rullist). Alltså 28 px vågrät rullning, varje dag.
 *
 * ⚠️ `table-layout: fixed` + colgroup tar ifrån auto-layouten beslutet: de åtta
 * smala kolumnerna får sina px ur facit och Konto tar resten. Då spelar det
 * ingen roll hur långt ett kontonamn är — det klipps i stället för att spränga
 * tabellen. Facit: 960 px krav på balanssidan, 820 på resultatsidan. */
.bokslut-avst table { table-layout: fixed; }
.bokslut-avst table.br { min-width: 960px; }
.bokslut-avst table.rr { min-width: 820px; }
.bokslut-avst col.c-konto    { width: auto; }
.bokslut-avst col.c-bel      { width: 104px; }
.bokslut-avst col.c-forandr  { width: 132px; }
.bokslut-avst col.c-underlag { width: 96px; }
.bokslut-avst col.c-status   { width: 104px; }
.bokslut-avst col.c-atg      { width: 120px; }
/* ⚠️ Resultatsidans procentkolumn — smalare än ett belopp, egen bredd i facit. */
.bokslut-avst col.c-procent  { width: 88px; }

/* ⚠️ TÄTHETEN. En avstämning läses radvis, inte styckvis: 12,5 px text och
 * 6 px lodrät luft i stället för 13,5 och 10. Rubrikerna är versaler och
 * behöver mindre grad än brödtexten för att inte dominera. */
.bokslut-avst table { font-size: 12.5px; }
.bokslut-avst th { font-size: 10.5px; padding: 7px 8px; }
.bokslut-avst td { padding: 6px 8px; }
.bokslut-avst .kontocell { min-width: 0; white-space: normal; }
/* ⚠️⚠️ ELLIPS KRÄVER BÅDA. `text-overflow: ellipsis` utan `overflow: hidden`
 * gör ingenting alls — texten rinner bara ut. Hela namnet ligger i cellens
 * `title`, så inget döljs utan ersättning. */
.bokslut-avst .kontocell .namn {
  font-size: 11.5px; display: block;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.bokslut-avst .forandring { gap: 5px; }
.bokslut-avst .forandring a { font-size: 11px; }
.bokslut-avst .ibsaknas { font-size: 11px; }
.bokslut-avst .lage { font-size: 11px; padding: 2px 8px; gap: 4px; }
.bokslut-avst .kalla { font-size: 11.5px; padding: 3px 8px; border-radius: 6px; gap: 5px; }
.bokslut-avst .radatgard { gap: 5px; }

/* ── Underlagspanelen (v4) ──────────────────────────────────────────────────
 * ⚠️⚠️ DE UPPLADDADE UNDERLAGEN SYNTES ALDRIG. Servern skickade dem hela
 * tiden; cellen visade bara vilken modul som KUNDE svara. Panelen är där de
 * blir läsbara — med belopp, härkomst och den summa som blir Förväntat. */
.bokslut-avst .ulpanel { background: #fbfcfd; border-top: 1px dashed #cbd3dd; }
.bokslut-avst .ulpanel td { padding: 9px 12px 11px; }
/* ⚠️ MOBILVARIANTEN ÄR EN DIV, INTE EN TABELLRAD. Innehållet är detsamma
 * (`ulPanelInnehall`), men höljet skiljer sig — en `<tr>` går inte att lägga i
 * ett radkort. Paddingen sitter därför här i stället för på en `<td>`. */
.bokslut-avst .ulpanel--mobil {
  padding: 9px 0 4px; margin-top: 6px; border-radius: 0;
}
/* ⚠️ Knapparna i kortets panel får tummenstorlek. `.btn--xs` är 26 px och
 * finns för TABELLRADER på en 1440-skärm — i ett radkort är det en yta man
 * missar. Tap-target-taket gäller här, inte där. */
.bokslut-avst .ulpanel--mobil .btn--xs { min-height: var(--tap-target); padding: 6px 12px; font-size: 13px; }
.bokslut-avst .ulpanel--mobil .ulatgarder { gap: 8px; }
.bokslut-avst .ulpanel--mobil .ulsumma { margin-left: 0; width: 100%; justify-content: space-between; }
/* ⚠️ "Ta bort" är en klickyta i ett kort man håller i handen — 11 px text med
 * noll padding är inte träffbar. */
.bokslut-avst .ulpanel--mobil .ulkort { padding: 9px 10px; }
.bokslut-avst .ulpanel--mobil .ulkort .ta { padding: 8px 4px; font-size: 12px; }
.bokslut-avst .ulpanel .rubrik {
  font-size: 11px; text-transform: uppercase; letter-spacing: .05em;
  font-weight: 650; color: #8b95a6; margin-bottom: 6px;
}
.bokslut-avst .ulkort {
  display: flex; align-items: center; gap: 9px; font-size: 12.5px;
  padding: 6px 9px; background: var(--paper); border: 1px solid var(--line);
  border-radius: 6px; margin-bottom: 5px; cursor: pointer;
}
.bokslut-avst .ulkort:hover { border-color: var(--brand); }
.bokslut-avst .ulkort .ikon {
  width: 26px; height: 32px; border-radius: 3px;
  background: var(--brand-light); color: var(--brand);
  display: flex; align-items: center; justify-content: center;
  font-size: 11px; font-weight: 650; flex: none;
}
/* ⚠️ `min-width: 0` — utan den vägrar en flexbarnruta krympa under sitt
 * innehåll, och ellipsen på filnamnet hade aldrig slagit till. */
.bokslut-avst .ulkort .txt { flex: 1; min-width: 0; }
.bokslut-avst .ulkort .txt b {
  display: block; font-weight: 600;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.bokslut-avst .ulkort .txt span { font-size: 11px; color: var(--muted); }
.bokslut-avst .ulkort .bel {
  font-variant-numeric: tabular-nums; font-weight: 650; white-space: nowrap;
}
.bokslut-avst .ulkort .ta {
  color: var(--danger-deep); font-size: 11px; white-space: nowrap;
  background: none; border: 0; cursor: pointer; font-family: inherit; padding: 0;
}
.bokslut-avst .ulkort .ta:hover { text-decoration: underline; }
/* ⚠️ FÖRRA PERIODENS UNDERLAG (etapp 3, mockup v1 §4) — streckade, med
 * kryssruta. Ett modulblad står med men är dämpat: det hämtas nytt. */
.bokslut-avst .ulpanel .rubrik + .rubrik,
.bokslut-avst .ulpanel .ulkort + .rubrik { margin-top: 10px; }
.bokslut-avst .ulkort--forra { background: #fbfcfd; border-style: dashed; }
.bokslut-avst .ulkort--forra .ikon { background: #eef1f5; color: var(--muted); }
.bokslut-avst .ulkort--modul { opacity: .62; cursor: default; }
.bokslut-avst .ulkort--modul:hover, .bokslut-avst .ulkort--redan:hover { border-color: var(--line); }
.bokslut-avst .ulkort--redan { cursor: default; }
.bokslut-avst .ulkort input { margin: 0; }

/* ── Svepet för oförändrade konton (etapp 3, mockup v1 §4) ─────────────────
 * ⚠️ Mockupens ljusblå kant och gula bakgrund finns inte som färger här — de
 * närmaste befintliga tokens används (brand-light, warning-soft, slapande-kant).
 * Inga nya färger. */
.bokslut-avst .svepband {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding: 11px 16px;
  background: var(--brand-light); border-bottom: 1px solid var(--line); font-size: 13px; color: var(--brand);
}
.bokslut-avst .svepband b { font-weight: 650; }
.bokslut-avst .svepband .hoger { margin-left: auto; }
.bokslut-avst .sveplista { display: flex; flex-direction: column; gap: 6px; }
.bokslut-avst .sveprad {
  display: grid; grid-template-columns: 22px minmax(0, 1fr) auto; gap: 4px 10px; align-items: start;
  padding: 8px 10px; border: 1px solid var(--line); border-radius: var(--radius-sm);
  background: var(--paper); font-size: 12.5px;
}
.bokslut-avst .sveprad .bock { font-weight: 700; color: var(--success-deep); text-align: center; }
.bokslut-avst .sveprad .kryss { font-weight: 700; color: var(--warning-deep); text-align: center; }
.bokslut-avst .sveprad .k { font-weight: 650; }
.bokslut-avst .sveprad .k span { font-weight: 400; color: var(--muted); }
.bokslut-avst .sveprad .bel { font-variant-numeric: tabular-nums; font-weight: 650; white-space: nowrap; }
.bokslut-avst .sveprad .vad { grid-column: 2 / 4; color: var(--muted); font-size: 12px; line-height: 1.45; }
.bokslut-avst .sveprad .vad em { font-style: normal; color: var(--text); }
.bokslut-avst .sveprad--ur { background: var(--warning-soft); border-color: var(--slapande-kant); }
.bokslut-avst .sveprad--ur .vad { color: var(--warning-deep); }
.bokslut-avst .fler {
  font-size: 12px; color: var(--muted); padding: 2px 10px; background: none; border: 0;
  text-align: left; cursor: pointer; font-family: inherit;
}
.bokslut-avst .fler:hover { text-decoration: underline; }
.bokslut-avst .ulatgarder {
  display: flex; gap: 8px; align-items: center; margin-top: 7px; flex-wrap: wrap;
}
.bokslut-avst .ulsumma {
  display: flex; gap: 12px; font-size: 12.5px; margin-left: auto;
  align-items: center;
}
.bokslut-avst .ulsumma b { font-variant-numeric: tabular-nums; }

/* ⚠️ Jämförelsen är TEXT, inte en väljare (v4). Den ska läsas som en
 * upplysning om vad procentkolumnen jämför mot — därför ingen versalisering
 * och ingen ram: den ser inte ut som något man kan trycka på, eftersom den
 * inte är det. */
.bokslut-avst .jamforelse {
  font-size: 12.5px; color: var(--muted);
}

/* ── Förhandsgranskning av ett underlag (v4) ────────────────────────────────
 * ⚠️⚠️ SIDAN RENDERAS PÅ SERVERN och kommer hit som en PNG. Originalfilen når
 * aldrig webbläsaren — samma regel som inkorgens karantän i #891. */
.bokslut-avst.dialogyta {
  position: fixed; inset: 0; z-index: 2000;
  background: rgba(27, 36, 48, .45);
  display: flex; align-items: center; justify-content: center;
  padding: 34px 20px; overflow-y: auto;
}
.bokslut-avst .dialog {
  background: var(--paper); border-radius: 10px; max-width: 520px; width: 100%;
  box-shadow: 0 12px 40px rgba(27, 36, 48, .25); overflow: hidden;
}
.bokslut-avst .dialog--bred { max-width: 760px; }
.bokslut-avst .dialog-huvud { padding: 16px 18px 4px; }
.bokslut-avst .dialog-huvud h3 { font-size: 15.5px; font-weight: 650; margin: 0 0 4px; }
.bokslut-avst .dialog-huvud p { font-size: 13px; color: var(--muted); margin: 0; }
.bokslut-avst .dialog-kropp {
  padding: 12px 18px 16px; display: flex; flex-direction: column; gap: 11px;
}
.bokslut-avst .dialog-fot {
  display: flex; justify-content: flex-end; gap: 8px; padding: 12px 18px;
  border-top: 1px solid var(--line); background: #fbfcfd; flex-wrap: wrap;
}
.bokslut-avst .preview {
  background: #eef1f5; border-radius: 8px; padding: 14px;
  display: flex; justify-content: center;
}
/* ⚠️ `aspect-ratio: 1/1.414` är A4. Rutan har samma form oavsett läge, så att
 * dialogen inte hoppar i höjd när hämtningen växlar till bild eller fel. */
.bokslut-avst .previewsida {
  background: #fff; width: 100%; max-width: 420px; aspect-ratio: 1 / 1.414;
  border: 1px solid var(--line); border-radius: 3px;
  box-shadow: 0 2px 10px rgba(27, 36, 48, .10);
  display: flex; align-items: center; justify-content: center;
  color: var(--muted); font-size: 12.5px; text-align: center; padding: 18px;
}
/* ⚠️⚠️ TRE LÄGEN, TRE UTSEENDEN. "Filen är borta" och "vi kunde inte rita
 * den" kräver olika åtgärder av användaren — den ena går att ladda ner ändå,
 * den andra inte. En gemensam grå ruta hade dolt vilken. */
.bokslut-avst .previewsida--hamtar { color: var(--muted); }
.bokslut-avst .previewsida--fel {
  border-color: #e8dcae; background: var(--warning-soft); color: var(--warning-deep);
}
.bokslut-avst .previewsida--saknas {
  border-color: #f0c8c0; background: var(--danger-soft); color: var(--danger-deep);
}
/* ⚠️ `img.previewsida` behöver object-fit, annars sträcks sidan till A4 även
 * när dokumentet är liggande. */
.bokslut-avst img.previewsida { object-fit: contain; padding: 0; background: #fff; }
.bokslut-avst .previewmeta {
  display: flex; gap: 16px; flex-wrap: wrap; font-size: 12.5px; color: var(--muted);
}
.bokslut-avst .previewmeta b { color: var(--text); font-variant-numeric: tabular-nums; }

/* ⚠️ SCOPAD MED FLIT. `.btn--xs` finns inte i plattformen, och en ny global
 * knappstorlek är ett större beslut än den här vyn ska fatta. Tap-target-taket
 * på 44 px gäller ytor man träffar med tummen — i en tabellrad på en
 * 1440-skärm är det just knapparna som gör raden hög. Mobilläget under 760 px
 * ritar radkort med fullstora knappar och rörs inte av den här regeln. */
.bokslut-avst .btn--xs {
  min-height: 26px; padding: 3px 8px; font-size: 11.5px;
}

/* ═══════════════════════════════════════════════════════════════════════════
 * BOKSLUTSPERIODER (etapp 2) — takraden, periodlistan och periodhuvudet.
 * ⚠️⚠️ FACIT ÄR docs/mockups/bokslutsperioder-v1.html §1. Värdena är
 * mockupens, px för px, och färgerna är dess tokens — inga nya.
 * ⚠️ Scopat som resten av vyn. `.btn--sm` finns inte i plattformen (den har
 * `.btn-sm`, 32 px); mockupens är 30 px och hör bara till den här vyn.
 * ═══════════════════════════════════════════════════════════════════════════ */
.bokslut-avst .btn--sm { min-height: 30px; padding: 4px 9px; font-size: 12px; }
.bokslut-avst .btn[disabled] { opacity: .5; cursor: not-allowed; }

.bokslut-avst .bokslutshuvud {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 12px;
}
.bokslut-avst .taktrad {
  font-size: 13px; color: var(--muted); display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
}
.bokslut-avst .taktrad b { color: var(--text); font-weight: 650; }
.bokslut-avst .lasikon {
  font-size: 11px; background: #eef1f5; color: var(--muted); border-radius: 4px;
  padding: 1px 6px; font-weight: 600;
}

.bokslut-avst .perioder-rulle { overflow-x: auto; margin: 0 0 18px; padding: 2px 2px 6px; }
/* ⚠️⚠️ TOLV RUTOR RYMS I VYNS 1141 PX VID 1440 (Dylans rättelse av mockupen):
 * minsta rutbredd 88 px, mellanrum 6 px — 12 × 88 + 11 × 6 = 1122 — och
 * ingen min-width på behållaren. Mockupens 92 px och min-width 1150 gav en
 * sidledsscroll på 31 px. Antalet kolumner sätts i vyn efter planen. */
.bokslut-avst .perioder { display: grid; grid-template-columns: repeat(12, minmax(88px, 1fr)); gap: 6px; }
.bokslut-avst .perioder--kort { grid-template-columns: 2.4fr repeat(4, 1fr); min-width: 0; max-width: 620px; }
.bokslut-avst .ptile {
  border: 1px solid var(--line); border-radius: 10px; background: var(--paper); padding: 8px 10px 9px;
  min-height: 78px; display: flex; flex-direction: column; gap: 2px; cursor: pointer; position: relative;
  border-top: 3px solid #cbd3dd; text-align: left; font: inherit; color: inherit;
}
.bokslut-avst .ptile:hover { border-color: var(--brand); }
.bokslut-avst .ptile .man { font-size: 13.5px; font-weight: 650; }
.bokslut-avst .ptile .st { font-size: 11.5px; font-weight: 650; display: flex; align-items: center; gap: 4px; }
.bokslut-avst .ptile .meta {
  font-size: 11px; line-height: 1.3; color: var(--muted); font-variant-numeric: tabular-nums;
}
.bokslut-avst .ptile--granskad { border-top-color: var(--brand); }
.bokslut-avst .ptile--granskad .st { color: var(--brand); }
.bokslut-avst .ptile--avstamd { border-top-color: var(--success-deep); }
.bokslut-avst .ptile--avstamd .st { color: var(--success-deep); }
.bokslut-avst .ptile--pagar { border-top-color: #9aa6b5; }
.bokslut-avst .ptile--pagar .st { color: var(--muted); }
/* ⚠️ GUL: slutad men inte avstämd efter påminnelsegränsen (mockup v1 §1, etapp 3). */
.bokslut-avst .ptile--sen { border-top-color: var(--warning-deep); background: var(--warning-soft); }
.bokslut-avst .ptile--sen .st { color: var(--warning-deep); }
.bokslut-avst .ptile--kommande {
  border-style: dashed; border-top-style: solid; border-top-color: var(--line);
  background: #fbfcfd; cursor: default;
}
.bokslut-avst .ptile--kommande:hover { border-color: var(--line); }
.bokslut-avst .ptile--kommande .man { color: var(--muted); font-weight: 600; }
.bokslut-avst .ptile--kommande .st { color: #8b95a6; font-weight: 600; }
.bokslut-avst .ptile.vald { outline: 2px solid var(--brand); outline-offset: 1px; }
.bokslut-avst .ptile .flagga {
  align-self: flex-start; margin-top: 3px; font-size: 10.5px; font-weight: 700; color: var(--warning-deep);
  background: var(--warning-soft); border-radius: 999px; padding: 0 7px; line-height: 17px; white-space: nowrap;
}
.bokslut-avst .stapel { height: 4px; border-radius: 2px; background: #eef1f5; margin-top: 4px; overflow: hidden; }
.bokslut-avst .stapel i { display: block; height: 100%; background: #9aa6b5; }

.bokslut-avst .periodhuvud { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin: 0 0 14px; }
.bokslut-avst .periodhuvud h2 { font-size: 18px; font-weight: 640; margin: 0; }
.bokslut-avst .periodhuvud .datum { font-size: 13px; color: var(--muted); font-variant-numeric: tabular-nums; }
.bokslut-avst .knappforklaring {
  font-size: 12px; color: var(--warning-deep); max-width: 36ch; text-align: right; line-height: 1.35;
}
@media (max-width: 640px) {
  .bokslut-avst .knappforklaring { text-align: left; }
}

/* ── balanskonton i en period (mockup v1 §2) ── */
.bokslut-avst .lage--andrad {
  background: var(--warning-soft); color: var(--warning-deep); border: 1px solid #e8dcae;
}
.bokslut-avst .andradrad {
  font-size: 12px; color: var(--warning-deep); background: #fffbeb;
  padding: 7px 10px 8px 10px; border-top: 1px dashed #e8dcae;
}
.bokslut-avst .andradrad .inre { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
.bokslut-avst .andradrad b { font-weight: 650; font-variant-numeric: tabular-nums; }
.bokslut-avst .andradrad a { color: inherit; font-weight: 650; }
.bokslut-avst .andradrad .btn { margin-left: auto; }
/* ⚠️ «Visa verifikaten» ritas inte i mockupen — bara länken. Listan får
 * radens egen text, utan ny färg. */
.bokslut-avst .verlista { margin-top: 5px; display: flex; flex-direction: column; gap: 2px; }
.bokslut-avst .verlista[hidden] { display: none; }
.bokslut-avst .verrad { font-variant-numeric: tabular-nums; }

/* ── resultatkonton i en period (mockup v1 §3) ──
 * ⚠️ En kolumn till (Ack. i år, 104 px) — kravet växer med den: v4:s 820 +
 * 104. Bredderna i övrigt är v4:s för de befintliga kolumnerna. */
.bokslut-avst table.rr.rr--period { min-width: 924px; }

/* ── granskningens bekräftelse (mockup v1 §5) ── */
.bokslut-avst .bekraftelse {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding: 11px 16px;
  border-radius: var(--radius); background: var(--success-soft); border: 1px solid #cfe6d8;
  color: var(--success-deep); font-size: 13.5px; margin: 0 0 16px;
}
.bokslut-avst .bekraftelse b { font-weight: 650; }
.bokslut-avst .bekraftelse a { color: inherit; font-weight: 650; }

/* ── inställningsdialogen (mockup v1 §6) ──
 * ⚠️ Dialogen ritas i plattformens modal (utanför vyn); innehållet bär
 * `.bokslut-avst` så att rutorna, etiketterna och konsekvensraden är vyns. */
.bokslut-avst.avst-installningar .dialog-kropp { padding: 12px 0 0; display: flex; flex-direction: column; gap: 11px; }
.bokslut-avst.avst-installningar .valrad input { margin: 0; flex: none; }
.bokslut-avst .valrad--av { cursor: not-allowed; opacity: .55; }
.bokslut-avst .valrad--av:hover { border-color: var(--line); }
.bokslut-avst .tips {
  font-size: 12.5px; color: var(--muted); background: #fbfcfd; border: 1px solid var(--line);
  border-radius: 7px; padding: 8px 11px;
}
.bokslut-avst .laslage {
  font-size: 12.5px; color: var(--text); background: #f4f6f8; border: 1px solid var(--line);
  border-left: 3px solid #8b95a6; border-radius: 0 7px 7px 0; padding: 9px 12px;
}
.bokslut-avst.avst-installningar .valj { width: 100%; }
/* ── utskriftsdialogen (mockup v1 §7, etapp 4) ── */
.bokslut-avst .kryssgrupp { display: grid; grid-template-columns: 1fr 1fr; gap: 6px 14px; font-size: 13px; }
.bokslut-avst .kryssgrupp label { display: flex; gap: 8px; align-items: center; }
.bokslut-avst .utkast {
  font-size: 12.5px; color: var(--warning-deep); background: var(--warning-soft);
  border-radius: 7px; padding: 8px 11px;
}
.bokslut-avst .utskriftfot { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.bokslut-avst .utskriftfot .svag { font-size: 12.5px; margin-right: auto; }
/* ── påminnelsesektionen i inställningsdialogen (mockup v1 §6, etapp 3) ── */
.bokslut-avst .delare { border-top: 1px solid var(--line); margin: 4px 0 0; padding: 14px 0 0; }
.bokslut-avst .mottagare { display: flex; flex-direction: column; gap: 6px; }
.bokslut-avst .mottagare label { display: flex; align-items: center; gap: 9px; font-size: 13px; }
.bokslut-avst .mottagare label span { color: var(--muted); font-size: 12px; }
.bokslut-avst .inline { display: inline-flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 13.5px; }
.bokslut-avst .falt {
  font: inherit; font-size: 13.5px; padding: 7px 10px; border: 1px solid #cbd3dd;
  border-radius: var(--radius-sm); background: var(--paper); color: var(--text);
  font-variant-numeric: tabular-nums; text-align: right;
}
.bokslut-avst .inline .falt { width: 64px; min-height: 34px; }

/* ── mobilläget under 760 px (mockup v1 §10) ──
 * Periodlistan blir en väljare, periodhuvudet ersätts av mobilhuvudet. */
.bokslut-avst .mhuvud {
  display: none; padding: 12px 14px; border-bottom: 1px solid var(--line);
  flex-direction: column; gap: 8px; background: #fbfcfd; margin-bottom: 14px;
}
.bokslut-avst .mhuvud .valj { width: 100%; }
.bokslut-avst .mhuvud .knappforklaring { text-align: left; max-width: none; }
.bokslut-avst .mandrad {
  font-size: 12px; color: var(--warning-deep); background: #fffbeb; border: 1px dashed #e8dcae;
  border-radius: 6px; padding: 7px 9px; margin-top: 8px;
}
@media (max-width: 760px) {
  .bokslut-avst .perioder-rulle,
  .bokslut-avst .periodhuvud { display: none; }
  .bokslut-avst .mhuvud { display: flex; }
}

/* ═══════════════════════════════════════════════════════════════════════════
   INSTÄLLNINGARNA — EN KORTFORM
   ⚠️⚠️ Ersätter fem rutnätssystem med fyra brytpunkter (480/560/600/768 px).
   Formen är: rubrik → undertext → fältrutnät → knapp sist och högerställd.
   Det sista var redan konsekvent i den gamla vyn och bevaras med flit.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ⚠️ Hänglås i flikraden: rollen syns FÖRE klicket, inte som ett 403 efteråt. */
.inst-flik-las { font-size: 11px; margin-left: 5px; }

.inst-kort {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 12px;
  margin-bottom: 16px;
  overflow: hidden;
}
.inst-kort__topp { padding: 16px 20px 0; }
.inst-kort__topp h3 { font-size: 14px; font-weight: 650; margin: 0 0 2px; }
.inst-kort__topp p  { font-size: 12.5px; color: var(--text-secondary); margin: 0; }
.inst-kort__kropp   { padding: 16px 20px; }
.inst-kort__fot {
  display: flex; align-items: center; gap: 10px;
  padding: 14px 20px;
  border-top: 1px solid var(--border);
  background: var(--surface-inset);
}
.inst-kort__fot .hoger { margin-left: auto; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }

/* ── Momsredovisningens kort som rader (moms-UI; facit moms-v2.html avsnitt 1–2).
   Rubriken står till vänster på desktop och ovanför fälten under 760 px. ── */
.moms-inst-rad {
  display: grid; grid-template-columns: 220px minmax(0, 1fr); gap: 10px 20px;
  padding: 14px 20px; border-top: 1px solid var(--border);
}
.moms-inst-rad:first-child { border-top: none; }
.moms-inst-rubr { font-size: 13px; font-weight: 650; padding-top: 6px; }
.moms-inst-rubr span { margin-left: 6px; font-size: 11.5px; font-weight: 400; color: var(--text-secondary); }
.moms-inst-knapp { margin-top: 8px; }
.moms-mini { border: 1px solid var(--border); border-radius: 8px; overflow-x: auto; background: var(--surface); }
.moms-mini__tom { margin: 0; padding: 10px 12px; }
.moms-mp-tabell { width: 100%; min-width: 560px; border-collapse: collapse; table-layout: fixed; font-size: 12.5px; }
.moms-mp-tabell col.c-mp { width: 120px; }
.moms-mp-tabell col.c-fr { width: 130px; }
.moms-mp-tabell col.c-atg { width: 160px; }
.moms-mp-tabell th {
  font-size: 10.5px; text-transform: uppercase; letter-spacing: .04em; font-weight: 650;
  color: var(--text-secondary); text-align: left; padding: 7px 10px; border-bottom: 1px solid var(--border); white-space: nowrap;
}
.moms-mp-tabell td { padding: 7px 10px; border-bottom: 1px solid var(--border); vertical-align: middle; }
.moms-mp-tabell tbody tr:last-child td { border-bottom: none; }
.moms-mp-tabell .svag { color: var(--text-secondary); }
.moms-radatgard { display: flex; gap: 5px; justify-content: flex-end; align-items: center; }
.btn.btn-xs { min-height: 26px; padding: 3px 8px; font-size: 11.5px; }
.moms-lasvarde { font-size: 14px; font-weight: 600; display: flex; gap: 10px; align-items: baseline; flex-wrap: wrap; }
.moms-lasvarde a { font-size: 12.5px; font-weight: 600; color: var(--brand); text-decoration: none; }
.moms-faltgrupp { display: flex; flex-direction: column; gap: 12px; }
.moms-faltrubrik { font-size: 12px; color: var(--text-secondary); margin-bottom: 4px; }
.moms-seg { display: inline-flex; border: 1px solid var(--line-stark); border-radius: 7px; overflow: hidden; }
.moms-seg label {
  position: relative; display: inline-flex; align-items: center; font-size: 13px; font-weight: 600;
  padding: 7px 14px; cursor: pointer; color: var(--text-secondary); min-height: 36px;
}
.moms-seg label + label { border-left: 1px solid var(--line-stark); }
.moms-seg label.pa { background: var(--brand-light); color: var(--brand); }
.moms-seg input { position: absolute; opacity: 0; pointer-events: none; width: 1px; height: 1px; left: 0; top: 0; }
.moms-resultat { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; font-size: 13px; margin-top: 2px; }
.moms-resultat b { font-variant-numeric: tabular-nums; font-size: 14px; }
.moms-varnruta {
  font-size: 12.5px; color: var(--warning-deep); background: var(--warning-soft);
  border: 1px solid #e8dcae; border-radius: 7px; padding: 9px 11px; line-height: 1.5;
}
.moms-varnruta b { font-weight: 650; }
.moms-konsekvens { font-size: 12.5px; color: var(--warning-deep); margin: 0; }
/* ── Rättelsen i momsvyn (moms-UI U4; facit moms-v2.html avsnitt 3). ── */
.moms-dekl-kort { padding: 0; overflow: hidden; }
.moms-dekl-kort__topp { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding: 16px 18px 0; }
.moms-dekl-kort__topp h2 { font-size: 19px; margin: 0; }
.moms-dekl-kort__topp .hoger { margin-left: auto; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.moms-dekl-fakta { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 10px 22px; padding: 12px 18px 14px; }
.moms-dekl-fakta .etikett {
  display: block; margin-bottom: 2px; font-size: 12px; color: var(--text-secondary);
  text-transform: uppercase; letter-spacing: .05em; font-weight: 650;
}
.moms-dekl-fakta .varde { font-size: 14px; font-weight: 600; font-variant-numeric: tabular-nums; }
.moms-dekl-fakta .under { font-size: 12px; color: var(--text-secondary); }
.moms-korstrip {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding: 9px 18px;
  background: #fffbeb; border-top: 1px dashed #e8dcae; font-size: 12.5px; color: var(--warning-deep);
}
.moms-korstrip[hidden] { display: none; }
.moms-korstrip b { font-weight: 650; }
.moms-korstrip-rad td { padding: 0 !important; }
.moms-korstrip-rad .moms-korstrip { border-top: none; border-bottom: 1px dashed #e8dcae; }
.moms-ve-tabell tr.ersatt td { color: var(--text-secondary); }
.moms-radatgard--start { justify-content: flex-start; flex-wrap: wrap; }
/* Märken och knappar bryts aldrig mitt i — tabellen rullar i sidled i stället (table-wrapper). */
.moms-dekl-kort .badge, .moms-ve-tabell .badge, .moms-historik-tabell .badge { white-space: nowrap; }
.moms-ve-tabell .moms-radatgard { flex-wrap: nowrap; }
.moms-historik-tabell th, .moms-historik-tabell td { padding-left: 8px; padding-right: 8px; }
/* Historikens åtta kolumner: knapparna i sista cellen staplas hellre än klipps. */
.moms-historik-tabell td:last-child .moms-radatgard { flex-wrap: wrap; justify-content: flex-end; }
.moms-historik-tabell td:last-child .btn { white-space: nowrap; }
.moms-ru-tabell { width: 100%; min-width: 560px; border-collapse: collapse; font-size: 12.5px; }
.moms-ru-tabell col.c-r { width: 58px; }
.moms-ru-tabell col.c-b { width: 120px; }
.moms-ru-tabell th {
  font-size: 10.5px; text-transform: uppercase; letter-spacing: .04em; font-weight: 650; color: var(--text-secondary);
  text-align: left; padding: 7px 10px; border-bottom: 1px solid var(--border); white-space: nowrap;
}
.moms-ru-tabell td { padding: 7px 10px; border-bottom: 1px solid var(--border); }
.moms-ru-tabell .tal { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.moms-ru-tabell .rnr { font: 12px/1 ui-monospace, SFMono-Regular, Menlo, monospace; font-weight: 650; }
.moms-ru-tabell tr.andrad td { background: #fffbeb; }
.moms-ru-tabell tr.andrad td.diff { color: var(--warning-deep); font-weight: 650; }
.moms-ru-tabell tr.r49 td { font-weight: 650; border-top: 1px solid var(--line-stark); border-bottom: none; }
.moms-forhands {
  border: 1px solid var(--border); border-radius: 7px; padding: 10px 12px; font-size: 13px;
  display: flex; flex-direction: column; gap: 5px;
}
.moms-forhands .rad { display: flex; justify-content: space-between; gap: 12px; }
.moms-forhands .rad span:last-child { font-variant-numeric: tabular-nums; font-weight: 600; text-align: right; white-space: nowrap; }
.moms-forhands .svag { color: var(--text-secondary); }
.moms-lasvarde .svag { color: var(--text-secondary); }
/* Dialogerna (ritas i confirm-modalens ram). */
.moms-dialog__huvud h3 { font-size: 15.5px; font-weight: 650; margin: 0 0 4px; }
.moms-dialog__huvud p { font-size: 13px; color: var(--text-secondary); margin: 0; }
.moms-dialog__kropp { padding: 12px 0 4px; display: flex; flex-direction: column; gap: 11px; }
.moms-dialog__fot { display: flex; justify-content: flex-end; gap: 8px; padding-top: 12px; align-items: center; flex-wrap: wrap; }
.moms-valrader { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.moms-valrader .valrad input { margin: 0; flex: none; }
.moms-datumfalt { display: flex; flex-direction: column; gap: 4px; }
.moms-datumfalt input { max-width: 200px; }
.moms-falttitel { font-size: 12.5px; font-weight: 600; }
.moms-fel { font-size: 12.5px; color: var(--danger-deep); }
.moms-falt--fel { border-color: var(--danger-deep) !important; background: #fffafa; }
@media (max-width: 760px) {
  .moms-inst-rad { grid-template-columns: 1fr; }
  .moms-inst-rubr { padding-top: 0; }
  .moms-valrader { grid-template-columns: 1fr; }
}

/* ⚠️ Fotens luft följer knappen ned på pekdon. Regeln måste stå EFTER basen:
   båda är enkla klasser, och den som kommer sist vinner — den första
   placeringen låg tusen rader tidigare i filen och gjorde ingenting. */
@media (pointer: fine) and (not (any-pointer: coarse)) {
  .inst-kort__fot { padding: 10px 20px; }
}

/* ⚠️ ETT rutnät, inte fem. auto-fit gör att kortet fyller sin bredd utan att
   någon behöver välja antal kolumner per kort — och kollapsar av sig självt
   utan en egen brytpunkt. */
.inst-faltrutnat { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 14px; }
.inst-faltrutnat--bred { grid-template-columns: 1fr; }

.inst-etikett { font-size: 12px; color: var(--text-secondary); font-weight: 600; display: block; margin-bottom: 4px; }

/* ⚠️⚠️ FÄLTHÖJDEN I EN DIALOG SÄTTS INTE HÄR. Den täta formulärrytmen (#430)
   ger ~32 px på desktop och 44 px på mobil, och den regeln är scopad till
   `.modal` med högre specificitet än en klass här. Ett försök att lägga
   `min-height` på fältrutnätet blir alltså en tredje åsikt som ändå förlorar —
   och den syns inte i CSS:en, bara i Chromium. Facit ritar 44 px överallt;
   avvikelsen är rapporterad, inte överskriven. */
.inst-hjalp   { font-size: 12px; color: var(--text-secondary); margin-top: 4px; }

/* ⚠️⚠️ JUSTERINGSREGELN, skriven som CSS så den går att peka på.
   Formulärfält vänsterställs ALLTID, även tal — man skriver från vänster, och
   ett högerställt inmatningsfält flyttar markören medan man skriver.
   I TABELLER högerställs bara belopp som jämförs kolumnvis; kontonummer och
   datum är identifierare, inte mängder, och står till vänster. */
.inst-kort input, .inst-kort select, .inst-kort textarea { text-align: left; }
th.belopp, td.belopp { text-align: right; }

/* ⚠️⚠️ tabular-nums SÄTTS PÅ ELEMENTET SJÄLVT. Egenskapen ärvs inte in i
   button/input/select — de har egen font-styling i webbläsarens UA-stylesheet.
   Det var felet i #930: siffrorna hoppade i sidled i en knapp trots att
   föräldern hade regeln. */
.inst-tal,
.inst-kort input.inst-tal,
.inst-kort select.inst-tal,
.inst-kort button.inst-tal { font-variant-numeric: tabular-nums; }

/* Rollmärke: «🔒 Endast ägare» i kortrubriken. */
.inst-rollmark {
  font-size: 11px; font-weight: 650; padding: 2px 8px; border-radius: 999px;
  white-space: nowrap; background: var(--surface-inset); color: var(--text-secondary);
  display: inline-flex; align-items: center; gap: 4px;
}
.inst-rollmark--last { background: #fdf6e3; color: #8a6a08; }

/* ── Tabellen inuti ett inställningskort ──────────────────────────────────
   ⚠️ EN tabellform på fliken, inte kortets egen. Kolumnbredderna kommer ur
   colgroup i markupen så att kolumnordningen och bredderna står på ETT ställe
   — den som läser tabellen ser dem, den som ändrar den behöver inte leta i
   CSS efter en :nth-child-regel. */
.inst-rulle { overflow-x: auto; }
.inst-tabell { border-collapse: collapse; width: 100%; font-size: 13px; table-layout: fixed; }

/* ── Periodstängningens spärr (#1051) — plattformens tokens, inga nya färger. ── */
.ps-poster { width: 100%; border-collapse: collapse; margin-top: 10px; font-size: 12.5px; }
.ps-poster td { padding: 3px 6px 3px 0; color: var(--text); white-space: nowrap; }
.ps-poster td.ps-text { white-space: normal; overflow-wrap: anywhere; color: var(--muted); }
.ps-poster td.ps-belopp { text-align: right; font-variant-numeric: tabular-nums; }
.ps-info { font-size: 12.5px; color: var(--muted); margin: 8px 0 0; }
.ps-overstyr textarea { resize: vertical; }
.ps-overstyrd { font-size: 12px; color: var(--muted); }
.inst-tabell th {
  font-size: 10.5px; text-transform: uppercase; letter-spacing: .04em; font-weight: 650;
  color: var(--text-secondary);
  text-align: left; padding: 9px 12px; border-bottom: 1px solid var(--border);
  white-space: nowrap; background: var(--surface);
}
.inst-tabell td { padding: 8px 12px; border-bottom: 1px solid var(--border); vertical-align: middle; }
.inst-tabell tbody tr:last-child td { border-bottom: none; }
.inst-tabell tbody tr:hover td { background: var(--surface-inset); }

/* ⚠️ Vinken i sista kolumnen är det som säger att raden går att klicka. Utan
   den ser tabellen ut som en utskrift, och «klicka på raden» blir en regel man
   måste ha blivit lärd. */
.inst-tabell tbody tr.inst-klickbar { cursor: pointer; }
.inst-tabell tbody tr.inst-klickbar:hover td { background: var(--brand-light); }
.inst-vink { font-size: 11.5px; }

/* Identifierare i en tabellcell: siffrorna står still, texten vänsterställd. */
.inst-standard { font-size: 11.5px; color: var(--text-secondary); white-space: nowrap; font-variant-numeric: tabular-nums; }
.inst-standard b { color: var(--text-primary); font-variant-numeric: tabular-nums; font-weight: 600; }

.inst-tabell .kol--konto      { width: 11%; }
.inst-tabell .kol--konto-bred { width: 14%; }
.inst-tabell .kol--nummer     { width: 22%; }
.inst-tabell .kol--bank       { width: 20%; }
.inst-tabell .kol--vink       { width: 17%; }
.inst-tabell .kol--vink-bred  { width: 24%; }

/* Standardmarkering i listan — samma märke som rollmärket, brand-färgat. */
.inst-rollmark--pa { background: var(--brand-light); color: var(--brand); }

/* Avdelare i en dialog: grupperar fälten utan att lägga en ram runt dem. */
.inst-avdelare {
  font-size: 11px; text-transform: uppercase; letter-spacing: .05em; font-weight: 650;
  color: var(--text-secondary); padding-top: 6px; margin: 18px 0 12px;
  border-top: 1px solid var(--border);
}
.inst-dialog-ingress { margin: 0 0 14px; }
.inst-kryssrad { display: flex; gap: 9px; align-items: center; font-size: 13.5px; margin-top: 9px; }
.inst-kryssrad input { width: auto; }

/* ⚠️ Under brytpunkten får tabellen skrolla i sin egen ruta — aldrig sidan.
   En vy där hela sidan går att dra i sidled tappar flikraden ur bild. */
/* ⚠️⚠️ TABELLER BLIR KORT PÅ MOBIL, inte hoptryckta tabeller. Kolumnerna
   staplas: rubriken som etikett, värdet bredvid. Etiketterna kommer ur
   tabellens eget huvud (tabell-kort.js) — ingen andra lista.

   ⚠️ INGENTING DÖLJS UTAN ERSÄTTNING: varje uppgift som står i en kolumn på
   desktop finns i kortet. Det var felet i #877, och det syns inte förrän någon
   letar efter något som inte är där.

   ⚠️ En tabell UTAN `--kort` (momskodsmatrisen) rullar i sidled i stället —
   fem celler per momskod staplas inte till något läsbart. */
@media (max-width: 768px) {
  .inst-tabell { table-layout: auto; min-width: 520px; }
  .inst-vink { display: none; }

  .inst-tabell--kort { min-width: 0; display: block; }
  .inst-tabell--kort thead { display: none; }
  .inst-tabell--kort tbody,
  .inst-tabell--kort tr { display: block; }
  .inst-tabell--kort tbody tr {
    border: 1px solid var(--border); border-radius: 8px;
    padding: 9px 11px; margin-bottom: 8px; background: var(--surface);
  }
  .inst-tabell--kort tbody tr:hover td { background: transparent; }
  .inst-tabell--kort td {
    display: flex; justify-content: space-between; align-items: baseline;
    gap: 10px; padding: 3px 0; border-bottom: none; text-align: left;
  }
  /* Etiketten till vänster, värdet till höger — samma form som plattformens
     .data-table--stack, så de två inte ser ut som två system. */
  .inst-tabell--kort td[data-label]::before {
    content: attr(data-label);
    color: var(--text-secondary); font-size: 11.5px; white-space: nowrap;
  }
  /* ⚠️ Första cellen är kortets rubrik och bär ingen etikett — namnet står
     redan där, och «Konto: 1930» ovanpå «1930» är brus. */
  .inst-tabell--kort td:first-child { display: block; padding-top: 0; }
  .inst-tabell--kort td:first-child::before { content: none; }
  .inst-tabell--kort .handelse b { font-size: 13px; }
  /* Ett fält i en cell tar hela bredden under sin etikett. */
  .inst-tabell--kort td:has(.inst-kontofalt),
  .inst-tabell--kort td:has(select) { display: block; }
  .inst-tabell--kort .inst-gruppr { padding: 0; border: none; background: none; margin: 10px 0 4px; }
  .inst-tabell--kort .inst-gruppr td { display: block; padding: 0; }

  /* ⚠️⚠️ KNAPPEN FYLLER BREDDEN och ligger kvar sist i kortet, som på desktop.
     Med TVÅ knappar i foten (Återställ + Spara) staplas de: två halvbreda
     knappar sida vid sida vid 375 px ger två träffytor som båda är för smala,
     och den primära ska vara den lätta att träffa. */
  .inst-kort__fot { flex-direction: column; align-items: stretch; }
  /* ⚠️ `align-items: stretch` ÄR det som ger full bredd — ett `width: 100%`
     bredvid är en andra regel som säger samma sak, och den som tar bort den
     ena tror att den andra räcker tills en mätning säger annat. En regel.
     ⚠️ column-REVERSE: den primära knappen står sist i tabbordningen men ska
     ligga överst där tummen är. */
  .inst-kort__fot .hoger {
    margin-left: 0; flex-direction: column-reverse; align-items: stretch;
  }
  .inst-kort__fot .hoger .btn { justify-content: center; }
}

/* Lägesmärke i en lista: «Aktiv» är ett tillstånd man läser, inte ett val. */
.inst-rollmark--ja { background: #ecf6f0; color: #2e7d51; }

/* ⚠️ Tät tabell — en rad per val, med fältet i cellen. Fälthöjden är 34 px
   här och inte 44: cellerna står under varandra i en lista man läser uppifrån
   och ner, och en 44-px-väljare per rad gör sju rader till en halv skärm.
   På mobil gäller plattformens träffyta igen (regeln nedanför). */
.inst-tabell--tat td { padding: 6px 12px; }
.inst-tabell--tat select {
  min-height: 34px; padding: 6px 9px; font-size: 13px; width: 100%;
}
@media (max-width: 760px) {
  .inst-tabell--tat select { min-height: var(--tap-target); font-size: 16px; }
}
.inst-tabell .kol--serieval { width: 32%; }

/* Modulnamnet står ensamt — ingen undertext som fördubblar radhöjden. */
.inst-tabell .handelse { min-width: 0; }
.inst-tabell .handelse b { font-weight: 600; display: block; }

/* Grupprubrik inuti en tabell — delar upp utan att bli sex tabeller. */
.inst-tabell .inst-gruppr { background: var(--surface-inset); }
.inst-tabell .inst-gruppr td {
  font-size: 10.5px; text-transform: uppercase; letter-spacing: .05em; font-weight: 650;
  color: var(--text-secondary); padding: 11px 12px 6px;
}
.inst-tabell .inst-gruppr:hover td { background: var(--surface-inset); }

/* Kontofältet i en tabellcell: kompaktare än ett formulärfält, och
   autocompletens lista behöver en positionerad förälder. */
.inst-kontofalt { position: relative; }
.inst-kontofalt input {
  font-size: 13px; padding: 6px 9px; min-height: 34px; width: 100%;
  border: 1px solid var(--line-stark); border-radius: 6px;
  font-variant-numeric: tabular-nums;
}
@media (max-width: 760px) {
  .inst-kontofalt input { min-height: var(--tap-target); font-size: 16px; }
}
.inst-tabell .kol--kontofalt { width: 26%; }
.inst-tabell .kol--standard  { width: 16%; }

/* ── Kontomappningar › Lön (lön etapp 1, 1a-i) ───────────────────────────
   ⚠️ Gruppnavigeringen hoppar till gruppen i samma tabell. Lön ritas efter
   tabellen som matris (per personalkategori) och två listor; fältet är samma
   kontosök som i resten av sidan. Inget tomt fält — «Förval» och «Ändrad». */
.km-gruppnav { display: flex; gap: 6px; flex-wrap: wrap; padding: 0 0 12px; }
.km-gruppnav:empty { display: none; }
.km-gruppnav a {
  font-size: 12.5px; color: var(--text-secondary); text-decoration: none; padding: 4px 10px;
  border-radius: 999px; border: 1px solid var(--line); background: var(--surface);
}
.km-gruppnav a.pa { color: var(--brand); border-color: var(--brand); background: var(--brand-light); font-weight: 600; }
.km-grupphuvud {
  padding: 14px 12px 6px; font-size: 10.5px; text-transform: uppercase; letter-spacing: .05em; font-weight: 650;
  color: var(--text-secondary); background: var(--surface-inset); border-top: 1px solid var(--line);
}
.km-undergrupp {
  padding: 12px 12px 4px; font-size: 13px; font-weight: 650;
  display: flex; gap: 10px; align-items: baseline; flex-wrap: wrap;
}
.km-konsekvens { font-size: 12.5px; font-weight: 400; color: var(--warning-deep); }
.km-matris, .km-lista { padding: 4px 12px 10px; }
.km-mrad {
  display: grid; grid-template-columns: 200px repeat(3, minmax(0, 1fr)); gap: 8px 12px;
  align-items: start; padding: 6px 0; border-bottom: 1px solid var(--line);
}
.km-mrad:last-child { border-bottom: none; }
.km-mrad--huvud { padding: 2px 0 4px; }
.km-mrad--huvud span {
  font-size: 10.5px; text-transform: uppercase; letter-spacing: .04em; font-weight: 650; color: var(--text-secondary);
}
.km-mrad .km-roll { padding-top: 8px; }
.km-roll { font-size: 13px; font-weight: 600; color: var(--text-primary); }
.km-cell { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.km-kat { display: none; font-size: 11px; color: var(--text-secondary); }
.km-lrad {
  display: grid; grid-template-columns: 200px minmax(0, 560px) minmax(150px, 1fr); gap: 8px 12px;
  align-items: center; padding: 6px 0; border-bottom: 1px solid var(--line);
}
.km-lrad:last-child { border-bottom: none; }
.km-std, .km-under { font-size: 11.5px; color: var(--text-secondary); font-variant-numeric: tabular-nums; }
.km-under:empty { display: none; }
.km-lonram { display: flex; align-items: center; gap: 7px; }
.km-lonram--andrad input { border-color: var(--warning-deep); }
.km-lonram--last input { border-style: dashed; color: var(--text-secondary); background: var(--surface-inset); }
.km-lonram--fel input { border-color: var(--danger-deep); }
.km-las { font-size: 11px; flex: none; }
.km-std:has(a), .km-under:has(a) { color: var(--warning-deep); }
.km-std a, .km-under a { color: inherit; font-weight: 650; }
.km-under--fel { color: var(--danger-deep); }
@media (max-width: 760px) {
  .km-mrad { grid-template-columns: 1fr; }
  .km-mrad--huvud { display: none; }
  .km-mrad .km-roll { padding-top: 4px; }
  .km-kat { display: block; }
  .km-lrad { grid-template-columns: 1fr; }
}

/* Momsmatrisens tvåradiga huvud: grupprubriken spänner intäktskolumnerna. */
.mk-th--botten { vertical-align: bottom; }
.mk-th--grupp  { text-align: center; border-bottom: 1px solid var(--border); }
/* ⚠️ Matrisen är bred med flit — fem celler per momskod ÄR modellen. Den
   rullar i sin egen ruta i stället för att kolumner göms bort; en gömd kolumn
   är trettio fält som tyst inte går att nå. */
.mk-tabell { min-width: 900px; }

/* Ett värde som VISAS men inte går att ändra — samma höjd som ett fält bredvid,
   men utan ram: en ruta man inte kan skriva i ser ut som ett trasigt fält. */
.inst-lasvarde {
  font-size: 15px; font-weight: 600; padding: 8px 0; min-height: var(--tap-target);
  display: flex; align-items: center;
}

/* Paginering i en kortfot — samma sidknappar överallt i inställningarna. */
.inst-paginering { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; font-size: 12.5px; color: var(--text-secondary); }
.inst-sidknapp {
  font: inherit; font-size: 12.5px; min-width: 32px; min-height: 32px; padding: 0 8px;
  border: 1px solid var(--line-stark); background: var(--paper); border-radius: 6px;
  cursor: pointer; font-variant-numeric: tabular-nums;
}
.inst-sidknapp--pa { background: var(--brand); border-color: var(--brand); color: #fff; font-weight: 650; }
.inst-sidknapp[disabled] { opacity: .5; cursor: not-allowed; }
@media (max-width: 760px) {
  .inst-sidknapp { min-height: var(--tap-target); min-width: var(--tap-target); }
}
.inst-tabell .kol--period { width: 17%; }
.inst-tabell .kol--datum  { width: 22%; }

.inst-tabell .kol--modul { width: 26%; }
/* Kryssrutorna i modulförfrågan staplas — en per rad, inte som en radremsa. */
.modules-request-list { display: flex; flex-direction: column; gap: 7px; margin-top: 5px; }

/* Länkrad — en genväg som INTE är en inställning. Egen form med flit: den ska
   inte se ut som ett fält man fyller i. */
.inst-kort__kropp--lankar { padding: 0; }

/* Profilens «Inloggning» (inloggningssäkerheten commit 5): rader med text till
   vänster och knapp till höger; på smal skärm hamnar knappen under. Inga nya
   färger. */
.inloggning-rad {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; padding: 10px 0;
}
.inloggning-rad + .inloggning-rad { border-top: 1px solid var(--border); }
.inloggning-rad__namn { font-weight: 600; font-size: 13.5px; }
.inloggning-enheter { margin-top: 12px; border-top: 1px solid var(--border); padding-top: 12px; }
.inloggning-enheter__rubrik { font-size: 12.5px; color: var(--text-secondary); margin-bottom: 4px; }
.inloggning-enhetslista { list-style: none; margin: 0; padding: 0; }
@media (max-width: 600px) {
  .inloggning-rad { flex-direction: column; align-items: stretch; }
  .inloggning-rad .btn { justify-content: center; }
}
.inst-lankrad {
  display: flex; align-items: center; gap: 10px;
  padding: 12px 20px; border-bottom: 1px solid var(--border); font-size: 13.5px;
}
.inst-lankrad:last-child { border-bottom: none; }
.inst-lankrad .txt { flex: 1; min-width: 0; }
.inst-lankrad .txt b { font-weight: 600; display: block; }
.inst-lankrad .txt span { font-size: 12px; color: var(--text-secondary); }
.inst-lank {
  color: var(--brand); text-decoration: none; font-weight: 600; white-space: nowrap;
  min-height: var(--tap-target); display: inline-flex; align-items: center;
}
.inst-lank:hover { text-decoration: underline; }
@media (max-width: 760px) {
  .inst-lankrad { flex-wrap: wrap; }
}

/* Momsmatrisens fasta kolumner. De fyra intäktskolumnerna saknar bredd med
   flit och delar resten lika — de bär samma sorts värde. */
.mk-tabell .mk-kol--kod   { width: 170px; }
.mk-tabell .mk-kol--sats  { width: 64px; }
.mk-tabell .mk-kol--konto { width: 124px; }
.mk-tabell .mk-kol--aktiv { width: 64px; }

/* ⚠️ Betaldialogens sammanfattning — leverantör · belopp · förföll. Den är
   kontrollfrågan man stämmer av mot kontoutdraget, inte en rubriktext, och
   står därför i kroppen ovanför fälten. */
.modal .lf-betald-sammanfattning {
  margin: 0 0 var(--space-3);
}


/* ═══════════════════════════════════════════════════════════════════════════
   ⚠️⚠️ [hidden] MÅSTE VINNA — EN SAMLAD LISTA, OCH EN VAKT SOM HÅLLER DEN.

   `display: <något>` i en klassregel övertrumfar UA-stylets
   `[hidden] { display: none }`, för UA-stylet har lägst företräde. Ett element
   som markup eller JS satt `hidden` på ritas då ändå — och felet syns INTE i
   ett enhetsprov: `el.hidden` är true, alltså grönt, medan webbläsaren ritar
   elementet.

   ⚠️⚠️ TRE FÖREKOMSTER MED TVÅ DOKUMENTERADE VARNINGAR RÄCKTE INTE.
   `.btn[hidden]` (§ knappar) och filter-panelen (§25) bär båda en kommentar om
   precis det här — och ändå kom `.filter-chip` som tredje fall, synligt i
   drift. Kommentarer är inte vakter.

   ⚠️ VAKTEN: test/browser/hidden-doljer.browser.test.ts sveper markupen efter
   varje klass som skrivs tillsammans med `hidden`, renderar den i Chromium med
   de riktiga stilmallarna och kräver `checkVisibility() === false`. Den hittade
   SJU förekomster till utöver de tre kända — alla nedan.

   ⚠️ SKRIV REGELN HÄR när vakten fäller en ny klass. Det är billigare än att
   leta upp varje display-regel, och listan blir en läsbar uppräkning av det
   som annars är osynligt.
   ═══════════════════════════════════════════════════════════════════════════ */
.filter-chip[hidden],
.pagination__page[hidden],
.form-row[hidden],
.inst-kort__fot[hidden],
.attach-panel__dropzone[hidden],
.r-rotrut-panel[hidden] { display: none; }

/* ⚠️⚠️ E-FAKTURAFLIKENS FOT — «Hämtade från Crediflow. Senast 2026-01-08 09:15.»
   Utan den går en tom lista inte att skilja från en hämtning som slutat
   fungera, och Crediflow aviserar inte om något blir liggande. Foten är därför
   en upplysning som alltid står där, inte ett larm som kommer när det är för
   sent. */
.lfakt-hamtningsfot {
  padding: var(--space-2) var(--space-4);
  border-top: 1px solid var(--line);
  font-size: 12.5px;
  color: var(--muted);
}

/* ═══════════════════════════════════════════════════════════════════════════
   ⚠️⚠️ RADEDITORN PÅ MOBIL — KONTO PÅ EGEN RAD, DEBET OCH KREDIT DELAR EN.

   Reconen kallade radeditorn modulens trängsta punkt: fem kolumner varav två
   är belopp och en är ett kontofält med autocomplete-dropdown. Stack-läget gav
   redan ett kort per rad, men lade DEBET och KREDIT på var sin full bredd —
   två tal om högst åtta tecken som tog en halv skärm.

   ⚠️ KONTOFÄLTET BEHÖVER HELA BREDDEN, och det är mätt: dess lista låg 117 px
   utanför skärmen före #984. Det är därför konto står ensamt och beloppen
   delar — inte tvärtom.

   ⚠️ ORDNINGEN ÄR MARKUPENS. `flex-wrap` räcker; ingen `order`, som hade
   skrivit om läsordningen för skärmläsare utan att någon såg det.
   ═══════════════════════════════════════════════════════════════════════════ */
@media (max-width: 760px) {
  .lf-detail-page .data-table--rader.data-table--stack tbody tr {
    display: flex;
    flex-wrap: wrap;
    gap: var(--space-2);
  }
  /* Allt utom beloppen tar hela bredden. */
  .lf-detail-page .data-table--rader.data-table--stack tbody td {
    flex: 1 1 100%;
  }
  /* ⚠️ De två beloppen delar raden. `min-width: 0` krävs för att en flex-post
     med ett input-barn ska få krympa — utan den spränger de bredden och
     hamnar under varandra ändå. */
  .lf-detail-page .data-table--rader.data-table--stack tbody td.cell-belopp {
    flex: 1 1 calc(50% - var(--space-2));
    min-width: 0;
    /* ⚠️ Etiketten ÖVER talet, inte bredvid: «DEBET  2 330,00» på halva
       bredden lämnar ingen plats åt talet. */
    flex-direction: column;
    align-items: stretch;
    justify-content: flex-start;
    gap: 2px;
  }
  /* Borttagningsknappen får sin egen rad under beloppen. */
  .lf-detail-page .data-table--rader.data-table--stack tbody td.ver-edit-rm {
    flex: 1 1 100%;
  }
  /* ⚠️⚠️ OCH DÅ SKA DEN OCKSÅ FYLLA DEN, MED SITT NAMN.
     Mätt vid 375 px: cellen är 252 px av radens 270 — den tog redan en hel rad
     medan krysset använde 44 av dem. «×» ensamt säger inte vad som tas bort,
     och en rad man råkar radera är inte gratis att få tillbaka.
     ⚠️ `btn-icon` låser bredden till en kvadrat; den låsningen släpps här. */
  .lf-detail-page .data-table--rader.data-table--stack tbody td.ver-edit-rm .r-rm {
    width: 100%;
    gap: var(--space-2);
  }
  .lf-detail-page .data-table--rader.data-table--stack tbody td.ver-edit-rm .r-rm__text {
    display: inline;
  }
  /* ⚠️⚠️ KONTOFÄLTET FÅR HELA BREDDEN, och det är mätt: med etiketten BREDVID
     fältet (stack-läget lägger `KONTO` till vänster och innehållet till höger)
     blev inmatningen 92 px av kortets 270. Autocomplete-listan hänger under
     fältet och ärver dess bredd — det var den som låg 117 px utanför skärmen
     före #984. Etiketten flyttas därför OVANFÖR, som för beloppen. */
  .lf-detail-page .data-table--rader.data-table--stack tbody td.cell-konto {
    flex-direction: column;
    align-items: stretch;
    justify-content: flex-start;
    gap: 2px;
  }
}

/* ═══════════════════════════════════════════════════════════════════════════
   ⚠️⚠️ AUTO-RADERNA SOM TEXT — «Härleds automatiskt».

   Mätt vid 375 px: tre kort à 164 px = 492 px, sex inmatningsfält varav tre
   alltid tomma, alla med 44 px tryckyta åt något man inte kan trycka på.
   Ingenting läste dem som fält.

   ⚠️ EN RAD, INTE TVÅ KOLUMNER. «debet» och «kredit» står i etiketten före
   talet; med en kolumn per belopp behövs två varav en alltid är tom.
   ═══════════════════════════════════════════════════════════════════════════ */
.lf-detail-page .lf-autobox {
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  background: var(--surface-inset);
  padding: 2px var(--space-3);
  margin-bottom: var(--space-3);
}
.lf-detail-page .lf-autobox__rub {
  font-size: 10.5px;
  text-transform: uppercase;
  letter-spacing: .05em;
  font-weight: 650;
  color: var(--muted-svag);
  padding: var(--space-2) 0 2px;
}
.lf-detail-page .lf-autorad {
  display: flex;
  align-items: baseline;
  gap: var(--space-2);
  padding: 7px 0;
  border-top: 1px solid var(--line);
  font-size: var(--fs-sm);
}
.lf-detail-page .lf-autorad__konto {
  font-variant-numeric: tabular-nums;
  font-weight: 650;
  width: 46px;
  flex: none;
}
/* ⚠️ `min-width: 0` krävs för att `text-overflow` ska få verkan i en flexpost. */
.lf-detail-page .lf-autorad__namn {
  flex: 1;
  min-width: 0;
  color: var(--muted);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.lf-detail-page .lf-autorad__belopp {
  font-variant-numeric: tabular-nums;
  font-weight: 600;
  white-space: nowrap;
}
.lf-detail-page .lf-autorad__belopp i {
  font-style: normal;
  font-size: 10.5px;
  color: var(--muted);
  margin-right: 4px;
  text-transform: uppercase;
  letter-spacing: .04em;
}

/* ⚠️⚠️ SUMMARADEN — tre namngivna poster, inte ett snedstreck.
   «Summa debet» · «Summa kredit» · «Fattas i debet»/«Balanserad». Riktningen
   säger vad man ska göra; «Differens» sa bara att något var fel. */
/* ⚠️⚠️ SUMMORNA SIDA VID SIDA — den fråga man faktiskt ställer är «vilken sida
   saknar belopp», och den besvaras vågrätt.

   Staplade (mätt före: debet y=1203, kredit y=1227) tvingar ögat att jämföra
   VERTIKALT mellan två tal på olika rader. Bredvid varandra ser man direkt
   vilken sida som är kort.

   ⚠️ DIFFERENSRADEN STANNAR UNDER, på egen rad och full bredd: den är SVARET,
   de två ovanför är underlaget. Den bär dessutom riktningen («Fattas i debet»,
   #997) och är därför en mening, inte ett tal i en kolumn. */
.lf-detail-page .lf-konto-summa {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0 var(--space-4);
  border-top: 1px solid var(--line);
  padding-top: var(--space-2);
  font-size: var(--fs-sm);
}
.lf-detail-page .lf-summa__rad {
  display: flex;
  justify-content: space-between;
  gap: var(--space-3);
  padding: 2px 0;
}
.lf-detail-page .lf-summa__rad--diff {
  grid-column: 1 / -1;
}
/* ⚠️ PÅ SMALA SKÄRMAR STAPLAS DE IGEN. Två tal med sina etiketter under 375 px
   ger «Summa debet» och «2 475,18» på var sin rad ändå — och då är staplat
   ärligare än två hopklämda kolumner. Brytpunkten är mätt, inte vald: under
   520 px understiger kolumnen 160 px, vilket är smalare än det längsta
   beloppet plus sin etikett. */
@media (max-width: 520px) {
  .lf-detail-page .lf-konto-summa { grid-template-columns: 1fr; }
}
.lf-detail-page .lf-summa__rad strong {
  font-variant-numeric: tabular-nums;
}
/* ⚠️ Slutraden avskild och tyngre — den är svaret, de två ovanför är underlaget. */
.lf-detail-page .lf-summa__rad--diff {
  border-top: 1px solid var(--line);
  margin-top: var(--space-1);
  padding-top: 7px;
  font-weight: 650;
}


/* ⚠️⚠️ FOTEN I EN AUTOCOMPLETE-LISTA — «+ N till — skriv för att söka».
   Taket är 10 rader; en kontoplan har ~300 aktiva konton och en org kan ha
   hundratals leverantörer. Utan foten ser listan ut som HELA svaret, och den
   som söker ett konto längre ned tror att det saknas.
   ⚠️ Den är INTE ett alternativ: ingen `.konto-option`, inget `data-idx`, så
   tangentnavigering och mousedown-väljaren går förbi den. */
.konto-dropdown__fot {
  padding: 6px 10px;
  font-size: var(--fs-xs, 11.5px);
  color: var(--text-secondary);
  border-top: 1px solid var(--line);
  background: var(--surface-inset);
}


/* ══ VARNINGEN VID OSPARADE ÄNDRINGAR (public/js/lib/osparade-andringar.js) ══
   ⚠️⚠️ TRE KNAPPAR RYMS INTE PÅ EN RAD VID 375 px. Mätt i facit: «Lämna utan
   att spara» klipps av och sticker ut ur dialogen. */
.osparade__lista {
  margin: 0;
  padding: 10px 13px;
  list-style: none;
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  background: var(--surface-inset);
  font-size: var(--fs-sm);
}
.osparade__rad + .osparade__rad { margin-top: 4px; }

/* ⚠️ Radform på desktop: den farliga LÄNGST FRÅN «Spara», alltså längst till
   vänster, med luft emellan. `margin-right: auto` skjuter isär grupperna så att
   ett slarvigt klick nära «Spara» aldrig träffar «Lämna». */
.osparade__fot {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  flex-wrap: wrap;
}
.osparade__fot .osparade__lamna { margin-right: auto; }

@media (max-width: 480px) {
  /* ⚠️⚠️ EN KNAPP PER RAD, och ⚠️ DEN FARLIGA NEDERST — längst från tummen på
     en telefon som hålls i ena handen, och längst från «Spara» som ligger
     överst. `order` vänder ordningen utan att röra markupen, så
     tab-ordningen (som följer DOM) fortfarande börjar med den ofarliga. */
  .osparade__fot {
    flex-direction: column;
    align-items: stretch;
  }
  /* ⚠️ MÄTT VILKEN REGEL SOM BÄR STAPLINGEN: det är `align-items: stretch`
     ovan. Med `width: auto` här blev knapparna ändå 320 px breda och stod kvar
     en per rad. Bredden står kvar som hängslen för webbläsare som inte
     sträcker, men den är INTE det som gör jobbet — och det ska inte stå en
     osann motivering i en CSS-fil. */
  .osparade__fot .btn {
    width: 100%;
    justify-content: center;
    /* ⚠️ Ingen `white-space: nowrap` här — «Lämna utan att spara» ska få bryta
       hellre än att sticka ut ur dialogen. */
    white-space: normal;
  }
  .osparade__fot .osparade__lamna { margin-right: 0; order: 3; }
  .osparade__fot .osparade__stanna { order: 2; }
  .osparade__fot .osparade__spara  { order: 1; }
}


/* ══ BEHÖRIGHETER PER HANDLING — egen sida under Medlemmar (etapp 2) ═══════
   ⚠️ Facit v6. Färger ur tokens; --brand är #2563eb i båda. */
.beh-sida { padding: var(--page-pad-y) var(--page-pad-x); }
.beh-kort { overflow: hidden; }

.beh-topp {
  display: flex;
  align-items: center;
  gap: var(--space-3);
  padding: 14px 20px;
  border-bottom: 1px solid var(--line);
}
.beh-topp__namn { flex: 1; min-width: 0; }
.beh-topp__h { font-size: var(--fs-md); font-weight: 640; margin: 0; }
.beh-topp__epost { font-size: 12.5px; color: var(--text-secondary); margin: 1px 0 0; }
/* ⚠️ Rollmärket är en upplysning, inte en knapp — ingen hover, ingen pekare. */
.beh-mark {
  font-size: 11px; font-weight: 650; padding: 3px 10px; border-radius: 999px;
  background: var(--brand-light); color: var(--brand); flex: none;
}
.beh-mark--agare { background: var(--success-soft); color: var(--success-deep); }

.beh-rollrad {
  display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap;
  padding: 11px 14px; border: 1px solid var(--line); border-radius: var(--radius-sm);
  background: var(--surface-inset); margin-bottom: 14px; font-size: var(--fs-sm);
}
.beh-rollrad__hoger { margin-left: auto; display: flex; gap: var(--space-2); flex-wrap: wrap; }

/* ⚠️⚠️ TVÅ SPALTER MED break-inside: avoid, så att ett modulblock aldrig delas
   mitt itu. En modul vars kryss hamnar i nästa spalt är oläslig.
   ⚠️ Under 820 px EN spalt, samma block i samma ordning — ingen egen mobilform. */
.beh-spalter { column-count: 2; column-gap: 16px; }
@media (max-width: 820px) { .beh-spalter { column-count: 1; } }

.beh-mod {
  break-inside: avoid;
  border: 1px solid var(--line);
  border-radius: 10px;
  margin-bottom: 12px;
  overflow: hidden;
  background: var(--paper);
}
.beh-mod__topp {
  display: flex; align-items: center; gap: 11px;
  padding: 11px 14px; background: var(--surface-inset);
  border-bottom: 1px solid var(--line);
}
.beh-mod__topp b { font-size: 13.5px; flex: 1; }
.beh-mod__antal { font-size: 12px; color: var(--text-secondary); }
/* ⚠️ AVSTÄNGD MODUL: en RAD, inte ett tomt block. Kryssen DÖLJS, inte gråas —
   en gråad lista ser ut att gå att klicka på. */
.beh-mod--av .beh-mod__topp { background: #f4f6f8; border-bottom: none; }
.beh-mod--av .beh-mod__kropp { display: none; }
/* ⚠️ «Du saknar själv» — dämpad, men inte osynlig: den ska gå att läsa. */
.beh-mod--saknas { opacity: .72; }

.beh-mod__kropp { padding: 10px 14px 12px; }
.beh-rad { display: flex; align-items: center; gap: 10px; padding: 6px 0; font-size: 13px; }
.beh-rad + .beh-rad { border-top: 1px solid #f1f3f6; }
.beh-rad__txt { flex: 1; min-width: 0; }

.beh-vaxel {
  width: 40px; height: 23px; border-radius: 999px; background: #cbd3dd;
  position: relative; flex: none; cursor: pointer; border: none; padding: 0;
}
.beh-vaxel::after {
  content: ''; position: absolute; top: 2px; left: 2px;
  width: 19px; height: 19px; border-radius: 50%; background: var(--paper);
  transition: left .15s;
}
.beh-vaxel--pa { background: var(--brand); }
.beh-vaxel--pa::after { left: 19px; }
.beh-vaxel[disabled] { cursor: not-allowed; opacity: .6; }

.beh-kryss {
  width: 20px; height: 20px; border-radius: 5px; border: 1.5px solid #cbd3dd;
  background: var(--paper); flex: none; cursor: pointer; padding: 0;
  display: flex; align-items: center; justify-content: center;
  font-size: 13px; color: transparent;
}
.beh-kryss--pa { background: var(--brand); border-color: var(--brand); color: var(--paper); }
.beh-kryss[disabled] { background: #eef1f5; border-color: #dfe4ea; cursor: not-allowed; }

/* ⚠️ Låsraden: de redan grindade SYNS, i stället för att tigas om. */
.beh-last {
  display: flex; align-items: center; gap: 9px;
  padding: 8px 11px; background: #f4f6f8; border: 1px solid var(--line);
  border-radius: 7px; font-size: 12.5px; color: var(--text-secondary);
  margin-top: 8px;
}
.beh-last b { color: var(--text-primary); font-weight: 600; }

.beh-gransfall { margin-top: 8px; }
.beh-gransfall__val { display: flex; gap: var(--space-2); margin-top: 10px; flex-wrap: wrap; }

.beh-fot {
  display: flex; align-items: center; gap: var(--space-3);
  padding: 13px 18px; border-top: 1px solid var(--line);
  background: var(--surface-inset); flex-wrap: wrap;
}
.beh-fot__hoger { margin-left: auto; display: flex; gap: var(--space-2); align-items: center; }
.beh-foljd { margin-top: 14px; }

/* ── Operatörssökning på kundkortet (e-faktura) ─────────────────────────────
 *
 * ⚠️⚠️ TRE UTFALL SOM INTE FÅR SE LIKADANA UT. «Kunden finns inte i
 * Peppol-nätet» är det VANLIGA svaret för ett småföretag — inte ett fel. Målas
 * det rött lär sig användaren att ignorera även de riktiga felen.
 *   · traff → grön mjuk yta
 *   · tomt  → neutral yta (ett svar, inte ett problem)
 *   · fel   → röd, och bara då
 */
.kd-ef-sokutfall {
  margin-top: var(--space-3);
  padding: var(--space-3) var(--space-4);
  border-radius: var(--radius);
  border-left: 3px solid transparent;
  font-size: var(--fs-sm);
}
.kd-ef-sokutfall p { margin: 0 0 var(--space-2); }
.kd-ef-sokutfall p:last-child { margin-bottom: 0; }
.kd-ef-sokutfall--traff { background: var(--success-soft); border-left-color: var(--success-deep); }
.kd-ef-sokutfall--tomt  { background: var(--surface-inset); border-left-color: var(--border); }
.kd-ef-sokutfall--fel   { background: var(--danger-soft);  border-left-color: var(--danger-deep); }
/* ⚠️ Att ett ifyllt värde skrivs över är en VARNING även inne i en träff. */
.kd-ef-sokutfall__varning {
  color: var(--warning-deep);
  font-weight: 600;
}

/* ⚠️⚠️ «FÖRVALEN ÄR INTE SPARADE» — ETT BESKED, EN GÅNG.
 *
 * Ett ifyllt förval såg likadant ut som ett sparat val, och det var den bilden
 * som gjorde felet osynligt: bokföringen använde samma förval, men ingen kunde
 * se att ingenting var sparat.
 *
 * ⚠️ RADEN LIGGER I KORTETS FOT, INTE PÅ MODULRADERNA. Ett inline-märke efter
 * modulnamnet växte raden från 48 till 60 px på desktop och 124 till 147 på
 * mobil — mätt, och precis den fördubbling som vakten «MODULNAMNET STÅR
 * ENSAMT» finns för att stoppa.
 *
 * ⚠️ Dämpad med flit: en upplysning, inte ett fel. */
.inst-forvalsbesked {
  margin: var(--space-2) 0 0;
  font-size: var(--fs-sm);
  color: var(--text-secondary);
}

/* ── Lagerinställningarnas inköpskontolista ──────────────────────────────── */
/**
 * ⚠️ EN RAD PER KONTO, med väljaren bred och ×-knappen fast. Ett bolag bokför
 * varuinköp på flera konton samtidigt, så listan växer — och den ska vara
 * läsbar också när den innehåller ett halvdussin rader.
 */
.lf-inkop-rad {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  margin-bottom: var(--space-2);
}
/* ⚠️ `min-width: 0` på väljaren — utan den kan den inte krympa i en flexrad,
 *    och raden spränger sin behållare på smal skärm (samma fälla som #1028). */
.lf-inkop-rad select { flex: 1 1 auto; min-width: 0; }
.lf-inkop-rad .btn-icon { flex: 0 0 auto; }


/* ─── 61. Lagerinställningarna — omritning (#1039) ────────────────────────────
 *
 * ⚠️ Sex kort i stället för sju, uttagen som par, och bokslutets konton dämpade
 * när 97 %-regeln är av. Klasserna är scopade till sidan; inget här är en
 * plattformskomponent. */

/* ⚠️ Ett par: kontot brett, uttagsmomsen smal. Konto och moms hör ihop — sex
 *    enskilda fält fick det att se ut som dubbelt så mycket som det är. */
.lager-uttag-par {
  display: grid;
  grid-template-columns: 1fr 130px;
  gap: var(--space-3);
  align-items: end;
  margin-bottom: var(--space-2);
}
.lager-uttag-par:last-of-type { margin-bottom: 0; }
@media (max-width: 760px) {
  .lager-uttag-par { grid-template-columns: 1fr; }
}

/* ⚠️⚠️ DÄMPADE, INTE LÅSTA. Fälten är verkningslösa när regeln är av och ska
 *    säga det — men ett konto går att förbereda innan regeln slås på, och en
 *    spärr hade tvingat fram två besök. */
.lager-bokslut-konton {
  transition: opacity .15s;
}
.lager-bokslut-konton.ar-dampad { opacity: .5; }

.lager-kryss {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  font-size: var(--fs-body);
}

/* Valda inköpskonton — en rad per konto. */
.lager-inkop-vald {
  display: flex;
  align-items: center;
  gap: var(--space-2);
  padding: 6px 10px;
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  background: var(--surface-inset);
  font-size: var(--fs-sm);
  margin-bottom: 6px;
}
.lager-inkop-vald .nr {
  font-variant-numeric: tabular-nums;
  font-weight: 600;
  min-width: 38px;
}
.lager-inkop-vald .namn { flex: 1; min-width: 0; color: var(--text-secondary); }

/* ⚠️ `position: relative` så listan kan ligga absolut mot fältet. */
.lager-inkop-lagg { position: relative; margin-top: var(--space-2); }
.lager-inkop-lagg input { width: 100%; }

/* ⚠️⚠️ OVÄLJBAR RAD — tjänstekonton. Den VISAS, med skälet, och svarar genom
 *    att inte hända något. Att dölja den hade gjort det till en gåta varför
 *    4531 saknas. */
.konto-option.ar-ovaljbar {
  opacity: .55;
  cursor: not-allowed;
}
.konto-option.ar-ovaljbar:hover { background: transparent; }
.lager-inkop-skal {
  margin-left: auto;
  font-size: var(--fs-eyebrow);
  color: var(--text-muted);
  white-space: nowrap;
}

/* Följden av att listan grindar — sägs som följd, inte som regel. */
.lager-inkop-foljd { margin-top: var(--space-3); }

/* ─── 62. Kollapsad villkorslista — «allt uppfyllt» som EN rad ──────────────
 *
 * ⚠️⚠️ EN UPPFYLLD CHECKLISTA ÄR INGEN CHECKLISTA, DEN ÄR ETT SVAR. Tre gröna
 * bockar tar lika mycket plats som tre öppna frågor men bär en tiondel av
 * informationen — och de tränger ned det man faktiskt kom för att göra.
 * Kollapsad står svaret på en rad, och detaljerna finns kvar bakom ett klick.
 *
 * ⚠️ `<details>` OCH INTE EN EGEN VÄXEL. Elementet kan öppnas av webbläsarens
 * sidsökning, det är tangentbordsnåbart och skärmläsare läser upp dess
 * tillstånd. En knapp med `hidden` hade krävt att allt det byggdes om för hand.
 *
 * ⚠️⚠️ OCH BARA NÄR ALLT ÄR UPPFYLLT. En lista där något SAKNAS ska stå öppen:
 * den bär skälet till att knappen bredvid är otillgänglig, och att gömma det
 * gör ett svar till en gåta. Sidorna väljer alltså form efter tillstånd, och
 * den regeln bor hos dem — här bor bara utseendet.
 *
 * ⚠️ FLYTTAD HIT UR bokslut-arsredovisning.js:s injectStyles, där den var
 * privat. Vinstdispositionen behövde samma form, och en andra kopia hade glidit
 * isär från den första (lag 5). */
.chk-kollaps { margin-top: var(--space-4); }
.chk-kollaps > summary {
  list-style: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: var(--space-2);
  background: var(--success-soft);
  color: var(--success-deep);
  border: 1px solid var(--success-deep);
  border-radius: var(--radius);
  padding: var(--space-2) var(--space-3);
  font-size: var(--fs-sm);
  font-weight: 600;
}
/* ⚠️ Webbläsarnas egen triangel tas bort i BÅDA formerna — WebKit har sin egen
 *    pseudoklass, övriga följer ::marker. Bara den ena gav en dubbel pil. */
.chk-kollaps > summary::-webkit-details-marker { display: none; }
.chk-kollaps > summary::marker { content: ''; }
.chk-kollaps__ikon { font-weight: 700; flex-shrink: 0; }
.chk-kollaps__text { flex: 1; }
.chk-kollaps__chev { flex-shrink: 0; transition: transform .15s ease; }
.chk-kollaps[open] .chk-kollaps__chev { transform: rotate(90deg); }
.chk-kollaps__detaljer { padding: var(--space-2) 0 0; }

/* ⚠️ «Inte för inleverans» (0270) — märket på konteringsraden.
   Bannern döljer en avfärdad rad, så ångrandet måste bo någonstans som
   alltid syns. Raden den gäller är det stället. */
.lf-avfardad {
  display: inline-flex;
  align-items: center;
  gap: var(--space-1);
  color: var(--text-secondary);
  font-size: var(--fs-eyebrow);
}
.lf-avfardad__angra {
  font: inherit;
  color: var(--brand);
  background: none;
  border: none;
  padding: 0 2px;
  cursor: pointer;
}
.lf-avfardad__angra:hover { text-decoration: underline; }

/* ⚠️ BETALDIALOGENS FÖLJDBESKED — tre lägen, tre färger, ingen av dem röd.
   En delbetalning är inte ett fel, och «välj konto» är en uppmaning. Se
   public/js/lib/betalningsfoljd.js. */
.lf-foljd { margin-top: 6px; font-size: 12.5px; }
.lf-foljd--del  { color: var(--warning-deep); }
.lf-foljd--ores { color: var(--muted); }
.lf-foljd--diff { color: var(--warning-deep); }

/* ⚠️⚠️ DIFFERENSVALET — FRÅGAN RUTTEN STÄLLER, inte ett felmeddelande.
   Avgränsad med en linje och ett indrag så den syns som ett nytt steg i
   dialogen, men INTE i felfärg: den som betalar 60 kr för mycket har inte
   gjort något fel, hen har betalat en avgift systemet inte känner till.
   Se public/js/lib/betalningsdifferens-val.js. */
.betald-diffval {
  margin-top: 12px;
  padding-top: 12px;
  border-top: 1px solid var(--border);
}
.betald-diffval > .helper-text { margin: 0 0 8px; color: var(--warning-deep); }
/* ⚠️ Fälten får inte spränga dialogen vid 375 px — mätt i
   test/browser/betaldialog-mobil.browser.test.ts. */
.betald-diffval select,
.betald-diffval input { width: 100%; max-width: 100%; box-sizing: border-box; }

/* ⚠️ «Egen överföring» i avstämningens bankkolumn. Neutral med flit: det är en
   upplysning om var motparten ligger, inte en varning och inte ett klartecken.
   Se public/js/pages/avstamning.js och lib/avstamning/textkod.ts. */
.avst-overforing {
  background: var(--surface-inset);
  color: var(--muted);
  white-space: nowrap;
}
/* Ingående balans i valuta (0282) — plattformens tokens, inga nya färger. */
.vib-rad { font-size: 11.5px; color: var(--muted); margin-top: 2px; white-space: normal; }
.vib-rad .btn { padding: 0 6px; min-height: 0; font-size: 11.5px; }
.vib-avviker { color: var(--warning-deep); }
.vib-fel { font-size: 12.5px; color: var(--danger-deep); margin: 10px 0 0; }
.avst-vib-lank { margin-top: 6px; }
/* Avstämningsstart (0283) — plattformens tokens, inga nya färger. */
.avst-startrad { font-size: 13px; color: var(--muted); margin: 0 0 8px; }
.as-tabell { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 6px 16px; margin: 14px 0 0; font-size: 13.5px; }
.as-tabell dt { color: var(--muted); }
.as-tabell dd { margin: 0; text-align: right; overflow-wrap: anywhere; }
.as-tabell .tal { font-variant-numeric: tabular-nums; color: var(--ink); }
.as-diff--fel { color: var(--danger-deep) !important; }
.as-skal { font-size: 12.5px; color: var(--muted); display: block; text-align: left; }
.as-berors { font-size: 12.5px; color: var(--muted); margin: 12px 0 0; }
/* «+» på ett valutakonto — plattformens tokens, inga nya färger. */
.pm-valuta { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 16px; margin: 8px 0 12px; font-size: 13.5px; }
.pm-valuta label { display: inline-flex; align-items: center; gap: 6px; }
.pm-valuta input { width: 9.5em; text-align: right; }
.pm-valutabelopp { margin-top: 4px; text-align: right; }
/* «Belopp i EUR» på en verifikatrad (valutakonto) — plattformens tokens. */
.r-valuta { margin-top: 4px; text-align: right; }
/* Betalningens banksida per post (bekräftelsen) — plattformens tokens. */
.bs-tabell { width: 100%; border-collapse: collapse; margin: 14px 0 0; font-size: 13.5px; }
.bs-tabell th { text-align: left; font-weight: 500; color: var(--muted); padding: 4px 8px; border-bottom: 1px solid var(--line); }
.bs-tabell td { padding: 6px 8px; vertical-align: top; border-bottom: 1px solid var(--line); }
.bs-tabell .tal { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.bs-tabell input { width: 9.5em; text-align: right; display: block; margin-bottom: 4px; }
.bs-tabell input[readonly] { color: var(--muted); background: transparent; }
.bs-kurs, .bs-skal { font-size: 12px; }
.bs-skal { color: var(--warning-deep); }
.betald-kontovaluta { margin-top: 8px; }

/*
 * Banderollen när en annan flik växlat org (public/js/lib/org-kanal.js, PR B B5).
 * Överst och alltid synlig: fliken visar en org som inte längre är sessionens,
 * och nästa skrivning nekas av servern tills sidan laddats om.
 */
.org-byte-banderoll {
  position: sticky; top: 0; z-index: 1000;
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 10px 16px;
  background: var(--warning-soft); color: var(--warning-deep);
  border-bottom: 1px solid var(--warning);
  font-size: 14px;
}
.org-byte-banderoll__text { flex: 1 1 auto; }

/* ── Inställningar › Lönearter (lön etapp 1, 1a-ii; lon-installningar-v1, avsnitt 2–3) ──
 * Måtten och färgerna är designens. Tabellen rullar i sidled inuti kortet på
 * mobil; chip och sökfält bryts till egna rader. */
.la-verktyg { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; padding: 11px 16px; border-bottom: 1px solid var(--line); }
.la-chips { display: flex; gap: 6px; flex-wrap: wrap; }
.la-antal { font-variant-numeric: tabular-nums; color: var(--muted); font-weight: 600; }
.filter-chip.is-active .la-antal { color: var(--brand); }
.la-inaktiva { font-size: 12.5px; color: var(--muted); display: inline-flex; gap: 6px; align-items: center; }
.la-hoger { margin-left: auto; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.la-sok { font: inherit; font-size: 13.5px; padding: 7px 12px; border: 1px solid #cbd3dd; border-radius: var(--radius-sm); min-width: 200px; }
.la-tabell { min-width: 1180px; width: 100%; border-collapse: collapse; }
.la-tabell th, .la-tabell td { padding: 8px 10px; border-bottom: 1px solid var(--line); text-align: left; font-size: 13px; }
.la-tabell th.mitt, .la-tabell td.mitt { text-align: center; }
.la-kod { font: 11.5px/1.2 ui-monospace, SFMono-Regular, Menlo, monospace; font-weight: 600; color: #3b4656; }
.la-ja { color: var(--success-deep); font-weight: 700; }
.la-nej { color: #b8c0cc; }
.la-grupprad td { background: #f4f6f8; font-size: 12px; color: var(--muted); }
.la-grupprad b { color: var(--text); font-weight: 650; }
.la-lager { font-size: 10.5px; font-weight: 700; padding: 1px 7px; border-radius: 999px; white-space: nowrap; }
.la-lager--lag { background: #eef1f5; color: #5b6776; }
.la-lager--byra { background: var(--brand-light); color: var(--brand); }
.la-lager--eget { background: #f2ecfa; color: #5b3a94; }
.la-lagerinfo { display: flex; flex-direction: column; gap: 2px; align-items: flex-start; }
.la-u { font-size: 11px; color: var(--muted); }
tr.la-anpassad td { background: #fdfbf4; }
tr.la-inaktiv td { color: #9aa6b5; }
.la-dialog { max-width: 560px; width: 100%; }
.la-huvudrad { margin: 0 0 12px; font-size: 12.5px; color: var(--muted); }
.la-faltrad { display: flex; flex-direction: column; gap: 4px; margin-bottom: 10px; }
.la-falttitel { font-size: 12px; font-weight: 600; color: var(--muted); }
.la-falt { font: inherit; font-size: 13.5px; padding: 7px 10px; border: 1px solid #cbd3dd; border-radius: var(--radius-sm); width: 100%; }
.la-tva { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.la-flaggor { display: grid; grid-template-columns: 1fr 1fr; gap: 6px 14px; margin: 4px 0 12px; }
.la-flagga { display: flex; align-items: center; gap: 8px; font-size: 13px; padding: 7px 10px; border: 1px solid var(--line); border-radius: 7px; min-height: 38px; }
.la-flagga input { margin: 0; width: 16px; height: 16px; }
.la-flagga--last { background: #f4f6f8; color: var(--muted); }
.la-lasikon { margin-left: auto; font-size: 11px; background: #eef1f5; color: var(--muted); border-radius: 4px; padding: 1px 6px; font-weight: 600; }
.la-konsekvens { font-size: 12.5px; color: var(--warning-deep); margin: 0; }
.la-fel { font-size: 12.5px; color: var(--danger); min-height: 0; margin: 0; }
.la-fel:empty { display: none; }
.la-vanster { margin-right: auto; }
@media (max-width: 760px) {
  .la-hoger { margin-left: 0; width: 100%; }
  .la-sok { flex: 1; min-width: 0; }
  .la-tva, .la-flaggor { grid-template-columns: 1fr; }
}

/* ── Körningens rader (lön 1a-ii; designen lon-v1.html avsnitt 1) ──────────── */
.lr-rulle { overflow-x: auto; }
.lr-an-tabell { min-width: 1120px; width: 100%; border-collapse: collapse; }
.lr-an-tabell th, .lr-an-tabell td { padding: 8px 10px; border-bottom: 1px solid var(--line); text-align: left; font-size: 13px; vertical-align: middle; }
.lr-an-tabell col.c-anst { width: auto; }
.lr-an-tabell col.c-skatt { width: 200px; }
.lr-an-tabell col.c-avg { width: 104px; }
.lr-an-tabell col.c-b { width: 104px; }
.lr-an-tabell col.c-x { width: 44px; }
.lr-tal { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
th.lr-tal { text-align: right; }
.lr-svag { color: var(--muted); }
.lr-anstalld b { font-weight: 600; }
.lr-anstalld span { display: block; font-size: 11.5px; color: var(--muted); }
.lr-skatt { display: inline-flex; align-items: center; gap: 4px; font-size: 11.5px; font-weight: 600; padding: 2px 8px; border-radius: 6px; white-space: nowrap; background: #eef1f5; color: #3b4656; margin: 1px 3px 1px 0; }
.lr-skatt--rod { background: #fbe9e7; color: #a0321f; }
.lr-skatt-detalj { display: block; font-size: 11px; color: var(--muted); line-height: 1.3; }
.lr-avg { font-size: 11.5px; font-weight: 600; font-variant-numeric: tabular-nums; white-space: nowrap; }
.lr-avg span { display: block; font-weight: 400; color: var(--muted); font-size: 11px; }
.lr-expandera { font: inherit; font-size: 12px; border: 1px solid transparent; background: transparent; color: var(--brand); cursor: pointer; padding: 3px 6px; border-radius: 6px; }
.lr-expandera:focus-visible { border-color: var(--brand); outline: none; }
tr.lr-oppen td { background: #f7f9fc; }
.lr-summarad td { font-weight: 650; background: #fbfcfd; border-top: 1px solid #cbd3dd; }
.lr-radpanel > td { padding: 0; background: #fbfcfd; border-top: 1px dashed #cbd3dd; }
.lr-inre { padding: 12px 14px 14px; display: grid; grid-template-columns: minmax(0, 1.75fr) minmax(280px, 1fr); gap: 14px; }
.lr-tabell { min-width: 640px; background: var(--paper); border: 1px solid var(--line); border-radius: 8px; overflow: hidden; }
.lr-tabell table { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.lr-tabell th, .lr-tabell td { padding: 7px 9px; border-bottom: 1px solid var(--line); text-align: left; }
.lr-tabell th.lr-tal, .lr-tabell td.lr-tal { text-align: right; }
.lr-tabell col.c-art { width: auto; }
.lr-tabell col.c-lager { width: 64px; }
.lr-tabell col.c-ant { width: 96px; }
.lr-tabell col.c-apris { width: 104px; }
.lr-tabell col.c-bel { width: 104px; }
.lr-tabell col.c-ing { width: 190px; }
.lr-tabell col.c-agi { width: 46px; }
.lr-tabell td:nth-child(6), .lr-tabell th:nth-child(6) { padding-left: 16px; }
.lr-artnamn b { font-weight: 600; }
.lr-artnamn span { display: block; font: 10.5px/1.3 ui-monospace, SFMono-Regular, Menlo, monospace; color: #8b95a6; }
.lr-ing { display: inline-block; font-size: 10.5px; font-weight: 600; color: #5b6776; border: 1px solid #dfe4ea; border-radius: 4px; padding: 0 5px; margin: 1px 2px 1px 0; white-space: nowrap; }
.lr-ing--eng { color: #5b3a94; border-color: #d9cbef; background: #faf7fe; }
tr.lr-forman td { color: #5b6776; }
tr.lr-forman .lr-artnamn b { font-style: italic; }
.lr-cellfalt { font: inherit; font-size: 12.5px; width: 56px; padding: 3px 6px; border: 1px solid #cbd3dd; border-radius: 5px; text-align: right; font-variant-numeric: tabular-nums; }
.lr-cellfalt--pris { width: 92px; }
.lr-ta-bort { font: inherit; font-size: 11px; border: none; background: none; color: var(--danger); cursor: pointer; padding: 2px 0 0; }
.lr-laggtill { display: flex; gap: 8px; align-items: center; padding: 8px 10px; border-top: 1px solid var(--line); background: #fbfcfd; flex-wrap: wrap; }
.lr-valj { font: inherit; min-height: 34px; font-size: 12.5px; padding: 5px 8px; border: 1px solid #cbd3dd; border-radius: var(--radius-sm); background: var(--paper); max-width: 100%; }
.lr-berakning { background: var(--paper); border: 1px solid var(--line); border-radius: 8px; padding: 11px 13px; font-size: 12.5px; display: flex; flex-direction: column; gap: 8px; align-self: start; }
.lr-berakning h4 { margin: 0; font-size: 11px; text-transform: uppercase; letter-spacing: .05em; font-weight: 650; color: #8b95a6; }
.lr-berakning p { margin: 0; }
.lr-berakning a { font-size: 12px; color: var(--brand); text-decoration: none; font-weight: 600; }
.lr-brad { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 2px 12px; align-items: baseline; }
.lr-brad .vad { color: var(--text); }
.lr-brad .hur { grid-column: 1 / 2; font-size: 11.5px; color: var(--muted); line-height: 1.4; }
.lr-brad .bel { font-variant-numeric: tabular-nums; font-weight: 650; white-space: nowrap; grid-row: 1 / 3; grid-column: 2; align-self: center; }
.lr-brad--summa { border-top: 1px solid var(--line); padding-top: 7px; }
.lr-atgarder { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; font-size: 11.5px; }
@media (max-width: 900px) {
  .lr-inre { grid-template-columns: 1fr; }
}
/* ══ SIE-EXPORT (sie-v3 §7) ═══════════════════════════════════════════════════
 * Facit är sie-v3.html avsnitt 7; värdena är mockupens och färgerna dess
 * tokens. ⚠️ Scopat till `.sie-exp`: .kort, .rulle och .mini finns redan i
 * plattformen och hade rivit andra vyer oscopade.
 * ⚠️ Knappen i foten är plattformens `.btn` — dess display slår ut [hidden],
 * därför regeln för en dold länk.
 * ═══════════════════════════════════════════════════════════════════════════ */
.sie-exp .kort {
  max-width: 520px; background: var(--paper); border: 1px solid var(--line);
  border-radius: var(--radius); overflow: hidden;
}
.sie-exp .stegkort { padding: 16px 18px; }
.sie-exp .stegkort h2 { font-size: 18px; margin: 0 0 12px; }
.sie-exp .datumfalt { display: flex; flex-direction: column; gap: 4px; }
.sie-exp .falttitel { font-size: 12.5px; font-weight: 600; margin-bottom: 2px; }
.sie-exp .valj {
  font: inherit; font-size: 13.5px; padding: 7px 10px; border: 1px solid #cbd3dd;
  border-radius: var(--radius-sm); background: var(--paper); color: var(--text);
  min-height: var(--tap-target); font-variant-numeric: tabular-nums;
}
.sie-exp .varnruta {
  margin-top: 14px; font-size: 12.5px; color: var(--warning-deep); background: var(--warning-soft);
  border: 1px solid #e8dcae; border-radius: 7px; padding: 9px 11px; line-height: 1.5;
}
.sie-exp .varnruta b { font-weight: 650; }
.sie-exp .mini {
  margin-top: 8px; border: 1px solid var(--line); border-radius: 8px;
  overflow: hidden; background: var(--paper);
}
.sie-exp .rulle { overflow-x: auto; }
.sie-exp table { border-collapse: collapse; width: 100%; font-size: 12.5px; table-layout: fixed; }
.sie-exp .ub-tabell--smal { min-width: 400px; }
.sie-exp .ub-tabell col.c-k { width: auto; }
.sie-exp .ub-tabell--smal col.c-b { width: 112px; }
.sie-exp th {
  font-size: 10.5px; text-transform: uppercase; letter-spacing: .04em; font-weight: 650;
  color: #8b95a6; text-align: left; padding: 6px 10px; border-bottom: 1px solid var(--line);
  white-space: nowrap; background: var(--paper);
}
.sie-exp td { padding: 6px 10px; border-bottom: 1px solid var(--line); vertical-align: middle; }
.sie-exp tbody tr:last-child td { border-bottom: none; }
.sie-exp th.tal, .sie-exp td.tal { text-align: right; }
.sie-exp .tal { font-variant-numeric: tabular-nums; white-space: nowrap; }
.sie-exp .kontonr {
  font: 12px/1 ui-monospace, SFMono-Regular, Menlo, monospace; font-weight: 600; margin-right: 8px;
}
.sie-exp .bekraftelse {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding: 11px 16px;
  border-radius: var(--radius); background: var(--success-soft); border: 1px solid #cfe6d8;
  color: var(--success-deep); font-size: 13.5px; margin-top: 14px;
}
.sie-exp .bekraftelse b { font-weight: 650; }
.sie-exp .alert { margin: 14px 0 0; }
.sie-exp .stegfot {
  display: flex; gap: 10px; align-items: center; flex-wrap: wrap; padding: 12px 18px;
  border-top: 1px solid var(--line); background: #fbfcfd;
}
.sie-exp .hoger { margin-left: auto; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.sie-exp a.btn { text-decoration: none; }
.sie-exp .btn[hidden] { display: none; }

/* ── PS-1: fliken «Periodisk sammanställning» ────────────────────────────────
 * Avstämningens formspråk (.bokslut-avst: periodrutor, summakort, kort,
 * dialoger) — fliken ritas i en behållare med båda klasserna. Här bara det
 * som är eget: köparnas och radernas tabeller, hjälptexten under en cell och
 * räknaren på momsvyns flik. */
.ps-flik .ps-tabell, .ps-flik .uk-tabell { width: 100%; border-collapse: collapse; font-size: 13px; }
.ps-flik .ps-tabell th, .ps-flik .ps-tabell td,
.ps-flik .uk-tabell th, .ps-flik .uk-tabell td { padding: 8px 10px; border-bottom: 1px solid var(--line); text-align: left; vertical-align: top; }
.ps-flik .ps-tabell .tal, .ps-flik .uk-tabell .tal { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.ps-flik .ps-tabell .vat { font-variant-numeric: tabular-nums; letter-spacing: .01em; }
.ps-flik .ps-tabell tfoot td { font-weight: 650; border-bottom: 0; }
.ps-flik .falthj { font-size: 11.5px; color: var(--muted); margin-top: 2px; }
/* Tjänster till en XI-köpare redovisas inte (beslut 3, #1097). */
.ps-flik .falthj--varn { color: var(--warning-deep); }
.ps-flik .lank, .bokslut-avst .lank { background: none; border: 0; padding: 0; color: var(--brand); cursor: pointer; font: inherit; text-decoration: underline; }
.ps-flik .ps-grans { display: flex; gap: 12px; align-items: center; justify-content: space-between; margin-bottom: 12px; }
.ps-flik .ps-varningar { margin: 8px 16px 12px; padding-left: 16px; font-size: 13px; }
.ps-underlag { list-style: none; padding: 0; margin: 12px 0; display: grid; gap: 6px; font-size: 13px; }
/* ⚠️ PS-2 (P1, P3): dialogens fält. Etiketten står OVANFÖR fältet och
 * vänsterställd, som i facit 2 — inte i en `label.falt`, som i avstämningen
 * är ett högerställt sifferfält och ritade etiketten inne i rutan. */
.ps-dialog .faltrubrik { font-size: 12.5px; font-weight: 600; color: var(--text); margin: 0 0 4px; text-align: left; }
.ps-dialog .inmatning {
  font: inherit; font-size: 13.5px; padding: 7px 10px; border: 1px solid #cbd3dd; border-radius: var(--radius-sm);
  background: var(--paper); color: var(--text); min-height: var(--tap-target); width: 100%; text-align: left; box-sizing: border-box;
}
.ps-dialog .inmatning.tal { text-align: right; font-variant-numeric: tabular-nums; }
.ps-dialog textarea.inmatning { min-height: 64px; resize: vertical; }
.ps-dialog .ps-poster { display: grid; grid-template-columns: minmax(0, 1fr) 120px auto; gap: 6px 8px; align-items: center; margin-top: 12px; }
.ps-dialog .ps-poster .faltrubrik { margin: 0; }
.ps-dialog .ps-sammanfattning { margin-top: 12px; }
.ps-dialog .ps-sammanfattning .over { color: var(--danger-deep); }
.ps-dialog .ps-falt { margin-top: 12px; }
.ps-dialog .falthj { font-size: 12px; color: var(--muted); margin: 8px 0 0; }
@media (max-width: 520px) {
  .ps-dialog .ps-poster { grid-template-columns: minmax(0, 1fr) 96px auto; }
}
.tab-btn .rakn { display: inline-block; min-width: 18px; padding: 0 5px; margin-left: 4px; border-radius: 9px;
  background: var(--brand); color: #fff; font-size: 11px; line-height: 18px; text-align: center; }
.tab-btn .rakn[hidden] { display: none; }

/* PS-1 (facit 3): kortet i Inställningar › Moms. */
.ps-val { display: flex; align-items: center; gap: 6px; font-size: 13.5px; margin: 2px 0; }
.ps-val--last { color: var(--muted); }
.ps-kvartal { border-collapse: collapse; font-size: 12.5px; margin-top: 8px; }
.ps-kvartal th, .ps-kvartal td { padding: 4px 12px 4px 0; text-align: left; }
.ps-kvartal .tal { text-align: right; font-variant-numeric: tabular-nums; }
.ps-kvartal .ps-over { color: var(--red); font-weight: 600; }

/* ══ SIE-IMPORT (sie-v3 §1–5) ═════════════════════════════════════════════════
 * Facit är sie-v3.html avsnitt 1–5; värdena är mockupens och färgerna dess
 * tokens. ⚠️ Scopat till `.sie-imp`: .kort, .chip, .summa, .rulle, .kod, .mini,
 * .lage och .seg finns redan i plattformen och hade rivit andra vyer oscopade.
 * Mockupens inline-stilar är modifierare här (.summa--kant, .kryssval--rad,
 * .granskblock--tabell, .konsekvens--ingress, .sammanfattningsrad).
 * ═══════════════════════════════════════════════════════════════════════════ */
.sie-imp .kort {
  background: var(--paper); border: 1px solid var(--line);
  border-radius: var(--radius); overflow: hidden;
}
.sie-imp .kort--smal { max-width: 520px; }
.sie-imp .kort--kvittens { max-width: 760px; }
.sie-imp h2 { font-size: 18px; font-weight: 640; margin: 0; }
.sie-imp h3 { font-size: 14px; font-weight: 650; margin: 0; }
.sie-imp .svag { color: var(--muted); }
.sie-imp .hojd { font-size: 12px; margin-bottom: 12px; }
.sie-imp .liten { font-size: 12.5px; }
.sie-imp a.btn { text-decoration: none; }
.sie-imp .btn[disabled] { opacity: .5; cursor: not-allowed; }

.sie-imp .stegkort { padding: 16px 18px 6px; }
.sie-imp .stegfot {
  display: flex; gap: 10px; align-items: center; flex-wrap: wrap; padding: 12px 18px;
  border-top: 1px solid var(--line); background: #fbfcfd;
}
.sie-imp .hoger { margin-left: auto; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.sie-imp .sammanfattningsrad { font-size: 13px; }
.sie-imp .knappforklaring { font-size: 12px; color: var(--warning-deep); line-height: 1.35; }

.sie-imp .stegrad { display: flex; align-items: center; gap: 6px; font-size: 12px; color: #8b95a6; flex-wrap: wrap; margin: 10px 0 12px; }
.sie-imp .stegrad span { display: inline-flex; align-items: center; gap: 5px; font-weight: 600; }
.sie-imp .stegrad i {
  font-style: normal; width: 18px; height: 18px; border-radius: 50%; border: 1.5px solid #cbd3dd;
  display: inline-flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 700;
}
.sie-imp .stegrad .klar { color: var(--success-deep); }
.sie-imp .stegrad .klar i { border-color: var(--success-deep); background: var(--success-soft); }
.sie-imp .stegrad .nu { color: var(--brand); }
.sie-imp .stegrad .nu i { border-color: var(--brand); background: var(--brand); color: #fff; }
.sie-imp .stegrad .pil { color: #cbd3dd; font-weight: 400; }

/* ── 1 · Välj fil ── */
.sie-imp .falttitel { font-size: 12.5px; font-weight: 600; margin-bottom: 2px; }
.sie-imp .filval {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap; border: 1.5px dashed #cbd3dd;
  border-radius: 10px; padding: 16px; background: #fbfcfd; margin: 10px 0 6px;
}
.sie-imp .filval .filnamn { font-weight: 650; }
.sie-imp .filval .storlek { font-size: 12.5px; color: var(--muted); }
.sie-imp .felruta {
  font-size: 12.5px; color: var(--danger-deep); background: var(--danger-soft); border: 1px solid #f1cdc7;
  border-radius: 7px; padding: 9px 11px; line-height: 1.5; margin-bottom: 14px;
}
.sie-imp .felruta b { font-weight: 650; }
.sie-imp .granskblock > .felruta { margin-bottom: 0; }
.sie-imp .fellista { margin: 6px 0 0; padding-left: 18px; font-size: 12.5px; color: var(--danger-deep); }

/* ── sammanfattning ── */
.sie-imp .summa {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 1px;
  background: var(--line); border: 1px solid var(--line); border-radius: var(--radius);
  overflow: hidden; margin-bottom: 16px;
}
.sie-imp .summa--kant { border-left: none; border-right: none; border-radius: 0; margin: 0; }
.sie-imp .summa > div { background: var(--paper); padding: 13px 16px; }
.sie-imp .summa .rubrik { font-size: 12px; color: var(--muted); margin-bottom: 3px; }
.sie-imp .summa .tal { font-size: 20px; font-weight: 650; }
.sie-imp .summa .under { font-size: 12px; color: var(--muted); margin-top: 2px; }
.sie-imp .summa .tal--varn { color: var(--warning-deep); }
.sie-imp .summa div.markerad { background: var(--warning-soft); }

/* ── granskblock och val ── */
.sie-imp .granskblock { border-top: 1px solid var(--line); padding: 14px 18px; }
.sie-imp .summa + .granskblock { border-top: none; }
.sie-imp .granskblock h3 { margin: 0 0 4px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.sie-imp .granskblock .konsekvens { margin: 0 0 8px; }
.sie-imp .granskblock--varn { background: #fffdf6; }
.sie-imp .granskblock--info { background: #fbfcfd; }
.sie-imp .granskblock--tabell { padding-bottom: 0; }
.sie-imp .konsekvens { font-size: 12.5px; color: var(--warning-deep); }
.sie-imp .konsekvens--ingress { margin: 0 0 12px; }
.sie-imp .valrader { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.sie-imp .kontoval { grid-template-columns: repeat(auto-fit, minmax(min(220px, 100%), 1fr)); }
.sie-imp .valrad {
  display: flex; align-items: center; gap: 10px; padding: 9px 11px; border: 1px solid var(--line);
  border-radius: var(--radius-sm); cursor: pointer; background: var(--paper);
}
.sie-imp .valrad.vald { border-color: var(--brand); background: var(--brand-light); }
.sie-imp .valrad .txt { flex: 1; min-width: 0; }
.sie-imp .valrad .txt b { display: block; font-size: 13.5px; }
.sie-imp .valrad .txt span { font-size: 12px; color: var(--muted); }
.sie-imp .valrad input { margin: 0; flex: none; }
.sie-imp .kryssval { display: flex; align-items: center; gap: 9px; font-size: 13px; margin-top: 10px; font-weight: 600; }
.sie-imp .kryssval input { margin: 0; width: 18px; height: 18px; }
.sie-imp .kryssval--rad { margin: 0; font-weight: 400; }

/* ── 2 · Konton ── */
.sie-imp .verktyg {
  display: flex; gap: 10px; align-items: center; flex-wrap: wrap; padding: 11px 16px;
  border-bottom: 1px solid var(--line); background: #fbfcfd;
}
.sie-imp .chip {
  font: inherit; font-size: 13px; padding: 6px 12px; border-radius: 999px; border: 1px solid #cbd3dd;
  background: var(--paper); color: var(--text); cursor: pointer; display: inline-flex;
  align-items: center; gap: 7px; min-height: 36px;
}
.sie-imp .chip .antal { font-variant-numeric: tabular-nums; color: var(--muted); font-weight: 600; }
.sie-imp .chip.pa { background: var(--brand-light); border-color: var(--brand); color: var(--brand); font-weight: 600; }
.sie-imp .chip.pa .antal { color: var(--brand); }
.sie-imp .sok {
  font: inherit; font-size: 13.5px; padding: 7px 12px; border: 1px solid #cbd3dd;
  border-radius: var(--radius-sm); min-width: 200px; min-height: var(--tap-target);
}
.sie-imp .rulle { overflow-x: auto; }
.sie-imp table { border-collapse: collapse; width: 100%; font-size: 12.5px; table-layout: fixed; }
.sie-imp th {
  font-size: 10.5px; text-transform: uppercase; letter-spacing: .04em; font-weight: 650;
  color: #8b95a6; text-align: left; padding: 7px 8px; border-bottom: 1px solid var(--line);
  white-space: nowrap; background: var(--paper);
}
.sie-imp td { padding: 6px 8px; border-bottom: 1px solid var(--line); vertical-align: middle; font-size: 12.5px; }
.sie-imp tbody tr:last-child td { border-bottom: none; }
.sie-imp th.tal, .sie-imp td.tal { text-align: right; }
.sie-imp .tal { font-variant-numeric: tabular-nums; white-space: nowrap; }
.sie-imp .ko-tabell { min-width: 900px; }
.sie-imp .ko-tabell col.c-nr, .sie-imp .ny-tabell col.c-nr { width: 76px; }
.sie-imp .ko-tabell col.c-hit, .sie-imp .ko-tabell col.c-fil { width: auto; }
.sie-imp .ko-tabell col.c-anv, .sie-imp .ny-tabell col.c-anv { width: 120px; }
.sie-imp .ko-tabell col.c-val { width: 170px; }
.sie-imp .ny-tabell { min-width: 780px; }
.sie-imp .ny-tabell col.c-fil { width: auto; }
.sie-imp .ny-tabell col.c-typ { width: 150px; }
.sie-imp .ny-tabell col.c-sk { width: 140px; }
.sie-imp .kontonr2 { font: 12.5px/1.2 ui-monospace, SFMono-Regular, Menlo, monospace; font-weight: 650; }
.sie-imp .kuppg b { display: block; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sie-imp .kuppg > span { display: block; font-size: 11.5px; color: var(--muted); }
.sie-imp .skiljer { color: var(--warning-deep); background: var(--warning-soft); border-radius: 4px; padding: 0 4px; font-style: normal; }
.sie-imp b.skiljer { display: inline-block; max-width: 100%; }
.sie-imp .lage {
  font-size: 11px; font-weight: 650; padding: 2px 8px; border-radius: 999px; white-space: nowrap;
  display: inline-flex; align-items: center; gap: 4px;
}
.sie-imp .lage--ostamd { background: #eef1f5; color: var(--muted); }
.sie-imp .lage--ok { background: var(--success-soft); color: var(--success-deep); }
.sie-imp .seg { display: inline-flex; border: 1px solid #cbd3dd; border-radius: 7px; overflow: hidden; }
.sie-imp .seg label {
  position: relative; display: inline-flex; align-items: center; font-size: 12px; font-weight: 600;
  padding: 5px 11px; cursor: pointer; color: var(--muted); min-height: 30px;
}
.sie-imp .seg label + label { border-left: 1px solid #cbd3dd; }
.sie-imp .seg label.pa { background: var(--brand-light); color: var(--brand); }
.sie-imp .seg input { position: absolute; opacity: 0; pointer-events: none; width: 1px; height: 1px; left: 0; top: 0; }
.sie-imp .seg label:focus-within { outline: 2px solid var(--brand); outline-offset: -2px; }
.sie-imp .aktiveras { font-size: 11px; color: var(--brand); font-weight: 650; margin-top: 3px; }
.sie-imp .svagrad td, .sie-imp .svagrad .kuppg b { color: var(--muted); }
.sie-imp .valj, .sie-imp .falt {
  font: inherit; font-size: 13.5px; padding: 7px 10px; border: 1px solid #cbd3dd;
  border-radius: var(--radius-sm); background: var(--paper); color: var(--text); min-height: var(--tap-target);
}
.sie-imp .valj--sm { min-height: 32px; padding: 4px 8px; font-size: 12.5px; }
.sie-imp .fler { font-size: 12px; color: var(--muted); padding: 8px 18px; }

/* ── 3 · Serier ── */
.sie-imp .serielista { border-top: 1px solid var(--line); }
.sie-imp .serierad {
  display: grid; grid-template-columns: minmax(220px, 1.1fr) minmax(250px, 1fr) minmax(150px, .6fr);
  gap: 8px 18px; align-items: center; padding: 11px 18px; border-bottom: 1px solid var(--line);
}
.sie-imp .serierad:last-child { border-bottom: none; }
.sie-imp .serierad--huvud { padding-top: 8px; padding-bottom: 8px; background: #fbfcfd; }
.sie-imp .serierad--huvud span { font-size: 10.5px; text-transform: uppercase; letter-spacing: .04em; font-weight: 650; color: #8b95a6; }
.sie-imp .filserie { display: flex; align-items: center; gap: 12px; min-width: 0; }
.sie-imp .kod {
  width: 34px; height: 34px; border-radius: 8px; background: #eef1f5; color: var(--text); flex: none;
  display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 15px;
}
.sie-imp .filserie .txt { min-width: 0; }
.sie-imp .filserie .txt b { display: block; font-size: 13.5px; font-variant-numeric: tabular-nums; }
.sie-imp .filserie .txt span { font-size: 12px; color: var(--muted); font-variant-numeric: tabular-nums; }
.sie-imp .malval { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.sie-imp .malval .valj, .sie-imp .malval .falt { width: 100%; }
.sie-imp .nyanr { font-variant-numeric: tabular-nums; font-weight: 650; font-size: 13.5px; }
.sie-imp .nyanr .mlabel { display: none; }
.sie-imp .radkonsekvens {
  grid-column: 2 / 4; font-size: 12px; color: var(--warning-deep); background: var(--warning-soft);
  border-radius: 6px; padding: 5px 9px; margin-top: -2px;
}
.sie-imp .radkonsekvens--info { color: #1d3f7a; background: var(--brand-light); }
.sie-imp .modul {
  font-size: 10.5px; font-weight: 650; padding: 1px 7px; border-radius: 999px; background: #eef1f5;
  color: #5b6776; white-space: nowrap; margin-left: 6px;
}

/* ── 4 · Granska ── */
.sie-imp .fakta { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 10px 22px; margin-bottom: 14px; }
.sie-imp .etikett { display: block; margin-bottom: 2px; font-size: 12px; color: #8b95a6; text-transform: uppercase; letter-spacing: .05em; font-weight: 650; }
.sie-imp .fakta .varde { display: block; font-size: 14px; font-weight: 600; font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
.sie-imp .fakta .under { font-size: 12px; color: var(--muted); }
.sie-imp .fakta .under--varn { color: var(--warning-deep); }
.sie-imp .provtext { font-size: 12.5px; display: flex; flex-direction: column; gap: 3px; }
.sie-imp .provtext span {
  background: #f4f6f8; border-radius: 5px; padding: 2px 8px; align-self: flex-start; max-width: 100%;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.sie-imp .mini { border: 1px solid var(--line); border-radius: 8px; overflow: hidden; background: var(--paper); }
.sie-imp .mini.rulle { overflow-x: auto; }
.sie-imp .mini td, .sie-imp .mini th { padding: 6px 10px; }
.sie-imp .k-tabell { min-width: 560px; }
.sie-imp .k-tabell col.c-u { width: 90px; }
.sie-imp .k-tabell col.c-f { width: 110px; }
.sie-imp .k-tabell col.c-v { width: auto; }
.sie-imp .s-tabell { min-width: 520px; }
.sie-imp .s-tabell col.c-fr { width: auto; }
.sie-imp .s-tabell col.c-ti { width: 200px; }
.sie-imp .s-tabell col.c-an { width: 90px; }
.sie-imp .s-tabell col.c-nr { width: 130px; }
.sie-imp .ub-tabell { min-width: 600px; }
.sie-imp .ub-tabell col.c-k { width: auto; }
.sie-imp .ub-tabell col.c-b { width: 130px; }
.sie-imp .kontonr { font: 12px/1 ui-monospace, SFMono-Regular, Menlo, monospace; font-weight: 600; margin-right: 8px; }
.sie-imp .avvikelse { font-weight: 650; color: var(--danger-deep); }

/* ── 5 · Kvittens ── */
.sie-imp .bekraftelse {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding: 11px 16px;
  border-radius: var(--radius); background: var(--success-soft); border: 1px solid #cfe6d8;
  color: var(--success-deep); font-size: 13.5px; margin: 0 0 12px;
}
.sie-imp .bekraftelse b { font-weight: 650; }
.sie-imp .kvittensblock { border: 1px solid #e8dcae; border-radius: 8px; margin: 0 0 12px; font-size: 12.5px; }
.sie-imp .ursprungslista { margin: 6px 0 0; padding-left: 18px; }
.sie-imp .kvittensrad { margin: 0 0 12px; }
.sie-imp .stegkort > .mini:last-child { margin-bottom: 14px; }

@media (max-width: 760px) {
  .sie-imp .serierad { grid-template-columns: 1fr; gap: 8px; }
  .sie-imp .serierad--huvud { display: none; }
  .sie-imp .radkonsekvens { grid-column: 1; }
  .sie-imp .nyanr { display: flex; justify-content: space-between; gap: 10px; }
  .sie-imp .nyanr .mlabel { display: inline; font-weight: 400; color: var(--muted); font-size: 13px; }
}
@media (max-width: 640px) {
  .sie-imp .valrader { grid-template-columns: 1fr; }
  .sie-imp .sok { min-width: 0; width: 100%; }
}

/* ══ URSPRUNGLIGT VERIFIKATIONSNUMMER (sie-v3 §6) ═════════════════════════════
 * «urspr. A 423» under numret i verifikatlistan, och raden «Ursprungligt
 * ver.nr» i verifikatet. Bara SIE-importerade verifikat har dem.
 * ═══════════════════════════════════════════════════════════════════════════ */
.ver-tabell .ver-ursprung {
  display: block; font-family: var(--font); font-size: 11px; color: var(--muted);
  font-variant-numeric: tabular-nums;
}
.ver-tabell .cell-nr-mobil .ver-ursprung { display: inline; margin-left: 6px; }
.ver-tabell .traff, .ver-ursprung-detalj .traff { background: #fff2b8; color: inherit; border-radius: 3px; padding: 0 2px; }
.ver-ursprung-detalj { margin-top: 2px; }
.ver-ursprung-detalj b { font-weight: 600; color: var(--text); }

/* ─── Lön 1a-iii: körningslistan, ny körning och underlagen (facit lon-v1 avsnitt 0, 1c, 2) ─── */
.kl-tabell { width: 100%; border-collapse: collapse; }
.kl-tabell th, .kl-tabell td { padding: 9px 10px; border-bottom: 1px solid var(--line); text-align: left; font-size: 13px; vertical-align: middle; }
.kl-tabell .kl-tal { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.kl-tabell .kl-svag { color: var(--muted); }
.kl-korlank { font-weight: 600; color: var(--text); text-decoration: none; }
.kl-korlank:hover { color: var(--brand); }
.kl-typ { font-size: 11px; font-weight: 650; padding: 2px 8px; border-radius: 999px; white-space: nowrap; }
.kl-typ--ordinarie { background: #eef1f5; color: #5b6776; }
.kl-typ--extra { background: #fff1e6; color: #9a4b12; }
.kl-lage { font-size: 11px; font-weight: 650; padding: 2px 8px; border-radius: 999px; white-space: nowrap; display: inline-flex; align-items: center; gap: 4px; }
.kl-lage--utkast { background: #eef1f5; color: var(--muted); }
.kl-lage--beraknad, .kl-lage--godkand { background: var(--brand-light); color: var(--brand); }
.kl-lage--betald { background: var(--success-soft); color: var(--success-deep); }
.kl-lage--avbruten { background: var(--surface-inset); color: var(--muted); }
.kl-lage--med { background: var(--success-soft); color: var(--success-deep); }
.kl-lage--efter { background: var(--warning-soft); color: var(--warning-deep); }
.kl-lage--vantar { background: #eef1f5; color: var(--muted); }
.kl-lage--nasta { background: #fff; color: var(--muted); border: 1px dashed #cbd3dd; }
/* ─── Lön 1c-ii: fliken AGI — en rad per utbetalningsmånad och detaljkortet (facit lon-v1 avsnitt 4) ─── */
.kl-lage--motsagelse { background: var(--danger-soft); color: var(--danger-deep); }
.agi-tabell .agi-manadsrad { cursor: pointer; }
.agi-tabell .agi-manadsrad:hover, .agi-tabell .agi-manadsrad:focus-visible { background: var(--surface-inset); outline: none; }
.agi-tabell .agi-manadsrad[aria-expanded="true"] .agi-man { color: var(--brand); }
.agi-tabell .agi-man { font-weight: 600; white-space: nowrap; }
.agi-motsagelse td { background: var(--warning-soft); }
.agi-motsagelse__inre { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; font-size: 13px; }
.agi-motsagelse__inre span { flex: 1; min-width: 220px; }
.agi-detaljer { display: grid; gap: 14px; margin-top: 14px; }
.agi-detalj { padding: 14px 16px; }
.agi-detalj__huvud { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.agi-detalj__huvud h3 { margin: 0; font-size: 15px; }
.agi-detalj__rubrik { margin: 12px 0 4px; font-size: 12px; font-weight: 650; color: var(--muted); text-transform: uppercase; letter-spacing: .03em; }
.agi-svag { color: var(--muted); font-size: 12.5px; }
.agi-hoger { margin-left: auto; display: inline-flex; gap: 8px; }
.agi-hu { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin-top: 12px; padding: 12px; background: var(--surface-inset); border-radius: var(--radius-sm); }
.agi-hu__rubrik { font-size: 12px; color: var(--muted); }
.agi-hu__tal { font-size: 18px; font-weight: 650; font-variant-numeric: tabular-nums; }
.agi-detalj__fot { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 12px; }
.agi-inlamnad { display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; color: var(--muted); }
.agi-detalj .btn[disabled], .agi-motsagelse .btn[disabled] { opacity: .5; cursor: not-allowed; }
@media (max-width: 640px) {
  .agi-hu { grid-template-columns: 1fr; }
  .agi-hoger { margin-left: 0; }
}

.nk-valrader { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.nk-valrad { display: flex; align-items: center; gap: 10px; padding: 9px 11px; border: 1px solid var(--line); border-radius: var(--radius-sm); cursor: pointer; background: var(--paper); }
.nk-valrad.vald { border-color: var(--brand); background: var(--brand-light); }
.nk-valrad .txt { flex: 1; min-width: 0; }
.nk-valrad .txt b { display: block; font-size: 13.5px; }
.nk-valrad .txt span { font-size: 12px; color: var(--muted); }
.nk-valrad input { margin: 0; flex: none; }
.nk-valrad--av { cursor: not-allowed; opacity: .55; }
.nk-flytt { font-size: 12.5px; color: var(--muted); }
/* Körningens huvud (lön 1c-i): flyttraden under utbetalningsdagen och skälet vid en inaktiv knapp. */
.lon-flyttrad { font-size: 12.5px; color: var(--muted); margin-top: 2px; }
.lon-knappforklaring { font-size: 12px; color: var(--warning-deep); margin-right: 6px; }
/* En inaktiv knapp ser inaktiv ut (facit lon-v1: .btn[disabled]) — i lönens dialog och körningens åtgärder. */
.lon-action-bar .btn[disabled], #lonModalContainer .modal-footer .btn[disabled] { opacity: .5; cursor: not-allowed; }
.nk-fel { font-size: 12.5px; color: var(--danger-deep); }
.nk-falt--fel { border-color: var(--danger-deep) !important; }
.nk-knappforklaring { font-size: 12px; color: var(--warning-deep); max-width: 36ch; text-align: right; line-height: 1.35; }
.nk-valjare { font: inherit; font-size: 13.5px; min-height: 40px; padding: 7px 34px 7px 11px; border: 1px solid #cbd3dd; border-radius: var(--radius-sm); background: var(--paper); color: var(--text); text-align: left; width: 100%; max-width: 340px; position: relative; cursor: pointer; display: block; }
.nk-valjare::after { content: "▾"; position: absolute; right: 12px; top: 50%; transform: translateY(-50%); color: var(--muted); }
.nk-valjare.oppen { border-color: var(--brand); box-shadow: 0 0 0 3px var(--brand-light); }
.nk-valjpanel { border: 1px solid #cbd3dd; border-radius: var(--radius-sm); background: var(--paper); max-width: 340px; box-shadow: 0 8px 24px rgba(27, 36, 48, .14); margin-top: 4px; overflow: hidden; }
.nk-valjpanel .nk-sok { width: 100%; min-width: 0; border: none; border-bottom: 1px solid var(--line); border-radius: 0; min-height: 40px; padding: 0 12px; }
.nk-valjpanel label { display: flex; align-items: center; gap: 9px; padding: 7px 12px; font-size: 13px; cursor: pointer; min-height: 36px; }
.nk-valjpanel label:hover { background: #f7f9fc; }
.nk-valjpanel label.alla { font-weight: 650; border-bottom: 1px solid var(--line); }
.nk-valjpanel label .i { margin-left: auto; font-size: 11px; color: #8b95a6; white-space: nowrap; }
.nk-valjpanel .grupp { font-size: 10.5px; text-transform: uppercase; letter-spacing: .05em; font-weight: 650; color: #8b95a6; padding: 8px 12px 3px; border-top: 1px solid var(--line); }
.nk-valjpanel input { margin: 0; flex: none; }
.nk-vaxel { display: flex; align-items: center; gap: 9px; padding: 9px 12px; border-top: 1px solid var(--line); font-size: 12.5px; color: var(--muted); background: #fbfcfd; cursor: pointer; }
.nk-vaxel input { margin: 0; }
.nk-vaxel .i { margin-left: auto; font-size: 11px; color: #8b95a6; }

.ul-chips { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 10px; }
.ul-chip { font: inherit; font-size: 13px; padding: 6px 12px; border-radius: 999px; border: 1px solid #cbd3dd; background: var(--paper); color: var(--text); cursor: pointer; display: inline-flex; align-items: center; gap: 7px; min-height: 36px; }
.ul-chip .antal { font-variant-numeric: tabular-nums; color: var(--muted); font-weight: 600; }
.ul-chip.pa { background: var(--brand-light); border-color: var(--brand); color: var(--brand); font-weight: 600; }
.ul-chip.pa .antal { color: var(--brand); }
.ul-namn b { font-weight: 600; }
.ul-namn span { display: block; font-size: 11.5px; color: var(--muted); }
.ul-fasta { font-size: 11.5px; color: var(--muted); }
.korstrip { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; padding: 9px 18px; background: #fffbeb; border-bottom: 1px dashed #e8dcae; font-size: 12.5px; color: var(--warning-deep); }
.korstrip b { font-weight: 650; }
.korstrip .btn { margin-left: auto; }

/* ═══ ATTEST AV LEVERANTÖRSFAKTUROR (attest PR 1, facit attest-v2 avsnitt 4–7) ═══ */
/* ⚠️ Kortets bredd, som inställningarnas övriga kort (attest PR 4, U1): inget max-width. */
.levattest { display: flex; flex-direction: column; gap: var(--space-3); }
.levattest__ruta { border: 1px solid var(--border); border-radius: var(--radius); padding: var(--space-3) var(--space-4); display: flex; flex-direction: column; gap: var(--space-2); }
.levattest__rubrik { font-size: 14px; font-weight: 600; margin: 0; }
/* Inställningens attestanttabell har status och åtgärder — den behöver bredden. */
.data-table tbody td.levattest__atgard { white-space: normal; }
.levattest__rubrikrad { display: flex; justify-content: space-between; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
.levattest__person { justify-content: flex-start; }
.levattest__antal { display: flex; gap: var(--space-2); align-items: center; font-size: 13.5px; }
.levattest__antal select { width: auto; }

.attestruta { border: 1px solid var(--border); border-radius: var(--radius); padding: var(--space-3) var(--space-4); display: flex; flex-direction: column; gap: var(--space-2); }
.attestruta__huvud { display: flex; gap: var(--space-2); align-items: center; flex-wrap: wrap; }
.attestruta__huvud h3 { font-size: 14px; font-weight: 600; margin: 0; }
.attestruta__verifikat { font-size: 12.5px; border-top: 1px solid var(--border); padding-top: var(--space-2); }
.attestruta__verifikat table { width: 100%; border-collapse: collapse; }
.attestruta__verifikat td { padding: 2px 0; }
.attestruta__verifikat td.tal { text-align: right; font-variant-numeric: tabular-nums; }
.attestruta__person { display: flex; gap: var(--space-2); align-items: baseline; flex-wrap: wrap; font-size: 13.5px; }
.attestruta__person .tid { color: var(--muted); font-size: 12.5px; }
.attestruta__anteckning { font-size: 13px; color: var(--muted); font-style: italic; }
.attestruta__knappar { display: flex; gap: var(--space-2); flex-wrap: wrap; justify-content: flex-end; }
/* ⚠️ Kompakt när fakturan väntar (attest PR 4, U3): läget, gruppen och knapparna
   på en eller två rader; knapparna högerställda i normal storlek. */
.attestruta--kompakt { gap: var(--space-1); }
.attestruta__rad { display: flex; align-items: center; gap: var(--space-2) var(--space-4); flex-wrap: wrap; }
.attestruta__personer { display: flex; gap: var(--space-1) var(--space-4); flex-wrap: wrap; align-items: baseline; }
.attestruta__rad > .attestruta__knappar { margin-left: auto; align-items: center; }
/* (i) bredvid «Attestera själv»: knapp som tar fokus; texten syns vid fokus och hovring. */
.attestruta__info { position: relative; display: inline-flex; align-items: center; }
.attestruta__i {
  width: 22px; height: 22px; padding: 0; border-radius: 50%;
  border: 1px solid var(--border); background: var(--paper); color: var(--muted);
  font: italic 600 12px/1 Georgia, serif; cursor: help;
}
.attestruta__i:hover { color: var(--ink); border-color: var(--ink); }
.attestruta__i:focus-visible { outline: 2px solid var(--brand); outline-offset: 2px; }
.attestruta__tips {
  position: absolute; right: 0; top: calc(100% + 6px); z-index: 20;
  width: max-content; max-width: 260px; padding: 8px 10px; border-radius: var(--radius);
  background: var(--ink); color: var(--paper); font-size: 12.5px; line-height: 1.4;
  visibility: hidden; opacity: 0; transition: opacity .12s; pointer-events: none;
}
.attestruta__info:hover .attestruta__tips,
.attestruta__info:focus-within .attestruta__tips { visibility: visible; opacity: 1; }
.attestruta__citat { border-left: 3px solid var(--border); padding-left: var(--space-2); font-size: 13.5px; }

/* ── Byrå › Attest (attest PR 3, facit avsnitt 8) ─────────────────────────── */
.byra-attest__klient { margin-bottom: var(--space-4); overflow: hidden; }
.byra-attest__huvud {
  display: flex; gap: var(--space-3); align-items: center; flex-wrap: wrap;
  padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--line); background: var(--surface-alt);
}
.byra-attest__huvud h3 { font-size: 15px; margin: 0; }
.byra-attest__tal { display: flex; gap: var(--space-3); flex-wrap: wrap; font-size: 12.5px; color: var(--muted); margin-left: auto; }
.byra-attest__tal b { color: var(--text); font-variant-numeric: tabular-nums; }
.byra-attest__tom { padding: var(--space-3) var(--space-4); margin: 0; }
.byra-attest__tabell tbody tr { cursor: pointer; }
/* Byråvyns tabeller har ett golv på 1080 px (.byravy table); attesttabellen har
   fem kolumner och följer kortet. */
.byravy .byra-attest__tabell { min-width: 0; }
@media (max-width: 760px) {
  /* Staplade rader följer kortets bredd — den rullande omslutningen hade
     annars låtit tabellen bli bredare än kortet och skjutit värdena ut. */
  .byra-attest__klient .table-wrapper { overflow: visible; padding: var(--space-3) var(--space-3) 0; }
  .byravy .byra-attest__tabell { display: block; width: 100%; }
  .byra-attest__tabell tbody td { white-space: normal; }
}
