﻿html {
  font-size: 14px;
}

/* Dagrutans toner, delade av kalendrarna. Ingen fast nyans: blandningen med --bs-body-color
   gör rutan mörkare i ljust tema och ljusare i mörkt, av samma rad — och helgen får samma
   blandning kraftigare, så att den behåller sitt försprång i båda temana. Tonerna föddes på
   Mitt schema och står här därför att önskemålskalendern visar samma dagar: en helg ska se
   ut som en helg på båda skärmarna. */
:root {
  --skuld-day-bg: color-mix(in oklab, var(--bs-body-bg) 93%, var(--bs-body-color));
  --skuld-day-bg-weekend: color-mix(in oklab, var(--bs-body-bg) 84%, var(--bs-body-color));
}

@media (min-width: 768px) {
  html {
    font-size: 16px;
  }
}

/* Fokusringen låg tidigare på fast white + #258cfb, vilket i mörkt tema gav en vit ring mot
   mörk bakgrund. Bootstraps egna tokens följer data-bs-theme. */
.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
  box-shadow: 0 0 0 0.1rem var(--bs-body-bg), 0 0 0 0.25rem var(--bs-focus-ring-color);
}

/* Bootstrap har border-1..5 och border-0, men ingen streckad variant. Utan den här regeln
   ritas ingen ram alls där markup:en ber om border-dashed. */
.border-dashed {
  border-style: dashed !important;
}

/* ---- Temaväxeln ------------------------------------------------------------------------- */

/* Glödlampan. Vilken av de två kolvarna som visas avgörs här och inte i skriptet: attributet
   står på <html> innan sidan målas, så lampan är rätt redan i första bildrutan och blinkar
   aldrig om. Tänd i mörkt tema, släckt i ljust — ikonen namnger läget man byter *till*, precis
   som ordet gjorde när växeln var en textknapp. */
.skuld-bulb {
  display: none;
}

[data-bs-theme="light"] .skuld-bulb-off,
[data-bs-theme="dark"] .skuld-bulb-on {
  display: block;
}

/* En ikon och ingen knappruta. Dämpad som resten av navigeringens text och full styrka när
   man pekar på den, alltså samma beteende som länkarna bredvid. btn-link skulle annars ha
   gett den accentfärgen och gjort den till sidans mest framträdande sak. */
.skuld-theme-toggle {
  color: var(--bs-secondary-color);
  text-decoration: none;
  border: 0;
}

.skuld-theme-toggle:hover,
.skuld-theme-toggle:focus-visible {
  color: var(--bs-body-color);
}

html {
  position: relative;
  min-height: 100%;
}

/* ====================================================================== låst navigering

   Navigeringen står kvar överst medan sidan rullar. Sidorna är långa — Mitt schema ritar den
   pågående perioden och alla som följer, telefonlistan hela kliniken, Bemanning en periods
   månadsrutnät — och utan detta måste man rulla tillbaka till toppen för att byta skärm. */

:root {
  /* Den låsta rubrikens hela höjd: navbaren (uppmätt till 57px) plus den centimeter luft som
     flyttats in i den. Ett tal räcker för alla bredder där rubriken är låst, eftersom navbaren
     får sin höjd ur sitt innehåll i rem och html byter rotstorlek vid just 768px — samma
     3.5625rem både över och under. Allt annat som fästs nära skärmens överkant ska räkna med
     den här variabeln och aldrig med 1rem. */
  --skuld-header-h: 4.5625rem;
}

/* Selektorn är `body > header` och aldrig bara `header`. Flera sidor — Användare, Perioder,
   Mitt konto — sätter sin egen sidrubrik i ett <header>, och med en osorterad selektor blev de
   också låsta med z-index 1020. Då lade sidrubriken sig ovanpå den utfällda kontomenyn, och på
   papperet försvann sidans titel helt. Layoutens navigering är body:s direkta barn; sidornas
   rubriker ligger inne i .container > main.

   Luften ned till innehållet satt förut som mb-3 på navbaren, alltså som en marginal *utanför*
   rubrikens ruta. Under en låst rubrik hade innehållet glidit synligt förbi i den remsan, strax
   under navbarens underkant. Som utfyllnad ligger den innanför den låsta rutan i stället.
   Avståndet är detsamma som förut. */
body > header {
  padding-bottom: 1rem;
}

/* Låst först från 768px. På en telefon är höjden det knappa måttet, och en permanent list hade
   tagit en femtondel av skärmen från det man faktiskt läser.

   Sticky och inte fixed: en sticky rubrik ligger kvar i innehållsflödet, så den står stilla när
   Bootstrap lägger på padding-right på body medan en dialog är öppen. En fixed rubrik hade
   hoppat i sidled i just det ögonblicket, och sex sidor här öppnar dialoger. */
@media (min-width: 768px) {
  body > header {
    position: sticky;
    top: 0;
    /* Bootstraps egen sticky-top-nivå: över innehållet, under ryggen (1050) och dialogen (1055),
       så en modal ligger kvar ovanpå. */
    z-index: 1020;
    /* Bakgrunden *måste* sättas. Navbaren är avsiktligt utan bg-klass för att Bootstrap ska
       härleda dess färger ur data-bs-theme, och en genomskinlig list hade låtit sidan rulla
       synligt rakt igenom den. Token och aldrig en fast nyans, som överallt annars. */
    background: var(--bs-body-bg);
    /* Ingen max-height och framför allt ingen overflow här. Det stod ett skyddsnät på den här
       raden — max-height: 100dvh och overflow-y: auto, ifall navigeringen någon gång växte sig
       högre än skärmen — och det gjorde rubriken till en rullningsbehållare som klippte
       kontomenyn. Att sätta *bara* overflow-y räcker: allt utom visible får den andra axeln att
       beräknas till auto, så menyn klipptes både nedåt och åt höger.

       Nätet skyddade dessutom mot något som inte kan hända. Navigeringen är låst först från
       768px, och navbar-expand-sm har redan fällt ut den till en enda rad vid 576px — den är
       aldrig mer än en rad hög där den är låst. Under 768px är ingenting låst och sidan rullar
       som vanligt. En utfälld meny måste kunna sticka ut ur rubriken; det är hela dess uppgift. */
  }

  /* Så att ett ankarhopp eller ett scrollIntoView inte landar bakom listen. */
  html {
    scroll-padding-top: var(--skuld-header-h);
  }
}

/* Avdelare mellan navigeringens länkar. Ett hårstreck och inte tecknet "|": innehållet i ett
   pseudoelement läses upp av en del skärmläsare, och ett uppläst rörtecken mellan varje
   skärmnamn är brus. Strecket är samma tunna linje som resten av appen skiljer med, alltså
   --bs-border-color och aldrig en fast nyans.

   Bara från 576px. Det är navbar-expand-sm:s brytpunkt: under den stå länkarna staplade i den
   utfällda menyn, och ett lodrätt streck framför varje rad hade varken skilt något åt eller
   pekat åt rätt håll.

   Varje grupp skiljer för sig — de två <ul> som listen har är två uppsättningar, schemats vägar
   till vänster och administrationen till höger, och ett streck mellan dem hade sagt att de hör
   ihop. Att li:n blir flex är nödvändigt: .nav-link är display:block, så ett inline-pseudoelement
   före den hade hamnat på egen rad. */
@media (min-width: 576px) {
  .navbar-nav > .nav-item + .nav-item {
    display: flex;
    align-items: stretch;
  }

  .navbar-nav > .nav-item + .nav-item::before {
    content: "";
    width: 1px;
    background: var(--bs-border-color);
    /* Luft över och under, så strecket blir kortare än länken är hög och läser som en avdelare
       i stället för som en tabellkant. */
    margin-block: 0.45rem;
  }
}

.form-floating > .form-control-plaintext::placeholder, .form-floating > .form-control::placeholder {
  color: var(--bs-secondary-color);
  text-align: end;
}

.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder {
  text-align: start;
}

/* Dagen ligger i den pågående dragmarkeringen. Sätts av calendar.js på båda kalendrarna, så
   markeringen ser likadan ut på schemaperioden och på schemaönskemålen. Outline och inte border:
   en ram hade knuffat innehållet en pixel och fått rutnätet att skälva medan man drar. */
.day-cell.is-selecting {
  outline: 2px solid var(--bs-primary);
  outline-offset: 1px;
}


/* En omålad dag på önskemålsskärmen: samma två toner som Mitt schema ritar sina dagrutor i.
   Helgen bar tidigare .bg-body-secondary, som i ljust tema landar på nästan exakt samma
   ljushet som vardagens ton — två olika värden som såg ut som ett. --skuld-day-bg-weekend är
   samma blandning som vardagens, bara starkare, och skillnaden håller i båda temana.

   Väljaren bär .day-cell och inte bara färgklassen, och det gäller önskemålsfärgerna nedanför
   lika mycket: dagrutan är en <button>, och i läsläge — efter deadline, eller när kalendern
   bara ska läsas — är den disabled. Bootstraps .btn:disabled sätter bakgrunden och ligger ett
   steg högre i specificitet än en ensam klass, så utan det här tappade hela kalendern sina
   färger just i det läge där den enbart är till för att läsas. */
.day-cell.pref-band {
  background-color: var(--skuld-day-bg);
}

.day-cell.pref-band-weekend {
  background-color: var(--skuld-day-bg-weekend);
}

.day-cell:is(.pref-off, .pref-nocall, .pref-prefcall, .pref-parental, .pref-research, .pref-course, .pref-unavailable) {
  background-color: var(--pref-fill);
}

/* Schemaönskemålens sju typer. Bootstrap har bara fyra semantiska par som skulle passa, och de
   sju önskemålen betyder inte "fara" eller "klart" — de är kategorier.

   Nycklarna är designexportens egna --t-*, samma sex som artboarderna ritar plus Kurs, och sätts om per
   tema precis som Bemannings --stf-*: samma kulör i båda, men ljusare och mindre mättad mot en
   mörk botten. Färgerna stod tidigare på Bootstraps --bs-blue och dess syskon, alltså på fasta
   hexvärden som inte följde temat och inte hörde ihop med någon annan färg i appen. */
:root {
  --pref-off: oklch(0.52 0.135 252);
  --pref-nocall: oklch(0.60 0.130 88);
  --pref-prefcall: oklch(0.52 0.120 148);
  --pref-parental: oklch(0.56 0.105 205);
  --pref-research: oklch(0.54 0.140 345);
  --pref-course: oklch(0.52 0.130 295);
  --pref-unavailable: oklch(0.53 0.175 25);
}

[data-bs-theme="dark"] {
  --pref-off: oklch(0.74 0.105 252);
  --pref-nocall: oklch(0.80 0.115 95);
  --pref-prefcall: oklch(0.75 0.105 148);
  --pref-parental: oklch(0.79 0.090 205);
  --pref-research: oklch(0.75 0.110 345);
  --pref-course: oklch(0.74 0.110 295);
  --pref-unavailable: oklch(0.68 0.150 25);
}

/* Nyansen blandas mot --bs-body-bg och blir därför ljus i ljust tema och mörk i mörkt, av
   samma rad. */
.pref-off,
.pref-nocall,
.pref-prefcall,
.pref-parental,
.pref-research,
.pref-course,
.pref-unavailable {
  --pref-tint: var(--pref-off);
  --pref-fill: color-mix(in srgb, var(--pref-tint) 18%, var(--bs-body-bg));
  border-color: color-mix(in srgb, var(--pref-tint) 55%, transparent) !important;
  background-color: var(--pref-fill);
}

.pref-off { --pref-tint: var(--pref-off); }
.pref-nocall { --pref-tint: var(--pref-nocall); }
.pref-prefcall { --pref-tint: var(--pref-prefcall); }
.pref-parental { --pref-tint: var(--pref-parental); }
.pref-research { --pref-tint: var(--pref-research); }
.pref-course { --pref-tint: var(--pref-course); }
.pref-unavailable { --pref-tint: var(--pref-unavailable); }

/* Otillgänglig är den enda typen som inte är ett önskemål utan ett besked om att personen inte
   kan arbeta. Streckningen skiljer den från de fem andra även för den som inte ser färgskillnaden. */
.pref-unavailable {
  background-image: repeating-linear-gradient(
    45deg,
    color-mix(in srgb, var(--pref-unavailable) 22%, transparent) 0 3px,
    transparent 3px 7px);
}


/* ---- Telefonlista ---------------------------------------------------------------------- */

/* Varje avdelning är en egen tabell, och en tabell räknar ut sina kolumnbredder ur sitt eget
   innehåll. Följden var att Telefon 1 började på ett ställe i Gastro och ett annat i Thorax, och
   blicken tappade spåret vid varje rubrik. Fasta bredder ger alla grupper samma kolumnmodell, så
   sidan går att läsa som en enda lång lista. */
.phonelist-table {
  table-layout: fixed;
  width: 100%;
}

/* Med fast layout kan innehållet inte längre knuffa ut en kolumn, så det som är för långt måste
   klippas i stället. Hela texten finns kvar i title-attributet, och e-postlänken är ändå klickbar
   i sin avklippta form. */
