/*
 * Fimblo style, v1
 * Mattias Jansson / Fimblo Consulting AB
 *
 * Warm and quiet: ink on paper, one deep glaze-green accent, one clay accent.
 * No web fonts. Light and dark themes. WCAG 2.1 AA contrast.
 *
 * Theme: follows the OS by default. <html data-theme="light|dark"> overrides.
 * Inside a page, .theme-dark / .theme-light flip a single section.
 *
 * v1 is only ever changed additively. Breaking changes go in /v2/.
 */

/* ============================================================
   1. Tokens
   ============================================================ */

:root,
.theme-light {
  color-scheme: light;

  /* surfaces */
  --paper:        #F6F3EE;  /* page ground, unglazed stoneware */
  --surface:      #FDFCFA;  /* cards, panels, inputs */
  --sunken:       #EDE8E0;  /* wells, code, table stripes */
  --line:         #DCD5CA;  /* hairlines, dividers */
  --line-strong:  #857D71;  /* input borders, focusable edges (3:1) */

  /* ink */
  --ink:          #262420;  /* body text, headings */
  --ink-2:        #545049;  /* secondary text */
  --ink-3:        #6E685F;  /* captions, meta, placeholders */
  --on-accent:    #FFFFFF;  /* text on filled accent/clay/danger */

  /* brand */
  --accent:       #1E5E5B;  /* deep celadon: links, primary actions, selection */
  --accent-hover: #174B49;
  --accent-tint:  #E1ECE9;
  --clay:         #9E4F2C;  /* secondary accent: highlights, emphasis, "the other side" */
  --clay-tint:    #F5E6DD;

  /* status: always paired with an icon or a word */
  --ok:           #3D6E28;
  --ok-tint:      #E6EEDD;
  --warn:         #8A5F00;
  --warn-tint:    #F6ECD4;
  --danger:       #A33228;
  --danger-tint:  #F7E1DD;

  /* data: categorical, fixed order, validated (see GUIDE.md) */
  --data-1:       #008B7C;  /* glaze green */
  --data-2:       #C0603A;  /* clay */
  --data-3:       #4F66C2;  /* cobalt */
  --data-4:       #B8871A;  /* ochre */
  --data-5:       #9A4C8A;  /* plum */
  --data-6:       #5F8A1E;  /* moss */
  --data-neutral: #A39B8F;  /* "other", "no answer", hollow marks */

  --shadow-1: 0 1px 2px rgb(38 36 32 / .06), 0 1px 1px rgb(38 36 32 / .04);
  --shadow-2: 0 4px 16px rgb(38 36 32 / .10), 0 1px 3px rgb(38 36 32 / .06);
}

/* Dark tokens appear twice: once for the OS setting, once for the explicit
   toggle. Keep the two blocks identical (tools/check.py verifies this). */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    color-scheme: dark;
    --paper:        #1A1917;
    --surface:      #23211E;
    --sunken:       #141312;
    --line:         #393631;
    --line-strong:  #7A7369;
    --ink:          #EDE8DF;
    --ink-2:        #C2BBAF;
    --ink-3:        #A0998D;
    --on-accent:    #1A1917;
    --accent:       #7DBDB5;
    --accent-hover: #9ACFC9;
    --accent-tint:  #1D3331;
    --clay:         #E0916B;
    --clay-tint:    #3A2921;
    --ok:           #9CC47E;
    --ok-tint:      #243020;
    --warn:         #E2B552;
    --warn-tint:    #352B16;
    --danger:       #F0897C;
    --danger-tint:  #3C221F;
    --data-1:       #0E9486;
    --data-2:       #D0704A;
    --data-3:       #6F8DD6;
    --data-4:       #B08A2C;
    --data-5:       #B86DA8;
    --data-6:       #74993A;
    --data-neutral: #6F685E;
    --shadow-1: 0 1px 2px rgb(0 0 0 / .30);
    --shadow-2: 0 4px 16px rgb(0 0 0 / .40), 0 1px 3px rgb(0 0 0 / .30);
  }
}
:root[data-theme="dark"],
.theme-dark {
    color-scheme: dark;
    --paper:        #1A1917;
    --surface:      #23211E;
    --sunken:       #141312;
    --line:         #393631;
    --line-strong:  #7A7369;
    --ink:          #EDE8DF;
    --ink-2:        #C2BBAF;
    --ink-3:        #A0998D;
    --on-accent:    #1A1917;
    --accent:       #7DBDB5;
    --accent-hover: #9ACFC9;
    --accent-tint:  #1D3331;
    --clay:         #E0916B;
    --clay-tint:    #3A2921;
    --ok:           #9CC47E;
    --ok-tint:      #243020;
    --warn:         #E2B552;
    --warn-tint:    #352B16;
    --danger:       #F0897C;
    --danger-tint:  #3C221F;
    --data-1:       #0E9486;
    --data-2:       #D0704A;
    --data-3:       #6F8DD6;
    --data-4:       #B08A2C;
    --data-5:       #B86DA8;
    --data-6:       #74993A;
    --data-neutral: #6F685E;
    --shadow-1: 0 1px 2px rgb(0 0 0 / .30);
    --shadow-2: 0 4px 16px rgb(0 0 0 / .40), 0 1px 3px rgb(0 0 0 / .30);
}

