/* ============================================================================
   MAKING SOFTWARE: design language
   A technical-reference-manual aesthetic: near-monochrome, one electric blue
   accent, monospace technical labels over a clean sans body, blueprint line-art
   figures, dashed rules, generous whitespace.

   Usage: link this file from an artifact's <head>:
     <link rel="stylesheet" href="making-software.css">
   Fonts load via @import below (Satoshi for prose, JetBrains Mono for labels &
   code), so artifact HTML stays light. Source of truth for tokens:
   references/design-language.md
   ========================================================================== */

@import url('https://api.fontshare.com/v2/css?f[]=satoshi@400,500,700&display=swap');
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap');

:root {
  /* surfaces & ink */
  --ms-ground:  #fbfbfb;          /* page background (off-white) */
  --ms-paper:   #ffffff;          /* figure / card surface */
  --ms-ink:     #000000;          /* primary text */
  --ms-ink-2:   rgba(0,0,0,.60);  /* secondary text */
  --ms-ink-3:   rgba(0,0,0,.55);  /* muted / metadata; .55 keeps small mono labels at WCAG AA (.45 = 3.32:1, fails) */
  --ms-ink-4:   rgba(0,0,0,.18);  /* hairlines, dashes */

  /* the single accent */
  --ms-blue:        #1132ff;      /* electric blue (fallback) */
  --ms-blue-tint:   #e7ebff;      /* faint blue wash */

  /* type:
     --ms-sans : prose voice (titles, body, headings)
     --ms-mono : machine voice (labels, metadata, captions, tags, code)
     To make the technical labels sans instead of mono, point the label classes
     at --ms-sans, or just set --ms-mono to the same stack as --ms-sans. */
  --ms-sans: "Satoshi", ui-sans-serif, system-ui, -apple-system, sans-serif;
  --ms-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;

  /* rhythm */
  --ms-measure: 40rem;            /* narrow reading column (~640px) */
  --ms-wide:    62rem;            /* wide figures / dashboards */
  --ms-step:    1.6rem;           /* base vertical rhythm */
  --ms-pad:     clamp(1.25rem, 4vw, 3rem);
}

/* Use the perceptually-correct blue where supported (matches makingsoftware.com). */
@supports (color: oklch(0 0 0)) {
  :root {
    --ms-blue:      oklch(0.5058 0.2886 264.84);
    --ms-blue-tint: oklch(0.95 0.04 264.84);
  }
}

/* Dark "blueprint" variant: deep navy ground, light line-art. Set on <html>. */
[data-theme="dark"] {
  --ms-ground:    #0b0e15;
  --ms-paper:     #121724;
  --ms-ink:       #e9ebf2;
  --ms-ink-2:     rgba(233,235,242,.66);
  --ms-ink-3:     rgba(233,235,242,.46);
  --ms-ink-4:     rgba(233,235,242,.20);
  --ms-blue:      #6f8cff;
  --ms-blue-tint: rgba(111,140,255,.16);
}
@supports (color: oklch(0 0 0)) {
  [data-theme="dark"] {
    --ms-blue:      oklch(0.74 0.17 266);
    --ms-blue-tint: oklch(0.34 0.09 266);
  }
}

/* ── reset ─────────────────────────────────────────────────────────────── */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body {
  margin: 0;
  background: var(--ms-ground);
  color: var(--ms-ink);
  font-family: var(--ms-sans);
  font-size: 1.0625rem;           /* 17px */
  line-height: 1.7;
  font-feature-settings: "kern", "liga";
  counter-reset: ms-fig ms-note;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}