.phonelist-table th,
.phonelist-table td {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Siffror i samma teckenbredd, så att två nummer under varandra går att jämföra kolumnvis.
   font-monospace ger det redan, men numren ska heller aldrig brytas. */
.phonelist-table td[data-label^="Telefon"] {
  font-variant-numeric: tabular-nums;
}

/* E-post (7) är två ikoner bred och inte en adress bred, så den får ett fast litet mått.
   Adresserna var kolumnen som drog mest bredd och samtidigt den som nästan alltid stod
   avklippt — en halv adress kan man ändå inte skriva av.

   Titel (3) och *i dag* (4) står i den ordningen, och det är *i dag* som tar det som blir över.
   Titlarna är korta och förutsägbara ord, medan en placering är två brickor och ibland ett
   "+2" — kolumnen som behöver luften är den som bär dagens uppgift. */
@media (min-width: 992px) {
  .phonelist-table th:nth-child(1), .phonelist-table td:nth-child(1) { width: 19%; }
  .phonelist-table th:nth-child(2), .phonelist-table td:nth-child(2) { width: 5.5rem; }
  .phonelist-table th:nth-child(3), .phonelist-table td:nth-child(3) { width: 9rem; }
  .phonelist-table th:nth-child(4), .phonelist-table td:nth-child(4) { width: auto; }
  .phonelist-table th:nth-child(5), .phonelist-table td:nth-child(5) { width: 9.5rem; }
  .phonelist-table th:nth-child(6), .phonelist-table td:nth-child(6) { width: 9.5rem; }
  .phonelist-table th:nth-child(7), .phonelist-table td:nth-child(7) { width: 4.5rem; }
}

/* I mellanbandet är Titel (3) och E-post (7) dolda. Bredderna sätts om för de fem som är kvar i
   stället för att låta de dolda spöka kvar som tomrum. Numren behåller sitt mått — det är dem man
   scannar efter — och namnet får resten.

   *I dag* står kvar hit ned. Den är färskvara och mer akut än titeln: vem som är överläkare kan
   man ta reda på när som helst, var någon står i dag bara i dag. Titeln får vika först. */
@media (min-width: 768px) and (max-width: 991.98px) {
  .phonelist-table th:nth-child(1), .phonelist-table td:nth-child(1) { width: auto; }
  .phonelist-table th:nth-child(2), .phonelist-table td:nth-child(2) { width: 5.5rem; }
  .phonelist-table th:nth-child(4), .phonelist-table td:nth-child(4) { width: 8rem; }
  .phonelist-table th:nth-child(5), .phonelist-table td:nth-child(5) { width: 10.5rem; }
  .phonelist-table th:nth-child(6), .phonelist-table td:nth-child(6) { width: 10.5rem; }
}

/* Avdelningsrubrikens linje. En grå hårstreckslinje låg för nära tabellens egna radlinjer, och
   indelningen — sidans enda — försvann i dem. Linjen är därför grövre och bär temats primärfärg
   ur variabeln, aldrig en fast nyans, så den håller i både ljust och mörkt läge. */
.phonelist-group-head {
  border-bottom: 2px solid var(--bs-primary);
}

/* Dagens placering som en liten bricka. Pass bär positionens egen färg ur --stf-N, frånvaro tonas
   ned: *Ledig* och *Jour natt* svarar på olika frågor, och den som letar efter någon att ringa ska
   se skillnaden utan att läsa. Aldrig ett fast färgvärde — samma blandning ska hålla i båda temana. */
.phonelist-chip {
  display: inline-block;
  max-width: 100%;
  padding: 0 .35rem;
  border: 1px solid color-mix(in oklab, var(--chip, var(--bs-secondary-color)) 55%, transparent);
  background: color-mix(in oklab, var(--chip, var(--bs-secondary-color)) 16%, transparent);
  border-radius: var(--bs-border-radius-sm);
  font-size: .72rem;
  line-height: 1.55;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  vertical-align: middle;
}

.phonelist-chip + .phonelist-chip { margin-left: .2rem; }

.phonelist-chip-absence {
  --chip: var(--bs-secondary-color);
  color: var(--bs-secondary-color);
}

/* Sökfältet måste kunna krympa. Med en fast min-bredd kunde det inte det, och på en smal skärm
   blev hela sidan bredare än fönstret — listan stack ut åt höger och navigeringens hamburgare
   hamnade utanför kanten. min-width:0 upphäver flex-objektens förvalda minsta storlek. */
.phonelist-search {
  flex: 1 1 10rem;
  min-width: 0;
}

@media (min-width: 576px) {
  .phonelist-search {
    flex: 0 1 18rem;
    min-width: 16rem;
  }
}

/* Ett saknat värde. Dämpat men inte osynligt: strecket säger "ingen uppgift", tomrum säger
   "något gick fel". */
.phonelist-empty {
  color: var(--bs-secondary-color);
  opacity: .6;
}

/* E-postcellen. I tabellen står två ikoner i stället för adressen — kuvertet är mailto-länken,
   det andra kopierar adressen till urklippet — eftersom adresserna var det som drog kolumnen bred
   och ändå aldrig fick plats. Ikonerna ärver textfärgen och bär ingen egen nyans. */
.phonelist-mail {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  max-width: 100%;
}

.phonelist-mail-link {
  display: inline-flex;
  align-items: center;
  gap: .4rem;
  min-width: 0;
}

.phonelist-icon {
  width: 1rem;
  height: 1rem;
  flex: none;
}

/* En knapp utan knaputseende: den bor inne i en tabellcell och ska väga lika lätt som länken
   bredvid. Bootstraps btn-klasser hade gett den en egen höjd och tryckt isär raderna. */
.phonelist-mail-copy {
  display: inline-flex;
  padding: 0;
  border: 0;
  background: none;
  color: var(--bs-secondary-color);
  line-height: 1;
}

.phonelist-mail-copy:hover,
.phonelist-mail-copy:focus-visible {
  color: var(--bs-body-color);
}

/* Kvittot sitter på knappen man just tryckte på och inte i ett meddelande någon annanstans på
   sidan: hundra rader betyder hundra möjliga klick, och frågan är alltid "tog den *den här*?". */
.phonelist-icon-done { display: none; }
.phonelist-copied { color: var(--bs-success); }
.phonelist-copied .phonelist-icon-copy { display: none; }
.phonelist-copied .phonelist-icon-done { display: inline; }

/* Adressen göms visuellt, aldrig med display:none. Den är länkens namn för en skärmläsare — ett
   ensamt kuvert hade lästs upp som "länk" och inget mer — och den går fortfarande att markera. */
.phonelist-mail-address {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}

/* Kolumnerna som får vika när bredden tryter. Titel och e-post går först, under 992px; under
   768px går Telefon 2 också. Namn, signatur, *i dag* och Telefon 1 gör det aldrig — det är de
   fyra som svarar på "vem är det, var står hon, vad ringer jag".
   Kolumnerna göms med CSS och plockas aldrig ur HTML:en, så att sökningen fortsätter träffa på
   dem även när de inte syns. Reglerna gäller bara skärmen: utskriften får alla kolumner oavsett
   hur brett fönstret råkade vara. */
@media screen and (max-width: 991.98px) {
  .phonelist .phonelist-secondary {
    display: none;
  }
}

/* Under md förblir listan en tabell och blir inga kort. Ett kort per person gjorde att en
   skärm rymde en handfull kolleger, och listan läses genom att skumma nedåt efter ett namn —
   rader gör det, kort gör det inte. Fyra kolumner får plats på en telefon om de krymps:
   signaturen är tre tecken, numret har ett känt format, och namnet tar resten och får bryta
   rad hellre än att klippas. */
@media screen and (max-width: 767.98px) {
  .phonelist .phonelist-phone2 {
    display: none;
  }

  .phonelist-table {
    font-size: .85rem;
  }

  .phonelist-table th:nth-child(1), .phonelist-table td:nth-child(1) { width: auto; }
  .phonelist-table th:nth-child(2), .phonelist-table td:nth-child(2) { width: 2.6rem; }
  .phonelist-table th:nth-child(4), .phonelist-table td:nth-child(4) { width: 5.75rem; }
  .phonelist-table th:nth-child(5), .phonelist-table td:nth-child(5) { width: 7.25rem; }

  /* Rubrikerna och namnen får bryta rad: en avklippt rubrik i en smal kolumn säger ingenting,
     och ett namn är det man letar efter. Raden blir högre i stället. */
  .phonelist-table th,
  .phonelist-table td[data-label="Namn"] {
    white-space: normal;
    overflow-wrap: anywhere;
  }

  /* Brickorna staplas i stället för att stå sida vid sida, var och en klippt till kolumnens
     bredd — två i bredd hade blivit två halva ord. */
  .phonelist-table td.phonelist-today {
    white-space: normal;
  }

  .phonelist-table .phonelist-chip {
    display: block;
    width: fit-content;
  }

  .phonelist-table .phonelist-chip + .phonelist-chip {
    margin: .15rem 0 0;
  }

  /* Numret är det man trycker på i korridoren, så hela cellens höjd är träffytan. */
  .phonelist-table td[data-label="Telefon 1"] a {
    display: block;
    padding: .3rem 0;
  }
}

/* Utskrift. Här är fasta färger befogade och inte ett brott mot temaregeln: papperet har inget
   tema, och ett mörkt tema skulle skriva ut en helsvart sida. Reglerna gäller bara i @media print. */
@media print {
  body {
    background: #fff;
    color: #000;
  }

  body > header,
  .d-print-none {
    display: none !important;
  }

  /* *I dag* följer aldrig med på papperet. Ett utskrivet blad sätts upp på en vägg och läses i
     åratal — det är därför sidan skriver ut "Utskriven <datum>" — och en kolumn som påstår
     "Jour natt" är efter en vecka inte bara inaktuell utan fel, på ett sätt läsaren omöjligt kan
     upptäcka. Datumraden är ett för svagt försvar mot en kolumn som ser så bestämd ut.
     Katalogen är beständig; dagens placering är det inte. */
  .phonelist-today {
    display: none !important;
  }

  /* En avdelning ska inte brytas mitt itu om den får plats på nästa sida. */
  .phonelist-group {
    break-inside: avoid;
  }

  /* På papper får ingenting klippas: en avklippt adress går inte att slå upp igen, till skillnad
     från på skärmen där hela texten ligger i title-attributet. Raden får bli högre i stället.
     Kolumnerna står kvar i linje, eftersom den fasta layouten gäller även här. */
  .phonelist-table th,
  .phonelist-table td {
    white-space: normal !important;
    overflow: visible !important;
    word-break: break-word;
  }

  .phonelist a {
    color: inherit;
    text-decoration: none;
  }

  /* E-post följer inte med på papperet alls. Ett kuvert på ett ark går varken att klicka på
     eller skriva av, och adressen i klartext är inget man använder från en vägg: den som ska
     mejla sitter redan vid en skärm, där listan står kvar med både länk och kopieringsknapp.
     Papperet är till för numren. Kolumnen får i stället ge sin bredd åt dem som används. */
  .phonelist-mailcol {
    display: none !important;
  }

  /* Avdelningslinjen ska synas på papper utan att kosta färgtoner: svart, som texten. */
  .phonelist-group-head {
    border-bottom-color: #000;
  }
}

/* ====================================================================== bemanning

   Rutnätet position × dag. Ingen fast färg någonstans: färgnycklarna är oklch-värden med samma
   ton i båda temana men olika ljushet, så en position behåller sin identitet när temat byts.
   Det som är bakgrund, ram eller text tas ur Bootstraps egna variabler. */

:root {
  /* Rutans höjd, och chippens ur den. Ett tal och inte två: en tom ruta ska vara exakt en chip
     hög, och skulle måtten stå för sig glider de isär vid första justeringen.
     Chippen är rutan minus dess två ramlinjer, så rutnätets täthet är densamma som förut —
     det här är en rättelse av chippens höjd, inte ett beslut om hur tätt schemat ska ritas. */
  --stf-cell-h: 1.6rem;
  --stf-chip-h: calc(var(--stf-cell-h) - 2px);

  --stf-1: oklch(0.50 0.140 250);
  --stf-2: oklch(0.52 0.130 150);
  --stf-3: oklch(0.50 0.130 300);
  --stf-4: oklch(0.55 0.150 70);
  --stf-5: oklch(0.50 0.120 190);
  --stf-6: oklch(0.52 0.150 340);
  --stf-7: oklch(0.52 0.130 110);
  --stf-8: oklch(0.52 0.160 25);
}

[data-bs-theme="dark"] {
  --stf-1: oklch(0.72 0.130 250);
  --stf-2: oklch(0.74 0.120 150);
  --stf-3: oklch(0.72 0.125 300);
  --stf-4: oklch(0.78 0.130 70);
  --stf-5: oklch(0.74 0.110 190);
  --stf-6: oklch(0.74 0.140 340);
  --stf-7: oklch(0.76 0.125 110);
  --stf-8: oklch(0.72 0.145 25);
}

/* Signaturfärgen: tolv toner som betyder *person*, aldrig rad.

   Egen skala och inte --stf-1..8, trots att en del av tonerna ligger nära varandra. Radens skala
   betyder rad på fyra skärmar, och att låta samma åtta värden betyda två saker i samma rutnät
   hade gjort ett blått chip på en blå rad till ett påstående — "de hör ihop" — som inte är sant.
   Två skalor, två meningar.

   Tolv jämnt fördelade kulörer, kroma lägre än radskalans. Hela chippet är personens — ramen i
   full styrka, fyllningen som en ton ur samma färg — och raden svarar bandet under chippet för.
   Ett tag delade de två chippet mellan sig, rad i ramen och person i fyllningen, och det var
   sämre: åtta radfärger gånger tolv persontoner blev hundra kombinationer som rutnätet fick läsas
   som par i stället för som färger. En färg per chip, och ramen och fyllningen säger samma sak.

   Styrkan i --sig-mix är satt mot ett riktigt rutnät och inte på papper. Första försöket låg på
   hälften, och tonerna lästes då som smuts på chippen i stället för som färger, vilket är precis
   det misslyckande som gör hela greppet meningslöst. Texten mättes efter varje höjning: värsta
   kontrasten mot signaturen är 10,8:1 i ljust läge och 8,6:1 i mörkt. Höjs talet vidare är det
   den siffran som ska kontrolleras om, inte hur färgen ser ut.

   Tolv toner och en avdelning på fyrtio betyder att två personer delar ton. Det betyder ingenting
   och ska inte gå att läsa som något: tonen svarar på "är de här två chippen samma person" i en
   blick, och personallistans markering svarar exakt när svaret måste vara exakt. */
:root {
  --sig-1:  oklch(0.62 0.105 20);
  --sig-2:  oklch(0.62 0.105 50);
  --sig-3:  oklch(0.62 0.105 80);
  --sig-4:  oklch(0.62 0.105 110);
  --sig-5:  oklch(0.62 0.105 140);
  --sig-6:  oklch(0.62 0.105 170);
  --sig-7:  oklch(0.62 0.105 200);
  --sig-8:  oklch(0.62 0.105 230);
  --sig-9:  oklch(0.62 0.105 260);
  --sig-10: oklch(0.62 0.105 290);
  --sig-11: oklch(0.62 0.105 320);
  --sig-12: oklch(0.62 0.105 350);

  /* Tonens täthet i chippets fyllning. Ett tal på ett ställe: fyllningen och personallistans
     prick ska aldrig kunna glida isär, och ska skalan visa sig för svag eller för stark är det
     den här raden som ändras och ingen annan. */
  --sig-mix: 30%;
}

/* Mörkt läge behåller kulörerna och lyfter ljusheten, precis som radens skala: en person ska ha
   samma färg i båda temana, inte samma siffra. */
[data-bs-theme="dark"] {
  --sig-1:  oklch(0.70 0.110 20);
  --sig-2:  oklch(0.70 0.110 50);
  --sig-3:  oklch(0.70 0.110 80);
  --sig-4:  oklch(0.70 0.110 110);
  --sig-5:  oklch(0.70 0.110 140);
  --sig-6:  oklch(0.70 0.110 170);
  --sig-7:  oklch(0.70 0.110 200);
  --sig-8:  oklch(0.70 0.110 230);
  --sig-9:  oklch(0.70 0.110 260);
  --sig-10: oklch(0.70 0.110 290);
  --sig-11: oklch(0.70 0.110 320);
  --sig-12: oklch(0.70 0.110 350);

  --sig-mix: 34%;
}

.stf-row {
  display: grid;
  /* Springan mellan dagarna. Den fanns förut också, men syntes inte förrän dagarna fick sitt
     eget band: nu är det den som skiljer banden åt. */
  gap: 4px;
  align-items: stretch;
}

.stf-weekdays {
  font-size: .6rem;
  letter-spacing: .12em;
  padding-bottom: .15rem;
}

.stf-week {
  border-top: 1px solid var(--bs-border-color);
  padding: .25rem 0 .4rem;
}

.stf-weekno {
  font-size: 1.95rem;
  font-weight: 700;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* Namnet på egen rad överst, dagnumret till vänster under det och täckningen till höger: därför
   en rad som får radbrytas, och inte en kolumn. */
.stf-daynum {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  /* Rutan sträcks av veckonumret bredvid, som är mycket större. Innehållet läggs därför nedtill:
     annars hänger dagsiffran kvar i överkanten med luft ned till sin egen dag. */
  align-content: flex-end;
  line-height: 1;
  /* Ingen luft under: dagrubriken ska sitta an mot första positionsraden, annars svävar siffran
     mitt emellan sin egen dag och veckan ovanför. */
  padding: .1rem 0 0;
  border-radius: var(--bs-border-radius-sm);
  font-variant-numeric: tabular-nums;
}

.stf-daynum-n {
  font-size: 1.275rem;
  line-height: 1;
  padding-left: 10px;
}

/* Täckningen X/Y bredvid dagnumret: hur många av avdelningens egna som är inlagda. Grön när alla
   är inlagda, röd annars — emphasis-tonerna och inte de solida, eftersom siffran står som text
   direkt på dagrutans egen bakgrund och den bakgrunden byter färg med tema och helgdag. */
.stf-daycount {
  font-size: .6rem;
  line-height: 1.1;
  font-variant-numeric: tabular-nums;
  margin-left: auto;
  padding-right: 10px;
}

.stf-daycount-full { color: var(--bs-success-text-emphasis); }
.stf-daycount-short { color: var(--bs-danger-text-emphasis); }

/* Namnet på den viktiga dagen, inte en typkod: färgen säger redan vilket slag det är, så rutan
   får säga "Julafton" i stället för "röd". Två rader, resten i title-attributet. Står överst i
   rutan, så att dagsiffrorna ligger i linje tvärs veckan. */
.stf-daynum-name {
  font-size: .55rem;
  line-height: 1.15;
  text-align: center;
  flex: 0 0 100%;
  max-width: 100%;
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}

/* Dagnumrets egen textfärg. Bandet bakom den sätts längre ned, tillsammans med de andra
   bandvärdena: --stf-band är en och samma variabel på samma element, så det är ordningen i
   filen som avgör vem som skriver den, och alla som skriver den måste därför stå samlade. */
.stf-weekend { color: var(--bs-secondary-color); }
.stf-holiday { color: var(--bs-danger-text-emphasis); }
.stf-other   { color: var(--bs-warning-text-emphasis); }

.stf-label {
  display: flex;
  align-items: center;
  align-self: start;
  min-height: var(--stf-cell-h);
  gap: .35rem;
  width: 100%;
  min-width: 0;
  padding: 0 .35rem;
  border: 1px solid transparent;
  border-radius: var(--bs-border-radius-sm);
  background: none;
  color: inherit;
  font-size: .78rem;
  text-align: left;
}

.stf-label:hover { border-color: var(--bs-border-color); }

/* Flyttpilarna i kolumnen framför radens namn. Två lika breda platser, även där en pil saknas,
   så att pilarna står i lod rad för rad. */
.stf-move {
  display: grid;
  grid-template-columns: 1fr 1fr;
  align-self: start;
  min-height: var(--stf-cell-h);
}

.stf-move-btn {
  padding: 0;
  border: 1px solid transparent;
  border-radius: var(--bs-border-radius-sm);
  background: none;
  color: var(--bs-secondary-color);
  font-size: .8rem;
  line-height: 1;
}

.stf-move-btn:hover:not(:disabled) {
  border-color: var(--bs-border-color);
  color: var(--bs-body-color);
}

.stf-move-btn:disabled { opacity: .4; }

.stf-label-text {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.stf-kind {
  flex: none;
  font-size: .55rem;
  text-transform: uppercase;
  letter-spacing: .08em;
  color: var(--bs-secondary-color);
}

.stf-dot {
  display: inline-block;
  width: .5rem;
  height: .5rem;
  border-radius: 50%;
  flex: none;
}

/* Positionens färg bär hela raden som ett svagt tonat band, så att en rad går att följa tvärs över
   veckan utan att leta reda på namnet i vänsterkanten. Tonen blandas ur --lane, som skriptet sätter
   per rad — aldrig ett fast värde, eftersom samma blandning ska fungera mot både ljus och mörk
   bakgrund. Banden skiljs åt av en marginal och inte av linjer: en kraftig linje över och under
   varje rad blev till ränder som drog blicken till sig mer än bemanningen gjorde. */
.stf-lane {
  --lane: var(--stf-1);
  background: color-mix(in oklab, var(--lane) 13%, transparent);
  padding: 2px 0;
  margin-bottom: 3px;
}

/* Dagen som ett lodrätt band. Rutorna bär en svag ton av sidans motsatsfärg — ljusare i mörkt
   tema, mörkare i ljust, utan att någon fast färg skrivs — så att veckans sju dagar går att följa
   uppifrån och ned. Tonen är genomskinlig och lägger sig *över* radens färgband i stället för att
   dölja det: bandet syns fortfarande hela vägen, vilket var skälet till att rutorna en gång var
   helt genomskinliga. Springan mellan dagarna är rutnätets egen gap, som färgen nu gör synlig. */
.stf-daynum,
.stf-cell {
  --stf-band: color-mix(in oklab, var(--bs-emphasis-color) 8%, transparent);
  background-color: var(--stf-band);
}

/* Helgen och de röda dagarna: samma band, en nyans mörkare, hela kolumnen ned. En vecka läses
   lika ofta som en form som som en rad rutor — man letar efter var helgen tar vid — och det
   svaret ska synas utan att man läser veckodagsraden överst. Tonen är fortfarande sidans
   motsatsfärg och ingen fast nyans, så den fungerar i båda temana.

   Det röda dagnumret behåller sin egen färg: kolumnen säger "ledig dag", numret säger *vilken*
   dag, och det är två upplysningar. Andra markerade dagar (klämdagar och liknande) får inget
   mörkare band — de är arbetsdagar, och bandet betyder att dagen inte är det. */
.stf-rest { --stf-band: color-mix(in oklab, var(--bs-emphasis-color) 16%, transparent); }

/* Dagrubriken för en markerad dag får sitt band ur dagens eget slag i stället: rött för en röd
   dag, gult för en klämdag eller annan märkt dag — samma två färger som namnet under redan bär,
   så att rubriken säger vilket slag av dag det är innan man läst namnet.

   Står efter .stf-daynum och .stf-rest, och det är hela poängen. De tre reglerna skriver samma
   variabel på samma element med samma specificitet, så den sista vinner. Tidigare stod de här
   två före, och en röd dag fick därför det vanliga grå bandet — rubriken blev *ljusare* än
   kolumnen under sig, som ju fick vilodagens mörkare ton.

   Tonen blandas mot transparent, som de andra banden, och inte mot --bs-danger-bg-subtle: en
   fylld subtil färg hade lagt sig som en platta över rutan, och det som efterfrågades är en
   antydan. Samma vikt som vilodagens band, så att en röd dag och en söndag väger lika. */
.stf-holiday { --stf-band: color-mix(in oklab, var(--bs-danger) 16%, transparent); }
.stf-other   { --stf-band: color-mix(in oklab, var(--bs-warning) 16%, transparent); }

.stf-cell {
  min-height: var(--stf-cell-h);
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  gap: 2px;
  padding: 0px;
  border: 1px solid var(--bs-border-color-translucent);
  border-radius: var(--bs-border-radius-sm);
}

.stf-cell[data-date] { cursor: pointer; }
.stf-cell[data-date]:hover { border-color: var(--bs-primary-border-subtle); }
.stf-cell:focus-visible { outline: 2px solid var(--bs-focus-ring-color); outline-offset: 1px; }

/* Dagar utanför perioden, och dagar raden inte går. Den senare är inte tom utan *stängd* — den
   ska gå att skilja från ett hål i bemanningen på en halv sekunds titt. */
.stf-out { border-color: transparent; background: none; }


/* Stängd ruta: bara strecken skrivs, inte bakgrunden. Skrevs bakgrunden som en shorthand här
   nollades dagens band, och just på helgen — där nästan varje rad är stängd — hade bandet då
   saknats i hela kolumnen utom på den rad som råkade gå. */
.stf-off {
  border-color: transparent;
  background-image: repeating-linear-gradient(
    135deg,
    var(--bs-tertiary-bg) 0 3px,
    transparent 3px 6px);
}

.stf-unfilled { border-style: dashed; border-color: var(--bs-warning-border-subtle); }

/* Ofördelad dag på en egen delad rad: raden är delad men ingen avdelning är utpekad. En annan
   lucka än *ej tillsatt*, med en annan ägare och en annan åtgärd — därför en prickad ram och inte
   en streckad, så att de två går att skilja åt på avstånd i samma rutnät. Se docs/adr/0009. */
.stf-unallocated { border-style: dotted; border-color: var(--bs-info-border-subtle); }

/* Låst ruta på en lånad rad: någon av vår personal står här, men en annan avdelning håller dagens
   passansvar och det är deras att ändra. Rutan visar, den öppnar ingenting — markören säger det
   innan klicket gör det. Ingen egen bakgrund: bandet och helgtonen ska synas igenom, precis som i
   den stängda rutan ovanför. */
.stf-locked {
  cursor: not-allowed;
  border-style: dashed;
  border-color: var(--bs-border-color);
}

/* Ägarens kortnamn framför en lånad rads namn: "Akut · Jour natt". Dämpat, eftersom radens namn
   är det man läser och avdelningen bara svarar på vems raden är. */
.stf-owner {
  flex: none;
  font-size: .6rem;
  text-transform: uppercase;
  letter-spacing: .06em;
  color: var(--bs-secondary-color);
}

/* Den ansvariga avdelningen i en tom ruta — ingen står här ännu, men någon ska se till att någon
   gör det. Formen är chippets, tonen är inte: det är ingen person. */
.stf-holder {
  display: flex;
  align-items: center;
  flex: 0 0 auto;
  height: var(--stf-chip-h);
  padding: 0 .25rem;
  border: 1px dashed var(--bs-border-color);
  border-radius: var(--bs-border-radius-sm);
  background: var(--bs-tertiary-bg);
  color: var(--bs-secondary-color);
  font-size: .6rem;
  text-transform: uppercase;
  letter-spacing: .06em;
  white-space: nowrap;
}

/* Samma uppgift inne i ett chip, där någon *står*: "Thorax · SNI". Signaturen ensam säger inte
   vems åtagande som infriats, och avdelningen ensam låter inte ägaren ringa någon klockan 22 —
   så båda, i samma chip. Samma grepp som konferenschippets kortkod intill signaturen. */
.stf-holder-inline {
  flex: none;
  max-width: 45%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--bs-secondary-color);
  font-size: .58rem;
  text-transform: uppercase;
  letter-spacing: .04em;
}

.stf-holder-inline::after {
  content: "·";
  margin: 0 .1rem 0 .15rem;
}

.stf-cell.is-selecting {
  border-color: var(--bs-primary);
  background: var(--bs-primary-bg-subtle);
}

/* Egen ogenomskinlig botten: en chip ska läsas mot sidans färg, inte mot radens ton.

   Chippen har en *fast* höjd och växer inte med rutan. Att låta den fylla höjden (flex: 1 0 auto)
   var ett tidigare försök att slippa en låg chip högt upp i en hög ruta, men det gjorde chippens
   höjd till en upplysning om hur många andra som står samma dag — och samma persons pass blev
   olika högt på tisdag och onsdag beroende på vem mer som råkade vara inne. Ett pass är ett pass.
   Rutan får variera; chippen är måttet.

   Att det inte ser snett ut i det vanliga fallet sköts av cellens min-height, som är exakt en chip:
   en rad där varje dag har en person sluter tätt, och luft uppstår bara i rutor som faktiskt har
   färre personer än veckans tyngsta dag. Där är luften information. */
.stf-chip {
  display: flex;
  align-items: center;
  flex: 0 0 auto;
  height: var(--stf-chip-h);
  gap: 2px;
  padding: 0 .2rem;
  border: 1px solid;
  background: var(--bs-body-bg);
  /* Egen textfärg, av samma skäl som egen botten. Ett chip som ärver texten står bra i rutnätet,
     där texten omkring är brödtext, men inte inuti en knapp: tilldelningsdialogens rad blir
     fylld med vit text under pekaren, och chippet stod då med vit text på sin egen ljusa botten
     — oläsligt i ljust tema, osynligt som fel i mörkt. Botten och text hör ihop och sätts ihop. */
  color: var(--bs-body-color);
  border-radius: var(--bs-border-radius-sm);
  font-size: .68rem;
  line-height: 1.35;
  min-width: 0;
}

/* Signaturfärgen i fyllningen. Blandningen går mot --bs-body-bg och inte mot transparent, så att
   stycket ovan fortfarande gäller: chippet är ogenomskinligt och läses mot sidans färg. En tonad
   genomskinlighet hade gjort samma persons chip till en färg på tisdag och en annan på lördag,
   eftersom dagbandet ligger under — och till en tredje på händelseraden.

   Två undantag, båda för att fyllningen då säger något annat än vem som står i passet. Ett
   inställt pass behåller personen i ramen — det är fortfarande hens pass — men tappar fyllningen,
   för att fyllningen är närvaron och den är struken. En krock äger redan fyllningen med sin egen
   varningston, och den tonen är det viktigaste som finns i rutnätet — den får inte vika för en
   igenkänningsfärg. Undantagen skrivs som :not() och inte som senare regler, eftersom den här
   selektorn väger tyngre än en ensam klass och annars hade vunnit över båda.

   Ingen ton utan signatur: skriptet sätter klassen bara när tilldelningen har en, och chippet
   faller då tillbaka på regeln ovan med radens färg i ramen. Ett otonat chip i ett tonat rutnät
   säger "här fattas något", vilket är sant.
   Se docs/adr/0010-en-signaturfarg-pekar-ut-en-person.md. */
.stf-chip.stf-tinted:not(.stf-cancelled):not(.stf-conflict) {
  background: color-mix(in oklab, var(--sig) var(--sig-mix), var(--bs-body-bg));
}

/* Signaturen står i chippens högerkant och något större än chippens övriga text. Rutnätet läses
   nedåt lika ofta som i sidled — samma dag, rad efter rad — och en högerställd signatur ger den
   läsningen en rak kant att följa i stället för en ojämn vänsterkant som varierar med chippens
   bredd. Storleken är signaturens ensam och inte chippens: signaturen är det enda i chippet man
   faktiskt läser, medan kommentarsmarkeringen bara ska synas.

   Händelsechippet bär en titel och inte en signatur, och behåller vänsterställd text — en titel
   läses från sitt första tecken. */
.stf-sig {
  flex: 1 1 auto;
  text-align: right;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-family: var(--bs-font-monospace);
  font-size: .74rem;
}

/* Kommentarsmarkeringen flyttar till vänster om signaturen, så att högerkanten står still också
   på ett pass som har en kommentar. */
.stf-note { order: -1; font-size: .6rem; opacity: .7; }

/* Dagsdelen — FM eller EM — står till vänster om signaturen, som kommentarsmarkeringen, så att
   chippets högerkant står still vare sig passet är en halv dag eller inte. Mindre och dovare än
   signaturen: den säger *när på dagen*, och den som söker ett namn ska inte behöva läsa förbi
   den. Heldagen skriver inget märke alls, vilket är varför märket får synas när det finns.

   Text och ingen egen färg: appen körs i både ljust och mörkt läge, och en halvdag som bara var
   en nyans hade varit borta i det ena. */
.stf-daypart {
  order: -1;
  font-size: .58rem;
  font-weight: 600;
  letter-spacing: .02em;
  opacity: .75;
}

/* Ett inställt pass stryks över men står kvar: det säger att dagen var täckt och nu inte är det,
   vilket en borttagen rad inte kan säga. */
.stf-cancelled { text-decoration: line-through; opacity: .55; }

/* Den tomma tilldelningen: dagen är inställd och ingen var lagd på den. Ordet och inte ett namn,
   så inget överstruket — ett struket "Inställt" läses som att inställningen är hävd. Streckad ram
   i radens färg: chippet hör till raden, inte till en person. */
.stf-chip-calledoff { border-style: dashed; opacity: .7; font-style: italic; }

.stf-hit { box-shadow: 0 0 0 2px var(--bs-primary); }

/* Chippen i tilldelningsdialogens personallista: var personen redan står den valda dagen. Samma
   form som rutnätets chip, med *radens* färg i ramen och som en ton i fyllningen — de syftar på
   en rad som finns två tum bort i rutnätet bakom dialogen, och radens band där har samma ton.
   Igenkänningen är deras uppgift. Fyllningen kom till för läsbarhetens skull: en tunn ram ensam
   bar inte färgen i ljust tema, och chippet lästes som en tom ruta med grå text. Tonen blandas
   mot sidans botten, så chippet förblir ogenomskinligt och texten mörk på ljust, ljus på mörkt.
   --chip sätts inline av staffing.js bredvid ramfärgen; utan den (utlån, +N) blir botten sidans.

   Önskemålsrutan bredvid är en kvadrat med en bokstav i stället, eftersom den syftar på något
   helt annat: ett pass man är inlagd på och en önskan man framfört är två slags fakta och ska
   inte vara samma form.

   Måtten är läsbarhetens och inte rutnätets: chippet sitter i en knapp som är dubbelt så hög
   som en cell, och en text på .62rem lämnade knappen halvtom och koden svår att läsa i den
   takt man klickar sig igenom en lista. */
.stf-chip-placed {
  background: color-mix(in oklab, var(--chip, var(--bs-body-bg)) 24%, var(--bs-body-bg));
  height: auto;
  padding: .1rem .35rem;
  font-size: .72rem;
  max-width: 7rem;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  display: inline-block;
  flex: 0 0 auto;
}

/* Radens chip som dialogens rubrik. Samma form som rutnätets chip och samma färg på ramen —
   dialogen öppnades från en markering i rutnätet, och rubriken ska läsas som just den raden.
   Större än i rutnätet, eftersom den här är en rubrik och inte en markering i en cell, och
   genomskinlig i stället för sidans botten: den sitter på dialogens egen yta. */
.stf-chip-title {
  height: auto;
  padding: .15rem .55rem;
  background: transparent;
  font-size: 1rem;
  font-weight: 600;
}

/* Utlån till en annan avdelning, och +N. Neutral ram: färgerna här betyder "en rad i det här
   rutnätet", och en Thorax-rad målad i Gastros palett hade gjort två obesläktade rader till
   samma. Samma val som händelsechippet redan gör. */
.stf-chip-elsewhere {
  border-color: var(--bs-border-color);
  color: var(--bs-secondary-color);
}

/* Önskemålsrutan längst till höger i raden. Fast kvadrat, så att listans högerkant står still
   hela vägen ned — en trasig kant är vad som gör en lista långsam att löpa nedför.

   Tonen blandas ur --pref-tint, samma variabel som önskemålsskärmen, men tätare än .pref-*:
   deras 18 % är avvägd för en dagruta i en månadskalender, och på en kvadrat av det här slaget
   blir samma blandning en grå fläck. Nyansen är löftet som hålls, inte styrkan. */
.stf-prefmark {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.45rem;
  height: 1.45rem;
  border: 1px solid var(--bs-border-color);
  border-radius: var(--bs-border-radius-sm);
  font-size: .74rem;
  line-height: 1;
  font-weight: 600;
}

/* Ingen färgklass alls = inga önskemål: bara konturen står kvar. En färgad ruta här hade tävlat
   om uppmärksamheten med de som betyder något. */
.stf-prefmark.pref-off,
.stf-prefmark.pref-nocall,
.stf-prefmark.pref-prefcall,
.stf-prefmark.pref-parental,
.stf-prefmark.pref-research,
.stf-prefmark.pref-course,
.stf-prefmark.pref-unavailable {
  /* Bara fyllningen skrivs om. Ramen sätter .pref-* med !important och den kan inte överskrivas
     härifrån — vilket är lika bra, för 55 % av nyansen är fullt synligt på den här ytan. */
  background-color: color-mix(in srgb, var(--pref-tint) 38%, var(--bs-body-bg));
  color: var(--bs-body-color);
}

/* Får inte läsas — inte samma sak som inga önskemål. Servern skiljer på de två svaren, och en
   tom kontur på båda hade fått skärmen att påstå att någon inte bett om något när sanningen är
   att det inte är ens att se. */
.stf-prefmark-locked {
  border-style: dashed;
  opacity: .65;
}

/* En konflikt: personen är frånvarande och gör samtidigt något annat. Markeringen sitter på
   *chippen* och inte på cellen, eftersom krocken är ett faktum om personen och dagen — raden är
   oskyldig, och personens andra chip en bit ned bär andra halvan av samma historia. Ramfärgen
   sätts inline per rad i staffing.js och byts där; här står bakgrunden och texten. Tokens och
   ingen fast nyans: rutnätet ritas lika ofta mörkt som ljust. */
.stf-conflict {
  background: var(--bs-danger-bg-subtle);
  color: var(--bs-danger-text-emphasis);
}

/* Raden Händelser. Den har ingen position bakom sig och därför ingen färgnyckel — bandet är
   avsiktligt neutralt och inte en nionde ton, eftersom en lånad passfärg hade fått raden att läsa
   som ännu en position. Ingen dag på den ritas heller stängd: ett möte på en lördag är ovanligt,
   inte omöjligt. Se docs/adr/0003-events-are-not-positions.md. */
.stf-lane-events {
  background: var(--bs-tertiary-bg);
}

/* Grupprubrik i rutnätet — i dag bara Konferenser. Ingen position bakom sig, så inget band och
   ingen färg: en etikett och en linje som säger var gruppen börjar. Höjden är avsiktligt liten,
   den upprepas i varje veckoblock. */
.stf-group {
  align-items: center;
  margin-top: .25rem;
}

.stf-group-label {
  font-size: .6rem;
  text-transform: uppercase;
  letter-spacing: .08em;
  color: var(--bs-secondary-color);
  padding: 0 .35rem;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.stf-group-rule {
  border-top: 1px solid var(--bs-border-color);
  align-self: center;
}

/* Titeln och inte klockslaget. Rutan är en chip bred, och tiden hade vunnit utrymmeskampen mot
   titeln varje gång — men det är titeln som säger vad saken är. Tid och beskrivning ligger i
   verktygstipset. */
.stf-chip-event {
  border-color: var(--bs-border-color);
  color: var(--bs-body-color);
}

.stf-chip-event .stf-sig { font-family: inherit; text-align: left; }

/* Signaturkolumnen i tilldelningsdialogens lista. Fast bredd, så att den och namnen efter den
   står i var sin rak kolumn: signaturen är tre tecken för alla, och det enda som kan göra
   kolumnen ojämn är att låta den flyta efter namnet. */
.stf-choice-sig {
  flex: 0 0 2.4rem;
  font-family: var(--bs-font-monospace);
  font-size: .78rem;
  color: var(--bs-secondary-color);
}

/* Raden i tilldelningsdialogen är en grå konturknapp, men namnet i den är det man läser fyrtio
   gånger i rad och får brödtextens färg i stället för knappens grå. Under pekaren fylls knappen
   och texten blir ljus; signaturen måste då följa med, annars står den dov mot den fyllda ytan
   — mörkt på mörkt i ljust tema. */
.stf-choice { --bs-btn-color: var(--bs-body-color); }

.stf-choice:hover > .stf-choice-sig,
.stf-choice:active > .stf-choice-sig { color: inherit; }

.stf-person {
  display: flex;
  align-items: center;
  gap: .4rem;
  width: 100%;
  padding: .15rem .3rem;
  border: 1px solid transparent;
  border-radius: var(--bs-border-radius-sm);
  background: none;
  color: inherit;
  font-size: .82rem;
  text-align: left;
}

/* Personens signaturfärg som en prick framför namnet. Det här är rutnätets teckenförklaring, och
   den kostar ingen egen ruta på skärmen: listan står redan där och räknar redan upp varenda
   person. Pricken är fylld med full ton och inte med chippets blandning — den ska gå att para
   ihop med ett chip på en meters håll, medan chippet ska gå att läsa text i.

   Den som saknar signatur får ingen prick, utan det tomrum som pricken annars upptar: raderna i
   listan ska ha samma vänsterkant vare sig personen har en ton eller inte. */
.stf-person-dot {
  flex: 0 0 auto;
  width: .55rem;
  height: .55rem;
  border-radius: 50%;
  background: var(--sig, transparent);
}

.stf-person:hover { border-color: var(--bs-border-color); }
.stf-person-on { background: var(--bs-primary-bg-subtle); border-color: var(--bs-primary-border-subtle); }

.stf-swatch {
  width: 1.5rem;
  height: 1.5rem;
  border: 2px solid transparent;
  border-radius: var(--bs-border-radius-sm);
  padding: 0;
}

.stf-swatch-on { border-color: var(--bs-body-color); }

@media (min-width: 992px) {
  /* Under den låsta navigeringen, inte bakom den. */
  .stf-rail { position: sticky; top: var(--skuld-header-h); }
}

/* Avdelningsrubrik i tilldelningsdialogen. Den egna avdelningen står utfälld, de andra hopfällda
   ett klick bort — man bemannar med sin egen personal och lånar in någon annans undantagsvis. */
.stf-group {
  display: flex;
  align-items: center;
  gap: .4rem;
  width: 100%;
  margin-top: .35rem;
  padding: .25rem .3rem;
  border: 1px solid transparent;
  border-radius: var(--bs-border-radius-sm);
  background: none;
  color: inherit;
  font-size: .7rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  text-align: left;
}

.stf-group:hover { border-color: var(--bs-border-color); }
.stf-group-open { color: var(--bs-emphasis-color); }

.stf-chevron {
  flex: none;
  width: .8rem;
  text-align: center;
  color: var(--bs-primary);
}

/* ---- Meddelanden (spaltens tredje avsnitt) ------------------------------------------------ */

.stf-errand {
  padding: .5rem .55rem;
  font-size: .8rem;
}

.stf-errand + .stf-errand { border-top: 1px solid var(--bs-border-color); }

.stf-errand-head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: .4rem;
  font-weight: 600;
}

.stf-errand-status {
  flex: none;
  font-size: .6rem;
  letter-spacing: .1em;
  text-transform: uppercase;
  font-weight: 400;
  color: var(--bs-secondary-color);
}

.stf-errand-new { color: var(--bs-primary); }

.stf-errand-sub {
  font-size: .72rem;
  color: var(--bs-secondary-color);
}

.stf-errand-body {
  margin: .3rem 0 0;
  overflow-wrap: anywhere;
}

.stf-errand-reply {
  margin-top: .45rem;
  padding: .4rem .5rem;
  border-left: 2px solid var(--bs-success);
  background: var(--bs-tertiary-bg);
  overflow-wrap: anywhere;
}

.stf-errand-from {
  font-size: .6rem;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--bs-secondary-color);
}

/* Passraden på ett ärendekort, i båda rälsen: chip med lanens namn, dagen efter det, och FM/EM
   sist. Tre skilda fakta som avskriften också lagrar var för sig — märket är text och inte färg,
   som överallt annars, och heldagen skriver inget märke alls. */

.stf-errand-subject,
.mys-errand-subject {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: .3rem;
  margin-top: .15rem;
}

.stf-errand-chip,
.mys-errand-chip {
  max-width: 100%;
  padding: 0 .3rem;
  border: 1px solid var(--bs-border-color);
  background: var(--bs-tertiary-bg);
  border-radius: var(--bs-border-radius-sm);
  font-size: .7rem;
  line-height: 1.5;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.stf-errand-daypart,
.mys-errand-daypart {
  font-size: .58rem;
  font-weight: 600;
  opacity: .8;
}

/* Åtgärdade ärenden ligger hopfällda i en hög längst ned i rälsen. Avdelaren säger var högen
   börjar, och raden är hela kortet tills någon fäller ut det. */

.stf-errand-divider {
  display: flex;
  align-items: center;
  gap: .5rem;
  margin: .6rem 0 .1rem;
  font-size: .6rem;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--bs-secondary-color);
}

.stf-errand-divider::after {
  content: "";
  flex: 1;
  border-top: 1px solid var(--bs-border-color);
}

/* Avdelaren bär själv linjen mellan det obesvarade och högen; kortet under den ska inte rita en
   till ovanpå den. */
.stf-errand-divider + .stf-errand { border-top: 0; }

.stf-errand-toggle {
  display: flex;
  align-items: baseline;
  gap: .4rem;
  width: 100%;
  padding: 0;
  border: 0;
  background: none;
  color: inherit;
  font: inherit;
  font-weight: 600;
  text-align: left;
}

.stf-errand-toggle::before {
  content: "B8";
  flex: none;
  font-size: .7em;
  color: var(--bs-secondary-color);
}

.stf-errand-toggle[aria-expanded="true"]::before { content: "BE"; }

.stf-errand-compact {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Ett hopfällt kort ska vara tyst bredvid de obesvarade — det är gjort, inte nytt. */
.stf-errand-handled .stf-errand-toggle { font-weight: 500; }

.stf-errand-handled .stf-errand-compact { color: var(--bs-secondary-color); }

.stf-errand-handled .stf-errand-toggle:hover .stf-errand-compact { color: var(--bs-body-color); }

/* ---- Önskemålskalendern (Bemanning och Mitt konto) --------------------------------------- */

/* Månaderna sida vid sida så länge de får plats, annars under varandra. Ett auto-fit-rutnät och
   inte flex: månadsrutnäten har inga egna bredder, så som flexbarn hade de krympt till sitt
   innehåll och kolumnerna slutat vara lika breda mellan månaderna. */
#prefs-calendar,
#history-calendar {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
  gap: 1rem;
}

/* Dagrutan är läsläge — ingen knapp, inget klick. Önskemålet är personens eget påstående och
   ändras bara på önskemålsskärmen, av personen själv. */
.pref-day {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 1.5rem;
  border: 1px solid var(--bs-border-color-translucent);
  border-radius: var(--bs-border-radius-sm);
  font-size: .7rem;
  font-family: var(--bs-font-monospace);
}

/* Redan inlagt i schemat. En ring och inte en färg till: dagen bär redan önskemålets färg, och
   den upplysningen ska inte behöva konkurrera med den. */
.stf-pref-done {
  box-shadow: inset 0 0 0 2px var(--bs-success);
}

/* ====================================================================== mitt schema

   Startsidans personliga schema. Ingen fast färg: passen bär positionens --stf-N, som är
   samma variabler Bemanning använder, så en rad har samma identitet på båda skärmarna.
   Frånvaro tonas ned i stället för att färgas — *Ledig* och *Jour natt* svarar på olika
   frågor, och en ledig dag ska inte se ut som arbete. Samma val som telefonlistan gjorde. */

.mys {
  display: flex;
  flex-direction: column;
  gap: 1.5rem;

  /* Dagrutan ligger ett steg *ifrån* sidans botten och aldrig på en fast nyans; tonerna står
     högst upp i filen som --skuld-day-bg, eftersom önskemålskalendern ritar samma dagar och
     ska göra det likadant. Rutan blir en yta man ser kanten på även där ramen är svag, medan
     helgen och de röda dagarna får samma blandning starkare och behåller sitt försprång. */
  --mys-cell-bg: var(--skuld-day-bg);
  --mys-cell-bg-weekend: var(--skuld-day-bg-weekend);
}

/* Spalten står först i HTML:en och flyttas till höger först när det finns bredd för den.
   Ordningen i dokumentet är den man vill ha uppläst och den man vill ha på en telefon:
   det som brådskar först, schemat sedan. */
@media (min-width: 992px) {
  .mys {
    flex-direction: row-reverse;
    align-items: flex-start;
    gap: 2rem;
  }

  .mys-rail {
    position: sticky;
    top: var(--skuld-header-h);
    flex: 0 0 14rem;
  }

  .mys-main {
    flex: 1 1 auto;
    min-width: 0;
  }
}

.mys-rail-heading {
  font-size: .68rem;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--bs-secondary-color);
  margin: 1.25rem 0 .5rem;
}

