/* protokoll.simplineers.se — husstil ovanpå Simplineers delade varumärkestokens.
 *
 * brand/*.css är OFÖRÄNDRADE kopior från github.com/simplineers/brand-guidelines
 * (commit 59a42a2, 2026-07-01). Rör dem inte här — ändra i brand-repot och kopiera om,
 * annars driver husstilen isär från övriga sajter (se BRANDING.md § "Undvik drift").
 *
 * De importeras i stället för att länkas per sida: varje mall har eget <head>, och fyra
 * link-taggar i sex mallar blir fyra som glöms i den sjunde. Ett link-element räcker.
 *
 * Signeringstjänsten är inte en regelverksdomän, så accenten är navets indigo (standard i
 * accents.css) — inget data-brand sätts.
 */
@import url("brand/colors.css");
@import url("brand/typography.css");
@import url("brand/accents.css");
@import url("fonts.css");

/* ---------- Semantiska husvariabler, mappade på varumärkestokens ----------
 *
 * Kontrasterna nedan är räknade, inte gissade (WCAG 1.4.3 AA ≥ 4.5:1 för text,
 * 1.4.11 ≥ 3:1 för gränser/fokus). Byter du en färg: räkna om paret.
 */
:root {
  color-scheme: light dark;

  --bg: var(--slate-100);        /* #F4F5F9 */
  --card: var(--white);
  --fg: var(--ink);              /* 16.13:1 mot --bg, 17.57:1 mot kort */
  --muted: var(--slate-500);     /* 5.64:1 mot --bg, 6.15:1 mot kort */
  --border: var(--slate-200);

  /* Länkfärg ≠ knappfärg. Brand-indigo ger bara 4.26:1 mot sidbakgrunden och underkänns
     som text; indigo-700 ger 5.91:1. Knappen behåller brand-indigo som yta — där är vit
     text 4.64:1, alltså godkänt. */
  --link: var(--indigo-700);
  --accent: var(--indigo);
  --accent-hover: var(--indigo-700);
  --btn-fg: var(--white);        /* vit på --indigo = 4.64:1 */

  --error: #B3261E;             /* 6.54:1 mot kort — brandets --danger gav bara 4.38:1 */
  --ok-fg: #17603E;             /* 7.56:1 mot kort */
  --ok-bg: #E7F4ED;

  --focus: var(--indigo-700);   /* 5.91:1 mot --bg, långt över 3:1-kravet */

  --radius: 12px;
  --radius-sm: 8px;
  --shadow: 0 1px 2px rgba(20, 24, 43, 0.06), 0 8px 24px -12px rgba(20, 24, 43, 0.18);
}

@media (prefers-color-scheme: dark) {
  :root {
    --bg: var(--ink);            /* #14182B */
    --card: var(--slate-700);    /* #2E3450 */
    --fg: var(--slate-100);      /* 11.19:1 mot kort */
    --muted: var(--slate-300);   /* 7.31:1 mot kort — slate-400 gav bara 3.84:1 */
    --border: #3D446B;

    --link: var(--indigo-300);   /* 5.86:1 mot kort, 8.45:1 mot --bg */
    --accent: var(--indigo-500);
    --accent-hover: var(--indigo-300);
    --btn-fg: var(--ink);        /* mörk text på --indigo-500 = 5.18:1; vit gav 3.39:1 */

    --error: #F49A94;            /* 5.74:1 mot kort */
    --ok-fg: #7FD8A4;            /* 10.26:1 mot --bg */
    --ok-bg: #1C3A2C;

    --focus: var(--indigo-300);
    --shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 8px 24px -12px rgba(0, 0, 0, 0.6);
  }
}

* { box-sizing: border-box; }

/* hidden-attributet måste vinna över våra egna display-regler. Webbläsarens
   [hidden] { display: none } är en attributselektor och förlorar mot varje klassregel som
   sätter display — t.ex. .qr-extend { display: flex }, som gjorde att erbjudandet om en ny
   QR-kod syntes direkt i stället för efter 25 sekunder. Regeln här gäller alla element och
   stänger hela felklassen, inte bara det ena fallet. */
[hidden] { display: none !important; }

body {
  margin: 0;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 1.25rem;
  background: var(--bg);
  color: var(--fg);
  font-family: var(--font-body);
  font-size: var(--fs-base);
  line-height: var(--lh-normal);
  padding: 1.5rem;
  -webkit-font-smoothing: antialiased;
}


/* ---------- Varumärkeshuvud ---------- */
.brandbar { display: flex; align-items: center; justify-content: space-between; gap: 1rem;
  width: 100%; max-width: 60rem; margin: 0 auto; }