img, svg { max-width: 100%; }
::selection { background: var(--ms-blue); color: #fff; }

/* ── layout ────────────────────────────────────────────────────────────── */
.ms-page { padding: var(--ms-pad); }
.ms-col  { max-width: var(--ms-measure); margin-inline: auto; }
.ms-wide { max-width: var(--ms-wide);    margin-inline: auto; }
.ms-stack > * + * { margin-top: var(--ms-step); }
.ms-center { text-align: center; }

/* ── long-form document (one elegant scrolling page) ───────────────────── */
/* Sticky breadcrumb bar, like a real chapter. */
.ms-topbar {
  position: sticky; top: 0; z-index: 10;
  display: flex; justify-content: space-between; gap: 1rem;
  padding: .7rem clamp(1rem, 4vw, 2rem);
  background: color-mix(in srgb, var(--ms-ground) 90%, transparent);
  backdrop-filter: blur(8px);
  border-bottom: 1px dashed var(--ms-ink-4);
  font-family: var(--ms-mono); text-transform: uppercase;
  font-size: .64rem; letter-spacing: .14em; color: var(--ms-ink-3);
}
.ms-topbar .at { color: var(--ms-blue); }

/* The document column is wide; text holds a narrow measure while figures
   break out to the full width. That asymmetry is the signature of the look. */
.ms-doc { max-width: var(--ms-wide); margin-inline: auto; }
.ms-doc > header,
.ms-doc > p, .ms-doc > h2, .ms-doc > h3, .ms-doc > h4,
.ms-doc > ul, .ms-doc > ol, .ms-doc > dl,
.ms-doc > blockquote, .ms-doc > pre,
.ms-doc > table, .ms-doc > .ms-callout, .ms-doc > .ms-kicker {
  max-width: var(--ms-measure); margin-inline: auto;
}
.ms-doc > figure, .ms-doc > .ms-fig { max-width: 100%; margin-inline: auto; }
.ms-doc > h2 { scroll-margin-top: 3.5rem; }   /* clear the sticky bar on jump */

/* Presentation scale: a larger, board-facing single page (.ms-doc.present). */
.ms-doc.present { --ms-measure: 44rem; }
.ms-doc.present > header .ms-title { font-size: clamp(2.8rem, 7.5vw, 5rem); }
.ms-doc.present > header .ms-subtitle { font-size: 1.4rem; max-width: 42rem; }
.ms-doc.present > h2 { font-size: 2.15rem; margin-top: 3.6rem; }
.ms-doc.present > h3 { font-size: 1.4rem; }
.ms-doc.present > p, .ms-doc.present > ul, .ms-doc.present > ol { font-size: 1.2rem; }
.ms-doc.present > figure { margin-block: 2.8rem; }

/* Slides: a few full-panel slides stacked on one page (.ms-slides / .ms-slide).
   The whole story condensed, mostly visual. One big idea + one diagram each. */
.ms-slides { max-width: var(--ms-wide); margin-inline: auto; }
.ms-slide {
  min-height: 90vh;
  display: flex; flex-direction: column; justify-content: center;
  padding-block: 6vh;
  border-top: 1px dashed var(--ms-ink-4);
}
.ms-slide:first-child { border-top: 0; }
.ms-slide h2 {
  font-family: var(--ms-sans); font-weight: 700; letter-spacing: -.025em;
  font-size: clamp(2.4rem, 6vw, 4.2rem); line-height: 1.05; margin: .4rem 0 1.2rem;
}
.ms-slide .lead {
  font-size: clamp(1.2rem, 2.4vw, 1.55rem); color: var(--ms-ink-2);
  max-width: 48rem; margin: 0 0 1.5rem;
}
.ms-slide figure { background: transparent; margin: 1.2rem 0 0; }
.ms-slide img { max-width: 100%; display: block; }

/* ── masthead (mono, blue, the loud title) ─────────────────────────────── */
.ms-masthead {
  font-family: var(--ms-mono);
  font-weight: 500;
  color: var(--ms-blue);
  text-transform: uppercase;
  font-size: clamp(2rem, 7vw, 4rem);
  line-height: 1;
  letter-spacing: -.01em;
  margin: 0;
}

/* ── eyebrow / breadcrumb / metadata (tiny mono caps) ──────────────────── */
.ms-eyebrow,
.ms-meta,
.ms-byline {
  font-family: var(--ms-mono);
  text-transform: uppercase;
  font-size: .7rem;
  letter-spacing: .16em;
  color: var(--ms-ink-3);
  margin: 0;
}
.ms-eyebrow > .at { color: var(--ms-blue); }   /* highlight a breadcrumb segment */

/* ── editorial chapter header ──────────────────────────────────────────── */
.ms-title {
  font-family: var(--ms-sans);
  font-weight: 700;
  font-size: clamp(2.1rem, 5vw, 3.1rem);
  line-height: 1.08;
  letter-spacing: -.025em;
  text-align: center;
  margin: .2em 0 0;
}
.ms-subtitle {
  font-family: var(--ms-sans);
  font-weight: 400;
  font-size: 1.15rem;
  color: var(--ms-ink-2);
  text-align: center;
  max-width: 36rem;
  margin: .7rem auto 0;
}

/* ── body headings ─────────────────────────────────────────────────────── */
h2, .ms-h2 {
  font-family: var(--ms-sans);
  font-weight: 700;
  font-size: 1.55rem;
  line-height: 1.2;
  letter-spacing: -.02em;
  margin: 2.4rem 0 .6rem;
}
h3, .ms-h3 {
  font-family: var(--ms-sans);
  font-weight: 500;
  font-size: 1.18rem;
  margin: 1.8rem 0 .4rem;
}
/* Optional mono section label that sits above an h2, like a chapter part. */
.ms-kicker {
  font-family: var(--ms-mono);
  text-transform: uppercase;
  font-size: .68rem;
  letter-spacing: .18em;
  color: var(--ms-blue);
  margin: 0 0 .3rem;
}

/* ── body copy ─────────────────────────────────────────────────────────── */
p  { margin: 0 0 1rem; }
a  { color: var(--ms-blue); text-underline-offset: 2px; text-decoration-thickness: 1px; }
a:hover { text-decoration-thickness: 2px; }
strong { font-weight: 700; }
ul, ol { margin: 0 0 1rem; padding-left: 1.3rem; }
li { margin: .2rem 0; }
small { color: var(--ms-ink-3); }

blockquote {
  margin: 1.4rem 0;
  padding-left: 1rem;
  border-left: 2px solid var(--ms-blue);
  color: var(--ms-ink-2);
}

code, kbd, .ms-mono {
  font-family: var(--ms-mono);
  font-size: .85em;
}
code {
  background: var(--ms-blue-tint);
  padding: .08em .35em;
  border-radius: 2px;
}

/* ── dashed rules (the ╌╌╌ separators) ─────────────────────────────────── */
.ms-rule {
  height: 1px; border: 0; margin: var(--ms-step) auto;
  background-image: repeating-linear-gradient(
    to right, var(--ms-ink-4) 0 6px, transparent 6px 12px);
}
.ms-rule.short { width: 4rem; }   /* the little centered tick under a title */
.ms-rule.blue {
  background-image: repeating-linear-gradient(
    to right, var(--ms-blue) 0 6px, transparent 6px 12px);
}

/* ── figures + auto FIG_0NN numbering ──────────────────────────────────── */
figure, .ms-fig {
  counter-increment: ms-fig;
  margin: var(--ms-step) 0;
  background: var(--ms-paper);
}
figure.bleed, .ms-fig.bleed { background: transparent; }
figcaption, .ms-cap {
  font-family: var(--ms-mono);
  text-transform: uppercase;
  font-size: .66rem;
  letter-spacing: .1em;
  color: var(--ms-ink-3);
  line-height: 1.5;
  margin-top: .6rem;
}
figcaption::before, .ms-cap::before {
  content: "FIG_" counter(ms-fig, decimal-leading-zero) "  ";
  color: var(--ms-blue);
}
.ms-cap.nonum::before { content: none; }

/* Blueprint line-art container: inline SVGs draw with stroke=currentColor. */
.ms-blueprint {
  color: var(--ms-blue);
  background: var(--ms-paper);
  border: 1px solid var(--ms-ink-4);
  padding: clamp(1rem, 4vw, 2.5rem);
  display: grid;
  place-items: center;
}
.ms-blueprint svg { display: block; width: 100%; height: auto; }
.ms-blueprint svg [fill="bg"] { fill: var(--ms-paper); }   /* knock-out helper */

/* ── metadata grid (key/value, mono labels) ────────────────────────────── */
.ms-meta-grid {
  display: grid;
  grid-template-columns: max-content 1fr;
  gap: .35rem 1.5rem;
  font-size: .95rem;
}
.ms-meta-grid dt {
  font-family: var(--ms-mono);
  text-transform: uppercase;
  font-size: .66rem;
  letter-spacing: .1em;
  color: var(--ms-ink-3);
  align-self: center;
}
.ms-meta-grid dd { margin: 0; }

/* ── technical table ───────────────────────────────────────────────────── */
.ms-table { width: 100%; border-collapse: collapse; font-size: .95rem; }
.ms-table th {
  font-family: var(--ms-mono);
  text-transform: uppercase;
  font-size: .64rem;
  letter-spacing: .1em;
  color: var(--ms-ink-3);
  text-align: left;
  font-weight: 400;
  padding: .5rem .75rem;
  border-bottom: 1px solid var(--ms-ink);
}
.ms-table td {
  padding: .55rem .75rem;
  border-bottom: 1px dashed var(--ms-ink-4);
  vertical-align: top;
}
.ms-table tr:last-child td { border-bottom: 0; }

/* ── callout / requirement note ────────────────────────────────────────── */
.ms-callout {
  border: 1px solid var(--ms-ink-4);
  border-left: 3px solid var(--ms-blue);
  background: var(--ms-paper);
  padding: .9rem 1.1rem;
  margin: var(--ms-step) 0;
}
.ms-callout > .label {
  display: block;
  font-family: var(--ms-mono);
  text-transform: uppercase;
  font-size: .64rem;
  letter-spacing: .12em;
  color: var(--ms-blue);
  margin-bottom: .35rem;
}

/* ── tags / status pills (mono caps) ───────────────────────────────────── */
.ms-tag {
  display: inline-block;
  font-family: var(--ms-mono);
  text-transform: uppercase;
  font-size: .62rem;
  letter-spacing: .08em;
  line-height: 1;
  padding: .3em .5em;
  border: 1px solid currentColor;
  color: var(--ms-ink-2);
}
.ms-tag.blue  { color: var(--ms-blue); }
.ms-tag.solid { background: var(--ms-blue); border-color: var(--ms-blue); color: #fff; }

/* small inline color swatch */
.ms-swatch {
  display: inline-block; width: .85em; height: .85em;
  border: 1px solid var(--ms-ink-4); vertical-align: -.1em; margin-right: .35em;
}

/* ── numbered annotations (for UI previews) ────────────────────────────── */
.ms-annote {
  counter-increment: ms-note;
  display: inline-flex; align-items: center; justify-content: center;
  width: 1.5em; height: 1.5em;
  border: 1px solid var(--ms-blue); color: var(--ms-blue);
  border-radius: 50%;
  font-family: var(--ms-mono); font-size: .7rem; line-height: 1;
}
.ms-annote::before { content: counter(ms-note); }

/* ── device frame (for preview artifacts) ──────────────────────────────── */
.ms-device {
  border: 1px solid var(--ms-ink);
  background: var(--ms-paper);
  padding: 0;
  overflow: hidden;
}
.ms-device > .bar {
  display: flex; align-items: center; gap: .4rem;
  padding: .5rem .7rem;
  border-bottom: 1px solid var(--ms-ink-4);
  font-family: var(--ms-mono); font-size: .64rem;
  text-transform: uppercase; letter-spacing: .1em; color: var(--ms-ink-3);
}
.ms-device > .bar::before {
  content: ""; width: .55rem; height: .55rem;
  border: 1px solid var(--ms-ink); border-radius: 50%;
}

/* ── footer stamp ──────────────────────────────────────────────────────── */
.ms-stamp {
  font-family: var(--ms-mono);
  text-transform: uppercase;
  font-size: .66rem;
  letter-spacing: .16em;
  color: var(--ms-ink-3);
  text-align: center;
}

/* ── code blocks (JSON, payloads, canonical strings) ───────────────────── */
pre {
  font-family: var(--ms-mono);
  font-size: .8rem;
  line-height: 1.55;
  background: var(--ms-paper);
  border: 1px solid var(--ms-ink-4);
  border-left: 3px solid var(--ms-blue);
  padding: 1rem 1.1rem;
  margin: var(--ms-step) 0;
  overflow-x: auto;
}
pre code { background: none; padding: 0; font-size: inherit; }

/* ── table of contents (manual cover page) ─────────────────────────────── */
.ms-toc { list-style: none; padding: 0; margin: var(--ms-step) 0; }
.ms-toc li { border-top: 1px dashed var(--ms-ink-4); }
.ms-toc li:last-child { border-bottom: 1px dashed var(--ms-ink-4); }
.ms-toc a {
  display: flex; align-items: baseline; gap: 1rem;
  padding: .85rem .2rem; text-decoration: none; color: var(--ms-ink);
}
.ms-toc a:hover { color: var(--ms-blue); }
.ms-toc .num {
  font-family: var(--ms-mono); font-size: .7rem; letter-spacing: .1em;
  color: var(--ms-blue); min-width: 3rem;
}
.ms-toc .title { font-weight: 500; }
.ms-toc .desc { color: var(--ms-ink-3); font-size: .9rem; }
.ms-toc .words {
  margin-left: auto; font-family: var(--ms-mono); font-size: .62rem;
  letter-spacing: .1em; color: var(--ms-ink-3); text-transform: uppercase;
  white-space: nowrap;
}
.ms-toc li.draft a { color: var(--ms-ink-3); cursor: default; }

/* ── chapter nav (prev / contents / next) ──────────────────────────────── */
.ms-nav { display: flex; justify-content: space-between; gap: .6rem; margin-top: var(--ms-step); }
.ms-nav a {
  font-family: var(--ms-mono); text-transform: uppercase;
  font-size: .66rem; letter-spacing: .1em; text-decoration: none;
  color: var(--ms-ink-2); border: 1px solid var(--ms-ink-4); padding: .6rem .9rem;
}
.ms-nav a:hover { color: var(--ms-blue); border-color: var(--ms-blue); }
.ms-nav a.next { margin-left: auto; }
.ms-nav .arrow { color: var(--ms-blue); }

/* ── responsive ────────────────────────────────────────────────────────── */
@media (max-width: 640px) {
  body { font-size: 1rem; }
  .ms-meta-grid { grid-template-columns: 1fr; gap: .1rem 0; }
  .ms-meta-grid dt { margin-top: .6rem; }
}