.mys-tally {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: .15rem .75rem;
  margin: 0;
  font-size: .85rem;
}

.mys-tally dt {
  font-weight: 400;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.mys-tally dd {
  margin: 0;
  text-align: right;
  font-variant-numeric: tabular-nums;
}

.mys-tally-total {
  margin-top: .5rem;
  padding-top: .5rem;
  border-top: 1px solid var(--bs-border-color);
  color: var(--bs-secondary-color);
}

.mys-dot {
  display: inline-block;
  width: .5rem;
  height: .5rem;
  margin-right: .4rem;
  border-radius: 50%;
  background: var(--lane, var(--bs-secondary-color));
  vertical-align: middle;
}

.mys-dot-absence {
  background: none;
  border: 1px solid var(--bs-secondary-color);
}

.mys-rail-span {
  display: block;
  letter-spacing: 0;
  text-transform: none;
  font-size: .78rem;
}

/* ---------------------------------------------------------------- Mina ärenden

   Spaltens tredje avsnitt: de egna frågorna till schemaläggaren, och svaren. Kortet är avsiktligt
   magert — spalten är 14rem bred och delar plats med önskemålspåminnelsen och två räkningar, så
   allt utom rubrik, text och en knapp får stå tillbaka. */

.mys-errand {
  border: 1px solid var(--bs-border-color);
  padding: .5rem .6rem;
  margin-bottom: .5rem;
  font-size: .8rem;
}

.mys-errand-head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: .4rem;
  font-weight: 600;
}