.brandbar img { display: block; height: 44px; width: auto; }
.brandbar .logo-dark { display: none; }
@media (prefers-color-scheme: dark) {
  .brandbar .logo-light { display: none; }
  .brandbar .logo-dark { display: block; }
}

body { align-items: stretch; justify-content: flex-start; }
main { width: 100%; max-width: 60rem; margin: 0 auto; }

.card { background: var(--card); border: 1px solid var(--border); border-radius: var(--radius);
  padding: 1.5rem 2rem; box-shadow: var(--shadow); text-align: left; margin-bottom: 1.25rem; }

.topbar { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; }
.muted { color: var(--muted); }
.tag { display: inline-block; font-size: var(--fs-xs); font-weight: var(--fw-semibold);
  text-transform: uppercase; letter-spacing: var(--tracking-wide);
  padding: 0.15rem 0.5rem; border-radius: 999px; background: var(--accent-tint); color: var(--indigo-700); }
@media (prefers-color-scheme: dark) { .tag { background: #2A2F52; color: var(--indigo-300); } }

/* Dagordningen. Numret är punktens position och blir punktnumreringen i protokollet —
   därför visas det stort och tydligt, inte som en diskret detalj. */
.agenda { list-style: none; padding: 0; margin: 0; }
.agenda li { display: grid; grid-template-columns: 2.5rem 1fr auto; gap: 0.75rem;
  align-items: start; padding: 0.9rem 0; border-top: 1px solid var(--border); }
.agenda li:first-child { border-top: 0; }
.agenda .nr { font-family: var(--font-mono); font-size: var(--fs-lg); color: var(--muted); }
.agenda .rubrik { font-weight: var(--fw-semibold); }
.agenda .underlag { color: var(--muted); font-size: var(--fs-sm); margin: 0.25rem 0 0; white-space: pre-wrap; }
.agenda .verktyg { display: flex; gap: 0.35rem; align-items: center; }
.agenda .verktyg button { padding: 0.3rem 0.55rem; font-size: var(--fs-sm); background: transparent;
  color: var(--link); border: 1px solid var(--border); }
.agenda .verktyg button:hover { background: var(--bg); }
.agenda .verktyg button.fara { color: var(--error); }

.empty { color: var(--muted); padding: 1.5rem 0; }
.inline-form { display: flex; gap: 0.5rem; align-items: flex-end; flex-wrap: wrap; }
.inline-form .field { margin: 0; flex: 1; min-width: 14rem; }
table.moten { width: 100%; border-collapse: collapse; }
table.moten th, table.moten td { text-align: left; padding: 0.6rem 0.5rem; border-bottom: 1px solid var(--border); }
table.moten th { color: var(--muted); font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: var(--tracking-wide); }

/* ---------- BankID: autostart är den primära vägen på samma enhet ---------- */
.btn-bankid {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.6rem;
  width: 100%;
  font-weight: var(--fw-semibold);
  color: var(--btn-fg);
  background: var(--accent);
  border-radius: var(--radius-sm);
  padding: 0.8rem 1.2rem;
  margin: 0.25rem 0 0.75rem;
  text-decoration: none;
  transition: background-color 120ms ease, transform 120ms ease;
}
.btn-bankid:hover { background: var(--accent-hover); }
.btn-bankid:active { transform: translateY(1px); }

.bankid-hint { color: var(--muted); font-size: var(--fs-sm); margin: 0 0 1rem; }

/* ---------- Kopiera-länken: bevarad (WCAG 1.1.1) men infälld ----------
   Den ska inte konkurrera visuellt med QR-koden och autostart-knappen, som är de vägar
   de flesta använder. <details> ger tangentbords- och skärmläsaråtkomst utan egen JS. */
.copy-details { margin: 0.25rem 0 0.5rem; text-align: left; }
.copy-details > summary {
  cursor: pointer;
  color: var(--muted);
  font-size: var(--fs-sm);
  padding: 0.35rem 0;
  list-style: none;
}
.copy-details > summary::-webkit-details-marker { display: none; }
.copy-details > summary::before { content: "▸ "; }
.copy-details[open] > summary::before { content: "▾ "; }
.copy-details > summary:hover { color: var(--fg); }
.copy-help { color: var(--muted); font-size: var(--fs-sm); margin: 0.25rem 0 0.5rem; }

.copy-row { display: flex; gap: 0.5rem; margin: 0.5rem 0 0.5rem; }
.copy-row input {
  flex: 1;
  min-width: 0;
  font: inherit;
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  padding: 0.45rem 0.6rem;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--bg);
  color: var(--fg);
}
.copy-row button { padding: 0.45rem 0.8rem; white-space: nowrap; }

/* QR-koden är ett <button>-element (BankID:s tillgänglighetskrav) men ska inte se ut som
   en knapp — accentfärgad yta bakom en QR-kod vore dessutom en kontrastrisk vid avläsning. */
.qr-btn {
  display: block;
  margin: 0 auto;
  padding: 0;
  border: 0;
  background: none;
  cursor: zoom-in;
  border-radius: var(--radius-sm);
  transition: none;
}
.qr-btn:hover, .qr-btn:active { background: none; transform: none; }

/* ⚠️ Färgerna får ALDRIG inverteras — uttrycklig BankID-regel, och en inverterad kod är
   svårare att läsa av. Därför vit yta och svart kod även i mörkt läge. */
.qr {
  display: block;
  margin: 0 auto 0.75rem;
  width: 256px;
  height: 256px;
  background: #fff;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  padding: 8px;
  image-rendering: pixelated;
}

.status { color: var(--muted); margin: 1rem 0 0.5rem; }
.status.error { color: var(--error); }

.htmx-request .qr { opacity: 0.6; }


/* synlig fokusindikator (WCAG 2.4.7) */
a:focus-visible, button:focus-visible, input:focus-visible, textarea:focus-visible,
summary:focus-visible, .btn:focus-visible, .btn-bankid:focus-visible {
  outline: 3px solid var(--focus);
  outline-offset: 2px;
}

/* Respektera reducerad rörelse (WCAG 2.3.3) */
@media (prefers-reduced-motion: reduce) {
  button, .btn, .btn-bankid { transition: none; }
  button:active, .btn:active, .btn-bankid:active { transform: none; }
}

.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
}

