/* KIND 2.0 admin-portal overrides (W2-14 + W2-15)
 *
 * Owner: frontend-web (per docs/contracts/file-ownership.md).
 * Scope: vårdpersonal + klinik-admin surface. Loaded after kind.css via the
 *        {% block per_domain_css %} hook in base.html. Patient surface is
 *        kind_patient.css; admin and patient never load both.
 * Why a separate file: admin users are at desk on a laptop, interrupt-driven,
 *        scanning long lists between walk-ins. Denser layout, slightly smaller
 *        body type than patient (back to 16px), tabular surfaces, sortable
 *        column headers. Cooler palette so the admin doesn't feel like the
 *        patient surface; same accent though so the brand reads as one product.
 * Budget: under 400 lines per the Phase 2 prompt.
 */

.kind-body--admin {
  --kind-font-base: 1rem;                /* 16px, one tick smaller than patient (18px) */
  /* Classic+ (ADR-065 §D1, CP-02): the clinician surface carries the SAME cool
     clinical bearing surfaces as the rest of the product, so patient and
     vårdgivare read as one product. The warm blush that used to sit here came
     from hue-matching the MARKETPLACE (www.kind.app), not the product; see the
     long note in kind.css §1 Tokens before changing it back.
     What is NOT changed: the denser 16px body and the wider 80rem container for
     desk-bound clinician work. */
  --kind-color-bg: #F5F7FA;
  --kind-color-surface: #FFFFFF;
  --kind-color-surface-muted: #EBEFF4;
  --kind-color-danger-ghost: #BD3745;    /* #371: 4.79:1 on the muted row-hover surface */
  --kind-line-height: 1.5;
  --kind-container-max: 80rem;           /* wider container, admin runs on big screens */
}

/* #218/#413, selected variant A: one patient-search field with tag suggestions. */
.kind-patient-search-combobox {
  flex: 1 1 24rem;
  min-width: min(100%, 18rem);
  position: relative;
}

.kind-patient-search-combobox__control {
  align-items: center;
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-1);
  min-height: 44px;
  padding: var(--kind-space-1);
}

.kind-patient-search-combobox__control:focus-within {
  outline: var(--kind-focus-ring);
  outline-offset: var(--kind-focus-ring-offset);
}

.kind-patient-search-combobox__chips {
  display: contents;
}

.kind-patient-search-combobox__chip {
  align-items: center;
  background: var(--kind-color-accent-soft);
  border: 1px solid var(--kind-color-accent);
  border-radius: 999px;
  display: inline-flex;
  gap: var(--kind-space-1);
  max-width: 100%;
  min-height: 36px;
  padding-inline-start: var(--kind-space-2);
}

.kind-patient-search-combobox__chip > span {
  overflow-wrap: anywhere;
}

.kind-patient-search-combobox__chip button {
  align-items: center;
  align-self: stretch;
  background: transparent;
  border: 0;
  border-radius: 999px;
  color: inherit;
  cursor: pointer;
  display: inline-flex;
  font: inherit;
  justify-content: center;
  min-width: 44px;
}

.kind-patient-search-combobox__chip button:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: var(--kind-focus-ring-offset);
}

.kind-patient-search-combobox__input.kind-field__input {
  border: 0;
  box-shadow: none;
  flex: 1 1 12rem;
  min-width: 8rem;
  outline: 0;
}

.kind-patient-search-combobox__listbox {
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  box-shadow: var(--kind-shadow-md);
  inset-inline: 0;
  list-style: none;
  margin: var(--kind-space-1) 0 0;
  max-height: min(20rem, 50vh);
  overflow-y: auto;
  padding: var(--kind-space-1);
  position: absolute;
  z-index: 20;
}

.kind-patient-search-combobox__listbox[hidden],
.kind-patient-search-combobox__message[hidden] {
  display: none;
}

.kind-patient-search-combobox__listbox [role="option"] {
  align-items: center;
  border-radius: var(--kind-radius);
  cursor: pointer;
  display: flex;
  gap: var(--kind-space-2);
  justify-content: space-between;
  min-height: 44px;
  overflow-wrap: anywhere;
  padding: var(--kind-space-2);
}

.kind-patient-search-combobox__listbox [role="option"][aria-selected="true"] {
  background: var(--kind-color-accent-soft);
  outline: 2px solid var(--kind-color-accent);
}

.kind-patient-search-combobox__listbox [role="option"] > span {
  color: var(--kind-color-text-muted);
  flex: 0 0 auto;
  font-size: var(--kind-font-small);
}

.kind-patient-search-combobox__message {
  margin-block: var(--kind-space-1) 0;
}

/* web#218 punkt 14 (beställarens tillägg 2026-09-24): gamla KINDs rensa-kryss
   INUTI fältet, i stället för en separat länk `Rensa` vid sidan av det. Krysset
   läggs in av `kind_patient_search_combobox.js` och finns alltså bara när
   live-filtreringen faktiskt är aktiv -- utan JavaScript står länken `Rensa`
   kvar, och då ska inget kryss finnas (det hade inte kunnat göra något).

   GRÅTT, som i kundens nuvarande app, men via `--kind-color-text-muted` så
   kontrasten följer temat i stället för att pinnas till en hex. 44px träffyta
   (WCAG 2.5.8) och synlig fokusmarkering, samma mönster som chip-krysset ovan. */
.kind-patient-search-combobox__rensa {
  align-items: center;
  background: none;
  border: 0;
  border-radius: var(--kind-radius);
  color: var(--kind-color-text-muted);
  cursor: pointer;
  display: flex;
  flex: 0 0 auto;
  font-size: 1.25rem;
  justify-content: center;
  line-height: 1;
  min-height: 44px;
  min-width: 44px;
  padding: 0;
}

.kind-patient-search-combobox__rensa:hover {
  color: var(--kind-color-text);
}

.kind-patient-search-combobox__rensa:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: var(--kind-focus-ring-offset);
}

/* `hidden`-GARD, och mekanismen är URSPRUNG och inte specificitet: UA-arkets
   `[hidden] { display: none }` saknar `!important`, och `display: flex` ovan är
   en normal FÖRFATTARdeklaration, som vinner i kaskadens sorteringsordning.
   Utan den här raden är `rensa.hidden = true` i
   `static/js/kind_patient_search_combobox.js` INERT: krysset står kvar med tomt
   fält, vilket är precis vad beställaren underkände 2026-09-25 (web#218), och
   samma defektklass som listhuvudet i #220/#608. Garden ligger per klass och
   UTAN `!important` (CLAUDE.md regel 27 korollarium 2). */
.kind-patient-search-combobox__rensa[hidden] {
  display: none;
}

/* ETT kryss, inte tva (web#218, bestallarens krav 2026-09-26 13:38). Faltet ar
   `type="search"`, sa Chromium (och andra WebKit/Blink-motorer) ritar SIN EGEN
   rensknapp inuti faltet, bredvid appens `Rensa sokningen`. Gamla KIND har ett
   kryss (mod/2493, mod/2494), och tva kryss bredvid varandra ar tva olika
   affordanser for samma handling -- den ena med tillgangligt namn och 44px
   traffyta, den andra utan.

   SKOPAD TILL KOMBOBOXFALTET, med avsikt. No-JS-grunden
   (`templates/admin/patienter.html`, else-grenen) har INGET eget kryss: dar ar
   webblasarens rensknapp den enda rensaffordansen inuti faltet, och en oskopad
   regel hade tagit bort den. Darfor pekar selektorn pa
   `.kind-patient-search-combobox__input` och inte pa `input[type="search"]`.

   Utan JavaScript renderas komboboxgrenen ocksa utan appens kryss (det laggs in
   av `kind_patient_search_combobox.js`), men da star lanken `Rensa` kvar --
   skriptet tar bort den forst nar live-filtreringen ar aktiv -- sa ytan har
   fortfarande exakt en rensaffordans.

   Firefox ritar ingen rensknapp for `type="search"`, sa regeln ar en no-op dar.
   `-webkit-appearance: none` ar det som faktiskt tar bort knappen i Blink;
   `display: none` star kvar som ett andra, oberoende grepp pa samma
   pseudoelement. Ingen `!important` (CLAUDE.md regel 27 korollarium 2). */
.kind-patient-search-combobox__input::-webkit-search-cancel-button,
.kind-patient-search-combobox__input::-webkit-search-decoration {
  -webkit-appearance: none;
  appearance: none;
  display: none;
}

@media (max-width: 430px) {
  .kind-patient-search-combobox {
    flex-basis: 100%;
    min-width: 100%;
  }
}

/* CP-03 (issue #88, ADR-065 §D6.1): attribute, not media query. The body-level
   re-declaration is still needed even though kind.css sets the same tokens on
   <html>: a declaration on the BODY wins for the body subtree by inheritance,
   so without this the clinician surface would keep its light bearing surfaces
   inside a dark page. See the long note in kind.css §1a. */
html[data-kind-theme="dark"] .kind-body--admin {
  /* Classic+ DARK bearing surfaces, identical to kind.css §1a. The values are
     repeated rather than referenced because a CSS custom property cannot be
     re-declared by reference to its own <html>-level value from a body-level
     rule; the drift-guard is the matrix generator's control 8, which parses
     BOTH files and fails if these three ever diverge from the dark set. */
  --kind-color-bg: #12161B;
  --kind-color-surface: #1A2028;
  --kind-color-surface-muted: #232B34;
  --kind-color-danger-ghost: var(--kind-color-error);
}

/* ============ Layout: sticky top bar + clinic-context badge ============ */

.kind-admin-context {
  display: inline-flex;
  align-items: center;
  gap: var(--kind-space-2);
  padding: var(--kind-space-1) var(--kind-space-3);
  background: var(--kind-color-accent-bg);
  color: var(--kind-color-accent);
  border-radius: var(--kind-radius-pill);
  font-size: var(--kind-font-small);
  font-weight: 600;
}
.kind-admin-context__icon { font-size: 1rem; line-height: 1; }

/* ============ WS-C / ADR-025: workspace switcher (multi-org clinician) ============
 *
 * KIND's D14 wish: a clear workspace selector in the clinician chrome (top-left,
 * near the klinik banner) that reads as a workspace control, NOT a stray link.
 * Renders ONLY for a konto with >1 active membership AND FEATURE_MULTIORG_LOGIN on
 * (gating lives in app/auth/__init__.py + base.html; this is styling only).
 *
 * Treatment: a bordered card-pill that shows the active mottagning + a "Byt"
 * affordance, so the current workspace is obvious at a glance and the switch is
 * an explicit action. The whole control is one anchor (44px min height, full
 * keyboard + global focus-ring from kind.css). Colours reuse the warm accent
 * family so it sits beside the .kind-admin-context badge as one vocabulary.
 *   - icon + "Byt" chip use --kind-color-accent on --kind-color-accent-bg
 *     (5.34:1 / 4.98:1 light, 8.36:1 dark; past AA text + the 3:1 non-text floor)
 *   - the eyebrow label is --kind-color-text-muted (5.87:1 on bg, AA)
 *   - the org name is full-strength --kind-color-text (16.55:1)
 */
.kind-workspace-switch {
  display: inline-flex;
  align-items: center;
  gap: var(--kind-space-3);
  min-height: 44px;
  padding: var(--kind-space-2) var(--kind-space-3);
  background: var(--kind-color-surface);
  color: var(--kind-color-text);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  text-decoration: none;
  line-height: 1.2;
  max-width: 18rem;
}
.kind-workspace-switch:hover {
  background: var(--kind-color-accent-bg);
  border-color: var(--kind-color-accent);
  color: var(--kind-color-text);
}
.kind-workspace-switch__icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: none;
  width: 1.75rem;
  height: 1.75rem;
  border-radius: var(--kind-radius-pill);
  background: var(--kind-color-accent-bg);
  color: var(--kind-color-accent);
  font-size: 1rem;
  line-height: 1;
}
.kind-workspace-switch__text {
  display: flex;
  flex-direction: column;
  min-width: 0;          /* allow the org name to ellipsise rather than overflow */
}
.kind-workspace-switch__label {
  font-size: 0.8125rem;  /* 13px, husets absoluta golv (CP-04); var 11px */
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--kind-color-text-muted);
}
.kind-workspace-switch__org {
  font-weight: 600;
  font-size: var(--kind-font-small);
  color: var(--kind-color-text);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.kind-workspace-switch__action {
  flex: none;
  margin-left: auto;
  padding: 2px 10px;
  border-radius: var(--kind-radius-pill);
  background: var(--kind-color-accent-bg);
  color: var(--kind-color-accent);
  font-size: var(--kind-font-small);
  font-weight: 600;
}

/* ============ Dashboard counters (UX A-01) ============ */

/* KOLUMNGOLVET SKALAR MED TEXTEN (issue #155). `minmax(180px, 1fr)` var ett
   FAST pixelgolv under ett innehall som ar rem-satt, och den obalansen ar hela
   defekten: vid xxlarge vaxer `.kind-stat__label` med 50 procent (rot 16px ->
   24px, alltsa `--kind-font-small` 14px -> 21px) medan golvet star kvar pa
   180px, sa auto-fit packar fortfarande TVA spar dar texten behover ett.

   Uppmatt pa 2.3.4-nordiccare-w32 vid 430/xxlarge: tva spar a 182px ger
   etiketten en innehallsbox pa 132px, och versala "KONVERSATIONER" ar 196px
   blaeck utan en enda mjuk brytpunkt. Texten ritas 64px utanfor sin box, 39px
   utanfor sjalva kortet och 15px utanfor viewporten, alltsa horisontell
   dokumentskroll och WCAG 2.2 AA SC 1.4.10 (Reflow) brutet.

   VARFOER `max(180px, 10rem)` och inte rena `11.25rem` (som ar samma 180px vid
   normal skala): ett rent rem-golv hade tvingat ETT spar aven vid `large`, dar
   tva spar a 190px matbart RYMMER etiketten (blaeck 147px, box 154px). 10rem
   ar exakt 180px vid `large`, sa `normal` och `large` blir OFORANDRADE pa bada
   axlarna vid samtliga uppmatta bredder, och bara de tva skalor som faktiskt
   brister packas om.

   VARFOER INTE `overflow-wrap: anywhere` pa etiketten: den tar ocksa bort
   skrollen, men den bryter versala svenska ord mitt itu ("KONVERSATIONE/R"),
   och den hade slagit till aven vid 412/large dar blaecket ryms i kortets
   polstring och rendret redan ar korrekt. Alltsa samre lasbarhet pa en
   matpunkt som inte har nagon defekt. Det ar samma avvagning som avvisade
   cellbrytning i #153. */
.kind-stats {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(max(180px, 10rem), 1fr));
  gap: var(--kind-space-3);
  margin-bottom: var(--kind-space-5);
}
.kind-stat {
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-4);
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-2);
}
.kind-stat__label {
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  font-weight: 600;
}
.kind-stat__value {
  font-family: var(--kind-font-serif);
  font-size: 2.25rem;
  font-weight: 600;
  color: var(--kind-color-text);
  line-height: 1.1;
}
.kind-stat__sub { font-size: var(--kind-font-small); color: var(--kind-color-text-muted); }

.kind-actions-row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-3);
  margin-bottom: var(--kind-space-5);
}

/* ============ Tables (dense, sortable, list surfaces) ============ */

/* Section title (h1 + a primary action, e.g. Triageringsregler + "Skapa ny
   regel"): the shared .kind-section__title base is a non-wrapping
   space-between flex row, so at 320px the heading + button do not fit and force
   horizontal PAGE overflow (row 1.x-b: /admin/triage overflowed 113px at 320px,
   the boven was this title row, not the already-scroll-contained table). Scoped
   to .kind-body--admin so only the clinician/admin pages wrap; the h1 gets
   min-width:0 + overflow-wrap so a long heading breaks instead of forcing width.
   1.4.10 reflow. */
.kind-body--admin .kind-section__title {
  flex-wrap: wrap;
}
.kind-body--admin .kind-section__title > h1 {
  min-width: 0;
  overflow-wrap: anywhere;
}
/* CP-05 (#90) täthet, brief §4.3. Rubrikens botten-marginal (space-4, 24px vid
   xxlarge) och arbetsytans topp-polstring (space-5) betalades av VARJE
   vårdgivarsida innan det första innehållet. Storleken på H1 är orörd, det är
   luften runt den som krympt. Scopat till vårdgivarportalen; patientytorna har
   sin egen rytm och sitt eget kontrakt. */
.kind-body--admin .kind-section__title > h1 {
  margin-bottom: var(--kind-space-2);
}
.kind-body--admin .kind-main {
  padding-top: var(--kind-space-3);
}

/* CP-02-resten (#87): funktionell kant, inte den dekorativa hairlinen. Wrappen
   är [tabindex="0"] (se fokusregeln nedan), alltså en fokuserbar komponent, och
   dess kant är det enda som skiljer den vita ytan från sidbakgrundens 1.07:1.
   Designregeln står i kind.css §6, vakten i tests/test_classic_plus_tokens_css.py. */
.kind-table-wrap {
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  overflow-x: auto;
  /* ISSUE #184: vaddring för en fokuserad kontroll som rullas in i porten.
   *
   * 27px = kantledtrådens 22px täckare (den delade regeln i kind.css, fastnitad
   * vid porten med `scroll` attachment) + fokusringens 5px (3px outline + 2px
   * offset). Utan den landar knappen tekniskt "inne i porten" men UNDER
   * ledtråden, alltså en fix som passerar ett rectmått och ändå inte visar
   * kontrollen. Det är samma feltyp som #166 fann på navet, där inline-axeln
   * bar 4px mot ringens 5px medan blockaxeln redan hade sin härledda 6:a.
   *
   * LITERAL OCH INTE ETT SPACE-TOKEN, av samma skäl som navets `padding: 6px`:
   * talet är härlett ur två a11y-konstanter (ledtrådens bredd och ringens
   * geometri) och inte ur typografirytmen, så ett token hade dolt härledningen
   * och tyst ändrats med rytmen. `kind_skrollport_fokus.js` LÄSER det här
   * värdet ur computed style, så CSS förblir enda källan.
   *
   * Egenskapen är INERT tills en rullning sker, alltså kan den inte ändra
   * rendret för en muspekaranvändare. */
  scroll-padding-inline: 27px;
}
/* A keyboard user must be able to scroll a horizontally-overflowing table
   region (WCAG 2.1.1): the [tabindex="0"] on .kind-table-wrap (set in the
   templates) makes the scroll container focusable; give it a visible focus ring
   so it is discoverable. The wrap already scroll-contains the table
   (overflow-x:auto), so the table never forces page overflow, but it needs to be
   REACHABLE by keyboard, not mouse-only. */
.kind-table-wrap:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}
.kind-table {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--kind-font-base);
}
.kind-table caption {
  text-align: left;
  padding: var(--kind-space-3) var(--kind-space-4);
  font-weight: 600;
  background: var(--kind-color-surface-muted);
  border-bottom: 1px solid var(--kind-color-border-soft);
}
.kind-table th, .kind-table td {
  text-align: left;
  padding: var(--kind-space-3) var(--kind-space-4);
  border-bottom: 1px solid var(--kind-color-border-soft);
  vertical-align: top;
}
/* MISC-04 hardening (UAT 2026-07-16): OPT-IN modifier for tables whose cell
   content can carry unbreakable user tokens (a spaceless mottagningsnamn, a
   URL-like routing target, a long villkor value). Such a token must be able to
   break, so it stops inflating the column's max-content width and forcing
   avoidable horizontal scroll in .kind-table-wrap.
   Deliberately NOT on the global .kind-table cell rule (blast radius: other
   admin tables' wrapping was not re-verified in this batch); today applied
   to the triage table (templates/admin/triage.html).

   ISSUE #144 (omtest 2026-08-08): VARDET AR `break-word`, INTE `anywhere`, och
   modifieraren heter darfoer inte langre `--wrap-anywhere`. Bytet ar hela
   fixen for #144, sa mekanismen ska sta har och inte i en commit ingen laser.

   `anywhere` och `break-word` ger BADA brytmojligheter inuti ett ord. Den enda
   skillnaden ar att `anywhere` RAKNAS MED nar min-content beraknas medan
   `break-word` INTE gor det. Med `anywhere` kollapsar varje cells min-content
   till ETT TECKEN, alltsa har tabellayouten ingen skyldighet att ge nagon
   kolumn plats for sitt langsta ord: fordelningen styrs helt av max-content,
   och den langsta fragetexten svalter grannkolumnerna. Det ar mekanismen bakom
   BADE KIND-FIND-01 (kroppen krossad) OCH #144 (rubrikraden och badgen
   krossade), och det ar skalet till att en fix pa bara rubrikcellerna FLYTTAR
   felet: uppmatt i ablation blir rubriken ren men `Andningsbesvar` i NAMN
   borjar i stallet brytas, eftersom rubrikernas aterupprattade min-content tar
   bredd fran kroppens kolumner inom ett fast golv.

   Med `break-word` ar varje kolumns min-content sitt LANGSTA ORD, sa inget
   vanligt ord kan krossas, medan brytmojligheten finns kvar som skyddsnat om
   kolumnen anda pressas under sin min-content. Sart empiriskt i samma motor
   som grinden kor (en 26-teckens token i en 60px container): `anywhere` ger
   tabellbredd 60px och ordet i 4 rects, `break-word` ger 194px och 1 rect.

   PRISET, uppmatt och medvetet taget: tabellen vaxer fran 704px till 827px vid
   390/normal, alltsa skrollstracka 348 -> 471px, och vid 320/xxlarge 786 ->
   924px. Alternativet, att behalla `anywhere` och i stallet hoja golvet, matte
   VARRE pa samma axel (54-56rem kravdes for att bli ren, alltsa 508-540px
   skroll) och hade dessutom gjort konstanten fixturberoende. Harledningen
   ligger i e2e/triage144-golvharledning.mjs och e2e/triage144-breakword.mjs.
   Grinden har ett breddtak (60rem) sa lasbarhet inte kan kopas med obegransad
   skrollstracka. Skrollindikeringen i sig ar issue #145, den delade noden. */
.kind-table--wrap-break-word th,
.kind-table--wrap-break-word td {
  overflow-wrap: break-word;
}
/* KIND-FIND-01 (testarrapport 2026-07-28): LASBARHETSGOLV, infort som par till
   `anywhere`-varianten av modifieraren ovan och nodvandigt just PA GRUND AV
   den. `anywhere` drog en cells min-content ner till ETT TECKEN, sa utan ett
   golv kollapsade hela tabellen till containerns bredd i stallet for att
   overflowa: uppmatt pa driftsatt 2.1.13 var .kind-table-wrap scrollWidth
   356 == clientWidth 356 vid 390px (alltsa INGEN sidledsscroll), kolumnerna
   30-57px och radhojden 313-361px, med vanliga ord som "Andningsbesvar"
   sonderbrutna till 1-3 tecken per rad. Det var precis den lasbarhet KIND
   underkande. (Notera: KIND-MOB-05-kommentaren nedan pastod ett ~500px-golv
   fran knappar och padding. Den rakningen glomde sin egen brytregel och var
   fel; texten ar rattad darnere.)

   STATUS EFTER #144 (2026-08-09): golvet ar numera INERT pa de tillstand som
   finns, och det ar MATT och inte antaget. Med `break-word` ar tabellens egen
   min-content 827px (seed) respektive 829px (tungt), alltsa over 44rem = 704px,
   sa golvet binder aldrig. Korningen med golvet nollstallt gav exakt samma
   siffror pa samtliga 40 matpunkter (e2e/triage144-breakword.mjs, B1 mot B2).

   Regeln star anda kvar, av ETT skal: en gles tabell (fa kolumner, korta
   varden) har en min-content under 704px, och da ar golvet fortfarande det som
   ger scrollporten nagot att scrolla i stallet for att lata kolumnerna
   komprimeras. Talet 44rem ar darfor inte langre en harledd lasbarhetsgrans
   utan ett bottenvarde. Lasbarhetsgransen bars nu av `break-word` ovan, som
   inte kan underskrida ett ords bredd.

   Genuint langa tokens ("Rokavvanjningsmottagningen", 213px) far fortfarande
   brytas, men numera forst nar kolumnen pressas under sin min-content, inte
   rutinmassigt. Priset syns i ROUTAS TILL, som blir 213px bred i stallet for
   att bryta tokenet direkt.
   Sidledsscroll ar det avsedda utfallet har, inte en biverkning:
   .kind-table-wrap ar redan byggd for det (overflow-x:auto + tabindex="0" +
   role="region" + aria-label "bladdra i sidled"), och WCAG 1.4.10 undantar
   uttryckligen datatabeller fran kravet pa scroll i bara en riktning.
   UPPFOLJNING (oforandrad fran 2026-07-16): en table->staplade-kort-behandling
   for smala skarmar ar ratt slutmal men ar ett eget designbeslut, inte en
   UAT-fixbatch. */
.kind-table--scroll-floor {
  min-width: 44rem;
}
/* KIND-MOB-05 (UAT 2026-07-16, mobil 374/378px): halverar cellernas
   inline-padding vid <=600px (sparar ~96px tvingad bredd, ~25% av en
   374px-viewport i scrollstracka). Typsnittet rors INTE (13px-golvet).
   RATTELSE 2026-07-28: den har kommentaren pastod tidigare att tabellen "kan
   inte komprimeras under ~500px ens med overflow-wrap" och att sidledsscroll
   darfor KVARSTAR pa mobil. Det var FEL, och felet var lobarande: rakningen
   summerade knappar, badge och padding men glomde att den davarande
   `anywhere`-regeln (direkt ovanfor) drar varje textcells min-content till ETT
   TECKEN, vilket uppfor sig helt annorlunda an ett knappgolv. Uppmatt pa
   driftsatt 2.1.13 fanns INGEN scroll vid 390px eller 375px (scrollWidth ==
   clientWidth) och texten krossades i stallet, vilket KIND underkande
   (KIND-FIND-01). Lardomen ar att ett pastaende om RENDERAT utfall inte hor
   hemma enbart i en kommentar: det ska matas i webblasare och vaktas av en
   grind (e2e/triage-tabell-lasbarhet.mjs).
   Halveringen har ar oforandrad av #144 och fortfarande lonsam: den ar 16px per
   cell och 6 kolumner, alltsa ~96px mindre skrollstracka. */
@media (max-width: 600px) {
  .kind-table--wrap-break-word th,
  .kind-table--wrap-break-word td {
    padding-inline: var(--kind-space-2);
  }
}
.kind-table thead th {
  background: var(--kind-color-surface-muted);
  font-weight: 600;
  font-size: var(--kind-font-small);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--kind-color-text-muted);
  position: sticky;
  top: 0;
  z-index: 1;
}
.kind-table tbody tr:hover { background: var(--kind-color-surface-muted); }
.kind-table tbody tr:last-child td { border-bottom: none; }
.kind-table__row-link {
  display: block;
  color: var(--kind-color-text);
  text-decoration: none;
  font-weight: 600;
}
.kind-table__row-link:hover { color: var(--kind-color-accent); text-decoration: underline; }

/* Sortable column header */
.kind-table th a.kind-table__sort {
  color: var(--kind-color-text-muted);
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  gap: var(--kind-space-1);
}
.kind-table th a.kind-table__sort:hover { color: var(--kind-color-text); }
.kind-table th[aria-sort="ascending"] a.kind-table__sort,
.kind-table th[aria-sort="descending"] a.kind-table__sort { color: var(--kind-color-text); }
.kind-table th[aria-sort="ascending"] a.kind-table__sort::after { content: " \25B2"; }
.kind-table th[aria-sort="descending"] a.kind-table__sort::after { content: " \25BC"; }

/* Status badges */
.kind-badge {
  display: inline-block;
  padding: 2px 10px;
  border-radius: var(--kind-radius-pill);
  font-size: var(--kind-font-small);
  font-weight: 600;
  background: var(--kind-color-surface-muted);
  color: var(--kind-color-text);
  border: 1px solid var(--kind-color-border-soft);
}
.kind-badge--success { background: var(--kind-color-success-bg); color: var(--kind-color-success); border-color: var(--kind-color-success); }
.kind-badge--warning { background: var(--kind-color-warning-bg); color: var(--kind-color-warning); border-color: var(--kind-color-warning); }
.kind-badge--error   { background: var(--kind-color-error-bg);   color: var(--kind-color-error);   border-color: var(--kind-color-error); }
.kind-badge--info    { background: var(--kind-color-info-bg);    color: var(--kind-color-info);    border-color: var(--kind-color-info); }
.kind-badge--draft   { background: var(--kind-color-surface-muted); color: var(--kind-color-text-muted); }

/* agents#414 (K16), tillståndsbrickan för OHANTERAT i patientradens primärgrupp.
 * Konsultbeslut 2026-08-19, variant B "byt vikt"
 * (docs/design-proposals/236/k32-semantik/BESLUT.md): det BOOLESKA hanterat-
 * tillståndet tar den fyllda brickan, det NUMERISKA olästtalet degraderas till
 * neutral metatext. Brickan ADDERAS alltså inte, den tar olästpluppens plats,
 * vilket är avsett som nollsumma mot CP-05:s budget på högst två visuellt
 * dominerande statuselement per rad.
 *
 * FYLLNINGEN ÄR AVSIKTLIGT AKROMATISK. --kind-color-border-strong är husets
 * FUNKTIONELLA kanttoken och är redan bäraren av #236:s kantmarkör för samma
 * tillstånd, alltså införs ingen ny kulör i produkten och de två kanalerna
 * (kant plus bricka) talar med samma röst. En varningsfärg hade lagt ett tredje
 * KROMATISKT statuselement på tyngsta raden, alltså betalat #414 med #90:s
 * budget, precis den växel agents#177 och agents#190 båda vägrade (minne
 * `feedback-cross-domain-cost-on-customer-budget`).
 *
 * TEXTFÄRGEN ÄR EN TOKEN OCH INGEN LITERAL (a11y-villkor 3 i beslutsfilens
 * §8.1). Mocken bar `color: #FFFFFF`, vilket är rätt i LJUST tema och fel i de
 * tre andra: --kind-color-border-strong skiftar till #9BA6B4 i mörkt, #000000 i
 * högkontrast ljust och #ffffff i högkontrast mörkt. --kind-color-text-on-accent
 * är husets token för läsbar etikett PÅ en fylld statusyta och följer med i alla
 * fyra teman. Beräknad kontrast per tema: 6,18:1 ljust (#FFFFFF på #59626D),
 * 7,62:1 mörkt (#0D1218 på #9BA6B4), 21:1 i båda högkontrastlägena, alltså över
 * WCAG 2.2 SC 1.4.3:s golv 4,5:1 i samtliga. Talen är RÄKNADE ur tokenvärdena i
 * kind.css och ska mätas i webbläsare innan de bärs som ett godkännande.
 *
 * WCAG 2.2 SC 1.4.1: bäraren är ORDEN "Ej hanterad", fyllningen är förstärkning
 * och aldrig ensam bärare. Brickan är inte interaktiv och får inte bli det
 * (SC 2.5.8 plus risken för oavsiktlig klarmarkering i en klinisk lista). */
.kind-badge--tillstand {
  background: var(--kind-color-border-strong);
  color: var(--kind-color-text-on-accent);
  border-color: var(--kind-color-border-strong);
}

/* Role badge (loggutdrag actor column) */
.kind-role-badge {
  font-size: 0.8125rem;  /* 13px, husets absoluta golv (CP-04); var 12px */
  text-transform: uppercase;
  letter-spacing: 0.04em;
  padding: 2px 8px;
  border-radius: var(--kind-radius-pill);
  background: var(--kind-color-info-bg);
  color: var(--kind-color-info);
}
.kind-role-badge--vardpersonal { background: var(--kind-color-info-bg); color: var(--kind-color-info); }
.kind-role-badge--admin { background: var(--kind-color-warning-bg); color: var(--kind-color-warning); }

/* AT-29b clinician inbox: unread-message count badge (Olästa column).
 * Rendered ONLY when the count is >= 1 (ADR-011: a "0" badge on every row
 * is a clinical-safety hazard, so zero renders the muted dash below, not a
 * badge). Uses the error palette so a waiting patient message reads as
 * attention-worthy at a scan. Contrast: --kind-color-error on
 * --kind-color-error-bg is well above 4.5:1 in both themes (light
 * --kind-color-error on --kind-color-error-bg). The badge carries its own
 * aria-label in the template so screen readers announce "N olästa
 * meddelanden från <namn>", not a bare number. */
.kind-badge--unread {
  background: var(--kind-color-error-bg);
  color: var(--kind-color-error);
  border-color: var(--kind-color-error);
  font-variant-numeric: tabular-nums;
  min-width: 1.5rem;
  text-align: center;
}
/* ADR-047 (#11) röd(egna)/grå(andras) oläst-indikator on the arbetskö rail.
 * COLOUR is the at-a-glance carrier ONLY; WCAG 2.1 SC 1.4.1 (Use of Color, W3C
 * Recommendation 2023-09-21) is satisfied by THREE non-colour carriers: the
 * filled-vs-outline SHAPE + bold-vs-regular WEIGHT below (survives greyscale +
 * deuteranopia), the visually-hidden "mina"/"annan vårdperson" label + row
 * aria-label (screen reader), and the "Ansvarig: <namn>" line on andras rows.
 * Red(egna)/grey(andras) is chosen over red/green deliberately: grey is
 * hue-neutral so the distinction survives every common colour-vision
 * deficiency. */
/* Egna (mine): solid red fill, bold. White on --kind-color-error is
 * ~6.4:1 (passes SC 1.4.3 >= 4.5:1). The filled shape + 700 weight carry
 * "mine, act on it" WITHOUT colour. */
/* CP-03 (issue #88): the count was a hardcoded #fff on a TOKEN fill, 5.10:1 on
 * the light error red and 2.64:1 on the dark one, i.e. an unread count a
 * clinician in dark mode could not read. --kind-color-text-on-accent is the
 * token for a readable label on a filled accent/status surface: #FFFFFF in
 * light (byte-identical rendering) and #0D1218 in dark, measured 8.62:1 there. */
.kind-badge--unread-egna {
  background: var(--kind-color-error);
  color: var(--kind-color-text-on-accent);
  border-color: var(--kind-color-error);
  font-weight: 700;
}
/* Andras (a colleague's): hollow outline, regular weight, neutral grey.
 * --kind-color-text-muted (#6b5d5a, 5.87:1 on bg, passes 1.4.3) on a
 * transparent fill, --kind-color-border (3.34:1 on white after Classic+, passes
 * SC 1.4.11 non-text >= 3:1) outline. The outline shape + the muted weight +
 * the "Ansvarig" line carry "someone else's, be aware" WITHOUT colour. */
.kind-badge--unread-andras {
  background: transparent;
  color: var(--kind-color-text-muted);
  border-color: var(--kind-color-border);
  font-weight: 400;
}
/* Muted placeholder for an empty inbox cell (zero unread, or no messages
 * yet). Visually quiet so the eye skips to rows that actually have a
 * count; the cell still carries an aria-label so the column is not silent
 * to a screen reader. */
.kind-unread--none {
  color: var(--kind-color-text-muted);
}

/* "Tilldelad dig" pill on a patient row the acting clinician is assigned
 * to. Kept subtle (info palette, small) so it annotates without competing
 * with the unread badge. In 2.0 patient_assignment is empty so this is
 * dark for every row; it lights up when 2.1 assignment writes land. */
.kind-pill {
  display: inline-block;
  margin-left: var(--kind-space-2);
  padding: 1px 8px;
  border-radius: var(--kind-radius-pill);
  font-size: var(--kind-font-small);
  font-weight: 600;
  vertical-align: middle;
}
.kind-pill--assigned {
  background: var(--kind-color-info-bg);
  color: var(--kind-color-info);
}
/* G1: "N ohanterade" pill on a patient inbox row. Warning palette (amber),
 * distinct from the info-blue "Tilldelad dig" pill. --kind-color-warning
 * --kind-color-warning on --kind-color-warning-bg is WCAG AA for this small-but-bold
 * pill text; the dark-theme tokens carry the inverse. */
.kind-pill--ohanterad {
  background: var(--kind-color-warning-bg);
  color: var(--kind-color-warning);
}

/* G1: handled-state toggle in the chat header (Hanterad / Markera som
 * hanterad / Ångra klarmarkering). A row of state + action; the action
 * buttons are slightly compact so they sit under the heading without
 * dominating it. */
.kind-chat__handled {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--kind-space-2) var(--kind-space-3);
  margin-top: var(--kind-space-2);
}
.kind-chat__handled-state {
  display: inline-flex;
  align-items: center;
  gap: var(--kind-space-2);
  margin: 0;
}
.kind-chat__handled-meta {
  color: var(--kind-color-text-muted);
  font-size: var(--kind-font-small);
}
.kind-chat__handled-form { margin: 0; }
.kind-chat__handled .kind-btn {
  padding-block: 4px;
  font-size: var(--kind-font-small);
}

/* G6 "Exportera chatt" header affordance: a ghost button-link sitting in the
   chat header. The icon + label sit on one baseline; the whole link is a >=44px
   target via the kind-btn padding. */
.kind-chat__export { margin: var(--kind-space-2) 0 0; }
.kind-chat__export-link {
  display: inline-flex;
  align-items: center;
  gap: var(--kind-space-2);
}
.kind-chat__export-icon { display: inline-flex; }

/* ---- #43 clinician chat header: shared low sticky one-row header -----------
   (chatt-yta 2.1 refresh, DEL B #43). The header is now the shared
   templates/admin/_chat_header.html macro (chatt + arbetsvy render one source,
   rule 27/32), and it is a LOW single row (~48px target) instead of the old
   ~172px multi-row stack: patient NAME first + largest on the left, the
   functions as ICON-actions on the right. Scoped by .kind-chat-header (the macro
   root); the base .kind-chat__header sticky/opaque is inherited. Presentation
   only: no control, form, or POST target changed.

   --kind-admin-chat-focus-reserve drives the 2.4.11 scroll-margin reserve on
   focusable thread elements so a focused element always clears the sticky
   header. Defined on .kind-body--admin (the common ancestor of the header AND
   the thread) so it inherits to both and cannot drift. Now a single low row, so
   the reserve is small (header height + a buffer, vs the old 12rem).

   5rem -> 5.5rem (issue #110, 2026-08-05). Talet ar HARLETT ur en matning och
   inte hojt for sakerhets skull: sitechromens header gick fran 78 till 81px pa
   desktop nar navskrollarens fokusring-padding (6px block) blev obetingad, och
   80px reserv (5rem) tackte da inte langre de 81. Overlappet ar 1px, alltsa
   PARTIELLT, sa SC 2.4.11 Focus Not Obscured (Minimum) var fortfarande uppfylld
   (den faller forst nar elementet ar HELT dolt), men vardet var kalibrerat mot
   en uppmatt headerhojd och den hojden rorde sig, sa kalibreringen foljer med.
   88px tacker 81 med 7px buffert.

   Riktningen i ovrigt ar starkt POSITIV pa samma kriterium: vid xxlarge var
   headern 149 till 443px mot samma 80px-reserv INNAN andringen, alltsa grovt
   otackt, och ar nu 116px mot 120px (5rem vid 24px rot), alltsa tackt for
   forsta gangen. Smal bredd (<=900px) ar oberord, den har sin egen 10rem-bump i
   kind.css. */
.kind-body--admin {
  --kind-admin-chat-focus-reserve: 5.5rem;   /* uppmatt header 81px + buffert */
}
/* The header row: name/meta column left, icon-actions right, vertically centred.
   Sticky top:0 with an opaque surface bg + hairline so the thread does not show
   through as it scrolls under it. Low padding for a ~48px row; wraps only when a
   narrow width forces it (the actions drop below the name), never a tall stack on
   desktop. */
/* PIXELBUDGET 2026-07-26 (docs/contracts/chat-pixel-budget.md, tak 64px). Den
   uppmätta headern var 200px (identitetskolumn 75 + åtgärdsrad 96 + krom) trots
   att den var TÄNKT som "en låg enradig header": åtgärdsraden WRAPPADE, eftersom
   varje knapp bar en synlig textetikett (upp till "Tillbaka till patienter",
   ~211px) och arbetsvyns mittkolumn bara är ~476px vid 1280px viewport. Tre
   ändringar, alla presentationsnära, inget innehåll och inget länkmål borta:
     1. åtgärdsknapparna blir IKONKNAPPAR (etiketten CSS-gömd, aria-label + title
        bär namnet, 4.1.2) => raden ryms alltid på EN 44px-rad;
     2. namn + personnummer ligger på SAMMA rad (identitetslänken blir en flexrad
        med baslinjejustering) i stället för två staplade rader;
     3. padding-block kliver ned ett spacing-steg (8px -> 4px).
   Hanterad-statusen flyttade till metaraden i identitetskolumnen, se
   _chat_header.html. Resulterande CSS-matte: max(min-height 48, identitet
   ~46) + 8 padding + 1 border = 57px. */
.kind-chat-header {
  position: sticky;
  top: 0;
  z-index: 10;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  /* RADGAPET sänkt space-2 -> space-1 2026-07-27 (issue #80, fjärde rundan):
     headern har numera TVÅ rader i normalfallet (namn + åtgärder, sedan
     metaraden), så radgapet betalas på varje sidladdning i stället för bara vid
     radbrytning på smal skärm. 4px räcker för att skilja raderna åt, de hör
     ihop som ett identitetsblock och ska läsas som ett. Kolumngapet är orört. */
  gap: var(--kind-space-1) var(--kind-space-3);
  min-height: 48px;
  padding-top: var(--kind-space-2);
  padding-bottom: var(--kind-space-2);
  margin-bottom: var(--kind-space-3);
  background: var(--kind-color-surface);
  border-bottom: 1px solid var(--kind-color-border-soft);
}
/* PIXELBUDGET 2026-07-26, andra halvan av samma specificitetsläcka som
   patientnamnet (se .kind-chat-header .kind-chat-header__namn nedan): boxmåtten
   ovan ligger på `.kind-chat-header` (0,1,0), medan kind_patient.css deklarerar
   `.kind-chat__header { padding-bottom: var(--kind-space-3); margin-bottom:
   var(--kind-space-3) }` med SAMMA specificitet men SENARE källordning på
   klinikerytorna (de laddar kind_patient.css efter kind_admin.css). Patientens
   12px vann alltså över den avsedda kompakteringen, helt osynligt.
   Makrot emitterar BÅDA klasserna (`class="kind-chat__header kind-chat-header"`),
   så (0,2,0) nedan vinner oavsett filordning. */
.kind-chat__header.kind-chat-header {
  padding-top: var(--kind-space-1);
  padding-bottom: var(--kind-space-1);
  margin-bottom: var(--kind-space-2);
}
/* Name + meta column. min-width:0 so a long name ellipsis/wraps instead of
   pushing the actions off-row (1.4.10 reflow, edge "Långt patientnamn"). */
.kind-chat-header__main {
  min-width: 0;
  flex: 1 1 12rem;
}
/* V1 (#57, chatt-yta 2.1 feedback-plan 2026-07-08): the name + personnummer
   identity link. `color:inherit` + no underline keep the header's visual look
   unchanged at rest, an underline on the name only appears on hover as the
   "this is clickable" cue, and the shared focus ring shows on keyboard focus
   (2.4.7). min-width:0 keeps the name's own ellipsis working.

   PIXELBUDGET 2026-07-26: `display:block` staplade namnet (24px) OVANFÖR
   pnr-raden (22px), dvs 46px bara för identiteten, plus metaraden under. En
   flexRAD med baslinjejustering lägger pnr-chippet BREDVID namnet, så
   identitetskolumnen blir namnrad + metarad i stället för tre rader. wrap kvar
   så ett långt namn + pnr fortfarande får bryta vid smal bredd (1.4.10). */
.kind-chat-header__identity-link {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  column-gap: var(--kind-space-2);
  min-width: 0;
  color: inherit;
  text-decoration: none;
}
.kind-chat-header__identity-link:hover .kind-chat-header__namn {
  text-decoration: underline;
}
.kind-chat-header__identity-link:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
  border-radius: 4px;
}
/* Patient name: largest + most prominent (name-first). A single line that
   ellipses on desktop so the header stays one row; on a narrow width it may wrap
   (min-width:0 lets it break).

   PIXELBUDGET 2026-07-26 (specificitetsfix, verifierad orsak): selektorn var
   `.kind-chat-header__namn` (0,1,0), medan kind_patient.css deklarerar
   `.kind-chat__header h1 { font-size: clamp(1.5rem, 4.5vw + 0.4rem,
   var(--kind-font-h1)) }` (0,1,1). Klinikerytorna laddar kind_patient.css EFTER
   kind_admin.css (se templates/admin/chatt.html + arbetsvy.html), och (0,1,1)
   slår (0,1,0), så patientytans hjälte-clamp vann: patientnamnet renderades som
   2.5rem = 40px med radhöjd 1.2 = 48px, inte de avsedda 20px/24px. Det är ~24px
   ren höjd i en 64px-budget, osynligt i CSS-texten och exakt den sortens läckage
   som CSS-mattetesterna missade. Selektorn nedan är (0,2,0) och vinner därför
   oavsett filordning. */
.kind-chat-header .kind-chat-header__namn {
  font-size: 1.25rem;
  font-weight: 600;  /* ADR-065 §D4 (CP-04): display-sized heading role, cap 600 */
  margin: 0;
  line-height: 1.2;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* V1 (#57): the personnummer-only line inside the identity link, same small
   muted treatment as the meta line below (kept a SEPARATE rule because it
   lives inside .kind-chat-header__identity-link, not .kind-chat-header__meta,
   see _chat_header.html for why: an <a> may not nest another <a> and the tel:
   ambient must stay a real, independently-clickable link outside this one).

   PIXELBUDGET 2026-07-26: den låg INLINE bredvid namnet som ett chip
   (identitetslänken är en flexrad), inte på egen rad.

   FLYTTAD TILL METARADEN 2026-07-27 (issue #80, tredje rundan). Kundens målbild
   har namnet ensamt på rad 1 och personnumret på rad 2, och mätningen sa samma
   sak: med chippet kvar på namnraden delade de på cirka 268px och namnet fick
   106px av de 168 det behövde, alltså "Anna A..." vid ALLA bredder. Elementet är
   nu ett <span> i metaradens <p> (ett <p> får inte innehålla ett <p>) och lyder
   metaradens krympordning i stället för identitetsradens.

   `flex: 0 0 auto` + `nowrap`: personnumret är en IDENTIFIERARE och krymper
   aldrig, exakt samma regel som telefonnumret bredvid. `overflow-wrap: anywhere`
   är BORTTAGET med flit, det tillät en brytning mitt i sifferserien, vilket är
   precis vad man inte vill ha i ett personnummer. Vid extremt smala bredder
   (<1200px) är metaraden inte längre nowrap-låst till en rad av 64px-taket, så
   1.4.10-reflow hanteras där av att raden får bryta mellan objekten. */
.kind-chat-header__pnr {
  margin: 0;
  flex: 0 0 auto;
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
  white-space: nowrap;
}
/* Meta line (ämne + tel-ambient + hanterad-status): small + muted, under the
   name/pnr link.

   PIXELBUDGET-GRANSKNING 2026-07-26 (B1, uppmätt i riktig webbläsare, INTE en
   hypotes): raden var `flex-wrap: wrap`, och i det KLARMARKERADE tillståndet
   bär den tre objekt, "Tel <nummer>", "Hanterad"-badgen och "Klarmarkerad av
   <namn> <tid>". I arbetsvyns 476px-kolumn får identitetskolumnen ~320px, och
   objekten kräver ~510px, så raden bröt: metaraden gick 21px -> 48px och
   headern 57px -> 84px, alltså 20px över kontraktets 64px-tak.

   Varför ellipsen inte räckte som fix, och det här är hela poängen: flexboxens
   RADBRYTNING avgörs på barnens hypotetiska huvudstorlek (flex-basis clampad av
   min/max-width), inte på hur mycket de kan krympa. `min-width: 0` gör alltså
   krympningen och ellipsen MÖJLIG men hindrar inte brytningen; ett objekt som
   inte får plats flyttar till rad två och får där hela bredden, så ellipsen
   löser aldrig ut och raden kostar full höjd. Enda strukturella garantin för
   EN rad är därför `nowrap` plus uttalad krympordning nedan.

   Innehåll går inte förlorat: ämnet och aktör/tid ellipseras med `title` som
   bär hela strängen, badgen krymper aldrig (den är tillståndsmarkören,
   persona-vårdpersonal 2026-07-26), och telefonnumret är en egen oböjlig
   länk. */
/* HELBRED RAD 2 sedan 2026-07-27 (issue #80, fjärde rundan). `flex: 1 0 100%`
   gör metaraden till en egen rad över hela headerns bredd, alltså kundens
   målbild: namn + åtgärder på rad 1, personnummer + klarmarkering på rad 2.

   Skälet är aritmetiskt och står utskrivet i _chat_header.html: som barn till
   identitetskolumnen fick raden 256px (modellen, pessimistiskt) medan dess
   OBLIGATORISKA innehåll, de tre objekt som per krav aldrig får krympa, kräver
   382px. Underskottet klämde hanterad-statusen till NOLL bredd. Ett underskott
   på 126px går inte att krympordna bort, raden måste bli bredare. */
.kind-chat-header__meta {
  margin: 0;
  flex: 1 0 100%;
  display: flex;
  flex-wrap: nowrap;
  align-items: center;
  gap: 0 var(--kind-space-3);
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
  min-width: 0;
  overflow-wrap: anywhere;
}
/* ===================== UX-BESLUT 7 (2026-08-07): BESLUT7:START =============
   Chattheader-komprimeringspaketet S1-S5, ALLT skopat till max-width 719.98px
   OCH xlarge/xxlarge (samma brytpunkt som metaradens wrap nedan; desktop och
   normal skala ska vara 0 diffar, mätt i e2e/beslut7-matning.mjs). Målet är
   mått 5-underskottet -30px vid 320/390 xxlarge efter 1.4.10-fixen. */
/* S1: "Tel "-prefixet döljs visuellt i skopet, sr-only-mönstret inline så
   noden STÅR KVAR i DOM och skärmläsare hör oförändrat "Tel <nummer>". */
@media (max-width: 719.98px) {
  html[data-kind-font-scale="xlarge"] .kind-chat__identitet-tel-prefix,
  html[data-kind-font-scale="xxlarge"] .kind-chat__identitet-tel-prefix {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
    border: 0;
  }
}
/* S2: aktor/datum-golvet sanks 7rem -> 5rem ENBART i wrap-laget (skopet
   nedan ar delmangden av wrap-laget dar paketet giller). Golvet infordes mot
   NOLL-kollapsen i nowrap-laget (#80 fjarde rundan) och star OFORANDRAT kvar
   dar: i wrap-lage kan flex inte klamma en post till noll (en egen rad ger
   full bredd), sa har skyddar golvet inte mot sin ursprungsdefekt, det
   kostar bara en extra radbrytning nar badge plus aktor ligger pa gransen.
   Rodbevis: mutationen s2-golv-ater i e2e/beslut7-matning.mjs aterinfor
   7rem-golvet i skopet och den extra metaraden ska komma tillbaka. */
@media (max-width: 719.98px) {
  html[data-kind-font-scale="xlarge"] .kind-chat-header__handled-state,
  html[data-kind-font-scale="xxlarge"] .kind-chat-header__handled-state {
    min-width: 5rem;
  }
}
/* S3: vertikal krom vid stor skala. Tre delar per ux-beslut 7:
   (a) metaradens line-height 1.5 -> 1.35. WCAG 1.4.12-noten: 1.4.12 kraver
       att INNEHALL inte gar forlorat nar ANVANDAREN hojer line-height till
       1.5; en lagre forfattarsatt line-height ar tillaten, och metaradens
       flex-wrap gor att en user-stylesheet-hojning bara ger HOJD, aldrig
       klippning (overflow ar synligt, inga fasta hojder pa raderna).
       Kontrollerad i beslut7-matningen med 1.5-override utan innehallsbrott.
   (b) headerns padding-block 4+4 -> 0 i skopet (-8px), kanten bars redan av
       border-bottom och radgapet.
   (c) Ux-aritmetikens tredje del, "luften rad 1 till metarad space-2 ->
       space-1", har INGEN levande motsvarighet: radgapet ar space-1 (4px)
       sedan #80 fjarde rundan (se .kind-chat-header-kommentaren ovan).
       Avvikelsen fran beslutsunderlaget ar redovisad i batchrapporten i
       stallet for att en annan luft uppfinns och tas i dess namn. */
@media (max-width: 719.98px) {
  html[data-kind-font-scale="xlarge"] .kind-chat-header__meta,
  html[data-kind-font-scale="xxlarge"] .kind-chat-header__meta {
    line-height: 1.35;
  }
  html[data-kind-font-scale="xlarge"] .kind-chat__header.kind-chat-header,
  html[data-kind-font-scale="xxlarge"] .kind-chat__header.kind-chat-header {
    padding-top: 0;
    padding-bottom: 0;
  }
}
/* S4: ikonknapparnas overbredd 56 -> 48px i skopet, INTE till 44 exakt
   (avvisat i 7.2: tatare grannmal okar feltryck for en aldre malgrupp;
   luften mellan mal ar del av traffsakerheten). 0px hojd, breddreserv pa
   namn/atgardsraden. min-height 44 orord (2.5.8). */
@media (max-width: 719.98px) {
  html[data-kind-font-scale="xlarge"] .kind-chat-header__action,
  html[data-kind-font-scale="xxlarge"] .kind-chat-header__action {
    min-width: 48px;
    padding-inline: var(--kind-space-2);
  }
}
/* S5: amnet far ALDRIG en egen metarad i skopet. I wrap-lage bryter ett
   flexobjekt med basis auto till egen rad i stallet for att krympa
   (radbrytningen sker pa hypotetisk storlek, krympningen forst inom raden),
   sa amnets ellips loste aldrig ut har. flex-basis 0 later det dela rad och
   ellipseras dar (krympordningens ellips + title orord; tillstandsberoende,
   bokford 0 i aritmetiken eftersom seedens tunga konversation saknar amne;
   stubben i cp111214 bar amne och packas av samma regel). */
@media (max-width: 719.98px) {
  html[data-kind-font-scale="xlarge"] .kind-chat-header__amne,
  html[data-kind-font-scale="xxlarge"] .kind-chat-header__amne {
    flex: 1 1 0%;
  }
}
/* ===================== BESLUT7:SLUT ======================================= */

/* FE-2b (2026-08-07), WCAG 1.4.10 + persona-villkor D-7: vid smal bredd FÅR
   metaraden radbryta. Diagnosen (e2e/diag-hskroll-arbetsvy.mjs, stub i
   tyngsta tillståndet): raden bär två obligatorier som per design aldrig
   krymper, tel-länken (~176px normal, ~264 xxlarge) och hanterad-statusens
   7rem/10.5rem-golv, och med nowrap var den valda felmoden vid överlast
   SYNLIG ÖVERSPILLNING (kommentaren ovan, #80 fjärde rundan). Det gav
   dokumentöverskott på 7 av 14 mätpunkter, 59-237px, och varje uppmätt
   överskott var EXAKT hanterad-statusens högerkant (R379 normal/R557
   xxlarge). Överspillning som larm är rätt princip mot TYST bortfall, men
   horisontell skroll vid 320 är ett eget WCAG-brott (1.4.10 reflow), så vid
   <=719.98px (samma brytpunkt som gömmer hanterad-metan) byts felmoden till
   RADBRYTNING: allt innehåll förblir synligt, inget krymps förbi sina golv,
   och priset tas i höjd i stället för i sidledsskroll. Desktopens
   krympordning (ellipsis via nowrap) är orörd över brytpunkten. Höjdpriset
   vid tyngsta tillståndet redovisas i mått 5-ommätningen. */
@media (max-width: 719.98px) {
  .kind-chat-header__meta { flex-wrap: wrap; }
}
/* Krympordning på metaraden, uttalad i stället för underförstådd.
   1. ÄMNET krymper först och ellipseras: det är fri text, ofta långt, och
      hela strängen ligger kvar i `title`. */
.kind-chat-header__amne {
  flex: 0 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* 2. TELEFONNUMRET krymper inte: det är kort, det är en klickbar `tel:`-länk
      (vårdpersonalens genväg till att ringa upp) och ett halvt telefonnummer är
      värdelöst. `nowrap` hindrar också att numret bryts mitt itu. */
.kind-chat-header__meta .kind-chat__identitet-tel {
  flex: 0 0 auto;
  white-space: nowrap;
  /* `inline-flex` PA OMSLAGET, och det ar en MATT besparing och inte stadning.
     Länken innanför är `inline-flex` med `min-height: 44px` (44px-golvet, se
     nedan). Ligger den i ett INLINE formateringssammanhang lägger radboxens
     strut till halvledning ovanför och under den 44px höga boxen, och metaraden
     mättes då till 68px i stället för 44 (uppmätt 2026-08-26 vid 1280 och 1440,
     `e2e/visuell-referens.mjs --mutera=tel-golvet-pa-matytan`). Med omslaget som
     flexcontainer finns ingen radbox att lägga ledning till, och de 24px
     försvinner utan att någon funktion gör det.

     Detta är hela svaret på #415:s villkor C2 "hämta 44px någon annanstans i
     kromet": 24 av dem var bortkastad ledning. */
  display: inline-flex;
  align-items: center;
}
/* ---- 44px-GOLVET PÅ `tel:`-LÄNKEN (issue #415, bindande villkor 2) --------
 *
 * VARFÖR DET MÅSTE LIGGA HÄR OCH INTE NÅGON ANNANSTANS. Fram till 2026-08-26
 * bar arbetsvyns sammanfattningszon numret EN GÅNG TILL, via
 * `.kind-arbetsvy__sammanfattning-lank`, och DEN länken bar golvet. Zonens egen
 * kodkommentar var uttrycklig: "Numret finns alltså på två ställen, men bara
 * ETT av dem går att träffa med tummen", och sidhuvudets länk är UPPMÄTT 17px
 * (2026-08-08, vid 320 till 1440). K18 tar bort zonen. Utan den här regeln
 * hade borttagningen alltså bytt en utrymmesvinst mot en WCAG-regression, och
 * persona-vårdpersonals villkor V-4 kräver att numret är nåbart under pågående
 * videosamtal, alltså i exakt det läge där precisionen är som sämst.
 *
 * REGELN LIGGER PÅ DEN DELADE HEADERN och inte på arbetsvyn (regel 27
 * korollarium 2: åtgärda på den gemensamma noden, inte på den rapporterade
 * instansen). Den fristående chattytan renderar samma 17px-länk och hade annars
 * behållit defekten.
 *
 * 44px OCH INTE 24px. WCAG 2.2 SC 2.5.8 kräver 24 CSS-pixlar på AA-nivå; 44 är
 * SC 2.5.5 (AAA) och husets eget golv, och det är golvet zonen bar. Vi sänker
 * inte ett uppfyllt krav när bäraren byter plats.
 *
 * HÖJDPRISET ÄR MÄTT OCH INTE GISSAT: se `e2e/visuell-referens.mjs` och
 * `docs/contracts/chat-pixel-budget.md`. En pseudoelement-expansion av
 * träffytan (hit-area utan layouthöjd) prövades i resonemanget och VALDES BORT:
 * radgapet upp till åtgärdsraden är 4px, åtgärdsraden bär egna 44px-mål, och en
 * expansion uppåt hade överlappat dem, vilket är precis vad 2.5.8:s
 * avståndsundantag finns för att förhindra. En ärlig layouthöjd är dyrare men
 * går att mäta. */
.kind-chat-header__meta .kind-chat__identitet-tel a {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
}
/* En badge direkt PÅ metaraden är en TILLSTÅNDSMARKÖR (kollegie-chattens
   "Arkiverad", issue #82) och lyder samma regel som hanterad-badgen: den krymper
   aldrig, och line-height 1.2 håller raden inom identitetskolumnens höjdbudget.
   Direktbarn-kombinatorn är avsiktlig, hanterad-badgen ligger nästlad i
   .kind-chat-header__handled-state och har sin egen regel längre ned. */
.kind-chat-header__meta > .kind-badge {
  flex-shrink: 0;
  line-height: 1.2;
}
/* Icon-actions, right side. A tight row of >=44px icon-actions; wraps if very
   narrow but stays compact. */
.kind-chat-header__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--kind-space-2);
  margin: 0;
}
/* Each action = icon + a short text label. min 44px target (2.5.8). The icon
   always shows; the text label shows on desktop (>=720px) and is hidden on
   mobile (icon-only, but the button keeps its aria-label, 4.1.2). */
.kind-chat-header__action {
  display: inline-flex;
  align-items: center;
  gap: var(--kind-space-2);
  min-height: 44px;
  padding-inline: var(--kind-space-3);
  border-radius: var(--kind-radius);
  color: var(--kind-color-text);
  text-decoration: none;
  font-size: var(--kind-font-small);
  font-weight: 600;
  background: transparent;
  border: 1px solid transparent;
  cursor: pointer;
}
.kind-chat-header__action:hover { background: var(--kind-color-surface-muted); }
.kind-chat-header__action:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}
.kind-chat-header__direct-status {
  flex: 1 0 100%;
  color: var(--kind-color-text-muted);
  font-size: var(--kind-font-small);
}
.kind-chat-header__direct-status--error { color: var(--kind-color-accent); }
.kind-chat-header__action-icon { display: inline-flex; flex: 0 0 auto; }
/* PIXELBUDGET 2026-07-26 (ÄNDRAD PREMISS): tidigare visades den korta
   textetiketten vid VIEWPORT-bredd >= 720px. Den premissen var fel för den här
   ytan: arbetsvyn är en 3-panelslayout, så chattkolumnen är ~476px vid 1280px
   viewport, alltså långt under 720px, medan media-frågan ändå slog till.
   Resultatet var fem textbärande knappar (upp till ~211px för "Tillbaka till
   patienter") på en rad som bara rymmer ~284px, dvs två-tre 44px-rader, vilket
   är merparten av de uppmätta 200px.
   Etiketten är därför CSS-gömd på ALLA bredder. Namnet bärs av aria-label +
   title (4.1.2 Name Role Value), spanen ligger kvar i DOM:en som bärare, och
   tappytan är oförändrat >= 44px. Detta är samma beslut som composerns ikonrad
   redan tagit (B1, 2026-07-12).
   VIKTIGT: detta gäller HANDLINGAR. Hanterad-STATUSEN är information och ligger
   kvar som synlig text på metaraden (persona-vårdpersonal 2026-07-26: routnings-
   och tillståndsinformation får aldrig gömmas bakom ett klick). */
.kind-chat-header__action-text { display: none; }
/* ISSUE #80 2026-07-27 (kundens målbild, konsultbeslut): TRE åtgärder får
 * tillbaka sin synliga etikett, Triage, Patientsida och Exportera. De bär
 * `--labelled`; ingen annan åtgärd gör det, så "Tillbaka till patienter",
 * klarmarkeringsväxeln och kollegie-chattens "Tillbaka till Kollegor" är
 * oförändrat ikonknappar.
 *
 * VARFÖR DET INTE ÅTERINFÖR 200px-FELET, räknat och inte antaget. Den gamla
 * regeln visade etiketter vid VIEWPORT >= 720px medan arbetsvyns chattkolumn
 * var 476px, alltså mätte den fel storhet. Två saker har ändrats sedan dess:
 * högerpanelen är borta (kolumnen är 972px) och headern kapas till samma 44rem
 * läskolumn som tråden (704px, kind_patient.css). Vid >= 1200px viewport är
 * headern därför 704px på BÅDA vårdgivarytorna, och åtgärdsraden kräver, mätt
 * av CSS-mattemodellen (tests/test_chat_pixel_budget.py, samma kaskad och
 * boxmodell som taken):
 *
 *   arbetsvyn  identitet 192 + gap 12 + åtgärder 414 = 618px  (86px kvar)
 *   fristående identitet 192 + gap 12 + åtgärder 364 = 568px (136px kvar)
 *
 * Den fristående chatten har en åtgärd MER ("Tillbaka till patienter") men
 * saknar Triage, som bara renderas på arbetsvyn, just för att dess marginal med
 * Triage inräknad var 32px och det är ingen marginal alls. Se _chat_header.html.
 *
 * Modellen underskattar textbredd (0,50em mot verklighetens cirka 0,55em), så
 * de 86px ska läsas som en övre gräns; med 26 tecken etikett är den verkliga
 * marginalen snarare cirka 68px. Under 1200px är etiketterna gömda igen, exakt
 * dagens beteende, eftersom headern då är smalare än 704px.
 *
 * Radbrytningen avgörs på barnens HYPOTETISKA huvudstorlek, inte på hur mycket
 * de kan krympa, så marginalen ovan är det som håller raden på EN rad; siffrorna
 * vaktas av tests/test_chat_pixel_budget.py (headern <= 64px med etiketter, och
 * åtgärdsradens bredd mot den kapade headern på båda ytorna).
 *
 * VIEWPORT-frågan igen, ärligt: det här ÄR en viewportfråga och inte en
 * containerfråga, vilket är samma sorts koppling som var fel 2026-07-26.
 * Skillnaden är att headerbredden numera är KONSTANT 704px över den brytpunkt
 * regeln gäller (kapad av max-width), så viewporten avgör bara OM taket biter,
 * inte hur brett innehållet får bli. En container query hade varit den rena
 * lösningen men kräver `container-type: inline-size` på den zonade artikeln,
 * vilket rör en flexkedja med P0-historik (#73/#74/#75), och det är inte värt
 * risken i ett acceptansfönster. */
/* ---- CP-06 (issue #91): GRINDEN HÄNGER PÅ CONTAINERN, INTE PÅ VIEWPORTEN ----
 *
 * Vad som var fel, och det är UPPMÄTT och inte resonerat (riktig Chromium mot
 * lokal instans, 2026-08-04, seedad konversation, båda vårdgivarytorna):
 *
 *   viewport   headerns bredd   etiketter enligt den gamla 1200px-regeln
 *      360        328 / 338      dolda   (rätt, headern är genuint smal)
 *      600        568 / 568      dolda
 *      720        688 / 688      dolda
 *      800        704 / 704      dolda   <-- headern är HÄR redan vid sitt tak
 *     1024        704 / 668      dolda   <-- persona-vårdpersonals arbetsställning
 *     1200        704 / 704      SYNLIGA
 *     1440        704 / 704      SYNLIGA
 *
 * Headern kapas av `max-width: 44rem` och NÅR det taket redan vid 800px
 * viewport. Mellan 800 och 1199 var alltså containern EXAKT lika bred som i det
 * läge där etiketterna bevisligen får plats, och de doldes ändå. Det är ren
 * förlust, och den träffade precis den bredd persona-vårdpersonal faktiskt
 * jobbar i: KIND i halva skärmen, journalsystemet i den andra.
 *
 * Det här är TREDJE gången samma storhetsfel byter skepnad i den här filen.
 * 2026-07-26 grindades etiketten på viewport >=720 medan kolumnen var 476px, och
 * kommentaren nedan medger själv att 1200-regeln "ÄR en viewportfråga och inte
 * en containerfråga". Den försvarades med att headerbredden är konstant över
 * brytpunkten, vilket stämmer, men slutsatsen drogs bara åt ena hållet: den
 * visade aldrig att det UNDER brytpunkten fanns något att skydda. Det gjorde det
 * inte.
 *
 * MEKANIKEN NU, två lager, och båda behövs:
 *
 *   1. `@container` mot headerns EGNA inline-bredd är den BINDANDE regeln.
 *      Det är den storhet som faktiskt avgör om etiketten ryms, alltså slutar
 *      grinden vara en proxy. `container-type: inline-size` sätts på headern
 *      SJÄLV och inte på den zonade artikeln: den flexkedjan har P0-historik
 *      (#73/#74/#75) och ska inte röras, medan headern är ett blockelement vars
 *      inline-bredd kommer uppifrån och därför är det trygga stället att
 *      containa. Verifierat genom mätning före och efter, se commit-meddelandet.
 *
 *   2. Ett YTTRE `@media`-golv. Det finns av två skäl. Praktiskt: under cirka
 *      800px är headern genuint smal och etiketterna hör inte hemma där ändå.
 *      Verifieringsmässigt: `tests/test_chat_pixel_budget.py` är en CSS-modell
 *      UTAN layoutmotor, den kan inte se en containerbredd, och den hoppar över
 *      `@container`-block. Modellen ser alltså etiketterna som PÅ inom
 *      mediagolvet och räknar därmed den BREDARE åtgärdsraden. Det är den enda
 *      tillåtna riktningen för en approximerande kontroll enligt kontraktets
 *      egen regel (`docs/contracts/chat-pixel-budget.md`): konservativt biased
 *      mot LARM. Vore lagren omvända, alltså `@container` som enda visare, hade
 *      modellen sett etiketterna som dolda, räknat en för smal rad och blivit
 *      falskt grön. Det är exakt den trasiga rökdetektorn kontraktet förbjuder.
 *
 * BROWSERSTÖD: container queries är Baseline "widely available" sedan
 * 2023-02-14 (MDN, CSS containment module level 3, hämtad 2026-08-04). En
 * webbläsare utan stöd ignorerar `@container`-blocket och får mediagolvets
 * beteende, alltså etiketter från 800px, vilket är dagens beteende fast bättre.
 * Degraderingen är alltså mot MER text, aldrig mot mindre. */
.kind-chat-header {
  container-type: inline-size;
  container-name: kind-chat-header;
}

/* PRIORITET 1, faller SIST: klarmarkeringsväxeln ("Klar" / "Ångra").
 *
 * Persona-vårdpersonals villkor V-3, ordagrant: "När raden blir för trång ska
 * den SISTA etiketten som får falla bort vara den mest konsekvensbärande."
 * Ordningen, från sist att tappa till först: klarmarkering, Exportera, Triage,
 * Patientsida. Fram till nu var ordningen den EXAKT omvända, eftersom bortfallet
 * sorterade på stränglängd: "Markera som hanterad" var bredast och föll först
 * och permanent, trots att det är den enda av de fyra som ändrar ärendets
 * tillstånd för hela teamet.
 *
 * Det är därför den här etiketten har ett LÄGRE breddkrav än kundens tre.
 *
 * TALET 550px ÄR HÄRLETT, inte valt, OMHÄRLETT 2026-08-16 (P-lanen,
 * triageverben): växelns etiketter är nu produktionens ordagranna
 * `Klarmarkera` / `Ångra klarmarkering` (korpus vg-02-01/vg-02-02,
 * beslutsrunda 2026-08-16 beslut 5), alltså växte det bredare läget. Samma
 * metod och samma 2026-08-04-ankare som ursprungstalet 440: tre ikonknappar
 * 3x44 plus växeln, som var uppmätt 79 med "Ångra" (5 tecken) och med
 * teckentakten ur de UPPMÄTTA syskonen (Klar 70,95 vid 4 tecken, Exportera
 * 110,11 vid 9, alltså ~7,8px/tecken, avrundat uppåt till 8) blir
 * 79 + 14x8 = 191 med "Ångra klarmarkering" (19 tecken). 132 + 191 + 3x8 =
 * 347px, plus kolumngap 8 och identitetskolumnens `flex-basis: 12rem` = 192px
 * ger 547. Avrundat uppåt till 550. Härledningen är ARITMETIK på uppmätta
 * ankare; webbläsar-ommätning vid nästa deployverifiering är kontraktets
 * bindande kontroll (chat-pixel-budget.md, delmått får justeras HÄRLETT). */
.kind-chat-header__action--labelled-prio .kind-chat-header__action-text {
  display: inline;
}

@media (min-width: 800px) {
  /* PRIORITET 2, faller FÖRST: kundens tre affordanser (Triage, Patientsida,
   * Exportera).
   *
   * TALET 735px ÄR HÄRLETT på samma sätt, OMHÄRLETT 2026-08-16 (P-lanen,
   * triageverben, se prio-1-blocket ovan): åtgärdsraden med alla fyra
   * etiketter mätte 419px på arbetsvyn (uppmätt 384px vid 1200px, minus
   * växelns ikonbredd 44, plus dess etiketterade 79); växelns bredare läge
   * växer 79 -> 191 (`Ångra klarmarkering`, +14 tecken x 8px/tecken), alltså
   * 419 + 112 = 531px, plus kolumngap 8, plus identitetskolumnens 192px
   * flex-basis, summa 731px. Avrundat till 735. Webbläsar-ommätning vid nästa
   * deployverifiering är kontraktets bindande kontroll.
   *
   * Bortfallsregeln själv ligger EFTER hela det här mediablocket, se
   * "CONTAINER-BINDANDE BORTFALL" nedan. Ordningen är load-bearing och inte
   * kosmetisk: alla tre selektorerna väger (0,2,0), så vid lika specificitet
   * avgör dokumentordning. Låg bortfallsreglerna här hade den här
   * `display: inline`-regeln stått SENARE än prio-bortfallet och tänt
   * klarmarkeringens etikett igen i en container smalare än 440px, alltså
   * precis det fall bortfallet finns för. */
  .kind-chat-header__action--labelled .kind-chat-header__action-text {
    display: inline;
  }
  /* ISSUE #80, ANDRA RUNDAN (konsultens webbläsarmätning 2026-07-27): headern
   * mätte 83px mot taket 64. Rotorsaken var INTE åtgärdsraden utan
   * IDENTITETSRADEN. När headern kapades till 44rem-läskolumnen (delsteg 3) gick
   * identitetskolumnen från cirka 546px till 278px, och namnet (cirka 140px)
   * plus personnummer-chippet (cirka 154px) plus gapet krävde 302px, så
   * `flex-wrap: wrap` bröt dem till två rader. Med metaraden under blev det TRE
   * textrader i stället för två: 26 + 24 + 24 + 9 krom = 83.
   *
   * Tre åtgärder, i fallande effekt, alla verksamma bara där taket gäller:
   *   1. `nowrap` på identitetsraden. Det är den STRUKTURELLA garantin, samma
   *      som metaraden fick 2026-07-26: flexboxens radbrytning avgörs på
   *      barnens hypotetiska huvudstorlek, inte på hur mycket de kan krympa, så
   *      bara nowrap kan lova EN rad oavsett hur långt namnet är.
   *   2. Uttalad krympordning. NAMNET krymper och ellipseras (det bär redan
   *      min-width:0 + ellipsis, och hela namnet finns i länkens aria-label +
   *      h1:ns title). PERSONNUMRET krymper ALDRIG: ett halvt personnummer är
   *      värdelöst och farligt, exakt samma regel som telefonnumret på
   *      metaraden.
   *   3. Etiketterade knappar får 8px sidopadding i stället för 12. Det ger 32px
   *      tillbaka till identitetsraden. Gäller BARA `--labelled`, som är breda
   *      av sin text; ikonknapparna behåller 12px eftersom deras bredd är 24 +
   *      18 = 42px och en sänkning där hade krympt träffytan.
   *
   * TREDJE RUNDAN 2026-07-27: de tre åtgärderna är KVAR som strukturell garanti,
   * men de bär inte längre hela lasten. Personnummer-chippet har flyttat till
   * metaraden (kundens målbild), så identitetsraden innehåller bara namnet och
   * får hela identitetskolumnens bredd. Åtgärderna ovan är därmed belt-and-
   * braces: går något åt fel håll igen blir följden ett ellipserat namn, inte en
   * spräckt höjd. `nowrap` är kvar för att den garantin ska gälla även den dag
   * någon lägger tillbaka ett andra objekt på raden. */
  .kind-chat-header__identity-link {
    flex-wrap: nowrap;
  }
  /* ---- G-8 (#99): BREDDEN SOM BETALAR `Patientsida`s ETIKETT --------------
   *
   * CP-06 tog bort etiketten på arbetsvyn för att frigöra bredd åt
   * patientnamnet. G-8 ger tillbaka etiketten (briefen §4.4 plus kundens bild,
   * PDF sid 7), alltså måste bredden komma någon annanstans ifrån. Den kommer
   * INTE från namnet och INTE från någon av kundens tre etiketter.
   *
   * UNDERSKOTTET ÄR MÄTT, inte uppskattat. `test_a_realistic_long_swedish_name_still_fits`
   * gick rött direkt efter att etiketten återinförts: ett 20-teckens svenskt
   * namn ("Margareta Söderström") behövde 250px och fick 212,75px i modellens
   * pessimistiska textläge, alltså ett underskott på **37,25px**.
   *
   * DE 44px SOM BETALAR DET, itemiserade:
   *   32px  `--labelled`-knapparnas sidovaddering space-2 -> space-1, alltså
   *         8 -> 4px, gånger två sidor gånger fyra etiketterade knappar
   *         (Triage, Patientsida, Exportera, klarmarkeringsväxeln)
   *   12px  åtgärdsradens KOLUMNgap space-2 -> space-1, gånger tre mellanrum
   *   ----
   *   44px  mot underskottets 37,25, alltså 6,75px marginal, vilket är ungefär
   *         exakt det spelrum tripwiren ursprungligen pinnades vid 2026-07-27
   *         ("20 tecken får plats med 6px till godo")
   *
   * TRÄFFYTAN ÄR ORÖRD: `.kind-chat-header__action` deklarerar `min-height:
   * 44px` och `min-width: 44px` längre ned, och de golven är oberoende av
   * vadderingen (SC 2.5.8). En etiketterad knapp är dessutom alltid bredare än
   * 44px av sin text. IKONKNAPPARNA rörs inte: regeln gäller bara `--labelled`,
   * och en ikonknapps bredd ÄR dess vaddering plus glyf.
   *
   * RADgapet är kvar på space-2, bara KOLUMNgapet krymper: radgapet gäller när
   * raden bryter till två rader, och det är ett läge där luft hjälper snarare
   * än kostar.
   *
   * SKOPAT TILL >=800px med flit. CP-14:s mobilbudget (uppmätt 4 x 56 plus
   * 3 x 12 = 260px av headerns 272px vid 320 xxlarge) räknar med dagens
   * mobilvärden, och en ändring där hade tyst flyttat den räkningen. Under
   * 800px är dessutom `--labelled`-etiketterna gömda, så regeln har inget att
   * betala för. */
  .kind-chat-header__action--labelled {
    padding-inline: var(--kind-space-1);
  }
  .kind-chat-header__actions {
    column-gap: var(--kind-space-1);
  }
}

/* ---- CONTAINER-BINDANDE BORTFALL (CP-06) --------------------------------
 *
 * Ligger SIST av de tre display-reglerna med flit. Alla tre väger (0,2,0), så
 * dokumentordning avgör, och bortfallet måste kunna vinna över båda
 * `display: inline`-reglerna ovan. Det här är också det enda stället där
 * bortfallsORDNINGEN uttrycks: kundens tre släcks vid 735px, klarmarkeringen
 * först vid 550px, alltså faller den mest konsekvensbärande etiketten SIST
 * (persona-vårdpersonal V-3). Tidigare föll den bredaste först, vilket råkade
 * vara just klarmarkeringen. Trösklarna omhärledda 2026-08-16 för
 * produktionsverben, se härledningarna vid respektive display-regel ovan. */
@container kind-chat-header (max-width: 734px) {
  .kind-chat-header__action--labelled:not(.kind-chat-header__action--labelled-prio)
    .kind-chat-header__action-text {
    display: none;
  }
}
@container kind-chat-header (max-width: 549px) {
  .kind-chat-header__action--labelled .kind-chat-header__action-text {
    display: none;
  }
}

/* WCAG 2.2 SC 2.5.8 + husets 44px-golv. Knappen hade bara `min-height`, så dess
 * BREDD var summan av padding och glyf. Med etiketten dold och den 8px-padding
 * `--labelled` får ovan blir det 8+18+8+2 = 36px, alltså under golvet. Ett golv
 * i en dimension flyttar felet till den andra (kontraktets egen lärdom), så
 * bredden får ett uttalat golv i stället för att vara en biprodukt av padding.
 * En etiketterad knapp är alltid bredare än 44px och påverkas inte. */
.kind-chat-header__action {
  min-width: 44px;
}

/* The handled group in the header actions: badge + (compressed) actor/tid + the
   toggle button all on one tight row. The forms carry no extra margin. */
.kind-chat-header__handled {
  display: inline-flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--kind-space-2);
  margin: 0;
}
.kind-chat-header__handled .kind-chat__handled-form { margin: 0; }
/* 3. HANTERAD-STATUSEN krymper sist, och bara i sin textdel.
      `min-width: 0` är LOAD-BEARING och saknades (granskningens P2-3): utan den
      är ett flexobjekts min-width `auto`, alltså min-content, och min-content
      för det här objektet inkluderar hela det nowrap-satta metafältet inuti.
      Ellipsregeln på `.kind-chat-header__handled-meta` kunde därför bevisligen
      aldrig lösa ut, hur trång raden än blev. */
/* MIN-WIDTH-GOLV 2026-07-27 (issue #80, fjärde rundan). `min-width: 0` gjorde
   krympningen möjlig, men den saknade BOTTEN: när radens obligatoriska innehåll
   var överbelastat krympte hela statusen till noll, och badgen följde med ut ur
   bild trots sin egen `flex-shrink: 0` (den skyddar badgen mot att krympa, inte
   mot att FÖRÄLDERN kollapsar under den).

   Golvet är badgens egen bredd. Persona-vårdpersonal 2026-07-26 satte
   tillståndsmarkörens synlighet som ett HÅRT krav, alltså är det inte förhandlingsbart
   att den kan försvinna som bieffekt av trängsel. Med golvet kan flex aldrig
   krympa förbi badgen; blir raden ändå för trång är resultatet en synlig
   överspillning som går att UPPTÄCKA, i stället för ett element som tyst blir
   osynligt. Ett larm slår alltid ett tyst bortfall när det gäller
   patientsäkerhetsinformation. */
.kind-chat-header__handled-state {
  display: inline-flex;
  align-items: center;
  gap: var(--kind-space-2);
  flex: 0 1 auto;
  min-width: 7rem;
}
/* Tillståndsmarkören själv krymper ALDRIG (flex-shrink 0). Persona-vårdpersonal
   2026-07-26 (utlåtande triage-kolumn): routnings- och tillståndsinformation får
   inte gömmas. Det är texten bredvid som får ge vika, aldrig badgen.
   `line-height: 1.2` (mot ärvda 1.55) är den enda höjdändringen: badgen går från
   ~28px till ~23px, vilket räcker för att identitetskolumnen (namnrad 24 +
   metarad) ska hållas under headerns 48px min-height, alltså kostar det
   klarmarkerade tillståndet NOLL extra header-höjd i stället för 27px.
   Teckenstorlek och kontrast är orörda, det är bara radens interna luft. */
.kind-chat-header__handled-state > .kind-badge {
  flex-shrink: 0;
  line-height: 1.2;
}
/* Actor + tid: full on desktop, hidden on mobile so the header stays low (the
   badge + toggle carry the state on a narrow screen; the actor/tid is clinical
   traceability that reappears at >=720px, never dropped from the DOM).
   PIXELBUDGET 2026-07-26: hela hanterad-statusen (badge + aktör + tid) sitter nu
   på identitetskolumnens METARAD, inte i 44px-ikonraden, så den kostar ingen
   extra header-höjd. Ellipsen håller en lång aktörssträng på en rad i stället
   för att bryta metaraden i två; hela strängen ligger kvar i `title` och i
   tillgänglighetsträdet, så inget innehåll försvinner, det komprimeras.
   `max-width: min(22rem, 100%)` gör 22rem-taket responsivt: i en smal kolumn
   ska fältet inte kräva 352px innan det ens börjar krympa. */
.kind-chat-header__handled-meta {
  display: none;
  color: var(--kind-color-text-muted);
  font-size: var(--kind-font-small);
  flex: 0 1 auto;
  /* GOLV 2026-07-27 (issue #80, fjärde rundan): `min-width: 0` gav ellipsen ett
     obegränsat krymputrymme, och när raden var överbelastad blev resultatet inte
     en avkortad sträng utan en NOLLBRED, alltså osynlig. Ett ellipserat "Eva
     Lund…" bär fortfarande information; noll bär ingen. 4rem = 64px räcker för
     några tecken plus ellipstecknet, och hela strängen finns i `title` och i den
     visuellt dolda syskonnoden. */
  min-width: 4rem;
  max-width: min(22rem, 100%);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
@media (min-width: 720px) {
  .kind-chat-header__handled-meta { display: inline-block; vertical-align: bottom; }
}
/* WCAG 2.4.11 Focus Not Obscured (Minimum, NEW in 2.2): with the header sticky
   at top:0, a focused message / control in the scrolling thread must not sit
   hidden behind it. Reserve scroll-margin equal to the (now low) sticky-header
   height plus a buffer so the browser scrolls a focused element clear. Applied
   unconditionally (scroll-margin is inert until a focus-scroll happens).
   BOTH container classes are named: since the axe/K5 unification (2026-07-12)
   every chat surface renders the wrapper split (<div class="kind-chat__log">
   around <ol class="kind-chat__log-list">), so the focusables are descendants
   of both; keeping both classes in the :where() list is deliberate robustness
   against either shape reappearing (the O1 regression class,
   tests/test_admin_chat_sticky_header_css.py). */
.kind-body--admin
  :where(.kind-chat__log, .kind-chat__log-list)
  :where(a, button, [tabindex]) {
  scroll-margin-top: var(--kind-admin-chat-focus-reserve, 5rem);
}
/* V1 (#55, chatt-yta 2.1 feedback-plan 2026-07-08): under the zoned 3-column
   layout .kind-chat-header is no longer position:sticky (it is an ordinary
   flex child above the internally-scrolling .kind-chat__log, see
   .kind-chat--zoned in kind_patient.css), so it can never overlay a focused
   message any more; the reserve above is provably unneeded there. Zero it so
   a focused row does not carry a phantom scroll offset inside its OWN
   internal scrollport. Placed after the base rule (equal specificity via the
   extra .kind-chat--zoned class + source order) so it wins only where the
   zoned class is present. (Sedan 2026-07-26, issue #82, är team_chat_visa.html
   OCKSÅ zonad och har samma kompakta macro-header, så den omfattas nu av samma
   regel i stället för att vara undantagen.)

   #73 (2026-07-12): BOTH zero-outs below are now scoped to WIDE viewports
   (min-width 900.02px, the complement of the max-width:900px narrow block
   further down). At <=900px the zoned column goes STATIC (it follows the
   .kind-arbetsvy__ko "static when stacked" convention) and the page scrolls
   normally under the compact sticky sitechrome, so the premise behind the
   zero-out ("nothing can overlay a focused element in the internal
   scrollport") no longer holds there: a focused log element must clear the
   sticky sitechrome in the PAGE scroller again. Un-scoped zeroing at narrow
   width would recreate exactly the K1a occlusion this fixes. At narrow the
   BASE reserve rule above stays live, and BOTH tokens
   (--kind-admin-chat-focus-reserve + --kind-header-height) are bumped to
   the compact-header footprint in kind.css's #73 block via a
   `body.kind-body--admin` (0,1,1) declaration. The element prefix is
   LOAD-BEARING (reviewer P2, 2026-07-12): the un-scoped 5rem base further
   up in THIS file sits on plain `.kind-body--admin` (0,1,0) and this file
   loads AFTER kind.css (base.html: kind.css before the per_domain_css
   block), so an equal-specificity bump in kind.css loses on source order
   and would leave the base rule's [tabindex] branch at 80px under a 125px
   header (a latent silent 2.4.11 regression for a future roving-tabindex
   pattern, even though the Tab path is saved by --kind-header-height +
   the patient file's focus-visible rule). With the prefix both tokens
   carry 10rem at narrow width regardless of file order; the effective
   winner is pinned in tests/test_admin_compact_nav_css.py.
   Breakpoint note (documented tradeoff): the max-width:900px /
   min-width:900.02px pair leaves a 0.02px band (fractional viewport
   widths on scaled displays) where NEITHER scope applies; the un-scoped
   base reserve still applies there, only the zero-out/unbind split is
   momentarily undefined. Same convention as the existing 719.98/720
   pair in kind.css. */
@media (min-width: 900.02px) {
  .kind-body--admin
    .kind-chat--zoned
    :where(.kind-chat__log, .kind-chat__log-list)
    :where(a, button, [tabindex]) {
    scroll-margin-top: 0;
  }
  /* P2-1 (reviewer 2026-07-12): the axe fix put .kind-chat__log-list on the
     zoned ADMIN surfaces too, and the patient reserve rule
     `.kind-chat__log-list a:focus-visible, ... button:focus-visible`
     (kind_patient.css) has specificity (0,2,1), which BEATS the :where()-based
     zero-out above at (0,2,0), so keyboard focus in the zoned admin log would
     pick up var(--kind-header-height) as phantom top offset again. This
     reinforcement re-zeroes scroll-margin-top for exactly the duel's focus
     states at (0,3,0) (three real class-level selectors: .kind-body--admin +
     .kind-chat--zoned + :focus-visible; the :where() lists stay
     zero-specificity), which wins regardless of file order. The BOTTOM half of
     the patient rule needs no twin: its VALUE is var(--kind-composer-reserve),
     pinned to 0px on the zoned admin column below, so winning the cascade for
     it changes nothing. */
  .kind-body--admin
    .kind-chat--zoned
    :where(.kind-chat__log, .kind-chat__log-list)
    :where(a, button):focus-visible {
    scroll-margin-top: 0;
  }
}

/* V1 (#55, chatt-yta 2.1 feedback-plan 2026-07-08): admin sizing for the
   shared .kind-chat--zoned structural rules (kind_patient.css). Mirrors the
   EXISTING arbetsvy kö-rail convention exactly (.kind-arbetsvy__ko below):
   position:sticky + a viewport-relative max-height + align-self:start, so
   BÅDA admin chat-surface columns (queue rail, chat) share one "chrome budget"
   and line up. (Var TRE kolumner till 2026-07-27; högerpanelen är borttagen,
   se .kind-arbetsvy.)
   Safe here (unlike the patient surface) because nothing of variable height
   sits ABOVE the chat pane in either admin template (chatt.html's article is
   the grid cell's only child; arbetsvy's center pane starts directly with the
   header), so a fixed calc() offset needs no flex chain to stay correct.
   #73 (2026-07-12): applies on WIDE viewports only in practice, at <=900px
   the media block further down makes the column static + caps the log
   internally (the narrow "static when stacked" mode). */
/* ============================================================================
   #217 / VARIANT D: CHATTYTORNA HAR INGET KROM OVANFÖR KONVERSATIONEN.

   Sidhuvudet renderas inte på `.kind-body--vardchatt` (templates/base.html), så
   de tre termer `--kind-krom-budget` summerar (sidhuvud 81, mainens vaddering
   12, slack 35) är alla noll där. Variabeln sätts om på KROPPEN, alltså ärver
   varje sticky höjdbudget i filen det nya värdet utan att någon av dem behöver
   veta att den här ytan finns.

   Det är hela poängen med regel 51-refaktoreringen: EN rad flyttar sju
   budgetar. Före den bar varje budget sin egen literal, och en kortare header
   hade gett konversationen exakt noll pixlar tillbaka.

   Uppmätt utfall vid 1440x900, tyngsta tillståndet: `.kind-chat__log` 571,22
   till 707,22px, mot pixelbudgetens bindande golv 644
   (docs/contracts/chat-pixel-budget.md, docs/design-proposals/217/BESLUT.md).
   ========================================================================== */
.kind-body--vardchatt {
  --kind-krom-topp: 0px;
  --kind-krom-budget: 0px;
}
.kind-body--vardchatt .kind-main { padding-block: 0; }
.kind-body--vardchatt .kind-footer { display: none; }
/* Luckan ovanför schemalagda-raden. Raden SJÄLV är orörd (44px träffyta plus
   1px kant), det är bara mellanrummet som går 12 till 4. */
.kind-body--vardchatt .kind-schemalagda { margin-top: var(--kind-space-1); }

.kind-body--admin .kind-chat--zoned {
  align-self: start;
  position: sticky;
  top: var(--kind-krom-topp);
  max-height: calc(100dvh - var(--kind-krom-budget));
  /* #74 (2026-07-12): the 2.4.11 bottom reserve in kind_patient.css is now
     var(--kind-composer-reserve, calc(96px + safe-area)). In the zoned admin
     column the composer is STATIC (never overlays the log's internal
     scrollport), so any bottom reserve is pure phantom offset; pin the
     variable to 0px here. Working via the custom property sidesteps the
     specificity duel entirely (the patient rule KEEPS winning the cascade,
     but the value it applies is this 0px); the TOP margin has no such
     value-level seam and needs the explicit (0,3,0) reinforcement zero-out
     above instead (P2-1). kind_composer_mode.js deliberately skips
     publishing a measured value when the composer is not sticky, so this
     pin is never overridden by an inline value. Sedan 2026-07-26 (issue #82)
     är team_chat_visa också zonad och omfattas alltså av samma pin; base-
     fallbacken tjänar därmed ingen levererad yta längre. */
  --kind-composer-reserve: 0px;
}

/* ---- KOLLEGIE-CHATTENS HÖJDKEDJA (issue #82, delsteg 8, 2026-07-27) --------
 *
 * `.kind-chat--zoned` GER inte kolumnen höjd, den FÖRDELAR höjd den redan har:
 * artikeln är `display:flex; flex-direction:column` och loggen `flex:1`, vilket
 * bara betyder något om någon förälder gör artikeln högre än sitt innehåll. Det
 * gör arbetsvyn (grid-cell i `.kind-arbetsvy`) och chatt.html (grid-cell i
 * `.kind-chatt-layout`), båda med tillräckligt lång tråd för att slå i
 * `max-height`-taket. Kollegie-chattens artikel är DIREKT barn till
 * `main.kind-main`, som är `display:block`, så flexkedjan bryts och artikeln
 * sizear till sitt innehåll.
 *
 * Uppmätt i riktig webbläsare 2026-07-27 vid 1440x900, EFTER delsteg 7:
 *   BODY   h=900  display:flex  min-height:900px   (body.kind-body, kind.css)
 *   MAIN   h=628  display:BLOCK flex:1 1 0%        <- kedjan bryts här
 *   ARTICLE h=222 display:flex  flex:0 1 auto      <- 54 header + 53 composer
 *                                                     + 107 logg = innehåll
 * Andelen såg ut att gå 19 -> 48 procent, men det var en synvilla: loggen växte
 * inte, KOLUMNEN krympte (561 -> 222). `max-height` är ett TAK, inte en höjd,
 * så den kan aldrig få något att växa. Min 87-procentsuppskattning i delsteg 7
 * förutsatte en kedja som inte finns på den här sidan.
 *
 * Fixen sluter kedjan på SIDAN, inte på elementet: `.kind-main` är delad över
 * hela vårdgivarytan (patientlistan, bokningar, formulär, allt), så ett
 * oscopat `display:flex` där hade träffat varenda admin-sida. Sidan bär därför
 * en egen skalklass, `kind-body--team-chat`, satt i team_chat_visa.html.
 *
 * Varför INTE `.kind-body--chat`: den är patientytans skal ("patient/chatt.html
 * ALONE", kind_patient.css) och drar med sig flikradsreserven, döljandet av
 * `.kind-snabbknapp` och egen sidfotshantering, alltså fel krom på en
 * vårdgivaryta. Och nej, vårdgivarytan hade ingen egen motsvarighet att följa:
 * varenda admin-mall bär bara `kind-body--admin`, så det här är den FÖRSTA
 * admin-instansen av ett etablerat mönster, inte ett tredje sätt att göra
 * samma sak.
 *
 * `align-self: stretch` är LOAD-BEARING, inte städning. Basregeln ovan sätter
 * `align-self: start`, vilket i en GRID-cell styr blockaxeln (det är dess syfte
 * på arbetsvyn). I en flexKOLUMN är align-self INLINE-axeln, så `start` hade
 * krympt artikeln till sin innehållsbredd i stället för att fylla kolumnen: en
 * höjdfix som tyst hade gjort chatten smal.
 *
 * `min-height` lämnas medvetet orörd (ärver 0 från `.kind-chat--zoned`). Mainen
 * behåller alltså sitt innehållsgolv, så på en mycket kort viewport växer main
 * och SIDAN skrollar i stället för att loggen krossas. Ett eget min-height-golv
 * på loggen är uttryckligen avrått i #73-noten längre ned (det trycker bara
 * composern under vecket), och grannytorna har inget sådant golv heller.
 *
 * Elementprefixet `body.` ger (0,2,1) och vinner därför över basregelns (0,2,0)
 * oavsett källordning, samma disciplin som redan räddat den här filen två
 * gånger (patientnamnets clamp och headerns padding). */
body.kind-body--team-chat .kind-main {
  display: flex;
  flex-direction: column;
}
body.kind-body--team-chat .kind-chat--zoned {
  align-self: stretch;
  flex: 1 1 auto;
}

/* ---- KOLLEGOR BÄR BANDET (web#2312, Alex beslut 2026-10-16) ---------------
 *
 * Kollegiechatten renderar vårdgivarbandet (templates/base.html), till skillnad
 * från de två patientchattytorna. Bandet är `position: fixed` längst ned, så
 * utan en reserv hade det lagt sig över skrivmodulen. Två termer, samma tal:
 *
 *   * mainens `padding-bottom` lyfter kolumnens nederkant över bandet, på
 *     ALLA bredder (vid <=900px är kroppen bunden till 100dvh och mainen en
 *     krympbar flexkolumn, så kolumnen krymper och loggen tar smällen);
 *   * `--kind-krom-budget` sänker kolumnens tak (`max-height: calc(100dvh -
 *     budget)` ovan) lika mycket, så att det sticky taket inte kan göra mainen
 *     högre än viewporten och skjuta skrivmodulen in under bandet.
 *
 * Talet är bandets egen token plus mainens vanliga andrum, så reserven följer
 * bandet om det växer (safe-area-insetet, #277). Fallbacken 80px är bandets
 * höjd, för den händelse `html:has(.kind-vardnav)` inte matchar.
 *
 * `body.` ger (0,2,1) mot `.kind-body--vardchatt .kind-main` (0,2,0), i båda
 * media-lägena, oavsett källordning. Loggen förblir sidans skrollare (#156),
 * alltså går tråden att skrolla medan bandet ligger kvar. */
body.kind-body--team-chat {
  --kind-krom-budget: calc(var(--kind-vardnav-reserve, 80px) + var(--kind-space-2));
}
body.kind-body--team-chat .kind-main {
  padding-bottom: calc(var(--kind-vardnav-reserve, 80px) + var(--kind-space-2));
}
/* Fokusreserven (SC 2.4.11, samma form som hubbytornas regel längre ned):
   vid extrem textskala på smal skärm spiller skrivmodulen ut och sidan
   skrollar (se "INGET overflow:hidden" nedan). Då ska en inrullad kontroll i
   skrivmodulen parkeras ovanför bandet, inte under det. Bara skrivmodulen:
   loggens innehåll rullas i loggens egen skrollport, där bandet inte ligger. */
body.kind-body--team-chat .kind-chat__compose :where(button, textarea) {
  scroll-margin-bottom: max(6rem, calc(var(--kind-vardnav-reserve, 0px) + 5px));
}

/* #75 (qa browserverifiering 2026-07-12, K3): the zoned column is sticky, so
   its overflow FOLLOWS the page scroll; page scrolling can NEVER reveal
   popover content below the fold (measured: the schemalagg pane's submit +
   Avbryt sat 142-192px under viewportbotten at max scroll on BOTH admin
   surfaces at 1280x800; an unforced Playwright click timed out). Root cause:
   the V1 rule in kind_patient.css gives the popover wrapper + the schemalagda
   panel `flex: 0 0 auto` (flex-shrink 0), so when their content alone
   exceeds the column's viewport bound (max-height above) they poke out of
   the sticky box instead of yielding.
   Fix = let flex layout do the viewport binding: the two variable-height
   panels become SHRINKABLE, and what no longer fits scrolls INTERNALLY.
   (An earlier claim here, "the log, flex-basis 0, already yields all its
   space first", was DISPROVEN by qa:s 2118 deploy measurement: `flex: 1` is
   basis 0%, and a percentage basis in this indefinite-height column resolves
   as CONTENT, so the log shrinks PROPORTIONALLY with the panels instead of
   first; see the shrink-priority rule below.) Each box is its
   OWN scrollport (overflow-y on the flex item itself), because overflow
   clipping works off the item's USED box size, which flex shrinking always
   produces; a percentage max-height on a CHILD was rejected here (reviewer
   P1-1, 2026-07-12): the wrapper's post-flex height only counts as DEFINITE
   for percentage resolution when the flex CONTAINER's main size is definite
   (css-flexbox-1 §9.8 + CSS2 §10.7), and .kind-chat--zoned carries only
   max-height, never a definite height, so max-height:100% on the panel
   risks resolving to none and leaving the mechanism inert. This is the
   qa-recommended internal scroll, sized by the flex algorithm instead of a
   hand-tuned calc() that cannot know the surrounding chrome. The panel's
   box-shadow is clipped at the wrapper edge while scrolling (cosmetic,
   accepted). The emoji popover (position:absolute, anchored in the compose
   form, NOT inside these boxes) is untouched, and the column itself keeps
   its deliberate visible overflow (kind_patient.css design note).
   Residual (honest): below ~430px viewport height the NON-shrinkable
   header + compose alone exceed the column bound and can still overflow,
   and none of this is browser-proven by render tests; qa:s geometric deploy
   verification (1280x800 + 1280x500, oforcerade klick) is the closing
   evidence for issue #75. */
.kind-body--admin .kind-chat--zoned .kind-compose-popover,
.kind-body--admin .kind-chat--zoned .kind-schemalagda {
  flex-shrink: 1;
  min-height: 0;
  overflow-y: auto;
  overscroll-behavior: contain;
}
/* #75 P3-följdnit (qa deploy-sweep 2026-07-12 21:18): with the pane open at
   1280x800 the flex distribution left the popover scrollport a 28px SLIT
   (4px at 1280x500) while the LOG kept 342px (measured: zon 672 = header 72
   + logg 342 + compose 191 + popover 28 + schemalagda 3): flex shrink is
   PROPORTIONAL to factor x base, and the log's base (thread content,
   thousands of px) makes it shrink alongside the panels rather than before
   them. Reachable-but-miserable: a 529px form through a 28px window.
   Fix = shrink PRIORITY, not floors: flex-shrink 999 makes the log's shrink
   weight dominate totally, so the log yields toward its min-height:0 floor
   FIRST (qa:s förslagsriktning "låt loggen krympa mot sitt min före
   popovern"); only the deficit remaining after the log is empty reaches the
   shrink-1 panels. Worked math on qa:s numbers (base sums: header 72 +
   compose 191 + popover ~530 + schemalagda ~60):
   * 1280x800 (bound 672): remaining deficit 181 -> popover ~367px window
     (was 28), schemalagda ~42px;
   * 1280x500 (bound 372): remaining deficit 481 -> popover ~98px (was 4),
     schemalagda ~11px.
   Trade-off (accepted, P3): the THREAD collapses toward 0 while the pane is
   open on tight viewports; closing the pane restores it (the wrapper's
   content returns to ~0 and the freed space goes back to the log). The
   alternative, a min-height floor on the popover when open, was rejected:
   a min violation transfers the overflow back OUT of the sticky column,
   which is exactly the #75 defect class. Default state (pane closed): the
   wrapper's base is ~0, so there is no meaningful deficit to distribute and
   the log keeps essentially all its space; the flex-999 weight only changes
   the SHARE of any shrink, which is negligible when nothing needs to shrink
   (P3-3, reviewer 2026-07-12: NOT "exactly as before", the pre-999 rule also
   shrank the log proportionally, just never with a deficit worth noticing in
   the closed state). Numbers are model-based (rule 41 honesty:
   percentage-basis-resolves-as-content is inferred from qa:s measurement,
   not from spec certainty); qa:s deploy verification on 2.1.9 is the
   closing evidence. */
.kind-body--admin .kind-chat--zoned .kind-chat__log {
  flex-shrink: 999;
}
/* HÄR LÅG `.kind-schemalagda:focus-visible` (axe P3-2, qa deploy-sweep
   2026-07-12): en explicit fokusring för sektionen, motiverad av att den bar
   `tabindex="0"` som fokuserbar scrollport. Regeln är BORTTAGEN 2026-07-26:
   pixelbudgeten byggde om panelen till native <details>/<summary>, och samma
   ändring tog bort sektionens tabindex (tomtillståndet har numera en <summary>,
   som är fokuserbar av sig själv, så ett tabindex hade bara lagt till ett dött
   tabbstopp). Utan tabindex kan sektionen inte längre få fokus, alltså kunde
   regeln aldrig lösa ut.

   Fokusindikatorn är inte borta, den flyttade: `.kind-schemalagda__summary:
   focus-visible` (samma accent-token och offset) sitter på det element som
   FAKTISKT tar fokus. En kvarlämnad död fokusregel är sämre än ingen, den
   antyder att ytan är fokuserbar och kan få nästa granskning att kryssa av en
   a11y-punkt som inte längre gäller. */

/* #73 (qa deploy-verify d9a037f punkt 3 + a11y-svep K1a, 2026-07-12): vid
   smal bredd slapper den zonade kolumnen sitt sticky+max-height-bundna lage
   och foljer sidflodet, exakt den konvention grannspalterna redan anvander
   (.kind-arbetsvy__ko: "static when stacked", max-width:900px ovan; samma
   brytpunkt som .kind-chatt-layout/.kind-arbetsvy stackar pa).

   Varfor: uppmatt vid 320x568 far loggen 24px clientHeight av den fasta
   440px-budgeten (chat-header ~124px + composer ~266px ater resten, V4:s
   verktygsrad okade composern), och eftersom kolumnen ar sticky kan
   SIDSCROLL aldrig avsloja det som hamnar under max-height-vecket (samma
   rotgeometri som K3/#75). En min-height-golv pa loggen INUTI den bundna
   kolumnen hade bara tryckt composern under vecket, dvs. aterinfort
   Skicka-P0:n i ny form. Statisk kolumn + internt loggtak ar P0-omarbetningens
   bevisade patientmonster (.kind-body--chat-blocket i kind_patient.css).

   Mekanik vid <=900px:
   * kolumnen statisk, sidan skrollar normalt; composern nas alltid via
     sidscroll (den ar redan position:static har, regeln ovan ar inte
     media-scopad);
   * loggen behaller sin interna skrollport via ett eget viewport-relativt
     tak: 34rem approximerar kringkromet vid 320px (kompakt sitechrome
     ~7.8rem + chat-header ~7.75rem + composer ~16.6rem + marginaler ~1.5rem)
     och 16rem-golvet (= 256px, mot 24px uppmatt fore, 10.7x) haller
     tradfonstret anvandbart nar viewporten ar kortare an sa; monstret och
     sifferresonemanget speglar patienttakets max(16rem, 100dvh - 22rem);
   * overscroll-behavior: contain pa loggen (delade zonregeln i
     kind_patient.css) galler oforandrat, sa hjulscroll vid tradgransen
     kedjar inte till sidan;
   * --kind-composer-reserve: 0px-pinnen i basregeln ovan galler AVEN har,
     medvetet: composern ar statisk i flodet under loggen i bada lagena och
     kan aldrig overlagra ett fokuserat element underifran (#74 reverseras
     alltsa INTE av detta block); toppreserven vid smal bredd hanteras av
     tokenbumparna i kind.css #73-blocket (10rem, foljer kompakta headern).
   Rendertesterna (tests/test_admin_compact_nav_css.py) pinnar reglerna i
   CSS-texten; geometrin bevisas av qa pa deploy per #72-disciplinen. */
@media (max-width: 900px) {
  .kind-body--admin .kind-chat--zoned {
    position: static;
    max-height: none;
  }
  .kind-body--admin .kind-chat--zoned .kind-chat__log {
    max-height: max(min(16rem, 40dvh), calc(100dvh - 34rem));
  }
}

/* web#487 (uppmatt av frontend-web-agenten under web#470, roll vardpersonal,
   /admin/chatt/<id> + /admin/arbetsvy/<id>, cirka 450 tecken i svarsfaltet):
   vid 320x568 med text i svarsfaltet var skrivpopoverns SYNLIGA hojd 0 px med
   PDF- eller fotorutan oppnad och fil vald, och ingen rullning kunde visa
   rutan. Vid 375x812 var 202 px synligt av rutans cirka 240 px fran falt till
   Dela, sa Dela hamnade utanfor. Menyposten gick inte heller att na med ett
   oforcerat musklick vid 320 (`klickBlockerat: true`).

   MEKANISMEN ar #75-regeln hogre upp i filen, inte den residual-not om "under
   cirka 430 px hojd" som arendet pekade pa (bada de uppmatta hojderna, 568 och
   812, ligger OVER 430). #75 gor popover-omslaget till ett KRYMPBART eget
   skrollfonster (`flex-shrink: 1; min-height: 0; overflow-y: auto`) for att
   binda det inuti den STICKY, max-height-bundna kolumnen. Vid <=900px finns
   den kolumnen inte langre: blocket precis ovanfor gor den `position: static;
   max-height: none`, och #156-blocket nedanfor binder i stallet HELA SIDAN till
   100dvh. #75-reglerna ar dock inte media-scopade, sa omslaget fortsatter att
   vara krympbart aven har - och nar loggen (shrink 999) ar nerkrossad till sitt
   min-height: 0-golv traffar hela det aterstaende underskottet omslaget, som
   har shrink 1 och inget golv. Resultatet ar exakt det uppmatta: ett
   skrollfonster med 0 px anvand hojd, som dessutom KLIPPER sitt innehall
   (`overflow-y: auto`) sa att varken sid- eller kolumnskroll kan avsloja det.
   Innehallet ligger kvar i layouten vid omslagets origo, vilket ocksa ar varfor
   skrivformularet mats som det som tar musklicket pa menyposten.

   FIXEN ar att slappa krympningen just dar den inte langre behovs: vid <=900px
   ar omslaget ett vanligt flodesblock igen (`flex: 0 0 auto`, synligt
   overflow). Det som inte ryms spiller da UT och dokumentet skrollar.

   VARFOR DET AR SAKERT HAR, men inte i den sticky kolumnen: #75 avvisade
   medvetet ett golv pa popovern ("a min violation transfers the overflow back
   OUT of the sticky column", noten vid flex-shrink: 999 ovan). Det argumentet
   galler en sticky box, vars overflow FOLJER sidskrollen och darfor aldrig kan
   rullas fram. Vid <=900px ar kolumnen statisk, och #156-blocket nedanfor slar
   uttryckligen fast motsatsen for just den har ytan: vardgivarskalet har
   medvetet INGET `overflow: hidden` (till skillnad fran patientskalet, som har
   fasta tabbar), eftersom "en utspilld modul ar inte ockluderad utan bara
   nedanfor vecket, och DA ar sidskroll raddningen och inte defekten". Samma
   resonemang, samma yta, nu tillampat pa popovern.

   PRISET, uttalat: med rutan oppen pa en kort viewport kan sidan behova
   skrollas for att fa hela rutan i bild, och traden ar da nerkrossad (det var
   den redan, #75:s dokumenterade avvagning). Det ar en bytesaffar mot 0 px
   synligt och ett oatkomligt Dela, dvs. den sista bekraftelsen fore en
   journalford utlamning.

   >900px ar ORORT: reglerna har ar media-scopade och #75:s mekanism i den
   sticky kolumnen star kvar oforandrad (pinnat som negativ kontroll i
   tests/test_487_smal_skrivpopover_css.py).

   SPECIFICITET: `body.kind-body--admin ...` ger (0,3,1) och slar darfor
   #75-regelns (0,3,0) utan att luta sig mot kallordning, samma disciplin som
   #156-blocket nedanfor anvander mot samma kedja.

   ARLIGHET (regel 41): reglerna ar mekanismbevisade, inte browsermatta har.
   Render-testet pinnar reglerna; geometrin (fyra matpunkter, oforcerat klick,
   xxlarge) mats av den incheckade riggen e2e/487-smal-skrivpopover-matning.mjs,
   som kraver en lokal Playwright och alltsa inte kan koras i CI-lanen
   (.github/workflows/ci.yml: DB-fri, ingen Playwright). */
@media (max-width: 900px) {
  body.kind-body--admin .kind-chat--zoned .kind-compose-popover {
    flex: 0 0 auto;
    overflow: visible;
  }
}
/* KIND-MOB-02 (UAT 2026-07-16, simulerade tangentbords-viewports 390x544 /
   412x595): pa en KORT smal viewport later 16rem-golvet ovan loggen ata sa
   mycket av hojdbudgeten att composern (och darmed Skicka-raden) borjar
   under vecket; uppmatt sat Skicka-botten ~40px under 595px-viewporten.
   Nar hojden ar tangentbords-kort ar composern arbetsytan och traden
   sekundar, sa golvet sanks till 10rem (160px tradfonster, fortfarande
   lasbart) vilket frigor 96px och later composern fa plats utan scroll.
   Kolumnen forblir STATISK (position/sticky rors INTE har: #73/#74/#75-
   blocken ovan beskriver P0-klassen en sticky composer aterinfor). Samma
   specificitet som basregeln ovan, sa KALLORDNINGEN (detta block EFTER) ar
   det som vinner vid <=700px hojd; testet pinnar bada. OBS dvh-honesty:
   base.html satter numera interactive-widget=resizes-content (UAT-01-
   mergen), sa Chrome/Android krymper layout-viewporten (och dvh) nar
   tangentbordet oppnas och detta block biter aven dar; iOS/Safari saknar
   stod och krymper bara visual viewport, dar fangas fallet av
   input-assisten i kind_composer_popover.js. */
@media (max-width: 900px) and (max-height: 700px) {
  .kind-body--admin .kind-chat--zoned .kind-chat__log {
    max-height: max(min(10rem, 30dvh), calc(100dvh - 34rem));
  }
}

/* ---- CP-14 (#99): golvet far inte overstiga vad viewporten kan avvara -----
 *
 * `min(<rem-golv>, <andel av viewporten>)` i bada reglerna ovan. Skalet ar
 * MATT och inte estetiskt.
 *
 * `rem` foljer anvandarens textskala. Vid xxlarge (rot 24px) blev 10rem 240px
 * och 16rem 384px, samtidigt som `calc(100dvh - 34rem)` gick NEGATIV (34rem =
 * 816px mot en 664px hog viewport), sa golvet vann alltid och loggen KRAVDE
 * 240px oavsett vad som fanns kvar. Uppmatt pa deployen 2026-08-04 vid 320x664
 * xxlarge: skrivfaltets underkant lag pa 742px (vard-chatt) och 746px
 * (vard-kollegiechatt) mot en 664px hog viewport, alltsa var skrivfaltet inte
 * synligt samtidigt som senaste meddelandet. Det ar matt 5 i
 * docs/contracts/classic-plus-utfall.md, och det gick sonder for att ett golv
 * som skalar med texten kan bli storre an rummet det star i.
 *
 * ANDELARNA ar harledda, inte valda: varje tak ligger precis OVANFOR sin egen
 * regels rem-golv vid NORMAL textskala pa den kortaste viewport regeln styr,
 * sa taket kan bara bita nar textskalan blast upp golvet.
 *   10rem-regeln styr hojder <= 700px. Kortaste rimliga 568: 160/568 = 28.2%,
 *   alltsa binder 30dvh (170px) aldrig vid normal skala.
 *   16rem-regeln styr hojder > 700px. Kortaste 701: 256/701 = 36.5%, alltsa
 *   binder 40dvh (280px) aldrig vid normal skala.
 *
 * VAD DET KOSTAR, arligt: vid xxlarge krymper tradfonstret fran 240 till 199px
 * pa en 664px viewport, alltsa fran cirka 6.6 till 5.5 textrader. Bytet ar ett
 * skrivfalt som gar att se och trycka pa. Ett osynligt skrivfalt ar inte en
 * mindre lasbar chatt, det ar en chatt man inte kan svara i.
 *
 * Vid NORMAL textskala andras ingenting pa nagon matt viewport, vilket ar
 * avsikten: detta ar en atgard mot textskalans inflation, inte en generell
 * nedskarning av tradfonstret. Pinnat i tests/test_admin_compact_nav_css.py,
 * matt av e2e/matt5-chattgrind.mjs. */

/* ==========================================================================
 * #156: VARDGIVARENS CHATTYTOR BINDS TILL VIEWPORTEN VID MOBILSTACKNING
 *
 * Utfallskontrakt: eng-nordic-care-agents docs/contracts/vardgivarchatt-viewportbindning.md
 * Matinstrument:   e2e/dokskroll-matning/grind.mjs (stub-render, Pattern 9)
 *
 * ---- MEKANISMEN, HARLEDD OCH INTE OVERTAGEN ------------------------------
 *
 * Rapporten (docs/acceptance/dod9-jamforelsematris-2026-08-09.md 1.1) pekade ut
 * arbetsvyns 280px-panel som orsak. Panelen ar den STORSTA bidragsgivaren men
 * INTE mekanismen. Uppmatt i webblasare mot stub-rendret, 390x664 normal,
 * arbetsvyn:
 *
 *   sidans flodeshojd                        1564,78px   mot viewport 664
 *     .kind-header (sitekrom)                 186,19
 *     .kind-main padding                       36,00
 *     .kind-chat-header + marginal            136,80
 *     .kind-chat__log (takad)                 160,00
 *     .kind-chat__compose                      53,00
 *     .kind-schemalagda + marginal             56,00
 *     aside + marginal + grid-gap             684,80
 *     .kind-footer                            236,00
 *
 * Ablation, samma matpunkt: med ENBART asiden borttagen kvarstar 200px
 * dokumentskroll och chattheadern lamnar anda viewporten (matt topp -1,81).
 * Och kollegie-chatten, som saknar aside HELT, bar samma defekt (65px skroll
 * vid normal, 507px vid 320 xxlarge, skrivfaltet OTRAFFBART vid xxlarge pa
 * fyra av fem bredder). Att atgarda panelen hade alltsa lamnat tva ytor
 * trasiga med identisk mekanism (regel 27 korollarium 2).
 *
 * MEKANISMEN ar att INGENTING binder sidans flodeshojd till viewporten vid
 * <=900px. Kolumnen slapper sitt sticky+max-height-lage (blocket ovan) och
 * loggens interna tak, `max(min(10rem, 30dvh), calc(100dvh - 34rem))`, ar en
 * HANDRAKNAD uppskattning av kringkromet plus ett golv som avsiktligt slar
 * uppskattningen. Bada delarna ar blinda for vad som faktiskt star i flodet:
 * 34rem = 544px reserverades for ett krom som uppmatt ar 704px UTAN asiden och
 * 1389px MED den. En sidas hojd som ar summan av oberoende block kan darfor
 * inte annat an spranga viewporten, och da bar dokumentskrollen ut den
 * STATISKA kolumnen med chattheader och skrivmodul.
 *
 * ---- FIXEN: FLEXALGORITMEN MATER DET UPPSKATTNINGEN GISSADE --------------
 *
 * Skalet far en DEFINIT hojd (100dvh), mainen blir en flexkolumn, chattzonen
 * `flex: 1 1 auto; min-height: 0` och loggen ar zonens enda flexibla barn
 * (delade `.kind-chat--zoned`-reglerna i kind_patient.css: `flex: 1;
 * min-height: 0; overflow-y: auto`). Loggen absorberar darmed exakt det som
 * blir over, uppmatt i stallet for gissat, och taket ovan overrids har
 * (`max-height: none`) eftersom en approximation som SYSTEMATISKT
 * UNDERSKATTAR kringkromet ar en trasig rokdetektor och inte en sakerhet
 * (regel 49c). Taket star kvar i filen som fallback for varje zonad yta som
 * INTE bar skalklassen.
 *
 * ---- INGET overflow:hidden, OCH DET AR LOAD-BEARING ----------------------
 *
 * Patientytans skal (`.kind-body--chat`, kind_patient.css) LASER sidskrollen
 * med `overflow: hidden`, eftersom dess fasta tabbar annars ockluderar en
 * utspilld skrivmodul (UAT-01B P0). Vardgivarytorna har INGEN fast bottenrad,
 * alltsa ar en utspilld modul inte ockluderad utan bara nedanfor vecket, och
 * DA ar sidskroll raddningen och inte defekten.
 *
 * Det ar inte en detalj. Uppmatt vid 320x664 xxlarge ar de ICKE KRYMPBARA
 * skenorna 675,60px (sitekrom 242,22 + mainpadding 66 + chattheader 196,50 +
 * skrivmodul 69 + schemalagda 101,90) mot en 664px hog viewport, alltsa mer an
 * viewporten AVEN med loggen pa noll. Med `overflow: hidden` hade skrivmodulen
 * KLIPPTS bort och blivit oatkomlig; nu spiller den ut och sidan skrollar,
 * exakt dagens beteende och exakt det tillstand mattet 5-punktkravet 675,66
 * i docs/contracts/classic-plus-utfall.md ar bokfort i. Fixen far inte gora
 * den punkten samre, och en klippande bindning hade gjort det.
 *
 * Det ar ocksa varfor loggen INTE far ett golv har. Den retirerade V1-kedjan
 * pa patientytan slutade tyst binda just for att ett 16rem-golv vagrade
 * krympa (se kind_patient.css). `min-height: 0` utan golv ar hela skillnaden.
 * ========================================================================== */
@media (max-width: 900px) {
  /* BADE height OCH min-height, med SAMMA uttryck. Anvand hojd loses som
     max(height, min-height), sa basregelns `min-height: 100vh` (kind.css,
     0-1-1) hade tyst annullerat bindningen. `body.kind-body.kind-body--vardchatt`
     ar 0-3-1 och vinner darfor oavsett kallordning, samma disciplin som
     patientytans `body.kind-body.kind-body--chat`. */
  body.kind-body.kind-body--vardchatt {
    height: 100dvh;
    min-height: 100dvh;
  }
  .kind-body--vardchatt .kind-main {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
    /* REN ANDRUM, aldrig en traffyta och aldrig en textstorlek: mainens
       block-vaddering ar 18px i var ande och ger 36px som i det bundna skalet
       tas RAKT ur konversationsfonstret. Samma kompaktion och samma motivering
       som patientytans `.kind-body--chat .kind-main` (padding-top space-3) och
       RETEST-03-blocket i kind_patient.css. Sidopaddingen ar orord, den bar
       radlangden. */
    padding-block: var(--kind-space-2);
  }
  /* Sidfoten bar ingen lank och ingen atgard, bara varumarke, en juridisk
     mening, versionsstrangen och copyright, och den kostar 236px vid normal
     och 479,50px vid xxlarge, alltsa mer an hela konversationsfonstret.
     Patientytans chattskal doljer den redan pa samma grund
     (`.kind-body--chat .kind-footer`, sedan V1). Den juridiska meningen finns
     oforandrad pa varje annan yta i portalen, och doljandet galler ENBART
     mobilstackningen: >900px ar sidfoten orord. */
  .kind-body--vardchatt .kind-footer {
    display: none;
  }
  /* Layoutbehallaren maste ocksa bli en flexkolumn, annars stannar
     flexkedjan vid mainen och chattzonen sizear till sitt innehall igen
     (exakt det som brot kollegie-chatten fore issue #82, se
     "KOLLEGIE-CHATTENS HOJDKEDJA" ovan). Kollegie-chattens artikel ar direkt
     barn till mainen och behover ingen behallare har. */
  .kind-body--vardchatt .kind-arbetsvy,
  .kind-body--vardchatt .kind-chatt-layout {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
    gap: var(--kind-space-2);
  }
  /* 0-3-1: maste sla `.kind-body--admin .kind-chat--zoned` (0-3-0) i BADA
     media-blocken ovan utan att luta sig mot kallordning. `position: static`
     och `max-height: none` darifran ar oforandrade och onskade. */
  body.kind-body--vardchatt .kind-chat--zoned {
    flex: 1 1 auto;
    min-height: 0;
    /* `align-self: stretch` ar LOAD-BEARING och inte stadning, och huset har
       redan betalat for den har lardomen en gang (se "KOLLEGIE-CHATTENS
       HOJDKEDJA" ovan). Basreglerna satter `align-self: start`, vilket i en
       GRID-cell styr BLOCKaxeln, dar det ar deras syfte. I en flexKOLUMN styr
       align-self INLINE-axeln, sa `start` later i stallet boxen sizea till sin
       INNEHALLSBREDD. Uppmatt utan den har raden vid 320x664 xxlarge: asiden
       blev 342,80px bred i en 296px behallare och gav dokumentet 35px
       HORISONTELL skroll, alltsa ett 1.4.10-brott infort av en hojdfix. */
    align-self: stretch;
  }
  body.kind-body--vardchatt .kind-chat--zoned .kind-chat__log {
    max-height: none;
  }
  /* SIDOPANELEN kostar en summary-rad i stallet for hela sitt innehall.
     `flex: 0 0 auto` sa den aldrig ater av konversationens fonster, och nar
     vardpersonalen FALLER UT den far den en egen skrollport i stallet for att
     trycka ut skrivmodulen igen. `50dvh` ar viewport-relativt och alltsa alltid
     definit; ett procenttak pa ett flexbarn hade kunnat losas till `none` i en
     behallare utan definit huvudstorlek (css-flexbox-1 §9.8), exakt den fallan
     #75 dokumenterar hogre upp i filen.
     `overscroll-behavior-y: contain` sa ett hjul inne i panelen inte kedjar
     vidare till sidan, samma konvention som chattloggen. */
  .kind-body--vardchatt .kind-chatt-aside {
    flex: 0 0 auto;
    /* Se noten om align-self vid chattzonen ovan. Det var HAR defekten mattes:
       342,80px i en 296px behallare. */
    align-self: stretch;
    max-height: 50dvh;
    overflow-y: auto;
    overscroll-behavior-y: contain;
    margin: 0;
    /* Vaddering och marginal runt en ENDA hopfalld summary-rad kostade uppmatt
       34px vid normal och 44px vid xxlarge, alltsa mer an en tredjedel av
       konversationsfonstret vid stor textskala. Vadderingen flyttas till
       detaljens OPPNA lage nedan, sa den betalas bara nar det finns innehall
       att vadda. Ram, radie och bakgrund (`.kind-nu`) star kvar och avgransar
       panelen aven hopfalld. */
    padding: 0;
  }
  .kind-body--vardchatt .kind-sidopanel-fold[open] {
    padding: 0 var(--kind-space-3) var(--kind-space-3);
  }
  /* Zonrubriken ar summaryns tvilling vid mobilstackning, och tva rader som
     sager samma sak kostar 32px av konversationen. Rubriken tas INTE ur DOM:en:
     `aria-labelledby` pekar pa den, och accname anvander refererad text aven nar
     elementet ar visuellt dolt, sa landmarket behaller sitt namn. Samma teknik
     som .kind-visually-hidden i kind.css och samma val som CP14-KOZON-MOBIL
     gjorde for ko-zonens <h2>. */
  .kind-body--vardchatt .kind-chatt-aside > .kind-profile-section__title {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    border: 0;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
  }
}

/* ============ Search + filter row ============ */

.kind-filter-row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-3);
  align-items: flex-end;
  margin-bottom: var(--kind-space-4);
}
.kind-filter-row .kind-field { flex: 1; min-width: 220px; }

/* ---------------------------------------------------------------------------
 * P2-4 (#99, briefen §4.3 "En primär handling per område"): FILTERCHIP.
 *
 * VAD SOM VAR FEL, uppmätt och inte tyckt (1440x900, lokal mätserver
 * 2026-08-08, `e2e/gapb-matning/fore.json`): verktygsraden bar TRE knappar med
 * `--kind-color-accent`-fyllning, `Sök` 78,73x50, `Aktiva` 97,53x45,19 och
 * `Sök på tagg` 139,97x50, plus `Filtrera` när flera verksamheter finns. Fyra
 * likvärdiga primärknappar i ett område betyder att inget är primärt. Samtidigt
 * bär sidans VERKLIGA primärhandling, att öppna en patientkonversation, ingen
 * primärstil alls: den är ett radklick. Ögat drogs alltså systematiskt till
 * kontrollerna och bort från kön, vilket är precis §7.1:s acceptanskriterium
 * "brådskande och oläst kan identifieras på mindre än fem sekunder utan filter".
 *
 * VARFÖR CHIP OCH INTE BARA "SEKUNDÄR": `Aktiva` / `Visa alla` är inte en
 * handling utan ett TILLSTÅNDSVAL över vilken delmängd som visas. Att ge dem
 * knappvikt (primär ELLER sekundär) läser dem som något man UTFÖR. En chip läses
 * som något man ÄR i. `Sök på tagg` och `Filtrera` är däremot riktiga
 * submit-handlingar och blir sekundärknappar, inte chips.
 *
 * FORMEN ÄR INTE EN KAPSEL. Briefen §4.3 säger uttryckligen "undvik stora
 * kapslar som standardform", så chippet ärver husets `--kind-radius` (10px) via
 * `.kind-btn` och deklarerar ingen egen radie. Ordet "chip" beskriver vikten,
 * inte en pillerform.
 *
 * A11Y-GOLVEN ÄR ORÖRDA, och det är avsiktligt uttryckt i vad regeln INTE gör:
 *   * ingen `min-height` / `min-width` deklareras, så `.kind-btn`-golvet 44px
 *     (SC 2.5.8) står kvar oförändrat;
 *   * typskalan är `--kind-font-small` = 14px, alltså över husets 13px-golv
 *     (`tests/test_ingen_skarmtext_under_13px`);
 *   * `--kind-color-border` #788FA6 är 3,34:1 mot vitt, alltså över SC 1.4.11:s
 *     3:1 för en komponentkant, och `--kind-color-accent` #1769D2 är 4,76:1 mot
 *     `--kind-color-accent-bg` #EFF4FC, alltså över SC 1.4.3:s 4,5:1 för text.
 *   * WCAG 1.4.1: det valda chippet bär en synlig BOCK utöver fyllningen, så
 *     tillståndet aldrig hänger på färg ensam. `aria-current="true"` bär samma
 *     tillstånd för hjälpmedel, och bocken är `aria-hidden` så AT inte läser
 *     valet två gånger.
 *
 * `[aria-current="true"]` i stället för en egen `--vald`-modifierare: tillståndet
 * finns REDAN i DOM:en som `aria-current`, och en parallell klass hade kunnat
 * drifta isär från den. Ett tillstånd, en bärare.
 *
 * SIDOEFFEKT PÅ MÅTT 3, uppmätt och attribuerad inom EN miljö (1280x800 normal,
 * samma mätserver, samma data, tre körningar): första patientradens y-position
 * 416,17 FÖRE, 385,98 med enbart den här ändringen, alltså **-30,19px**.
 * Chippen är 44px höga mot primärknappens 45,19, och den kortare `Sök tagg`
 * ändrar dessutom var verktygsradens flexrad bryter. Det var inte målet med
 * ändringen, men det pekar åt rätt håll och är därför bokfört i stället för
 * upptäckt senare som en oförklarad avvikelse. */
.kind-filterchip {
  padding: var(--kind-space-2) var(--kind-space-4);
  font-size: var(--kind-font-small);
  font-weight: 600;
  background: transparent;
  color: var(--kind-color-text);
  border-color: var(--kind-color-border);
}
.kind-filterchip:hover { background: var(--kind-color-surface-muted); }
.kind-filterchip[aria-current="true"] {
  background: var(--kind-color-accent-bg);
  color: var(--kind-color-accent);
  border-color: var(--kind-color-accent);
}
.kind-filterchip__bock { font-weight: 700; }

/* ---------------------------------------------------------------------------
 * CP-05 (#90) INMATNINGSGRUPP: fältet och dess knapp på SAMMA rad, inuti
 * `.kind-field`.
 *
 * DEFEKTEN. `.kind-filter-row` har `align-items: flex-end`, alltså justeras
 * knappen mot FÄLTGRUPPENS underkant. Fältgruppen är etikett plus inmatning
 * plus HJÄLPTEXT, så knappen linjerades mot hjälptextens underkant och inte
 * mot inmatningens. Uppmätt på /admin/patienter: inmatningens mittlinje
 * y=370, knappens y=401.5, alltså 31px glapp. Samma mönster på "Filtrera" och
 * "Sök på tagg".
 *
 * FIXEN ÄR STRUKTURELL, inte en justering av justeringen. Knappen ligger nu i
 * samma grupp som inmatningen, så de delar rad by construction och kan inte
 * glida isär igen när en hjälptext läggs till eller tas bort. Att i stället
 * absolutpositionera hjälptexten hade tagit den ur flödet och lagt den ovanpå
 * nästa kontroll vid smala bredder.
 *
 * `flex-wrap: wrap` gör att knappen lindar ned under inmatningen när bredden
 * inte räcker (320px xxlarge) i stället för att klämma inmatningen.
 * --------------------------------------------------------------------------- */
.kind-search {
  display: flex;
  flex-wrap: wrap;
  /* `stretch` och inte `flex-end`: inmatningen är 50px hög (polstring plus
     kant) och knappen 45px, så en underkantsjustering lämnar 2.5px kvar
     mellan mittlinjerna. Stretch ger dem samma höjd och därmed exakt samma
     mittlinje, vilket också är den vanliga inmatningsgruppens utseende. */
  align-items: stretch;
  gap: var(--kind-space-2);
}
.kind-search .kind-field__input { flex: 1 1 8rem; min-width: 0; }
.kind-search .kind-btn { flex: 0 0 auto; }

/* ============ Patient profile (UX A-03) ============ */

.kind-profile-grid {
  display: grid;
  grid-template-columns: minmax(0, 2fr) minmax(280px, 1fr);
  gap: var(--kind-space-5);
}
@media (max-width: 900px) {
  /* CP-15 (#100): `minmax(0, 1fr)` och inte `1fr`, samma rättelse som CP-14
   * gjorde på `.kind-chatt-layout` av samma orsak.
   *
   * En bar `1fr` är `minmax(auto, 1fr)`, och `auto` som MINIMUM är spårets
   * min-content. Vid xxlarge växte innehållet i vänsterkolumnen förbi
   * viewporten och drog med sig SPÅRET: uppmätt 2026-08-05 renderades båda
   * kolumnerna 372px breda i en 320px viewport, alltså 76px horisontell skroll
   * på hela dokumentet (6px vid 390). Överskottet fanns på deployen före den
   * här ändringen också, det är inte en ny defekt, men det står på samma yta
   * och `minmax(0, 1fr)` löser det med ett värde.
   *
   * `minmax(0, 1fr)` låter spåret krympa under min-content, så överskottet
   * hamnar i det enskilda elementets egen hantering i stället för att skjuta ut
   * sidan. */
  .kind-profile-grid { grid-template-columns: minmax(0, 1fr); }
}
.kind-profile-section { margin-bottom: var(--kind-space-5); }
.kind-profile-section__title {
  font-family: var(--kind-font-serif);
  font-size: var(--kind-font-h3);
  margin-bottom: var(--kind-space-3);
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--kind-space-3);
}
.kind-kv {
  display: grid;
  /* minmax(0, 1fr) (not a bare 1fr) so a long value token (an email, a personnr)
   * cannot force the columns past the pane at 320px / high zoom (WCAG 1.4.10). */
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: var(--kind-space-3);
  font-size: var(--kind-font-base);
}
.kind-kv__label { color: var(--kind-color-text-muted); font-size: var(--kind-font-small); }
.kind-kv__value {
  font-weight: 600;
  /* wrap a long unbreakable value (anna.andersson@example.test) inside its cell
   * rather than overflowing; min-width: 0 lets the grid cell shrink to allow it. */
  min-width: 0;
  overflow-wrap: anywhere;
}
/* web#220 / ADR-072 D11: transparensraden under ett värde (GDPR art. 13.1 e).
   Normalvikt och dämpad ton, så den läses som förklaring och inte som ett
   andra värde. */
.kind-kv__hint {
  display: block;
  margin-top: var(--kind-space-1);
  font-weight: 400;
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
}

/* --------------------------------------------------------------------------
 * G2: clinician "Mitt konto" settings page + GDPR self-delete modal + success.
 *
 * The clinician twin of the patient profile (kind_patient.css W6-01/PMV-11).
 * Ported here so /admin/profil (which loads kind_admin.css, NOT the patient
 * stylesheet) gets the same page wrapper, danger-zone subsection, and native
 * <dialog> confirm modal. Reuses the existing .kind-profile-section (margin)
 * and .kind-kv (2-col) above, so only the NEW classes are added here:
 *  - .kind-profile               page wrapper for /admin/profil + success.
 *  - .kind-profile__lede         muted intro paragraph.
 *  - .kind-profile-section__body section body text.
 *  - .kind-profile-section--danger    red-accented "danger zone" subsection.
 *  - .kind-dialog                native <dialog> styling for the confirm modal.
 *  - .kind-profile--success      success-page wrapper.
 *
 * Tokens are shared (kind.css). .kind-btn--danger already lives in this file.
 * a11y: the modal uses native <dialog>.showModal(); focus-trap + Escape are
 * browser-built-in. Shared progressive-enhancement script kind_radera_konto.js.
 * -------------------------------------------------------------------------- */
.kind-profile {
  max-width: var(--kind-container-narrow);
  margin: 0 auto;
  padding: var(--kind-space-4) 0;
}
.kind-profile__lede {
  color: var(--kind-color-text-muted);
  font-size: 1.0625rem;
  margin: var(--kind-space-2) 0 var(--kind-space-5) 0;
}
.kind-profile-section--danger {
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-accent);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-4);
}
.kind-profile-section__body {
  margin: 0 0 var(--kind-space-3) 0;
  line-height: 1.5;
}

/* Native <dialog> confirm modal. Browser owns the backdrop + focus-trap via
 * showModal(); we style only the panel + actions row. */
.kind-dialog {
  border: none;
  padding: 0;
  border-radius: var(--kind-radius);
  background: transparent;
  max-width: 32rem;
  width: calc(100% - 2rem);
}
.kind-dialog::backdrop {
  background: rgba(0, 0, 0, 0.45);
}
.kind-dialog__panel {
  background: var(--kind-color-surface);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-5);
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-3);
}
.kind-dialog__title {
  margin: 0;
  font-family: var(--kind-font-serif);
  font-size: var(--kind-font-h2);
}
.kind-dialog__body {
  margin: 0;
  line-height: 1.5;
}
.kind-dialog__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-3);
  justify-content: flex-end;
  margin-top: var(--kind-space-2);
}

/* --------------------------------------------------------------------------
   Step-1 2FA (TOTP, flag removed in web#910): enrollment page, login verify step, and the
   "Mitt konto" 2FA-settings section. All flag-gated; the markup is absent when
   the flag is OFF. Reuses the design tokens so colours keep their documented
   WCAG 2.2 AA contrast (see kind.css token comments).
   -------------------------------------------------------------------------- */

/* Generic visibility helper: hide an element while keeping it in the DOM so the
   progressive-enhancement scripts can reveal it. Pairs with the `hidden`
   attribute (the attribute is the source of truth; this class is belt-and-
   braces for older UAs / CSS specificity). */
.kind-is-hidden { display: none !important; }

.kind-2fa-setup { max-width: var(--kind-container-narrow); margin: 0 auto; }
.kind-2fa-setup__lede {
  color: var(--kind-color-text-muted);
  margin-bottom: var(--kind-space-5);
}

.kind-2fa-instructions {
  margin: var(--kind-space-4) 0;
  padding-left: var(--kind-space-5);
  line-height: 1.55;
}
.kind-2fa-instructions li { margin-bottom: var(--kind-space-2); }

.kind-2fa-step__subhead {
  margin-top: var(--kind-space-6);
  font-size: var(--kind-font-h3, 1.125rem);
}

.kind-2fa-uri-details {
  margin: var(--kind-space-3) 0 var(--kind-space-5);
}
.kind-2fa-uri-details > summary {
  cursor: pointer;
  color: var(--kind-color-accent-ink, var(--kind-color-text));
  font-weight: 600;
  padding: var(--kind-space-2) 0;
}

/* The 6-digit code input: monospace, wide letter-spacing so each digit reads
   clearly (helps low-vision + dyslexic users). Not so wide it breaks the field. */
.kind-2fa-code-input {
  font-family: var(--kind-font-mono);
  font-size: 1.25rem;
  letter-spacing: 0.35em;
  text-align: center;
}

/* Recovery-codes "save these now" warning. Warning-token palette; the body text
   stays page-ink for max contrast, the left rule carries the warning colour. */
.kind-callout {
  border-radius: var(--kind-radius);
  padding: var(--kind-space-4);
  margin: var(--kind-space-4) 0;
  background: var(--kind-color-surface-muted);
  border-left: 4px solid var(--kind-color-border-strong);
}
.kind-callout--warning {
  background: var(--kind-color-warning-bg);
  border-left-color: var(--kind-color-warning);
}
.kind-callout__title { margin: 0 0 var(--kind-space-2); }
/* web#756: arbetsytans fail-closed-tomtillstand pa oversikten. Informativ, inte
   varnande -- talet 0 ar korrekt, det ar BETYDELSEN som behover forklaras. */
.kind-callout--info {
  background: var(--kind-color-accent-bg);
  border-left-color: var(--kind-color-accent);
}

/* The recovery codes themselves: a real list of <code> chips, monospace and
   large so they are easy to transcribe; screen-reader readable (not an image). */
.kind-2fa-recovery__codes {
  list-style: none;
  margin: var(--kind-space-4) 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr));
  gap: var(--kind-space-2);
}
.kind-2fa-recovery__code {
  display: block;
  font-family: var(--kind-font-mono);
  font-size: 1.0625rem;
  letter-spacing: 0.08em;
  padding: var(--kind-space-2) var(--kind-space-3);
  background: var(--kind-color-surface-muted);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius-sm, 8px);
  color: var(--kind-color-text);
}
.kind-2fa-recovery__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-3);
  margin-top: var(--kind-space-4);
}

/* 2FA-settings status row on Mitt konto. */
.kind-2fa-status {
  display: flex;
  align-items: center;
  gap: var(--kind-space-2);
  margin: var(--kind-space-3) 0 var(--kind-space-4);
}
.kind-2fa-status__label { font-weight: 600; }

/* Success page wrapper (Konto markerat för radering). */
.kind-profile--success {
  max-width: var(--kind-container-narrow);
  margin: 0 auto;
  padding: var(--kind-space-4) 0;
}

/* PDL loggutdrag link (klinik-admin Q-14 / AT-46) */
.kind-pdl-cta {
  background: var(--kind-color-info-bg);
  border: 1px solid var(--kind-color-info);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-4);
  margin-bottom: var(--kind-space-5);
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-3);
  align-items: center;
  justify-content: space-between;
}
.kind-pdl-cta p { margin: 0; }

/* ============ CP-15 (#100): Aktuellt, patientsidans sammanfattning ============
 *
 * Sektionen svarar på "vad gäller för den här patienten just nu" utan skroll.
 * Den finns för att mått 4 i docs/contracts/classic-plus-utfall.md visade att
 * `vard-patientsida` var 73.3 procent aktuell information i första viewporten
 * vid 1280px men 34.4 procent vid 320px och NOLL vid xxlarge: en mobildefekt,
 * inte en felordnad sidstruktur. Se mallens kommentar för härledningen.
 *
 * Layouten är MOBILFÖRST med etikett över värde, och blir tvåkolumnig först när
 * det finns bredd för det. Skälet är mått 6: en fast etikettkolumn (`8rem 1fr`)
 * kan inte krympa under sin min-content vid xxlarge, och trycker då ut sidan i
 * horisontell skroll vid 320px. `minmax(0, ...)` överallt av samma skäl.
 */
/* ---- Raderingsbegäran (2026-08-15): patienten har bett om att kontot raderas.
 *
 * Ärver hela sin färgsättning från `.kind-flash--warning` i kind.css, alltså
 * husets redan granskade kontrastpar (`--kind-color-text` på
 * `--kind-color-warning-bg`). Det enda som sätts här är typografin, eftersom en
 * `<h2>` i en flash-ruta annars ärver sidrubrikens storlek och skriker.
 *
 * INFORMATIONEN BÄRS AV ORDEN, aldrig av färgen (WCAG 1.4.1): rubriken säger
 * "Patienten har begärt radering av sitt konto" i klartext. Sätt därför aldrig
 * en färgkodning här som texten inte redan säger.
 *
 * Rubriken följer `--kind-font-h3` (samma token som `.kind-nu__title`, och det
 * finns inget h4-token i kind.css) och inte ett px-värde, så den skalar med
 * användarens textstorlek (13px-golvet, CP-04). `overflow-wrap: anywhere` av
 * samma skäl som `.kind-nu__value`: rutan får inte bredda sidan vid 320px och
 * xxlarge (mått 6). */
.kind-radering { margin-bottom: var(--kind-space-4); }
.kind-radering__rubrik {
  font-family: var(--kind-font-serif);
  font-size: var(--kind-font-h3);
  margin: 0 0 var(--kind-space-2);
  overflow-wrap: anywhere;
}
.kind-radering__text { margin: 0; overflow-wrap: anywhere; }

.kind-nu {
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border);
  border-left: 4px solid var(--kind-color-accent);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-4);
  margin-bottom: var(--kind-space-5);
}
.kind-nu__title {
  font-family: var(--kind-font-serif);
  font-size: var(--kind-font-h3);
  margin: 0 0 var(--kind-space-3);
}
.kind-nu__list {
  margin: 0;
  display: grid;
  gap: var(--kind-space-3);
}
.kind-nu__row {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: var(--kind-space-1);
  min-width: 0;
}
.kind-nu__row--akut { border-left: 3px solid var(--kind-color-error); padding-left: var(--kind-space-3); }
.kind-nu__label {
  /* Golv 13px: --kind-font-small är 0.875rem, alltså 14px vid rotens 16px och
   * mer vid varje uppskalning. Sätt aldrig ett px-värde här. */
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
}
.kind-nu__value {
  margin: 0;
  min-width: 0;
  /* En lång vårdresetitel eller ett långt vårdgivarnamn ska brytas inne i sin
   * cell, inte bredda sidan (mått 6). */
  overflow-wrap: anywhere;
}
.kind-nu__tom { color: var(--kind-color-text-muted); }
.kind-nu__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-3);
  margin-top: var(--kind-space-4);
}
/* Knapparna får krympa men aldrig under en träffbar bredd. `flex: 1 1 auto` med
 * `min-width: 0` skulle låta dem klämmas ihop till oanvändbara remsor vid 320px
 * och xxlarge; en egen rad var är ärligare än två oläsbara. */
.kind-nu__actions .kind-btn { flex: 1 1 12rem; text-align: center; }
@media (min-width: 30rem) {
  .kind-nu__row {
    grid-template-columns: minmax(0, 9rem) minmax(0, 1fr);
    gap: var(--kind-space-3);
    align-items: baseline;
  }
}

/* ---- #142 / CP-15: avsnittsnavigation, desktoprad + kompakt mobilmeny ---- */

.kind-sektionsnav { margin-bottom: var(--kind-space-5); }
.kind-sektionsnav__meny { margin: 0; }
/* Desktop behåller den tidigare sticky-listan utan en extra kontroll. Details
 * är serverrenderad `open`; på smal skärm visar mediefrågan summaryn och JS
 * stänger den initialt. Utan JS är listan i stället synlig och nativt
 * hopfällbar, alltså fortfarande begriplig och användbar. */
.kind-sektionsnav__summary { display: none; }
.kind-sektionsnav__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: nowrap;
  gap: var(--kind-space-2);
  max-width: 100%;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-padding-inline: 6px;
  /* Fokus är 3px plus 2px offset. Sex pixlar runt innehållet håller hela
   * ringen inne i skrollporten också vid första och sista länken. */
  padding: 6px;
  --kind-cue-yta: var(--kind-color-bg);
  --kind-cue-linje: var(--kind-color-border);
  background:
    linear-gradient(var(--kind-cue-yta), var(--kind-cue-yta)) left center / 22px 100% no-repeat local,
    linear-gradient(var(--kind-cue-yta), var(--kind-cue-yta)) right center / 22px 100% no-repeat local,
    linear-gradient(to right, var(--kind-cue-linje) 0 2px, color-mix(in srgb, var(--kind-cue-linje) 32%, transparent) 2px, transparent 100%) left center / 20px 100% no-repeat scroll,
    linear-gradient(to left, var(--kind-cue-linje) 0 2px, color-mix(in srgb, var(--kind-cue-linje) 32%, transparent) 2px, transparent 100%) right center / 20px 100% no-repeat scroll,
    var(--kind-cue-yta);
}
.kind-sektionsnav__list > li { flex: 0 0 auto; }
.kind-sektionsnav__link {
  display: flex;
  align-items: center;
  /* Golv 44px träffyta (WCAG 2.2 AA 2.5.8 är 24px, men patientytan skevar äldre
   * och husregeln är 44px). `min-height` och inte `height`, så länken växer med
   * texten vid xxlarge i stället för att klippa den. */
  min-height: 44px;
  padding: var(--kind-space-2) var(--kind-space-3);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  background: var(--kind-color-surface);
  color: var(--kind-color-accent);
  text-decoration: none;
  font-size: var(--kind-font-small);
}
.kind-sektionsnav__link:hover { background: var(--kind-color-accent-bg); }

@media (max-width: 47.99rem) {
  .kind-sektionsnav__summary {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: var(--kind-space-2);
    min-height: 44px;
    padding: var(--kind-space-2) var(--kind-space-3);
    border: 1px solid var(--kind-color-border);
    border-radius: var(--kind-radius);
    background: var(--kind-color-surface);
    color: var(--kind-color-text);
    cursor: pointer;
    font-weight: 600;
    list-style: none;
  }
  .kind-sektionsnav__summary::-webkit-details-marker { display: none; }
  .kind-sektionsnav__summary::after {
    content: "\25B8";
    color: var(--kind-color-text-muted);
  }
  .kind-sektionsnav__meny[open] > .kind-sektionsnav__summary {
    border-radius: var(--kind-radius) var(--kind-radius) 0 0;
  }
  .kind-sektionsnav__meny[open] > .kind-sektionsnav__summary::after {
    content: "\25BE";
  }
  .kind-sektionsnav__summary:hover { background: var(--kind-color-surface-muted); }
  .kind-sektionsnav__summary:focus-visible {
    outline: var(--kind-focus-ring);
    outline-offset: 2px;
  }
  .kind-sektionsnav__list {
    flex-direction: column;
    gap: var(--kind-space-1);
    max-height: min(42vh, 18rem);
    overflow-x: hidden;
    overflow-y: auto;
    overscroll-behavior-x: auto;
    overscroll-behavior-y: contain;
    padding: 6px;
    border: 1px solid var(--kind-color-border);
    border-top: 0;
    border-radius: 0 0 var(--kind-radius) var(--kind-radius);
    background: var(--kind-color-surface);
  }
  .kind-sektionsnav__list > li { width: 100%; }
  .kind-sektionsnav__link { width: 100%; }
}

@media print {
  .kind-sektionsnav__summary { display: none; }
  .kind-sektionsnav__list {
    display: flex !important;
    max-height: none;
    overflow: visible;
    background: none;
  }
}
/* Ankarmål får inte hamna under den fasta sidhuvudsraden när man hoppat dit. */
.kind-profile-section__title,
.kind-nu,
.kind-pdl-cta { scroll-margin-top: var(--kind-space-5); }

/* ============ CP-15 (#100): sektion 1, Sammanfattning ============
 *
 * Patientens EGNA uppgifter låg som näst sista block på sidan. Uppmätt i
 * tyngsta rimliga datatillstånd (`e2e/cp15-patientsida-utfall.mjs`, baslinje
 * 2026-08-06): y = 14 471px vid 320 normal och 27 464px vid 320 xxlarge, alltså
 * 21,8 respektive 41,4 skärmars skrollning, 91 procent in i dokumentet, och
 * NOLL träffbara pixlar i första viewporten på samtliga 20 mätpunkter.
 *
 * Kortet bär de tre uppgifter en mottagning slår upp för att identifiera den
 * som ringer, resten en utfällning bort. Det är AVSIKTLIGT visuellt lugnare än
 * `.kind-nu`: Aktuellt behåller accentkanten och därmed blickens första anhalt,
 * så identiteten kan ligga före utan att ta över sidan.
 *
 * Layouten är MOBILFÖRST och flödande. En fast etikettkolumn kan inte krympa
 * under sin min-content vid xxlarge och trycker då ut sidan i horisontell
 * skroll vid 320px (kontraktets mått 6), så etikett och värde ligger på samma
 * rad med `flex-wrap` och bryter var för sig när de inte får plats.
 */
.kind-tillbaka { margin-bottom: var(--kind-space-3); }
.kind-tillbaka a {
  /* Träffytegolvet gäller även en ensam textlänk. `min-height` och inte
   * `height`, så raden växer med texten vid xxlarge i stället för att klippa. */
  display: inline-flex;
  align-items: center;
  min-height: 44px;
}
.kind-sammanfattning {
  /* MEDVETET UTAN kortram, bakgrund och innerpadding. Kortkromet kostade 48px
   * av en 483px stor innehållsbudget vid 320px och xxlarge textskala, alltså
   * tio procent av budgeten för en ram. Sektionen behöver ingen visuell
   * inramning för att läsas som en enhet: den sitter direkt under patientens
   * namn och ovanför `Aktuellt`, som HAR accentkant. En underkant räcker för
   * att markera var sammanfattningen slutar. */
  border-bottom: 1px solid var(--kind-color-border);
  /* Ingen padding-bottom, marginalen under kanten räcker. Uppmätt: varje px
   * innerpadding i den här sektionen ligger i mått 4:s NÄMNARE (punkten träffar
   * sektionen och klassas som identitet), medan marginalen utanför träffar
   * `main` och räknas som tom yta. 12px padding kostade alltså 12px av
   * innehållsbudgeten utan att visa något. */
  /* Marginalen är space-3 och inte space-4: marginalen mellan sektionen och
   * `Aktuellt` träffar `main` och räknas som TOM yta, alltså yta som varken
   * bär identitet eller aktuell information. Fyra px mindre luft flyttar upp
   * `Aktuellt` fyra px in i första viewporten. */
  margin-bottom: var(--kind-space-3);
}
.kind-sammanfattning__namn { margin-bottom: var(--kind-space-1); }
/* web#220 / ADR-072: "Ej tilldelad" vid patientens namn (kundens egen
   placering). Egen rad under namnet, dämpad ton och liten grad, så den läses
   som ett tillstånd och aldrig konkurrerar med namnet. Bäraren är ORDEN, ingen
   ny färg och ingen bricka (WCAG 2.2 1.4.1), och den renderas bara när mängden
   ansvariga är tom -- ett tilldelat läge har ingen markör här alls. */
.kind-sammanfattning__ej-tilldelad {
  display: block;
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
}
.kind-sammanfattning__list {
  margin: 0;
  display: flex;
  flex-wrap: wrap;
  /* Radavstånd först, kolumnavstånd sedan: raderna ska andas även när båda
   * uppgifterna får plats bredvid varandra. Radavståndet är space-1 eftersom
   * varje px mellan de två raderna ligger i mått 4:s nämnare. */
  gap: var(--kind-space-1) var(--kind-space-5);
}
.kind-sammanfattning__rad {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--kind-space-2);
  min-width: 0;
}
.kind-sammanfattning__etikett {
  /* Golv 13px: --kind-font-small är 0.875rem, alltså 14px vid rotens 16px och
   * mer vid varje uppskalning. Sätt aldrig ett px-värde här. */
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
}
.kind-sammanfattning__varde {
  margin: 0;
  min-width: 0;
  font-weight: 600;
  /* Ett personnummer eller ett långt mobilnummer ska brytas inne i sin cell,
   * inte bredda sidan (mått 6). */
  overflow-wrap: anywhere;
}
.kind-sammanfattning__mer { margin-top: var(--kind-space-2); }
.kind-sammanfattning__mer-summary {
  /* Träffytan är hela raden, inte bara triangeln. `min-height` och inte
   * `height`, så raden växer med texten vid xxlarge i stället för att klippa.
   *
   * FE-2b (2026-08-07), samma defektklass som välkomstrutan på biblioteket
   * (persona-villkor 3): `display: flex` på en summary SLÄCKER webbläsarens
   * nativa disclosure-trekant (markören renderas bara för list-item-lådor),
   * så raden lästes som en textrad utan expanderingsaffordans. Nu samma
   * mönster som .kind-org-welcome__summary: `display: list-item` med
   * inside-markör, `align-content: center` för vertikalcentrering
   * (Chromium 123+, Safari 17.4+, Firefox 125+). Markören ärver textfärgen
   * (accent här), rätt i mörkt läge och forced-colors. Vaktas av
   * tests/test_admin_patient_mer_summary_css.py (rödbevisad mot flex). */
  min-height: 44px;
  display: list-item;
  list-style-position: inside;
  align-content: center;
  cursor: pointer;
  color: var(--kind-color-accent);
  font-size: var(--kind-font-small);
}
/* Explicit fokusring i husets stil: summary ingår inte i kind.css globala
 * :focus-visible-lista (a, button, input, textarea, select), så utan egen
 * regel bar raden bara UA-defaultringen. Samma mönster som
 * .kind-org-welcome__summary:focus-visible. */
.kind-sammanfattning__mer-summary:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
  border-radius: var(--kind-radius);
}
.kind-sammanfattning__mer-innehall { margin-top: var(--kind-space-4); }
/* Underavsnitten inne i utfällningen ska inte bära kortets marginal en gång
 * till; sista sektionen får ingen bottenmarginal alls. */
.kind-sammanfattning__mer-innehall > .kind-profile-section:last-child { margin-bottom: 0; }

/* #117 (mått 4-regressionen vid mobil xxlarge): samma mall som patient-Mer,
 * det som inte bär information viker vid stor textskala. Här finns ingen
 * avatar att gömma, så det som viker är TOMRUM: marginaler och radluft, som
 * alla ligger i mått 4:s nämnare (punkten träffar sektionen och klassas som
 * identitet). Ingen uppgift göms, ingen text krymps, inget flyttas bakom
 * interaktion; vid normal textskala är blocket orört.
 *
 * UPPMÄTT 2026-08-07 (e2e/cp15-patientsida-utfall.mjs, före batchen):
 * identiteten tog 58,4 procent av första viewporten vid 320 xxlarge och
 * mått 4 låg på 0/15,6/26,8/38,1 mot krav 50 på de fyra mobilbredderna.
 * Blockets text ENSAM (namn 3 rader, personnummer- och mobilrad, utfällnings-
 * summaryn) mäter ~360px vid 320 xxlarge mot de ~194 som krävs för 50 procent,
 * så tomrumskompakteringen kan inte ENSAM stänga målet; se #117 för
 * beslutsläget. Varje regel nedan tar bara luft. */
html[data-kind-font-scale="xlarge"] .kind-sammanfattning__namn,
html[data-kind-font-scale="xxlarge"] .kind-sammanfattning__namn {
  margin-bottom: 0;
}
html[data-kind-font-scale="xlarge"] .kind-body--admin .kind-sammanfattning__namn > h1,
html[data-kind-font-scale="xxlarge"] .kind-body--admin .kind-sammanfattning__namn > h1 {
  margin-bottom: 0;
  /* G-6 (persona tillägg 2, 2026-08-07): namnets RUBRIKPÅSLAG kappas till
   * brödtextstorleken vid stor textskala. 1rem följer roten, så användarens
   * valda skala styr fortfarande (24px vid xxlarge, 20px vid xlarge, båda
   * större än normallägets 16px brödtext och lika med skallägets brödtext,
   * G-6-testets golv "namnets fontstorlek >= brödtextens"). Det som tas bort
   * är enbart h1-multiplikatorn (1.625rem = 39px vid xxlarge, tre rader för
   * ett långt dubbelnamn vid 320). Samma klass av åtgärd som den
   * persona-godkända h1-kappningen på patientchatten (kind_patient.css,
   * PROBLEM 2/RETEST-03). Namnet renderas ALLTID helt: ingen ellipsis, ingen
   * klämning (F-1-principen), vaktat i tests/test_cp15_patientsida.py.
   * Presentation, inte innehåll, alltså förenligt med G-2. */
  font-size: 1rem;
}
html[data-kind-font-scale="xlarge"] .kind-sammanfattning__list,
html[data-kind-font-scale="xxlarge"] .kind-sammanfattning__list {
  gap: 0 var(--kind-space-5);
}
html[data-kind-font-scale="xlarge"] .kind-sammanfattning__rad,
html[data-kind-font-scale="xxlarge"] .kind-sammanfattning__rad {
  /* dt- och dd-raden bryter till var sin rad vid smala bredder; space-2
   * radavstånd mellan dem är ren luft i nämnaren. Kolumnavståndet behålls. */
  gap: 2px var(--kind-space-2);
}
html[data-kind-font-scale="xlarge"] .kind-sammanfattning__mer,
html[data-kind-font-scale="xxlarge"] .kind-sammanfattning__mer {
  margin-top: 0;
}
html[data-kind-font-scale="xlarge"] .kind-sammanfattning,
html[data-kind-font-scale="xxlarge"] .kind-sammanfattning {
  /* Marginalen ligger UTANFÖR sektionen (tom yta, inte identitet), men varje
   * px flyttar Aktuellt uppåt in i första viewporten. */
  margin-bottom: var(--kind-space-1);
}
html[data-kind-font-scale="xlarge"] .kind-tillbaka,
html[data-kind-font-scale="xxlarge"] .kind-tillbaka {
  /* Navigationsraden är krom; dess marginal är dock viewportpixlar som kan
   * bära innehåll i stället. 44px-träffytan på länken är orörd. */
  margin-bottom: 0;
}

/* ============ CP-15 (#100): de sju avsnitten ============
 *
 * `.kind-patientsektion` är YTTERnivån för #100:s avsnitt 3 till 7. Avsnitt 4
 * och 5 har ett enda underavsnitt var och är därför sig själva ytternivån: en
 * extra rubriknivå med ett enda barn är en tom mellannivå för skärmläsaren.
 */
.kind-patientsektion { margin-bottom: var(--kind-space-6); }
.kind-patientsektion__title {
  font-family: var(--kind-font-serif);
  font-size: var(--kind-font-h2);
  margin: 0 0 var(--kind-space-3);
  /* Ankarmål får inte hamna under sidhuvudsraden när man hoppat dit. */
  scroll-margin-top: var(--kind-space-5);
}
/* Underavsnitten sitter indragna under sin avsnittsrubrik på bredare ytor, så
 * hierarkin syns visuellt och inte bara i rubriknivån. Inget indrag på mobil:
 * varje pixel i sidled är mått 6. */
@media (min-width: 48rem) {
  .kind-patientsektion > .kind-profile-section { padding-left: var(--kind-space-3); }
}

/* ---- CP-15 (#100): hopfällbara formulärsvar ---- */

.kind-formularsvar { margin-bottom: var(--kind-space-3); }
.kind-formularsvar__summary {
  /* Träffytan är hela sammanfattningsraden, inte bara triangeln. */
  min-height: 44px;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--kind-space-2);
  cursor: pointer;
  padding: var(--kind-space-2) 0;
}
.kind-formularsvar__titel { font-weight: 600; overflow-wrap: anywhere; }

/* ============ Chat clinician view (UX A-04, sidebar layout) ============ */

/* ISSUE #154: BASDEKLARATIONEN BAR EN HALV CP-14-FIX fram till 2026-08-16.
 *
 * Mediefrågan nedan har haft `minmax(0, 1fr)` sedan CP-14 (#99), medan den här
 * basdeklarationen stod kvar på en bar `1fr`. Fixen gällde alltså i det ena
 * läget och inte i det andra, vilket är svårare att upptäcka än en helt utebliven
 * fix: ytan ser åtgärdad ut i den bredd man råkar testa, och den bredd man råkar
 * testa är mobilbredden, eftersom det var där defekten rapporterades.
 *
 * TVÅKOLUMNSLÄGET ÄR INTE DET OFARLIGA LÄGET. Systerytan `.kind-tillg__columns`
 * mättes i #153 till 421px överskott vid 901px och 42px vid 1280px, alltså
 * VÄRRE än det rapporterade mobilfallet, på exakt den axel man antar är säker
 * för att det finns gott om plats. Att spåret är brett skyddar inte, eftersom
 * golvet sätts av min-content och inte av viewporten.
 *
 * ÄRLIGT OM VAD MÄTNINGEN VISAR. På `/admin/chatt` i tyngsta uppmätta tillstånd
 * (901 / 1024 / 1280 px, normal och xxlarge, 6 mätpunkter) är dokumentets
 * sidledsöverskott 0px BÅDE före och efter den här ändringen, och inget item i
 * layouten når bärarstatus i `e2e/a11y816-minsvep.mjs`. Golvet är alltså LATENT
 * på dagens innehåll, inte aktivt. Ändringen görs ändå, av två skäl som issuen
 * själv anger: en bar `1fr` är sökmönstret nästa svep letar efter, så den
 * halva fixen gör ytan osynlig i just det svepet; och `minmax(0, 1fr)` sänker
 * bara ett golv, den kan därför inte ändra rendret så länge golvet inte är
 * aktivt, vilket de 6 oförändrade mätpunkterna bekräftar.
 *
 * `300px`-spåret rörs inte. Det är ett fast spår, inte ett `1fr`, och har
 * ingen automatisk minimistorlek att nolla. */
.kind-chatt-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 300px;
  gap: var(--kind-space-5);
}
@media (max-width: 900px) {
  /* CP-14 (#99): `minmax(0, 1fr)` och inte `1fr`.
   *
   * En `1fr`-kolumn har `auto` som MINIMUM, alltså sitt innehålls min-content.
   * Vid xxlarge växte innehållet förbi viewporten och drog med sig SPÅRET, så
   * `.kind-chat--zoned` och `.kind-chatt-aside` renderades 487px breda i en
   * 320px viewport: 191px horisontell skroll (uppmätt, /admin/chatt vid 320x664
   * xxlarge, 121px vid 390). Det bröt inte bara mått 6 utan även MÅTT 5: hela
   * skrivfältet ska rymmas i viewporten, och ett fält vars högerkant ligger
   * utanför gör det inte, hur rätt det än ser ut vertikalt. Ett endimensionellt
   * höjdtak kan vara grönt medan bredden är trasig.
   *
   * `minmax(0, 1fr)` låter spåret krympa under min-content, vilket är exakt vad
   * grannlayouten `.kind-arbetsvy` redan gör vid samma brytpunkt. Överskottet
   * hamnar då i det inre elementets EGEN skrollport i stället för att skjuta ut
   * sidan. */
  .kind-chatt-layout { grid-template-columns: minmax(0, 1fr); }
}
.kind-chatt-aside {
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-4);
  align-self: start;
  position: sticky;
  top: var(--kind-krom-topp);
}

/* ============ Editor with live preview (UX A-07, artikel_form) ============ */

.kind-editor {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--kind-space-5);
}
@media (max-width: 900px) {
  .kind-editor { grid-template-columns: 1fr; }
}
.kind-editor__pane {
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-4);
}
.kind-editor__preview-body {
  min-height: 12rem;
  padding-top: var(--kind-space-3);
}
.kind-editor__preview-body h1,
.kind-editor__preview-body h2,
.kind-editor__preview-body h3 { font-family: var(--kind-font-serif); margin-top: var(--kind-space-4); }
.kind-editor__preview-body p { margin-bottom: var(--kind-space-3); }
.kind-editor__preview-body ul,
.kind-editor__preview-body ol { padding-left: var(--kind-space-5); list-style: revert; margin-bottom: var(--kind-space-3); }
.kind-editor__textarea { min-height: 24rem; font-family: var(--kind-font-mono); font-size: 0.95rem; }

/* ============ Step editor (vardresa_form) ============ */

.kind-step-editor { display: flex; flex-direction: column; gap: var(--kind-space-3); }
/* agents#235 (konsultbeslut 2026-08-18): kolumn tre bar knapparna Upp / Ned /
   Ta bort, som aldrig fungerade (noll registrerade rutter i url_map) och nu är
   borttagna. Griden gick därför från `2.5rem 1fr auto` till `2.5rem 1fr`. En
   kvarlämnad tredje kolumn hade inte varit osynlig: `column-gap` gäller mellan
   ALLA definierade spår, även ett tomt, så raden hade burit en död
   `--kind-space-3` i högerkant. */
.kind-step-editor__row {
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-4);
  display: grid;
  grid-template-columns: 2.5rem 1fr;
  gap: var(--kind-space-3);
  align-items: start;
}
.kind-step-editor__ord {
  font-family: var(--kind-font-serif);
  font-size: 1.25rem;
  font-weight: 700;
  color: var(--kind-color-accent);
  padding-top: var(--kind-space-2);
}
/* agents#235: `.kind-step-editor__controls` och dess smalvyregler är BORTTAGNA i
   samma ändring som markeringen. De ställde in tre knappformulär som inte längre
   ritas, och den gamla media-frågan under 600px kollapsade radens grid till
   `2.5rem 1fr`, vilket nu är basvärdet. Kvarlämnad död CSS är en fälla: nästa
   person läser den som ett stöd som finns. */

/* ---- Våg 3 steg 4: stegets ordningsknappar (konsultbeslut B3) ----
   Tre fristående `<form>` sida vid sida. `.kind-actions-row` är en flexrad, men
   dess barn är här FORMULÄR och inte knappar, så knappmåtten måste gå igenom
   formuläret; utan `display: contents` blir varje knapp inramad av ett block
   som bryter radens gap. Formulären bär inget eget innehåll utöver knappen och
   ett dolt csrf-fält, alltså är `display: contents` säkert här (elementet har
   ingen egen semantik som går förlorad: ett `<form>` utan tillgängligt namn
   exponeras inte som landmärke). */
.kind-stegordning { flex-wrap: wrap; gap: var(--kind-space-2); margin-top: var(--kind-space-3); container: stegordning / inline-size; }
.kind-stegordning > form { display: contents; }
.kind-stegordning .kind-btn { min-width: 0; overflow-wrap: anywhere; }

/* ---- #279 (konsultbeslut 2026-08-20, variant C): två tillstånd, två uttryck ----

   Produkten namnger den skillnad huset redan gjorde på fyra ytor utan att ha
   döpt den. Reglerna nedan är de två uttrycken.

   VÄNTAR, `[data-skal]`: något på ytan kan göra kontrollen levande, alltså står
   kontrollen kvar och skälet säger vad man väntar på. Skälet ärver
   `.kind-field__help` plus en särskiljande kantlinje, så att ett SKÄL inte
   längre ser ut exakt som de tre generella hjälptexterna i samma fieldset.
   `flex: 1 1 100%` lägger det på egen rad under sin knapp i stället för bredvid,
   så knappraden inte spränger smala vyer. */
.kind-actions-row > [data-skal] { flex: 1 1 100%; margin-bottom: 0; }
.kind-skal {
  border-inline-start: 3px solid var(--kind-color-border);
  padding-inline-start: var(--kind-space-2);
}

/* GÅR INTE HÄR, `.kind-kantmarkor`: ingenting på ytan gör kontrollen levande,
   alltså finns ingen död kontroll och PLATSEN bär skälet i stället.

   DEN ÄR AVSIKTLIGT INTE EN `.kind-btn`, och det är regelns hela poäng. Ett
   `<span class="kind-btn">` ser ut som en knapp och är exakt den lögnaktiga
   affordans mallens egen kommentar varnar för, vilket är precis vad
   loggutdragets sidnavigering råkat ut för. Streckad kant plus dämpad text plus
   ingen hovring och ingen pekarmarkör läser som en PLATS.

   `min-height` håller radens rytm så att de kvarvarande knapparna inte hoppar i
   sidled mellan rader. Mätt till 46,4 px i beslutets mock; siffran är MOCKMÄTT
   och ska ommätas på deployen (regel 22/26), den är inte verifierad här. */
.kind-kantmarkor {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: var(--kind-space-2) var(--kind-space-3);
  border: 1px dashed var(--kind-color-border);
  border-radius: var(--kind-radius);
  background: transparent;
  color: var(--kind-color-text-muted);
  font-size: var(--kind-font-small);
  line-height: 1.25;
}
.kind-stegordning .kind-kantmarkor { min-width: 0; overflow-wrap: anywhere; }

/* #278 variant C: "Klar, tillbaka till vårdresemallar", kontrollen som lämnar
   sidan. Den står ensam längst ned och behöver luft mot lägg-till-formuläret
   ovanför, annars läser den som en del av det formuläret. */
.kind-vardresa-klar { margin-top: var(--kind-space-6); }

/* #278 variant C: ångraknappen under kvittot. Den ligger i en egen stack strax
   under flash-stacken, INTE inuti den: flash-stacken är en `aria-live`-region,
   och en fokuserbar kontroll inne i en live-region riskerar att annonseras om
   vid varje senare uppdatering. Marginalen drar ihop de två så de läser som ett
   och samma kvitto. */
.kind-angra { margin-top: calc(var(--kind-space-2) * -1); }

/* #313: använd radens tillgängliga bredd, inte viewportens. 25rem rymmer
   hela kontrollraden vid normal text och följer den större textskalan.
   Den lätta markören saknar knappens inramning men behåller en kantlinje,
   som husets `.kind-skal`, så den inte blir ännu en metadatarad.
   `align-self` hindrar flexradens sträckning från att förstora markören
   till samma höjd som de levande knapparna. */
@container stegordning (max-width: 25rem) {
  .kind-kantmarkor {
    align-self: center;
    min-height: 0;
    padding: 0;
    padding-inline-start: var(--kind-space-2);
    border: 0;
    border-inline-start: 3px solid var(--kind-color-border);
    border-radius: 0;
  }
}

/* ---- Våg 3 steg 4: innehållsmenyn (konsultbeslut B1, variant B) ----
   Ingen befintlig klass gör en generell utfällbar meny. Navets
   `.kind-vardnav__mer` gör det men är navspecifik, och att låna den hade bundit
   stegredigeraren till navets framtida ändringar. */
.kind-innehallsmeny {
  border: 1px dashed var(--kind-color-border);
  border-radius: var(--kind-radius);
}
.kind-innehallsmeny__knapp {
  display: flex;
  align-items: center;
  gap: var(--kind-space-2);
  min-height: 44px;
  padding: var(--kind-space-3) var(--kind-space-4);
  font-weight: 600;
  cursor: pointer;
  list-style: none;
}
.kind-innehallsmeny__knapp::-webkit-details-marker { display: none; }
.kind-innehallsmeny__knapp::before { content: "+"; font-size: 1.25rem; line-height: 1; }
.kind-innehallsmeny[open] .kind-innehallsmeny__knapp::before { content: "\2212"; }
.kind-innehallsmeny__knapp:hover { background: var(--kind-color-surface-muted); }
.kind-innehallsmeny__ark {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--kind-space-3);
  padding: 0 var(--kind-space-4) var(--kind-space-4);
  border-top: 1px solid var(--kind-color-border-soft);
}
/* Menyknapparna bär långa svenska etiketter och `.kind-btn` har min-width 44px
   plus generös padding, så de spränger 320px vid xxlarge utan de här raderna. */
.kind-innehallsmeny__ark .kind-btn { max-width: 100%; }
.kind-innehallsmeny__knapp,
.kind-innehallsmeny__ark .kind-btn { min-width: 0; overflow-wrap: anywhere; }

.kind-innehallsblock { margin-bottom: var(--kind-space-3); }

/* `hidden`-GARD, och skriv ALDRIG "specificitet" om mekanismen: företrädet
   avgörs av URSPRUNG. UA-arkets `[hidden] { display: none }` saknar
   `!important`, och en normal FÖRFATTARdeklaration slår en normal
   UA-deklaration i kaskadens sorteringsordning oavsett specificitet. Sätter
   någon senare `display` på de här klasserna slutar `hidden` att verka, och
   den defekten är tyst: fältet syns, JS tror det är dolt, och ett borttaget
   block postar ändå. Garden är per klass och UTAN `!important`; den generella
   `[hidden] { display: none !important }` som Bootstrap Reboot skickar bryter
   `hidden="until-found"` och är en öppen defekt där (twbs/bootstrap#40688).
   CLAUDE.md regel 27 korollarium 2. */
.kind-innehallsblock[hidden],
.kind-innehallsmeny[hidden] { display: none; }

/* ---- Våg 3 steg 4: offsetgruppen (konsultbeslut B4, 2026-08-19) ----
   Magnituden och riktningsväljaren står bredvid varandra, eftersom de är EN
   storhet uttryckt i två kontroller och en radbrytning mellan dem läser som två
   oberoende fält. `minmax(0, ...)` och inte `auto`: ett grid-item har
   `min-width: auto` som default och kan därför inte krympa under sitt
   min-content, vilket är precis den mekanism som gav 140px överflöd vid 320px i
   K19-mockens mätning. Under 32rem staplas de, för då är sidan-vid-sidan
   dyrare än radbrytningen. */
/* web#1068: TRE kolumner, antal + enhet + riktning. Var tva innan
   enhetsvaljaren fanns; med tva kolumner och tre falt hade riktningen hamnat
   pa en egen rad under antalet, alltsa visuellt lost fran den storhet den
   kvalificerar. Smalspalten kollapsar till en kolumn som forut. */
.kind-offsetgrupp {
  display: grid;
  grid-template-columns: minmax(0, 7rem) minmax(0, 9rem) minmax(0, 1fr);
  gap: var(--kind-space-3);
  align-items: start;
}
@media (max-width: 32rem) {
  .kind-offsetgrupp { grid-template-columns: minmax(0, 1fr); }
}

/* ============ Print stylesheet (loggutdrag handout) ============ */

@media print {
  .kind-header, .kind-footer, .kind-nav, .kind-skip-link,
  .kind-actions-row, .kind-filter-row, .kind-pdl-cta,
  .kind-loggutdrag__no-print { display: none !important; }
  body.kind-body--admin { background: #fff; color: #000; font-size: 10pt; }
  .kind-table { font-size: 9pt; }
  .kind-table thead th { background: #f0f0f0 !important; color: #000 !important; position: static; }
  .kind-table tbody tr:hover { background: transparent; }
  .kind-table-wrap { border: none; overflow: visible; }
  a { color: #000; text-decoration: underline; }
}

/* Q-13:s stubbhjalpare (`.kind-stub-row` plus `.kind-stub-row__help`) ar
 * BORTTAGEN 2026-08-21 tillsammans med sin enda konsument, den avstangda
 * kryssrutan "Aterkommande tider" i `templates/admin/bokning_form.html`
 * (konsultbeslut i issue #283). Reglerna togs bort i samma andring per regel 27
 * korollarium 2: en kvarlamnad klass utan barare ar en inbjudan att bygga en ny
 * stubb. Vakt: `tests/test_283_bokning_stubrad_borttagen.py`.
 */

/* ============ Wave 3: login surface (W2-13 carry-over + AT-58) ============
 * Mirrors the patient login-box but lands in the admin sheet because the
 * admin templates (login.html + auth/invite_set_password.html) load only
 * kind_admin.css. Removing the duplication is a future cleanup once we
 * extract a shared kind_chrome_overlay.css (out of scope for Wave 3).
 */
.kind-login-page {
  min-height: calc(100vh - 12rem);
  display: flex;
  justify-content: center;
  align-items: center;
  padding: var(--kind-space-5) var(--kind-space-4);
}
.kind-login-box {
  width: 100%;
  max-width: 26rem;
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-6);
  box-shadow: var(--kind-shadow-md);
}
.kind-login-box__title { text-align: center; font-family: var(--kind-font-serif); }
.kind-login-box__sub { text-align: center; color: var(--kind-color-text-muted); margin-bottom: var(--kind-space-5); }

/* WS-C / ADR-025 auth surfaces (org-picker + workspace switch + already-have-account).
 * These reuse the .kind-login-page / .kind-login-box card so the whole multi-org
 * auth flow matches the rest of the vardgivarportal auth pages. The org-picker
 * card is WIDER than the password card so the full clinic-name rows breathe. */
.kind-login-box--wide { max-width: 34rem; }

.kind-workspace-card .kind-form { gap: var(--kind-space-5); }
/* The lede sits left-aligned inside the wide card: it is instructional body copy,
   not a centered tagline, so left-align reads better at this width. */
.kind-workspace-card__sub {
  text-align: left;
  max-width: 48ch;
  margin-left: auto;
  margin-right: auto;
}
.kind-workspace-card__body {
  color: var(--kind-color-text-muted);
  margin: 0 0 var(--kind-space-5);
}
.kind-workspace-card__actions {
  margin-top: var(--kind-space-2);
}

/* The "already have an account" page is short + reassuring, so it stays centered. */
.kind-workspace-card--centered { text-align: center; }
.kind-workspace-card--centered .kind-workspace-card__sub { text-align: center; }
.kind-workspace-card--centered .kind-workspace-card__body {
  max-width: 52ch;
  margin-left: auto;
  margin-right: auto;
}
.kind-workspace-card--centered .kind-form__actions { justify-content: center; }

/* #12 (2.2): branding settings form, accent-colour input + live swatch. The
   swatch is decorative (aria-hidden); the hex value + the contrast read-out
   carry the meaning (not colour-alone). */
.kind-branding-color-row {
  display: flex;
  align-items: center;
  gap: var(--kind-space-3);
}
.kind-branding-color-input {
  max-width: 12ch;
  font-family: var(--kind-font-mono, monospace);
}
.kind-branding-color-swatch {
  flex: 0 0 auto;
  width: 44px;
  height: 44px;
  border-radius: var(--kind-radius);
  border: 1px solid var(--kind-color-border-soft);
}

/* #12 (2.2): logo FILE upload + current-logo preview. The upload form is a
   distinct fieldset from the URL-input path so the "fil ELLER URL" choice is
   clear. The preview is a real <img> with alt text; when no logo is set we show
   an honest "no logo" note (never a fake placeholder image). */
.kind-branding-logo-preview {
  display: flex;
  align-items: center;
  gap: var(--kind-space-4);
  margin-bottom: var(--kind-space-3);
}
.kind-branding-logo-preview__img {
  max-width: 220px;
  max-height: 80px;
  width: auto;
  height: auto;
  object-fit: contain;
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
  background: var(--kind-color-surface);
  padding: var(--kind-space-2);
}
.kind-branding-logo-preview__none {
  color: var(--kind-color-text-muted);   /* 5.87:1, past AA */
  font-style: italic;
}
.kind-branding-upload {
  margin: 0 0 var(--kind-space-5);
  padding: var(--kind-space-4);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
  background: var(--kind-color-surface);
}
.kind-branding-upload__or {
  margin: var(--kind-space-4) 0 var(--kind-space-2);
  font-weight: 600;
  color: var(--kind-color-text-muted);
  text-transform: uppercase;
  letter-spacing: 0.04em;
  font-size: var(--kind-font-small);
}
/* The native file input keeps a 44px target via padding on the row. */
.kind-branding-file-input {
  min-height: 44px;
  padding: var(--kind-space-2) 0;
}

/* The in-session switch page is NOT a centered modal-card (the actor has the full
   portal chrome): it is a contained panel under the page heading. */
.kind-workspace-switch-page__lede {
  max-width: 60ch;
  color: var(--kind-color-text-muted);
  margin-bottom: var(--kind-space-5);
}
.kind-workspace-card--panel {
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-5);
  box-shadow: var(--kind-shadow-sm);
}

/* ============ Wave 3: invite flow (AT-58) ============ */

/* Radio group for the invite role picker. Each radio sits on its own row so
   the longer help text stays readable. Visual treatment is a soft card so the
   chosen state is obvious without resorting to colour alone (WCAG 1.4.1). */
.kind-radio-group { display: flex; flex-direction: column; gap: var(--kind-space-2); }
/* CP-02-resten (#87): en KONTROLL-kant, aldrig hairlinen. Hela etiketten är
   träffytan för sin radioknapp, så raden ÄR kontrollen och kind.css §1
   WATCH-ITEM 1 gäller den rakt av: fältkanter använder --kind-color-border. */
.kind-radio {
  display: grid;
  grid-template-columns: 1.5rem 1fr;
  gap: var(--kind-space-3);
  align-items: start;
  padding: var(--kind-space-3) var(--kind-space-4);
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  cursor: pointer;
  min-height: 44px;
}
.kind-radio:hover { background: var(--kind-color-surface-muted); }
.kind-radio input[type="radio"] {
  width: 1.25rem;
  height: 1.25rem;
  margin: 0;
  accent-color: var(--kind-color-accent);
}
.kind-radio:has(input:checked) {
  border-color: var(--kind-color-accent);
  background: var(--kind-color-accent-bg);
}
.kind-radio__label {
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-1);
  font-weight: 600;
  color: var(--kind-color-text);
}

/* WS-C / ADR-025: the membership-row meta line (role, and an "Aktiv nu" badge on
   the switch page). A muted, lighter line under the clinic name so the clinic name
   stays the dominant element of each tappable choice. */
.kind-radio__meta {
  display: flex;
  align-items: center;
  gap: var(--kind-space-2);
  flex-wrap: wrap;
  font-weight: 400;
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
}

/* WS-C / ADR-025: legend for the membership fieldset on the org-picker + switch
   pages. The fieldset itself is chromeless (.kind-fieldset above); the legend
   needs to read as a small section label, not inherit the giant default. */
.kind-fieldset__legend {
  padding: 0;
  margin-bottom: var(--kind-space-3);
  font-weight: 700;
  font-size: var(--kind-font-base);
  color: var(--kind-color-text);
}

/* WS-C / ADR-025: membership choice rows on the org-picker + switch pages. These
   are larger, fully-tappable choices than the compact invite role picker, so the
   clinic name reads bigger and the row has more breathing room. Stacks the radio
   above the (multi-line) label on the narrowest screens. The selected + currently
   active states are conveyed by BOTH the accent border/wash (from .kind-radio's
   :has(input:checked)) AND the "Aktiv nu" badge, never colour alone (WCAG 1.4.1). */
.kind-radio--workspace {
  grid-template-columns: 1.5rem 1fr;
  padding: var(--kind-space-4);
  min-height: 56px;
}
.kind-radio--workspace .kind-radio__label {
  gap: var(--kind-space-2);
  font-size: var(--kind-font-base);
}
/* The currently-active mottagning on the switch page: a calm accent wash + a
   thicker left edge so it stands out from the other choices before any selection.
   The "Aktiv nu" success badge carries the meaning for non-colour users. */
.kind-radio--active {
  border-color: var(--kind-color-accent);
  border-left-width: 4px;
  background: var(--kind-color-accent-bg);
}

/* Copy-to-clipboard box (invite success surface). The input stretches, the
   button hugs its label so it remains a 44x44 target. */
.kind-copybox {
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-2);
  padding: var(--kind-space-4);
  background: var(--kind-color-surface-muted);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
  margin: var(--kind-space-4) 0;
}
.kind-copybox__row {
  display: flex;
  gap: var(--kind-space-2);
  flex-wrap: wrap;
}
.kind-copybox__input {
  flex: 1;
  min-width: 18rem;
  font-family: var(--kind-font-mono);
  font-size: 0.9375rem;
}
/* The copy button sits inside the muted .kind-copybox panel. A transparent
   kind-btn--secondary would inherit that muted background and drop the accent
   text to 4.46:1 (below WCAG 2.2 AA 1.4.3). Force a solid white (surface)
   background so the accent text keeps its 5.34:1 ratio on every copybox
   (this 2FA page + the invite-success copybox that reuses the component). */
.kind-copybox__btn {
  white-space: nowrap;
  background: var(--kind-color-surface);
}
.kind-copybox__btn:hover {
  background: var(--kind-color-accent-bg);
}
.kind-copybox__btn[aria-pressed="true"] {
  background: var(--kind-color-success);
  color: var(--kind-color-text-on-accent);
  border-color: var(--kind-color-success);
}

/* ============ Anteckningar (internal case-notes, G3 ND-5) ============ */

/* Colleague-only working notes. Rendered both as a full section on the patient
   detail page and inside the chat-view aside, so the styles lean on the shared
   .kind-profile-section spacing and only add the privacy banner + the note-list
   treatment. The note body is Art. 9 health data, NEVER patient-visible. */
.kind-anteckningar__privacy {
  display: flex;
  align-items: center;
  gap: var(--kind-space-2);
  margin: 0 0 var(--kind-space-4);
  padding: var(--kind-space-3) var(--kind-space-4);
  background: var(--kind-color-info-bg);
  border: 1px solid var(--kind-color-info);
  border-radius: var(--kind-radius);
  color: var(--kind-color-info);
  font-weight: 600;
  font-size: 0.9375rem;
}
.kind-anteckningar__privacy-icon { flex: 0 0 auto; line-height: 0; }

/* Calm "ej journalhandling" clarification (ADR-057 Option B). Honest status,
   not alarmist: muted body text with a soft left rule (structural emphasis, not
   colour-only) so a clinician never mistakes the working note for the patient
   journal. The meaning is carried by the text, the border is decoration. */
.kind-anteckningar__journal-note {
  margin: 0 0 var(--kind-space-4);
  padding: 0 0 0 var(--kind-space-3);
  border-left: 3px solid var(--kind-color-border-soft);
  color: var(--kind-color-text-muted);
  font-size: 0.875rem;
  line-height: 1.5;
}

.kind-anteckningar__list {
  list-style: none;
  margin: 0 0 var(--kind-space-4);
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-3);
}
.kind-anteckning {
  background: var(--kind-color-surface-muted);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-3) var(--kind-space-4);
}
.kind-anteckning__body {
  margin: 0 0 var(--kind-space-2);
  /* Preserve the author's line breaks in a plain free-text note (Jinja
     auto-escapes the body, so this is display-only, never raw HTML). */
  white-space: pre-wrap;
  overflow-wrap: anywhere;
}
.kind-anteckning__meta {
  margin: 0;
  font-size: 0.875rem;
  color: var(--kind-color-text-muted);
}

/* ---- web#811: sidan Anteckningar + detaljvyn ---------------------------
 *
 * De tva nya ytorna (`/admin/patient/<pid>/anteckningar` och
 * `.../anteckning/<aid>`) ateranvander klasserna ovan for sjalva posterna, sa
 * en anteckning ser likadan ut pa alla fyra ytor. Det som behover egna regler
 * ar bara sidhuvudets ikon, patientraden under rubriken, "Ny
 * anteckning"-utfallningen och borttagningsblocket.
 *
 * `<summary>` med `.kind-btn` foljer husets BEFINTLIGA utfallningsmonster
 * `.kind-profile-section__more > summary` RAD FOR RAD, och det ar avsiktligt:
 * `list-style: none` + `display: inline-flex` behovs for knappformen, och FE-2b
 * (2026-08-07) slog fast att en summary som tappar sin nativa markor maste
 * ersatta den -- darav `::after`-triangeln som vander vid `[open]` -- och att
 * kontrollen ska bara systemets fokusring och inte webblasarens. Tappytan ar
 * kvar: `.kind-btn`s egna hojdgolv galler. */
.kind-anteckningar__rubrikikon {
  display: inline-flex;
  vertical-align: text-bottom;
  line-height: 0;
  margin-inline-end: var(--kind-space-2);
}
.kind-anteckningar__patient {
  margin: 0 0 var(--kind-space-4);
  font-size: 1rem;
  font-weight: 600;
}
.kind-anteckningar__ny {
  margin: 0 0 var(--kind-space-4);
}
.kind-anteckningar__ny > summary {
  display: inline-flex;
  align-items: center;
  list-style: none;
  cursor: pointer;
}
.kind-anteckningar__ny > summary::-webkit-details-marker {
  display: none;
}
.kind-anteckningar__ny > summary::after {
  content: " \25BC";
  font-size: 0.75em;
  margin-left: var(--kind-space-2);
}
.kind-anteckningar__ny[open] > summary::after {
  content: " \25B2";
}
.kind-anteckningar__ny > summary:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}
.kind-anteckning__lank {
  margin: var(--kind-space-2) 0 0;
  font-size: 0.875rem;
}
.kind-anteckning--detalj {
  margin: 0 0 var(--kind-space-4);
}
/* Borttagningsblocket ar INTE en varningsruta: borttagningen ar reversibel i
 * den meningen att raden bevaras (3 kap. 14 § PDL), och texten ska beskriva det
 * sakligt i stallet for att larma. Darfor samma dampade ton som
 * "ej journalhandling"-klargorandet, och knappen -- inte rutan -- bar
 * konsekvensfargen. */
.kind-anteckning__borttagning-text {
  margin: 0 0 var(--kind-space-3);
  color: var(--kind-color-text-muted);
  font-size: 0.875rem;
  line-height: 1.5;
}

/* ---- web#885: anteckningsmallen med de sju rubrikerna (vaxeln) ---------
 *
 * "Byt till text" / "Byt till mall" UTAN javascript och UTAN en request.
 * Mekaniken ar tva visuellt gomda radioknappar och `:checked ~`, exakt samma
 * teknik som `.kind-pexels__radio` (#223) langre ned i den har filen.
 *
 * VARFOR INTE EN LANK SOM LADDAR OM SIDAN: `domain-compliance` villkor N2 pa
 * web#811 lagger en `read.anteckning.view`-rad per visning av en anteckningsyta.
 * En vaxel som gick via servern hade alltsa skrivit en extra rad i patientens
 * loggutdrag varje gang klinikaren bytte format -- en pastadd utlamning som inte
 * skedde. Vaxeln ar darfor helt klientsidig och helt stillastaende.
 *
 * GRADVIS FORSAMRING: utan CSS visas BADA grenarna (mallgrenen forst) och bada
 * ar fullt anvandbara formular. Radioknapparna ar visuellt gomda men KVAR i
 * tabbordningen och exponerade for hjalpmedel (`aria-label` pa varje knapp,
 * `<legend>` i `.kind-visually-hidden`), samma monster som `.kind-pexels__radio`.
 *
 * Etiketten for det format man REDAN star i doljs, sa att knappen alltid sager
 * vad trycket gor -- "Byt till text" nar mallen visas, "Byt till mall" nar
 * fritexten visas. Det ar gamla KIND:s beteende (mod/2983.js). */
.kind-anteckningsmall {
  border: 0;
  margin: 0;
  padding: 0;
  min-inline-size: 0;
}
.kind-anteckningsmall__radio {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  border: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
}
.kind-anteckningsmall__knappar {
  margin: 0 0 var(--kind-space-3);
}
.kind-anteckningsmall__knapp {
  display: none;
  cursor: pointer;
  font-size: 0.875rem;
  text-decoration: underline;
  color: var(--kind-color-accent);
}
.kind-anteckningsmall__gren {
  display: none;
}
.kind-anteckningsmall__radio--mall:checked ~ .kind-anteckningsmall__knappar
  .kind-anteckningsmall__knapp--till-text,
.kind-anteckningsmall__radio--text:checked ~ .kind-anteckningsmall__knappar
  .kind-anteckningsmall__knapp--till-mall {
  display: inline-block;
}
.kind-anteckningsmall__radio--mall:checked ~ .kind-anteckningsmall__gren--mall,
.kind-anteckningsmall__radio--text:checked ~ .kind-anteckningsmall__gren--text {
  display: block;
}
/* Fokusringen maste synas pa ETIKETTEN, eftersom radioknappen sjalv ar visuellt
 * gomd: utan den har regeln ar vaxeln osynlig for tangentbordet (WCAG 2.4.7). */
.kind-anteckningsmall__radio:focus-visible ~ .kind-anteckningsmall__knappar
  .kind-anteckningsmall__knapp {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}

/* ============ Meddelandemallar (message templates, G5) ============ */

.kind-mall-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-4);
}
.kind-mall {
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-4);
}
.kind-mall__head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--kind-space-3);
}
.kind-mall__titel { margin: 0; }
/* web#1676: malltypen i listan, och typvalet på skapa-formuläret. Väljer
   admin Textmall döljs fältredigeraren (servern avvisar ändå en textmall med
   fält; utan :has-stöd syns redigeraren som förut). */
.kind-mall__typ { color: var(--kind-color-text-muted); }
.kind-mall__typ-val { display: flex; gap: var(--kind-space-2); align-items: center; }
/* Efter ett avvisat sparande (textmall med fält) visas fälten ändå, så att
   admin kan ta bort dem: formuläret bär då data-kind-visa-falt. */
.kind-form:not([data-kind-visa-falt]):has([data-kind-malltyp="text"]:checked) .kind-mall__falt-redigerare {
  display: none;
}
.kind-mall__body {
  margin: var(--kind-space-2) 0;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
  color: var(--kind-color-text-muted);
}
.kind-mall__meta {
  margin: 0 0 var(--kind-space-3);
  font-size: 0.875rem;
  color: var(--kind-color-text-muted);
}
.kind-mall__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-start;
  gap: var(--kind-space-3);
}
.kind-mall__edit { flex: 1 1 auto; min-width: 0; }
.kind-mall__edit-summary { display: inline-flex; }
.kind-mall__edit-form { margin-top: var(--kind-space-3); }
.kind-mall__archive-form { margin: 0; flex: 0 0 auto; }
/* web#1326: kallelsemallens fält. Översikten i listan och fältredigeraren
   (native <details>, fungerar utan JavaScript). */
.kind-mall__falt { margin: var(--kind-space-2) 0 var(--kind-space-3); }
.kind-mall__falt-lista { margin: var(--kind-space-2) 0; padding-left: var(--kind-space-4); }
.kind-mall__falt-redigerare { margin: var(--kind-space-3) 0; }
.kind-mall__falt-summary { display: inline-flex; }
.kind-mall__falt-rad {
  margin: var(--kind-space-3) 0 0;
  padding: var(--kind-space-3);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
  min-width: 0;
}
.kind-mall__falt-val {
  display: flex;
  align-items: center;
  gap: var(--kind-space-2);
  cursor: pointer;
}
.kind-mall__falt-val input[type="checkbox"] {
  width: 1.15rem;
  height: 1.15rem;
  flex: 0 0 auto;
}

/* G4 "Schemalägg meddelande". A native <details> disclosure so the schedule
   fields are collapsible WITHOUT JavaScript (a clinician replying normally is
   not crowded; the section opens on click). The summary is a 44px-tall click
   target with a visible focus ring; the marker is the native triangle. */
.kind-schemalagg {
  margin: var(--kind-space-4) 0 0;
  border-top: 1px solid var(--kind-color-border);
  padding-top: var(--kind-space-4);
}
.kind-schemalagg__summary {
  display: flex;
  align-items: center;
  gap: var(--kind-space-2);
  min-height: 44px;
  padding: var(--kind-space-2) var(--kind-space-2);
  cursor: pointer;
  font-weight: 600;
  color: var(--kind-color-text);
  border-radius: var(--kind-radius);
}
.kind-schemalagg__summary:hover { background: var(--kind-color-surface-muted); }
.kind-schemalagg__summary:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}
.kind-schemalagg__summary-icon { color: var(--kind-color-accent); display: inline-flex; }
.kind-schemalagg__form { margin-top: var(--kind-space-3); }
/* The read-receipt checkbox: the box + its label sit on one baseline so the
   whole label is a click target; the help sits below. */
.kind-schemalagg__receipt-label {
  display: flex;
  align-items: center;
  gap: var(--kind-space-2);
  cursor: pointer;
}
.kind-schemalagg__receipt-label input[type="checkbox"] {
  width: 1.15rem;
  height: 1.15rem;
  flex: 0 0 auto;
}

/* G4 "Kommande schemalagda meddelanden" panel: the conversation's pending
   queued replies, each a muted inset card with the body, the send time, an
   optional "Läskvittens begärd" badge, and an Avbryt button. */
/* PIXELBUDGET 2026-07-26 (docs/contracts/chat-pixel-budget.md, tak 45px tom
   eller hopfälld). Panelen mätte 125px av en 772px hög chattkolumn, 16 procent,
   för något som i normalfallet är tomt. Kunden vill ha kvar panelen, så den blir
   en hopfälld sammanfattningsrad byggd på native <details>/<summary>.
   Höjdbudget hopfälld: summary min-height 44px, sektionen har ingen egen
   padding, panelen är display:none tills [open]. Marginalen mot skrivmodulen
   kliver ned från 24px till 12px, den räknas inte i taket men äter kolumnen. */
.kind-schemalagda { margin-top: var(--kind-space-3); }
.kind-schemalagda__disclosure { margin: 0; }
/* Sammanfattningsraden. list-style:none + ::marker-nollningen tar bort UA:ns
   triangel; chevronen ritas i stället av ::after så den kan rotera vid [open].

   TRÄFFYTAN ÄR 44px, INTE 40 (granskningsfix 2026-07-26). Raden låg en runda på
   `min-height: 40px` med motiveringen att kontraktet satte 40px för elementet.
   Det var fel avvägning och kontraktet sa redan varför: "Tillgänglighet vinner
   vid konflikt: 44px träffyta och WCAG 2.2 AA-kontrast är golv, inte
   förhandlingsbart. Ryms inte budgeten med bibehållen a11y, eskalera i stället
   för att offra a11y." Priset för att följa den klausulen är 5px av en 772px
   kolumn, alltså 0,6 procent, och kontraktets tak för elementet är höjt till
   45px (44 + 1px kant) i samma runda. Träffytan är HELA radens bredd x 44px. */
.kind-schemalagda__summary {
  display: flex;
  align-items: center;
  gap: var(--kind-space-2);
  min-height: 44px;
  padding-inline: var(--kind-space-2);
  /* CP-02-resten (#87): summary är utfällningskontrollen, alltså en komponent,
     inte en gruppering. Måttet tas mot bäraren BAKOM raden (3.34:1 mot vit,
     3.11:1 mot arbetsytan); mot radens EGEN inskjutna fyllning mäter samma
     token 2.89:1, vilket är kanten inåt och inte den som identifierar raden. */
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  background: var(--kind-color-surface-muted);
  cursor: pointer;
  list-style: none;
}
.kind-schemalagda__summary::-webkit-details-marker { display: none; }
.kind-schemalagda__summary::marker { content: ""; }
.kind-schemalagda__summary:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}
/* Rubriken behåller sitt id (aria-labelledby) och sin h2-nivå, men får radens
   kompakta typografi i stället för h2-basens 1.75rem + marginal. */
.kind-schemalagda__title {
  margin: 0;
  font-family: inherit;
  font-size: var(--kind-font-small);
  font-weight: 600;
  line-height: 1.3;
  letter-spacing: normal;
  color: var(--kind-color-text);
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* CP-14: vid smal bredd ryms inte "Kommande schemalagda meddelanden" på en rad,
   och ellipsen dolde 50px av rubriken vid 320 normal och 215px vid 320 xxlarge
   (uppmätt mot deployen 2026-08-04, mått 6:s AVKORTNINGS-dimension).
   Kontraktet mäter mått 6 i TVÅ dimensioner just för att ett grönt bredd-tak kan
   samexistera med avkortad text. Radbrytning kostar en rad, ellipsen kostade
   betydelsen, alltså är detta rätt byte. Taket är oförändrat: raden växer nedåt
   inuti en panel som redan är hopfällbar. */
@media (max-width: 430px) {
  .kind-schemalagda__title {
    overflow: visible;
    text-overflow: clip;
    white-space: normal;
  }
}
/* Antalet syns i hopfällt läge, så en väntande utskickskö aldrig är osynlig. */
.kind-schemalagda__count {
  margin-inline-start: auto;
  flex: 0 0 auto;
  min-width: 1.5rem;
  padding-inline: var(--kind-space-2);
  border-radius: var(--kind-radius-pill);
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border-soft);
  font-size: var(--kind-font-small);
  font-weight: 700;
  text-align: center;
  color: var(--kind-color-text);
}
.kind-schemalagda__summary::after {
  content: "";
  flex: 0 0 auto;
  width: 0.5rem;
  height: 0.5rem;
  border-right: 2px solid var(--kind-color-text-muted);
  border-bottom: 2px solid var(--kind-color-text-muted);
  transform: rotate(45deg);
  margin-inline-start: var(--kind-space-1);
}
.kind-schemalagda__disclosure[open] .kind-schemalagda__summary::after {
  transform: rotate(-135deg);
}
/* Innehållet deklareras display:none och slås på vid [open]. Webbläsaren gör
   redan det via UA-stilen, men den explicita författarregeln gör tillståndet
   läsbart för render- och CSS-mattetester (som inte kan känna till UA-stilar),
   och den är no-op i webbläsaren. */
.kind-schemalagda__panel { display: none; }
.kind-schemalagda__disclosure[open] .kind-schemalagda__panel {
  display: block;
  padding-top: var(--kind-space-3);
}
.kind-schemalagda__list {
  list-style: none;
  margin: var(--kind-space-2) 0 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-3);
}
.kind-schemalagda__item {
  background: var(--kind-color-surface-muted);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-3) var(--kind-space-4);
}
.kind-schemalagda__body {
  margin: 0 0 var(--kind-space-2);
  color: var(--kind-color-text);
  white-space: pre-wrap;
  overflow-wrap: anywhere;
}
.kind-schemalagda__meta {
  margin: 0 0 var(--kind-space-2);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--kind-space-2);
  font-size: 0.875rem;
  color: var(--kind-color-text-muted);
}
.kind-schemalagda__when time { font-weight: 600; color: var(--kind-color-text); }
.kind-schemalagda__cancel-form { margin: 0; }

/* ---- Wave 3a composer "+" disclosure popover (docs/acceptance/
   wave3-build-spec.md sections 1-2, WCAG 2.2 AA). The "+" trigger sits on the
   compose action row next to "Skicka" (was "Skicka svar" until #427 point 27c,
   2026-08-31); the popover panel groups the share
   items + their revealed panes. The disclosure script collapses the panel +
   panes on load (they render OPEN as the no-JS fallback). ---- */

/* The compose action row: the "+" share trigger + the primary Skicka button. */
.kind-compose__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--kind-space-3);
  margin-top: var(--kind-space-2);
  /* Positioning context for the floating emoji panel (2.0 #4). */
  position: relative;
}
/* The "+" trigger. Icon-only (V1 B1, was icon + label) + aria-label + title;
   min 44x44 target (A6, 2.5.8 minimum is 24, we aim 44 for the older/lower-
   vision clinician), now explicit via min-width since the label no longer
   pads the button out. */
.kind-compose__share-trigger {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--kind-space-2);
  min-height: 44px;
  min-width: 44px;
}
/* GARD, ursprungsprecedens och INTE specificitet (regel 27 korollarium 2).
   UA-arkets `[hidden]:not([hidden=until-found i]):not(embed) { display: none }`
   saknar `!important`, och en NORMAL forfattardeklaration slar en NORMAL
   user-agent-deklaration i kaskadens sorteringsordning oavsett specificitet.
   `display: inline-flex` ovan gor darfor `hidden` INERT pa den har klassen.

   Elementen bar idag ocksa `.kind-btn`, vars egen gard (kind.css) ar 0-2-0 och
   raddar dem, alltsa var defekten LATENT och inte synlig: kaskadsonden mater
   `display:none` pa alla tre barare i dag, men samma knapp UTAN `.kind-btn`
   mattes till 48x48 malad. Att lana en syskonklass gard ar precis den smala
   tillampning regel 27 korollarium 2 varnar for, sa klassen bar nu sin egen.

   PER KLASS och UTAN `!important`, medvetet: den generella
   `[hidden] { display: none !important }` (Bootstrap Reboot) bryter
   `hidden="until-found"` och ar en oppen defekt dar (twbs/bootstrap#40688).
   Den har formen vinner pa specificitet 0-2-0 mot regeln ovans 0-1-0.
   Samma gard som `.kind-compose__emoji-trigger` och `.kind-compose__format-trigger`
   redan bar. Vakt: tests/test_hidden_display_gard.py. */
.kind-compose__share-trigger[hidden] { display: none; }
.kind-compose__share-trigger-icon { display: inline-flex; flex: 0 0 auto; }

/* Emoji smiley trigger (2.0 #4). Same footprint as the "+" trigger. */
.kind-compose__emoji-trigger {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--kind-space-2);
  min-height: 44px;
  min-width: 44px;
}
.kind-compose__emoji-trigger[hidden] { display: none; }
.kind-compose__emoji-trigger-icon { display: inline-flex; flex: 0 0 auto; }

/* Primary send (#42, shared composer contract §1); >=44px target inherited
   from .kind-btn, now also an explicit min-width (icon-only under V1 B1). It
   is the last child of the action row and never enters the popover, so it
   stays put. */
.kind-compose__send {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--kind-space-2);
  min-height: 44px;
  min-width: 44px;
  /* On a narrow action row the send button sits at the end and does not get
     pushed off; the row wraps (flex-wrap) before send would clip. */
  margin-inline-start: auto;
}
.kind-compose__send-icon { display: inline-flex; flex: 0 0 auto; }

/* ----------------------------------------------------------------------------
 * V1 B1 (#56, chatt-yta 2.1 feedback-plan 2026-07-08): ren ikonrad.
 *
 * Consultant-approved 2026-07-12 (plan beslutslogg): the share-trigger, emoji
 * trigger, and Skicka button drop their visible text label for a pure icon
 * row (kundkrav-parity with Kind's own product). This SUPERSEDES the
 * "icon + text, NEVER icon-only" contract note written into
 * _chat_composer.html on 2026-07-01 (amended there, pointer back here). Each
 * button keeps (added where missing) a Swedish aria-label + a matching
 * `title` tooltip + the explicit min-width/min-height floor above; the
 * "-text" spans stay IN THE DOM (template-owned no-JS-independent fallback
 * carrier) and are hidden purely via CSS below, never deleted, since the
 * aria-label already supplies the accessible name (HTML-AAM: aria-label wins
 * over subtree content). The POPOVER MENU items ("Dela mall", "Dela
 * formulär", ...) keep their visible labels (out of scope, a disclosure list
 * is a different pattern); only the outer action row's 3 buttons go icon-only. */
.kind-compose__share-trigger-text,
.kind-compose__emoji-trigger-text,
.kind-compose__format-trigger-text {
  display: none;
}

/* ---- CP-06 (issue #91, briefens §4.4): SKICKA ÅTERFÅR SIN SYNLIGA ETIKETT ---
 * Speglar samma utbrytning i kind_patient.css, där hela härledningen ligger.
 * Kort: båda personorna klassar Skicka KRITISK, produkten bar redan text på
 * kollegie-chattens Skicka och ikon-only på patientchattens, alltså tappade
 * ytan med STÖRST konsekvens sitt ord, och etiketten kostar pixelbudgeten noll
 * eftersom knappen är `display:none` i `--collapsed`, som är det enda läge
 * taket mäter.
 *
 * BÅDA sheeten måste ändras. Vårdgivarytorna laddar kind_admin.css OCH
 * kind_patient.css, i den ordningen (se admin/chatt.html + admin/arbetsvy.html),
 * så en ändring bara här hade tystats av den senare filens `display:none`. */
.kind-compose__send-text {
  display: inline;
}

/* G2 (V6, chatt-fönster-restfix 2026-07-14, spec docs/design/patient-chatt-3zon-
 * 2026-07-14.md): the V4 (#63) Fetstil + Infoga länk format triggers join the
 * SAME ren-ikonrad as +/emoji/skicka (decision B1 extended). Their "-text" span
 * is CSS-hidden above (icon-only); the accessible name is the template
 * aria-label + matching title (WCAG 4.1.2). Same square 44px clinician tap floor
 * (2.5.8) as the +/emoji triggers. The [hidden] guard restores the UA
 * [hidden]{display:none} that display:inline-flex would beat (author-origin
 * precedence), so the no-JS `hidden` posture (JS-only insertion helper, dead
 * without kind_composer_format.js, same as emoji) still holds. */
.kind-compose__format-trigger {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--kind-space-2);
  min-height: 44px;
  min-width: 44px;
  /* persona-vardpersonal V2 (2026-07-14): the "B" (Fetstil) glyph must read as
     a FLAT format-tool button, NOT a circle/chip, because a circled "B" reads as
     a patient-avatar INITIAL in a clinical UI (patient initials are circular
     avatars everywhere) = a real confusion risk. Use the modest rounded-square
     --kind-radius (10px after CP-05, < 22px = half of 44, so never a circle) so
     bold + link read as distinct, flat format tools.
     CP-05 (#90) note: .kind-btn is no longer a pill, so this override now PINS
     the flat shape rather than correcting a circle. Keep it. */
  border-radius: var(--kind-radius);
}
.kind-compose__format-trigger[hidden] { display: none; }
.kind-compose__format-trigger-icon { display: inline-flex; flex: 0 0 auto; }
.kind-compose__format-trigger-text { white-space: nowrap; }

/* ----------------------------------------------------------------------------
 * V1 (#56, chatt-yta 2.1 feedback-plan 2026-07-08): composer modes.
 *
 * JS-progressive-enhancement ONLY (kind_composer_mode.js); the two classes
 * below are NEVER added without JS, so a no-JS clinician always sees the
 * plain, fully-open composer (unchanged default markup). INACTIVE
 * (kind-compose--collapsed, textarea empty + unfocused): a low input row +
 * the "+" trigger only, emoji + Send hidden. ACTIVE (kind-compose--active,
 * textarea focused OR has content): the full icon row shows. The read-receipt
 * checkbox (below, [data-composer-receipt]) is a THIRD, independent reveal:
 * it appears only once the textarea has actual content (regardless of focus),
 * so opting in to a receipt is only offered once there is a message to attach
 * it to. */
.kind-chat__compose.kind-compose--collapsed .kind-compose__emoji-trigger,
.kind-chat__compose.kind-compose--collapsed .kind-compose__format-trigger,
.kind-chat__compose.kind-compose--collapsed .kind-compose__send {
  display: none;
}

/* ---- PIXELBUDGET 2026-07-26: det inaktiva läget är EN rad (tak 60px) --------
 * docs/contracts/chat-pixel-budget.md. Taket är 60px, inte 56: kontraktets
 * ändringslogg 2026-07-26 härleder det ur 44px a11y-golv för träffytan plus upp
 * till 16px krom (padding, kantlinje, sr-only-rubrikens 1px). 56 var en påhittad
 * rund siffra.
 *
 * Vad som gick fel förra gången, ordagrant ur kontraktet: #56 sa "göm
 * textfunktioner och skicka-knapp när modulen är inaktiv". Det byggdes exakt så
 * (reglerna ovan), och tests/test_composer_mode_css.py verifierar ärligt att de
 * fyra knapparna ligger på display:none. Modulen var ändå 203px, eftersom ingen
 * gömde etiketten (21px), hjälptexten (21px + 12px marginal), knappen "Dela
 * eller bifoga"-raden eller modulens egna paddingar. Vi byggde kontraktets
 * bokstav och mätte kontraktets bokstav; ingen mätte utfallet.
 *
 * Höjdbudgeten i det inaktiva läget, deklaration för deklaration:
 *   border-top                      1px
 *   padding-top (space-1)           4px
 *   raden: max(fält 44, "+" 44)    44px
 *   ------------------------------------
 *   summa                          49px  (tak 60px)
 *
 * Den summan är CSS-matte. Python-modellen i tests/test_chat_pixel_budget.py
 * mäter 53px och den riktiga webbläsaren mätte 58px 2026-07-26, alltså ligger
 * utfallet 2px under taket, inte 11. Skriv inte om marginalen till mer än den
 * är.
 *
 * Etiketten och hjälptexten flyttar till sr-only-mönstret, ALDRIG display:none:
 * textareans aria-describedby måste fortsätta lösa ut och rubriken måste finnas
 * kvar för skärmläsare (WCAG 3.3.2 / 1.3.1). Så fort modulen aktiveras (fokus
 * eller innehåll) återgår allt till fullt läge, inklusive läskvittensvalet.
 * Selektorerna är (0,2,0)+ så de vinner över kind_patient.css basregler, som
 * laddas EFTER den här filen på klinikerytorna. */
.kind-chat__compose.kind-compose--collapsed {
  padding-top: var(--kind-space-1);
  gap: 0;
}
.kind-chat__compose.kind-compose--collapsed .kind-field__label,
.kind-chat__compose.kind-compose--collapsed .kind-field__help {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}
/* Enradigt fält i viloläge. Höjden pinnas i CSS (inte bara av autoexpand-JS:et)
 * så budgeten håller även innan skripten hunnit köra och utan JavaScript-
 * beroende. 44px = klinikerns tappgolv (WCAG 2.5.8, husgolv).
 *
 * #146: 44 är fortfarande GOLVET men inte längre TAKET, exakt samma rättelse
 * som patientytans G3-regel i kind_patient.css. En absolut pixelhöjd på ett
 * fält vars innehåll skalar klipper raden så fort textskalan höjs: vid xxlarge
 * är radhöjden 36px och vadderingen 36px, alltså 72px innehåll i en 44px låda.
 * Ytan var INTE rapporterad i #146 (granskaren tittade på patientchatten), den
 * hittades genom att svepa varje bärare av mekanismen. Kollegie-chatten var
 * dessutom värst av tre ytor i pixelbudgetarbetet av samma skäl: kunden
 * rapporterar det den ser, inte det som finns.
 *
 * Tokens deklareras på .kind-compose__textarea i kind_patient.css, som alla
 * tre klinikerytorna laddar (arbetsvy, chatt, team_chat_visa laddar den EFTER
 * den här filen). Fallback-värdena gör regeln ofarlig om den ordningen någon
 * gång bryts: utan token får vi tillbaka exakt dagens 44px. */
.kind-chat__compose.kind-compose--collapsed .kind-compose__textarea {
  padding-block: var(--kind-komposer-vilo-vaddering, var(--kind-space-3));
  min-height: max(44px, var(--kind-komposer-enrad-vilo, 44px));
  height: max(44px, var(--kind-komposer-enrad-vilo, 44px));
}
/* Fältet och "+"-knappen delar rad; läskvittensraden bryter alltid till en egen
 * rad i AKTIVT läge (flex-basis 100%), så DOM-ordningen fält -> läskvittens ->
 * ikonrad bevaras och fokusordningen är oförändrad (WCAG 2.4.3). */
.kind-chat__compose .kind-chat__compose-row > .kind-compose__receipt {
  flex: 1 0 100%;
}
/* Ikonradens margin-top var till för den STAPLADE layouten. Inne i rad-wrappern
 * äger radens egen gap avståndet, så marginalen blir ren dubbelräkning: den lade
 * 8px ovanpå en 48px-knapp i en 60px-budget. */
.kind-chat__compose .kind-chat__compose-row > .kind-compose__actions {
  margin-top: 0;
}
/* #178: DELNINGSKNAPPEN ÄR RADENS FÖRSTA BARN, I BÅDA LÄGENA.
 *
 * Annica (KIND) 2026-08-11: "+ på vänster sida istället för höger sida."
 * Knappen flyttade ut ur `.kind-compose__actions` och in i rad-wrappern, se
 * den långa noten i templates/admin/_chat_composer.html för varför en `order`
 * på åtgärdsraden inte dög. `flex: 0 0 auto` så knappen varken växer eller
 * krymper när fältet gör det; radens `align-items: flex-start` (kind_patient.css)
 * håller den på radens överkant. Följden är att knappens position i radens
 * koordinatsystem är IDENTISK i viloläge och aktivt läge, vilket är en starkare
 * gard mot CP-20:s tvåklicksdefekt än lägesneutraliteten ensam (den står kvar).
 * Uppmätt i e2e/cp181920-komposer-utfall.mjs mått P.
 *
 * Deklarerad i BÅDA sheeten, som `.kind-compose__send-text` ovan: vårdgivarytorna
 * laddar kind_admin.css OCH kind_patient.css, och en regel som bara finns i det
 * ena är beroende av en laddningsordning ingen assertion vaktar. */
.kind-chat__compose-row > .kind-compose__share-trigger {
  flex: 0 0 auto;
  /* Reservationens bredd, se `--kind-komposer-plus` på `.kind-chat__compose-row`
   * i kind_patient.css. Fallbacken 48px gör regeln ofarlig om laddningsordningen
   * någon gång bryts, samma mönster som `.kind-compose__textarea`-tokens ovan.
   * 48px ligger över vårdgivarytans 44px träffytegolv, alltså en skärpning. */
  min-width: var(--kind-komposer-plus, 48px);
}
/* LOAD-BEARING, hittad av pixelbudget-modellen efter att procent-basis stöddes:
 * `.kind-compose__actions { flex: 1 1 100% }` (kind_patient.css, som
 * klinikerytorna också laddar) ger ikonraden HELA radbredden som flex-basis, så
 * den bryter till en EGEN rad. Med den kvar mätte den inaktiva modulen 109px,
 * inte 49px: fält 44 + radgap 12 + ikonrad 48 + krom.
 *
 * #178 ÄNDRADE PREMISSEN, läs inte raden ovan som nuläge: sedan "+" flyttade ut
 * ur åtgärdsraden är den TOM i viloläge (emoji, format och Skicka är
 * `display:none` där, och emoji-panelens skal är `hidden`). En tom flexruta är
 * 0px bred men äter ändå ett radgap, alltså 12px av fältets bredd i en kolumn
 * där `240 + 12 + 44 = 296` redan är trångt. Därför tas den UR FLÖDET i
 * viloläge i stället för att krympas till sitt innehåll. Inget syns mindre:
 * varje barn var redan dolt. */
.kind-chat__compose.kind-compose--collapsed .kind-compose__actions {
  display: none;
}
/* Fältets 240px min-width (kind_patient.css .kind-chat__compose-row .kind-field)
 * är rätt för det AKTIVA läget men bryter enradigheten i en smal kolumn: 240 +
 * 12 gap + 44 för "+" är 296, mer än vad arbetsvyns kolumn har kvar när
 * kö-railen och patientpanelen tagit sitt vid mindre bredder. I viloläge är
 * fältet en tom en-rads yta som får krympa; aktivt läge återfår golvet. */
.kind-chat__compose.kind-compose--collapsed .kind-chat__compose-row .kind-field {
  min-width: 0;
}

/* ---- #42 (chatt-yta 2.1) compact composer restyle -------------------------
   KIND asked the clinician reply module to (a) auto-expand from a compact
   height, (b) consolidate the controls into a tight icon-forward row, and (c)
   weigh less so more of the thread shows. Presentation only: no field, hook, or
   POST target changed; the läskvittens opt-in, all 8 share items, and the
   schemalagda panel stay exactly where they were.
   OMBASLINJERAD #427 punkt 27a (2026-08-31): "the journalförs help" stod i
   uppräkningen ovan och stämmer inte längre, hjälptexten är BORTTAGEN ur
   templates/admin/_chat_composer.html på kundens begäran. Raden är rättad och
   inte struken, meningen bär fortfarande sitt #42-påstående om vad som INTE
   ändrades. */

/* Auto-expand reply textarea. Starts short (a comfortable few rows) and grows
   via kind_composer_popover.js's initAutoExpand (which sets height inline). The
   min-height keeps the empty field a 44px admin tap target (WCAG 2.5.8) instead
   of the tall 8rem the base .kind-field__textarea uses (that fixed 128px was the
   "not compact" finding, row 1.1c/1.1d). resize:none because the JS owns the
   height (a manual drag would fight the auto-grow). With NO JS the server
   rows="3" gives a usable default, so nothing is lost. Mirrors the patient
   composer's .kind-compose__textarea (kind_patient.css). */
.kind-compose__textarea {
  min-height: 44px;
  resize: none;
}
/* KIND-MOB-02 (UAT 2026-07-16): pa en kort smal viewport far svarsfaltet ett
   viewport-relativt tak UNDER JS-autoexpandens 6-radstak (~170px), sa att
   falt + laskvittens + Skicka-raden ryms tillsammans i en tangentbords-hog
   viewport. 24rem approximerar kringkromet (label + hjalptext + kvittensrad
   + ikonrad + marginaler + chatthuvudets synliga del); 2.75rem-golvet = 44px
   = min-height-golvet ovan, sa taket kan aldrig understiga tapp-ytan.
   SAMSPEL med JS (kind_composer_popover.js initAutoExpand): JS satter inline
   height + overflowY, och laser efter KIND-MOB-02-fixen tillbaka den
   FAKTISKA (CSS-klampade) hojden innan scrollbarsbeslutet, sa ett
   CSS-klampat falt scrollar internt i stallet for att klippa carets rad.
   Admin-scopad (.kind-body--admin): patientkomposern far sitt eget
   dvh-relativa tak i kind_patient.css av parallellt arbete. */
@media (max-width: 900px) {
  .kind-body--admin .kind-compose__textarea {
    /* #146: golvet 2.75rem skalar visserligen med textskalan (66px vid
       xxlarge), men det är ett TRÄFFYTETAL och inte en radhöjd, så det råkar
       bara ligga över radbehovet ibland: vid xxlarge kräver en rad 36 + 36 + 2
       = 74px mot golvets 66. Med öppet tangentbord krymper 100dvh så
       mellantermen går negativ och golvet blir det som gäller, alltså precis
       det läge fältet mest behöver sin rad. Ett tredje led som ÄR radhöjden
       gör taket korrekt i just det läget utan att röra de två andra. */
    max-height: max(
      2.75rem,
      var(--kind-komposer-enrad, 2.75rem),
      calc(100dvh - 24rem)
    );
  }
}

/* The läskvittens opt-in row sits tighter under the field so the module is
   lower. It stays a visible, labelled control (never moved into the popover),
   its LABEL TEXT is untouched by V1 B1 (only the outer icon row went
   icon-only). V1 (#56): with JS (kind_composer_mode.js) this row starts
   `hidden` and is revealed only once the reply textarea has content (see
   [data-composer-receipt] in _chat_composer.html); with no JS it stays
   permanently visible (the plain markup default), so nothing is lost. */
.kind-compose__receipt { margin-top: var(--kind-space-2); }
.kind-compose__receipt .kind-field__help { margin-top: var(--kind-space-1); }
/* P1-1 (reviewer 2026-07-12): the receipt wrapper carries .kind-field, whose
   author-origin `display: flex` (kind.css) BEATS the UA stylesheet's
   [hidden] { display: none } on origin precedence, so kind_composer_mode.js
   setting `receiptField.hidden = true` had NO visual effect and the checkbox
   stayed visible with JS on (the reveal-on-content never engaged). The same
   class of bug bit .kind-assign__form (borttagen i web#220) and
   the telefon-OTP step forms (kind_patient.css .kind-form[data-kind-telotp-*]
   [hidden]); this is the SAME established guard: an author-origin attribute
   selector that restores [hidden] winning. The no-JS path is untouched (the
   server never renders the attribute, so this rule never matches without
   JS). Guard-pinned by tests/test_composer_mode_css.py. */
.kind-compose__receipt[hidden] { display: none; }

/* Compact icon-forward action row (clinician only, scoped by --compact so the
   patient composer keeps its own row). The three controls read as a tight
   icon row: since V1 B1 the label text is CSS-hidden (display:none, above)
   and the accessible name comes from aria-label + a matching title tooltip.
   The buttons shrink to their content and the row gap tightens. Skicka is
   pushed to the end (margin-inline-start:auto on .kind-compose__send) and
   stays the primary button. */
.kind-compose__actions--compact {
  gap: var(--kind-space-2);
  margin-top: var(--kind-space-2);
}
/* Share + emoji triggers: compact padding + weight so the row is icon-forward
   and light, while keeping the >=44px tap target (padding-block + line-height
   clear 44px; verified at desktop + 320px).
   #178: "+" sitter inte längre i `.kind-compose__actions--compact` utan först i
   rad-wrappern, så den nya selektorn måste stå MED här. Utan den tappade knappen
   sin kompakta vaddering och sitt teckensnitt och blev bredare än de övriga
   ikonknapparna. Samma specificitet (0,2,0) som de andra i listan, så
   kaskadordningen mellan de två sheeten är oförändrad. */
.kind-chat__compose-row > .kind-compose__share-trigger,
.kind-compose__actions--compact .kind-compose__share-trigger,
.kind-compose__actions--compact .kind-compose__emoji-trigger,
.kind-compose__actions--compact .kind-compose__format-trigger {
  padding-inline: var(--kind-space-3);
  gap: var(--kind-space-1);
  font-size: var(--kind-font-small);
  font-weight: 600;
}

/* The emoji popover panel, created by kind_emoji_picker.js and inserted right
   after the trigger. Floats above the composer actions. */
.kind-emoji-popover__panel {
  position: absolute;
  z-index: 30;
  bottom: calc(100% + var(--kind-space-2));
  left: 0;
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  background: var(--kind-color-surface);
  box-shadow: var(--kind-shadow-md);
}
.kind-emoji-popover__panel[hidden] { display: none; }
.kind-emoji-popover__panel emoji-picker {
  --background: var(--kind-color-surface);
  --border-color: var(--kind-color-border);
  --num-columns: 8;
  --emoji-size: 1.4rem;
  width: 22rem;
  max-width: min(22rem, 92vw);
  height: 24rem;
  max-height: 60vh;
}

/* The popover wrapper sits directly under the reply form so the panel reads as
   "attached" to the composer. The panel is a bordered card; the disclosure
   script toggles its [hidden]. */
.kind-compose-popover { position: relative; margin: var(--kind-space-2) 0 0; }
.kind-compose-popover__panel {
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  background: var(--kind-color-surface);
  box-shadow: var(--kind-shadow-md);
  padding: var(--kind-space-4);
  /* A5 (2.4.11 Focus Not Obscured): the panel flows in-document below the
     composer (not a fixed overlay), so a focused item is never hidden behind
     the sticky compose bar; it scrolls with the page. */
}
.kind-compose-popover__panel[hidden] { display: none; }
/* F-22: the top-level Avbryt <li> renders [hidden] until the popover script
   reveals it. No author rule targets the menu's <li> today, so the UA [hidden]
   rule suffices; this guard pins that against a future li display rule (the
   regel 27-korollarium-2 hidden-vs-author-display mechanism). */
.kind-compose-popover__menu li[hidden] { display: none; }
.kind-compose-popover__title {
  margin: 0 0 var(--kind-space-2);
  font-weight: 600;
  color: var(--kind-color-text);
}
.kind-compose-popover__menu {
  list-style: none;
  margin: 0 0 var(--kind-space-3);
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-1);
}
/* Each share item is a full-width button, icon + label, min 44px tall (A6).
   Text label is mandatory (A2: an icon-only item is a 4.1.2 fail). */
/* Menyn blandar elementtyper: syskonen är <button> (de öppnar paneler på
   plats) medan "Boka videomöte" är ett <a> som djuplänkar till bokningen
   och därför fungerar utan JavaScript. Utan den här deklarationen ärver
   enbart <a>-posten user-agentens understrykning och läser som en avvikelse
   bland knapparna. Posterna ska se likadana ut oavsett elementtyp. */
.kind-compose-popover__item {
  display: flex;
  align-items: center;
  gap: var(--kind-space-3);
  width: 100%;
  min-height: 44px;
  padding: var(--kind-space-2) var(--kind-space-3);
  border: 1px solid transparent;
  border-radius: var(--kind-radius);
  background: transparent;
  color: var(--kind-color-text);
  text-decoration: none;
  font: inherit;
  text-align: left;
  cursor: pointer;
}
.kind-compose-popover__item:hover { background: var(--kind-color-surface-muted); }
/* Visible focus ring (A9, 2.4.7); retained outline so forced-colors users keep it. */
.kind-compose-popover__item:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}
.kind-compose-popover__item-icon {
  display: inline-flex;
  flex: 0 0 auto;
  color: var(--kind-color-accent);
}
/* A revealed pane (the form / picker). The disclosure script unsets [hidden]. */
.kind-compose-popover__pane {
  border-top: 1px solid var(--kind-color-border-soft);
  margin-top: var(--kind-space-3);
  padding-top: var(--kind-space-3);
}
.kind-compose-popover__pane[hidden] { display: none; }
.kind-compose-popover__cancel { margin-top: var(--kind-space-2); }

/* The single-select share picker (Dela formulär / Dela vårdresa). A radio list
   filled by kind_composer_share_picker.js; each option is a 44px-tall row. */
.kind-share-picker__title {
  margin: 0 0 var(--kind-space-1);
  font-weight: 600;
  color: var(--kind-color-text);
}
.kind-share-picker__list {
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-1);
  margin: var(--kind-space-3) 0;
  max-height: 16rem;
  overflow-y: auto;
}
/* CP-02-resten (#87): radiorad = kontroll, kind.css §1 WATCH-ITEM 1. */
.kind-share-picker__option {
  display: flex;
  align-items: center;
  gap: var(--kind-space-3);
  min-height: 44px;
  padding: var(--kind-space-2) var(--kind-space-3);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  cursor: pointer;
}
/* #597: keep the reason inside its row in the scrollable start picker. */
.kind-share-picker__option--unavailable { flex-shrink: 0; cursor: default; }
.kind-share-picker__option:hover { background: var(--kind-color-surface-muted); }
.kind-share-picker__option:focus-within {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}
/* web#511: raderna i "Dela vårdresa" är KNAPPAR och inte radioknappar. Ett
   klick öppnar delningssteget; resan delas först på "Dela" (gamla KIND). En
   knapp ärver inte typsnitt eller bakgrund, så utan de här raderna ser rad och
   rad olika ut mellan de två plockarna. */
button.kind-share-picker__option {
  width: 100%;
  text-align: left;
  background: transparent;
  color: inherit;
  font: inherit;
}
/* web#551: raderna i "Dela formulär" är också KNAPPAR, men med den andra
   semantiken -- ETT klick DELAR formuläret direkt, som i gamla KIND. De ärver
   radformen ovan; modifieraren finns för att det ska gå att se i markupen (och i
   ett prov) att raden är en delningsknapp och inte ett val som öppnar ett steg. */
button.kind-share-picker__option--enklick { width: 100%; }
button.kind-share-picker__option[disabled] { cursor: default; opacity: 0.7; }
button.kind-share-picker__option:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}
.kind-share-picker__radio { width: 1.15rem; height: 1.15rem; flex: 0 0 auto; }
.kind-share-picker__option-titel { color: var(--kind-color-text); min-width: 0; }
.kind-share-picker__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--kind-space-3);
  margin-top: var(--kind-space-3);
}

/* A10 (2.3.3): respect reduced-motion (the trigger hover transform is the only
   motion; kept cheap, nothing to disable here, but declared for future-proofing
   against any animated reveal). */
@media (prefers-reduced-motion: reduce) {
  .kind-compose-popover__panel,
  .kind-compose-popover__pane { transition: none; }
}

/* ---- #46 overflow hardening (chatt-yta 2.1 refresh) ------------------------
   No content on the clinician chat surface may force horizontal scroll at 320px
   or 400% zoom (WCAG 1.4.10 Reflow). The action row already wraps; the pieces
   below let long labels / names shrink + wrap instead of pushing the row wide.
   Presentation only: no field, no hook, no target changes. */

/* The compose action buttons may shrink below their intrinsic label width so a
   long label wraps the row rather than overflowing. The row already sets
   flex-wrap:wrap; min-width:0 makes the wrap actually take.
   P2-3 (V6 fix-round, chatt-fönster-restfix 2026-07-14, reviewer
   CHANGE-REQUIRED): scope this to EXCLUDE the icon-only action triggers. Since
   B1/G2 every action button (+/emoji/Fetstil/Infoga länk/Skicka) is icon-only
   and carries its own square min-width floor (44px, WCAG 2.5.8, (0,1,0)); the
   old UNSCOPED `.kind-compose__actions > .kind-btn { min-width: 0 }` ((0,2,0))
   BEAT those floors and collapsed the 44px tap target. An icon-only button has
   no visible label to wrap, so the :not() carve-out lets the per-trigger floors
   win uncontested while a FUTURE labelled action button still gets the shrink.

   CP-06 (issue #91, 2026-08-04): `Skicka` är INTE LÄNGRE ikon-only, den bär
   synlig text. Undantaget i selektorn nedan står ändå KVAR för Skicka, och det
   är ett medvetet val och inte en kvarglömd rad. `min-width: 0` finns för att
   låta en knapp krympa under sin etikett så RADEN bryter i stället för att
   spränga bredden; för Skicka är det fel utfall. Den är den primära åtgärden och
   ska hellre ta plats och låta raden brytas runt den (uppmätt vid 320px och
   xxlarge: raden bryter, Skicka behåller sin fulla bredd 152px) än krympas till
   en avkortad etikett. Den kvarvarande delen av kommentaren ovan, att en
   ikon-only-knapp saknar etikett att bryta, gäller fortfarande +, emoji,
   Fetstil och Infoga länk. */
.kind-compose__actions
  > .kind-btn:not(.kind-compose__share-trigger):not(.kind-compose__emoji-trigger):not(.kind-compose__format-trigger):not(.kind-compose__send) {
  min-width: 0;
}
.kind-compose__share-trigger-text,
.kind-compose__emoji-trigger-text,
.kind-compose__send-text { overflow-wrap: anywhere; }

/* A long share-menu label (e.g. "Dela foto eller video") wraps inside its
   44px row instead of widening the popover panel. The item is already a flex
   row; the text span needs min-width:0 to be allowed to break. */
.kind-compose-popover__item > span:last-child {
  min-width: 0;
  overflow-wrap: anywhere;
}

/* A long single-select option title (formulär / vårdresa) wraps in its row. */
.kind-share-picker__option-titel { overflow-wrap: anywhere; }

/* A long patient name in the chat header (#43 also relies on this) reflows
   instead of forcing horizontal scroll; the header stays a single column and
   the heading breaks. Verified against a 40-char name per the ux-spec edge
   case. */
.kind-chat__header h1 {
  min-width: 0;
  overflow-wrap: anywhere;
}

/* Inline info box used on invite-success + on top-accessors guidance. */
.kind-info-box {
  background: var(--kind-color-info-bg);
  border-left: 4px solid var(--kind-color-info);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-4);
  margin-top: var(--kind-space-5);
}
.kind-info-box h2 { margin-top: 0; }
.kind-list--ordered { counter-reset: kind-li; }
.kind-list--ordered .kind-list__item {
  counter-increment: kind-li;
  position: relative;
  padding-left: var(--kind-space-6);
}
.kind-list--ordered .kind-list__item::before {
  content: counter(kind-li) ".";
  position: absolute;
  left: var(--kind-space-3);
  top: var(--kind-space-3);
  font-weight: 700;
  color: var(--kind-color-accent);
}

/* Password strength meter (invite-set-password surface).
   Colour bands are reinforced by the always-present text label so the meter
   reads even with colour vision deficiency. */
.kind-password-meter {
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-2);
  margin-top: var(--kind-space-2);
}
.kind-password-meter[aria-hidden="true"] .kind-password-meter__bar {
  background: var(--kind-color-surface-muted);
}
.kind-password-meter__bar {
  width: 100%;
  height: 6px;
  background: var(--kind-color-surface-muted);
  border-radius: var(--kind-radius-pill);
  overflow: hidden;
}
.kind-password-meter__fill {
  display: block;
  height: 100%;
  width: 0;
  background: var(--kind-color-border);
  transition: width 0.2s ease-out, background-color 0.2s ease-out;
  border-radius: var(--kind-radius-pill);
}
.kind-password-meter__fill--0 { background: var(--kind-color-error); }
.kind-password-meter__fill--1 { background: var(--kind-color-warning); }
.kind-password-meter__fill--2 { background: var(--kind-color-info); }
.kind-password-meter__fill--3 { background: var(--kind-color-success); }
.kind-password-meter__label { margin: 0; }

.kind-field__help--error { color: var(--kind-color-error); font-weight: 600; }
.kind-field__help--success { color: var(--kind-color-success); font-weight: 600; }

/* ============ Wave 3: date-range picker (AT-46b + AT-61 + Q-29) ============ */

.kind-date-range {
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-3);
  padding: var(--kind-space-4);
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
  margin-bottom: var(--kind-space-4);
}
.kind-date-range__presets {
  border: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-2);
}
.kind-date-range__btn-row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-2);
}
.kind-btn--active,
.kind-btn[aria-pressed="true"] {
  background: var(--kind-color-accent-bg);
  border-color: var(--kind-color-accent);
  color: var(--kind-color-accent);
  font-weight: 700;
}
.kind-date-range__custom > summary {
  list-style: none;
  display: inline-flex;
  cursor: pointer;
}
.kind-date-range__custom > summary::-webkit-details-marker { display: none; }
.kind-date-range__summary::after {
  content: " \25BC";
  font-size: 0.75em;
  margin-left: var(--kind-space-2);
}
.kind-date-range__custom[open] > .kind-date-range__summary::after { content: " \25B2"; }
.kind-date-range__inputs {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: var(--kind-space-3);
  align-items: end;
  padding-top: var(--kind-space-3);
}

/* ============ Wave 3: loggutdrag toolbar + disclosure (AT-61) ============ */

.kind-loggutdrag__toolbar {
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-3);
  margin: var(--kind-space-4) 0;
  padding: var(--kind-space-4);
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
}
.kind-loggutdrag__details > summary {
  list-style: none;
  display: inline-flex;
  cursor: pointer;
}
.kind-loggutdrag__details > summary::-webkit-details-marker { display: none; }
.kind-loggutdrag__details-summary::after {
  content: " \25BC";
  font-size: 0.75em;
  margin-left: var(--kind-space-2);
}
.kind-loggutdrag__details[open] > .kind-loggutdrag__details-summary::after {
  content: " \25B2";
}

/* When the disclosure is open, show the technical columns. The `hidden`
   attribute is the structural hide; this CSS rule reverts it so JS-disabled
   users also see the columns once they open the <details>. */
.kind-loggutdrag__toolbar:has(.kind-loggutdrag__details[open])
  ~ .kind-table-wrap
  .kind-loggutdrag-table__technical {
  display: table-cell !important;
}
.kind-loggutdrag-table__technical[hidden] { display: none; }

/* ============ Wave 3: top-accessors numeric columns (AT-46b) ============ */

.kind-table__num { text-align: right; font-variant-numeric: tabular-nums; }
.kind-table th.kind-table__num { text-align: right; }

/* ============ Wave 3: patient-profile "Visa fler" disclosure (Q-W2F-D) ============ */

.kind-profile-section__more {
  margin-top: var(--kind-space-3);
}
.kind-profile-section__more > summary {
  list-style: none;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
}
.kind-profile-section__more > summary::-webkit-details-marker { display: none; }
/* WCAG 2.2 AA 2.4.7 Focus Visible. Kontrollen foll tillbaka pa webblasarens
   egen fokusring, som ar synlig och alltsa formellt godkand, men som INTE ar
   systemets ring. UPPMATT 2026-08-06: noll :focus-visible-regler matchade
   .kind-profile-section__more-summary, medan fyra syskonmonster
   (schemalagg, schemalagda, arbetsvy-ko, artikelbibliotek) redan bar
   --kind-focus-ring. CP-15 gick fran tre till atta forekomster av kontrollen,
   sa avvikelsen slutade vara marginell. list-style:none ovan tar dessutom bort
   markoren, vilket gor en tydlig ring viktigare an pa en omalad summary. */
.kind-profile-section__more > summary:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}
.kind-profile-section__more-summary::after {
  content: " \25BC";
  font-size: 0.75em;
  margin-left: var(--kind-space-2);
}
.kind-profile-section__more[open] > .kind-profile-section__more-summary::after {
  content: " \25B2";
}

/* Empty-state composite (used on patient profile when no patient found and on
   error fallbacks). Mirrors kind.css `.kind-error-page` shape but lives in the
   admin sheet because the admin layout needs a different inner padding. */
.kind-empty-state {
  max-width: var(--kind-container-narrow);
  margin: var(--kind-space-7) auto;
  text-align: center;
  padding: var(--kind-space-6) var(--kind-space-4);
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
}

/* ============ Wave 4: per-row inline actions (AT-59 + Q-17) ============
 * The anvandare table grew an Åtgärder column with Deaktivera / Aktivera /
 * Lås upp buttons per row. Each button is its own <form> POST with a CSRF
 * hidden input, so the buttons read as a "group of forms" not a single
 * actions row. The flex wrapper keeps the action cell compact (44x44 hit
 * target each) and wraps to a new line on narrow viewports.
 */

.kind-table__actions {
  white-space: nowrap;
  vertical-align: middle;
}
.kind-table__actions-col {
  width: 1%; /* shrink-to-fit; the buttons set the floor */
}
.kind-table__actions-group {
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-2);
  align-items: center;
}
/* #351: the Swedish re-invite label must fit the table scrollport at 320px.
 * Scope the two-line fallback to this one long action; the other table actions
 * retain their compact, single-line sizing. */
.kind-table__actions-group .kind-reinvite-button {
  max-inline-size: 13.625rem;
  text-align: center;
  white-space: normal;
}
.kind-inline-form {
  display: inline-flex;
  margin: 0;
}
.kind-inline-form .kind-btn {
  min-height: 36px; /* in-table density; main CTAs stay at 44px */
  padding: 6px 12px;
}

/* #23 admin pnr/telefon correction (ADR-052), dark behind the per-field flags.
 * The <details> disclosure keeps the form out of the way until the admin opens
 * it; the summary is a real 44px ghost button. Tokens only. */
.kind-korrigera { margin-top: var(--kind-space-2); }
.kind-korrigera > summary {
  cursor: pointer;
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  list-style: none;
}
.kind-korrigera > summary::-webkit-details-marker { display: none; }
.kind-korrigera__form {
  margin-top: var(--kind-space-3);
  padding: var(--kind-space-4);
  border: 1px solid var(--kind-color-border);
  border-left: 4px solid var(--kind-color-warning);
  border-radius: var(--kind-radius);
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-3);
}
.kind-korrigera__confirm {
  padding: var(--kind-space-3);
  border: 1px solid var(--kind-color-warning);
  border-radius: var(--kind-radius);
  background: var(--kind-color-warning-bg);
}
.kind-korrigera__confirm p { margin: 0 0 var(--kind-space-2) 0; }

/* The Deaktivera button uses the destructive treatment without flipping to
   pure red (which would dominate the table visually). Border + text colour
   carry the affordance; the confirm dialog backs it up. Contrast checked:
   `--kind-color-error` on `--kind-color-surface` is 5.10:1 (AA pass). */
.kind-btn--danger {
  color: var(--kind-color-error);
  border-color: var(--kind-color-error);
}
.kind-btn--danger:hover {
  background: var(--kind-color-error-bg);
}
/* #371: ghost buttons inherit the carrier background. The normal error red
   falls to 4.42:1 on a muted row even while the button itself is not hovered.
   Keep the outline treatment, with a darker light-theme foreground; dark
   themes retain their existing error token. Filled danger buttons are separate. */
.kind-btn--ghost.kind-btn--danger {
  color: var(--kind-color-danger-ghost);
  border-color: var(--kind-color-danger-ghost);
}

/* #137: clinic-admin consistency warning and consequence confirmation. */
.kind-ansvarigvarning {
  margin-block: var(--kind-space-4);
}

.kind-ansvarigvarning__title {
  margin: 0 0 var(--kind-space-2);
  font-size: var(--kind-font-h3);
}

.kind-ansvarigvarning__list {
  display: grid;
  gap: var(--kind-space-3);
  margin-block: var(--kind-space-3);
  padding: 0;
  list-style: none;
}

.kind-ansvarigvarning__item {
  display: grid;
  gap: var(--kind-space-2);
  padding-block: var(--kind-space-3);
  border-block-start: 1px solid var(--kind-color-border);
}

.kind-ansvarigvarning__summary,
.kind-ansvarigvarning__actions,
.kind-ansvarigvarning__membership-form,
.kind-confirm-page__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--kind-space-2);
}

.kind-ansvarigvarning__membership-form {
  margin: 0;
  min-width: 0;
  max-width: 100%;
}

.kind-ansvarigvarning__membership-form .kind-btn,
.kind-ansvarigvarning__scope {
  max-width: 100%;
  overflow-wrap: anywhere;
}

.kind-ansvarigvarning__scope {
  flex-basis: 100%;
  margin: 0;
}

/* Self-tag rendered next to the current admin's own name. aria-label on the
   span gives SR users a fuller phrase ("Detta är ditt eget konto") than the
   inline "(du)" text. */
/* web#554: ett migrerat personalkonto vars kalladress saknade giltig
   e-postform laddas UTAN adress. Raden sager det med ord i stallet for ett
   tyst "—", sa klinik-admin ser att inloggningen behover kompletteras. */
.kind-table__saknas {
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
  font-style: italic;
}

.kind-table__self-tag {
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
  margin-left: var(--kind-space-2);
  font-weight: 500;
}

/* Audit metadata under a deactivated user's status badge. Renders only when
   the backend exposes inaktiverad_datum + inaktiverad_av_namn (defensive
   {% if u.inaktiverad_datum is defined %} in the template). */
.kind-table__audit-meta {
  display: block;
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
  margin-top: var(--kind-space-1);
}

/* ============ Wave 4: manual create-patient form (AT-60) ============
 * patient_ny.html uses a fieldset to group förnamn + efternamn as a single
 * logical "namn" input. The browser default fieldset border + legend would
 * look heavy next to the surrounding kind-fields, so we strip the chrome
 * and lean on the legend's typography only.
 */

.kind-fieldset {
  border: none;
  padding: 0;
  margin: 0;
}
.kind-field-group {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--kind-space-3);
}
@media (max-width: 600px) {
  .kind-field-group {
    grid-template-columns: 1fr;
  }
}
.kind-field__label--sub {
  font-weight: 500;
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
}
.kind-field__optional {
  font-weight: 400;
  color: var(--kind-color-text-muted);
  font-size: var(--kind-font-small);
  margin-left: var(--kind-space-1);
}

/* web#516: landsnumret för det valda landet står FRAMFÖR nummerfältet, som i
 * gamla KIND. Prefixet är presentation (aria-hidden vore fel: skärmläsaren ska
 * höra vilket landsnummer som gäller), men det är inte redigerbart — det följer
 * rullgardinen. Krymper inte: flex-shrink 0 så ett fyrsiffrigt landsnummer
 * (+1264) inte trycks ihop på 320px. */
.kind-telefon-rad {
  display: flex;
  align-items: stretch;
  gap: var(--kind-space-2);
}
.kind-telefon-rad__prefix {
  display: inline-flex;
  align-items: center;
  flex: 0 0 auto;
  padding: 0 var(--kind-space-3);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius-2, 4px);
  background: var(--kind-color-surface-muted, #f2f2f2);
  color: var(--kind-color-text);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.kind-telefon-rad__input {
  flex: 1 1 auto;
  min-width: 0;
}

/* ============ D10 clinician work queue (kö-landning) ============ */

/* The kö-landning (dashboard) leads with a prioritised list whose rows ARE
 * conversations, ordered akut > oläst > väntetid. The coarse counters sit in a
 * quiet strip BELOW the queue (.kind-ko__summary). */
.kind-ko { margin-bottom: var(--kind-space-6); }

/* CP-05 (#90): tätare band. Bannern är en varningsrad om EN sak, inte ett
   kort, så den behöver ingen kortpolstring; brief §4.3 "undvik stora kapslar
   som standardform". Uppmätt kostnad före: 61px vid 1280 och 158px vid 320
   xxlarge, inklusive marginalen. Färgen, kanten och texten är oförändrade,
   alltså är signalstyrkan det. */
.kind-ko__akut-banner {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--kind-space-1) var(--kind-space-2);
  margin: 0 0 var(--kind-space-2);
  padding: var(--kind-space-1) var(--kind-space-2);
  background: var(--kind-color-error-bg);
  color: var(--kind-color-error);
  border: 1px solid var(--kind-color-error);
  border-radius: var(--kind-radius);
  font-weight: 600;
}

/* ===================== AKUTBANNER-KOMPAKT:START ==========================
 * Akutbannerns kostnad vid MOBIL BREDD och STOR TEXTSKALA. Konsultbeslut
 * 2026-08-07 (utökat scope): mått 3:s 320-tak (664) är inte akut-kalibrerat,
 * och valet är att BANTA bannern i stället för att flytta ett andra tak för
 * samma banner (1280 normal har redan punktkravet 432, attributionsbevisat).
 *
 * ---- ATTRIBUTION FÖRST (e2e/diag-spak-banner.mjs, 320x664 xxlarge) -------
 *
 *   bannerhöjd 93,5 + marginal 12 = 105,50px, av en 664px hög viewport
 *     vaddering    6 + 6
 *     kant         2
 *     badgerad    37,5   ("BRÅDSKANDE", 169,89px bred, versal + 0,84px spärr)
 *     radgap       6
 *     textrad     36,0   ("1 brådskande ärende.", cirka 230px vid 24px)
 *   tillgänglig innehållsbredd: 246px
 *
 * ---- VARFÖR MÅLET INTE ÄR "ENRADIG", och det är en mätning ---------------
 *
 * Badgen (169,89) plus texten (cirka 230) plus kolumngapet (12) kräver 412px
 * av 246 tillgängliga. Även med badgen hårt komprimerad (gemener, ingen spärr,
 * 0.75rem, tightare vaddering, cirka 104px) och texten nedskalad till 0.875rem
 * (cirka 201px) blir summan 317px, alltså fortfarande över 246. EN rad är
 * aritmetiskt omöjlig vid 320px så länge bannern bär både en badge och en
 * informativ mening, och en mening som ryms på en rad vid 24px rymmer cirka 13
 * tecken. Målet här är därför UTFALLET (första patientradens y-position mot
 * mått 3:s tak), inte radantalet. Radantalet var medlet, taket är kravet.
 *
 * ---- VAD SOM INTE RÖRS --------------------------------------------------
 *
 * ORG-TALET. Persona-vårdpersonals P1-princip säger att organisationens
 * akuttal aldrig skalas ned eller göms, och det tvåledade talet
 * (agents#112c: "N i organisationen, varav M i dina verksamheter") är
 * patientsäkerhetsinformation. Ingen regel nedan rör text, DOM eller
 * synlighet: paketet ändrar TYPSKALA och KROM. Färgen, kanten och
 * error-tokenen är orörda, alltså är signalstyrkan det.
 *
 * ---- POSTERNA ----------------------------------------------------------
 *
 * B-1 bannerns typskala 1rem -> 0.875rem (24 -> 21px vid xxlarge, 17,5px vid
 *     xlarge, båda över husets 13px-golv). Vikt 600 och färg orörda.
 * B-2 radavstånd 1.5 -> 1.3. WCAG 1.4.12 rör ANVÄNDARSATT radavstånd; en
 *     lägre författarsatt är tillåten, och bannern får radbryta fritt så en
 *     användarhöjning ger HÖJD, aldrig klippning.
 * B-3 vaddering space-1 -> 2px och radgap 6 -> 2px.
 * B-4 bottenmarginal space-2 -> space-1.
 * B-5 badgen tappar versalisering och spärr i skopet och blir 0.8125rem (13px
 *     vid basroten, alltså EXAKT husets golv, 16,25px vid xlarge och 19,5px
 *     vid xxlarge). Talet är inte valt fritt: 0.75rem föll på husets egen
 *     `test_ingen_skarmtext_under_13px`, som löser rem mot BASroten och
 *     därmed läser 12px. Den vakten har rätt på sina egna premisser (regeln
 *     kan läsas utanför sitt skalskop), så golvet höjs i stället för att
 *     vakten mjukas upp. Ordet
 *     står kvar oförändrat i DOM och läses likadant av skärmläsare; det är
 *     dess RENDERING som komprimeras. Versaler plus spärr kostade cirka 45 %
 *     av badgens bredd och versal text är dessutom långsammare att läsa för
 *     den målgrupp den här ytan har.
 *
 * Skopat till mobil bredd OCH xlarge/xxlarge, alltså samma skop som
 * headerbudget-spaken. Desktop (1280 normal, akut-punktkravet 432) och normal
 * textskala är per konstruktion 0 diffar.
 *
 * Vakt: tests/test_akutbanner_kompakt_css.py. Utfall: e2e/cp05-patientlista-
 * utfall.mjs --tillstand=akut.
 * ---------------------------------------------------------------------- */
@media (max-width: 719.98px) {
  html[data-kind-font-scale="xlarge"] .kind-ko__akut-banner,
  html[data-kind-font-scale="xxlarge"] .kind-ko__akut-banner {
    font-size: var(--kind-font-small);
    line-height: 1.25;
    gap: 2px var(--kind-space-2);
    padding: 2px var(--kind-space-2);
    margin-bottom: var(--kind-space-1);
  }
  html[data-kind-font-scale="xlarge"] .kind-ko__akut-banner .kind-badge--akut,
  html[data-kind-font-scale="xxlarge"] .kind-ko__akut-banner .kind-badge--akut {
    font-size: 0.8125rem;
    line-height: 1.15;
    letter-spacing: normal;
    text-transform: none;
    padding: 0 var(--kind-space-1);
  }
}
/* ===================== AKUTBANNER-KOMPAKT:SLUT =========================== */

/* V2-5 assignment filter (D13): a segmented Mina/Avdelningen control. Built
 * from GET links (no JS); the active filter is a filled pill, the inactive one
 * an outlined pill. Both meet the 44px touch-target floor (WCAG 2.2 2.5.8) via
 * the padding, and carry a visible focus ring for keyboard users. */
.kind-ko__filter {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--kind-space-2);
  margin: 0 0 var(--kind-space-4);
}
.kind-ko__filter-label {
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
  font-weight: 600;
}
/* CP-02-resten (#87): filterpillret är en KONTROLL (en <a> som beter sig som en
   knapp, med eget hover- och fokustillstånd), så kanten är funktionell per
   kind.css §1 WATCH-ITEM 1. Det inaktiva pillret hade annars bara sin vita
   fyllning mot arbetsytan, 1.07:1, att synas med. */
.kind-ko__filter-btn {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: var(--kind-space-2) var(--kind-space-4);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius-pill);
  background: var(--kind-color-surface);
  color: var(--kind-color-text);
  text-decoration: none;
  font-weight: 600;
}
.kind-ko__filter-btn:hover { background: var(--kind-color-surface-muted); }
.kind-ko__filter-btn:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}
.kind-ko__filter-btn--active {
  background: var(--kind-color-accent);
  color: var(--kind-color-surface);
  border-color: var(--kind-color-accent);
}
.kind-ko__filter-btn--active:hover { background: var(--kind-color-accent); }

/* Akut breakthrough notice (Mina view): a quiet warning-tinted strip naming
 * the safety net when an akut row is shown despite the Mina filter. */
.kind-ko__genombrott {
  margin: 0 0 var(--kind-space-4);
  padding: var(--kind-space-2) var(--kind-space-3);
  background: var(--kind-color-warning-bg);
  color: var(--kind-color-warning);
  border: 1px solid var(--kind-color-warning);
  border-radius: var(--kind-radius);
  font-size: var(--kind-font-small);
}

.kind-ko__list {
  list-style: none;
  margin: 0 0 var(--kind-space-4);
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-2);
}

/* web#565 punkt 6-7: listans SISTA RAD, "Lägg till ny patient" (gamla KIND
 * mod/3032, mod/3052). Raden är INTE en patientrad och bär därför medvetet
 * ingen `.kind-ko__item`-stil: ingen akutkant, ingen ohanterat-markör, ingen
 * radlänksdensitet (#90). Den ska läsas som listans avslutning, alltså en
 * streckad kontur -- husets vanliga konvention för "här kan något nytt
 * tillkomma" -- och aldrig konkurrera med sidhuvudets primärknapp eller med
 * patientraderna om blicken (§4.3, EN primär handling per område).
 *
 * Kanten är `--kind-color-border-strong` (6.18:1 mot vitt, 5.76:1 mot sidytan),
 * alltså den FUNKTIONELLA kanttoken, inte den dekorativa mjuka: konturen är
 * det enda som avgränsar raden och måste överleva gråskala.
 *
 * 44px-golvet ligger på länken, som fyller hela raden, samma mönster som
 * `.kind-ko__row-link`. */
.kind-ko__lagg-till {
  border: 1px dashed var(--kind-color-border-strong);
  border-radius: var(--kind-radius);
  background: transparent;
  display: flex;
}
.kind-ko__lagg-till-lank {
  flex: 1 1 auto;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--kind-space-2);
  min-height: 44px;
  padding: var(--kind-space-2) var(--kind-space-3);
  color: var(--kind-color-accent);
  font-weight: 600;
  text-decoration: none;
}
.kind-ko__lagg-till-lank:hover,
.kind-ko__lagg-till-lank:focus-visible {
  text-decoration: underline;
}
/* Tomtillståndets variant (punkt 7): raden står ensam i sin lista inuti
 * tomrutan, så listan ska inte bära radlistans bottenmarginal. */
.kind-ko__list--endast-lagg-till {
  margin-bottom: var(--kind-space-3);
}
/* CP-02-resten (#87). Patientraden i arbetskön är precis det exempel
   designregeln i kind.css §6 namnger ("a patient row"): hela raden är en länk
   (.kind-ko__row-link nedan fyller <li>:t), så radens kant är funktionell och
   inte dekoration. Raden har heller ingen skugga, så före den här ändringen
   bars avgränsningen enbart av vit fyllning mot #F5F7FA, 1.07:1, med en
   hairline på 1.30:1 ovanpå. Kanten ligger på <li>:t och inte på länken, för
   det är li:t som ritar ytan och radien. */
/* CP-05 (#90): raden är EN flexrad, länken och åtgärderna sida vid sida.
   Åtgärdsblocket låg tidigare UNDER länken och kostade 56px på varje rad
   (44px knapp plus 12px botten), vilket är 29 procent av radens 193px utan att
   bära någon information. Sida vid sida kostar det noll extra höjd så länge
   knappen ryms inom textblockets höjd. Under 601px lindar det ned igen, se
   media-blocket längre ned. */
.kind-ko__item {
  /* #236 (K32): radens vänsterkant är en LANE med TVÅ hyllor, och båda talen
     bor här så de inte kan drifta isär.
       --kind-ko-kantbredd  radens EGEN vänsterkant (1px normalt, 4px akut)
       --kind-ko-kantlane   den BREDASTE kanten någon radvariant kan ha
     Markören nedan (.kind-ko__item--ohanterad::before) positioneras mot
     PADDINGBOXEN, som börjar efter kanten. Läser markören `inset-inline-start:
     0` hoppar den därför i sidled när kanten byter bredd, se kommentaren vid
     --ohanterad. Håll de två i synk: höjs akutkanten ska --kind-ko-kantlane
     höjas i samma ändring, annars äter markören in i akutkanten. */
  --kind-ko-kantbredd: 1px;
  --kind-ko-kantlane: 4px;
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border);
  border-left-width: var(--kind-ko-kantbredd);
  border-radius: var(--kind-radius);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  /* #236: containing block för ohanterat-markören. Raden har inga andra
     absolutpositionerade avkomlingar (svept 2026-08-17), så detta flyttar
     ingenting. */
  position: relative;
}
/* Akut row: a left accent bar + error-tinted surface so an urgent item is
 * unmistakable at a scan, on top of the badge. The whole row is the link. */
.kind-ko__item--akut {
  border-color: var(--kind-color-error);
  /* Var `border-left-width: 4px` fram till #236. Talet är oförändrat, det bor
     numera i variabeln så ohanterat-markören kan räkna med det. Renderingen av
     en akut rad är IDENTISK före och efter. */
  --kind-ko-kantbredd: 4px;
}

/* #236 (K32), variant B ur `docs/design-proposals/236/BESLUT.md` (konsultbeslut
 * 2026-08-17): OHANTERAT får en egen visuell bärare. Före ändringen bar bara det
 * HANTERADE läget en markör (`✓ Hanterad` i metagruppen) och det ohanterade
 * ingenting alls, alltså lästes en frånvaro som ett påstående.
 *
 * BÄRAREN ÄR FÖREKOMST AV EN GRAFIK, INTE EN KULÖR (WCAG 2.2 SC 1.4.1): raden
 * har en kantmarkör eller inte, vilket överlever gråskala och varje
 * färgseendevariant. Tokenet är husets FUNKTIONELLA kanttoken
 * (--kind-color-border-strong, 6.18:1 mot vitt och 5.76:1 mot sidytan), aldrig
 * den dekorativa --kind-color-border-soft, som saknar kontrastkrav och skulle
 * falla på SC 1.4.11 (kind.css §1 WATCH-ITEM 1). Ordet `ej hanterad` i radens
 * `aria-label` bär samma uppgift för den som inte ser skärmen (SC 2.5.3).
 *
 * ::before OCH INTE border-inline-start: en riktig kant hade tvingat radens
 * vaddering att absorbera 4px, alltså en andra plats där ett tal kan drifta.
 * Pseudoelementet kostar NOLL i layouten (uppmätt 0,00px listhöjdsdelta i
 * samtliga fem mätlägen, BESLUT.md §7.1), och kan därför inte flytta en enda
 * bokstav på den yta där CP-05 och CP-14 nyss köpte utrymme dyrt.
 *
 * 3PX-HOPPET, ÅTGÄRDAT OCH INTE BOKFÖRT (konsultvillkor 2026-08-17). Mocken
 * satte `inset-inline-start: 0`, alltså markörens vänsterkant mot PADDINGBOXEN.
 * Paddingboxen börjar efter radens kant, som är 1px normalt och 4px på en akut
 * rad, så markören började på x = 1 respektive x = 4 räknat från radens
 * ytterkant: en 3px förskjutning i sidled STYRD AV ETT ANNAT TILLSTÅND än det
 * markören bär. Det underminerar hela skälet att välja variant B, som är att en
 * kolumn av kanter läses föruppmärksamt i ett ögonkast. Åtgärden RESERVERAR
 * lanen: markören dras in med skillnaden mellan lanen och radens faktiska kant,
 * alltså ligger dess vänsterkant på x = --kind-ko-kantlane i BÅDA lägena.
 * Mönstret är kö-rälsens (.kind-arbetsvy__ko-item), som aldrig haft problemet
 * eftersom den reserverar sin lane med `border-left: 3px solid transparent` och
 * bara byter FÄRG per tillstånd. Akutkanten är oförändrad och skrivs aldrig
 * över: på en akut ohanterad rad står 4px error-kant och därefter 4px markör.
 *
 * LTR-NOT: radens kant sätts fysiskt (`border-left-width`, husets konvention
 * här och på rälsen) medan markören sätts logiskt. Produkten är sv-SE plus en,
 * alltså LTR-only; införs ett RTL-språk ska de två skrivas i samma system.
 *
 * Markören är ALDRIG interaktiv (`pointer-events: none`): raden har redan en
 * radlänk och en knapp, och en tredje träffyta inuti en radlänk vore både en
 * SC 2.5.8-risk och en genväg till oavsiktlig klarmarkering i en klinisk lista.
 * Ingen `aria-live` och ingen `role="status"`: tillståndet finns från
 * sidladdning och är ingen händelse. */
.kind-ko__item--ohanterad::before {
  content: "";
  position: absolute;
  inset-block: 0;
  inset-inline-start: calc(var(--kind-ko-kantlane) - var(--kind-ko-kantbredd));
  inline-size: 4px;
  background: var(--kind-color-border-strong);
  border-start-start-radius: inherit;
  border-end-start-radius: inherit;
  pointer-events: none;
}

.kind-ko__row-link {
  flex: 1 1 15rem;
  min-width: 0;
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--kind-space-1) var(--kind-space-3);
  padding: var(--kind-space-2) var(--kind-space-3);
  /* #113 punkt 3: raden var 40px pa koposter dar metaraden ryms pa samma rad
     som namnet (4px under husets 44px-golv, WCAG 2.5.8 ar miniminivan, inte
     malet). min-height lyfter golvet; align-content centrerar radboxen
     vertikalt nar innehallet ar lagre an 44px (paverkar inget flerradslage,
     dar innehallet redan fyller hojden). Forvantat pris: +4px per rad utan
     forhandsvisning, redovisat i CP-05-tathetsutfallet. */
  min-height: 44px;
  align-content: center;
  text-decoration: none;
  color: var(--kind-color-text);
  border-radius: var(--kind-radius);
}
.kind-ko__row-link:hover { background: var(--kind-color-surface-muted); }
.kind-ko__row-link:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}

.kind-ko__primary {
  display: inline-flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--kind-space-2);
}
.kind-ko__namn { font-weight: 600; }

/* web#467: OHANTERAT-BUBBLAN ("pluppen") i patientradens primärgrupp.
 *
 * VARFÖR DEN FINNS. Kundens testrapport (Vård 2.3.6-w32 punkt 20, omprövad
 * 2026-09-21) begär att bubblan kommer tillbaka på raden när "Ångra
 * klarmarkering" trycks i chatten, och beställaren avgjorde 2026-09-25 att vi
 * bygger just det (alternativ B): i kundens befintliga produkt BETYDER en plupp
 * på raden att patienten är ohanterad. Beslutet ersätter ADR-063 P2-6 och
 * konsultbeslutet 2026-08-19 för den här signalen.
 *
 * DEN ADDERAS TILL BRICKAN OCH ERSÄTTER DEN INTE. En naken form har inget
 * tillgängligt namn (WCAG 2.2 SC 1.4.1 och 2.5.3), så ordet "Ej hanterad" står
 * kvar som bärare och bubblan är en FÖRSTÄRKNING. Kostnaden är erkänd och inte
 * dold: den tyngsta raden (brådskande OCH ohanterad) bär nu tre visuellt
 * dominerande statuselement i stället för två, alltså över CP-05:s
 * ursprungliga budget. Beställaren skrev ut det i samma beslut ("Budgeten i
 * CP-05 anpassas efter det här och får inte stoppa det"), och utfallsgrindarnas
 * tal är höjda i SAMMA ändring i stället för att lämnas kvar och mäta mot en
 * regel produkten inte längre följer.
 *
 * TOKENET ÄR SAMMA SOM DE TVÅ ANDRA KANALERNA. --kind-color-border-strong bär
 * redan #236:s kantmarkör och agents#414:s bricka för exakt det här
 * tillståndet, alltså talar de tre kanalerna med samma röst och ingen ny kulör
 * införs i produkten. Kontrast mot ytan (SC 1.4.11 kräver >= 3:1 för en
 * meningsbärande grafik): 6,18:1 i ljust tema, 5,76:1 mot sidytan, 6,64:1 i
 * mörkt (#9BA6B4 på #1A2028), och rent svart respektive vitt i de två
 * högkontrastlägena. Talen är RÄKNADE ur tokenvärdena i kind.css, inte mätta i
 * webbläsare; det stängande beviset är utfallsgrinden.
 *
 * FORCED COLORS. Ett forced-colors-läge nollar background-color och hade därmed
 * tagit bort hela signalen, eftersom bubblan ÄR sin fyllning. Systemfärgen
 * CanvasText är den enda som garanterat följer användarens egen palett, och
 * bubblans mening står ändå i ordet bredvid, så förlusten är inte total ens om
 * regeln skulle sluta gälla.
 *
 * STORLEK OCH LAYOUT. 14px, alltså inom radens befintliga texthöjd:
 * primärgruppen är en `inline-flex` med `align-items: center` och radhöjden
 * sätts av brickan, så bubblan kostar noll extra höjd på den yta CP-05 och
 * CP-14 nyss köpte utrymme dyrt på. `flex: 0 0 auto` så den aldrig krymper till
 * en oval när raden trängs.
 *
 * ALDRIG INTERAKTIV (`pointer-events: none`), av samma skäl som kantmarkören:
 * raden har redan en radlänk och en knapp, och en tredje träffyta inuti en
 * radlänk vore både en SC 2.5.8-risk och en genväg till oavsiktlig
 * klarmarkering i en klinisk lista. Ingen `aria-live` och ingen `role`:
 * tillståndet finns från sidladdning och är ingen händelse. */
/* web#605 (beställarkrav 2026-09-25): BUBBLAN ÄR EN SIFFERBRICKA, inte en
 * naken plupp, och den ligger LÄNGST TILL HÖGER på raden. Issuen omprövar
 * uttryckligen formen web#467 valde fem dagar tidigare (samma beställare,
 * senare beslut); härledningen av FÖREKOMSTEN är oförändrad, se mallen.
 *
 * `margin-inline-start: auto` är det som håller bubblan höger även när
 * `.kind-ko__row-link` radbryter: `space-between` räcker bara så länge alla tre
 * barnen ligger på samma rad, och vid 320px gör de inte det.
 *
 * STORLEK. 18px golv i stället för web#467:s 14px, eftersom en bricka nu måste
 * rymma en SIFFRA läsbart; `min-inline-size` plus `padding-inline` gör att ett
 * ensiffrigt tal ger en rund bricka och ett tre- eller fyrsiffrigt växer i
 * bredd till en pillerform i stället för att klippa talet (acceptansens punkt om
 * 100 eller fler olästa). `border-radius: 999px` i stället för 50%: 50% på en
 * bredare bricka ger en ellips med urholkade ändar.
 *
 * `--bred` är INGEN breddsättning, den sänker bara teckenstorleken ett steg för
 * tresiffriga tal så att pillret inte äter radens högermarginal. Bredden
 * kommer ur innehållet, alltså kan ett fyrsiffrigt tal inte klippas heller.
 *
 * FÄRGERNA. `--min` = kundens accentfärg med vit siffra, `--annan` = ljusgrå med
 * svart siffra, ordagrant gamla KIND. `--kind-color-text-on-accent` är husets
 * token för läsbar text på en fylld accentyta (#FFFFFF i mörkt/högkontrast),
 * alltså är kontrasten temastyrd i stället för hårdkodad vit. Färgen är aldrig
 * ensam bärare av "min vs andras" -- ansvarigslotten bär samma uppgift i text på
 * varje rad (ADR-047 #11, agents#177), se noten i mallen.
 *
 * FORCED COLORS. Ett forced-colors-läge nollar background-color, så bubblan
 * skulle tappa sin fyllning helt. Siffran själv överlever (den är text, inte en
 * fyllning), och kanten ger brickan tillbaka sin form; de två färgerna kollapsar
 * då till en enda, vilket är korrekt: användarens egen palett vinner, och
 * mina-vs-andras står ändå i text på raden.
 *
 * ALDRIG INTERAKTIV (`pointer-events: none`), av samma skäl som web#467:s plupp:
 * raden har redan en radlänk, och en andra träffyta inuti den vore en SC
 * 2.5.8-risk i en klinisk lista. Ingen `aria-live` och ingen `role`:
 * tillståndet finns från sidladdning och är ingen händelse. */
.kind-ko__plupp {
  flex: 0 0 auto;
  margin-inline-start: auto;
  align-self: center;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-inline-size: 18px;
  block-size: 18px;
  padding-inline: 5px;
  border-radius: 999px;
  font-size: var(--kind-font-small);
  font-weight: 600;
  line-height: 1;
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  pointer-events: none;
}
.kind-ko__plupp--min {
  background: var(--kind-color-accent);
  color: var(--kind-color-text-on-accent);
}
.kind-ko__plupp--annan {
  background: var(--kind-color-surface-muted);
  color: var(--kind-color-text);
}
.kind-ko__plupp--bred {
  /* web#991: var 0.6875rem = 11px, under husets 13px-golv (briefen §4.2).
     Överskrivningen står KVAR: 13px ligger fortfarande ett steg under basens
     --kind-font-small (14px), alltså bevaras steget ovan, medan en borttagen
     deklaration hade gjort --bred identisk med basregeln. */
  font-size: 0.8125rem;
  padding-inline: 6px;
}
@media (forced-colors: active) {
  .kind-ko__plupp,
  .kind-ko__plupp--min,
  .kind-ko__plupp--annan {
    background: Canvas;
    color: CanvasText;
    border: 1px solid CanvasText;
  }
}

/* web#605: radens datum i fetstil när det finns olästa. Bäraren är VIKT, inte
 * färg: `--kind-color-text` är metagruppens muted-färg mättad till husets
 * vanliga textfärg, alltså samma neutrala kroma CP-05 redan godkände för
 * `kind-ko__ansvarig--otilldelad`, så raden får ingen ny kromatisk status. */
.kind-ko__meta-text--olast {
  font-weight: 600;
  color: var(--kind-color-text);
}

/* ADR-047 (#11) responsible-clinician carrier on andras rows. Mirrors
 * .kind-arbetsvy__ko-ansvarig: muted small text, so it reads consistently with
 * the arbetsvy rail. Muted text-on-surface stays >= 4.5:1
 * (var --kind-color-text-muted).
 *
 * CP-05 (#90): `flex-basis: 100%` är BORTA. Den tvingade en egen radhöjd (21px
 * plus 8px lucka) i varje rad som inte var min, och samma sak gjorde
 * .kind-ko__epost. Två sådana element gav alltså 58px per rad enbart i
 * radbrytning. Uppgiften är kvar, den flödar nu i metagruppen. */
.kind-ko__ansvarig {
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
}
/* agents#190: DIN EGEN rad. Kunden markerar den BLÅ; konsultbeslutet 2026-08-12
 * är enhetlig FORM men vår färgsättning, alltså bär vi den med VIKT och full
 * textfärg i stället för kroma. Exakt samma två deklarationer som
 * otilldelad-markeringen nedan, och det är avsiktligt: CP-05:s budget på max två
 * dominerande statuselement per rad är redan full på tyngsta raden (mätt till 2
 * på samtliga tio mätpunkter i #177), så ett tredje kromatiskt element hade
 * spräckt den. `--kind-color-text` har kroma 11 i ljust tema, 9 i mörkt och 0 i
 * högkontrast, alltså under CP-05:s gräns på 30 i alla fyra teman.
 *
 * ATT DE TVÅ SER LIKADANA UT ÄR INTE EN MISS. Det som skiljer "din" från
 * "ingens" är ORDEN i slotten, ett namn respektive "Ej tilldelad", och det är
 * just den ordningen WCAG 2.2 1.4.1 kräver: markören bärs av text, vikten är
 * förstärkning. Vakten är
 * `tests/test_admin_ko_landning_render.py::test_ansvarigslotten_bars_av_ORD_inte_av_farg_eller_vikt`,
 * som läser slottens text med all presentation borttagen. */
.kind-ko__ansvarig--dig {
  color: var(--kind-color-text);
  font-weight: 600;
}
/* agents#177: OTILLDELAD är ett eget tillstånd ("Ej tilldelad"), inte ett ord
 * inne i "Ansvarig: ...". Kundens lösning markerar det ORANGE; vi gör det
 * ICKE-KROMATISKT, se radmallens kommentar för mätningen bakom det beslutet
 * (CP-05:s budget på max två dominerande statuselement per rad är redan full på
 * tyngsta raden, och kromatisk text räknas in i den).
 *
 * De två bärarna är vikt och full textfärg i stället för dämpad. Båda är
 * neutrala: `--kind-color-text` har kroma 11 i ljust tema (#20252B), 9 i mörkt
 * (#E8ECF1) och 0 i högkontrast (#000000/#ffffff), alltså under CP-05:s
 * kroma-gräns på 30 i samtliga fyra teman. Texten är den egentliga bäraren
 * (WCAG 2.2 1.4.1); vikt och färg är förstärkning. */
.kind-ko__ansvarig--otilldelad {
  color: var(--kind-color-text);
  font-weight: 600;
}

.kind-ko__meta {
  display: inline-flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0 var(--kind-space-3);
  color: var(--kind-color-text-muted);
  font-size: var(--kind-font-small);
}
/* CP-05 (#90): `white-space: nowrap` låg på HELA metatexten, så frasen
   "Väntat sedan 2026-06-17 08:15" blev en obrytbar 376px-remsa och sköt ut
   sidan 102px horisontellt vid 320px xxlarge (utfallskontraktets mått 6, tak
   0). Skyddet flyttas till TIDSSTÄMPELN, som är det enda som faktiskt inte får
   brytas mitt itu; frasen framför den får radbrytas som vanlig text. */
.kind-ko__meta-text { overflow-wrap: anywhere; }
.kind-ko__meta-text > time { white-space: nowrap; }
/* web#1102: personnumret (ÅÅÅÅMMDD-NNNN, cirka 13 tecken) och mobilnumret får
   inte brytas vid bindestrecket eller mitt i siffrorna; ett delat nummer läses
   lätt fel. Samma skydd som tidsstämpeln, bara på själva numret. */
.kind-ko__identitet { white-space: nowrap; }
/* Brief §7.1 nivå 3, "ansvarig och hanterad". Klarmarkeringen var en fylld
 * success-bricka, alltså visuellt likvärdig med "Brådskande". Här är den
 * neutral text; bäraren är ORDET plus bocken, aldrig färgen (WCAG 2.2 1.4.1),
 * och en halvfet vikt räcker för att skilja den från väntetiden bredvid. */
.kind-ko__hanterad { font-weight: 600; }
/* `.kind-ko__meta-text--dig` LÅG HÄR och bar "Tilldelad dig". agents#190 slog
 * ihop de tre ansvarigtillstånden till en slot, så klassen har ingen bärare kvar
 * i någon mall och regeln är borttagen i stället för lämnad som död kod.
 * `e2e/lista177-utfall.mjs` nämner selektorn i sitt ELLER-uttryck för M177f och
 * i mutationen `ansvarig-bort`; båda träffar numera via `.kind-ko__ansvarig`,
 * som alla tre tillstånden bär, alltså behövde mätaren inte ändras. */

/* #11 (V2-KO-HANTERAD-ARBETSVY-VP): klarmarkera affordance ON the queue row.
 * The actions block is a SIBLING of the row-open link inside the .kind-ko__item
 * <li>, so it sits below the link and the big row click still opens the
 * work-view. Right-aligned, separated by a soft top border so it reads as a
 * row action, not part of the link. */
.kind-ko__row-actions {
  flex: 0 0 auto;
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  align-items: center;
  gap: var(--kind-space-2);
  padding: var(--kind-space-2) var(--kind-space-3);
}
.kind-ko__handled-form { margin: 0; }

/* web#1040 (#983 punkt 4): "Bjud in" / "Skicka igen" pa patientraden. EGEN
 * grupp, syskon till radlanken inne i .kind-ko__item, sa den lindar under
 * lanken pa smal skarm (320 px, web#897) i stallet for att tranga in sig i
 * radlankens rad. Ateranvander inte .kind-ko__row-actions (K15 punkt 18/19).
 * Knappen ar .kind-btn--sm: 44 px min-hojd bevarad (WCAG 2.2 SC 2.5.8). */
.kind-ko__inbjudan-atgard {
  flex: 0 0 auto;
  display: flex;
  justify-content: flex-end;
  align-items: center;
  padding: 0 var(--kind-space-3) var(--kind-space-2);
}

/* Compact button variant for the in-row action: smaller font + tighter
 * horizontal padding, but the 44px MIN-HEIGHT touch target is preserved
 * (WCAG 2.2 SC 2.5.8 target size; the patient/clinician surface skews older).
 * Only the horizontal footprint shrinks so it fits a dense queue row. */
.kind-btn--sm {
  font-size: var(--kind-font-small);
  padding-top: var(--kind-space-2);
  padding-bottom: var(--kind-space-2);
  padding-left: var(--kind-space-4);
  padding-right: var(--kind-space-4);
  min-width: 0;
}

/* Akut badge: error palette, matching the unread badge contrast (light
 * --kind-color-error on --kind-color-error-bg, above 4.5:1 per the token guard). */
.kind-badge--akut {
  background: var(--kind-color-error-bg);
  color: var(--kind-color-error);
  border-color: var(--kind-color-error);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

/* PRIORITY 2 (V2-KÖ): an AKUT triage routing in the patientdata-panel must be
 * spottable at a glance, not a small badge among neutral rows. An akut-routed
 * formulärsvar gets the SAME error-tinted left-accent treatment as an akut
 * arbetskö row (.kind-ko__item--akut) so the two surfaces read consistently.
 * The badge + the "Akut" text carry the meaning for non-colour users (WCAG 2.2
 * 1.4.1); the tint is a redundant scanning aid. Contrast: text stays on the
 * default surface inside the tinted row (the tint is light enough that the body
 * --kind-color-text keeps >4.5:1 in both themes, same basis as
 * .kind-ko__akut-banner which already tints with these tokens). */
.kind-triage--akut {
  border-left: 4px solid var(--kind-color-error);
  background: var(--kind-color-error-bg);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-3);
}
.kind-triage--akut .kind-triage__resultat { color: var(--kind-color-error); }

/* CP-15 (#100), mått 6 på patientsidan: ett svenskt sammansatt ord kan inte
 * brytas på mellanslag, och blir därmed golvet för hela spårets min-content.
 *
 * UPPMÄTT 2026-08-05 vid 320x664 xxlarge: mottagningsnamnet
 * "Rökavvänjningsmottagningen" (26 tecken, ett ord) renderades 334px brett i en
 * 320px viewport och gav 57px horisontell skroll på HELA dokumentet. Samma sak
 * för uppladdade filnamn ("E2E Dokument e2e1782336936587.png"), där tokenet är
 * maskingenererat och godtyckligt långt.
 *
 * `anywhere` och inte `break-word`: bara `anywhere` räknas in i min-content, och
 * det är min-content som avgör om ett grid-spår kan krympa. `break-word` hade
 * sett rätt ut i en vanlig rad men lämnat spårbreddsproblemet kvar.
 * Avkortas gör ingenting, texten radbryts, så mått 6:s andra dimension
 * (avkortad text) påverkas inte.
 *
 * ====== ISSUE #155: `.kind-team-chat-list__titel` TILLAGD 2026-08-16 ========
 *
 * Kommentaren ovan beskriver mekanismen korrekt och FULLSTÄNDIGT, men regeln
 * täckte bara `.kind-list__item strong`. Det är regel 27 korollarium 2 punkt b
 * ordagrant: en kommentar som förklarar mekanismen rätt är ett kvitto på att
 * någon förstått den och tillämpat den SMALT, alltså ett frö för variantanalys
 * och inte ett bevis på att saken är hanterad. Ingen svepte efter fler bärare.
 *
 * BÄRAREN ÄR EN `span`, INTE EN `strong`, och det är hela skälet till att den
 * överlevde. `.kind-team-chat-list__titel` är kollegie-chattradens rubrik, ett
 * flexitem i `.kind-team-chat-list__main`, och den bär exakt samma ordklass som
 * CP-15:s egen mätning: ett svenskt sammansatt ord utan mellanslag.
 *
 * UPPMÄTT 2026-08-16, kollegor-ytan i tyngsta rimliga tillstånd, 320x664
 * xxlarge, via `e2e/a11y816-minsvep.mjs`:
 *
 *   span.kind-team-chat-list__titel  "Vaccinationsmottagningen" (24 tecken)
 *     min-content 293px i ett spår på 198px, alltså 95px utanför föräldern
 *   li.kind-list__item.kind-team-chat-list__item  golvad till 367px
 *   main.kind-main                                golvad till 415px
 *   dokumentet                                    34px horisontell skroll
 *
 * Kedjan är alltså EN bärare som golvar tre förfäder. Efter fixen: 0px.
 *
 * VARFÖR ISSUE #155:s EGEN DIAGNOS INTE ANVÄNDES (regel 38 korollarium).
 * Issuen pekar ut `span.kind-deltagare__roll` med `flex: none`, fem instanser
 * à 173px. Observationen (30px skroll på ytan vid 320/xxlarge) REPRODUCERADES,
 * 34px i vårt tyngre tillstånd, men diagnosen höll inte vid ommätning: badgen
 * ligger 104px INNANFÖR viewportkanten, eftersom #158 gav
 * `.kind-deltagare__label` sin `flex-wrap: wrap` och badgen sedan dess radbryts
 * till egen rad i stället för att bredda raden. Rapportens observation, dess
 * diagnos och dess föreslagna åtgärd är tre olika evidensnivåer, och här
 * överlevde bara den första.
 *
 * VARFÖR `anywhere` OCH INTE `min-width: 0` PÅ ITEMET. Uppmätt, inte resonerat,
 * tre kandidater på samma mätpunkt:
 *
 *   overflow-wrap: anywhere            34px -> 0px   (höjd 5240 -> 5276)
 *   min-width: 0                       34px -> 34px  OFÖRÄNDRAT
 *   min-width: 0 + break-word          34px -> 0px   (höjd 5240 -> 5276)
 *
 * `min-width: 0` ensamt låter BOXEN krympa men ordet kan fortfarande inte
 * brytas, så bläcket målas utanför boxen och dokumentet skrollar precis lika
 * mycket. Det är samma sak kommentaren ovan redan säger om `break-word` mot
 * min-content, sett från andra hållet, och det är skälet att kandidaten mättes
 * i stället för att avfärdas. Priset på den andra axeln är 36px höjd på en yta
 * som är 5240px hög, alltså 0,7 procent, och det redovisas här eftersom ett
 * endimensionellt mått annars flyttar felet i stället för att lösa det. */
.kind-triage__resultat,
.kind-list__item strong,
.kind-team-chat-list__titel { overflow-wrap: anywhere; }

/* The summary strip below the queue: a quiet section divider above the old
 * coarse counters so the eye reads queue-first, context-second. */
.kind-ko__summary {
  border-top: 1px solid var(--kind-color-border-soft);
  padding-top: var(--kind-space-5);
}

/* V2-6 (D15-rest): the klinik-admin egenkontroll / loggkontroll card. A
 * distinct panel (surface bg + a left accent bar) so the verksamhetschef's PDL
 * oversight is tydligt nåbar, not buried in a nav menu (persona-klinik-admin).
 * Klinik-admin only (gated in the template; the route keeps the real boundary).
 * The bg stays the white surface (NOT the accent wash) so the outlined
 * .kind-btn--secondary inside keeps its 5.34:1 accent text against white; on the
 * accent wash that text drops to 3.93:1 and fails WCAG 2.2 1.4.3 (verified
 * 2026-06-17 against the live computed contrast). */
.kind-ko__egenkontroll {
  margin-top: var(--kind-space-5);
  padding: var(--kind-space-4);
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border-soft);
  border-left: 4px solid var(--kind-color-accent);
  border-radius: var(--kind-radius);
}
.kind-ko__egenkontroll .kind-actions-row { margin-top: var(--kind-space-3); }

/* ============ ADR-063 (V2 patientlista-enkelsida) ============ */

/* Mina/Alla flikar: a <nav> + aria-current pair of links (NOT role="tab", see
 * the design spec's WAI-ARIA APG Tabs Pattern rationale), styled as an
 * underlined tab strip. The active tab's marker is text (weight + colour) +
 * a structural border, never colour alone (WCAG 2.2 1.4.1). Two tabs always
 * fit at 320px without a scroll container. */
/* CP-05 (#90): tätare flikrad. `min-height: 44px` (WCAG 2.2 2.5.8) och
   3px-markören är ORÖRDA, det är luckan och marginalen runt dem som krympt. */
.kind-patientlista__tabs {
  display: flex;
  gap: var(--kind-space-4);
  margin: 0 0 var(--kind-space-2);
  border-bottom: 1px solid var(--kind-color-border-soft);
}
.kind-patientlista__tab {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: var(--kind-space-1);
  color: var(--kind-color-text-muted);
  text-decoration: none;
  font-weight: 600;
  border-bottom: 3px solid transparent;
  margin-bottom: -1px;
}
.kind-patientlista__tab:hover { color: var(--kind-color-text); }
.kind-patientlista__tab:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: var(--kind-focus-ring-offset);
}
.kind-patientlista__tab--active {
  color: var(--kind-color-accent);
  border-bottom-color: var(--kind-color-accent);
}

/* Discreet klinik-admin wayfinding link to the botten-av-sidan Översikt +
 * loggkontroll section (persona-klinik-admin P1 fynd 2). Small + muted so it
 * reads as a secondary affordance, not competing with the H1 or the tabs. */
.kind-patientlista__wayfinding {
  margin: 0;
  font-size: var(--kind-font-small);
}
.kind-patientlista__wayfinding a { color: var(--kind-color-text-muted); }

/* The Alla-flik diskret sorteringsval (persona-klinik-admin P1 fynd 3). Reuses
 * the muted .kind-list__meta text size; no new visual weight needed, it is an
 * opt-in, not a primary control. */
.kind-patientlista__sort { margin: 0; }

/* ---------------------------------------------------------------------------
 * CP-05 (#90) VERKTYGSRADEN.
 *
 * Sökfältet, statusfiltret, sorteringsvalet, räknaren och wayfinding-länken
 * låg som fem STAPLADE block med var sin marginal ovanför patientlistan.
 * Uppmätt kostnad före: 284px av desktopens 550px till första patientraden,
 * och 608px av 320px xxlarges 1305px, alltså mer än halva förklaringen till
 * att INGEN patientrad syntes i första viewporten på någon bredd.
 *
 * De ligger nu i EN radbrytande grupp. Ingen kontroll är borttagen och ingen
 * gömd bakom en disclosure; det som togs bort är fem marginalband. Gruppen
 * lindar av sig själv när bredden tar slut, så 320px staplar fortfarande, men
 * då som en följd av bredden och inte som en ovillkorlig regel.
 *
 * `align-items: flex-end` justerar kontrollerna mot sin UNDERKANT, vilket är
 * det som rätar upp knappen mot sitt fält: sökfältets grupp är högre än
 * knappen (etiketten sitter ovanför inmatningen), och en radgrupp som
 * justerar mot fältgruppens underkant lade knappens mittlinje 31px under
 * fältets. Se .kind-filter-row nedan för samma fix i primitiven.
 * --------------------------------------------------------------------------- */
.kind-patientlista__verktyg {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: var(--kind-space-2) var(--kind-space-4);
  /* G-2 (#99): space-3 -> space-2. Det här är det tomma bandet mellan
     filterpanelen och listan. De 4px betalade ursprungligen hinkrubrikens nya
     radbox; sedan agents#177 finns ingen hinkrubrik, så bandet ligger nu direkt
     mot första patientraden och gapminskningen är en ren vinst på den yta vars
     MÄTTA huvudproblem är hur mycket krom som ligger före första patientraden
     (utfallskontraktet, mått 3). */
  margin: 0 0 var(--kind-space-2);
}
/* Direkta barn ärver inte sina gamla botten-marginaler in i gruppen; luckan
   ägs av gruppens `gap`, annars adderas de två. */
.kind-patientlista__verktyg > * { margin-bottom: 0; }
/* Räknaren och sorteringsvalet är löptext bland kontroller: linjera dem mot
   kontrollernas textbaslinje i stället för mot gruppens underkant. */
.kind-patientlista__verktyg > .kind-list__meta {
  align-self: center;
  margin-top: 0;
}
/* Sökfältet får ta plats som finns, men behöver inte 220px minimum när det
   delar rad med statusfiltret; 12rem rymmer "Namn eller e-post".

   Etiketten ligger BREDVID inmatningen och inte ovanför. Den kostade annars en
   egen rad (21px normal, 32px xxlarge) i varje sidladdning; bredvid kostar den
   noll så länge raden räcker, och lindar ovanför när den inte gör det.
   Etiketten är fortsatt SYNLIG och fortsatt kopplad via `for`, en placeholder
   ersätter aldrig en etikett (WCAG 3.3.2). */
.kind-patientlista__verktyg .kind-field {
  min-width: 12rem;
  display: flex;
  /* `flex-direction: row` är LOAD-BEARING och inte kosmetik: basregeln
     `.kind-field` i kind.css är `flex-direction: column`, och i en KOLUMN
     tolkas `flex-basis` som HÖJD. Utan den här raden läste `.kind-search`
     sin `flex: 1 1 11rem` som 176px HÖJD, fältet blev 197px högt och
     verktygsraden VÄXTE 114px av en ändring som skulle krympa den. */
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  gap: 0 var(--kind-space-2);
}
/* [hidden]-gard OCKSA HAR, och det ar inte en dubblering av `.kind-field[hidden]`
   i kind.css. Den har descendant-selektorn ar (0,2,0), alltsa EXAKT samma
   specificitet som basgarden, och kind_admin.css laddas efter kind.css, sa den
   vinner pa kallordning och gor `hidden` inert igen precis inne i den har
   verktygsraden. Fangat av e2e/hidden-probe.mjs, som mater varje kandidat BADE
   bart och under den forfaderkedja svepet pekar ut; ett bart prob hade missat
   det och darmed varit en underskattande kontroll (regel 49c). */
.kind-patientlista__verktyg .kind-field[hidden] { display: none; }
.kind-patientlista__verktyg .kind-field__label { margin-bottom: 0; }
.kind-patientlista__verktyg .kind-search { flex: 1 1 11rem; }

/* Räknaren, sorteringsvalet och wayfinding-länken är löptext bland kontroller.
   Samlade i ett kluster delar de EN rad när bredden räcker; som fristående
   syskon tog de var sin 21px-rad mellan kontrollerna. `align-items: baseline`
   linjerar dem inbördes.

   ---- F-6: `align-self` LIGGER PÅ MODIFIERAREN, INTE PÅ BASKLASSEN ----------

   Klassen bärs av TVÅ kluster som hamnar i OLIKA formateringskontexter, och det
   är hela mekanismen bakom det andra F-6-fyndet:

     `--utanfor`  är alltid direkt flexbarn i `.kind-patientlista__verktyg`,
                  som är en RAD. Där betyder `align-self` LODRÄT placering, och
                  `center` är rätt: klustret ska linjera mot kontrollerna.
     det inre     ligger i `.kind-patientlista__sokfilter-panel`, som vid
                  <=430px är en flex-KOLUMN. I en kolumn är `align-self`
                  tväraxeln, alltså VÅGRÄT, och `center` centrerade då
                  sorteringsraden i stället för att vänsterställa den.

   UPPMÄTT FÖRE (lokal mätserver 2026-08-09, HEAD 290fe50, 390x664 normal, som
   vårdpersonal på `?flik=alla`): panelen på x=16 bredd 358, sorteringsraden på
   x=48 bredd 294, alltså 32px indrag på vardera sidan, vilket är exakt
   centrering av ett fit-content-block. Sidans alla andra rader låg på x=16.

   Att flytta deklarationen till modifieraren är därför inte kosmetik: det är
   att sluta uttrycka en RADEGENSKAP på en klass som också används i en KOLUMN.
   Basklassens övriga deklarationer är oförändrade. */
.kind-patientlista__verktyg-meta {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: 0 var(--kind-space-4);
  font-size: var(--kind-font-small);
}
.kind-patientlista__verktyg-meta > * { margin: 0; }

/* ---- F-6: RÄKNARRADEN ÄR EN EGEN RAD, INTE EN SPALT BREDVID FILTREN --------
 *
 * UPPMÄTT FÖRE (lokal mätserver 2026-08-09, HEAD 290fe50, som vårdpersonal på
 * `?flik=alla`, tyngsta tillståndet: 39 teckens patientnamn, telefonnummer,
 * klarmarkerat ärende):
 *
 *   1280 normal   innehållet x=16   filterblocket x=383   spridning 367px
 *   1440 normal   innehållet x=96   filterblocket x=463   spridning 367px
 *   1512 large    innehållet x=132  filterblocket x=499   spridning 367px
 *   1920 xlarge   innehållet x=180  filterblocket x=624   spridning 444px
 *
 * MEKANISMEN, verifierad och inte antagen. `.kind-patientlista__verktyg` är en
 * radbrytande flexrad. `--utanfor` är dess första flexbarn med `flex: 0 1 auto`,
 * alltså innehållsbredd (uppmätt 351px vid 1280 normal). Filterpanelen är ETT
 * enda flexbarn (se noten vid `::details-content` nedan), så den får plats på
 * SAMMA rad så snart behållaren är bredare än summan. Vid 1200px och smalare
 * fick den inte plats och radbröt, alltså EN kant; vid 1280px och bredare fick
 * den plats, alltså TVÅ kanter. Defekten var därför osynlig på varje smalare
 * mätning, vilket är skälet den överlevde till kundens granskning.
 *
 * `flex-basis: 100%` gör räknarraden till en HEL rad. Den kan då aldrig dela
 * rad med filterblocket, oavsett hur bred behållaren är och oavsett hur bred
 * räknartexten blir vid stor textskala. Egenskapen är alltså uttryckt som en
 * regel om LAYOUTEN, inte som en brytpunkt som måste underhållas per bredd.
 * `flex-grow: 1` finns för att raden ska äga hela bredden även när texten är
 * kort, så en framtida högerställd syskonrad hamnar rätt. */
.kind-patientlista__verktyg-meta--utanfor {
  flex: 1 1 100%;
  align-self: center;
}

/* Mina-flikens hopfällda "Fler filter"-disclosure (persona-vardpersonal P1
 * fynd 2): verksamhet + tagg-sök collapse behind a native <details> so the
 * triage-vyn is not buried behind four stacked filter forms. Reuses the
 * .kind-filter-row primitives inside the panel; only the summary needs its
 * own toggle styling (a rotating chevron via the existing ::after marker
 * convention, mirrors .kind-nav__more-toggle). */
.kind-patientlista__filters { margin: 0 0 var(--kind-space-4); }
.kind-patientlista__filters-toggle {
  display: inline-flex;
  align-items: center;
  gap: var(--kind-space-2);
  min-height: 44px;
  padding: var(--kind-space-2) var(--kind-space-3);
  cursor: pointer;
  font-weight: 600;
  color: var(--kind-color-text);
  list-style: none;
}
.kind-patientlista__filters-toggle::-webkit-details-marker { display: none; }
.kind-patientlista__filters-toggle::after {
  content: "\25BE";
  font-size: 0.75em;
}
.kind-patientlista__filters[open] > .kind-patientlista__filters-toggle::after {
  content: "\25B4";
}
.kind-patientlista__filters-toggle:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: var(--kind-focus-ring-offset);
}
.kind-patientlista__filters-panel { padding-top: var(--kind-space-2); }
/* CP-14: etiketten bär numera tillstånd, alltså kan den bli tvåradig. Wrap
   plus `align-items: center` håller chevron och namn i takt medan
   tillståndsraden får en egen rad under. */
.kind-patientlista__filters-toggle { flex-wrap: wrap; }

/* ---------------------------------------------------------------------------
 * CP-14 (#99) SÖK- OCH FILTERPANELEN, disclosure vid smal bredd.
 *
 * UPPMÄTT: vid 320px xxlarge på ?flik=alla låg första patientraden på y=1314px
 * mot taket 664px (lokal mätserver 2026-08-04, HEAD 6d6bf2e, vårdpersonal).
 * Statusfilterraden ensam kostade S=163,5px av det, mätt som skillnaden i
 * första radens y-position med och utan raden, alltså dubbelt över de 82px
 * CP-14-utlåtandets tredje väg gav den. Därför ligger även statusfiltret i
 * panelen och inte utanför.
 *
 * V1, ENDAST SMAL BREDD. Vid >=431px är summaryn `display: none` och både
 * <details> och panelen `display: contents`, alltså försvinner deras egna
 * BOXAR ur layouten och panelen är aldrig hopfälld på desktop.
 *
 * ---- RÄTTELSE 2026-08-09 (F-6), LÄS DENNA FÖRE NÄSTA ÄNDRING --------------
 *
 * Den här noten påstod tidigare att kontrollerna vid >=431px blir "precis samma
 * direkta flexbarn i `.kind-patientlista__verktyg` som före CP-14" och att "den
 * breda layouten är därmed oförändrad". DET STÄMMER INTE, och det är mätt.
 *
 * `display: contents` tar bort <details>-VÄRDENS box, men <details> renderas
 * via ett UA-genererat innehållsblock, `::details-content`, som ligger KVAR.
 * Uppmätt i Chromium 151.0.7922.34 (lokal mätserver 2026-08-09, HEAD 290fe50,
 * 1280x800): `getComputedStyle(details, '::details-content').display` är
 * `block`, <details> själv har noll klientrektanglar, och de fyra kontrollerna
 * ligger på SAMMA x med NOLL radglugg mellan sig, alltså i blockflöde inuti ett
 * enda block, inte som fyra flexbarn. Avgörande experiment: en insatt regel
 * `.kind-patientlista__sokfilter::details-content { display: contents }` ändrade
 * sökformulärets bredd från 873px till 380px och flyttade upp statuschipsen på
 * samma rad, alltså var det just den boxen som bar kolumnen.
 *
 * KONSEKVENS, och den är hela F-6: filterpanelen är ETT flexbarn, inte fyra.
 * Ett brett block bredvid räknarraden ger en andra vänsterkant så snart bägge
 * får plats på samma rad. Åtgärden ligger på räknarraden (`--utanfor`, se
 * noten där), INTE på `::details-content`: att lösa upp det blocket hade gjort
 * om desktoplayouten till en radbrytande kontrollrad, vilket är en annan och
 * större produktändring än fyndet, och kunden begärde uttryckligen en ren
 * enkolumnsform på den här ytan.
 *
 * V1 håller alltså funktionellt (panelen är öppen och alla kontroller syns på
 * desktop), men den GEOMETRISKA delen av påståendet var falsk. Noten står kvar
 * RÄTTAD i stället för struken, så nästa läsare inte gör om resan. Behandla den
 * som mätt i EN motorversion: `::details-content` är ett nyare UA-beteende och
 * en äldre Chromium kan mycket väl ha uppfört sig som CP-14 beskrev, alltså är
 * det INTE givet att noten var fel när den skrevs (V4 nedan daterar
 * `::details-content` till 2025-05, alltså EFTER att mönstret först skrevs).
 * Mät om vid motorbyte, e2e/f6-vansterkantsgrind.mjs gör det åt dig.
 *
 * V4, FAIL-OPEN. Servern renderar `open`; hopfällningen görs av
 * kind_patientlista_filter_fold.js. Utan JavaScript händer ingenting och alla
 * kontroller står kvar synliga. En CSS-only-variant hade krävt
 * `::details-content` (Baseline först 2025-05), och dess FALLBACK hade varit
 * hopfälld-på-desktop, alltså fail-CLOSED, vilket är exakt fel håll för en
 * klinisk kontroll.
 *
 * V5, TRÄFFYTA. 44px minimihöjd och egen fokusmarkering, samma mönster som
 * .kind-arbetsvy__ko-fold och .kind-patientlista__filters ovan (den delade
 * :focus-visible-regeln i kind.css täcker bara a/button/input/textarea/select).
 * --------------------------------------------------------------------------- */
.kind-patientlista__sokfilter {
  flex: 1 1 100%;
  margin: 0;
}
.kind-patientlista__sokfilter-toggle {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0 var(--kind-space-2);
  min-height: 44px;
  padding: var(--kind-space-2) var(--kind-space-3);
  border-radius: var(--kind-radius);
  cursor: pointer;
  font-weight: 600;
  color: var(--kind-color-text);
  list-style: none;
}
.kind-patientlista__sokfilter-toggle::-webkit-details-marker { display: none; }
/* Chevron FÖRE namnet (samma håll som arbetsvyns kö-vik), så en tvåradig
   tillståndsetikett aldrig kan skjuta markören till en egen rad. */
.kind-patientlista__sokfilter-toggle::before {
  content: "\25B8";
  color: var(--kind-color-text-muted);
}
.kind-patientlista__sokfilter[open] > .kind-patientlista__sokfilter-toggle::before {
  content: "\25BE";
}
.kind-patientlista__sokfilter-toggle:hover {
  background: var(--kind-color-surface-muted);
}
.kind-patientlista__sokfilter-toggle:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: var(--kind-focus-ring-offset);
}
/* V2: tillståndet står i klartext på etiketten, på en EGEN rad så det aldrig
   trängs ut av namnet vid 320px. Muted vikt, det är ett kvitto och inte en
   rubrik. */
.kind-patientlista__sokfilter-tillstand {
  flex: 1 1 100%;
  font-weight: 400;
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
}
.kind-patientlista__sokfilter-panel {
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-2);
  padding-top: var(--kind-space-2);
}
/* Luckan mellan kontrollerna ägs av panelens `gap` respektive verktygsradens
   `gap`; kontrollernas egna botten-marginaler skulle annars adderas ovanpå. */
.kind-patientlista__sokfilter-panel > * { margin-bottom: 0; }
@media (min-width: 431px) {
  .kind-patientlista__sokfilter,
  .kind-patientlista__sokfilter-panel { display: contents; }
  .kind-patientlista__sokfilter-toggle { display: none; }

  /* F-6: `::details-content` ÄR filterblocket, se rättelsen i noten ovan. Den
     boxen ligger kvar trots `display: contents` på <details>, och lade därför
     de fyra kontrollerna i BLOCKFLÖDE med noll radglugg, en stapel på 165px.
     Här får den den radbrytande layout CP-14 redan trodde att den hade.

     VARFÖR STYLA BOXEN i stället för att lösa upp den med `display: contents`:
     ett stängt <details> döljer sitt innehåll via `content-visibility` PÅ den
     här pseudon, inte via `display`. Att skriva över `display` rör alltså
     UA:ns öppna/stängd-maskineri, och en användare som drar fönstret från
     smalt (hopfällt) till brett hade kunnat hamna i ett läge där kontrollerna
     är kvar dolda. Att bara ge boxen en egen layout lämnar det maskineriet
     orört, vilket är rätt håll för en klinisk kontroll (V4, fail-open).

     `flex: 1 1 100%` gör blocket till en HEL rad, så det aldrig kan dela rad
     med räknarraden och återskapa den andra vänsterkanten.

     UPPMÄTT med e2e/cp05-patientlista-utfall.mjs mot lokal mätserver 2026-08-09
     (som vårdpersonal, tyngsta tillståndet: 39 teckens namn, telefonnummer,
     klarmarkerat ärende), första patientradens y-position vid 1280 normal,
     tak 400px:
       före F-6            383px   men TVÅ vänsterkanter, spridning 367px
       enbart räknarraden  412px   EN kant, men 12px ÖVER taket, alltså RÖTT
       med denna regel     355px   EN kant, 45px under taket
     Att bara flytta räknarraden hade alltså betalat fyndet med kundens egen
     mått 3-budget, som bara hade 17px marginal. Samma riktning vid 1280
     xxlarge, 581 till 554. Se `docs/contracts/classic-plus-utfall.md` mått 3
     och minnet `feedback-cross-domain-cost-on-customer-budget`. */
  .kind-patientlista__sokfilter::details-content {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-end;
    gap: var(--kind-space-2) var(--kind-space-4);
    flex: 1 1 100%;
  }
}

/* Hinkrubrikerna (`.kind-ko__bucket` / `.kind-ko__bucket-heading`) ÄR BORTTAGNA,
 * agents#177 (konsultbeslut 2026-08-11): patientlistan renderas platt utan
 * mellanrubriker, med `bucket` kvar som OSYNLIG sorteringsnyckel. Reglerna togs
 * bort i samma ändring som mallen, eftersom en kvarlämnad regel för en klass
 * ingen mall längre bär gör CP-04:s typografivakt VAKUÖS: vakten härleder sin
 * klassmängd ur `<h1-6 ... class=>` i `templates/`, så en regel utan bärare
 * granskas inte längre av någon (regel 49, en grön vakt över död kod).
 *
 * MÄTHISTORIKEN ÄR INTE FÖRLORAD, den är bara inte längre aktuell här: G-2
 * (#99) höjde rubriken 14 -> `--kind-font-h3` och betalade höjdbudgeten med
 * -2,79px uppmätt netto, se commit-historiken för den här filen samt
 * `docs/contracts/classic-plus-utfall.md` mått 3. Kommer en gruppering
 * någonsin tillbaka ska den mätas om, inte återupplivas ur den texten. */

/* persona-klinik-admin P2 fynd 5: the Alla-flik secondary e-post
 * (kontaktbarhets-granskning). Muted. CP-05: `flex-basis: 100%` borttagen, se
 * .kind-ko__ansvarig ovan; adressen flödar i metagruppen och bryter bara rad
 * när den faktiskt inte får plats. `min-width: 0` plus overflow-wrap så en
 * lång adress kortar sig själv i stället för att skjuta ut raden horisontellt
 * (mått 6 i utfallskontraktet mäter både överskott OCH avkortad text). */
.kind-ko__epost {
  min-width: 0;
  overflow-wrap: anywhere;
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
}

/* The "Patientprofil" link, syskon to the hanterad-toggle form inside
 * .kind-ko__row-actions. Icon + VISIBLE text (not the DEL B composer
 * icon-only row), ghost weight (secondary to the hanterad-toggle). */
.kind-ko__profil-link {
  display: inline-flex;
  align-items: center;
  gap: var(--kind-space-1);
}

/* 320px (design spec "320px-beteende"): åtgärdsblocket lindar ned under
 * länken och delar bredden mellan sina två kontroller i stället för att
 * klippa dem. Varje kontroll behåller sitt eget 44px-golv (WCAG 2.2 2.5.8).
 *
 * CP-05 (#90) ändrade STAPLAT till SIDA VID SIDA. Staplat kostade 108px per
 * rad (två 44px-knappar plus lucka plus botten), alltså 44 procent av mobilens
 * 245px radhöjd. `flex: 1 1 8rem` betyder att de delar raden när de får plats
 * och lindar var för sig när de inte gör det, så 320px xxlarge fortfarande
 * staplar utan att någon knapp klipps. Golvet sänks inte, bara ytan de delar. */
@media (max-width: 600px) {
  .kind-ko__row-actions {
    flex-basis: 100%;
    justify-content: stretch;
    padding-top: 0;
  }
  .kind-ko__row-actions .kind-ko__handled-form { flex: 1 1 8rem; }
  .kind-ko__row-actions > .kind-btn { flex: 1 1 8rem; }
  .kind-ko__row-actions .kind-btn { width: 100%; justify-content: center; }
  /* CP-05 (#90): e-postadressen är klinik-admins kontaktbarhets-granskning vid
     skrivbordet (persona-klinik-admin P2 fynd 5), inte en telefonuppgift. Den
     tvingade en tredje metarad i varje rad vid 390px och kostade 21px per
     patient i den vy där utrymmet är knappast. Adressen finns kvar på
     patientsidan och i sökningen (fältet söker i namn OCH e-post), så inget
     blir onåbart, den slutar bara betalas för i triagevyn på telefon. */
  .kind-ko__epost { display: none; }
}

/* ============ D11 work view (arbetsvy), TVÅ paneler ============ */

/* kö (vänsterräls) | konversation (resten). HÖGERKOLUMNEN ÄR BORTTAGEN
 * 2026-07-27 (konsultbeslut, issue #80, kundens målbild från Peter och Annica
 * 23 juli). Tre skäl, i den ordning de vägde:
 *
 *   1. INGET BLIR HEMLÖST. Varje sektion panelen bar finns redan på
 *      patientsidan `/admin/patient/<pid>`: Triage, Formulärsvar, Anteckningar,
 *      Taggar, Tilldelad till, Pågående vårdresor, Dokument, Remisser, Kommande
 *      bokningar, Videomöte, Patientuppgifter. Verifierat mot driftsatt app
 *      2026-07-27, inte antaget. Chattheadern länkar dit med tre synliga
 *      affordanser (Triage, Patientsida, Exportera), se _chat_header.html.
 *   2. DET GAMLA 1280-LÄGET VAR TRASIGT. Panelen lade sig i full bredd under
 *      konversationen och TAPPADE då sidokolumnens skrollport, så sidan blev
 *      9859px hög vid 1280x800 (mot 960px vid 1366). Uppmätt i riktig
 *      webbläsare mot driftsatt 2.1.12, 2026-07-27. Att generalisera det läget
 *      hade spridit tio-skärmarsproblemet till alla bredder; att ta bort
 *      panelen tar bort orsaken.
 *   3. EN LAYOUT I STÄLLET FÖR TRE. Arbetsvyn betedde sig olika vid 1279 och
 *      1281 utan att någon användare kunde förutse det.
 *
 * Konsekvens för bredden: chattkolumnen blir 1248 - 260 - 16 = 972px på ALLA
 * bredder >= 1280 (mainen är kapad till --kind-container-max 80rem = 1280px,
 * minus 2 x 16px padding). Radlängdstaket på läskolumnen (44rem, kind_patient.css)
 * är det som håller WCAG 1.4.8, och det biter nu på alla bredder i stället för
 * bara vid <=1280. Det är avsiktligt och är hela skälet till att taket byggdes
 * FÖRE den här ändringen. */
.kind-arbetsvy {
  display: grid;
  /* Rälsbredden är en VARIABEL sedan K18 (#415), så hopfällningen är EN
     deklaration i stället för en omskriven grid-template. 56px är strippens
     bredd: 44px träffyta plus 6px luft på var sida. */
  --kind-rals-bredd: 260px;
  grid-template-columns: var(--kind-rals-bredd) minmax(0, 1fr);
  gap: var(--kind-space-4);
  align-items: start;
}
/* Narrow / tablet: single column, panes stack kö -> konversation.
 * minmax(0, 1fr) (not a bare 1fr, which is minmax(auto, 1fr)) lets the single
 * track shrink below its content's min-content width; a bare 1fr inherited the
 * widest pane's min-content (~381px on a 320px viewport) and forced ~119px of
 * horizontal scroll (WCAG 1.4.10 reflow). Verified at 320px 2026-07-02. */
@media (max-width: 900px) {
  .kind-arbetsvy {
    grid-template-columns: minmax(0, 1fr);
  }
}
/* The kö pane defaults to min-width: auto (grid item auto floor), whose
 * min-content set the stacked track wide. min-width: 0 lets its content wrap
 * within the shrunk track instead of forcing the column past the viewport.
 * The chat pane already carries min-width: 0 (see .kind-arbetsvy__chat below). */
.kind-arbetsvy__ko {
  min-width: 0;
}

.kind-arbetsvy__pane-title {
  font-size: var(--kind-font-small);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--kind-color-text-muted);
  margin: 0 0 var(--kind-space-3);
}

/* Left rail: the work queue. Sticky on wide screens so the operator can jump
 * between conversations without losing it; static when stacked. */
.kind-arbetsvy__ko {
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-3);
  align-self: start;
  position: sticky;
  top: var(--kind-krom-topp);
  max-height: calc(100vh - var(--kind-krom-budget));
  /* ---- SKROLLPORTEN FLYTTAD IN TILL LISTAN (K18, issue #415) ------------
   *
   * Rälsen skrollade tidigare SOM HELHET. Med hopfällningsväxlaren i toppen och
   * "Alla patienter" flyttad till foten hade det gjort BÅDA affordanserna
   * bortskrollade så snart kön är längre än rutan: uppmätt 2026-08-26 vid
   * 1280x800 låg fotlänken på y=1007 i en 800px viewport, alltså osynlig tills
   * man skrollade rälsen. Det var inte en teoretisk risk, det är vad mätningen
   * visade, och den godkända mocken ritar tvärtom en fast topp, en skrollande
   * lista och en fast fot.
   *
   * Rälsen är därför en FLEXKOLUMN: rubrikraden och foten är `flex: 0 0 auto`
   * och listan `flex: 1 1 auto; min-height: 0; overflow-y: auto`. `min-height: 0`
   * är load-bearing, ett flexbarns default `min-height: auto` hindrar annars
   * krympning och skrollporten uppstår aldrig.
   *
   * NÅBARHETEN ÄR VERIFIERAD MED OFORCERAT KLICK plus `elementFromPoint`, inte
   * med en bbox: en bbox passerar även under ett överlagrat element. */
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
.kind-arbetsvy__ko-innehall {
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  /* Ett hjul i listan ska inte kedja vidare till sidan, samma konvention som
     chattloggen och sidopanelen. */
  overscroll-behavior-y: contain;
}
.kind-arbetsvy__ko-head,
.kind-arbetsvy__ko-akut,
.kind-arbetsvy__ko-fot {
  flex: 0 0 auto;
}
/* CP14-KOZON-MOBIL:START */
/* ==========================================================================
 * CP-14 (#99): kö-zonen lämnar FLÖDET vid mobilstackning (<=900px).
 *
 * Utlåtande: docs/persona/cp-14-ko-zon-bradskanderakning-vardpersonal.md
 * (persona-vårdpersonal 2026-08-04, ACCEPTS-MED-VILLKOR, V-1 till V-6).
 * Utfallskontrakt: docs/contracts/classic-plus-utfall.md, mått 5.
 * Mätinstrument: e2e/cp14-kozon-matning.mjs (läser detta block via markörerna).
 *
 * ---- TALEN, MÄTTA I TYNGSTA TILLSTÅNDET --------------------------------
 *
 * Deployen 2026-08-04, /admin/arbetsvy/...a501 vid 320x664 och 390x664,
 * xxlarge textskala, akut_antal = 1, konversationen KLARMARKERAD och med
 * telefonnummer (regel 48 följdkrav a):
 *
 *   kö-zonens kostnad i flödet   245,00px  (221px zon + 24px grid-gap)
 *     varav rubrik + huvudlänk    36,00px
 *     varav brådskanderaden       75,00px
 *     varav listans disclosure    60,00px
 *   mått 5-marginal              -212,28px (skrivmodulens underkant mot 664)
 *
 * ETIKETTERNA I MÄTNINGEN VAR ANDRA. Raderna ovan mättes när rubriken hette
 * "Arbetskö", huvudlänken "Hela kön" och disclosuren "Visa kön (N)". K5 (#192)
 * bytte orden till "Patienter", "Alla patienter" och "Visa patienter (N)".
 * Talen står kvar ordagrant som de mättes, de har INTE räknats om, och
 * slutsatsen är okänslig för bytet eftersom zonen tas ur flödet i sin helhet.
 *
 * ---- VARFÖR BESKÄRNING INTE RÄCKER, RÄKNAT OCH INTE ANTAGET ------------
 *
 * Underskottet är 212,28px och zonen kostar 245,00px, alltså måste 86,6% av
 * zonen bort. Zonens BILLIGASTE del är rubrikraden med huvudlänken, 36,00px.
 * Att behålla ENBART den, utan padding, utan ram och utan gap, lämnar 36,00px
 * kvar och frigör 209,00px, alltså 3,28px FÖR LITE. Ingen delmängd av zonen
 * kan alltså stå kvar i flödet. Personan gissade att beskärning inte skulle
 * räcka; det är nu mätt, och marginalen mot att gissningen var fel var tre
 * pixlar.
 *
 * ---- VAD SOM FAKTISKT HÄNDER HÄR ---------------------------------------
 *
 * Zonen tas ur FLÖDET, inte ur DOM:en (V-3). `<nav>` behåller sitt
 * tillgängliga namn via aria-labelledby -> rälsens `<h2>`, och båda
 * ligger kvar i tillgänglighetsträdet med noll visuell yta, samma teknik som
 * .kind-visually-hidden i kind.css.
 *
 * Zonens innehåll är `display:none`, alltså borta även för hjälpmedel:
 * brådskanderaden, listans disclosure och "Alla patienter"-länken. Det är exakt
 * det personan godkände. En uppläst räkning som inte uppdateras är samma
 * trasiga rökdetektor som den synliga, och en fokuserbar länk i en klippt
 * container är ett osynligt tabbstopp (WCAG 2.2 SC 2.4.7).
 *
 * DESKTOP ÄR ORÖRD (V-1). Allt här ligger i `max-width: 900px`, samma
 * brytpunkt som KIND-MOB-04 redan använder. Faller V-1 är personans svar
 * REJECTS, alltså vaktas det av tests/test_cp14_kozon_mobil.py.
 *
 * VAD SOM INTE GJORDES: räkningen flyttades INTE till chattheadern. V-5 säger
 * att den inte ska flyttas om den inte ryms, och åtgärdsraden är uppmätt full
 * (fyra åtgärder, 260px av headerns 272px vid 320px xxlarge), så en femte post
 * hade brutit raden till en andra 44px-rad och ätit 44 av de 32,72px marginal
 * borttagningen ger. En räkning som återinför mått 5-brottet är en ren
 * förlust.
 * ========================================================================== */
@media (max-width: 900px) {
  /* Ankare för zonens absolutpositionering. Mobil-only, så desktopens
     grid-geometri är oförändrad. */
  .kind-arbetsvy {
    position: relative;
  }

  .kind-arbetsvy__ko {
    position: absolute;
    top: 0;
    left: 0;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    border: 0;
    background: none;
    max-height: none;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
  }
  /* Inga osynliga tabbstopp och ingen inaktuell räkning kvar för hjälpmedel.
     `.kind-empty` är tomtillståndets "Inga andra konversationer i kön.".

     SELEKTORERNA ÄR KVALIFICERADE MED FÖRÄLDERN, alltså 0-2-0 och inte 0-1-0,
     med flit. `.kind-arbetsvy__ko-akut { display: flex }` står LÄNGRE NED i den
     här filen, och en media-fråga höjer inte specificiteten, så en okvalificerad
     regel här hade FÖRLORAT mot basregeln på dokumentordning. Det gick inte att
     se i webbläsarmätningen, eftersom instrumentet injicerar blocket SIST och
     därmed ger det en gynnsammare kaskad än leveransen; strukturvakten
     tests/test_cp14_kozon_mobil.py fångade det. Flytta inte tillbaka. */
  .kind-arbetsvy__ko .kind-arbetsvy__ko-akut,
  .kind-arbetsvy__ko .kind-arbetsvy__ko-fold,
  .kind-arbetsvy__ko > .kind-empty,
  /* K18 (#415): hopfällningsknappen och den flyttade foten går SAMMA väg.
     Båda är fokuserbara, och en fokuserbar nod i den klippta zonen är ett
     osynligt tabbstopp (WCAG 2.2 SC 2.4.7), alltså precis det den här listan
     finns för. Missas de växer mobilens tabbordning med två döda stopp. */
  .kind-arbetsvy__ko .kind-arbetsvy__ko-toggle,
  .kind-arbetsvy__ko .kind-arbetsvy__ko-fot {
    display: none;
  }
  /* "Alla patienter"-länken går samma väg. INGEN fokuserbar nod får bli kvar i den
     klippta zonen: en länk som tar emot tangentbordsfokus utan att synas är
     ett osynligt tabbstopp (WCAG 2.2 SC 2.4.7 Focus Visible).

     HÄR STOD EN FOKUSAVSLÖJAD GENVÄG till 2026-08-04, alltså en `:focus-within`
     som fällde ut zonen som en skip-link-panel. Den är borttagen, och skälet är
     värt att spara: ett tillståndsregel-par på `.kind-arbetsvy__ko` klassar
     selektorn som en INTERAKTIV yta i Classic+-tokenvakten
     (test_classic_plus_tokens_css.py), och då bryter DESKTOPRÄLSENS befintliga
     `border: 1px solid var(--kind-color-border-soft)` mot kind.css §6: en
     interaktiv ytas egen kant ska bära den funktionella token, inte den
     dekorativa hairlinen. Att byta den kanten hade ändrat desktop, alltså V-1.
     Utsmyckningen var min egen och inget villkor krävde den, så den föll i
     stället för villkoret.

     Landmärket är därmed NAMN-ONLY på mobil: `<nav>` med sitt tillgängliga
     namn ur rälsens `<h2>`, utan innehåll. Vägen till listan bärs i stället
     av EN affordans, "Alla" i chattheadern, som är synlig, namngiven och ligger
     i den normala tabbordningen. En väg som syns är bättre än två varav den
     ena är osynlig. */
  /* K18 (#415): länken bor i FOTEN sedan 2026-08-26 och göms av regeln ovan.
     Selektorn står kvar för det fall någon lägger tillbaka en länk i
     rubrikraden; den är billig och den bevakade defekten är densamma. */
  .kind-arbetsvy__ko .kind-arbetsvy__ko-head .kind-link {
    display: none;
  }
}

/* ---- V-2: den kvarvarande vägen till listan på mobilarbetsvyn -----------
 *
 * "Alla" är en TEXTBÄRANDE åtgärd i chattheaderns befintliga 44px-rad, och den
 * kostar noll pixlar i höjd eftersom "Patientsida" faller i samma bredd. Raden
 * går alltså från fyra poster till fyra poster. Se noterna i
 * templates/admin/_chat_header.html för varför just Patientsida faller
 * (dubblerad av patientnamnets länk, och sist i personans bortfallsordning).
 *
 * BREDDRÄKNINGEN, uppmätt på deployen 2026-08-04 vid 320x664 xxlarge:
 *   headerns innehållsbredd            272,00px
 *   fyra ikonåtgärder + tre gap        260,00px  (4 x 56 + 3 x 12)
 * Ikonen på affordansen är CSS-gömd just därför att bredden är det knappa
 * måttet; ordet är det V-2 kräver, glyfen är det dyra. Träffytan är oförändrat
 * >= 44x44px (SC 2.5.8) via `min-height` plus vaddering.
 *
 * K5 (#192): etiketten hette "Kön" när breddräkningen ovan gjordes och heter
 * "Alla" sedan ordbytet. "Alla" är smalare än "Kön" i samma typsnitt, alltså
 * kan bytet inte ha ätit av de 12,00px som stod kvar. Talen är oförändrade.
 *
 * DESKTOP ÄR ORÖRD (V-1): `--ko` är `display:none` utanför media-frågan, och
 * `--dolj-mobil` gör ingenting där. */
.kind-chat-header__action--ko {
  display: none;
}

/* ============================================================================
   #217 / VARIANT D, BINDANDE VILLKOR 1: VAGEN UT VID ALLA BREDDER.

   Regeln ovan doljer `--ko` pa desktop, och motiveringen stod utskriven i
   kommentaren dar: "DESKTOP AR ORORD (V-1)", alltsa att koRALEN bar
   tillbakavagen. DEN PREMISSEN HALLER INTE i variant D, av tre skal, och de tva
   sista upptacktes forst vid bygget:

     1. D tar bort den globala navigeringen vid ALLA bredder, inte bara mobila.
     2. Koral finns bara i ARBETSVYN. `admin/chatt.html` delar chattskalet men
        har ingen ral, alltsa hade en desktopanvandare dar blivit helt utan
        vag ut.
     3. Makrot renderade dessutom lanken ENBART nar `retur == 'arbetsvy'`, vilket
        bara arbetsvyn skickar, sa pa chatt.html fanns lanken inte alls att
        visa. Det ar atgardat i templates/admin/_chat_header.html.

   Uppmatt i mockbygget: tillbakalanken matte 0x0 vid 1440x900, alltsa var den
   osynlig pa exakt den yta dar den nu ar enda vagen ut. Fangat av ett
   landningskvitto i e2e/mat217d.mjs, inte av ogat.

   SKOPAT till `.kind-body--vardchatt`, alltsa exakt de tre ytor som saknar
   sidhuvud. Ovriga ytor ar byte-identiska.
   ========================================================================== */
.kind-body--vardchatt .kind-chat-header__action--ko {
  display: inline-flex;
  flex: 0 0 auto;
  align-self: center;
  margin-right: var(--kind-space-1);
  min-height: 44px;
  padding-inline: var(--kind-space-2);
  border: 1px solid var(--kind-color-border);
  background: var(--kind-color-surface);
}
.kind-body--vardchatt .kind-chat-header__action--ko .kind-chat-header__action-icon {
  display: inline-flex;
}
/* Pilen pekar hoger i ikonuppsattningen; tillbaka ar motsatt riktning. */
.kind-chat-header__action-icon--tillbaka { transform: scaleX(-1); }

/* BREDDEN AR DEN DYRA TERMEN, OCH DET AR MATT.
   Chattheadern ar 676px bred i arbetsvyn, inte 972: kokolumnen och
   patientsammanfattningen tar resten. Med den synliga etiketten mater lanken
   106px, och da ryms `106 + namnet 554` pa rad 1 medan atgardsklustret (372px)
   trycks ned pa en EGEN rad. Uppmatt kostnad: chattheadern 83,80 till 127,80px
   och konversationen 707,22 till 663,22, alltsa 44px for ett ord.

   Vid breda vyer bar darfor IKONEN affordansen och ordet blir skarmlasartext.
   `aria-label` ar oforandrad, sa det tillgangliga namnet ar identiskt; bara den
   SYNLIGA etiketten flyttas. Samma avvagning som huset redan gjort at andra
   hallet pa mobil (regeln nedan gommer glyfen och behaller ordet, dar bredden
   ar knapp av andra skal). Under 901px stackar raden anda, sa dar star ordet kvar. */
@media (min-width: 901px) {
  .kind-body--vardchatt .kind-chat-header__action--ko .kind-chat-header__action-text {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
    border: 0;
  }
  /* Namnet far krympa sa klustret ryms pa rad 1. Det WRAPPAR (arbetsvyns
     `overflow-wrap: anywhere`), det avkortas inte, sa breddvakt F-1 i
     docs/contracts/chat-pixel-budget.md ar oberord. Matt, inte antaget. */
  .kind-body--vardchatt .kind-chat-header__main { flex: 1 1 7.5rem; min-width: 0; }
}

/* SMAL DESKTOP, 901 TILL 1100px: ATGARDERNAS ORD GAR, IKONERNA STANNAR.

   UPPMATT REGRESSION SOM DEN HAR REGELN ATGARDAR. Vid exakt 901px byter
   arbetsvyn fran staplat till trekolumnsrutnat, och chattheadern ar da bara
   593px bred. Tillbakalanken tar 44px plus 4px marginal ur identitetskolumnen,
   som darmed gick 193 till 149px, och patientnamnet wrappade till TRE rader i
   stallet for tva. Chattheadern matte 83,80 till 107,80px och konversationen
   707,22 till 683,22.

   Atgarden ar den huset redan valt at andra hallet under 900px: ordet ar det
   dyra, glyfen bar affordansen. `aria-label` finns pa varje atgard, sa det
   tillgangliga namnet ar oforandrat och SC 2.5.3 rors inte (etiketten ar da
   inte langre SYNLIG, alltsa finns inget synligt namn att matcha).

   Skopat till chattytorna och till exakt det bandet. Over 1100px ar kolumnen
   bred nog for bade ord och pil, och dar star orden kvar. */
/* Den FRISTAENDE chattytan har en atgard MER an arbetsvyn och en smalare
   kolumn, sa dess etiketter tar slut forst. Uppmatt av CSS-modellen i
   tests/test_chat_pixel_budget.py: raden kraver 722,8px men har 704,0px vid
   1200. Deficiten finns vid VARJE desktopbredd och inte bara i ett band:
   headern ar 704px bred sa fort behallaren slar i `--kind-container-max`,
   alltsa lika bred vid 1280 som vid 1440, medan raden kraver 722,8. Regeln ar
   darfor obetingad over 900px och skopad till `.kind-chatt-layout`, sa
   arbetsvyn behaller sina ord dar den har plats (dess marginal ar 31,2px). */
@media (min-width: 901px) {
  .kind-chatt-layout .kind-chat-header__actions
    .kind-chat-header__action--labelled .kind-chat-header__action-text {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
    border: 0;
  }
}

@media (min-width: 901px) and (max-width: 1100px) {
  .kind-body--vardchatt .kind-chat-header__actions
    .kind-chat-header__action--labelled .kind-chat-header__action-text {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
    border: 0;
  }
}

/* Tillganglighetstriggern i atgardsraden (villkor 2). Den ska inte strackas av
   radens align-items och behaller sitt 44px-golv. */
.kind-chat-header__actions .kind-a11y-trigger--chatt {
  min-height: 44px;
  align-self: center;
  margin-left: var(--kind-space-1);
}
/* ⋯-MENYN (web#897). Över 900px är HELA wrappern borta, alltså både knappen och
   panelen: då ligger Triage och direktmötet direkt i raden (beslutets tredje
   punkt, "oförändrat över 900px"), och menyns dubbletter får aldrig synas
   samtidigt som sina tvillingar. Att gömma wrappern och inte bara knappen är
   det som gör den saken strukturell i stället för en regel per post. */
.kind-chat-header__overflow {
  display: none;
}
/* Panelen är ABSOLUT positionerad, och det är ett CP-14-krav och inte en
   smakfråga: en panel i flödet hade lagt en andra rad i sidhuvudet varje gång
   menyn öppnas, alltså tryckt skrivmodulen nedåt i exakt den 320x664-viewport
   mått 5 mäter. Absolut positionering kostar noll höjd i flödet.

   SKILLNADEN MOT #75 (qa K3), som den här formen medvetet inte upprepar: där
   låg en panel med variabel höjd NEDTILL i den sticky zonade kolumnen och kunde
   hamna utanför viewporten, där en sidskrollning aldrig kunde nå den. Den här
   panelen är ankrad under sidhuvudet, alltså längst UPP i kolumnen, och är två
   44px-rader hög -- den växer inte med innehåll och har ingen nedre kant att
   tappa. Varken headern eller åtgärdsraden klipper (`overflow` är osatt på
   båda), så panelen beskärs inte heller bort. Den stängande evidensen för
   träffbarhet är som alltid en webbläsarmätning, inte den här kommentaren. */
.kind-chat-header__overflow-panel {
  position: absolute;
  z-index: 30;
  top: calc(100% + var(--kind-space-1));
  inset-inline-end: 0;
  min-width: 13rem;
  padding: var(--kind-space-1);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  background: var(--kind-color-surface);
  box-shadow: var(--kind-shadow-md);
}
/* Husets mönster från `.kind-emoji-popover__panel[hidden]`: en egen regel, så
   att [hidden] fortsätter bita om panelen någon gång får en egen
   `display`-deklaration (en författardeklaration slår UA-regeln, vilket är
   precis P1-1-buggen). */
.kind-chat-header__overflow-panel[hidden] {
  display: none;
}
.kind-chat-header__overflow-list {
  list-style: none;
  margin: 0;
  padding: 0;
}
/* Menyraderna är BREDA rader med synlig text, inte 44px-ikoner: de är inte
   `kind-chat-header__action` och lyder därför inte radens etikettregler. 44px
   höjd ändå (WCAG 2.5.8), och texten syns alltid -- persona-vårdpersonals enda
   absoluta nej var en naken ikon. */
.kind-chat-header__overflow-item {
  display: flex;
  align-items: center;
  gap: var(--kind-space-2);
  width: 100%;
  min-height: 44px;
  padding-inline: var(--kind-space-2);
  border: 0;
  border-radius: var(--kind-radius);
  background: transparent;
  color: var(--kind-color-text);
  text-align: start;
  text-decoration: none;
  font-size: var(--kind-font-small);
  font-weight: 600;
  cursor: pointer;
}
.kind-chat-header__overflow-item:hover {
  background: var(--kind-color-surface-muted);
}
.kind-chat-header__overflow-item:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}
.kind-chat-header__overflow-item-icon {
  display: inline-flex;
  flex: 0 0 auto;
}
@media (max-width: 900px) {
  .kind-chat-header__action--ko {
    display: inline-flex;
    padding-inline: var(--kind-space-2);
  }
  /* Ordet bär affordansen, glyfen kostar bredden. */
  .kind-chat-header__action--ko .kind-chat-header__action-icon {
    display: none;
  }
  .kind-chat-header__action--ko .kind-chat-header__action-text {
    display: inline;
  }
  .kind-chat-header__action--dolj-mobil {
    display: none;
  }
  /* web#897, Kasper beslut 2026-10-01 alternativ (c). Posten flyttas in i
     ⋯-menyn under brytpunkten. Klassen sätts BARA på arbetsvyn med
     FEATURE_TRIAGE PÅ (se villkoren i templates/admin/_chat_header.html), så
     med flaggan AV är raden oförändrat tre poster utan meny.

     Skillnaden mot `--dolj-mobil` ovan, och den är hela skälet till en EGEN
     modifierare: `--dolj-mobil` tar bort åtgärden, den finns då inte alls under
     900px. `--overflow-flyttad` tar den ur RADEN men inte ur ytan -- samma
     åtgärd, samma mål och samma tillgängliga namn, ligger kvar i panelen
     nedan. Att låta de två dela klass hade gjort "flyttad" och "borta" till
     samma påstående, och #811:s kriterium ("syns och fungerar vid 900px eller
     smalare") hänger på just den skillnaden. */
  .kind-chat-header__action--overflow-flyttad {
    display: none;
  }
  /* Wrappern är radens tredje 44px-plats under brytpunkten. `position:relative`
     är panelens ankare. */
  .kind-chat-header__overflow {
    display: inline-flex;
    position: relative;
    align-items: center;
  }
}
/* CP14-KOZON-MOBIL:SLUT */
.kind-arbetsvy__ko-head {
  display: flex;
  /* `center` och inte `baseline` sedan K18 (#415): raden bär numera en 44px
     knapp bredvid en liten rubrik, och baseline-justering hängde upp rubriken
     på knappens textbaslinje i stället för att centrera de två mot varandra. */
  align-items: center;
  /* `flex-start` och inte `space-between`: raden hade två barn (rubrik plus
     länk) och skulle sprida dem. Nu är barnen växlaren och rubriken, och de hör
     ihop, så de ska ligga bredvid varandra. Den godkända mocken ritar dem så.
     Länken flyttade till foten, se noten i arbetsvy.html. */
  justify-content: flex-start;
  gap: var(--kind-space-2);
  margin-bottom: var(--kind-space-2);
}

/* ==========================================================================
 * K18 / issue #415: VÄNSTERRÄLSEN HOPFÄLLBAR PÅ DESKTOP.
 *
 * Kundens dokumentpunkt 25, avgjord i K18 och därmed inte varierad av mocken.
 *
 * ---- VARFÖR ETT ATTRIBUT PÅ <html> OCH INTE EN KLASS PÅ RÄLSEN ----------
 *
 * Läget måste vara känt FÖRE första målningen, annars blinkar rälsen från
 * utfälld till hopfälld på varje sidladdning, och i den här vyn är varje
 * patientbyte en sidladdning. `templates/base.html` har redan en nonce-försedd
 * pre-paint-bootstrap för tema och textskala, och `data-kind-rals` sätts där,
 * på samma sätt och av samma skäl. En klass på rälsen hade krävt att skriptet
 * hittade elementet, alltså efter parsning, alltså efter målning.
 *
 * ---- PERSISTENSEN ÄR localStorage OCH INTE EN ANVÄNDARINSTÄLLNING -------
 *
 * BESLUT.md listar "ska hopfällningsläget sparas per användare" som en
 * OAVGJORD beslutsrad. localStorage är den minsta reversibla formen som gör
 * funktionen användbar: utan persistens fälls rälsen ut igen vid varje
 * patientbyte, alltså varje klick i själva rälsen, och funktionen blir en
 * leksak. En riktig användarinställning kräver en backendändring och är
 * fortfarande konsultens beslut. Nyckeln följer husets `kind.tema`-konvention.
 *
 * ---- MOBIL ÄR ORÖRD ----------------------------------------------------
 *
 * Allt här ligger i `min-width: 901px`. Vid <=900px är hela zonen ur flödet
 * (CP14-KOZON-MOBIL), och knappen är `display:none` där, annars vore den ett
 * osynligt tabbstopp i en klippt container (WCAG 2.2 SC 2.4.7).
 * ========================================================================== */

/* Rubrikraden bär nu knappen FÖRST och rubriken efter. `gap` i stället för
   `space-between`: i hopfällt läge är rubriken dold och knappen ska då centreras
   av `justify-content` nedan, inte tryckas mot kanten av en försvunnen granne. */
.kind-arbetsvy__ko-toggle {
  flex: 0 0 auto;
  min-height: 44px;
  min-width: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0 var(--kind-space-2);
}
/* Knappen är `hidden` i markupen och avslöjas av skriptet (progressive
   enhancement). Husets `.kind-btn[hidden]`-gard finns redan i kind.css, men
   den här klassen sätter `display: inline-flex` med samma specificitet, så
   garden upprepas HÄR på 0-2-0. Utan den vinner regeln ovan och en död knapp
   syns för varje användare utan JS. Samma mekanism som CLAUDE.md regel 27
   korollarium 2 beskriver: författardeklarationer slår user-agent-arket
   oavsett specificitet, alltså räcker inte `[hidden]` av sig självt. */
.kind-arbetsvy__ko-toggle[hidden] {
  display: none;
}
/* Foten. Samma 44px-golv som varje annan länkåtgärd i vårdgivarytan. */
.kind-arbetsvy__ko-fot {
  margin: var(--kind-space-2) 0 0;
  padding-top: var(--kind-space-2);
  border-top: 1px solid var(--kind-color-border-soft);
  font-size: var(--kind-font-small);
}
.kind-arbetsvy__ko-fot .kind-link {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
}

@media (min-width: 901px) {
  html[data-kind-rals="hopfalld"] .kind-arbetsvy {
    --kind-rals-bredd: 56px;
  }
  /* Allt utom knappen försvinner. `display: none` och inte visuell dölj:
     innehållet SKA vara borta även för hjälpmedel, det är vad användaren bad
     om genom att fälla ihop, och en osynlig men fokuserbar lista hade gett
     samma osynliga tabbstopp som mobilzonen redan vaktar mot. */
  html[data-kind-rals="hopfalld"] .kind-arbetsvy__ko .kind-arbetsvy__pane-title,
  html[data-kind-rals="hopfalld"] .kind-arbetsvy__ko .kind-arbetsvy__ko-akut,
  html[data-kind-rals="hopfalld"] .kind-arbetsvy__ko .kind-arbetsvy__ko-innehall,
  html[data-kind-rals="hopfalld"] .kind-arbetsvy__ko .kind-arbetsvy__ko-fot {
    display: none;
  }
  html[data-kind-rals="hopfalld"] .kind-arbetsvy__ko-head {
    justify-content: center;
    padding: 0;
  }
  html[data-kind-rals="hopfalld"] .kind-arbetsvy__ko {
    padding: var(--kind-space-2) 0;
    /* FULL HOJD, som den godkanda mocken ritar den. Utan den har raden
       krymper rutan till knappens hojd, och strippen laser som en lös knapp i
       ett tomt fält i stället för som en hopfälld kolumn. `max-height` ovan
       står kvar oförändrad och sätter samma värde, alltså är detta ett golv
       och inte ett nytt tak. */
    height: calc(100vh - var(--kind-krom-budget));
  }
}

.kind-arbetsvy__ko-akut {
  display: flex;
  align-items: center;
  gap: var(--kind-space-2);
  margin: 0 0 var(--kind-space-2);
  color: var(--kind-color-error);
  font-size: var(--kind-font-small);
  font-weight: 600;
}
/* KIND-MOB-04 (UAT 2026-07-16): the queue list sits in a native <details
   data-ko-fold> so kind_arbetsvy_ko_fold.js can collapse it on mobile
   stacking (<=900px), where the rail otherwise pushes the chat ~857px below
   the fold. The summary ("Visa kön (N)") is the mobile toggle: >=44px target,
   explicit focus ring (the shared kind.css :focus-visible rule only covers
   a/button/input/textarea/select, same precedent as .kind-schemalagda), and
   an own chevron since display:flex drops the native list-item marker. On
   DESKTOP (>900px) the summary is display:none and the details is held open
   (server-rendered `open`, re-asserted by the script on viewport crossing),
   so the wide layout is pixel-identical to before. */
.kind-arbetsvy__ko-fold > summary {
  display: flex;
  align-items: center;
  gap: var(--kind-space-2);
  min-height: 44px;
  padding: var(--kind-space-2) var(--kind-space-3);
  border-radius: var(--kind-radius);
  cursor: pointer;
  font-weight: 600;
}
.kind-arbetsvy__ko-fold > summary::-webkit-details-marker { display: none; }
.kind-arbetsvy__ko-fold > summary::before {
  content: "\25B8";
  color: var(--kind-color-text-muted);
}
.kind-arbetsvy__ko-fold[open] > summary::before {
  content: "\25BE";
}
.kind-arbetsvy__ko-fold > summary:hover {
  background: var(--kind-color-surface-muted);
}
.kind-arbetsvy__ko-fold > summary:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}
@media (min-width: 901px) {
  .kind-arbetsvy__ko-fold > summary { display: none; }
}

/* #156: SIDOPANELENS DISCLOSURE, syskonkomponent till ko-folden ovan.
 *
 * Samma kontrakt, ordagrant: servern renderar <details data-sidopanel-fold>
 * OPEN, summaryn ar display:none over 900px (desktop pixelidentisk med fore),
 * och kind_sidopanel_fold.js faller ihop den vid mobilstackning. Deklarationerna
 * ar medvetet SAMMA som ko-foldens (44px traffyta, egen chevron eftersom
 * display:flex tappar den nativa list-item-markoren, egen fokusring eftersom
 * kind.css delade :focus-visible bara tacker a/button/input/textarea/select).
 * De ar INTE hopslagna till en delad selektorlista: ko-folden bor i en zon som
 * ar helt ur flodet vid <=900px (CP14-KOZON-MOBIL) medan den har ar synlig
 * just dar, sa de tva kommer att drifta isar av riktiga skal. */
.kind-sidopanel-fold > summary {
  display: flex;
  align-items: center;
  gap: var(--kind-space-2);
  min-height: 44px;
  padding: var(--kind-space-2) var(--kind-space-3);
  border-radius: var(--kind-radius);
  cursor: pointer;
  font-weight: 600;
}
.kind-sidopanel-fold > summary::-webkit-details-marker { display: none; }
.kind-sidopanel-fold > summary::before {
  content: "\25B8";
  color: var(--kind-color-text-muted);
}
.kind-sidopanel-fold[open] > summary::before {
  content: "\25BE";
}
.kind-sidopanel-fold > summary:hover {
  background: var(--kind-color-surface-muted);
}
.kind-sidopanel-fold > summary:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}
@media (min-width: 901px) {
  .kind-sidopanel-fold > summary { display: none; }
}

.kind-arbetsvy__ko-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-1);
}
.kind-arbetsvy__ko-item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--kind-space-2);
  padding: var(--kind-space-2) var(--kind-space-3);
  border-radius: var(--kind-radius);
  text-decoration: none;
  color: var(--kind-color-text);
  /* KONSTANT kantbredd, FÄRGEN är det enda tillståndet byter (--active,
     --akut nedan). Det är därför rälsen aldrig haft patientlistans 3px-hopp,
     och det är mönstret #236 kopierade dit, se .kind-ko__item. Ändra ALDRIG
     bredden per tillstånd här, då börjar ohanterat-markören nedan hoppa. */
  border-left: 3px solid transparent;
  /* #236: containing block för ohanterat-markören. */
  position: relative;
}
.kind-arbetsvy__ko-item:hover { background: var(--kind-color-surface-muted); }
.kind-arbetsvy__ko-item:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}
/* The conversation currently open in the center pane. The accent bar + muted
 * surface mark "you are here" without relying on colour alone (the
 * aria-current="true" carries it for assistive tech). */
.kind-arbetsvy__ko-item--active {
  background: var(--kind-color-accent-bg);
  border-left-color: var(--kind-color-accent);
  font-weight: 600;
}
.kind-arbetsvy__ko-item--akut { border-left-color: var(--kind-color-error); }
/* #236 (K32): SAMMA bärare som patientlistans, se den långa noten vid
 * .kind-ko__item--ohanterad. Åtgärden landar på BÅDA vårdgivarbärarna i samma
 * ändring (regel 27 korollarium 2), annars säger de två ytorna emot varandra
 * om exakt det tillstånd kravet gäller. Ingen calc behövs här: rälsens
 * kantbredd är konstant 3px i alla tillstånd, så markörens vänsterkant ligger
 * redan på samma x på varje post. KOLLEGIE-CHATTEN får INGEN markör:
 * team_chat-tabellerna saknar hanterat-kolumn i schemat (migration 0045, ingen
 * senare migration rör dem), alltså existerar tillståndet inte i datamodellen
 * där. */
.kind-arbetsvy__ko-item--ohanterad::before {
  content: "";
  position: absolute;
  inset-block: 0;
  inset-inline-start: 0;
  inline-size: 4px;
  background: var(--kind-color-border-strong);
  border-start-start-radius: inherit;
  border-end-start-radius: inherit;
  pointer-events: none;
}
/* MISC-03 (UAT retest 2026-07-16): min-width: 0 releases the flex-item
   automatic minimum (min-width: auto), WITHOUT which the nowrap name never
   actually shrinks, the ellipsis never engages, and a long patient name
   shoves the badge cluster off the 240px rail edge (the rail's overflow-y:
   auto coerces overflow-x and CLIPS whatever leaves it). */
.kind-arbetsvy__ko-namn {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
/* MISC-03: the badge cluster (Brådskande + oläst + Hanterad) must WRAP inside
   the narrow rail, never clip. flex-wrap lets the badges break onto new lines
   when the cluster exceeds the rail's content width, and dropping the old
   flex-shrink: 0 lets the cluster itself shrink to the line (its min-width:
   auto floor is then the WIDEST SINGLE BADGE, which fits the 240px rail, so
   no badge is ever squeezed). The row (.kind-arbetsvy__ko-item) already
   carries flex-wrap: wrap (ADR-047 block below), so the whole cluster can
   also drop under the name when they cannot share a line. */
.kind-arbetsvy__ko-meta {
  display: inline-flex;
  align-items: center;
  gap: var(--kind-space-1);
  flex-wrap: wrap;
}
/* MISC-03: badges keep their intrinsic width and WRAP as units; without this
   a squeezed badge would fold its own label text ("✓ Hanterad" on two lines
   inside the pill) instead of moving to the next line. Scoped to the rail
   cluster, the global .kind-badge is untouched (blast radius). */
.kind-arbetsvy__ko-meta .kind-badge {
  white-space: nowrap;
}
/* ADR-047 (#11): the "Ansvarig: <namn>" line on ANDRAS rows. The ko-item is a
 * flex row (namn left, meta right via space-between); this line is a full-width
 * third child that wraps onto its own line beneath, so my-rows stay compact and
 * only colleague rows pay the extra height (the rail-density trade-off accepted
 * in the ADR). Muted so it annotates without competing with the patient name. */
.kind-arbetsvy__ko-item {
  flex-wrap: wrap;
}
.kind-arbetsvy__ko-ansvarig {
  flex-basis: 100%;
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
}

/* Center pane: the conversation. Reuses the .kind-chat block. */
.kind-arbetsvy__chat {
  min-width: 0;
}

/* HÄR LÅG HÖGERPANELEN (borttagen 2026-07-27, issue #80): `.kind-arbetsvy__patient`
 * med sin bakgrund, kant och sticky-blocket vid >=1281px, `.kind-arbetsvy__section`
 * (sektionsavdelarna inuti den) och `.kind-arbetsvy__pending` (den kursiva
 * "kommer snart"-tonen på AT-29/AT-42-platshållarna). Alla tre var ENBART
 * panelens, ingen annan yta använde dem, så de är borta i samma ändring som
 * markupen: kvarlämnad död CSS får nästa granskning att tro att panelen finns
 * kvar (regel 27). Skälen till borttagningen står vid `.kind-arbetsvy` ovan.
 *
 * KVAR med avsikt: `.kind-arbetsvy__pane-title` (bär kö-rälsens rubrik
 * "Arbetskö"), samt `.kind-triage--akut`, `.kind-triage__resultat` och
 * `.kind-formularsvar-detalj`, som alla används av templates/admin/patient.html
 * där panelens innehåll numera läses. */

.kind-link { color: var(--kind-color-accent); }

/* ============ G7 Kollegor team chat (ADR-031) ============ */

/* Usage-guidance note (ADR-031 §5 policy boundary): a quiet info strip that
 * keeps "no patient data here" visible at the point of use. Info palette so it
 * informs without alarming; text colour is --kind-color-text (not muted) so the
 * boundary reads at AA on the soft info background. */
.kind-kollegor-note {
  display: flex;
  align-items: flex-start;
  gap: var(--kind-space-2);
  margin: var(--kind-space-3) 0 var(--kind-space-5);
  padding: var(--kind-space-3);
  background: var(--kind-color-info-bg);
  border: 1px solid var(--kind-color-info);
  border-radius: var(--kind-radius);
  color: var(--kind-color-text);
}
.kind-kollegor-note__icon {
  display: inline-flex;
  flex: none;
  color: var(--kind-color-info);
}

/* Participant multi-select. A checkbox list where each label is a full-width,
 * >=44px (WCAG 2.5.5) tap target with the box + name + role badge on one row.
 * The label highlights on hover/focus-within so the whole row reads as
 * clickable. */
.kind-deltagare__list {
  list-style: none;
  margin: var(--kind-space-2) 0 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-1);
}
.kind-deltagare__item { margin: 0; }
/* CP-02-resten (#87): kryssrutans etikett ÄR träffytan, alltså en kontroll
   (kind.css §1 WATCH-ITEM 1), inte en gruppering. */
.kind-deltagare__label {
  display: flex;
  /* #158: raden var `nowrap`, alltså är dess min-content SUMMAN av kryssrutan,
     namnet och rollbadgen. Badgen är `flex: none` och mäter 173px vid xxlarge,
     så den kan inte krympa, och namnet höll sig konstlat smalt bara så länge
     `hyphens: auto` avstavade det (uppmätt: "Eva Lundström" 41.6px avstavat
     mot 111.4px helt). Ytan sköt REDAN ut dokumentet 30px vid 320px xxlarge i
     nuläget, alltså var avstavningen en maskering och inte en lösning, och
     utan `wrap` hade #158-fixen tagit den till 97px. Med `wrap` blir radens
     min-content MAX i stället för SUMMA: badgen faller ned under namnet när
     raden inte räcker till, och dokumentets sidledsöverskott går till 0. */
  flex-wrap: wrap;
  align-items: center;
  gap: var(--kind-space-3);
  min-height: 44px;
  padding: var(--kind-space-2) var(--kind-space-3);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius-sm, 8px);
  cursor: pointer;
}
.kind-deltagare__label:hover {
  background: var(--kind-color-surface-muted);
}
/* The native checkbox owns the focus ring (global :focus-visible). Mirror it
 * onto the row so keyboard focus is visible on the whole label, not just the
 * 16px box. */
.kind-deltagare__label:focus-within {
  outline: var(--kind-focus-ring);
  outline-offset: var(--kind-focus-ring-offset);
}
.kind-deltagare__checkbox {
  flex: none;
  width: 1.15rem;
  height: 1.15rem;
}
.kind-deltagare__namn { flex: 1; }
.kind-deltagare__roll { flex: none; }

/* Team-chat list rows. The whole row is one link (title + unread badge on top,
 * participant count + last-activity below). Mirrors the patient-list row feel
 * but staff-coloured. */
.kind-team-chat-list { gap: var(--kind-space-2); }
.kind-team-chat-list__link {
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-1);
  padding: var(--kind-space-3);
}
.kind-team-chat-list__main {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--kind-space-2) var(--kind-space-3);
}
.kind-team-chat-list__titel {
  font-weight: 600;
}
.kind-team-chat-list__meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-2) var(--kind-space-4);
}

/* Team-chat thread. Reuses the patient-chat bubble classes (kind-chat__log,
 * kind-chat__message, --self, kind-chat__compose from kind_patient.css); only
 * the header + archived notice are team-specific. */
.kind-team-chat__header {
  padding-bottom: var(--kind-space-3);
  border-bottom: 1px solid var(--kind-color-border);
  margin-bottom: var(--kind-space-3);
}
.kind-team-chat__meta {
  color: var(--kind-color-text-muted);
  font-size: var(--kind-font-small);
  margin: var(--kind-space-1) 0 0;
}
.kind-team-chat__archived {
  display: flex;
  align-items: flex-start;
  gap: var(--kind-space-2);
  margin: var(--kind-space-3) 0;
  padding: var(--kind-space-3);
  background: var(--kind-color-surface-muted);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  color: var(--kind-color-text);
}

/* --------------------------------------------------------------------------
 * Wave 3b (S5.1), omgjord i web#220 (ADR-072): patientsidans sektion
 * "Tilldelad till" plus helsidan "Välj kollegor".
 *
 * Sektionen är nu en LISTA (namn + telefonnummer per rad) och en länkrad som
 * öppnar väljaren; rullgardinen, disclosure-JS:en och det separata
 * "Ta bort tilldelning"-formuläret utgick med den atomiska ändringen.
 * Återanvänder .kind-profile-section (marginal) och .kind-btn-familjen.
 * -------------------------------------------------------------------------- */
.kind-assign__status {
  margin: 0;
  line-height: 1.5;
}
.kind-assign__redigera {
  margin: 0 0 var(--kind-space-3) 0;
}
.kind-assign__lista {
  list-style: none;
  margin: 0;
  padding: 0;
}
.kind-assign__rad {
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-2);
  align-items: baseline;
  padding: var(--kind-space-2) 0;
}
.kind-assign__namn {
  font-weight: 600;
}
.kind-assign__telefon {
  color: var(--kind-color-text-muted);
}

/* Helsidan "Välj kollegor". Sidhuvudet bär Avbryt / titel + "{n} valda" /
   Klar, precis som kundens produkt. Raderna är <label> runt en riktig
   kryssruta: hela raden är klickbar, markeringen är en äkta formkontroll och
   sidan fungerar utan JavaScript. */
.kind-valjkollegor__huvud {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--kind-space-3);
  margin-bottom: var(--kind-space-4);
}
.kind-valjkollegor__titel {
  text-align: center;
  margin: 0;
}
.kind-valjkollegor__antal {
  display: block;
  font-size: 0.875rem;
  font-weight: 400;
  color: var(--kind-color-text-muted);
}
.kind-valjkollegor__sok {
  margin-bottom: var(--kind-space-3);
}
.kind-valjkollegor__listhuvud {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--kind-space-3);
  margin-bottom: var(--kind-space-2);
  color: var(--kind-color-text-muted);
}
/* Listhuvudet DÖLJS när sökningen inte ger några träffar: skriptet sätter
   `listhuvud.hidden = true` (kind_valj_kollegor.js). Utan den här raden är det
   attributet INERT -- UA-arkets `[hidden] { display: none }` förlorar mot
   regeln ovan på ursprungsprecedens, oavsett specificitet, så "16 kollegor"
   stod kvar över en tom lista (Alex underkännande 2026-09-25, web#220).
   Samma gard, samma form, som raden strax nedan för `__rad` och som
   `.kind-arbetsvy__ko-toggle[hidden]` vid :6318-6327. */
.kind-valjkollegor__listhuvud[hidden] { display: none; }
.kind-valjkollegor__lista {
  list-style: none;
  margin: 0;
  padding: 0;
}
.kind-valjkollegor__rad {
  border-bottom: 1px solid var(--kind-color-border);
}
.kind-valjkollegor__rad[hidden] { display: none; }
.kind-valjkollegor__etikett {
  display: flex;
  align-items: center;
  gap: var(--kind-space-3);
  /* A6 / 2.5.8 Target Size: hela raden är träffytan, minst 44px hög. */
  min-height: 44px;
  padding: var(--kind-space-2) 0;
  cursor: pointer;
}
.kind-valjkollegor__kollega {
  display: flex;
  flex-direction: column;
  /* Namnet och numret tar utrymmet; markeringen puttas längst till höger. */
  flex: 1 1 auto;
  min-width: 0;
}
/* Markeringen är RUND och står längst till höger på raden, som i kundens
   produkt ("en rund markering", web#220:s acceptans). Den är fortfarande en
   ÄKTA <input type="checkbox"> inne i radens <label>: tangentbord, skärmläsare
   och no-JS-postningen är webbläsarens egna, bara formen är vår.

   Vald/ovald skiljs på FYLLNAD (ifylld ring mot tom ring), inte bara på kulör,
   och tillståndet finns dessutom i kontrollens egen semantik plus i räknaren
   "{n} valda" -- färg är alltså aldrig ensam bärare (WCAG 2.2 1.4.1). I
   forced-colors-läge lämnar vi tillbaka den nativa kontrollen, som är det enda
   som garanterat följer användarens egen palett. */
.kind-valjkollegor__markering {
  flex: 0 0 auto;
  margin-left: auto;
  width: 24px;
  height: 24px;
  appearance: none;
  -webkit-appearance: none;
  border: 2px solid var(--kind-color-border);
  border-radius: 50%;
  background: var(--kind-color-surface);
  cursor: pointer;
}
.kind-valjkollegor__markering:checked {
  border-color: var(--kind-color-accent);
  background: var(--kind-color-accent);
  /* Den inre ringen i ytans färg gör den valda markeringen till en ifylld
     prick, alltså en FORMskillnad och inte bara en färgskillnad. */
  box-shadow: inset 0 0 0 4px var(--kind-color-surface);
}
@media (forced-colors: active) {
  .kind-valjkollegor__markering {
    appearance: auto;
    -webkit-appearance: auto;
  }
}
.kind-valjkollegor__telefon {
  color: var(--kind-color-text-muted);
  font-size: 0.875rem;
}
.kind-valjkollegor__tom {
  color: var(--kind-color-text-muted);
}

/* --------------------------------------------------------------------------
 * Wave 3c (S5.2): patient-panel Taggar chips ("Taggar").
 *
 * Chips with a per-chip remove "×" and an add input + "Lägg till". The remove
 * control is a real <button> with a per-chip aria-label (set in the template),
 * sized >= 24x24 and aimed at 44 (A6 / 2.5.8 Target Size). Reuses .kind-field*,
 * .kind-btn, and the design tokens; only the chip layout is new.
 * -------------------------------------------------------------------------- */
.kind-taggar__chips {
  list-style: none;
  margin: 0 0 var(--kind-space-4) 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-2);
}
.kind-taggar__chip {
  display: inline-flex;
  align-items: center;
  gap: var(--kind-space-1);
  padding: var(--kind-space-1) var(--kind-space-1) var(--kind-space-1) var(--kind-space-3);
  border: 1px solid var(--kind-color-border);
  border-radius: 999px;
  background: var(--kind-color-surface-muted);
  color: var(--kind-color-text);
  max-width: 100%;
}
.kind-taggar__chip-label {
  overflow-wrap: anywhere;
  line-height: 1.4;
}
/* web#468: klicka pa taggen for att kopiera den. Renderas `hidden` och visas av
   kind_taggar.js bara nar urklipps-API:t finns, sa en webblasare utan det far
   kvar den rena `.kind-taggar__chip-label`-texten. Knappen ska SE UT som texten
   den ersatter -- den ar en kopieringsaffordans, inte en andra "knapp" bredvid
   krysset -- men bara bete sig som en knapp (pekare, fokusring, >= 24px hojd
   for 2.5.8 Target Size). */
.kind-taggar__chip-copy {
  display: inline-flex;
  align-items: center;
  min-height: 24px;
  margin: 0;
  padding: 0;
  border: 0;
  background: transparent;
  color: inherit;
  font: inherit;
  text-align: left;
  cursor: pointer;
}
/* [hidden]-garden. `[hidden] { display: none }` bor i UA-lagret, sa
   `display: inline-flex` ovan slar den och skulle gora attributet INERT --
   knappen hade malats aven i sitt dolda utgangslage, alltsa dubbel taggtext
   innan kind_taggar.js hunnit kora. Samma gard som repots ovriga 27 klasser
   (tests/test_hidden_display_gard.py verkstaller den). */
.kind-taggar__chip-copy[hidden] {
  display: none;
}
.kind-taggar__chip-copy:hover .kind-taggar__chip-label {
  text-decoration: underline;
}
/* Synlig fokusring (2.4.7); behallen outline sa forced-colors-lage behaller
   den. Kontrast >= 3:1 (1.4.11) via samma token som krysset. */
.kind-taggar__chip-copy:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
  border-radius: 999px;
}
/* Kvittensen ("Tagg kopierad"). Tom vid sidvisning, sa den far ingen marginal
   som skulle lamna ett hal i layouten innan den anvands. */
.kind-taggar__status {
  margin: 0 0 var(--kind-space-2) 0;
  color: var(--kind-color-text-muted);
  font-size: 0.875rem;
}
.kind-taggar__status:empty {
  margin: 0;
}
/* The remove form is a layout-neutral wrapper around the "×" button so the
   per-chip CSRF POST does not introduce a flex gap of its own. */
.kind-taggar__remove-form {
  display: inline-flex;
  margin: 0;
}
.kind-taggar__remove {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* Target size: 28px nominal hit area, generously above the 24px 2.2 minimum
     (A6); the focus ring + the rounded shape keep it comfortable. */
  width: 28px;
  height: 28px;
  padding: 0;
  border: 1px solid transparent;
  border-radius: 999px;
  background: transparent;
  color: var(--kind-color-text-muted);
  font: inherit;
  font-size: 1.25rem;
  line-height: 1;
  cursor: pointer;
}
.kind-taggar__remove:hover {
  background: var(--kind-color-surface);
  color: var(--kind-color-accent);
}
/* Visible focus ring (2.4.7 Focus Visible); retained outline so forced-colors
   users keep it. Non-text contrast of the ring >= 3:1 (1.4.11). */
.kind-taggar__remove:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 1px;
}
.kind-taggar__add {
  margin-top: var(--kind-space-2);
}
.kind-taggar__add-row {
  display: flex;
  flex-wrap: wrap;
  align-items: flex-end;
  gap: var(--kind-space-2);
}
.kind-taggar__input {
  flex: 1 1 14rem;
  min-width: 0;
}

/* --------------------------------------------------------------------------
   BROADCAST / Massutskick (FEATURE_BROADCAST, Step-1 roadmap). The klinik-staff
   compose page (templates/admin/broadcast.html): message body + segment picker
   (tag and/or assigned patients) + a recipient-count preview + a
   governance-aware confirm-before-send dialog (reuses .kind-dialog above). All
   markup is absent when the flag is OFF, so this CSS is inert in 2.0 until the
   flag flips. Reuses shared tokens so colours keep their documented WCAG 2.2 AA
   contrast (kind.css token comments).
   -------------------------------------------------------------------------- */
.kind-broadcast {
  max-width: var(--kind-container-narrow);
  margin: 0 auto;
  padding: var(--kind-space-4) 0;
}
.kind-broadcast__lede {
  color: var(--kind-color-text-muted);
  font-size: 1.0625rem;
  line-height: 1.5;
  margin: var(--kind-space-2) 0 var(--kind-space-5) 0;
}

/* Kundissue #436 (konsultbeslut 2026-08-31): informationsrutan
   `.kind-broadcast__governance` med rubriken "Så hanteras massutskick" är
   borttagen ur templates/admin/broadcast.html, så dess fem regler är
   BORTTAGNA HÄR OCKSÅ i stället för att stå kvar som död CSS. En kvarlämnad
   regel vars klass ingen mall bär skyddar ingenting, den ser bara ut att göra
   det (samma hållning som tests/test_cp0405_typografi_form.py:67). Lägg inte
   tillbaka reglerna utan att markupen kommer tillbaka först. */

.kind-broadcast__form {
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-4);
}
.kind-broadcast__textarea {
  resize: vertical;
  min-height: 8rem;
  font-family: inherit;
  line-height: 1.5;
}

/* Segment picker fieldset: groups the tag input + the assigned-patients
   checkbox under one legend. */
.kind-broadcast__segment {
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-4);
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-3);
}
.kind-broadcast__segment-legend {
  font-weight: 600;
  padding: 0 var(--kind-space-2);
  color: var(--kind-color-text);
}
.kind-broadcast__checkbox-label {
  display: flex;
  align-items: baseline;
  gap: var(--kind-space-2);
  cursor: pointer;
}
/* Touch target: the checkbox itself + label form a comfortable hit area; size
   the control up so it clears the 24x24 minimum (WCAG 2.2 2.5.8) with room. */
.kind-broadcast__checkbox-label input[type="checkbox"] {
  width: 1.25rem;
  height: 1.25rem;
  flex: 0 0 auto;
  accent-color: var(--kind-color-accent);
}

/* vg-12-01 (P-lanen 2026-08-16): den lopande mottagarraknaren "N valda".
   Diskret metatext, ingen ruta: talet ar en stallningsindikator, inte ett
   besked. Uppdateras av kind_broadcast.js (0 valda i vila / efter andring). */
.kind-broadcast__valda {
  margin: 0;
  color: var(--kind-color-text-muted);
  font-size: 0.9375rem;
  line-height: 1.4;
}

/* Recipient-count + validation line. Empty (no box) until populated, so the
   server-rendered empty region adds no visual weight. The script adds a variant
   class for the count vs an error vs a zero-result message. */
.kind-broadcast__count:not(:empty) {
  margin: 0;
  padding: var(--kind-space-3) var(--kind-space-4);
  border-radius: var(--kind-radius);
  border: 1px solid var(--kind-color-border);
  background: var(--kind-color-surface-muted);
  color: var(--kind-color-text);
  font-size: 1.0625rem;
  line-height: 1.4;
}
.kind-broadcast__count--ok:not(:empty) {
  background: var(--kind-color-success-bg);
  border-color: var(--kind-color-success);
}
.kind-broadcast__count--warn:not(:empty) {
  background: var(--kind-color-warning-bg);
  border-color: var(--kind-color-warning);
}
.kind-broadcast__count--error:not(:empty) {
  background: var(--kind-color-accent-soft);
  border-color: var(--kind-color-accent);
}

/* Best-effort Art.9 warning (broadcast-governance-verdict bit 3, wired by
   kind_broadcast.js from the preview's art9_varningar). Server-rendered hidden +
   empty; the script unhides + populates it when the composed body looks like it
   carries health data. Styled as a clear, spottable amber nudge (NOT plain body
   text, so a clinician cannot skim past a health-data warning) using the warning
   token; meaning never rests on colour alone (the text spells out the warning,
   and role="alert" announces it). [hidden] is respected so the empty region
   adds no weight until it trips. */
.kind-broadcast__art9-warning {
  margin: 0;
  padding: var(--kind-space-3) var(--kind-space-4);
  border-radius: var(--kind-radius);
  border: 1px solid var(--kind-color-warning);
  border-left-width: 4px;
  background: var(--kind-color-warning-bg);
  color: var(--kind-color-text);
  font-size: 1.0625rem;
  line-height: 1.45;
}
.kind-broadcast__art9-warning[hidden] {
  display: none;
}

.kind-broadcast__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-3);
}

/* Confirm-dialog result/error line (inside the .kind-dialog panel). */
.kind-broadcast__confirm-status:not(:empty) {
  margin: 0;
  padding: var(--kind-space-2) var(--kind-space-3);
  border-radius: var(--kind-radius);
  background: var(--kind-color-surface-muted);
  color: var(--kind-color-text);
  line-height: 1.4;
}
.kind-broadcast__confirm-status--ok:not(:empty) {
  background: var(--kind-color-success-bg);
}
.kind-broadcast__confirm-status--warn:not(:empty) {
  background: var(--kind-color-warning-bg);
}
.kind-broadcast__confirm-status--error:not(:empty) {
  background: var(--kind-color-accent-soft);
}

/* ------------------------------------------------------------------ */
/* Tillgänglighet, the klinik-admin availability editor (ADR-046 W5). */
/* Two side-by-side columns (recurring work-hours + exceptions) above  */
/* a full-width preview of the generated free slots. Collapses to one  */
/* column at the same 900px breakpoint the rest of the admin uses.     */
/* ------------------------------------------------------------------ */
.kind-tillg__intro {
  max-width: 60ch;
  color: var(--kind-color-text-muted);
  line-height: 1.5;
  margin: var(--kind-space-2) 0 var(--kind-space-5);
}

/* issue #153: WCAG 2.2 AA SC 1.4.10 (Reflow). `minmax(0, ...)` och inte en bar
   `1fr`, av EXAKT samma orsak som CP-15 (#100) pa `.kind-profile-grid` och
   CP-14 pa `.kind-chatt-layout`. Det har ar alltsa den TREDJE barare av samma
   mekanism, och den enda som inte svepts nar de tva forsta atgardades.

   Utan `minmax(0, ...)` blaser kolumnen ut dokumentet pa VARJE textskala.
   Uppmatt pa deployen 2.3.1-nordiccare-w32 som klinik-admin, alla 20
   matpunkter (320/375/390/412/430):

     normal   151 / 96 / 81 / 59 / 41 px
     large    202 / 147 / 132 / 110 / 92 px
     xlarge   253 / 198 / 183 / 161 / 143 px
     xxlarge  358 / 303 / 288 / 266 / 248 px

   plus 421px vid 901px och 42px vid 1280px i TVAKOLUMNSLAGET, alltsa varre an
   det rapporterade mobilfallet. Issue #153 rapporterade bara xxlarge-raden.

   MEKANISMEN AR INTE TABELLEN, trots att `table.kind-table` ar det som syns
   passera viewportkanten. `.kind-tillg__col` ar ett GRID ITEM, och ett grid
   item har `min-width: auto`, vars automatiska minimistorlek ar innehallets
   min-content. En bar `1fr` ar `minmax(auto, 1fr)`, alltsa golvas sparet av
   just den min-contenten: 655px i en 272px bred container. `.kind-table-wrap`
   inuti ar redan en scrollport (overflow-x:auto), men den raddar ingenting
   har, eftersom nollningen av automatisk minimistorlek galler scrollporten
   NAR DEN SJALV ar flex- eller griditemet, och har ar den ett blockbarn tva
   nivaer ner. Wrappen stracks alltsa ut till det utblasta sparet och engagerar
   aldrig sin scroll: uppmatt scrollWidth == clientWidth == 653 samtidigt som
   DOKUMENTET skrollade 359px.

   VARFOER INTE `overflow-wrap: anywhere` PA CELLERNA, den till synes
   uppenbara fixen. Uppmatt i ablation: den tar ocksa bort skrollen, men driver
   maximal radhojd fran 109px till 721px vid 320/xxlarge, alltsa exakt den
   teckenvisa krossning KIND underkande som KIND-FIND-01 (se
   `.kind-table--scroll-floor` ovan). Den vagen loser ett matt genom att bryta
   ett grannmatt. Fixen ror darfoer INTE `.kind-table`, som delas av 18 mallar.

   `min-width: 0` pa `.kind-tillg__col` mattes som LIKVARDIGT (bada gav 0px pa
   samtliga 72 matpunkter). `minmax(0, ...)` valdes anda, eftersom en bar `1fr`
   ar sokmonstret man letar efter nar man sveper efter fler barare av den har
   mekanismen. Med item-varianten hade den har ytan sett OATGARDAD ut i ett
   sadant svep.

   Sidledsskroll INUTI wrappen ar det AVSEDDA utfallet, inte en biverkning:
   wrappen ar byggd for det (overflow-x:auto + tabindex="0" + role="region" +
   aria-label "blaeddra i sidled"), och WCAG 1.4.10 undantar uttryckligen
   datatabeller fran kravet pa skroll i bara en riktning.

   Vakt: e2e/hskroll-tillganglighet-grind.mjs (mater black, inte forekomst av
   en CSS-regel) plus tests/test_tillganglighet_reflow_css.py. */
.kind-tillg__columns {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: var(--kind-space-6);
  margin-top: var(--kind-space-5);
}
@media (max-width: 900px) {
  .kind-tillg__columns { grid-template-columns: minmax(0, 1fr); }
}

.kind-tillg__col-heading {
  font-size: var(--kind-font-base);
  margin: 0 0 var(--kind-space-3);
}

/* Space the "add" form away from the current-state table above it. */
.kind-tillg__form {
  margin-top: var(--kind-space-5);
}

.kind-tillg__preview {
  margin-top: var(--kind-space-7);
  border-top: 1px solid var(--kind-color-border-soft);
  padding-top: var(--kind-space-5);
}

.kind-tillg__preview-count {
  color: var(--kind-color-text-muted);
  margin: 0 0 var(--kind-space-3);
}

/* ============================================================
 * 3.0 issue #17: insights-dashboard CSS bar chart (no client JS).
 *
 * Server-rendered bars: each column's height is set inline as a % of the
 * window max. The bars are aria-hidden decoration; the same numbers appear
 * in text (the equivalent <table> and the legend), so colour is never the
 * sole carrier (WCAG 1.4.1) and a no-CSS reader still gets the full data.
 * The three series use distinct, AA-contrasting brand tokens (coral / slate-
 * blue / green), which also differ in HUE so they are distinguishable under
 * common colour-vision deficiencies; the legend names each in text.
 * ============================================================ */

.kind-insikter__block-head {
  margin-top: var(--kind-space-6);
}

/* Time-range selector (#17 INCREMENT 3 metric 4): a compact inline row, label
 * beside the select, sitting under the page intro. The select reuses the shared
 * .kind-field__input styling so it matches every other control. */
.kind-insikter__period {
  display: flex;
  align-items: center;
  gap: var(--kind-space-2);
  flex-wrap: wrap;
  margin: 0 0 var(--kind-space-4);
}

.kind-insikter__period .kind-field__input {
  width: auto;
  min-width: 10rem;
}

.kind-bars {
  display: flex;
  align-items: flex-end;
  gap: var(--kind-space-2);
  height: 180px;
  padding: var(--kind-space-3) var(--kind-space-2) 0;
  margin: 0 0 var(--kind-space-2);
  overflow-x: auto;
  background: var(--kind-color-surface-muted);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
}

/* The chart is a horizontal scroll container at narrow widths. Its tabindex
   makes the complete visual chart reachable with a keyboard; the equivalent
   table below remains the authoritative text alternative. */
.kind-bars:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}

.kind-bars__group {
  display: flex;
  flex-direction: column;
  align-items: center;
  /* Roomier per-week group so the 3 bars + their gaps breathe; the group never
     shrinks below a comfortable touch/read width (the chart scrolls instead of
     cramming, with the overflow-x on .kind-bars as the affordance). */
  flex: 0 0 3rem;
  height: 100%;
  justify-content: flex-end;
}

.kind-bars__cols {
  display: flex;
  align-items: flex-end;
  gap: 3px;
  height: 100%;
  width: 100%;
  justify-content: center;
}

.kind-bars__col {
  display: block;
  width: 0.55rem;
  min-height: 3px;            /* a zero count still shows a visible baseline */
  border-radius: 2px 2px 0 0;
  background: var(--kind-color-border);
  /* A hairline outline so each bar's edge reads against the muted surface AND
     against an adjacent series, in BOTH colour-schemes and in high-contrast
     (WCAG 1.4.11 robustness; the table stays the authoritative equivalent). */
  outline: 1px solid var(--kind-color-border-strong, var(--kind-color-border));
  outline-offset: -1px;
}

.kind-bars__col--bokningar     { background: var(--kind-color-accent); }
.kind-bars__col--meddelanden   { background: var(--kind-color-info); }
.kind-bars__col--konversationer { background: var(--kind-color-success); }

.kind-bars__label {
  margin-top: var(--kind-space-1);
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
  white-space: nowrap;
}

/* Narrow viewport (phone / 320px reflow, WCAG 1.4.10): shorten the chart so it
   does not dominate the fold, tighten the groups, and keep the horizontal scroll
   (the table below carries the same numbers, so no data is lost either way). */
@media (max-width: 600px) {
  .kind-bars {
    height: 140px;
    gap: var(--kind-space-1);
  }
  .kind-bars__group {
    flex-basis: 2.5rem;
  }
  .kind-bars__col {
    width: 0.45rem;
  }
}

.kind-legend {
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-3);
  list-style: none;
  padding: 0;
  margin: 0 0 var(--kind-space-4);
  font-size: var(--kind-font-small);
  color: var(--kind-color-text);
}

.kind-legend__item {
  display: inline-flex;
  align-items: center;
  gap: var(--kind-space-1);
}

.kind-legend__swatch {
  display: inline-block;
  width: 0.85rem;
  height: 0.85rem;
  border-radius: 2px;
  flex: none;
  /* Same hairline as the bars so the swatch edge reads against the page surface
     in both colour-schemes (WCAG 1.4.11); the legend label text is the primary
     carrier (the legend is aria-hidden, the table is the AT equivalent). */
  outline: 1px solid var(--kind-color-border-strong, var(--kind-color-border));
  outline-offset: -1px;
}

/* ----------------------------------------------------------------------------
 * #10 Verksamhet panel (ADR-050), on the patient detail page. Dark behind
 * FEATURE_SUB_WORKSPACES (the panel does not render with the flag OFF, so these
 * rules are inert on the deploy). Tokens only (both colour-schemes + the patient
 * high-contrast mode read correctly). Targets >=44px (healthcare floor).
 * ------------------------------------------------------------------------- */
.kind-verksamhet__chips {
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-2);
  list-style: none;
  padding: 0;
  margin: 0 0 var(--kind-space-3);
}

.kind-verksamhet__chip {
  display: inline-flex;
  align-items: center;
  gap: var(--kind-space-1);
  min-height: 44px;
  padding: var(--kind-space-1) var(--kind-space-1) var(--kind-space-1) var(--kind-space-3);
  background: var(--kind-color-surface-muted);
  border: 1px solid var(--kind-color-border);
  border-radius: 999px;
}

.kind-verksamhet__chip-label {
  font-size: var(--kind-font-small);
  color: var(--kind-color-text);
}

.kind-verksamhet__chip-remove {
  display: inline-flex;
  margin: 0;
}

.kind-verksamhet__chip-x {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  padding: 0;
  font-size: 1.25rem;
  line-height: 1;
  color: var(--kind-color-text-muted);
  background: transparent;
  border: none;
  border-radius: 999px;
  cursor: pointer;
}

.kind-verksamhet__chip-x:hover {
  color: var(--kind-color-text);
  background: var(--kind-color-surface);
}

.kind-verksamhet__add {
  margin: 0 0 var(--kind-space-3);
}

.kind-verksamhet__move {
  margin-top: var(--kind-space-3);
  border-top: 1px solid var(--kind-color-border);
  padding-top: var(--kind-space-3);
}

.kind-verksamhet__move > summary {
  display: inline-flex;
}

.kind-verksamhet__move-panel {
  margin-top: var(--kind-space-3);
}

.kind-verksamhet__move-title {
  margin: 0 0 var(--kind-space-3);
  /* CP-04: var --kind-font-body, ett token som ALDRIG deklarerats. En var() mot
     ett odefinierat token utan fallback gör deklarationen ogiltig vid beräknat
     värde, så raden gjorde ingenting alls och rubriken ärvde sin storlek. Rättad
     till det token som faktiskt bär brödtextstorleken. */
  font-size: var(--kind-font-base);
}

/* The two explicit FÖLJER MED / STANNAR lists: two columns on a roomy viewport,
 * stacked single-column at narrow (reflow to 320px, WCAG 1.4.10). */
.kind-verksamhet__move-lists {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--kind-space-4);
  margin: var(--kind-space-3) 0;
}

.kind-verksamhet__move-list-title {
  margin: 0 0 var(--kind-space-1);
  font-size: var(--kind-font-small);
  font-weight: 600;
  color: var(--kind-color-text);
}

.kind-verksamhet__move-actions {
  margin-top: var(--kind-space-3);
}

@media (max-width: 600px) {
  .kind-verksamhet__move-lists {
    grid-template-columns: 1fr;
  }
}

/* #9 guardian panel (ADR-049): the per-relation action cluster (Granska +
 * Återkalla). Reuses the .kind-profile-section / .kind-field* /
 * .kind-checkbox / .kind-btn primitives; these add only layout (gap), tokens
 * only. web#852: the reservnummer -> pnr reconcile <details> and its
 * .kind-vardnadshavare__reconcile* rules are removed from the patient card. */
.kind-vardnadshavare__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-3);
  align-items: flex-start;
  margin-top: var(--kind-space-2);
}

.kind-vardnadshavare__verify {
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-2);
}

/* ============================================================================
 * V3b: artikel-omslag, hantering i redigeringsformen (B7, agents#62, 2026-07-12)
 *
 * LISTANS MINIATYR ÄR BORTTAGEN HÄRIFRÅN, CP-11 (#96) 2026-08-06.
 * `.kind-artikel-thumb`, `.kind-artikel-thumb--default` och
 * `.kind-artikel-thumb-cover` beskrev en 44x44-miniatyr som satt INLINE före
 * titellänken i en tabellcell. Tabellen finns inte längre: vårdgivarens
 * artikellista är den delade artikelraden `.kind-artikelrad` i kind.css, med
 * ett 56px-omslag som flexbarn. Reglerna var därmed död CSS och är borta i
 * SAMMA ändring som mallen, inte lämnade att ruttna.
 *
 * De två testerna som vaktade dem (`test_admin_artikel_thumb_*` i
 * tests/test_artikel_omslag_render.py) pekade på klasserna, inte på beteendet,
 * och hade fortsatt vara GRÖNA mot död CSS efter mallbytet. De pekar nu på
 * `.kind-artikelrad__omslag*` i stället. Regel 27 korollarium: en
 * kontraktsändring sveper varje EXEKVERBAR konsument, inte bara mallen.
 *
 * Kvar här: redigeringsformens förhandsvisning, som är kapad till 200px och
 * krymper med containern (max-width: 100%), så den renderar i sin naturliga
 * 200px inne i en ~288px innehållskolumn vid 320px.
 * ========================================================================== */

.kind-omslag {
  margin-top: var(--kind-space-5);
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-4);
}

/* web#2111: förhandsvisning av den NYSS valda bilden (uppladdad eller från
 * Pexels), före sparning. Egen klass så att .kind-omslag__preview-img fortsatt
 * betyder "sparat omslag"; samma storlekstak. */
.kind-omslag__preview-img,
.kind-omslag__vald-img {
  display: block;
  width: 200px;
  max-width: 100%;
  height: auto;
  border-radius: var(--kind-radius);
  border: 1px solid var(--kind-color-border-soft);
  background: var(--kind-color-surface-muted);
}
/* web#1253: artikel_form.html renderar bilden med `hidden` tills en bild är
 * vald; utan gard vinner display:block ovan och en tom ram målas. */
.kind-omslag__vald-img[hidden] { display: none; }

/* ==========================================================================
 * #223: Pexels-omslagsväljaren (sökruta + miniatyrrutnät).
 *
 * Rutnätet är `auto-fill` med ett 104px minimum, alltså EN kolumn vid 320px och
 * fler när det finns plats, i stället för ett fast kolumnantal som hade tvingat
 * en vågrät skrollyta på mobil. `max-height` plus `overflow-y` gör att 48
 * miniatyrer inte skjuter sparaknappen utanför skärmen; den panelen är ett
 * bildbibliotek man bläddrar i, inte sidans huvudinnehåll.
 *
 * TRÄFFYTAN: cellen är hela etiketten (bilden ingår i <label>), alltså ~104px
 * hög och bred, långt över 44px-golvet. Radioknappen är visuellt gömd men INTE
 * `display: none` och inte `hidden`: den måste vara fokuserbar och nåbar för
 * tangentbord och skärmläsare. Fokusringen renderas på cellen via :focus-within,
 * så tangentbordsnavigering syns trots att kontrollen inte gör det.
 * ========================================================================== */

.kind-pexels {
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-3);
}

.kind-pexels__sokrad {
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-2);
  align-items: flex-end;
}

.kind-pexels__sokrad .kind-field__input {
  flex: 1 1 12rem;
  min-width: 0;
}

.kind-pexels__galleri {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(104px, 1fr));
  gap: var(--kind-space-2);
  max-height: 22rem;
  overflow-y: auto;
}

/* `hidden` är ett SVAGARE värde än en författarregel: `display: grid` ovanför
   vinner över webbläsarens `[hidden] { display: none }`, så rutnätet hade målats
   tomt innan första sökningen. Garden är vad tests/test_hidden_display_gard.py
   kräver av varje klass som renderas med `hidden` och sätter display. */
.kind-pexels__galleri[hidden] {
  display: none;
}

.kind-pexels__cell {
  margin: 0;
}

.kind-pexels__val {
  display: block;
  cursor: pointer;
  border: 2px solid transparent;
  border-radius: var(--kind-radius);
  overflow: hidden;
  background: var(--kind-color-surface-muted);
}

.kind-pexels__val:focus-within {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}

/* Visuellt gömd, fortfarande fokuserbar och exponerad för hjälpmedel. */
.kind-pexels__radio {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  border: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
}

.kind-pexels__bild {
  display: block;
  width: 100%;
  height: 78px;
  object-fit: cover;
}

.kind-pexels__radio:checked + .kind-pexels__bild {
  outline: 3px solid var(--kind-color-accent);
  outline-offset: -3px;
}

.kind-pexels__fotograf {
  display: block;
  padding: var(--kind-space-1) var(--kind-space-2);
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* #223: krediteringsraden (Pexels API Guidelines). Egen marginalnollställning
   eftersom den är ett <p> utanför etiketten, inte ett <span> inuti den. */
.kind-pexels__kredit {
  margin: 0;
}

/* Länken ska LÄSAS som en länk (WCAG 1.4.1: färg får inte vara det enda som
   skiljer den från texten omkring), men får inte skrika i ett rutnät av
   miniatyrer, så den ärver storleken och behåller understrykningen. */
.kind-pexels__kreditlank {
  color: inherit;
  text-decoration: underline;
}

.kind-pexels__kreditlank:hover,
.kind-pexels__kreditlank:focus-visible {
  color: var(--kind-color-text);
}

/* Den fasta Pexels-krediteringen under sökrutan. */
.kind-pexels__kalla {
  margin-top: 0;
}

/* ==========================================================================
 * CP-11 (#96): vårdgivarens artikelbibliotek, sök- och filterpanelen.
 *
 * Radkomponenten själv ligger i static/css/kind.css (`.kind-artikelrad`), delad
 * med artikelväljaren. Här ligger bara det som är BIBLIOTEKSSIDANS eget.
 *
 * ---- TALEN SOM MOTIVERAR KOMPRIMERINGEN --------------------------------
 *
 * Mätt före bygget, `node e2e/cp111214-vardgivare-utfall.mjs`, 40 artiklar:
 *
 *   första artikelradens y-position   463px vid 320 normal, 764px vid 320 xxlarge
 *   hela artikelrader i viewporten    0 vid ALLA fem mobilbredder, båda skalorna
 *   träffytor under 44px              41 (40 "Redigera"-länkar à 18px plus loggan)
 *
 * Rubrikbandet plus det fria introduktionsstycket stod för höjden. Stycket är
 * flyttat in i panelens hjälptext, alltså till fältet det förklarar. Ingen
 * mening är struken.
 * ========================================================================== */
.kind-artikelbibliotek__band {
  margin-bottom: var(--kind-space-3);
}
/* CP-11 uppföljning (#96, ux-beslut 1 2026-08-07). Förval = desktopformen:
   full text, ingen ikon. Pixel-identisk med läget före ändringen
   (kontrakterade desktoptal i §2 får inte röras). */
.kind-artikelbibliotek__ny-ikon {
  display: none;
}
/* Kompaktläget: ENDAST mobilstackning (samma 900px-brytpunkt som panelen)
   OCH förstorad text (samma selektormekanik som CP-14). Bandet blir EN rad:
   uppmätt kostade tvåradsbandet hela den första artikelraden vid mobil
   xxlarge (radunderkant ~672 mot tak 664, §4). Knappen blir REN ikonknapp
   med bevarat tillgängligt namn via aria-label; träffytan bär
   .kind-btn-golvet 44x44. Kort synlig text provades och FÖLL på mätningen:
   h1 bröt till två rader vid samtliga mobilbredder (86-172px band).
   h1 och typskalan orörda (ADR-065 §D4). */
@media (max-width: 900px) {
  html[data-kind-font-scale="xlarge"] .kind-artikelbibliotek__band,
  html[data-kind-font-scale="xxlarge"] .kind-artikelbibliotek__band {
    flex-wrap: nowrap;
    align-items: center;
  }
  html[data-kind-font-scale="xlarge"] .kind-artikelbibliotek__band > h1,
  html[data-kind-font-scale="xxlarge"] .kind-artikelbibliotek__band > h1 {
    margin-bottom: 0;
  }
  html[data-kind-font-scale="xlarge"] .kind-artikelbibliotek__ny-full,
  html[data-kind-font-scale="xxlarge"] .kind-artikelbibliotek__ny-full {
    display: none;
  }
  html[data-kind-font-scale="xlarge"] .kind-artikelbibliotek__ny-ikon,
  html[data-kind-font-scale="xxlarge"] .kind-artikelbibliotek__ny-ikon {
    display: inline;
  }
  html[data-kind-font-scale="xlarge"] .kind-artikelbibliotek__ny,
  html[data-kind-font-scale="xxlarge"] .kind-artikelbibliotek__ny {
    flex: 0 0 auto;
    padding-inline: var(--kind-space-2);
  }
  /* Tomrum vid stor textskala, samma klass av ändring som CP-09-batchen:
     marginaler och sidram, aldrig text. Skopat till biblioteksytan via
     :has så övriga admin-sidor behåller sin rytm, och normal/large samt
     desktop (kontrakterade §2-tal) är orörda. */
  html[data-kind-font-scale="xlarge"] .kind-artikelbibliotek__band,
  html[data-kind-font-scale="xxlarge"] .kind-artikelbibliotek__band,
  html[data-kind-font-scale="xlarge"] .kind-artikelbibliotek__panel,
  html[data-kind-font-scale="xxlarge"] .kind-artikelbibliotek__panel,
  html[data-kind-font-scale="xlarge"] .kind-artikelbibliotek__antalrad,
  html[data-kind-font-scale="xxlarge"] .kind-artikelbibliotek__antalrad {
    margin-bottom: var(--kind-space-1);
  }
  html[data-kind-font-scale="xlarge"] .kind-body--admin .kind-main:has(.kind-artikelbibliotek),
  html[data-kind-font-scale="xxlarge"] .kind-body--admin .kind-main:has(.kind-artikelbibliotek) {
    padding-top: var(--kind-space-1);
  }
}
/* Fallback-bredderna (ux-beslut 1.2 punkt 2): vid 320 och 375 håller h1-raden
   inte enradigt ens med ikonknapp (uppmätt band 172/129px, h1 radbryter
   mid-ord av overflow-wrap: anywhere). Där flyttar åtgärden till
   träffräknarens rad, fortfarande första viewporten och ovanför listan,
   ALDRIG under listan eller in i sök/filterpanelen. Exakt en placering
   synlig per bredd. */
@media (max-width: 389px) {
  html[data-kind-font-scale="xlarge"] .kind-artikelbibliotek__band .kind-artikelbibliotek__ny,
  html[data-kind-font-scale="xxlarge"] .kind-artikelbibliotek__band .kind-artikelbibliotek__ny {
    display: none;
  }
  html[data-kind-font-scale="xlarge"] .kind-artikelbibliotek__ny--antal,
  html[data-kind-font-scale="xxlarge"] .kind-artikelbibliotek__ny--antal {
    display: inline-flex;
  }
}
.kind-artikelbibliotek__panel {
  margin-bottom: var(--kind-space-3);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
  background: var(--kind-color-surface);
}
/* Hopfällningen. Uppmätt kostade den fasta panelen 345px vid 320 normal och
   588px vid 320 xxlarge, alltså mer än hela viewportens övre halva innan en
   enda artikel syntes. Hopfälld är den 44px.

   Summaryn syns bara vid mobilstackning. På desktop finns höjden, och en
   disclosure där hade lagt till en åtgärd utan att lösa något. Samma delning
   som .kind-arbetsvy__ko-fold gör vid samma brytpunkt. */
.kind-artikelbibliotek__summary {
  display: flex;
  align-items: center;
  gap: var(--kind-space-2);
  min-height: 44px;
  padding: var(--kind-space-2) var(--kind-space-3);
  font-size: var(--kind-font-small);
  font-weight: 600;
  color: var(--kind-color-text);
  cursor: pointer;
  list-style: none;
}
.kind-artikelbibliotek__summary::-webkit-details-marker { display: none; }
.kind-artikelbibliotek__summary::before {
  content: "\25B8";
  color: var(--kind-color-text-muted);
}
.kind-artikelbibliotek__panel[open] > .kind-artikelbibliotek__summary::before {
  content: "\25BE";
}
.kind-artikelbibliotek__summary:hover { background: var(--kind-color-surface-muted); }
.kind-artikelbibliotek__summary:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: -2px;
}
@media (min-width: 901px) {
  .kind-artikelbibliotek__summary { display: none; }
}
.kind-artikelbibliotek__innehall {
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-2);
  padding: var(--kind-space-3);
}
@media (min-width: 901px) {
  /* Utan summaryn behöver innehållet ingen extra topp-padding. */
  .kind-artikelbibliotek__innehall { padding-top: var(--kind-space-3); }
}
.kind-artikelbibliotek__sokrad {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--kind-space-2);
}
/* Etiketten delar rad med fältet i stället för att ligga ovanför det. Samma
   grepp och samma skäl som CP-09 använde på patientbibliotekets sökformulär:
   en egen etikettrad kostade där 137px normal / 182px xxlarge av höjden ovanför
   listan. Etiketten är RIKTIG text och inte en placeholder, som försvinner så
   fort användaren skriver (WCAG 3.3.2). */
.kind-artikelbibliotek__label {
  flex: 0 0 auto;
  font-size: var(--kind-font-small);
  font-weight: 600;
  color: var(--kind-color-text);
}
.kind-artikelbibliotek__input {
  flex: 1 1 12rem;
  min-width: 0;
  min-height: 44px;
  padding: var(--kind-space-2) var(--kind-space-3);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  background: var(--kind-color-surface);
  color: var(--kind-color-text);
  font: inherit;
}
.kind-artikelbibliotek__input:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}
/* Ett <fieldset> utan ram: gruppen behövs för semantiken (legenden namnger
   radiogruppen, 1.3.1 / 4.1.2), men webbläsarens standardram lägger till
   höjd som måttet ovan visar att vi inte har. */
.kind-artikelbibliotek__filter {
  margin: 0;
  padding: 0;
  border: 0;
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--kind-space-2);
}
.kind-artikelbibliotek__legend {
  float: left;
  padding: 0 var(--kind-space-2) 0 0;
  font-size: var(--kind-font-small);
  font-weight: 600;
  color: var(--kind-color-text);
}
.kind-artikelbibliotek__val {
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-2);
}
/* 44px-golvet gäller varje val, inte bara sökfältet. Radioknappen är kvar och
   synlig: att gömma den och rita en egen bricka hade tagit bort plattformens
   eget valt-tillstånd, som är det som exponeras för hjälpmedel (4.1.2). */
.kind-artikelbibliotek__chip {
  display: inline-flex;
  align-items: center;
  gap: var(--kind-space-2);
  min-height: 44px;
  padding: 0 var(--kind-space-3);
  border: 1px solid var(--kind-color-border);
  border-radius: 999px;
  background: var(--kind-color-surface);
  font-size: var(--kind-font-small);
  cursor: pointer;
}
.kind-artikelbibliotek__chip:hover { background: var(--kind-color-surface-muted); }
.kind-artikelbibliotek__chip:focus-within {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}
/* Radioknappen är visuellt gömd men FINNS i DOM och i tillgänglighetsträdet:
   den bär valt-tillståndet (4.1.2) och tar emot fokus, som ritas på brickan via
   :focus-within ovan. Samma teknik som .kind-visually-hidden i kind.css.

   Uppmätt skäl: tre brickor med SYNLIG radioknapp bröt till tre rader vid 320px
   och kostade 96px normal / 156px xxlarge av höjden ovanför listan. */
.kind-artikelbibliotek__chip input[type="radio"] {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  border: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
}
/* Valt tillstånd bärs av FYRA saker: kant, bakgrund, fetstil och en bock. Tre
   av dem överlever gråskala, så kravet på icke-färgbärare (WCAG 1.4.1) är
   uppfyllt utan att luta sig mot accentfärgen. */
.kind-artikelbibliotek__chip:has(input:checked) {
  border-color: var(--kind-color-accent);
  background: var(--kind-color-accent-bg);
  font-weight: 600;
}
.kind-artikelbibliotek__chip:has(input:checked)::before {
  content: "\2713\00a0";
  color: var(--kind-color-accent);
}
.kind-artikelbibliotek__hjalp {
  margin: 0;
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
}
/* CP-11 uppföljning (#96): träffräknarens rad bär fallback-knappen vid smala
   bredder + stor textskala. Raden ärver räknarens gamla bottenmarginal;
   räknaren själv nollställs så höjden inte dubbleras. */
.kind-artikelbibliotek__antalrad {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--kind-space-2);
  margin: 0 0 var(--kind-space-2);
}
.kind-artikelbibliotek__ny--antal {
  display: none;
}
.kind-artikelbibliotek__antal {
  margin: 0 0 var(--kind-space-2);
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
}
.kind-artikelbibliotek__antalrad > .kind-artikelbibliotek__antal {
  margin: 0;
}
.kind-artikelbibliotek__tomt {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--kind-space-3);
}
/* [hidden]-GARDEN ÄR LOAD-BEARING, inte belt-and-braces.
 *
 * `display: flex` ovan är en FÖRFATTARREGEL och slår UA-lagrets
 * `[hidden] { display: none }` på ursprungsprecedens. Utan raden nedan är
 * `hidden` INERT på det här elementet: `kind_artikelbibliotek.js` växlar
 * attributet helt korrekt (rad 90-91), och rutan är målad ändå.
 *
 * Uppmätt på deployen 2.3.0-nordiccare-w32 2026-08-07, tre tillstånd:
 *
 *   ofiltrerat 10 träffar   hidden=true   display:flex   1248x93 @ y1235
 *   taggsök 1 träff         hidden=true   display:flex   1248x93 @ y425
 *   noll träffar            hidden=false  display:flex   1248x93 @ y343
 *
 * `document.body.innerText` bar "Ingen artikel matchar sökningen" i ALLA TRE,
 * och `elementFromPoint` i rutans mittpunkt returnerade rutan själv i
 * ett-träff-fallet. En vårdgivare sökte alltså på en tagg, fick sin träff, och
 * läste samtidigt att inget matchade, på exakt den yta briefens §7.5-sökning
 * bor på.
 *
 * VAKTEN ASSERTERAR `getComputedStyle(el).display`, ALDRIG `hasAttribute`.
 * En attributbaserad vakt är GRÖN mot precis den här buggen, eftersom
 * attributet hela tiden var rätt, och det är därför defekten slank igenom.
 * Utfallsvakten ligger i `e2e/stadbatch-utfall.mjs` (mätpunkt 1, rödbevisad
 * med mutationen `tomruta-alltid-malad`); den statiska väktaren som fångar en
 * NY oskyddad instans är `scripts/svep_hidden_display.py`, körd av
 * `tests/test_hidden_display_gard.py`.
 */
.kind-artikelbibliotek__tomt[hidden] { display: none; }

/* ==========================================================================
 * CP-12 (#97): den sökbara visuella artikelväljaren i skrivmodulen.
 *
 * Raden själv är den DELADE `.kind-artikelrad` i kind.css. Här ligger bara
 * väljarens eget skal: sökraden, listans höjdtak och bekräftelseraden.
 *
 * ---- HÖJDTAKET ÄR LOAD-BEARING ------------------------------------------
 *
 * Väljaren bor INNE i skrivmodulens popover, ovanpå konversationen. En lista
 * med 40 rader à 56px är 2240px och hade tryckt bekräftelseknappen utanför
 * skärmen, alltså gjort delningen omöjlig att slutföra utan att skrolla i en
 * popover. Listan skrollar därför internt med ett tak på 18rem, och
 * bekräftelseraden ligger UTANFÖR skrollytan, i ytans övre list (#2110), så
 * den alltid syns.
 *
 * `docs/contracts/chat-pixel-budget.md` mäter skrivmodulens HOPFÄLLDA höjd
 * (tak 60px). Popovern är ett utfällt tillstånd och räknas inte mot det taket,
 * men den får inte heller växa fritt, av skälet ovan.
 * ========================================================================== */
.kind-artikelvaljare__sokrad {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--kind-space-2);
}
/* Etiketten delar rad med fältet, samma grepp och samma uppmätta skäl som
   artikelbibliotekets sökrad: en egen etikettrad kostar höjd i en yta som
   redan är trång. Riktig text, inte en placeholder (WCAG 3.3.2). */
.kind-artikelvaljare__label {
  flex: 0 0 auto;
  font-size: var(--kind-font-small);
  font-weight: 600;
  color: var(--kind-color-text);
}
.kind-artikelvaljare__input {
  flex: 1 1 10rem;
  min-width: 0;
  min-height: 44px;
  padding: var(--kind-space-2) var(--kind-space-3);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  background: var(--kind-color-surface);
  color: var(--kind-color-text);
  font: inherit;
}
.kind-artikelvaljare__input:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
}
.kind-artikelvaljare__antal {
  margin: 0;
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
}
.kind-artikelvaljare__lista {
  max-height: 18rem;
  overflow-y: auto;
  /* Fokusringen på en rad högst upp eller längst ned i skrollytan får inte
     klippas av `overflow: auto`. 2px inre luft räcker för ringen. */
  padding: 2px;
}
.kind-artikelvaljare__bekraftelse {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--kind-space-2);
}
/* #2110: bekräftelseraden är ytans ÖVRE LIST (rubrik, Dela, Avbryt), som i
   gamla KIND. Den ligger före listan och listan skrollar internt under den, så
   Dela syns utan att vårdgivaren skrollar. `sticky` håller listen kvar även om
   popovern själv skrollar på mobilbredd. Rubriken tar resten av raden; en lång
   titel i Dela-knappen bryts på flera rader i stället för att trycka knappen
   utanför skärmen. */
.kind-artikelvaljare__topplist {
  position: sticky;
  top: 0;
  z-index: 1;
  background: var(--kind-color-surface);
  padding-block: var(--kind-space-2);
}
.kind-artikelvaljare__rubrik {
  flex: 1 1 8rem;
  margin: 0;
}
.kind-artikelvaljare__topplist [data-artikelvaljare-skicka] {
  max-width: 100%;
  white-space: normal;
  overflow-wrap: anywhere;
  text-align: start;
}
/* Den avstängda bekräftelseknappen ska LÄSAS som avstängd, inte bara vara det.
   Kontrasten på inaktiv text är undantagen WCAG 1.4.3, men en knapp som ser
   normal ut och inte går att trycka på är en sämre bekräftelse än ingen. */
.kind-artikelvaljare__bekraftelse button[disabled] {
  opacity: 0.55;
  cursor: not-allowed;
}

/* ==========================================================================
 * K18 / issue #415: ROUTNINGSSIGNALEN, chip plus villkorlig varningsrad.
 *
 * Beslutets bindande villkor 1: routningstillståndet måste ha en NAMNGIVEN
 * plats när sammanfattningszonen försvinner. Variant C ger den två delar, och
 * arbetsfördelningen mellan dem är hela varianten:
 *
 *   CHIPPET      alltid, i sidhuvudets befintliga metarad, NOLL fast höjd.
 *                Det är den delen som gör att en TOM plats aldrig behöver
 *                tolkas: tillståndet står alltid utskrivet någonstans.
 *   VARNINGSRADEN bara i avvikelsen, 44px, utanför den skrollande loggen.
 *
 * FÄRG ÄR ALDRIG ENSAM BÄRARE (WCAG 2.2 SC 1.4.1). Varje tillstånd bär ett ORD
 * och en IKON; vaskningen och kantlinjen är förstärkning. Detta är samma
 * disciplin som ADR-047:s oläst-indikator i kö-rälsen.
 * ========================================================================== */

/* Chippet.
 *
 * ---- `flex-shrink: 0` PLUS `nowrap`, OCH DET ÄR EN MÄTNING -------------
 *
 * Första versionen bar `flex: 0 1 auto` plus `flex-wrap: wrap`, med
 * motiveringen att chippet skulle kunna ge vika i stället för att spränga
 * metaraden. Det var fel felmod, och priset är UPPMÄTT: i metaradens tyngsta
 * tillstånd (chip plus personnummer plus ämne plus telefon plus
 * klarmarkering) tog chippet emot krympningen genom att BRYTA SITT EGET
 * INNEHÅLL till tre rader, och radhöjden gick från 27px till 68px, alltså
 * plus 41px rakt av headerns budget. Uppmätt 2026-08-26 vid 1280 och 1440 med
 * `e2e/visuell-referens.mjs --mutera=tel-golvet-pa-matytan`, och felet såg
 * först ut att komma från `tel:`-golvet: DIAGNOSEN kom av att mäta varje
 * flexbarns höjd var för sig, inte av att resonera om regeln.
 *
 * Chippet är en TILLSTÅNDSMARKÖR och lyder därför samma krympordning som
 * `Hanterad`-badgen redan gör: den krymper aldrig. Det som ska ge vika är
 * ÄMNET, som är fri text, som ellipseras och vars hela sträng ligger kvar i
 * `title`. Den ordningen står redan utskriven vid `.kind-chat-header__amne`
 * ovan; chippet följer den i stället för att uppfinna en egen.
 *
 * `white-space: nowrap` är garden mot återfallet: utan den kan ett längre
 * tillståndsord bryta inuti chippet även med `flex-shrink: 0`. */
.kind-routning-chip {
  display: inline-flex;
  align-items: center;
  gap: var(--kind-space-1);
  padding: 1px var(--kind-space-2);
  border-radius: 999px;
  font-weight: 700;
  font-size: var(--kind-font-small);
  border: 1px solid var(--kind-color-border);
  background: var(--kind-color-surface-muted);
  color: var(--kind-color-text);
  flex: 0 0 auto;
  white-space: nowrap;
}
/* IKONGLYFEN LIGGER PÅ HUSETS TEXTGOLV och inte på mockens 11px.
 * `tests/test_classic_plus_tokens_css.py::test_ingen_skarmtext_under_13px`
 * fällde mockens värde, och den hade rätt: en 11px utropstecken i en 16px-cirkel
 * är en avvikelsesignal för en publik som skevar mot äldre och lägre syn.
 * Cirkeln växer med glyfen så tecknet inte klipps. */
.kind-routning-chip__ikon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  flex: 0 0 auto;
  border-radius: 50%;
  border: 1px solid currentColor;
  font-size: var(--kind-font-small);
  font-weight: 800;
  line-height: 1;
}
/* ==========================================================================
 * HÄR LÅG DET ORUTTADE LÄGETS FÄRG OCH #415:s VARNINGSRAD (borttagna
 * 2026-09-25, kundbeslut alexbj75 i issue #471, "som i gamla KIND").
 *
 * Borttaget härifrån: `.kind-routning-chip--oruttad` (`--kind-color-warning-bg`
 * plus `--kind-color-warning`, husets kontrollerade par) och hela
 * `.kind-routning`-familjen (raden, `__ikon`, `__text`, `__detalj`, `__lank`
 * med sina två 44px-golv).
 *
 * VARFÖR DE ÄR BORTA OCH INTE BARA OANVÄNDA: beslutet är att det oruttade läget
 * visar ingenting, uttryckligen inklusive varningsfärgen. Ingen mall skriver
 * längre ut någon av klasserna (mallens `kind-routning-chip--<tillstånd>` kan
 * efter #471 bara bli `--ruttad` eller `--saknas`), så reglerna var onåbara, och
 * en onåbar varningsfärg som ligger kvar är en inbjudan att återinföra brickan
 * av misstag. Det som mättes på dem, 44px-golvet på raden och dess länk, har
 * därmed upphört som MÄTOBJEKT, det är ingen uppmjukad assertion (regel 49b);
 * se `tests/test_415_routningssignal.py::test_traeffytorna_och_golvet`.
 *
 * KVAR, OFÖRÄNDRAT: `.kind-routning-chip` och `.kind-routning-chip__ikon` ovan.
 * Chippet renderas fortfarande för `ruttad` och `saknas`, och att `saknas` INTE
 * också tystas är domänbedömningens villkor 1 på #471.
 * ========================================================================== */

/* ==========================================================================
 * HÄR LÅG CP-14:s TREDJE ZON, patientsammanfattningen (borttagen 2026-08-26,
 * konsultbeslut, kravlistans post K18, issue #415, variant C).
 *
 * Borttaget härifrån: `.kind-arbetsvy__sammanfattning` (geometri, sticky-blocket
 * vid >=1201px, mobilmarginalen och envägs-`.kind-nu__row`-regeln),
 * `.kind-arbetsvy__sammanfattning-lista`, `-lank`, `-fot`, den tredje
 * grid-kolumnen `260px minmax(0, 1fr) 280px` och dess `grid-column`-placeringar.
 *
 * KVAR, och det är ett aktivt val: CP-14 + #118:s regel om att patientnamnet får
 * BRYTA i stället för att kapas (strax nedan). Den infördes för den smalnade
 * kolumnen men gjordes OVILLKORLIG av #118 på mobil- och xxlarge-mätpunkter som
 * inte har med den tredje zonen att göra, alltså överlever den zonen.
 *
 * Selektorerna i `kind-body--vardchatt`-blocket högre upp är kvar men bär nu
 * ENBART `.kind-chatt-aside`, den fristående chattytans egen panel, som lever
 * vidare.
 *
 * KVAR MED AVSIKT:
 *   * `.kind-arbetsvy__pane-title`, rälsens rubrik använder den.
 *   * `.kind-sidopanel-fold` och `kind_sidopanel_fold.js`, `admin/chatt.html`
 *     använder båda för SIN panel. BESLUT.md:s villkor 3 antog att skriptet
 *     blev konsumentlöst; ett svep 2026-08-26 visade att premissen var falsk.
 *   * `.kind-nu*`, patientsidans Aktuellt-sektion äger komponenten.
 *
 * Radlängdstaket på läskolumnen (44rem, kind_patient.css) är nu det enda som
 * håller WCAG 1.4.8 på den bredare chattkolumnen, precis som när den FÖRRA
 * panelen försvann. Skälen står vid `.kind-arbetsvy` ovan.
 * ========================================================================== */


/* ---- CP-14 + #118: PATIENTNAMNET FÅR BRYTA I STÄLLET FÖR ATT KAPAS ------
 *
 * `.kind-chat-header .kind-chat-header__namn` är `white-space: nowrap` plus
 * `text-overflow: ellipsis`, alltså kapas namnet så fort det inte får plats.
 * CP-14 lät namnet bryta vid >=1201px normal skala (den tredje zonen smalnade
 * kolumnen till 656px och grinden mätte upp #80:s gamla defekt igen:
 * scrollWidth 339 mot clientWidth 315 vid 1280 normal). Mobil + xlarge/xxlarge
 * lämnades då som ett ÖPPET FYND, med motiveringen att en andra rubrikrad
 * skulle kosta höjd i en vy under pixelbudgetens andel.
 *
 * #118 (2026-08-08) stänger fyndet: regeln är nu OVILLKORLIG för arbetsvyn.
 * Mätningen (e2e/cp111214-vardgivare-utfall.mjs, mått E, tyngsta stubben) fann
 * h1-avkortning på SJU mätpunkter: 320 normal (339>288) och 320/375/390/412/
 * 430/1280 xxlarge (504>272..458). Vid mobil xxlarge behöver namnet 504px av
 * en viewport på max 430, alltså KAN full rendering bara ske genom brytning,
 * det finns ingen bredd att frigöra. Persona-vårdpersonals F-1-princip gäller:
 * fullt namn renderas helt, samma logik som gör att personnumret aldrig viker.
 *
 * BUDGETNEUTRALT I TYNGSTA GRINDTILLSTÅNDET (beslut 1:s punktkrav, mätt med
 * cp14-kozon-matning.mjs --grind mot stagad lokal miljö 2026-08-08):
 * `white-space: normal` gör INGENTING när namnet får plats, och fixturens
 * patientnamn ryms på en rad på varje grindpunkt (behov ~207px xxlarge mot 272
 * tillgängliga vid 320xx). Composer-underkanten är därför OFÖRÄNDRAD: 675,66
 * vid 320x664 xxlarge (punktkravet, marginal exakt 0) och 647,31 vid 390x664
 * xxlarge (tak 664). Ett namn som INTE ryms på en rad kostar en rubrikrad i
 * höjd PER extra rad exakt när det bryter, UPPMÄTT (reviewer R-9, mätningens
 * tal och inte en uppskattning): 24px/rad vid normal skala (#118 steg 4:
 * header 320n 129 -> 153), 36px/rad vid mobil xxlarge 320-430 (#118 steg 4:
 * +36 vid en extra rad; R-2-mätningen 2026-08-07: 320xx 2 extra rader =
 * +72, header 198,88 -> 270,88, composer-underkant 747,66; 390xx 1 extra
 * rad = +36, underkant 683,31) och 28px vid 1280 xxlarge (95 -> 123). Det
 * priset är F-1-principens och är redovisat i #118-rapporten och som
 * ÖPPEN PUNKT (R-2) i cp14-grinden, inte tyst.
 *
 * Skopad till `.kind-arbetsvy` (ytan #118 mäter). Den fristående chattytan
 * (.kind-chatt-layout) behåller ellipsen som krockbarriär tills den fått en
 * egen mätning; flaggad i #118-rapporten i stället för tyst breddad (samma
 * mät-inte-anta-disciplin som CP-14:s ursprungliga skopning).
 * -------------------------------------------------------------------------- */
.kind-arbetsvy .kind-chat-header .kind-chat-header__namn {
  white-space: normal;
  overflow: visible;
  text-overflow: clip;
  overflow-wrap: anywhere;
}

/* ============================================================================
   #217: #118:s NAMNFIX GALLER NU ALLA TRE CHATTYTORNA, INTE BARA ARBETSVYN.

   Regeln ovan ar skopad till `.kind-arbetsvy`, och kommentaren strax fore den
   sager varfor: den fristaende chattytan "behaller ellipsen som krockbarriar
   TILLS DEN FATT EN EGEN MATNING". Den matningen finns nu, och den utlostes av
   det har bygget.

   MATT ISOLERING (samma sida, med och utan tillbakalanken):

     bredd   med lanken        utan lanken
     1440    339 > 212 BROTT   339 > 272 BROTT   <- fanns redan, avsiktligt
     1024    339 > 306 BROTT   339 > 339 ok      <- INFORT AV DEN HAR ANDRINGEN
      375    339 > 221 BROTT   339 > 339 ok      <- INFORT AV DEN HAR ANDRINGEN

   Tillbakalanken tar 44px plus marginal ur identitetskolumnen, alltsa borjade
   namnet avkortas vid bredder dar det forut rymdes. Det ar ett brott mot
   pixelbudgetens BINDANDE breddvakt F-1, infort av en hojdfix, vilket ar exakt
   den mekanism kontraktets egen lardom beskriver: pressar man en dimension
   flyttar sig felet till den andra.

   Skopat till `.kind-body--vardchatt`, alltsa de tre ytor som delar
   chattskalet, i stallet for per yta (regel 27 korollarium 2). Namnet WRAPPAR,
   det klipps inte, sa krockbarriaren ersatts av att raden far vaxa i hojd nar
   den maste, vilket ar samma val arbetsvyn redan gjort.
   ========================================================================== */
.kind-body--vardchatt .kind-chat-header .kind-chat-header__namn {
  white-space: normal;
  overflow: visible;
  text-overflow: clip;
  overflow-wrap: anywhere;
}
/* #249: teamtiteln är fri text, inte patientens identitet. Återställ dess
   befintliga enradiga presentation så en tillåten 200-teckenstitel inte tar
   konversationens höjd. Hela titeln finns kvar i H1 och dess title-attribut;
   patientnamnen på arbetsvyn och den fristående chatten fortsätter radbrytas. */
.kind-body--team-chat .kind-chat-header .kind-chat-header__namn {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
/* Kö-radens patientnamn kapas på SAMMA sätt, och den defekten är ÄLDRE än den
 * här ändringen: uppmätt före CP-14 var `span.kind-arbetsvy__ko-namn`
 * scrollWidth 223 mot clientWidth 207 vid 1280 normal och 411 mot 183 vid
 * xxlarge, alltså SJU av åtta köposter med kapat namn. Zon 1 är #99:s egen
 * "kompakt arbetskö", så defekten ligger inom den här issuen och åtgärdas här.
 *
 * Kompakt betyder få pixlar per rad, inte oläsbara namn. Raden får bryta till
 * två rader när namnet kräver det, och `min-height: 44px` ger den samtidigt det
 * träffytegolv den saknade (uppmätt 40px på den kortaste raden). */
.kind-arbetsvy__ko-item { min-height: 44px; }
.kind-arbetsvy__ko-namn {
  overflow: visible;
  text-overflow: clip;
  white-space: normal;
  overflow-wrap: anywhere;
}

/* ===================== SPAK-XXL:START ====================================
 * HEADERBUDGET-SPAKEN: motvikten till #118:s ovillkorliga namnbrytning, vid
 * MOBIL BREDD och STOR TEXTSKALA på ARBETSVYN. Konsultbeslut 2026-08-07.
 *
 * ---- VAD SOM MÄTTES, INNAN NÅGOT VALDES --------------------------------
 *
 * Långt dubbelnamn ("Marie-Charlotte Gustafsson-Lindqvist af Ugglebo",
 * e2e/stage_fe2b_tyngsta.py --langt-namn) vid 320x664 xxlarge, uppmätt med
 * e2e/diag-spak-header.mjs mot lokal mätserver 2026-08-07. Headern var
 * 270,88px yttre och bestod av:
 *
 *   h1               108,00  (3 rader x 36px; 30px typsnitt, radhöjd 1.2)
 *   radgap             6,00
 *   åtgärdsrad        44,00  (EN rad, 4 ikonknappar, 243,06 av 272 breda)
 *   radgap             6,00
 *   metarad           93,88  (3 rader: pnr 34,34 + tel 28,34 + hanterad 31,19)
 *   kant               1,00
 *   marginal nedåt    12,00
 *
 * Underskottet var exakt 72,00px (composer-underkant 747,66 mot punktkravet
 * 675,66) och 19,31px vid 390xx (683,31 mot taket 664).
 *
 * ---- VARFÖR SPAK (b) OCH (c) I DISPATCHEN GER NOLL, MÄTT ----------------
 *
 * (b) "namnraden på egen rad över metaraden": namnet HAR redan hela
 *     headerbredden. `.kind-chat-header__main` mättes till 272px, alltså
 *     identiskt med headerns innehållsbredd, eftersom åtgärdsraden redan
 *     brutit till en egen flexrad vid den bredden. Besparing 0.
 * (c) "åtgärdsraden komprimeras eller överflödesmenyas": raden ligger redan
 *     på EN rad (uppmätt en enda radtopp, y313), och dess 44px är
 *     träffytegolvet. En överflödesmeny behöver själv en 44px-utlösare.
 *     Besparing 0 i HÖJD.
 *
 * (a) ren kromkomprimering (radgap 12 + marginal 12 + arbetsytans topp 12 +
 *     metaradens radavstånd ~6) når cirka 42px av 72. INTE TILLRÄCKLIGT.
 *
 * Hela underskottet ÄR alltså rubrikens extra rader, och det finns inte 72px
 * krom att ge. Därför måste rubrikens egen typskala med, och det är den
 * enda posten i paketet som rör TEXT.
 *
 * ---- S-1: RUBRIKENS TYPSKALA VID EXAKT DEN HÄR KORSNINGEN --------------
 *
 * `font-size` går 1.25rem -> 1rem, alltså 30px -> 24px vid xxlarge. Uppmätt
 * effekt: 3 rader (108px) -> 2 rader (57,59px), minus 50,41px vid 320xx och
 * minus 14,41px vid 390xx.
 *
 * A11Y-AVVÄGNINGEN, uttalad. Rubriken blir INTE mindre än brödtexten: 1rem
 * ÄR brödtextens storlek vid samma skala, alltså 24px, vilket är 20 procent
 * STÖRRE än rubriken vid normal skala (20px) och 50 procent större än
 * brödtexten där (16px). Ingenting klipps, ingen text går förlorad, och
 * hierarkin bärs vidare av vikt 600, färg och h1-semantiken.
 *
 * Det som byts bort är en ren typografisk storleksskillnad. Det som köps är
 * OPERABILITET: utan spaken låg skrivfältet 676..748 mot en viewport på 664,
 * med mittpunkten 84px under vikningen och OTRÄFFBAR vid oforcerad
 * klickkontroll. Användaren med den STÖRSTA textinställningen var alltså
 * den enda som inte kunde svara i chatten. WCAG 1.4.4 är uppfylld i båda
 * lägena (texten är fortsatt skalbar, inget innehåll går förlorat); 1.4.10
 * förbättras (färre rader, noll horisontell skroll); 1.4.12 rör
 * ANVÄNDARSATT radavstånd och påverkas inte av en författarsatt 1.2 på en
 * rubrik som får bryta fritt.
 *
 * ---- S-2 till S-4: kromet, det som (a) faktiskt kan ge -----------------
 *
 * S-2 radgapet 6 -> 0. De tre raderna skiljs redan av rubrikens storlek,
 *     44px-knappraden och metaradens dämpade färg. -12px.
 * S-3 headerns bottenmarginal space-2 -> space-1. Kanten (border-bottom)
 *     bär gränsen mot tråden. -6px.
 * S-4 arbetsytans topp-polstring space-3 -> space-1 och sidopolstringen
 *     space-4 -> space-2, båda ENBART på arbetsvyn (`:has`), samma mönster
 *     och samma motivering som artikelbibliotekets xlarge-komprimering
 *     ovan. Sidopolstringen är inte kosmetik här: den ger varje rad i
 *     headern 296px i stället för 272, vilket är det som gör tvåradigheten
 *     ROBUST i stället för knivseggad (namnet kräver cirka 540px vid 24px,
 *     alltså 1,82 rader av 296 mot 1,99 av 272).
 *
 * ---- SKOPET, och varför just det -------------------------------------
 *
 * `max-width: 719.98px` OCH xlarge/xxlarge, alltså EXAKT samma skop som
 * ux-beslut 7:s S1-S5-paket ovan. Desktop (V-1-kontrollen vid 1280) och
 * NORMAL textskala är per konstruktion 0 diffar: de två mätpunkter som
 * håller sina tak med +138,02 respektive +90,97 marginal rörs inte alls.
 * Den FRISTÅENDE chattytan (`.kind-chatt-layout`) rörs inte heller: den har
 * kvar ellipsen som krockbarriär (se #118-noten ovan) och har därmed inte
 * höjdproblemet, så en ändring där hade varit obeprövad bredd.
 *
 * ---- ÄRLIG BEGRÄNSNING ------------------------------------------------
 *
 * F-1 säger att namnet aldrig avkortas, och namn är obegränsat långa. Ett
 * TILLRÄCKLIGT långt namn spränger därför varje fast budget: paketet gör
 * det uppmätta långt-namn-tillståndet grönt med marginal, det gör inte
 * höjden namnoberoende. Vakten tests/test_spak_headerbudget_css.py pinnar
 * reglerna; utfallet mäts av e2e/cp14-kozon-matning.mjs --grind och
 * e2e/matt5-chattgrind.mjs i BÅDA namntillstånden.
 * ---------------------------------------------------------------------- */
@media (max-width: 719.98px) {
  /* S-1: rubrikens typskala. */
  html[data-kind-font-scale="xlarge"] .kind-arbetsvy .kind-chat-header .kind-chat-header__namn,
  html[data-kind-font-scale="xxlarge"] .kind-arbetsvy .kind-chat-header .kind-chat-header__namn {
    font-size: 1rem;
    line-height: 1.2;
  }
  /* S-2: radgapet mellan headerns tre rader. Kolumngapet är ORÖRT. */
  html[data-kind-font-scale="xlarge"] .kind-arbetsvy .kind-chat-header,
  html[data-kind-font-scale="xxlarge"] .kind-arbetsvy .kind-chat-header {
    row-gap: 0;
  }
  /* S-3: headerns bottenmarginal. Samma (0,2,0)-specificitet som
     `.kind-chat__header.kind-chat-header` ovan behöver, plus arbetsvyskopet. */
  html[data-kind-font-scale="xlarge"] .kind-arbetsvy .kind-chat__header.kind-chat-header,
  html[data-kind-font-scale="xxlarge"] .kind-arbetsvy .kind-chat__header.kind-chat-header {
    margin-bottom: var(--kind-space-1);
  }
  /* S-4: arbetsytans polstring, enbart på arbetsvyn. */
  html[data-kind-font-scale="xlarge"] .kind-body--admin .kind-main:has(.kind-arbetsvy),
  html[data-kind-font-scale="xxlarge"] .kind-body--admin .kind-main:has(.kind-arbetsvy) {
    padding-top: var(--kind-space-1);
    padding-inline: var(--kind-space-2);
  }
}
/* ===================== SPAK-XXL:SLUT ===================================== */

/* ===================== ISSUE #157: SPAK-XXL:s KROMDEL SVEPT ===============
 * SPAK-XXL ovan är skopad till `.kind-arbetsvy`, den yta #118 mätte. Dess S-1
 * (rubrikens typskala) SKA stanna där: den fristående chatten har kvar
 * ellipsen som krockbarriär, så en typskaleändring där vore obeprövad bredd,
 * och det står utskrivet i blocket ovan.
 *
 * S-2 och S-3 är däremot RENT VERTIKALT KROM utan någon breddinteraktion, och
 * de lever på en nod som DELAS av tre ytor: `.kind-chat-header` renderas av
 * `templates/admin/_chat_header.html` (arbetsvyn plus den fristående chatten)
 * och av `templates/admin/team_chat_visa.html` (kollegie-chatten). Att
 * komprimera på den rapporterade ytan och lämna de två andra är exakt det
 * mönster regel 27:s korollarium 2 handlar om, och kollegie-chatten är samma
 * yta som bar #156:s defekt utan att någon rapporterat den, eftersom kunden
 * inte öppnat den.
 *
 * Skopet är `.kind-body--vardchatt`, alltså precis de tre ytor som binds till
 * viewporten av #156, plus SAMMA två skopvillkor som SPAK-XXL (max-width
 * 719.98px och xlarge/xxlarge). Desktop och normal textskala är per
 * konstruktion 0 diffar. På arbetsvyn är reglerna identiska med SPAK-XXL:s och
 * alltså verkningslösa där; de biter på de två osvepta ytorna.
 *
 * UPPMÄTT vid 320x664 xxlarge, tyngsta rimliga tillståndet:
 *   fristående chatt   152,53 + 12 marginal  ->  140,53 + 6   (-18,00)
 *   kollegie-chatt     115,34 + 12 marginal  ->  109,34 + 6   (-12,00)
 * ========================================================================= */
@media (max-width: 719.98px) {
  html[data-kind-font-scale="xlarge"] .kind-body--vardchatt .kind-chat-header,
  html[data-kind-font-scale="xxlarge"] .kind-body--vardchatt .kind-chat-header {
    row-gap: 0;
  }
  html[data-kind-font-scale="xlarge"] .kind-body--vardchatt .kind-chat__header.kind-chat-header,
  html[data-kind-font-scale="xxlarge"] .kind-body--vardchatt .kind-chat__header.kind-chat-header {
    margin-bottom: var(--kind-space-1);
  }
}

/* =========================================================================
 * web#515: VÅRDGIVARENS HEM (/admin/hem) OCH DESS SEX UNDERSIDOR.
 *
 * Ersätter Hem-variant C:s stilar (konsultbeslut 2026-08-14), som byggde en
 * hjälpsida under "Mer" i stället för produktionens Hem-flik. Beställaren
 * ersatte 2026-09-25 det beslutet med paritetskravet, så variantens egna
 * klasser (`.kind-hem__*`: ingressen, "Från oss", felformuläret, versionsraden
 * och mottagningsraden) har ingen bärare kvar i markupen och är borttagna
 * i stället för lämnade som död CSS.
 *
 * SEKUNDÄRTEXTENS A11Y-FYND FÖLJER MED, det var aldrig variantens egendom:
 * `--kind-color-text-muted` (#626C77) är 4.63:1 mot `--kind-color-surface-muted`,
 * alltså 0,13 över golvet 4,5:1, och spricker på minsta hexjustering. Ytorna
 * bär därför en egen, mörkare sekundärfärg i normalläget, deklarerad på den
 * DELADE noden och inte på den ena klass fyndet råkade namnge. Mörkt läge och
 * högkontrastlägena faller TILLBAKA till `--kind-color-text-muted`, som redan är
 * starkare där; att hårdkoda den ljusa hexen i alla lägen hade FÖRSVAGAT
 * högkontrastläget, alltså gjort en a11y-fix till en a11y-regression.
 * ========================================================================= */
.kind-hemvy,
.kind-hemsida {
  /* 6,44:1 på vit yta, 6,00:1 på sid-bakgrunden, 5,57:1 på inset-ytan. */
  --kind-hem-muted: #556069;
}
html[data-kind-theme="dark"] .kind-hemvy,
html[data-kind-theme="dark"] .kind-hemsida,
html[data-kind-contrast="high"] .kind-hemvy,
html[data-kind-contrast="high"] .kind-hemsida {
  --kind-hem-muted: var(--kind-color-text-muted);
}
@media (prefers-contrast: more) {
  html:not([data-kind-contrast]) .kind-hemvy,
  html:not([data-kind-contrast]) .kind-hemsida {
    --kind-hem-muted: var(--kind-color-text-muted);
  }
}

/* --- Hem: arbetsytans logga och namn överst, som i gamla KIND ------------ */
.kind-hemvy__arbetsyta {
  display: flex;
  align-items: center;
  gap: var(--kind-space-3);
  margin-bottom: var(--kind-space-5);
}
.kind-hemvy__logga { max-height: 48px; width: auto; }
.kind-hemvy__namn { margin: 0; font-size: var(--kind-font-h2); }
.kind-hemvy__sektion {
  font-size: var(--kind-font-h3);
  margin: var(--kind-space-5) 0 var(--kind-space-3);
}

/* --- "Mitt Kind": tre runda kort ----------------------------------------
 * Gamla KIND visar tre RUNDA kort med bild. Bildfilerna följer inte med
 * issuen och vi äger dem inte, så medaljongen är produktens egen: en rund,
 * accenttonad disc med husets ikon i. Formen är paritet, pixlarna är våra.
 *
 * Rutnätet är `auto-fit`/`minmax` och inte tre fasta kolumner, så korten
 * lägger sig under varandra på 320px utan en egen mediefråga. */
.kind-hemvy__kort {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(9rem, 1fr));
  gap: var(--kind-space-4);
  max-width: 46rem;
}
.kind-hemvy__kortpost { margin: 0; }
.kind-hemvy__kortlank {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--kind-space-2);
  /* Hela kortet är träffytan, inte bara texten. Golvet är husets 44px. */
  min-height: 44px;
  padding: var(--kind-space-2);
  color: var(--kind-color-text);
  text-decoration: none;
  text-align: center;
}
.kind-hemvy__kortlank:hover .kind-hemvy__korttitel { text-decoration: underline; }
.kind-hemvy__kortlank:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: 2px;
  border-radius: var(--kind-radius-sm);
}
.kind-hemvy__medaljong {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 7rem;
  height: 7rem;
  border-radius: 50%;
  background: var(--kind-color-accent-soft);
  color: var(--kind-color-accent);
}
.kind-hemvy__korttitel { font-weight: 600; }

/* --- "Om Kind": tre rader med ikon --------------------------------------- */
.kind-hemvy__rader {
  list-style: none;
  margin: 0;
  padding: 0;
  max-width: 46rem;
}
.kind-hemvy__radpost { margin: 0; }
.kind-hemvy__radlank {
  display: flex;
  align-items: center;
  gap: var(--kind-space-3);
  min-height: 44px;
  padding: var(--kind-space-3) 0;
  border-top: 1px solid var(--kind-color-border-soft);
  color: var(--kind-color-text);
  text-decoration: none;
}
.kind-hemvy__radpost:first-child .kind-hemvy__radlank { border-top: 0; }
.kind-hemvy__radlank:hover .kind-hemvy__radtitel { text-decoration: underline; }
.kind-hemvy__radlank:focus-visible { outline: var(--kind-focus-ring); outline-offset: 2px; }
.kind-hemvy__radikon { display: flex; color: var(--kind-color-accent); }
.kind-hemvy__radtitel { flex: 1 1 auto; font-weight: 600; }
.kind-hemvy__radpil { display: flex; color: var(--kind-hem-muted); }

/* --- Undersidornas huvud: bakåtpil plus sidans namn ---------------------- */
.kind-hemsida__huvud {
  display: flex;
  align-items: center;
  gap: var(--kind-space-3);
  margin-bottom: var(--kind-space-4);
}
.kind-hemsida__tillbaka {
  display: inline-flex;
  align-items: center;
  gap: var(--kind-space-1);
  /* Ikon PLUS synlig text: pilen ensam hade lämnat länken utan tillgängligt
     namn i talstyrning (WCAG 2.4.4 / 2.5.3). */
  min-height: 44px;
  min-width: 44px;
  color: var(--kind-color-accent);
  text-decoration: none;
  font-weight: 600;
}
.kind-hemsida__tillbaka:hover { text-decoration: underline; }
.kind-hemsida__tillbaka:focus-visible { outline: var(--kind-focus-ring); outline-offset: 2px; }
.kind-hemsida__pil { display: flex; }
.kind-hemsida__titel { margin: 0; font-size: var(--kind-font-h2); }
.kind-hemsida__kropp { max-width: 46rem; }
.kind-hemsida__rubrik {
  font-size: var(--kind-font-h3);
  margin: var(--kind-space-5) 0 var(--kind-space-2);
}
.kind-hemsida__kropp > .kind-hemsida__rubrik:first-child { margin-top: 0; }
.kind-hemsida__steg { margin: 0 0 var(--kind-space-3); padding-inline-start: var(--kind-space-5); }
.kind-hemsida__steg > li { margin-bottom: var(--kind-space-2); }
.kind-hemsida__slutrad { font-weight: 600; }

/* --- Support & Hjälp: den grå e-postrutan och dragspelet ------------------
 * Dragspelet återanvänder patientytans `.kind-faq`-mönster (ADR-045 D-45.3,
 * templates/patient/support.html). Reglerna DUPLICERAS hit med flit: de bor i
 * kind_patient.css, som vårdgivarytan inte laddar, och att låna en patientfil
 * in i vårdgivarens sidhuvud hade dragit in hela patienttemat för tre
 * selektorers skull. Texten är INTE delad; patientens frågor är andra frågor
 * (#214). */
.kind-support__epost {
  background: var(--kind-color-surface-muted);
  border-radius: var(--kind-radius-sm);
  padding: var(--kind-space-3);
  margin: 0 0 var(--kind-space-4);
}
.kind-faq__list { list-style: none; margin: 0; padding: 0; }
.kind-faq__item { border-bottom: 1px solid var(--kind-color-border-soft); }
.kind-faq__item:last-child { border-bottom: 0; }
.kind-faq__summary {
  /* 44px träffyta även när frågan ryms på en rad. */
  min-height: 44px;
  display: flex;
  align-items: center;
  padding: var(--kind-space-3) 0;
  font-weight: 600;
  cursor: pointer;
}
.kind-faq__summary:focus-visible { outline: var(--kind-focus-ring); outline-offset: 2px; }
.kind-faq__fraga[open] .kind-faq__summary { color: var(--kind-color-accent); }
.kind-faq__svar {
  margin: 0 0 var(--kind-space-3);
  color: var(--kind-hem-muted);
}

/* ============================================================================
   #217 / VARIANT D: HUBBYTANS TOPPBAND.

   Med navigeringen flyttad till botten bär sidhuvudet bara varumärke, konto och
   Aa-triggern, alltså kan det gå till EN rad. Navets egen 6px-vaddering försvann
   med navet, så det som tas bort här är sidhuvudets egen vaddering ovanpå den.

   Kontoaffordanserna skjuts till HÖGER, vilket är den godkända mockens och
   produktionens placering. `margin-inline-start: auto` sitter på det FÖRSTA av
   de efterföljande elementen, alltså på kontomenyn, så både den och Aa-triggern
   följer med utan att någon av dem behöver veta om den andra.

   Skopat med `:not(.kind-body--vardchatt)` eftersom chattytorna inte renderar
   något sidhuvud alls.
   ========================================================================== */
.kind-body--admin:not(.kind-body--vardchatt) .kind-header__inner {
  padding-block: var(--kind-space-1);
}
.kind-body--admin:not(.kind-body--vardchatt) .kind-header__logo {
  flex-direction: row;
  align-items: baseline;
  gap: var(--kind-space-2);
  /* Träffytan hålls på husets 44px-golv utan layoutkostnad: den symmetriskt
     negativa margin-block neutraliserar vadderingen, samma manöver som
     kind.css redan gör på samma element (#113 / ux-beslut 2). */
  padding-block: 16px 12px;
  margin-block: -16px -12px;
}
.kind-body--admin:not(.kind-body--vardchatt) .kind-header__logo-mark {
  font-size: 1.25rem;
}
.kind-body--admin:not(.kind-body--vardchatt) .kind-user-menu {
  margin-inline-start: auto;
}

/* ============================================================================
   #217 / VARIANT D: VÅRDGIVARNAS BOTTENBAND (.kind-vardnav)

   Konsultbeslut 2026-08-16, docs/design-proposals/217/BESLUT.md. Produktionens
   modell: hubbytor bär ett vågrätt bottenband, den öppnade konversationen bär
   ingen global navigering alls.

   BANDHÖJDEN 80px ÄR MÄTT PÅ PRODUKTIONEN, inte vald: skiljelinje y 820,
   ikoner 840 till 863, etiketter till 888, vyn slutar 900.

   SYSKONKOMPONENT, HÅLL DEM IHOP: patientytans `.kind-tabbar`
   (static/css/kind_patient.css) är samma idé för den andra rollen, med
   min-height 56px och fyra flikar. De är MEDVETET två komponenter och inte en,
   eftersom banden har olika höjd (80 mot 56, produktionens mått per roll) och
   eftersom `kind_patient.css` inte laddas av hubbytorna. Att lyfta ut en delad
   bas till kind.css är rätt nästa steg men är en egen ändring med egen
   regressionsrisk på patientytan, och den ligger utanför #217. Ändrar du den
   ena, läs den andra.

   A11Y-BESLUT SOM ÄR ÄRVDA FRÅN `.kind-tabbar` OCH INTE OMPRÖVADE:
   aktiv post bär `aria-current="page"` PLUS accentfärg PLUS en inre kantlinje,
   alltså är tillståndet aldrig enbart färg (1.4.1); ikonen ärver länkens färg
   via currentColor; synlig fokusring (2.4.7); `env(safe-area-inset-bottom)` så
   bandet lyfts över iOS hemindikator.
   ========================================================================== */
/* BANDETS HOJD SOM EN TOKEN, sjalvskopad med `:has()` till de sidor som
   faktiskt renderar bandet (samma resonemang som `html:has(.kind-tabbar)` pa
   patientytan, kind_patient.css). ENDA KALLAN for talet: bandets egen
   `min-height` plus dess 1px kant, plus insetet som bandets egen
   `padding-bottom` redan lagger till. Att lata en reserv bara ett FAST tal
   medan bandet vaxer med insetet ar hur reserven blir for liten pa precis de
   enheter som har en hemindikator. */
html:has(.kind-vardnav) {
  /* INSETET AR 0 I PRODUKTION SOM APPEN AR BYGGD I DAG (matt 2026-08-20).
     `env(safe-area-inset-*)` loser till sitt fallback om sidan inte valt in med
     `viewport-fit=cover`, och base.html:s viewport-meta ar
     `width=device-width, initial-scale=1.0, interactive-widget=resizes-content`,
     alltsa UTAN opt-in. Enda forekomsten av `viewport-fit` i repot ar en
     matfixtur, e2e/simulator-viewport-matning.html.

     FOLJDEN, och den ska inte overdrivas at nagot hall: den har termen bidrar
     NOLL i dag, sa #277:s hal-2-fix ar en no-op som den ar levererad. Den ar
     anda ratt skriven, eftersom den gor bandet och dess reserv omojliga att fa
     ur synk den dag `viewport-fit=cover` tillkommer, och den kostar ingenting
     vid inset 0. Att LAGGA TILL opt-in ar en LAYOUTandring (sidan borjar fylla
     ut notch-ytan) och darmed UI-grindad per regel 54.

     Den som mater bandgeometri pa en enhet med hemindikator och far 0 har alltsa
     INTE hittat en bugg i den har regeln, utan saknad opt-in ett lager upp. */
  --kind-vardnav-reserve: calc(80px + env(safe-area-inset-bottom, 0px));
}
.kind-vardnav {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 200;
  background: var(--kind-color-surface);
  border-top: 1px solid var(--kind-color-border-soft);
  padding-bottom: env(safe-area-inset-bottom, 0px);
  box-shadow: 0 -2px 12px rgba(16, 20, 26, 0.06);
}
.kind-vardnav__list {
  list-style: none;
  margin: 0 auto;
  padding: 0;
  max-width: var(--kind-container-max);
  display: flex;
}
.kind-vardnav__item {
  flex: 1 1 0;
  min-width: 0;
}
.kind-vardnav__link {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 4px;
  /* 80px minus 1px kant, alltså produktionens uppmätta bandhöjd. */
  min-height: 79px;
  padding: var(--kind-space-2) var(--kind-space-1);
  color: var(--kind-color-text-muted);
  text-decoration: none;
  font-size: 0.8125rem;
  font-weight: 600;
  line-height: 1.1;
  text-align: center;
  cursor: pointer;
  list-style: none;
}
.kind-vardnav__link::-webkit-details-marker { display: none; }
.kind-vardnav__icon { display: flex; position: relative; }
.kind-vardnav__icon .kind-icon { width: 24px; height: 24px; }
/* web#889: brickan med summan olästa patientmeddelanden på fliken Patienter.
   GEOMETRIN ÄR PATIENTTABBARENS (.kind-tabbar__badge, kind_patient.css:173-193)
   medvetet ordagrant, så vårdgivarens och patientens bricka är SAMMA affordans
   och inte två som nästan liknar varandra: 18px fast pillerhöjd, 13px text
   (husets absoluta textgolv, CP-04 / ADR-065 §D4) med line-height 18px så
   siffran ryms utan att växa lådan, och accentfärg mot bakgrundsfärgad text.
   Positioneringen hänger på `position: relative` på ikonlådan ovan och inte på
   länken, så brickan följer IKONEN och aldrig etikettens textbredd (etiketten
   ellipsas vid 320px, `.kind-vardnav__label`).
   Siffran är `aria-hidden`: antalet står i klartext i länkens `aria-label` via
   `ngettext`, så en skärmläsare läser det en gång och inte två. */
.kind-vardnav__badge {
  position: absolute;
  top: -6px;
  inset-inline-start: 55%;
  min-width: 18px;
  height: 18px;
  padding-inline: 5px;
  border-radius: var(--kind-radius-pill);
  background: var(--kind-color-accent);
  color: var(--kind-color-bg);
  font-size: 0.8125rem;
  font-weight: 700;
  line-height: 18px;
  text-align: center;
  pointer-events: none;
}
/* web#766 skiva E: markeringen "Ny kontaktförfrågan" på Patienter. En prick,
   inte en siffra (villkor 1: inget tal ur kön), på ikonens motsatta hörn så
   att den aldrig krockar med brickan för olästa meddelanden. */
.kind-vardnav__forfragan {
  position: absolute;
  top: -3px;
  inset-inline-end: 55%;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: var(--kind-color-accent);
  box-shadow: 0 0 0 2px var(--kind-color-bg);
  pointer-events: none;
}
/* ETIKETTEN BRYTS ALDRIG MITT I ETT ORD (villkor 5 i BESLUT.md). Uppmätt i
   mockbygget med `overflow-wrap: anywhere`: vid 320px renderade "Patienter" som
   "Patiente" plus "r" på egen rad, vilket både är oläsligt och gör bandet
   högre. Vakt: e2e/mat217d.mjs räknar rader per etikett via getClientRects. */
.kind-vardnav__label {
  display: block;
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow-wrap: normal;
}
.kind-vardnav__link:hover { color: var(--kind-color-text); }
/* AKTIV PLATS. Selektorn matchar VARJE sant `aria-current`, inte enbart
   `="page"`, eftersom #339 ger overflodets `<summary>` `aria-current="true"`:
   utfallaren ar den aktuella POSTEN i bandet men inte en SIDA, och `page`
   betyder ordagrant "Represents the current page within a set of pages"
   (WAI-ARIA 1.2, hamtad 2026-08-22). Att i stallet skriva `="page"` pa
   utfallaren for att fa CSS att traffa hade varit att bojja semantiken efter
   stilarket. `:not([aria-current="false"])` behovs eftersom `false` ar
   attributets dokumenterade default-varde och alltsa far forekomma explicit. */
.kind-vardnav__link[aria-current]:not([aria-current="false"]) {
  color: var(--kind-color-accent);
  box-shadow: inset 0 2px 0 0 var(--kind-color-accent);
}
/* GRUPPMARKOREN, #339 variant C. Utfallaren sager "du star INNE i den har
   gruppen", vilket ar en svagare utsaga an de fyra sidlankarnas "det har AR
   sidan", sa den bar en egen markor utover accentfargen: fetare vikt plus en
   liten stapel i underkant. Tva sinnesintryck utover fargen, alltsa aldrig
   enbart farg (WCAG 1.4.1), precis som bandets ovriga aktiva lage.
   `position: relative` pa listposten ar barare for stapeln och paverkar INTE
   det fixerade arket: containing block for `position: fixed` bestams av
   transform, filter, perspective, contain och will-change, aldrig av en
   relativt positionerad forfader. Vakt: rendermatningen i
   docs/design-proposals/mer-ark/matning/339-bygge lasar `arkIFlodet` per yta. */
.kind-vardnav__item--mer { position: relative; }
.kind-vardnav__mer > .kind-vardnav__link[aria-current]:not([aria-current="false"]) {
  font-weight: 700;
}
.kind-vardnav__mer > .kind-vardnav__link[aria-current]:not([aria-current="false"])::after {
  content: "";
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  bottom: 6px;
  width: 18px;
  height: 3px;
  border-radius: 2px;
  background: var(--kind-color-accent);
}
/* OFFSETEN AR RAKNAD, INTE VALD. Aktiv plats bar en INSATT accentmarkor
   (`box-shadow: inset 0 2px`), och ringen ar 3px accentfargad
   (--kind-focus-ring och --kind-color-accent ar SAMMA hexvarde, #1769D2 i
   ljust lage). Vid `outline-offset: -3px` spanner ringens band [0,3] inat fran
   kantladan medan markoren spanner [0,2], sa tva av ringens tre pixelrader
   maladas accent pa accent, 1.00:1. Uppmatt: 160 av 1022 ringpixlar OSYNLIGA,
   bbox y 0..1 (matning/gatefix-fokusring).

   -6px flyttar ringens band till [3,6], alltsa precis utanfor markoren. Talet
   ar markorens 3px i patientens sidospaltslage plus ringens 3px, och samma
   tal anvands pa `.kind-tabbar__link` sa de tva navens aritmetik inte kan
   drifta isar. Uppmatt vid -6px: 0 osynliga ringpixlar.

   EN POSITIV OFFSET AR UTESLUTEN, OCH DET AR MATT. Bandet ar `position: fixed;
   bottom: 0` och sista posten ligger dikt mot hogerkanten, sa ringen KLIPPS av
   skarmkanten: ringpixlarna sjunker fran 1022 till 769 vid 0px och 621 vid
   2px, och 14 respektive 6 pixlar ar anda kvar ovanpa markoren. Att folja
   husets normala `--kind-focus-ring-offset: 2px` har hade alltsa bytt en
   halvsynlig ring mot en avklippt.

   Stapeln (`::after`) ar OSKYLDIG: ring-snitt-stapel ar 0 pixlar vid VARJE
   provad offset. Den star 6px upp fran listpostens underkant och ringen har
   aldrig natt den. */
.kind-vardnav__link:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: -6px;
  border-radius: var(--kind-radius);
}
.kind-vardnav__mer { position: static; }
.kind-vardnav__mer[open] > .kind-vardnav__link { color: var(--kind-color-accent); }
/* Överflödsarket är FLAT med gruppetiketter, aldrig ett utfäll inuti ett
   utfäll. Det är precis invändningen #140 reser mot ett hamburgerförslag. */
.kind-vardnav__ark {
  position: fixed;
  z-index: 210;
  left: 50%;
  transform: translateX(-50%);
  /* #277: samma tal som bandets hojd, nu ur EN token i stallet for en andra
     kopia av literalen 80px. Uppmatt identiskt fore och efter (computed
     `bottom` 88px vid 390x664 och 1280x800, e2e/277-reservprov.mjs). */
  bottom: calc(var(--kind-vardnav-reserve) + var(--kind-space-1));
  width: min(45rem, calc(100vw - 1.5rem));
  max-height: 62dvh;
  overflow-y: auto;
  display: grid;
  grid-template-columns: repeat(3, minmax(8.75rem, 1fr));
  gap: var(--kind-space-1) var(--kind-space-5);
  padding: var(--kind-space-4) var(--kind-space-5) var(--kind-space-5);
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  box-shadow: var(--kind-shadow-md);
  text-align: left;
}
.kind-vardnav__grupp {
  grid-column: 1 / -1;
  margin: var(--kind-space-3) 0 0;
  font-size: 0.8125rem;
  /* 600, inte 700: husets typskala tillater normal, medium och semibold for
     rubrikklasser (briefen 4.2, vakt tests/test_cp0405_typografi_form.py).
     Versalerna och bokstavsmellanrummet bar redan gruppens tyngd. */
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--kind-color-text-muted);
}
.kind-vardnav__grupp:first-child { margin-top: 0; }
.kind-vardnav__ark a {
  display: flex;
  align-items: center;
  min-height: 44px;
  padding: 0 var(--kind-space-2);
  border-radius: var(--kind-radius);
  color: var(--kind-color-text);
  text-decoration: none;
  font-weight: 500;
}
.kind-vardnav__ark a:hover { background: var(--kind-color-surface-muted); }
.kind-vardnav__ark a[aria-current="page"] {
  background: var(--kind-color-accent-bg);
  color: var(--kind-color-accent);
  font-weight: 700;
}

/* BOTTENRESERV. Utan den lägger sig bandet över sidans sista rad, alltså vore
   en navflytt en regression och inte en komprimering. Reserven gäller ENBART
   hubbytorna, eftersom chattytorna inte renderar bandet. */
.kind-body--admin:not(.kind-body--vardchatt) .kind-main { padding-bottom: 6rem; }
.kind-body--admin:not(.kind-body--vardchatt) .kind-footer { padding-bottom: 6rem; }
/* SC 2.4.11, FOKUS INTE SKYMT. Bottenreserven räcker för SKROLLAT innehåll men
   inte för webbläsarens egen inskrollning: rullas ett element in nära
   dokumentets slut parkeras det vid nederkanten, alltså UNDER det fixerade
   bandet. `scroll-margin-bottom` är den term som säger åt inrullningen att
   lämna plats, och den behövs på varje fixerat bottenband.

   #277 (2026-08-20), TVÅ MÄTTA HÅL I DEN URSPRUNGLIGA FORMEN, båda av samma
   slag: kontrollens täckningsmängd var smalare än den bindande mängden.

   HÅL 1, UPPRÄKNINGEN. `:where(a, button, summary, input, select, textarea)`
   är sex TAGGNAMN, inte "det som kan ta fokus". `div.kind-table-wrap
   [tabindex="0"]` står i sju vårdgivarmallar (bokningar, användare, formulär,
   loggutdrag, förfrågningar, analys x2), renderas på ytor som BÄR bandet, och
   läste `scroll-margin-bottom: 0px` medan en syskonlänk på samma sida läste
   96px (uppmätt på renderad `/admin/anvandare`, e2e/277-fokusprov.mjs).
   Utfallet är inte teoretiskt: driven med `scrollIntoView({block:'nearest'})`,
   alltså samma API huset självt anropar i kind_confirm_focus.js,
   kind_dorr_error_focus.js och kind_composer_mode.js, landade en bärare utan
   reserv på rect 624..664 med bandets överkant på 584, alltså 0 av 15
   provpunkter, HELT skymd. Samma element med reserv landade 528..568, 15 av
   15. `[tabindex]` binder till FÖRMÅGAN att ta fokus i stället för till en
   lista över taggnamn, och täcker därmed också `tabindex="-1"`-målen
   (`#kind-main`, `#kind-patienter-oversikt`), som är fragmentmål på just de
   här ytorna.

   HÅL 2, DET FASTA TALET. Bandet är `80px + env(safe-area-inset-bottom)` högt,
   reserven var `6rem` = 96px platt. På en enhet med hemindikator (portrait
   inset cirka 34px) är bandet 114px och behovet 119px med fokusringens 5px,
   alltså är reserven MINDRE än bandet på exakt de enheter insetet finns.
   Reserven härleds därför nu ur bandets egen token. `max()` gör ändringen
   NOLL vid inset 0: `max(96px, 85px)` är 96px, alltså bit för bit samma
   beteende som före på varje yta som går att mäta här, och den växer bara där
   den måste.

   VAD SOM MEDVETET INTE GJORDES, och läs det innan du "kompletterar" filen.
   Uppdraget bad om patientytans `html:has(...) { scroll-padding-block-end }`.
   Den lades INTE till, eftersom den mättes och inte stängde något: 32
   mätpunkter (2 ytor x 2 vyer x 2 bärartyper x 4 CSS-tillstånd, inklusive ett
   simulerat 34px-inset) gav noll skymda element i alla tillstånd, och roten
   ADDERAS till elementets `scroll-margin`, så den flyttade landningarna 43 till
   50px uppåt utan att stänga en defekt. Chromium rullar en FOKUSERAD post till
   mitten (center-if-needed), inte till nederkanten, så patientytans mekanism
   (#183) biter inte likadant här. Se e2e/277-reservprov.mjs. */
.kind-body--admin:not(.kind-body--vardchatt)
  :where(a, button, summary, input, select, textarea, [tabindex]) {
  scroll-margin-bottom: max(6rem, calc(var(--kind-vardnav-reserve, 0px) + 5px));
}

/* ---- #339 / VARIANT C: SEKTIONSRADEN ----------------------------------
   Bar orienteringen som det oppna arket bar tidigare, till 28px i stallet for
   412px. Renderas pa de 16 navrutter som hor till Verktyg eller Mer.

   TALEN AR MOCKENS, inte pahittade: 28px min-height, 13px text, gruppnamnet i
   versaler med 0.08em sparrning, avdelaren nedtonad, den aktuella posten i
   textfarg och halvfet (docs/design-proposals/mer-ark/
   variant-c-bandet-bar-platsen.html).

   `min-height` och inte `height`: vid stor textskala vaxer raden i stallet for
   att klippa texten. Etiketterna far radbrytas HAR, till skillnad fran i
   bandet, och det ar hela poangen med raden. */
.kind-sektionsrad {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 0.4rem;
  margin: 0 0 var(--kind-space-3);
  min-height: 28px;
  font-size: 0.8125rem;
  line-height: 1.3;
  color: var(--kind-color-text-muted);
}
.kind-sektionsrad__grupp {
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-weight: 600;
}
.kind-sektionsrad__delare { opacity: 0.6; }
.kind-sektionsrad__nu {
  color: var(--kind-color-text);
  font-weight: 600;
}

@media (max-width: 560px) {
  .kind-vardnav__list { padding-inline: 2px; }
  .kind-vardnav__item { min-width: 44px; }
  .kind-vardnav__link { padding: var(--kind-space-2) 1px; gap: 2px; }
  /* Etiketten pinnas till 13px, samma manöver och samma skäl som
     `.kind-tabbar__label` (F-2): utan pinnen trycker stor textskala ut de fem
     etiketterna ur en 320px-rad. Webbläsarzoom skalar fortfarande px. */
  .kind-vardnav__label { font-size: 13px; }
  .kind-vardnav__ark {
    grid-template-columns: 1fr;
    left: var(--kind-space-2);
    right: var(--kind-space-2);
    transform: none;
    width: auto;
  }
}

/* ============ #312 variant B: illustrerade tomtillstand ============
 *
 * BESLUT: `docs/design-proposals/312/BESLUT.md` rad 1 (variant B), rad 3
 * (ombaslinjerad 2026-08-21 till de tomma lagen som bar `.kind-empty`) och
 * rad 4 (paletten nedan). Visuellt mal: `variant-b.html` i samma katalog.
 *
 * Lagret ritar EN illustration ovanfor ett befintligt `.kind-empty`, och rors
 * bara nar en yta ar tom. Det ar hela skalet till att variant B valdes: en tom
 * lista har inga akuta rader, alltsa konkurrerar den har varmen inte med
 * `--kind-color-error`, som ar appens bradskande-farg och redan ligger pa
 * CP-05:s tak pa den fyllda listan (BESLUT sektion 3 och beslutsrad 2).
 *
 * ------------------------------------------------------------------------
 * PALETTEN AR PROVISORISK. DEN AR INTE HUSSTIL. LAS DETTA FORE DU ATERANVANDER.
 * ------------------------------------------------------------------------
 * Konsultbeslut 2026-08-21 (BESLUT rad 4): "vi ritar enkla och avsiktligt
 * provisoriska, paletten blir INTE husstil".
 *
 * Varden nedan ar valda for att TRAFFA ETT MATTAL, namligen att flytta en tom
 * yta mot KINDs varm-mot-kall-forhallande, INTE for att vara ett varumarke.
 * De ar ingen designtokens och de har ingen kontrastmatris bakom sig: ADR-065
 * normerar farg, typografi och form i CSS, men sager ingenting om linjevikt,
 * perspektiv, figurstil eller hudtoner. Det stilbeslutet ar OFATTAT och bors av
 * ux (BESLUT sektion 7).
 *
 * En formgivare ska kunna ersatta HELA bildvarlden genom att skriva om det har
 * enda blocket. Darfor:
 *   - paletten ar SCOPAD till komponenten, aldrig till `:root`, sa att
 *     ADR-065:s 228 matta kontrastpar inte kan roras harifran;
 *   - namnen ar roller (`ink`, `paper`, `varm-1`) och inte kulorer, sa ett byte
 *     till en annan familj inte gor namnen logn;
 *   - SVG:erna konsumerar bara dessa variabler och bar noll egna hexfarger.
 *
 * Bygg ALDRIG vidare pa de har vardena som om de vore normerade. Vaxer
 * bildvarlden till fler ytor ar ratt atgard en ADR om illustrationsstil, inte
 * att kopiera hexarna harifran.
 *
 * TILLGANGLIGHET: illustrationerna bar `role="img"` plus ett beskrivande
 * `aria-label`, alltsa UPPLASTA, eftersom de ar tomtillstandets innehall pa en
 * yta dar texten ar kort. De ar INTE rent dekorativa. Motiveringen och de tva
 * ytor dar bedomningen gick at andra hallet star i macron
 * `templates/admin/_tomruta.html`. WCAG 2.2 AA 1.4.11 stalls inte pa dem,
 * eftersom texten under bar hela informationen och bilden aldrig ar enda
 * bararen.
 */

.kind-tomruta { margin: var(--kind-space-4) 0; }

.kind-tomruta--illustrerad {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: var(--kind-space-3);
  padding: var(--kind-space-6) var(--kind-space-4);

  /* Provisorisk illustrationspalett, se blockkommentaren ovan. */
  --kind-illu-ink: #4A4441;      /* konturer */
  --kind-illu-paper: #FFF3E2;    /* pappersyta */
  --kind-illu-skugga: #FFE3DC;   /* markskugga under motivet */
  --kind-illu-linje: #8C837E;    /* antydd text i motivet */
  --kind-illu-varm-1: #FF676E;   /* korall */
  --kind-illu-varm-2: #FCAD6D;   /* orange */
  --kind-illu-varm-3: #FDBA12;   /* gul */
  --kind-illu-accent: #E2555C;   /* djupare korall, forstoringsglaset */
  --kind-illu-pa-varm: #FFFFFF;  /* markeringar OVANPA en varm yta */
}

/* `.kind-empty` bar sin egen dampade yta och rundning, alltsa ligger bilden
   ovanfor rutan och inte inuti den. Bredden halls kortare an radlangden pa en
   full lista sa texten inte blir en enda lang rad under bilden. */
.kind-tomruta--illustrerad .kind-empty { max-width: 46ch; }

.kind-illu__bild { flex: 0 0 auto; line-height: 0; }
.kind-illu__svg { display: block; height: auto; max-width: 100%; }

/* Morkt tema: enda vardet som faktiskt ar FEL i mork miljo ar markskuggan, som
   annars blir en ljus blob pa en mork yta. Ovriga varden ar ljusa motiv pa mork
   bakgrund, vilket ar hur illustrationer normalt beter sig. Tuningen ar
   avsiktligt minimal, resten hor till formgivarpasset (BESLUT rad 4). */
html[data-kind-theme="dark"] .kind-tomruta--illustrerad {
  --kind-illu-skugga: #2E3742;
}

/* Vid stor textskala och pa smal skarm tar bilden yta fran texten utan att
   tillfora nagot, sa den krymper i stallet for att trycka ner budskapet. */
@media (max-width: 640px) {
  .kind-tomruta--illustrerad { padding: var(--kind-space-5) var(--kind-space-3); }
  .kind-tomruta--illustrerad .kind-illu__svg { width: 132px; }
}

/* ==========================================================================
   ADR-071 DEL 5: klinik-adminens säkerhetsloggyta (#300).

   VARIANT C, "den synliga luckan", konsultbeslut 2026-08-22
   (`docs/design-proposals/sakerhetslogg-del5/BESLUT.md`, commit 9032837).

   Reglerna nedan är INTE visningskrom. Två av dem åtgärdar defekter som MÄTTES
   i mockarbetet, och talen står kvar så att nästa läsare kan göra om mätningen
   i stället för att lita på den här meningen.
   ========================================================================== */

/* SIDRUBRIKEN MÅSTE FÅ BRYTAS.

   UPPMÄTT 2026-08-22 vid 320px port och xxlarge textskala: "Säkerhetshändelser"
   är ETT svenskt sammansatt ord utan brytpunkt, blev 346px brett och sprängde
   `#kind-main` med 80px, alltså horisontell skroll på HELA ytan. Tre åtgärder
   mättes och alla tre löser det:

     hyphens: auto             main-överflöde 80 -> 0, rubriken 232x86
     overflow-wrap: anywhere   main-överflöde 80 -> 0, rubriken 232x86
     kortare namn "Säkerhet"   main-överflöde 80 -> 0, rubriken 155x43

   Den första valdes: den behåller namnet och bryter enligt svenska
   avstavningsregler. Regeln är SCOPAD till den här sidans rubrik och inte satt
   på varje `#kind-main h1`. Skälet är blast radius, inte principiell oenighet:
   samma brytning är sannolikt rätt på varje admin-rubrik, men det är en egen
   UI-ändring med egen grind (regel 54) och egen visuell regression att mäta. */
.kind-sakerhet__rubrik {
  hyphens: auto;
  overflow-wrap: break-word;
}

/* Kontot i mönsterlistans sammanfattning.

   `.kind-profile-section__more-summary` är en `kind-btn`, alltså
   `display: inline-flex` utan radbrytning. Ett långt kontonamn som flexbarn där
   spränger DOKUMENTET, inte bara elementet: UPPMÄTT 2026-08-22 blev kontot
   311px vid 320px port och NORMAL textskala, och dokumentbredden 548px.

   Kontot får därför en egen rad och bryter inuti ordet. En maskerad e-post är
   en enda lång token utan mellanslag (`b***@distriktsskoterskemottagningen-
   solna.vardcentralen-solna-centrum.se`), så `break-word` räcker inte, det
   måste vara `anywhere`. */
.kind-sakerhet-monster__summary {
  flex-wrap: wrap;
  align-items: baseline;
  text-align: left;
}
.kind-sakerhet-monster__konto {
  flex: 1 1 100%;
  overflow-wrap: anywhere;
  font-family: var(--kind-font-mono);
  font-size: var(--kind-font-small);
  color: var(--kind-color-text-muted);
}
.kind-sakerhet-monster__txt { white-space: normal; }
.kind-sakerhet-monster { margin-bottom: var(--kind-space-2); }

/* DEN SYNLIGA LUCKAN.

   Rutan är avsiktligt visuellt AVVIKANDE och avsiktligt bortmaskad i utseendet:
   variantens hela idé är att läsaren SER hålet i stället för att läsa om det.
   Den ligger i en egen sektion med egen rubrik, alltså en post i
   rubrikstrukturen, eftersom en alltid likadan panel drabbas av bannerblindhet
   medan en rubrik i strukturen inte gör det.

   Färgerna är warning-tokens och inte error: luckan är inte ett fel, den är en
   känd och avsedd begränsning som ytan är ärlig om. */
.kind-sakerhet-lucka {
  border: 2px dashed var(--kind-color-warning);
  border-radius: var(--kind-radius);
  padding: var(--kind-space-4);
  margin: var(--kind-space-3) 0 var(--kind-space-5);
  background: repeating-linear-gradient(
    135deg,
    var(--kind-color-warning-bg),
    var(--kind-color-warning-bg) 10px,
    var(--kind-color-surface-muted) 10px,
    var(--kind-color-surface-muted) 20px
  );
}
.kind-sakerhet-lucka__tal {
  display: block;
  font-size: var(--kind-font-h3);
  font-weight: 700;
  color: var(--kind-color-text);
  overflow-wrap: break-word;
}
.kind-sakerhet-lucka p {
  margin: var(--kind-space-2) 0 0;
  color: var(--kind-color-text);
}

/* Kontokolumnen i tabellen bär samma långa token som mönsterlistan, och en
   tabellcell utan brytning spränger tabellen i stället för dokumentet. */
.kind-sakerhet__konto { overflow-wrap: anywhere; }

/* Det råa händelse-tokenet och rutten under sin svenska etikett. Sekundär
   information: liten, dämpad, egen rad. Den finns kvar därför att en
   klinik-admin som ringer supporten behöver kunna läsa upp den exakta
   händelsetypen, och en översatt etikett går inte att söka på. */
.kind-sakerhet__token {
  display: block;
  font-family: var(--kind-font-mono);
  font-size: var(--kind-font-small);
  overflow-wrap: anywhere;
}

/* Meningen om att avsändaradressen inte visas. Den står i täckningsrutan och
   inte i en fotnot, eftersom den är en del av svaret på "vad visar den här
   sidan inte", inte en teknisk detalj. */
.kind-sakerhet__ipnot {
  margin: var(--kind-space-2) 0 0;
  color: var(--kind-color-text-muted);
}

/* =========================================================================
   #420: artikelns lasläge, hopfalld atgardsmeny (variant B) plus
   bekraftelsesteget fore radering.
   ========================================================================= */

/* Menyn ar positionerad relativt sin egen rot, ALDRIG mot viewporten. En
   absolutpositionerad meny som mater mot viewporten ger horisontell
   dokumentskroll vid 320px, vilket var en KAND defekt i mocken och rattades
   under ritandet (BESLUT.md). Vakten star i tests/test_420_lasvy.py. */
.kind-artikelmeny {
  position: relative;
  display: flex;
  /* web#618: `wrap` sa Dela-kvittensen nedan far en EGEN rad under knappen i
     stallet for att trangas bredvid den. Utan poster som bryter ar raden
     oforandrad, alltsa noll kostnad pa varje lasläge dar ingen tryckt Dela. */
  flex-wrap: wrap;
  justify-content: flex-end;
  margin: 0 0 var(--kind-space-3, 12px);
}

.kind-artikelmeny__lista {
  position: absolute;
  top: calc(100% + 4px);
  /* HOGERKANTAD, inte vansterkantad: knappen sitter till hoger, och en meny som
     vaxer at hoger fran en hogerstalld knapp sticker ut ur viewporten. */
  right: 0;
  left: auto;
  z-index: 20;
  min-width: 12rem;
  /* Taket hindrar menyn fran att bli bredare an sin container vid 320px. */
  max-width: min(16rem, calc(100vw - 2rem));
  margin: 0;
  padding: var(--kind-space-1, 4px);
  list-style: none;
  background: var(--kind-surface, #fff);
  border: 1px solid var(--kind-border, #d0d5dd);
  border-radius: var(--kind-radius-2, 8px);
  box-shadow: 0 4px 16px rgb(0 0 0 / 12%);
}

.kind-artikelmeny__form {
  margin: 0;
}

.kind-artikelmeny__post {
  display: block;
  width: 100%;
  /* 44px golv, samma som husets ovriga traffytor. */
  min-height: 44px;
  padding: var(--kind-space-2, 8px) var(--kind-space-3, 12px);
  border: 0;
  background: none;
  color: var(--kind-text, #1d2939);
  font: inherit;
  text-align: left;
  text-decoration: none;
  cursor: pointer;
  border-radius: var(--kind-radius-1, 4px);
}

.kind-artikelmeny__post:hover,
.kind-artikelmeny__post:focus-visible {
  background: var(--kind-surface-hover, #f2f4f7);
}

/* Radera-posten. Kontrasten pa den har fargen ar beroende av stilarkens
   ordning: kind.css, kind_admin.css, kind_patient.css ger 5.10:1 och omvand
   ordning ger 1:1. Ordningen asserteras i tests/test_420_stilarksordning.py
   i stallet for att antas. */
.kind-artikelmeny__post--danger {
  color: var(--kind-danger-text, #b42318);
}

/* web#618 punkt 1: kvittensen for "Dela" ("Länk kopierad").
 *
 * Den ligger UNDER menyknappen i normalflodet och inte i menypanelen, sa den
 * overlever att menyn stangs. Tom ar den en tom <p> utan egen hojd, alltsa
 * kostar den noll pixlar pa varje lasläge dar ingen har tryckt pa Dela.
 *
 * `text-align: right`: menyn ar hogerkantad, och kvittensen hor till den. */
.kind-artikelmeny__kvittens {
  /* I NORMALFLODET, inte absolutpositionerad: menypanelen ar absolut och hade
     lagt sig OVANPA en kvittens pa samma plats. Skriptet stanger dessutom
     menyn nar Dela klickas (gamla KIND stanger ocksa menyn pa ett val), sa
     kvittensen star fritt under knappen nar den val har en text. */
  width: 100%;
  margin: var(--kind-space-1, 4px) 0 0;
  color: var(--kind-color-text-muted, #475467);
  font-size: var(--kind-font-small, 0.875rem);
  text-align: right;
}
.kind-artikelmeny__kvittens:empty {
  display: none;
}

/* Bekraftelsesteget fore radering */
.kind-bekrafta {
  max-width: 42rem;
}

.kind-bekrafta__konsekvenser {
  margin: var(--kind-space-4, 16px) 0;
  padding-left: 1.25rem;
}

.kind-bekrafta__konsekvenser > li {
  margin-bottom: var(--kind-space-2, 8px);
}

/* Ett omatt tal ska SYNAS som omatt, aldrig lasa som en nolla. */
.kind-bekrafta__omatt {
  color: var(--kind-danger-text, #b42318);
}

.kind-bekrafta__varning {
  padding: var(--kind-space-3, 12px);
  border-left: 4px solid var(--kind-danger-text, #b42318);
  background: var(--kind-danger-surface, #fef3f2);
}

.kind-bekrafta__knappar {
  display: flex;
  flex-wrap: wrap;
  gap: var(--kind-space-3, 12px);
  align-items: center;
  margin-top: var(--kind-space-5, 20px);
}

.kind-bekrafta__knappar > form {
  margin: 0;
}

/* ---------------------------------------------------------------------------
   VÅRDGIVARENS PÅGÅENDE PLAN, steglistan (#253 punkt 2, variant C)
   `docs/design-proposals/525/variant-c.html`, konsultbeslut 2026-08-31.

   TRE AVVIKELSER FRÅN MOCKEN, alla avsiktliga och redovisade för regel 54d:

   1. NAMNEN ÄR PREFIXADE. Mocken har `.steglista`, `.steg--gjort` och `.prick`
      obeprefixade, vilket är riskfritt i en fristående fil men inte i ett
      globalt stilark som varje adminvy laddar. Husets konvention är `kind-`
      (`kind-profile-section__title`, `kind-step-editor__row`).
   2. `kind-btn--fara` LADES INTE TILL. `.kind-btn--danger` finns redan (rad
      4417), är samma behandling (ram plus textfärg, inte fylld röd), bär en
      dokumenterad kontrastmätning (5.10:1, AA) och används i fem mallar. En
      svensk dubblett hade varit ett andra register för samma sak, utan
      kontrastnoten.
   3. VÄRDENA ÄR TOKENS, inte mockens hexliteraler, så listan följer temat.
      Mockens `#5a6169` och `#767d84` är båda dämpad text; huset har ETT
      token för det och två nyanser hade varit en skillnad utan betydelse.

   Patientytans `.kind-step*` går INTE att återanvända: de bor i
   `kind_patient.css`, som den här sidan inte laddar. Mätt, inte antaget.
   --------------------------------------------------------------------------- */
.kind-planlista {
  list-style: none;
  margin: var(--kind-space-2) 0 0;
  padding: 0;
  font-size: var(--kind-font-small);
}
.kind-planlista > li {
  display: flex;
  gap: var(--kind-space-2);
  padding: var(--kind-space-1) 0;
  border-top: 1px dotted var(--kind-color-border);
}
.kind-planlista > li:first-child {
  border-top: 0;
}
/* Färg är ALDRIG den enda signalen (WCAG 1.4.1): varje rad bär också sitt
   tillstånd som text, se `.kind-plansteg__tillstand` i mallen. */
.kind-plansteg--gjort {
  color: var(--kind-color-text-muted);
}
.kind-plansteg--nu {
  font-weight: 600;
}
.kind-plansteg--kvar {
  color: var(--kind-color-text-muted);
}
.kind-plansteg__prick {
  flex: 0 0 auto;
  width: 1.1rem;
  text-align: center;
}
/* #217: vårdgivarens översikt, signerad variant C (uppgiftsraden).
 * Åtgärdskort är hela länkar; lägeskort är ren text. Färgerna är endast
 * bakgrunder och bär aldrig betydelse. */
.kind-dashboard {
  display: grid;
  gap: var(--kind-space-7, 32px);
}

.kind-dashboard__section {
  display: grid;
  gap: var(--kind-space-3, 12px);
}

.kind-dashboard__section > h2 {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--kind-space-2, 8px);
  margin: 0;
}

.kind-dashboard__actions,
.kind-dashboard__status,
.kind-dashboard-links {
  display: grid;
  gap: var(--kind-space-3, 12px);
}

.kind-dashboard__actions {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr));
}

.kind-dashboard__status {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 9.25rem), 1fr));
}

.kind-dashboard-kpi {
  min-width: 0;
  padding: var(--kind-space-4, 16px);
  border-radius: var(--kind-radius);
  background: var(--kind-color-surface);
  overflow-wrap: anywhere;
}

.kind-dashboard-kpi--action {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: var(--kind-space-2, 8px) var(--kind-space-3, 12px);
  min-height: 44px;
  border: 1px solid var(--kind-color-border);
  color: var(--kind-color-text);
  text-decoration: none;
  box-shadow: var(--kind-shadow-sm);
}

.kind-dashboard-kpi--action:hover {
  border-color: var(--kind-color-accent);
  background: var(--kind-color-accent-bg);
}

.kind-dashboard-kpi--action:focus-visible,
.kind-dashboard-link:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: var(--kind-focus-ring-offset);
}

.kind-dashboard-kpi__icon,
.kind-dashboard-link__icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
  color: var(--kind-color-text);
  background: var(--kind-color-accent-bg);
  border-radius: 999px;
}

.kind-dashboard-kpi__icon {
  width: 40px;
  height: 40px;
  grid-row: 1 / span 2;
}

.kind-dashboard-kpi__label {
  color: var(--kind-color-text-muted);
  font-size: var(--kind-font-small);
  font-weight: 700;
  letter-spacing: .04em;
  text-transform: uppercase;
}

.kind-dashboard-kpi__value {
  color: var(--kind-color-text);
  font-size: 2rem;
  font-variant-numeric: tabular-nums;
  line-height: 1.1;
}

.kind-dashboard-kpi__action {
  grid-column: 1 / -1;
  color: var(--kind-color-accent);
  font-size: var(--kind-font-small);
  font-weight: 600;
}

.kind-dashboard-status {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  align-items: center;
  gap: var(--kind-space-2, 8px);
  padding: var(--kind-space-3, 12px);
  border: 1px solid var(--kind-color-border-soft);
}

.kind-dashboard-status .kind-dashboard-kpi__icon {
  width: 32px;
  height: 32px;
  grid-row: 1 / span 2;
}

.kind-dashboard-status .kind-dashboard-kpi__value {
  font-size: 1.375rem;
}

/* web#756 nyckeltal 6: underraden "varav N obesvarade i mer an 3 dagar". Egen
   klass och INTE en andra `__value`, sa antalet nyckeltalskort forblir lasbart
   som antalet `__value`-element. Spanner hela kortet sa den hamnar under bade
   ikonen och talet i 2-kolumnsrutnatet. */
.kind-dashboard-kpi__detail {
  grid-column: 1 / -1;
  color: var(--kind-color-text-muted);
  font-size: var(--kind-font-small);
  font-variant-numeric: tabular-nums;
  overflow-wrap: anywhere;
}

.kind-dashboard-links {
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 14.5rem), 1fr));
}

.kind-dashboard-link {
  display: flex;
  align-items: center;
  gap: var(--kind-space-3, 12px);
  min-width: 0;
  min-height: 52px;
  padding: var(--kind-space-2, 8px) var(--kind-space-3, 12px);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  background: var(--kind-color-surface);
  color: var(--kind-color-text);
  text-decoration: none;
}

.kind-dashboard-link:hover {
  border-color: var(--kind-color-accent);
  background: var(--kind-color-accent-bg);
}

.kind-dashboard-link__icon {
  width: 34px;
  height: 34px;
}

.kind-dashboard-link__label {
  min-width: 0;
  flex: 1 1 auto;
  overflow-wrap: anywhere;
}

.kind-dashboard-link__arrow {
  flex: 0 0 auto;
  color: var(--kind-color-text-muted);
}

.kind-dashboard__role-badge {
  display: inline-block;
  padding: 2px 8px;
  border: 1px solid var(--kind-color-accent);
  border-radius: 999px;
  background: var(--kind-color-accent-bg);
  color: var(--kind-color-accent-hover);
  font-size: var(--kind-font-small);
  font-weight: 600;
  letter-spacing: .04em;
}

.kind-dashboard-admin {
  display: grid;
  gap: var(--kind-space-3, 12px);
  padding: var(--kind-space-4, 16px);
  border: 1px solid var(--kind-color-border-soft);
  border-left: 4px solid var(--kind-color-accent);
  border-radius: var(--kind-radius);
  background: var(--kind-color-surface);
}

.kind-dashboard-admin__audit {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--kind-space-2, 8px);
  padding: var(--kind-space-3, 12px);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  background: var(--kind-color-accent-bg);
}

.kind-dashboard-admin__audit p {
  max-width: 62ch;
  margin: 0;
  color: var(--kind-color-text-muted);
  font-size: var(--kind-font-small);
}

@media (max-width: 430px) {
  .kind-dashboard {
    gap: var(--kind-space-6, 24px);
  }

  .kind-dashboard__actions,
  .kind-dashboard__status,
  .kind-dashboard-links {
    grid-template-columns: minmax(0, 1fr);
  }
}

/* web#514: plusmenyn på patientlistan (paritet med gamla KIND).
   Bäraren är native <details>/<summary>; summary bär redan .kind-btn, så här
   ligger bara menypanelens positionering och list-stilen. `list-style: none`
   på summary tar bort webkits/Firefox egen triangel så knappen blir ett rent
   plus, som i fångsten. */
.kind-plusmeny {
  position: relative;
  display: inline-block;
}
.kind-plusmeny__knapp {
  list-style: none;
  cursor: pointer;
  user-select: none;
}
.kind-plusmeny__knapp::-webkit-details-marker {
  display: none;
}
.kind-plusmeny__lista {
  position: absolute;
  right: 0;
  z-index: 40;
  min-width: 15rem;
  margin: 0.25rem 0 0;
  padding: 0.25rem;
  list-style: none;
  background: #fff;
  border: 1px solid var(--kind-border, #d7dde3);
  border-radius: 8px;
  box-shadow: 0 6px 20px rgba(0, 0, 0, 0.16);
}
.kind-plusmeny__val {
  display: block;
  width: 100%;
  box-sizing: border-box;
  padding: 0.65rem 0.85rem;
  text-align: left;
  font: inherit;
  color: inherit;
  background: none;
  border: 0;
  border-radius: 6px;
  cursor: pointer;
  text-decoration: none;
}
.kind-plusmeny__val:hover,
.kind-plusmeny__val:focus-visible {
  background: var(--kind-hover, #eef3f7);
}
.kind-plusmeny__val--avbryt {
  color: var(--kind-muted, #4a5560);
}

/* web#1067 (Kasper beslut 2026-10-05 (a)): gamla KIND:s borttagningsdialog för
 * en vårdresa. Rubrik + text + två namngivna knappar, så window.confirm räcker
 * inte. Formen är lånad ur .kind-dialog i kind_patient.css, men den klassen
 * laddas inte på vårdgivarportalen, därför en egen minimal uppsättning här. */
.kind-radera-dialog {
  max-width: 32rem;
  border: 1px solid var(--kind-color-border, #d7d7dc);
  border-radius: 12px;
  padding: 1.25rem;
  background: var(--kind-color-surface, #fff);
  color: inherit;
}
.kind-radera-dialog::backdrop {
  background: rgba(0, 0, 0, 0.45);
}
.kind-radera-dialog__title {
  margin: 0 0 0.5rem;
  font-size: 1.125rem;
}
.kind-radera-dialog__text {
  margin: 0 0 0.5rem;
}
/* `domain-compliance` villkor 4 (2026-10-06): det bevarade syns på ytan. Tonad
 * och mindre än Kaspers beslutade dialogtext, så det läses som upplysning och
 * inte som en konkurrerande rubrik -- men INTE gömd (ingen `display: none`,
 * ingen hover-grind): villkoret kräver att vårdgivaren faktiskt kan se den. */
.kind-radera-dialog__bevaras {
  margin: 0 0 1rem;
  color: var(--kind-color-text-muted, #4a5560);
  font-size: var(--kind-font-small, 0.875rem);
}
.kind-radera-hjalptext {
  margin: 0.25rem 0 0;
}
.kind-radera-dialog__actions {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  justify-content: flex-end;
}

/* ---- Inbjudningsdialogen (web#1088, UAT-fynd 2026-10-09) -------------------
 * Fyra steg ur `templates/admin/patient_inbjudan.html` + makrona i
 * `templates/admin/_inbjudningsdialog.html`: skriv, förhandsvisa, bekräftad och
 * "Skicka igen". Knapparna är husets `.kind-btn` (kind.css); här ligger bara
 * dialogkortet, fälten och radbrytningen av knappraden.
 *
 * 320 px: sidan har ingen fast bredd, kortet är `width: 100%` upp till
 * 36rem, och knappraden får bryta (`flex-wrap`) så en lång knapptext med
 * mottagarens namn eller nummer aldrig spränger raden. Välkomsttexten ska synas
 * HEL utan rullning (Alex 2026-10-09): `min-height: 14lh` rymmer
 * standardtexten (tre stycken, ca 130 tecken) även vid ca 28 tecken per rad
 * på 320 px, och `field-sizing: content` låter fältet växa med en längre
 * arbetsyte-text där webbläsaren stöder det. */
.kind-inbjudan-sida {
  box-sizing: border-box;
  width: 100%;
  max-width: 36rem;
  margin: var(--kind-space-5, 1.5rem) auto;
  padding: 0 var(--kind-space-3, 0.75rem);
}
.kind-inbjudan {
  box-sizing: border-box;
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-3, 0.75rem);
  width: 100%;
  padding: var(--kind-space-5, 1.5rem);
  background: var(--kind-color-surface);
  color: var(--kind-color-text);
  border: 1px solid var(--kind-color-border-soft);
  border-radius: var(--kind-radius);
  box-shadow: var(--kind-shadow-md);
}
/* `display: flex` ovan slår UA-lagrets `[hidden]` på ursprungsprecedens; radens
 * dolda dialog (`oppen=False`) måste förbli dold (scripts/svep_hidden_display.py). */
.kind-inbjudan[hidden] { display: none; }
.kind-inbjudan__huvud {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--kind-space-3, 0.75rem);
}
.kind-inbjudan__header {
  margin: 0;
  font-size: var(--kind-font-h3);
}
.kind-inbjudan__stang {
  font-size: 1.5rem;
  line-height: 1;
  padding: var(--kind-space-2, 0.5rem);
}
.kind-inbjudan__rubrik {
  margin: 0;
  font-size: var(--kind-font-base, 1rem);
  font-weight: 600;
  overflow-wrap: anywhere;
}
.kind-inbjudan__undertext {
  margin: 0;
  color: var(--kind-color-text-muted);
}
.kind-inbjudan__form {
  display: flex;
  flex-direction: column;
  gap: var(--kind-space-2, 0.5rem);
  width: 100%;
  margin: 0;
}
.kind-inbjudan__etikett {
  font-weight: 600;
}
.kind-inbjudan__falt {
  box-sizing: border-box;
  display: block;
  width: 100%;
  min-height: 21em; /* fallback utan `lh`: 14 rader x 1.5 */
  min-height: 14lh;
  field-sizing: content;
  padding: var(--kind-space-3, 0.75rem);
  font: inherit;
  line-height: 1.5;
  color: var(--kind-color-text);
  background: var(--kind-color-surface);
  border: 1px solid var(--kind-color-border);
  border-radius: var(--kind-radius);
  resize: vertical;
  white-space: pre-wrap;
}
.kind-inbjudan__falt:focus-visible {
  outline: var(--kind-focus-ring);
  outline-offset: var(--kind-focus-ring-offset);
}
.kind-inbjudan__knappar {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: var(--kind-space-2, 0.5rem);
  margin-top: var(--kind-space-2, 0.5rem);
}
.kind-inbjudan__knappar .kind-btn,
.kind-inbjudan__form--skicka .kind-btn {
  max-width: 100%;
  white-space: normal;
  overflow-wrap: anywhere;
  text-align: center;
}
.kind-inbjudan__form--skicka {
  align-items: flex-end;
}
.kind-inbjudan__mottagare {
  margin: 0 0 var(--kind-space-2, 0.5rem);
  font-weight: 600;
  overflow-wrap: anywhere;
}
.kind-inbjudan__sms,
.kind-inbjudan__valkomst {
  box-sizing: border-box;
  width: 100%;
  margin: 0;
  padding: var(--kind-space-3, 0.75rem);
  background: var(--kind-color-surface-muted);
  border-radius: var(--kind-radius);
  white-space: pre-wrap;
  overflow-wrap: anywhere;
}