/* Status som ord och inte som färgad platta: kortet är litet, och en plätt till hade tävlat med
   passets egen färg i rutnätet bredvid. */
.mys-errand-status {
  flex: none;
  font-size: .6rem;
  letter-spacing: .1em;
  text-transform: uppercase;
  font-weight: 400;
  color: var(--bs-secondary-color);
}

.mys-errand-done { color: var(--bs-success); }

.mys-errand-sub {
  font-size: .72rem;
  color: var(--bs-secondary-color);
}

.mys-errand-body {
  margin: .3rem 0;
  overflow-wrap: anywhere;
}

.mys-errand-reply {
  margin: .45rem 0;
  padding: .4rem .5rem;
  border-left: 2px solid var(--bs-success);
  background: var(--bs-tertiary-bg);
  overflow-wrap: anywhere;
}

.mys-errand-from {
  font-size: .6rem;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--bs-secondary-color);
}

.mys-errand form { margin-top: .45rem; }

.mys-errand-empty {
  font-size: .8rem;
  color: var(--bs-secondary-color);
}

.mys-errand-toast {
  padding: .4rem .5rem;
  border-left: 2px solid var(--bs-primary);
  background: var(--bs-tertiary-bg);
  font-size: .8rem;
}

.mys-errand-warn {
  padding: .4rem .5rem;
  border-left: 2px solid var(--bs-warning);
  background: var(--bs-warning-bg-subtle);
}