/* ---------- QR i fullskärm (BankID:s tillgänglighetskrav) ----------
   <dialog> valdes framför Fullscreen-API:t: det ger fokusfälla och Esc utan egen JS, och
   fungerar likadant på iOS där requestFullscreen är begränsat. */
.qr-modal {
  border: 0;
  padding: 1.5rem;
  border-radius: var(--radius);
  background: #fff;              /* aldrig inverterad, se ovan */
  color: var(--ink);
  max-width: min(96vw, 96vh);
  box-shadow: var(--shadow);
}
.qr-modal::backdrop { background: rgba(20, 24, 43, 0.75); }
.qr-full {
  /* Så stor som skärmen tillåter, kvadratisk. Ingen uppskalning över källans upplösning
     som gör kanterna oskarpa och avläsningen sämre. */
  width: min(80vw, 80vh, 512px);
  height: min(80vw, 80vh, 512px);
  margin: 0 auto 1rem;
}
.qr-modal__close { display: block; margin: 0 auto; }

/* Erbjudandet om en ny QR-kod, avslöjat efter 25 s (BankID:s order gäller 30 s).
   Diskret: den ska inte konkurrera med QR-koden så länge den nuvarande fungerar. */
.qr-extend {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.4rem;
  margin: 0 0 0.75rem;
}
.qr-extend__btn { padding: 0.45rem 0.9rem; font-size: var(--fs-sm); }

/* ---------- QR i fullskärm (BankID:s tillgänglighetskrav) ----------
   <dialog> valdes framför Fullscreen-API:t: det ger fokusfälla och Esc utan egen JS, och
   fungerar likadant på iOS där requestFullscreen är begränsat. */
.qr-modal {
  border: 0;
  padding: 1.5rem;
  border-radius: var(--radius);
  background: #fff;              /* aldrig inverterad, se ovan */
  color: var(--ink);
  max-width: min(96vw, 96vh);
  box-shadow: var(--shadow);
}
.qr-modal::backdrop { background: rgba(20, 24, 43, 0.75); }
.qr-full {
  /* Så stor som skärmen tillåter, kvadratisk. Ingen uppskalning över källans upplösning
     som gör kanterna oskarpa och avläsningen sämre. */
  width: min(80vw, 80vh, 512px);
  height: min(80vw, 80vh, 512px);
  margin: 0 auto 1rem;
}
.qr-modal__close { display: block; margin: 0 auto; }

/* Erbjudandet om en ny QR-kod, avslöjat efter 25 s (BankID:s order gäller 30 s).
   Diskret: den ska inte konkurrera med QR-koden så länge den nuvarande fungerar. */
.qr-extend {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.4rem;
  margin: 0 0 0.75rem;
}
.qr-extend__btn { padding: 0.45rem 0.9rem; font-size: var(--fs-sm); }