:root {
  /* type: system fonts only, chosen to be good on Windows first */
  --font-sans:  "Segoe UI", -apple-system, BlinkMacSystemFont, system-ui, "Helvetica Neue", Arial, sans-serif;
  --font-serif: Charter, "Bitstream Charter", "Sitka Text", Cambria, Georgia, serif;
  --font-mono:  ui-monospace, "Cascadia Mono", Consolas, "SF Mono", Menlo, monospace;

  --text-xs:   0.8125rem;  /* 13 */
  --text-sm:   0.9375rem;  /* 15 */
  --text-md:   1.0625rem;  /* 17, body */
  --text-lg:   1.25rem;    /* 20 */
  --text-xl:   clamp(1.375rem, 1.1rem + 1vw, 1.75rem);
  --text-2xl:  clamp(1.75rem, 1.3rem + 2vw, 2.5rem);
  --text-3xl:  clamp(2.25rem, 1.5rem + 3.5vw, 4rem);
  --text-hero: clamp(3rem, 1.5rem + 7vw, 7rem);

  /* space: 4px base */
  --s-1: 0.25rem;
  --s-2: 0.5rem;
  --s-3: 0.75rem;
  --s-4: 1rem;
  --s-5: 1.5rem;
  --s-6: 2rem;
  --s-7: 3rem;
  --s-8: 4.5rem;

  --radius-sm: 4px;
  --radius:    8px;
  --radius-lg: 14px;
  --radius-pill: 999px;

  --measure: 66ch;         /* max line length for reading */
  --page-max: 72rem;
  --gutter: clamp(1rem, 4vw, 3rem);

  --ease: cubic-bezier(.2, .6, .2, 1);
  --dur: 160ms;
}

/* ============================================================
   2. Base
   ============================================================ */

*, *::before, *::after { box-sizing: border-box; }

html {
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
}

body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--font-sans);
  font-size: var(--text-md);
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
}

.theme-dark, .theme-light { background: var(--paper); color: var(--ink); }

h1, h2, h3, h4 {
  margin: 0 0 var(--s-3);
  font-weight: 600;
  line-height: 1.15;
  letter-spacing: -0.01em;
  text-wrap: balance;
}
:where(h2, h3, h4):not(:first-child) { margin-top: 1.6em; }
h1 { font-size: var(--text-3xl); letter-spacing: -0.02em; }
h2 { font-size: var(--text-2xl); }
h3 { font-size: var(--text-xl); }
h4 { font-size: var(--text-lg); }

p, ul, ol, dl, blockquote, pre, table, figure { margin: 0 0 var(--s-4); }
p { max-width: var(--measure); text-wrap: pretty; }
ul, ol { padding-left: 1.3em; }
li + li { margin-top: var(--s-1); }

a {
  color: var(--accent);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 0.18em;
}
a:hover { color: var(--accent-hover); text-decoration-thickness: 2px; }

strong, b { font-weight: 600; }
small { font-size: var(--text-sm); }
hr { border: 0; border-top: 1px solid var(--line); margin: var(--s-6) 0; }
img, svg, video { max-width: 100%; height: auto; }

::selection { background: var(--accent-tint); color: var(--ink); }

:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
  border-radius: var(--radius-sm);
}

code, kbd, samp, pre { font-family: var(--font-mono); font-size: 0.9em; }
code {
  background: var(--sunken);
  padding: 0.1em 0.35em;
  border-radius: var(--radius-sm);
}
pre {
  background: var(--sunken);
  padding: var(--s-4);
  border-radius: var(--radius);
  overflow-x: auto;
  line-height: 1.45;
}
pre code { background: none; padding: 0; }
kbd {
  border: 1px solid var(--line-strong);
  border-bottom-width: 2px;
  border-radius: var(--radius-sm);
  padding: 0 0.35em;
  background: var(--surface);
}