.mys-errand-new { margin-top: 1rem; }

.mys-errand-label {
  display: block;
  font-size: .68rem;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--bs-secondary-color);
  margin-bottom: .25rem;
}

/* ---------------------------------------------------------------- rutnätet */

/* Perioden är avsnittet, månaden underavdelningen. Namnet står som en tydlig rubrik och inte
   bara som en rad text: sidan är ett sammanhängande schema över flera perioder, och gränsen
   där radordförrådet och färgerna byts måste synas utan att man letar. */
.mys-period + .mys-period { margin-top: 2.5rem; }

.mys-period-name {
  font-size: 1.05rem;
  font-weight: 600;
  margin: 0 0 1rem;
  padding-bottom: .35rem;
  border-bottom: 2px solid var(--bs-border-color);
}

.mys-period-name span {
  font-size: .8rem;
  font-weight: 400;
  margin-left: .5rem;
  white-space: nowrap;
}

/* Schemafilen, längst ut till höger på periodens rubrik. */
.mys-period-name .mys-export {
  float: right;
  font-size: .8rem;
  font-weight: 400;
}

.mys-month + .mys-month { margin-top: 1.5rem; }

.mys-month-name {
  font-size: 1rem;
  font-weight: 600;
  margin: 0 0 .25rem;
  padding-bottom: .2rem;
  border-bottom: 1px solid var(--bs-border-color);
}

/* Veckonummer i egen kolumn, sedan sju lika breda dagar. */
.mys-row {
  display: grid;
  /* minmax(0, 1fr) och inte 1fr: en 1fr-spalt får min-width auto och kan därför inte krympa
     under sitt innehåll. Chippen är nowrap, så "Internutbildning" tryckte hela rutnätet bredare
     än skärmen — söndagskolumnen hamnade utanför kanten och spaltens siffror med den. Ett dolt
     söndagspass är ett långt värre fel än en avklippt etikett, som ju står kvar i title. */
  grid-template-columns: 2.6rem repeat(7, minmax(0, 1fr));
  /* 5px och inte 3: dagrutorna behöver stå isär tydligt nog att ögat läser rutnätet radvis utan
     att räkna kanter. Samma tal som mellanrummet mellan veckorna, så luften blir jämn åt båda
     håll. */
  gap: 5px;
}

.mys-weekdays {
  font-size: .6rem;
  letter-spacing: .12em;
  text-transform: uppercase;
  text-align: center;
  padding: .3rem 0 .15rem;
}

.mys-week { margin-bottom: 5px; }

/* Veckonumret är stort och fett. Det är den enda etiketten på sidan man *letar* efter — man
   kommer till schemat med en vecka i huvudet, inte med ett datum — och en tunn siffra i grad
   försvann i raden. Fetstilen ger den vikt utan att ta färg: den står kvar i
   --bs-secondary-color och dämpad, så den hittas i periferin utan att konkurrera med passen.
   Toppställd, i linje med dagsiffrorna bredvid: ett veckonummer mitt i en hög rad pekar inte på
   någonting, medan ett vid radens överkant hör ihop med dagarna det numrerar. */
.mys-weekno {
  display: flex;
  align-items: flex-start;
  justify-content: center;
  padding-top: 2px;
  font-size: 1.6rem;
  font-weight: 700;
  line-height: 1;
  color: var(--bs-secondary-color);
  opacity: .7;
  font-variant-numeric: tabular-nums;
}

/* Rutan har ingen vänster- eller högermarginal: chippen ska gå ända ut i kanterna och läsas som
   segment av dagrutan, inte som etiketter som ligger i den. Luften som stod här flyttade in i
   .mys-daynum, som är det enda innehållet i en ruta som inte är ett chip. */
.mys-cell {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
  min-height: 4.5rem;
  padding: 0 0 2px;
  border: 1px solid var(--bs-border-color);
  border-radius: var(--bs-border-radius-sm);
  background: var(--mys-cell-bg);
  overflow: hidden;
}

/* En dag utanför perioden ritas *helt* tom — ingen ram och ingen siffra. En tom ruta med en
   siffra i hade lästs som "inga pass den dagen", vilket är ett annat påstående än "den dagen
   hör till en annan period". */
.mys-out {
  border-color: transparent;
  background: none;
  min-height: 0;
}

.mys-weekend { background: var(--mys-cell-bg-weekend); }
.mys-holiday { background: var(--bs-danger-bg-subtle); }
.mys-other   { background: var(--bs-warning-bg-subtle); }

.mys-daynum {
  display: flex;
  align-items: baseline;
  gap: .25rem;
  padding: 2px .3rem 0;
  font-size: .95rem;
  line-height: 1.2;
  font-variant-numeric: tabular-nums;
}

.mys-daynum-red { color: var(--bs-danger-text-emphasis); }

/* Namnet på en röd dag följer med bara när rutan har plats för det. Hela texten står alltid i
   title — helgdagsmarkeringen finns här därför att *Jour natt* den 25 december är ett annat
   faktum än *Jour natt* en tisdag. */
.mys-dayname {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: .6rem;
  opacity: .75;
}

@media (max-width: 575.98px) {
  .mys-dayname { display: none; }
}

/* Kantigt, och kant i kant. Ett chip med radie och sidoram ritar en egen liten låda inuti dagens
   låda, och två rundade hörn tätt inpå varandra läses som två saker; utan dem blir passet ett
   segment av dagen. Sidoramarna är därför borta — de hade bara dubblerat rutans egen ram — medan
   över- och underkanten står kvar och skiljer två pass åt. */