/* Förhandsvisning av vad en mötesmall ger. Att se dagordningen INNAN mötet skapas är
   poängen — annars upptäcks en felvald mall först när punkterna redan ligger där. */
.agenda-preview { margin: 0.25rem 0 0.5rem 1.25rem; padding: 0; color: var(--muted); font-size: var(--fs-sm); }
.agenda-preview li { margin: 0.15rem 0; }
select { font: inherit; width: 100%; padding: 0.55rem 0.65rem; border: 1px solid var(--border);
  border-radius: var(--radius-sm); background: var(--bg); color: var(--fg); }

/* Läget ska synas direkt — det avgör vad man får göra på sidan. */
.tag.lage-utkast { background: var(--slate-200); color: var(--slate-700); }
.tag.lage-kallad { background: #FDF0D5; color: #7A5200; }
.tag.lage-pagaende { background: #DCF3E6; color: #17603E; }
.tag.lage-avslutat { background: var(--slate-200); color: var(--slate-500); }
@media (prefers-color-scheme: dark) {
  .tag.lage-utkast, .tag.lage-avslutat { background: #2E3450; color: var(--slate-300); }
  .tag.lage-kallad { background: #4A3A1A; color: #F5D08A; }
  .tag.lage-pagaende { background: #1C3A2C; color: #7FD8A4; }
}
.beslut { margin: 0.35rem 0 0; }

/* ---- Meddelanderutor --------------------------------------------------- */

/* .banner användes redan av mötessidans felmeddelande men saknade stil helt — texten kom ut
   som vanlig brödtext, alltså utan den visuella skillnad som gör ett fel till ett fel för den
   som inte läser med skärmläsare. role="alert" satt rätt, men det hjälper bara halva publiken. */
.banner { padding: .75rem 1rem; border-radius: var(--radius-sm); border: 1px solid var(--border);
  margin: 1rem 0; }
.banner.error { border-color: var(--error); color: var(--error); background: color-mix(in srgb, var(--error) 8%, transparent); }
.banner.ok { border-color: var(--ok-fg); color: var(--ok-fg); background: var(--ok-bg); }

/* ---- Underskrift ------------------------------------------------------- */

/* De nya lägena ska gå att skilja åt på en lista. Signering pågår är avsiktligt varm — den
   signalerar att något väntar på en handling — medan signerat är avslutat och lugnt. Samma
   par som kallad respektive pagaende, vars kontraster redan är räknade. */
.tag.lage-signering { background: #FDF0D5; color: #7A5200; }
.tag.lage-signerat { background: #DCF3E6; color: #17603E; }
@media (prefers-color-scheme: dark) {
  .tag.lage-signering { background: #4A3A1A; color: #F5D08A; }
  .tag.lage-signerat { background: #1C3A2C; color: #7FD8A4; }
}

.btn, .btn-primary, .btn-danger {
  display: inline-block; padding: .55rem 1rem; border-radius: var(--radius-sm);
  border: 1px solid var(--border); background: var(--card); color: var(--fg);
  font: inherit; text-decoration: none; cursor: pointer;
}
.btn:hover { border-color: var(--accent); }
.btn-primary { background: var(--accent); border-color: var(--accent); color: var(--btn-fg); }
.btn-primary:hover { background: var(--accent-hover); border-color: var(--accent-hover); }

/* Återkallandet raderar avgivna underskrifter. Knappen ska se ut som det den gör — en neutral
   knapp här hade inbjudit till ett klick som inte går att ångra. */
.btn-danger { border-color: var(--error); color: var(--error); background: transparent; }
.btn-danger:hover { background: color-mix(in srgb, var(--error) 8%, transparent); }
.danger-form { margin-top: 1.5rem; display: flex; gap: .75rem; align-items: center; flex-wrap: wrap; }

.sign-table { width: 100%; border-collapse: collapse; margin: 1rem 0; }
.sign-table th, .sign-table td { text-align: left; padding: .6rem .5rem;
  border-bottom: 1px solid var(--border); vertical-align: middle; }
.sign-table th { font-size: var(--fs-xs); text-transform: uppercase;
  letter-spacing: var(--tracking-wide); color: var(--muted); }
.sign-roll { margin-bottom: .75rem; }
.ok { color: var(--ok-fg); }

/* Hashen ska gå att jämföra tecken för tecken mot den som visas i BankID-appen. Den bryts
   därför var som helst och sätts i fast bredd — annars är den oläsbar på en telefon, och då
   görs jämförelsen inte alls. */
.sha code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: var(--fs-xs); word-break: break-all; }