blockquote {
  margin-left: 0;
  padding-left: var(--s-4);
  border-left: 3px solid var(--clay);
  color: var(--ink-2);
}

/* Long-form reading. Serif body, sans headings. */
.prose { font-family: var(--font-serif); font-size: 1.125rem; line-height: 1.6; }
.prose h1, .prose h2, .prose h3, .prose h4 { font-family: var(--font-sans); margin-top: 1.6em; }
.prose > :first-child { margin-top: 0; }

/* Small helpers for text */
.lead { font-size: var(--text-lg); color: var(--ink-2); max-width: 48ch; }
.muted { color: var(--ink-3); }
.hero { font-size: var(--text-hero); font-weight: 700; line-height: 0.95; letter-spacing: -0.03em; }
.accent-text { color: var(--accent); }
.clay-text { color: var(--clay); }
.num { font-variant-numeric: tabular-nums; }
.visually-hidden {
  position: absolute !important; width: 1px; height: 1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap;
}

/* ============================================================
   3. Layout
   ============================================================ */

.page { max-width: var(--page-max); margin-inline: auto; padding-inline: var(--gutter); }
.stack > * + * { margin-top: var(--stack-gap, var(--s-4)); }
.stack > * { margin-bottom: 0; }
.cluster { display: flex; flex-wrap: wrap; gap: var(--cluster-gap, var(--s-2)); align-items: center; }
.grid {
  display: grid;
  gap: var(--grid-gap, var(--s-5));
  grid-template-columns: repeat(auto-fit, minmax(min(var(--grid-min, 16rem), 100%), 1fr));
}
.split {
  display: grid;
  gap: var(--s-6);
  grid-template-columns: repeat(auto-fit, minmax(min(22rem, 100%), 1fr));
  align-items: start;
}
.section { padding-block: var(--s-8); }

/* ============================================================
   4. Page chrome: header with logo slot, footer with attribution
   ============================================================ */

.site-header {
  display: flex; align-items: center; justify-content: space-between; gap: var(--s-4);
  padding-block: var(--s-4);
  border-bottom: 1px solid var(--line);
}

/* Logo slot: put an <img> or <svg> inside .brand-mark when a logo exists.
   Empty, it collapses and the wordmark stands alone. */
.brand {
  display: inline-flex; align-items: center; gap: var(--s-2);
  color: var(--ink); text-decoration: none;
  font-weight: 600; font-size: var(--text-lg); letter-spacing: -0.01em;
}
.brand:hover { color: var(--ink); }
.brand-mark { display: inline-flex; width: 1.75rem; height: 1.75rem; }
.brand-mark:empty { display: none; }
.brand-mark > img, .brand-mark > svg { width: 100%; height: 100%; }

.attribution {
  font-size: var(--text-xs);
  color: var(--ink-3);
  padding-block: var(--s-4);
}
.attribution a { color: inherit; }

/* ============================================================
   5. Components
   ============================================================ */

/* Buttons */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: var(--s-2);
  min-height: 2.5rem;
  padding: 0.5rem 1rem;
  font: inherit; font-size: var(--text-sm); font-weight: 600; line-height: 1.2;
  color: var(--ink);
  background: var(--surface);
  border: 1px solid var(--line-strong);
  border-radius: var(--radius);
  cursor: pointer;
  text-decoration: none;
  transition: background var(--dur) var(--ease), border-color var(--dur) var(--ease), color var(--dur) var(--ease);
}
.btn:hover { background: var(--sunken); color: var(--ink); text-decoration: none; }
.btn-primary { background: var(--accent); border-color: var(--accent); color: var(--on-accent); }
.btn-primary:hover { background: var(--accent-hover); border-color: var(--accent-hover); color: var(--on-accent); }
.btn-quiet { background: transparent; border-color: transparent; color: var(--accent); }
.btn-quiet:hover { background: var(--accent-tint); color: var(--accent); }
.btn-danger { background: var(--surface); border-color: var(--danger); color: var(--danger); }
.btn-danger:hover { background: var(--danger-tint); color: var(--danger); }
.btn[disabled], .btn[aria-disabled="true"] { opacity: .45; cursor: not-allowed; }
.btn[aria-pressed="true"] { background: var(--accent-tint); border-color: var(--accent); color: var(--accent); }
.btn-icon { min-width: 2.5rem; padding: 0.5rem; border-radius: var(--radius-pill); }