.mys-chip {
  padding: 0 .3rem;
  border-radius: 0;
  border: 1px solid color-mix(in oklab, var(--lane, var(--bs-secondary-color)) 55%, transparent);
  border-left: none;
  border-right: none;
  background: color-mix(in oklab, var(--lane, var(--bs-secondary-color)) 18%, transparent);
  font-size: .68rem;
  line-height: 1.5;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Passen tar hela dagrutan utom det händelsebandet redan lagt beslag på, och delar höjden lika
   när de är flera. Ett pass är dagens innehåll och tål att ta plats; händelsebandet ovanför
   behåller sin egen, lägre höjd (se .mys-chip-event), så skillnaden i höjd säger samma sak som
   färgen redan säger — bandet är avdelningens, chippet är ditt. Höjden kommer nu ur rutan i
   stället för ur chippets radhöjd, så två pass på en dag ser ut som två halvor av dagen och inte
   som en dag som växte. */
.mys-shifts {
  display: flex;
  flex-direction: column;
  gap: 2px;
  flex: 1 1 auto;
  min-height: 0;
}

.mys-shifts .mys-chip {
  display: flex;
  align-items: center;
  flex: 1 1 0;
  /* Ett golv, så att en dag med många händelser inte pressar ihop passet till en färgad linje. */
  min-height: 1.6rem;
}

/* FM eller EM på ett pass i Mitt schema. Skjuts ut till chippets högerkant och hålls mindre än
   passets namn: den som läser en månad letar efter vilket pass det är, och först därefter efter
   när på dagen. Heldagen skriver inget märke, så märket betyder alltid något när det syns.
   Märkningen är text och inte färg — appen körs i både ljust och mörkt läge. */
.mys-daypart {
  margin-left: auto;
  padding-left: .25rem;
  font-size: .58rem;
  font-weight: 600;
  opacity: .8;
}

.mys-chip-absence {
  border-style: dashed;
  background: none;
  color: var(--bs-secondary-color);
}

/* Ett passchip är en <button> sedan det öppnar meddelandedialogen. Knappens egna förval —
   typsnitt, centrering, textfärg — skulle rita om passet, så de nollställs här: utseendet ska
   vara exakt det chippet hade när det var ett <div>. Bakgrund och ramar rörs inte, de kommer
   från .mys-chip och .mys-chip-absence som förut. */
.mys-chip-shift {
  appearance: none;
  -webkit-appearance: none;
  width: 100%;
  text-align: left;
  color: inherit;
  font-family: inherit;
  font-size: .68rem;
  line-height: 1.5;
  cursor: pointer;
}

/* Frågan är redan ställd. En prick i hörnet, aldrig ett tecken i texten: rutan är ett chip bred
   och varje tecken konkurrerar med passets namn — samma skäl som håller kollegornas signaturer
   i tooltip:en. Pricken ligger absolut och kostar därför ingen bredd alls. */
.mys-chip-asked { position: relative; }

.mys-chip-asked::after {
  content: "";
  position: absolute;
  top: 2px;
  right: 2px;
  width: .3rem;
  height: .3rem;
  border-radius: 50%;
  background: var(--bs-warning);
}

/* Händelserna står överst i rutan och tar bara sin egen höjd — ingen utfyllnad upp till veckans
   högsta dag. Luften under dem är lite större än mellan chippen, så gränsen mellan avdelningens
   händelser och de egna passen syns utan att en linje behöver ritas. */
.mys-events {
  display: flex;
  flex-direction: column;
  gap: 2px;
  flex: 0 0 auto;
  margin-bottom: 3px;
}

/* Händelser bär ett neutralt band och aldrig en av de åtta positionsfärgerna: de hänger inte på
   någon position, och en nionde färg hade antytt att de gjorde det. Chippet håller sin egen,
   textnära höjd medan passen växer — skillnaden i höjd säger samma sak som färgen redan säger:
   händelsen är avdelningens, passet är ditt. */
.mys-chip-event {
  border: none;
  border-left: 2px solid var(--bs-secondary-color);
  border-radius: 0;
  line-height: 1.5;
  background: var(--bs-secondary-bg);
  color: var(--bs-secondary-color);
}

/* Inställt står kvar och stryks över. Att dölja det hade fått schemat att tyst säga emot vad
   personen fick höra när passet ställdes in. */
.mys-cancelled {
  text-decoration: line-through;
  opacity: .55;
}

/* ---------------------------------------------------------------- utskrift

   Ett personligt schema är, till skillnad från telefonlistans *i dag*-kolumn, värt att sätta
   upp: det är ett fast spann av datum vars fakta ändras sällan när de väl publicerats. Datum-
   och namnraden är vad som gör ett gammalt blad självangivande i stället för bara felaktigt. */
@media print {
  .mys { display: block; }

  .mys-cell {
    background: none !important;
    min-height: 4rem;
  }

  .mys-holiday,
  .mys-weekend,
  .mys-other { background: none !important; }

  .mys-holiday .mys-daynum,
  .mys-daynum-red { font-weight: 700; }

  .mys-chip {
    background: none !important;
    border: 1px solid #999;
    border-left: none;
    border-right: none;
    color: #000;
  }

  .mys-chip-absence,
  .mys-chip-event {
    border: 1px dotted #999;
    border-left: none;
    border-right: none;
  }

  /* Att man ställt en fråga om ett pass är något man gör vid skärmen; på papperet är pricken bara
     en fläck utan förklaring. */
  .mys-chip-asked::after { display: none; }

  .mys-month { break-inside: avoid; }

  /* En ny period börjar på nytt papper. Ett blad som blandar två perioders slut och början
     läses som en enda följd, och det är just gränsen där radernas betydelse byts. */
  .mys-period + .mys-period { break-before: page; }

  .mys-period-name { break-after: avoid; }
}

/* ================================================================ jourschemat

   Klinikens jourlinjer, alla avdelningar på en gång. Datumen löper nedåt och kolumnerna är
   jourraderna — se sidmodellens remarks för varför åt det hållet.

   Ingen fast färg någonstans utom i @media print: papperet har inget tema, och ett mörkt tema
   hade skrivit ut en helsvart sida. */

/* Varje jourrad är en kolumn med fast bredd, lika bred som sitt chip. Rutan rymmer åtta och
   rullar i sidled när det finns fler, med datumkolumnen kvar till vänster — en sträckt tabell
   gav sex kolumner som var och en var fem gånger bredare än signaturen i den, och en klinik med
   tolv jourrader fick kolumner som klipptes i stället för att gå att rulla fram. */
.jour {
  --jour-date-w: 8.5rem;
  --jour-col-w: 6.5rem;
}

/* Rullningen stannar alltid på en hel kolumn, precis till höger om datumkolumnen, så att ingen
   kant står med ett halvt chip. Rutan är just åtta kolumner bred och visar då åtta hela. */
.jour-scroll {
  max-width: calc(var(--jour-date-w) + 8 * var(--jour-col-w));
  scroll-snap-type: x mandatory;
  scroll-padding-left: var(--jour-date-w);
}

.jour-lane { scroll-snap-align: start; }

.jour-table {
  /* Fasta kolumner, som telefonlistan. En tabell som räknar bredden ur sitt innehåll ger
     kolumner som byter bredd så fort ett långt namn dyker upp i en enda ruta, och ögat tappar
     spåret nedför kolumnen. Bredden är summan av kolumnerna — --jour-cols sätts i markupen —
     och inte Bootstraps 100 %, som hade dragit ut dem igen. */
  table-layout: fixed;
  width: calc(var(--jour-date-w) + var(--jour-cols, 1) * var(--jour-col-w));
  font-size: .85rem;
  /* Bootstrap lägger rubriken under tabellen, och den osynliga rubriken sticker då ut en pixel
     nedanför och ger tabellens rullruta en lodrät rullningslist. */
  caption-side: top;
}

/* Står kvar när kolumnerna rullas i sidled. Cellens egen botten är ogenomskinlig — kroppens,
   eller helgradens --bs-tertiary-bg — så det som rullar in under den syns inte igenom. */
.jour-datecol {
  width: var(--jour-date-w);
  white-space: nowrap;
  position: sticky;
  left: 0;
  z-index: 1;
}

/* En kant mot kolumnerna, så att det som rullar in under datumen läses som rullat och inte som
   avklippt. Ett pseudoelement och inte en border-right: i en tabell med border-collapse följer
   kanten inte med en sticky cell, och box-shadow är redan i dagsmarkeringens och Bootstraps bruk. */
.jour-datecol::after {
  content: "";
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  width: 1px;
  background: var(--bs-border-color);
}

/* Avdelningens namn står kvar inom rutan så länge någon av dess kolumner syns, i stället för att
   rulla in under datumkolumnen eller ut över högerkanten och klippas mitt i ordet. Inline-block:
   sticky gör ingenting på ett inline-element. */
.jour-dept-name {
  display: inline-block;
  position: sticky;
  left: calc(var(--jour-date-w) + .5rem);
  right: .5rem;
}

.jour-dept {
  text-align: center;
  white-space: nowrap;
  overflow: hidden;
  border-bottom: 1px solid var(--bs-border-color);
  font-size: .8rem;
  letter-spacing: .04em;
  text-transform: uppercase;
  color: var(--bs-secondary-color);
}

/* Radhuvudet bär sin egen färg som ett band, som positionsraderna i Bemanning: en kolumn ska gå
   att följa nedför sidan utan att gå tillbaka till rubriken. Tonen blandas ur --lane, som
   markupen sätter per kolumn, aldrig ur ett fast värde.

   Färgen sätts som --bs-table-bg och inte som en background-color: Bootstrap målar varje cell ur
   `.table > :not(caption) > * > *`, som väger tyngre än en ensam klass, så en egen background-color
   hade förlorat tyst. Skrafferingen nedan slipper undan bara därför att den är en background-image
   och inte en färg. */
.jour-lane {
  --lane: var(--stf-1);
  --bs-table-bg: color-mix(in oklab, var(--lane) 13%, transparent);
  border-top: 2px solid var(--lane);
  font-weight: 600;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.jour-week {
  display: inline-block;
  width: 2.1rem;
  color: var(--bs-secondary-color);
  font-size: .75rem;
  font-weight: 400;
}

.jour-day {
  display: inline-block;
  width: 2.2rem;
  text-transform: capitalize;
  font-weight: 400;
}

.jour-date { font-weight: 600; }

/* Namnet på dagen, inte en typkod — färgen säger redan vilken sort det är. Klipps till en rad;
   hela texten står i tooltip:en. */
.jour-mark {
  display: block;
  margin-left: 2.1rem;
  font-size: .72rem;
  font-weight: 400;
  color: var(--bs-secondary-color);
  overflow: hidden;
  text-overflow: ellipsis;
}

.jour-red > * { --bs-table-bg: var(--bs-tertiary-bg); }

.jour-weekstart > * { border-top: 1px solid var(--bs-border-color); }

/* I dag: en accentstapel i kanten, som den gällande perioden har på Perioder. Färgen är aldrig
   ensam information — markupen lägger en visually-hidden "I dag:" i datumrutan. */
.jour-today > th:first-child { box-shadow: inset .2rem 0 0 0 var(--bs-primary); }

.jour-cell {
  vertical-align: middle;
  overflow: hidden;
}

/* De tomma lägena är två och får inte se likadana ut. Skrafferad = raden går inte den dagen,
   samma mönster som Bemanning ritar. */
.jour-closed {
  background: repeating-linear-gradient(
    135deg,
    var(--bs-tertiary-bg) 0 3px,
    transparent 3px 6px);
}

/* Ingen står på raden en dag den går. Sidans hela existensberättigande, och det enda som får
   bära varningsfärgen: på telefonlistan betyder en tom ruta "inte placerad i dag", här betyder
   den "ingen täcker i natt". */
.jour-cell.jour-unfilled {
  --bs-table-bg: var(--bs-warning-bg-subtle);
  box-shadow: inset 0 0 0 1px var(--bs-warning-border-subtle);
}

.jour-empty {
  color: var(--bs-warning-text-emphasis);
  font-weight: 600;
}

.jour-nowindow {
  color: var(--bs-secondary-color);
  font-style: italic;
}

/* Personerna i en ruta är chip, Bemannings och Hela schemats (stf-chip), staplade på höjden.
   Formen, tonen, överstrykningen och den streckade *Inställt*-ramen kommer ur de reglerna; det
   som står här är bara det jourschemat gör annorlunda. */
.jour-chips {
  display: flex;
  flex-direction: column;
  gap: 2px;
}

/* Chippet fyller kolumnen, och kolumnen har fast bredd — så varje chip på sidan är lika brett.
   Inuti står allt som på Bemanning: signaturen i högerkanten, FM/EM och kommentarsmärket i
   vänsterkanten. Större text än i rutnätet: chippet är rutans hela innehåll och inte en av sju
   i rad. */
.jour-chip {
  height: auto;
  min-height: var(--stf-chip-h);
  padding: .05rem .35rem;
  font-size: .78rem;
  gap: .3rem;
}

.jour-chip .stf-sig { font-size: .82rem; font-weight: 600; }

/* Inställt är ett ord och inte en signatur: vänsterställt och i brödtextens typsnitt, som
   händelsechippets titel. */
.jour-chip.stf-chip-calledoff .stf-sig {
  font-family: inherit;
  font-weight: 400;
  text-align: left;
}

/* Läsarens eget pass markeras i tyngd och aldrig i färg — färgen på chippet är redan
   personens. */
.jour-me .stf-sig { font-weight: 700; }

.jour-legend {
  padding: 0 .25rem;
  background: var(--bs-warning-bg-subtle);
}

@media print {
  /* Papperet har inget tema. Utan den här nollställningen ärver tabellen det mörka temats
     tokens och skriver ut svarta rutor med ljus text — så variablerna sätts om en gång på
     tabellen i stället för att varje regel nedan ska bära ett !important. */
  .jour-table {
    --bs-table-bg: transparent;
    --bs-table-color: #000;
    --bs-border-color: #999;
    --bs-secondary-color: #444;
    --bs-warning-text-emphasis: #000;
    font-size: .75rem;
    color: #000;
  }

  /* Var och en av dem sätter --bs-table-bg på sin egen cell och vinner därför över
     nollställningen på tabellen ovan. De måste därför nämnas var för sig. */
  .jour-red > *,
  .jour-lane,
  .jour-cell.jour-unfilled { --bs-table-bg: transparent; }

  .jour-lane { border-top: 2px solid #000; }

  .jour-today > th:first-child { box-shadow: inset .2rem 0 0 0 #000; }

  /* Luckraden måste med på papperet: ett blad som tiger om en oplanerad avdelning påstår en
     täckning ingen ordnat. Den bär temats varningsfärger och behöver därför sin egen nollställning. */
  .jour .alert {
    background: none;
    border-color: #000;
    color: #000;
  }

  /* Skrafferingen och varningsmarkeringen bär hela skillnaden mellan "går inte" och "ingen
     täcker", så de måste överleva papperet — men i tryckbara toner, inte i temats. */
  .jour-closed {
    background: repeating-linear-gradient(135deg, #ddd 0 3px, transparent 3px 6px);
  }

  .jour-cell.jour-unfilled { box-shadow: inset 0 0 0 1.5px #000; }

  .jour-empty { color: #000; }

  /* Chippen i svart och vitt, som på Hela schemat: tonen är en skärmens igenkänning och bladet
     skrivs ofta ut i gråskala, där tolv toner blir tolv nästan lika grå. Det inställda behåller
     sin överstrykning och den streckade ramen, som båda överlever papperet. */
  .jour-chip {
    background: none !important;
    border-color: #999 !important;
    color: #000;
  }

  /* Ingen markeras på papperet. Ett blad på anslagstavlan läses av alla som går förbi, och ett
     namn som är fetare för en läsare är brus eller en felläsning för resten. */
  .jour-me .stf-sig { font-weight: 600; }

  /* Papperet rullar inte: alla kolumner på bladets bredd, hur många de än är. */
  .jour-scroll { max-width: none; overflow: visible; }
  .jour-table { width: 100%; }
  .jour-datecol { position: static; }
  .jour-datecol::after { content: none; }
  .jour-dept-name { position: static; }

  .jour-table thead { display: table-header-group; }

  .jour-table tr { break-inside: avoid; }
}

/* ===== hela schemat
   ------------------------------------------------------------------------------------------
   Klinikens publicerade schema, alla valda avdelningar samtidigt, i två vyer över samma rader:
   *Veckor staplade* (månad → vecka → sju dagkolumner) och *Veckor i sidled* (en kolumn per dag,
   hela sträckan i en remsa).

   Utseendet är Bemannings. Rutnätet, radbandet, dagbandet och vilodagens mörkare band, chippen i
   signaturfärg, grupprubrikerna och passansvarets brickor ritas med samma stf-*-klasser som där,
   ur samma regler ovan — så att schemat ser likadant ut för den som lägger det och för den som
   läser det, och så att en ändring i Bemannings form inte behöver göras två gånger. Det som står
   här är bara det Bemanning inte har: sidled, periodgränsen, hopfällbara avdelningar,
   konferensradens kortkod, i dag, egna pass och utskriften.

   Sträckan är en enda, från den första visade periodens början till den sistas slut. Ett avsnitt
   per period var det första försöket och gick inte att läsa i sidled: remsan startade om vid
   vänsterkanten och såg ut som ett radbrott mitt i schemat. Periodgränsen är i stället en linje.

   Sidled ligger i *en* rullruta för hela rutnätet i stället för att låta sidan rulla i sidled:
   den låsta navigeringen är position: sticky över hela dokumentets bredd, och ett dokument som
   är 7,5 m brett hade lämnat menyn kvar långt ute till vänster. position: fixed hade löst det
   och är avsiktligt bortvalt i övrigt (se "låst navigering" ovan), så rullningen flyttar in i
   rutan i stället. Med båda axlarna inne i rutan fäster både etikettspalten och dagrubriken. */

.hel-own {
  font-size: .6rem;
  text-transform: uppercase;
  letter-spacing: .08em;
  opacity: .75;
  margin-left: .25rem;
}

.hel-month-head { margin-top: 1rem; }
.hel-month:first-child .hel-month-head { margin-top: 0; }
.hel-year { font-size: .7rem; }

/* Periodgränsen är en linje i rutnätet och inte ett nytt avsnitt. Den väger tyngre än veckans
   och ersätter den, så att två linjer aldrig hamnar på samma springa. I sidled ritas den på
   rutan, i staplad vy på dagrubriken — i sidled bär dagrubriken inuti rutan också klassen, och
   utan uppdelningen hade den fått linjen två gånger. */
.hel-h .hel-c.hel-periodstart {
  box-shadow: inset .12rem 0 0 0 var(--bs-secondary-color);
  margin-left: .9rem;
}

.hel-row .stf-daynum.hel-periodstart { box-shadow: inset .12rem 0 0 0 var(--bs-secondary-color); }

/* Perioderna räknas upp under rutnätet, med länken till Bemanning där den hör hemma: den pekar
   på ett (period, avdelning)-par, vilket en rad som spänner över flera perioder inte gör. */
.hel-periods { display: flex; flex-wrap: wrap; align-items: baseline; gap: .35rem 1rem; }

.hel-periodref { display: inline-flex; flex-wrap: wrap; align-items: baseline; gap: .35rem; }
.hel-pager { display: flex; gap: .5rem; }

/* Etiketten har Bemannings mått men ingen knappform: här öppnar den ingenting. */
.hel-label {
  display: flex;
  align-items: center;
  align-self: start;
  gap: .35rem;
  min-width: 0;
  min-height: var(--stf-cell-h);
  font-size: .78rem;
  padding: 0 .35rem;
}

.hel-label-text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.hel-collapse {
  border: 0;
  background: none;
  padding: 0;
  font-size: .6rem;
  text-transform: uppercase;
  letter-spacing: .1em;
  color: var(--bs-secondary-color);
  white-space: nowrap;
}

.hel-collapse:hover { color: var(--bs-body-color); }

.hel-collapse[aria-expanded="false"]::after { content: " \25B8"; }
.hel-collapse[aria-expanded="true"]::after { content: " \25BE"; }

.hel-ghead { margin-top: .35rem; }

/* Grupprubrikens linje löper över de sju dagarna. */
.hel-row .hel-group-rule { grid-column: span 7; }

/* Ett chip utan signaturfärg ärver radens färg i ramen, som på Bemanning. Konferensraden har
   ingen egen färg, så där skriver chippet sin konferens färg inline; händelsechippet behåller
   sin neutrala ram. */
.hel .stf-chip:not(.stf-chip-event) { border-color: var(--lane); }

/* Konferensraden håller flera positioner och har ingen egen färg att bära — samma neutrala ton
   som händelseraden. Se docs/adr/0007-a-konferens-is-a-duty-lane-drawn-grouped.md. */
.hel-lane-conference { background: var(--bs-tertiary-bg); }

/* Kortkoden före signaturen. Dämpad och en aning mindre: signaturen är det läsaren söker, och
   två lika tunga ord i samma chip blir en sträng där ögat inte hittar någotdera. */
.hel-code {
  flex: none;
  font-size: .58rem;
  letter-spacing: .02em;
  color: var(--bs-secondary-color);
  max-width: 4.5rem;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Ej tillsatt: Bemannings streckade ram, plus ett streck — på Bemanning är luckan en ruta att
   klicka i, här är den bara något att se, och strecket säger det också där ramen är svag. */
.hel-empty {
  color: var(--bs-warning-text-emphasis);
  font-weight: 600;
  font-size: .68rem;
  line-height: var(--stf-chip-h);
  text-align: center;
}

/* Egna pass i vikt och aldrig i färg: färgen på chippet är redan personens. */
.hel-me .stf-sig { font-weight: 700; }

.hel-today { box-shadow: inset .15rem 0 0 0 var(--bs-primary); }

/* Veckodagen står bara i sidled. Den staplade vyn har den som kolumnrubrik. */
.hel-dow { display: none; }

/* ---- Veckor staplade: Bemannings rutnät, med kolumnerna i formatmallen i stället för inline. */

.hel-row { grid-template-columns: 2rem minmax(6rem, 11rem) repeat(7, minmax(0, 1fr)); }
/* ---- Veckor i sidled: en rullruta, båda axlarna fästa inuti den. */

/* position: relative är inte kosmetik. Skärmläsartexterna i rutorna — "Ej tillsatt", "I dag",
   "Du" — är Bootstraps .visually-hidden, alltså position: absolute. Utan en positionerad förfader
   inuti rutan har de sidan som innehållande block, rymmer ur rullrutans klippning och gjorde hela
   sidan lika bred som remsan: tomt, men rullbart femton meter åt höger. */
.hel-scroll {
  position: relative;
  overflow: auto;
  max-height: calc(100vh - var(--skuld-header-h) - 12rem);
  /* Ingen utfyllnad upptill: den fästa rubriken fäster under den, och i den remsan syntes raderna
     rulla förbi. Luften ligger i stället inuti rubriken. */
  padding: 0 0 .5rem;
  border: 1px solid var(--bs-border-color);
  border-radius: var(--bs-border-radius);
}

/* Sidled som ett kalkylark. Sidan rullar inte alls — navigeringen, sidrubriken och verktygsraden
   står still överst, perioderna under — och rullrutan tar all höjd som blir över och hela
   fönstrets bredd. Två lodräta rullningar i varandra, sidans och rutans, var det som gjorde vyn
   svår att använda: hjulet rullade det ena eller det andra beroende på var pekaren råkade stå.

   Hela kedjan body → .container → main → .hel måste vara en flexkolumn med min-height: 0, annars
   växer en av dem till remsans höjd och rutan får aldrig sin egen rullning. Bara på skärm och från
   768px: under det finns ingen sidled, och på papperet ska allt flöda. */
@media screen and (min-width: 768px) {
  body.hel-fill {
    display: flex;
    flex-direction: column;
    height: 100vh;
    height: 100dvh;
    /* Bara höjdled låses. Navigeringen är bredare än fönstret strax under 1000px, och med
       overflow: hidden hade temaväxeln och kontomenyn då inte gått att nå alls. */
    overflow: auto hidden;
  }

  body.hel-fill > header { flex: none; }

  /* Navigeringen följer med ut till full bredd, så att märket står i lod med sidrubriken. */
  body.hel-fill > header .container { max-width: none; }

  body.hel-fill > .container {
    flex: 1 1 auto;
    min-height: 0;
    max-width: none;
    display: flex;
    flex-direction: column;
  }

  body.hel-fill main,
  body.hel-fill .hel {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
  }

  body.hel-fill .hel > * { flex: none; }

  body.hel-fill .hel > .hel-scroll {
    flex: 1 1 auto;
    min-height: 8rem;
    max-height: none;
  }

  /* Perioderna och bakåtlänken står i en rad under rutan och tar inte mer höjd än så. */
  body.hel-fill .hel-periods { margin-top: .5rem !important; }
  body.hel-fill .hel > nav { margin-top: .5rem !important; }
}

.hel-h { display: flex; flex-direction: column; min-width: max-content; }

.hel-hrow { display: flex; flex-wrap: nowrap; align-items: stretch; gap: 4px; }

.hel-h .hel-label {
  position: sticky;
  left: 0;
  z-index: 2;
  flex: 0 0 11rem;
  background: var(--bs-body-bg);
  /* Hela radens höjd och inte bara första rutans: en rad växer till sin tätaste dag, och under en
     kortare etikett syntes rutorna rulla förbi. Texten står kvar i första rutans höjd. */
  align-self: stretch;
  align-items: flex-start;
}

.hel-h .hel-label > .hel-label-text,
.hel-h .hel-label > .stf-kind { line-height: var(--stf-cell-h); }

/* Springan mellan den fästa spalten och första dagen. Radens gap är 4px, och genom den syntes
   dagarna glida förbi under etiketten. Remsan ärver etikettens bakgrund, så att radens band löper
   obrutet som förut när rutan står still. */
.hel-h .hel-label::after {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: 100%;
  width: 4px;
  background: inherit;
}

/* Den fästa etiketten måste vara ogenomskinlig, annars rullar dagarna in under den — så radens
   band läggs ovanpå sidans färg i stället för att släppa igenom. */
.hel-h .stf-lane > .hel-label {
  background:
    linear-gradient(color-mix(in oklab, var(--lane) 13%, transparent),
                    color-mix(in oklab, var(--lane) 13%, transparent)),
    var(--bs-body-bg);
}

.hel-h .stf-lane-events > .hel-label,
.hel-h .hel-lane-conference > .hel-label { background: var(--bs-tertiary-bg); }

.hel-h .hel-group-rule { flex: 1 0 auto; }

/* Grupprubriken i sidled är också den fästa etiketten, och får då sin storlek från rubriken och
   inte från radetiketten. */
.hel-h .hel-label.stf-group-label { font-size: .6rem; min-height: 0; padding-top: .35rem; }

.hel-h-head {
  position: sticky;
  top: 0;
  z-index: 3;
  background: var(--bs-body-bg);
  padding-top: .5rem;
  padding-bottom: 2px;
  border-bottom: 1px solid var(--bs-border-color);
}

/* Hörnet ligger över båda: det korsar den fästa spalten och den fästa rubriken. */
.hel-h-head .hel-label { z-index: 4; }

.hel-h .hel-c { flex: 0 0 5.25rem; min-width: 0; }

.hel-h .hel-dayc { display: flex; flex-direction: column; }
.hel-h .hel-dayc > .stf-daynum { flex: 1; }

.hel-h .hel-dow {
  display: block;
  flex: 0 0 100%;
  padding-left: 10px;
  font-size: .55rem;
  text-transform: uppercase;
  letter-spacing: .04em;
  color: var(--bs-secondary-color);
}

.hel-h .stf-daynum-n { font-size: .95rem; }

.hel-hcell {
  font-size: .6rem;
  color: var(--bs-secondary-color);
  text-transform: uppercase;
  letter-spacing: .06em;
  padding-left: .15rem;
  white-space: nowrap;
}

.hel-h .hel-weekstart { margin-left: .4rem; }

.hel-h .hel-ghead { padding-top: .4rem; font-size: .6rem; }

/* ---- Personer i sidled. Raden är en person och bär ingen positionsfärg — chippen gör det — så
   bandet är neutralt och personens signaturfärg står som en prick i etiketten. */
.hel-person { --lane: var(--bs-secondary-color); }

.hel-person > .hel-label { cursor: pointer; }

.hel-h .hel-person > .hel-label > .stf-person-dot {
  margin-top: calc((var(--stf-cell-h) - .55rem) / 2);
}

.hel-psig { font-family: var(--bs-font-monospace); font-size: .74rem; margin-right: .25rem; }

.hel-me .hel-psig { font-weight: 700; }

/* Chippets text är en kortkod eller ett radnamn och inte en signatur, och läses från vänster. */
.hel-person .stf-sig { font-family: inherit; text-align: left; }

/* Markeringen ringar in raden — inuti etiketten och bandet, så att den inte klipps av grannarna. */
.hel-person.hel-marked { box-shadow: inset 0 0 0 2px var(--bs-primary); }
.hel-h .hel-person.hel-marked > .hel-label { box-shadow: inset 2px 2px 0 0 var(--bs-primary), inset 0 -2px 0 0 var(--bs-primary); }

/* Under 768 px finns ingen växel — sidled är obrukbart på en telefon, så knappen skulle vara ett
   val som bara kan göra sidan sämre. Rutnätet krymper: veckonumret och dagsiffran har Bemannings
   skärmstorlek och tar annars halva bredden. */
@media (max-width: 767.98px) {
  .hel-viewtoggle { display: none; }
  .hel-row { grid-template-columns: 1.2rem minmax(3.5rem, 5rem) repeat(7, minmax(0, 1fr)); gap: 2px; }
  .hel .stf-weekno { font-size: .9rem; }
  .hel .stf-daynum-n { font-size: .8rem; padding-left: 2px; }
  .hel .stf-daynum-name { display: none; }
  .hel .hel-label { font-size: .68rem; padding: 0 .15rem; }
  .hel .stf-kind { display: none; }
}

/* Papperet är svartvitt. Varje skillnad som bärs av en färg på skärmen — radbandet, dagbandet,
   signaturfärgen, helgtonen — tas bort här och sägs om i streck och vikt, eller inte alls.
   Signaturfärgen sätts inline på chippet, och banden av Bemannings regler med högre vikt än en
   ensam klass, så reglerna här behöver !important. Utskriften renderar alltid den staplade vyn
   (se sidmodellen), så rullrutan nollställs bara för säkerhets skull. */
@media print {
  .hel-scroll { overflow: visible; max-height: none; border: 0; padding: 0; }

  .hel .stf-lane,
  .hel .stf-lane-events,
  .hel .hel-lane-conference,
  .hel .stf-cell,
  .hel .stf-daynum { background: none !important; }

  .hel .stf-cell { border-color: #999; }
  .hel .stf-out { border-color: transparent; }
  .hel .stf-off { background-image: repeating-linear-gradient(135deg, #ddd 0 3px, transparent 3px 6px) !important; }
  .hel .stf-unfilled { border-style: solid; box-shadow: inset 0 0 0 1.5px #000; }
  .hel-empty { color: #000; }

  .hel .stf-chip {
    background: none !important;
    border: 1px solid #999 !important;
    color: #000;
  }

  .hel .stf-chip-event { border-style: dotted !important; }

  .hel .stf-holder,
  .hel .stf-holder-inline,
  .hel .hel-code,
  .hel .stf-kind,
  .hel .stf-group-label { color: #000; }

  .hel .stf-holder { background: none; border: 1px dashed #000; }

  .hel .stf-group-rule { border-top-color: #000; }

  /* Temats dämpade text är ljusgrå i mörkt läge och skulle försvinna på papperet. */
  .hel .text-body-secondary,
  .hel .stf-weekno { color: #555 !important; }

  /* Helgen och helgdagen bärs av vikt i stället för av ton. */
  .hel .stf-holiday .stf-daynum-n,
  .hel .stf-weekend .stf-daynum-n { font-weight: 700; color: #000; }
  .hel .stf-daynum-name { color: #000; }

  /* Ingen markeras på papperet. Ett blad på anslagstavlan läses av alla som går förbi, och en
     markering som är gjord för en läsare är brus eller en felläsning för resten. */
  .hel-today { box-shadow: none; }
  .hel .stf-hit { box-shadow: none; }
  .hel-me .stf-sig { font-weight: 400; }

  /* Periodgränsen måste med: den säger var raderna byter period, och utan den blir en remsa
     över två perioder ett odelat påstående om en period som inte finns. */
  .hel-h .hel-c.hel-periodstart,
  .hel-row .stf-daynum.hel-periodstart { box-shadow: inset .12rem 0 0 0 #000; }

  /* Luckraden måste med på papperet: ett blad som tiger om en oplanerad avdelning påstår ett
     schema ingen har lagt. Den bär temats varningsfärger och behöver därför sin egen
     nollställning — samma sak Jourschemat gör med sin. */
  .hel .alert {
    background: none;
    border-color: #000;
    color: #000;
  }

  .hel-month { break-inside: avoid; }
  .hel-month-head { break-after: avoid; }
}

/* ====================================================================== inloggningssidan

   Sidorna som _AuthLayout bär: inloggning och kontoaktivering. Ingen navigering, ingen sidfot,
   ett ordmärke och ett formulär mitt på skärmen. Reglerna står här och inte i en scoped
   .cshtml.css, eftersom de gäller markup i *både* layouten och sidan — och scoped CSS räknar
   layout och sida som två skilda omfång. */

:root {
  /* Punkten i "skuld." är sidans enda avvikande färg. Inget fast värde: accenten följer
     data-bs-theme och står kvar rätt när temat byts. */
  --skuld-mark-dot: var(--skuld-accent);
}

/* Sidan är precis en skärm hög och rullar inte. min-height och inte height, så att en
   valideringsruta eller ett kort fönster får växa i stället för att klippas — den som inte
   kan läsa felmeddelandet kan inte rätta felet.

   Panelen centreras med margin: auto och inte med align-items: center. De ger samma bild
   ända tills innehållet blir högre än skärmen, och då skjuter den centrerade varianten
   överkanten *ovanför* rullningens början: formulärets första fält blir omöjligt att nå.
   Automarginalen stannar i stället vid kanten och låter sidan rulla som vanligt. */
.skuld-auth {
  min-height: 100vh;
  min-height: 100dvh;
  display: flex;
  justify-content: center;
  padding: 2rem 1.25rem;
}

.skuld-auth-theme {
  position: absolute;
  top: 1rem;
  right: 1rem;
}

.skuld-auth-panel {
  width: 100%;
  max-width: 22rem;
  margin: auto;
}

/* Märket bär bara sin egen form här; storleken sätts där det används. Bokstäverna är sju
   bildpunkter höga, alltså ger 32×7-rutnätet en höjd runt en femtedel av bredden. */
.skuld-wordmark {
  display: block;
}

/* På inloggningssidan fyller märket panelen och får luften under sig därefter. */
.skuld-auth-panel > .skuld-wordmark {
  width: 100%;
  height: auto;
  margin-bottom: 2.5rem;
}

/* Dataskyddsinformationen är löptext: en läsbar radlängd i stället för formulärets smala
   spalt, och märket i en storlek som hör till en rubrik och inte till en affisch. */
.skuld-auth-panel-wide {
  max-width: 42rem;
}

.skuld-auth-panel-wide > .skuld-wordmark {
  max-width: 11rem;
  margin-bottom: 2rem;
}

/* I navigeringen sätts höjden i stället, och i hela bildpunkter: rutnätet är sju rader högt,
   så måttet måste vara delbart med sju för att varje rad ska få lika många skärmbildpunkter.
   Ett rem-mått hade landat mitt i en rad och gjort trappstegen ojämna, eftersom crispEdges
   inte får jämna ut dem.

   21px, alltså tre bildpunkter per rad. Märket började på 14px — två per rad, ungefär
   versalhöjden i navbar-brand, alltså precis så tungt som ordet "Skuld" vägde — och det var
   för försynt: ordmärket är det enda i listen som säger vilken app man står i. Nästa steg
   uppåt som rutnätet tillåter är just en halv gång till. */
.navbar-brand > .skuld-wordmark {
  width: auto;
  height: 21px;
}

/* Användare: avdelningslistan är 15 % bredare än rutnätets col-lg-2 (16,67 % → 19,16 %), och
   detaljpanelen lämnar ifrån sig mellanskillnaden (33,33 % → 30,83 %). Namn och kortnamn fick
   annars sällan plats, och raden trängde ut redigeringsknappen. Tabellen behåller sin col-lg-6.
   Summan hålls strax under 100 %: col-lg-4 är 33,333…%, och en hundradel för mycket räckte för
   att skicka detaljpanelen till en egen rad. */
@media (min-width: 992px) {
  .users-depts { flex: 0 0 auto; width: 19.16%; }
  .users-detail { flex: 0 0 auto; width: 30.83%; }
}

/* ---- Önskemålsöversikt ----------------------------------------------------------------- */

/* Rutnätet: ett block per månad, personer gånger dagar. Blocket rullar i sidled i sin egen ruta
   och aldrig sidan, och namnkolumnen står kvar medan dagarna rullar förbi. */
.po-scroll {
  overflow-x: auto;
}

.po-table {
  border-collapse: separate;
  border-spacing: 2px;
  font-size: .75rem;
}

.po-table .po-name {
  position: sticky;
  left: 0;
  z-index: 1;
  background-color: var(--bs-body-bg);
  min-width: 11rem;
  max-width: 14rem;
  padding-right: .5rem;
  font-weight: normal;
  text-align: left;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.po-day-head {
  min-width: 1.6rem;
  text-align: center;
  font-family: var(--bs-font-monospace);
  font-size: .62rem;
  font-weight: normal;
  line-height: 1.15;
  color: var(--bs-secondary-color);
  border-radius: var(--bs-border-radius-sm);
}

.po-cell {
  width: 1.6rem;
  height: 1.6rem;
  padding: 0;
  border-radius: var(--bs-border-radius-sm);
}

/* Vilodagens band går genom hela kolumnen, som på Bemanning, så att en helg syns nedför listan
   utan att man läser rubriken. */
.po-rest { background-color: color-mix(in oklab, var(--bs-emphasis-color) 7%, transparent); }
.po-holiday { color: var(--bs-danger-text-emphasis); }
.po-other { color: var(--bs-warning-text-emphasis); }

.po-status {
  font-size: .6rem;
  margin-right: .3rem;
  vertical-align: .1em;
}

/* Markeringen: samma kod och samma ton som önskemålsrutan i Bemannings personallista, och lika
   tät av samma skäl — 18 % är avvägt för en dagruta i en månadskalender och blir en grå fläck på
   en ruta av den här storleken. */
.po-mark {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 1.5rem;
  border: 1px solid var(--bs-border-color);
  border-radius: var(--bs-border-radius-sm);
  font-size: .68rem;
  font-weight: 600;
  line-height: 1;
  color: var(--bs-body-color);
}

.po-mark:is(.pref-off, .pref-nocall, .pref-prefcall, .pref-parental, .pref-research, .pref-course, .pref-unavailable) {
  background-color: color-mix(in srgb, var(--pref-tint) 38%, var(--bs-body-bg));
}

.po-legend-mark {
  width: 1.4rem;
  height: 1.3rem;
}

/* Ett utkast är inget besked än. Blekt och inte dolt: den som målat har ändå sagt något, och den
   som läser ska se skillnaden utan att tro att ingenting finns. */
.po-draft { opacity: .45; }

/* Dagen har en kommentar. Pricken säger bara att den finns; texten står i verktygstipset. */
.pref-day.po-has-comment { position: relative; }

.po-has-comment::after {
  content: '';
  position: absolute;
  top: 1px;
  right: 1px;
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background-color: var(--bs-emphasis-color);
}

/* Kalendrarna: en persons månader bredvid varandra, som bryts till nästa rad i ett smalt fönster
   i stället för att rulla i sidled. */
.po-months {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
  gap: 1rem;
}

/* ==== Bemanning: den hopfällbara spalten, och Veckor i sidled ====

   Står sist i filen och inte bland Bemannings övriga regler, med flit: sidled lånar Hela schemats
   uppställning klass för klass (hel-h, hel-hrow, hel-label, hel-c, hel-scroll), och det lilla som
   är Bemannings eget måste stå *efter* de reglerna för att vinna över dem med samma specificitet.
   Se docs/screens/staffing.md, "Veckor i sidled". */

/* Det som bara finns i ett av lägena är dolt tills läget säger annat. */
.stf-rail-strip,
.stf-rail-tools,
.stf-period-summary,
.stf-panetoggle { display: none; }

.stf-rail-btn {
  width: 1.6rem;
  height: 1.6rem;
  padding: 0;
  border: 1px solid transparent;
  border-radius: var(--bs-border-radius-sm);
  background: none;
  color: var(--bs-secondary-color);
  font-size: .95rem;
  line-height: 1;
}

.stf-rail-btn:hover {
  border-color: var(--bs-border-color);
  color: var(--bs-body-color);
}

/* ---- Spalten fälls ihop, i båda vyerna. Bara från 992px: under det står spalten ovanför
   rutnätet och har ingen bredd att lämna ifrån sig, så knappen finns inte och klassen gör
   ingenting. */
@media (min-width: 992px) {
  .stf-rail-tools {
    display: flex;
    justify-content: flex-end;
    margin-bottom: .25rem;
  }

  body.stf-rail-folded .stf-body > .stf-main {
    flex: 1 1 0;
    width: auto;
    max-width: none;
    min-width: 0;
  }

  body.stf-rail-folded .stf-body > .stf-side {
    flex: 0 0 auto;
    width: auto;
    overflow: visible;
  }

  body.stf-rail-folded .stf-rail { display: none; }

  body.stf-rail-folded .stf-rail-strip {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: .5rem;
    width: 1.6rem;
    position: sticky;
    top: var(--skuld-header-h);
  }
}

/* ---- Veckor i sidled: sidan rullar inte, rutnätet fyller fönstret.

   Samma kedja som Hela schemats hel-fill — body → .container → main — och av samma skäl: två
   lodräta rullningar i varandra, sidans och rutans, är det som gör en sådan vy svår att använda.
   Här finns en länk till i kedjan, raden med rutnätet och spalten: de två rullar var för sig,
   bredvid varandra, och ingenting annat på sidan rullar alls.

   Från 992px och inte 768: under det ligger spalten ovanför rutnätet. staffing.js sätter klassen
   bara över samma tröskel, så regeln och skriptet säger samma sak två gånger med flit — en
   fönsterhög body på en telefon vore värre än en regel för mycket. */
@media screen and (min-width: 992px) {
  body.stf-fill {
    display: flex;
    flex-direction: column;
    height: 100vh;
    height: 100dvh;
    /* Bara höjdled låses, som på Hela schemat: navigeringen är bredare än fönstret strax under
       1000px, och då måste temaväxeln och kontomenyn gå att rulla fram. */
    overflow: auto hidden;
  }

  body.stf-fill > header { flex: none; }
  body.stf-fill > header .container { max-width: none; }

  body.stf-fill > .container {
    flex: 1 1 auto;
    min-height: 0;
    max-width: none;
    display: flex;
    flex-direction: column;
  }

  body.stf-fill main {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
    padding-bottom: .5rem !important;
  }

  body.stf-fill main > * { flex: none; }

  body.stf-fill main > .stf-body {
    flex: 1 1 auto;
    min-height: 0;
    flex-wrap: nowrap;
    --bs-gutter-y: 0;
  }

  body.stf-fill .stf-main {
    flex: 1 1 0;
    width: auto;
    max-width: none;
    min-width: 0;
    min-height: 0;
    display: flex;
    flex-direction: column;
  }

  body.stf-fill .stf-main > * { flex: none; }

  body.stf-fill .stf-main > #grid {
    flex: 1 1 auto;
    min-height: 8rem;
    max-height: none;
  }

  /* Spalten har en fast bredd här och inte en fjärdedel av fönstret: sidan är fönsterbred i
     sidled, och en fjärdedel av 1920px är bredd som personallistan inte har någon nytta av men
     som rutnätet räknar i dagar. Den rullar som *en* spalt — listorna i den släpper sina egna
     höjdtak, annars låg det tre rullningar i varandra där. */
  body.stf-fill .stf-side {
    flex: 0 0 21rem;
    width: 21rem;
    min-height: 0;
    overflow-y: auto;
  }

  body.stf-fill.stf-rail-folded .stf-side { flex-basis: auto; width: auto; }

  body.stf-fill .stf-rail,
  body.stf-fill .stf-rail-strip { position: static; }

  body.stf-fill #roster,
  body.stf-fill #errand-list {
    max-height: none !important;
    overflow: visible !important;
  }

  /* Fördelning byter plats med rutnätet i stället för att stå under det: sidan rullar inte, så
     under rutnätet finns ingenstans att stå. I den staplade vyn skymmer fjorton veckor rutnät
     ändå tabellen, så ingenting som syntes samtidigt har slutat göra det. */
  body.stf-fill .stf-panetoggle { display: inline-flex; }
  body.stf-fill .stf-dist { display: none; }
  body.stf-fill.stf-show-dist .stf-main > #grid { display: none; }

  body.stf-fill.stf-show-dist .stf-dist {
    display: block;
    flex: 1 1 auto;
    min-height: 0;
    overflow: auto;
    margin-top: 0 !important;
  }

  /* Rubriken krymper: inledningen bort, väljarna bredvid varandra, och periodrutan ihopfälld
     till sina två märken. Räknarna står kvar — de läses hela tiden. */
  body.stf-fill .stf-intro { display: none; }
  body.stf-fill .stf-selectors { flex-direction: row !important; }
  body.stf-fill .stf-toolbar { margin-bottom: .5rem !important; }
  body.stf-fill main > .mb-3 { margin-bottom: .5rem !important; }

  body.stf-fill .stf-period-pane {
    position: relative;
    align-self: flex-end;
    max-width: none !important;
    padding: .3rem .6rem !important;
  }

  body.stf-fill .stf-period-summary {
    display: flex;
    align-items: center;
    gap: .5rem;
  }

  body.stf-fill .stf-period-body { display: none; }

  /* Öppnad lägger den sig ovanpå rutnätet i stället för att trycka ned det. */
  body.stf-fill .stf-pane-open .stf-period-body {
    display: block;
    position: absolute;
    top: calc(100% + 4px);
    right: 0;
    width: 24rem;
    max-width: 90vw;
    z-index: 1020;
    padding: 1rem;
    background: var(--bs-body-bg);
    border: 1px solid var(--bs-border-color);
    border-radius: var(--bs-border-radius);
    box-shadow: var(--bs-box-shadow);
  }
}

/* ---- Det som skiljer Bemannings remsa från Hela schemats. */

/* Den fästa spalten bär pilarna också, och är därför två rem bredare. Etiketten är en knapp och
   har sin egen utfyllnad, så spaltens egen tas bort. */
.stf-sid .hel-label {
  flex-basis: 13rem;
  padding: 0;
  gap: 0;
}

.stf-sid .hel-label > .stf-move { flex: 0 0 2rem; }

.stf-sid .hel-label > .stf-label {
  flex: 1 1 0;
  width: auto;
  min-width: 0;
}

/* Grupprubriken står i lod med radernas namn, alltså innanför pilarnas plats. */
.stf-sid .hel-label.stf-group-label { padding-left: 2.35rem; }

/* Täckningen i en 5,25 rem bred dagrubrik: en aning mindre och tätare mot kanten än i den
   staplade vyn, där en dag är en sjundedel av sidan. */
.stf-sid .stf-daycount { font-size: .55rem; padding-right: 6px; }

/* ---------------------------------------------------------------- Jourtorget

   Utlagda pass, bud och passbyten. Samma magra kortform som Mina ärenden på Mitt schema: en ram,
   en rubrikrad med passet, och det som går att göra under. Passets färg är radens, som en prick
   i chippet — aldrig en fyllning, eftersom en fyllning i radens färg läses som ett chip i
   rutnätet och inte som en post. */

.jt-heading {
  display: flex;
  align-items: baseline;
  gap: .5rem;
  font-size: .68rem;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--bs-secondary-color);
  margin: 1.25rem 0 .5rem;
}

.jt-heading:first-child { margin-top: 0; }

summary.jt-heading { margin: 0; cursor: pointer; }

.jt-heading-count { letter-spacing: 0; font-variant-numeric: tabular-nums; }

.jt-filter {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .4rem .75rem;
  margin-bottom: .75rem;
  font-size: .82rem;
}

.jt-filter-label {
  font-size: .68rem;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--bs-secondary-color);
}

.jt-lane {
  display: inline-flex;
  align-items: center;
  gap: .3rem;
  white-space: nowrap;
}

.jt-lane .form-check-input { margin-top: 0; }

.jt-offers {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(17rem, 1fr));
  gap: .6rem;
}

.jt-offer,
.jt-card {
  border: 1px solid var(--bs-border-color);
  border-radius: var(--bs-border-radius-sm);
  padding: .55rem .65rem;
  font-size: .82rem;
  background: var(--bs-body-bg);
}

.jt-card { margin-bottom: .5rem; }

/* Det egna utlagda passet står i listan som alla andras, men med accentkanten — det man inte kan
   bjuda på ska synas innan man letar efter knappen. */
.jt-offer-mine { border-left: 3px solid var(--bs-primary); }

.jt-pass {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: .4rem;
}

.jt-pass-chip {
  display: inline-flex;
  align-items: baseline;
  gap: .35rem;
  max-width: 100%;
  padding: 0 .35rem;
  border: 1px solid var(--bs-border-color);
  border-radius: var(--bs-border-radius-sm);
  background: var(--bs-tertiary-bg);
  font-weight: 600;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.jt-pass-chip::before {
  content: "";
  flex: none;
  align-self: center;
  width: .45rem;
  height: .45rem;
  border-radius: 50%;
  background: var(--lane, var(--bs-secondary-color));
}

.jt-pass-dept {
  font-weight: 400;
  color: var(--bs-secondary-color);
}

.jt-pass-day { font-variant-numeric: tabular-nums; }

.jt-daypart {
  font-size: .62rem;
  font-weight: 600;
  opacity: .8;
}

.jt-offer-who {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: .4rem;
  margin-top: .3rem;
}

.jt-accepts {
  font-size: .6rem;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--bs-secondary-color);
}

.jt-offer-sub {
  margin: .3rem 0 0;
  font-size: .75rem;
  color: var(--bs-secondary-color);
}

/* Anteckningen är kollegans egen rad och står som ett citat, så att den inte läses som Skulds. */
.jt-note {
  margin: .4rem 0 0;
  padding: .3rem .5rem;
  border-left: 2px solid var(--bs-border-color);
  background: var(--bs-tertiary-bg);
  overflow-wrap: anywhere;
}

.jt-bid { margin-top: .5rem; }

.jt-bid > summary {
  font-size: .78rem;
  color: var(--bs-link-color);
  cursor: pointer;
}

.jt-bid-row {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: .4rem;
  margin-top: .45rem;
}

.jt-bid-row .form-select { flex: 1 1 12rem; min-width: 0; }

.jt-passes {
  display: flex;
  flex-direction: column;
  gap: .25rem;
  max-height: 16rem;
  overflow-y: auto;
  font-size: .82rem;
}

.jt-pass-option {
  display: flex;
  align-items: baseline;
  gap: .4rem;
}

.jt-bids {
  list-style: none;
  margin: .5rem 0;
  padding: 0;
}

.jt-bids > li {
  padding: .4rem 0;
  border-top: 1px solid var(--bs-border-color);
}

.jt-new {
  font-size: .6rem;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--bs-primary-text-emphasis);
}

/* Pricken i navigeringen: nya bud på ens egna utlagda pass. Absolut, så att den inte flyttar
   etiketten när den tänds. */
.nav-dot { position: relative; }

.nav-dot::after {
  content: "";
  position: absolute;
  top: .45rem;
  right: .1rem;
  width: .4rem;
  height: .4rem;
  border-radius: 50%;
  background: var(--bs-warning);
}

/* Bemannings märke på ett pass som bytt person på Jourtorget. Text och inte färg, som FM/EM. */
.stf-traded {
  margin-left: .15rem;
  font-size: .6rem;
  opacity: .75;
}

/* Passbytena i Bemannings räls och på Översikt: ett kort per byte, ett pass per rad. */
.trade-pass {
  font-size: .78rem;
  overflow-wrap: anywhere;
}