/* Chips: presets, filters, toggles */
.chip {
  display: inline-flex; align-items: center; gap: var(--s-1);
  padding: 0.3rem 0.8rem;
  font: inherit; font-size: var(--text-sm);
  color: var(--ink-2);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius-pill);
  cursor: pointer;
}
.chip:hover { border-color: var(--line-strong); color: var(--ink); }
.chip[aria-pressed="true"], .chip.is-on {
  background: var(--accent); border-color: var(--accent); color: var(--on-accent);
}

/* Tags: non-interactive labels */
.tag {
  display: inline-block;
  padding: 0.1rem 0.55rem;
  font-size: var(--text-xs); font-weight: 600;
  border-radius: var(--radius-pill);
  background: var(--sunken); color: var(--ink-2);
}
.tag-accent { background: var(--accent-tint); color: var(--accent); }
.tag-clay   { background: var(--clay-tint);   color: var(--clay); }

/* Cards and panels */
.card {
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  padding: var(--s-5);
  box-shadow: var(--shadow-1);
}
.card > :last-child { margin-bottom: 0; }
a.card { display: block; color: inherit; text-decoration: none; transition: border-color var(--dur) var(--ease); }
a.card:hover { border-color: var(--accent); color: inherit; }
.card-accent { border-top: 4px solid var(--accent); }
.card-clay   { border-top: 4px solid var(--clay); }
.well { background: var(--sunken); border-radius: var(--radius); padding: var(--s-4); }

/* Callouts: note, tip, warning, danger. Always start with a word. */
.callout {
  border-left: 4px solid var(--accent);
  background: var(--accent-tint);
  padding: var(--s-3) var(--s-4);
  border-radius: 0 var(--radius) var(--radius) 0;
  max-width: var(--measure);
}
.callout > :last-child { margin-bottom: 0; }
.callout-title { font-weight: 600; display: block; margin-bottom: var(--s-1); }
.callout-clay   { border-color: var(--clay);   background: var(--clay-tint); }
.callout-ok     { border-color: var(--ok);     background: var(--ok-tint); }
.callout-warn   { border-color: var(--warn);   background: var(--warn-tint); }
.callout-danger { border-color: var(--danger); background: var(--danger-tint); }
.callout-ok .callout-title     { color: var(--ok); }
.callout-warn .callout-title   { color: var(--warn); }
.callout-danger .callout-title { color: var(--danger); }

/* Pull quote / key principle */
.principle {
  font-size: var(--text-xl); font-weight: 600; line-height: 1.25;
  color: var(--clay);
  max-width: 32ch;
}

/* Tabs / segmented control (role="tablist" with buttons) */
.segmented {
  display: inline-flex; flex-wrap: wrap; gap: 2px;
  padding: 3px;
  background: var(--sunken);
  border-radius: var(--radius);
}
.segmented > button {
  font: inherit; font-size: var(--text-sm); font-weight: 600;
  padding: 0.4rem 0.9rem;
  border: 0; border-radius: calc(var(--radius) - 3px);
  background: transparent; color: var(--ink-2);
  cursor: pointer;
}
.segmented > button:hover { color: var(--ink); }
.segmented > button[aria-selected="true"],
.segmented > button[aria-pressed="true"] {
  background: var(--surface); color: var(--ink); box-shadow: var(--shadow-1);
}

/* Steps: a numbered sequence, e.g. phases */
.steps { list-style: none; padding: 0; display: flex; flex-wrap: wrap; gap: var(--s-2); counter-reset: step; }
.steps > li { margin: 0; counter-increment: step; }
.steps > li > button, .steps > li > a, .steps > li > span {
  display: flex; align-items: center; gap: var(--s-2);
  padding: 0.55rem 0.9rem;
  font: inherit; font-weight: 600; font-size: var(--text-sm);
  color: var(--ink); text-decoration: none;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  cursor: pointer;
}
.steps > li > *::before {
  content: counter(step);
  font-size: var(--text-lg); color: var(--clay); font-variant-numeric: tabular-nums;
}
.steps > li > [aria-selected="true"], .steps > li > [aria-current="step"] {
  background: var(--accent); border-color: var(--accent); color: var(--on-accent);
}
.steps > li > [aria-selected="true"]::before, .steps > li > [aria-current="step"]::before { color: inherit; }

/* Forms */
.field { display: grid; gap: var(--s-1); margin-bottom: var(--s-4); }
.field > label, .label { font-size: var(--text-sm); font-weight: 600; }
.hint { font-size: var(--text-xs); color: var(--ink-3); }
input:not([type="checkbox"], [type="radio"], [type="range"], [type="color"]),
select, textarea {
  font: inherit; font-size: var(--text-md);
  color: var(--ink);
  background: var(--surface);
  border: 1px solid var(--line-strong);
  border-radius: var(--radius);
  padding: 0.5rem 0.7rem;
  min-height: 2.5rem;
  width: 100%;
  max-width: 32rem;
}
textarea { min-height: 6rem; resize: vertical; line-height: 1.45; }
input::placeholder, textarea::placeholder { color: var(--ink-3); }
input:focus-visible, select:focus-visible, textarea:focus-visible { outline-offset: 0; border-color: var(--accent); }
input[type="checkbox"], input[type="radio"], input[type="range"] { accent-color: var(--accent); }
input[type="checkbox"], input[type="radio"] { width: 1.1rem; height: 1.1rem; vertical-align: -0.15em; }
[aria-invalid="true"] { border-color: var(--danger) !important; }

/* Tables */
.table-wrap { overflow-x: auto; }
table { border-collapse: collapse; width: 100%; font-size: var(--text-sm); }
th, td { text-align: left; padding: 0.55rem 0.75rem; border-bottom: 1px solid var(--line); vertical-align: top; }
th { font-weight: 600; color: var(--ink-2); border-bottom-color: var(--line-strong); }
td.num, th.num { text-align: right; font-variant-numeric: tabular-nums; }
tbody tr:hover { background: var(--sunken); }

/* Dots: the diagram vocabulary for people and positions */
.dot {
  display: inline-block; width: 0.9rem; height: 0.9rem;
  border-radius: 50%;
  background: var(--accent);
  vertical-align: -0.1em;
}
.dot-hollow { background: transparent; box-shadow: inset 0 0 0 2px var(--data-neutral); }
.dot-clay   { background: var(--clay); }
.dot-tint   { background: var(--clay-tint); box-shadow: inset 0 0 0 2px var(--clay); }
.dot-danger { background: var(--danger); }
.dot-ink    { background: var(--ink); }
.dot-ring   { box-shadow: 0 0 0 2px var(--paper), 0 0 0 4px var(--accent); }
.legend { display: flex; flex-wrap: wrap; gap: var(--s-2) var(--s-5); font-size: var(--text-sm); color: var(--ink-2); }
.legend > span { display: inline-flex; align-items: center; gap: var(--s-2); }

/* SVG helpers: use classes, never hard-coded hex, so charts follow the theme */
.fill-accent { fill: var(--accent); }   .stroke-accent { stroke: var(--accent); }
.fill-clay   { fill: var(--clay); }     .stroke-clay   { stroke: var(--clay); }
.fill-ink    { fill: var(--ink); }      .stroke-ink    { stroke: var(--ink); }
.fill-muted  { fill: var(--ink-3); }    .stroke-line   { stroke: var(--line); }
.fill-paper  { fill: var(--paper); }    .stroke-neutral{ stroke: var(--data-neutral); }
.fill-1 { fill: var(--data-1); } .fill-2 { fill: var(--data-2); } .fill-3 { fill: var(--data-3); }
.fill-4 { fill: var(--data-4); } .fill-5 { fill: var(--data-5); } .fill-6 { fill: var(--data-6); }

/* Theme toggle (see theme.js) */
.theme-toggle { font-size: var(--text-sm); }

/* ============================================================
   6. Motion, print, forced colours
   ============================================================ */

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    transition: none !important;
    animation: none !important;
    scroll-behavior: auto !important;
  }
}

@media print {
  /* :is() lifts specificity to match the dark-theme selectors above */
  :root:is(:root, [data-theme]), .theme-dark {
    color-scheme: light;
    --paper: #FFFFFF; --surface: #FFFFFF; --sunken: #F2F0EC;
    --ink: #000000; --ink-2: #333333; --ink-3: #555555;
    --line: #CCCCCC; --line-strong: #888888;
    --accent: #1E5E5B; --clay: #9E4F2C;
    --shadow-1: none; --shadow-2: none;
  }
  body { font-size: 11pt; }
  .no-print, .theme-toggle, .deck-controls, .deck-rail { display: none !important; }
  a[href^="http"]::after { content: " (" attr(href) ")"; font-size: 0.85em; color: var(--ink-3); }
  .card, .callout, pre, table, figure { break-inside: avoid; }
}

@media (forced-colors: active) {
  .dot, .chip[aria-pressed="true"], .btn-primary { forced-color-adjust: none; }
  .card, .callout { border: 1px solid CanvasText; }
}
