/* datum tokens — bundled for static deploy */

/* ============================================================
   datum · color tokens
   Discipline: ambient activity is gray. Color is semantic and
   scarce — amber = contract surface + live epoch, red = breaking
   delta + fence, blue = advisory, green = reconciled + synced.
   No other use of these hues anywhere.
   ============================================================ */

:root {
  /* ---- base neutrals (dark-first) ---- */
  --ink-900: #0B0B0C;   /* app background */
  --ink-850: #0E0E10;   /* inset wells, code blocks */
  --ink-800: #151517;   /* surface / cards */
  --ink-750: #1C1C1F;   /* raised / hover surface */
  --ink-700: #26262A;   /* hairline border */
  --ink-600: #34343A;   /* strong border */
  --ink-500: #66666C;   /* tertiary text, disabled glyphs */
  --ink-400: #87878E;
  --ink-300: #A0A0A6;   /* secondary text */
  --ink-100: #F2F1EC;   /* primary text */

  /* ---- semantic signal hues ---- */
  --amber: #F5A623;     /* contract-surface activity, live epoch */
  --amber-soft: #C98412;
  --red:   #E5484D;     /* breaking delta, fenced write */
  --red-soft: #C13438;
  --blue:  #4D8DF6;     /* advisory */
  --blue-soft: #3A6FD0;
  --green: #2FA46C;     /* reconciled, synced */
  --green-soft: #248255;

  /* ============ semantic surface aliases (dark) ============ */
  --bg-base:      var(--ink-900);
  --bg-inset:     var(--ink-850);
  --surface-card: var(--ink-800);
  --surface-raised: var(--ink-750);
  --surface-overlay: #1A1A1D;

  --border-hairline: var(--ink-700);
  --border-strong:   var(--ink-600);
  --border-focus:    var(--ink-300);

  --text-primary:   var(--ink-100);
  --text-secondary: var(--ink-300);
  --text-tertiary:  var(--ink-500);
  --text-disabled:  #4A4A50;
  --text-on-accent: #0B0B0C;

  /* signal text / fill / faint tint (tints are low-alpha so they
     stay calm against the neutral field) */
  --signal-amber: var(--amber);
  --signal-amber-tint: color-mix(in srgb, var(--amber) 14%, transparent);
  --signal-amber-line: color-mix(in srgb, var(--amber) 38%, transparent);

  --signal-red: #F0686C;
  --signal-red-tint: color-mix(in srgb, var(--red) 15%, transparent);
  --signal-red-line: color-mix(in srgb, var(--red) 40%, transparent);

  --signal-blue: #6BA1F8;
  --signal-blue-tint: color-mix(in srgb, var(--blue) 15%, transparent);
  --signal-blue-line: color-mix(in srgb, var(--blue) 40%, transparent);

  --signal-green: #3FBE80;
  --signal-green-tint: color-mix(in srgb, var(--green) 15%, transparent);
  --signal-green-line: color-mix(in srgb, var(--green) 40%, transparent);

  /* presence ring (sessions parked on a contract) */
  --presence-ring: var(--ink-600);

  color-scheme: dark;
}

/* ================= light variant ================= */
[data-theme="light"] {
  --bg-base:      #FAFAF8;
  --bg-inset:     #F1F0EA;
  --surface-card: #FFFFFF;
  --surface-raised: #F6F5F1;
  --surface-overlay: #FFFFFF;

  --border-hairline: #E6E5DE;
  --border-strong:   #D4D3CA;
  --border-focus:    #1A1A1C;

  --text-primary:   #1A1A1C;
  --text-secondary: #56565C;
  --text-tertiary:  #8A8A90;
  --text-disabled:  #B4B4B0;
  --text-on-accent: #FFFFFF;

  --signal-amber: #B5760A;
  --signal-amber-tint: color-mix(in srgb, var(--amber) 16%, transparent);
  --signal-amber-line: color-mix(in srgb, var(--amber) 50%, transparent);

  --signal-red: #CE363B;
  --signal-red-tint: color-mix(in srgb, var(--red) 12%, transparent);
  --signal-red-line: color-mix(in srgb, var(--red) 45%, transparent);

  --signal-blue: #2F6BD4;
  --signal-blue-tint: color-mix(in srgb, var(--blue) 12%, transparent);
  --signal-blue-line: color-mix(in srgb, var(--blue) 45%, transparent);

  --signal-green: #1F8A57;
  --signal-green-tint: color-mix(in srgb, var(--green) 13%, transparent);
  --signal-green-line: color-mix(in srgb, var(--green) 45%, transparent);

  --presence-ring: #D4D3CA;

  color-scheme: light;
}


/* ============================================================
   datum · type tokens
   Geist for UI prose. Geist Mono for EVERY identifier —
   contract names, file paths, versions, timestamps, deltas.
   Identifiers are never set in proportional type.
   ============================================================ */

:root {
  --font-sans: "Geist", "Helvetica Neue", -apple-system, system-ui, sans-serif;
  --font-mono: "Geist Mono", "SF Mono", "JetBrains Mono", ui-monospace, monospace;
  /* marketing display only — hero headlines, wordmarks on swag. never UI chrome or identifiers */
  --font-pixel: "Geist Pixel", "Geist Mono", ui-monospace, monospace;

  /* weights */
  --fw-regular: 400; /* @kind font */
  --fw-medium: 500; /* @kind font */
  --fw-semibold: 600; /* @kind font */
  --fw-bold: 700; /* @kind font */

  /* type scale — compact, dev-tool density.
     Display sizes are for marketing / TV mode only. */
  --text-display: 44px;   /* hero / TV mode headline */
  --text-h1: 28px;
  --text-h2: 22px;
  --text-h3: 17px;
  --text-body: 14px;      /* default UI prose */
  --text-sm: 13px;
  --text-xs: 12px;
  --text-2xs: 11px;       /* chip labels, metadata */

  /* mono identifier sizes (slightly smaller optical match to sans) */
  --mono-md: 13px;
  --mono-sm: 12px;
  --mono-xs: 11px;

  --lh-tight: 1.15; /* @kind font */
  --lh-snug: 1.3; /* @kind font */
  --lh-normal: 1.5; /* @kind font */

  /* tracking — tighten display, open up mono caps/labels */
  --tracking-display: -0.02em;
  --tracking-tight: -0.01em;
  --tracking-normal: 0;
  --tracking-mono: 0;
  --tracking-label: 0.06em;   /* uppercase section eyebrows */
}


/* ============================================================
   datum · spacing, radii, borders, motion
   Compact density · 6–8px corner radii · 1px hairline borders
   No elevation shadows. Motion only on real events.
   ============================================================ */

:root {
  /* spacing — 4px base grid */
  --space-0: 0;
  --space-1: 2px;
  --space-2: 4px;
  --space-3: 6px;
  --space-4: 8px;
  --space-5: 12px;
  --space-6: 16px;
  --space-7: 20px;
  --space-8: 24px;
  --space-9: 32px;
  --space-10: 40px;
  --space-12: 56px;
  --space-16: 80px;

  /* radii — 6 to 8px is the house range */
  --radius-xs: 3px;   /* chips, tags, inline tokens */
  --radius-sm: 5px;   /* inputs, small buttons */
  --radius-md: 7px;   /* cards, panels, buttons */
  --radius-lg: 9px;   /* large surfaces, dialogs */
  --radius-pill: 999px;
  --radius-round: 50%;

  /* borders — always 1px hairlines, no shadows */
  --border-width: 1px;
  --border: 1px solid var(--border-hairline);
  --border-strong-rule: 1px solid var(--border-strong);

  /* the only "elevation": a hairline + faint inset, never a drop shadow */
  --ring-faint: inset 0 0 0 1px var(--border-hairline);
  --ring-focus: 0 0 0 2px color-mix(in srgb, var(--border-focus) 55%, transparent);

  /* motion — purposeful, event-driven. crisp easing, short durations */
  --ease-out: cubic-bezier(0.22, 1, 0.36, 1); /* @kind other */
  --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1); /* @kind other */
  --dur-instant: 80ms; /* @kind other */
  --dur-fast: 130ms; /* @kind other */
  --dur-base: 200ms; /* @kind other */
  --dur-slow: 340ms; /* @kind other */

  /* layout */
  --rail-width: 320px;
  --epoch-strip-height: 44px;
  --topbar-height: 52px;
  --content-max: 1440px;
}


/* ============================================================
   datum · base
   Minimal element resets + the two primitives every surface
   relies on: .mono (identifiers) and the app field defaults.
   Keep this thin — tokens live in tokens/*.css.
   ============================================================ */

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

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

body {
  margin: 0;
  font-family: var(--font-sans);
  font-size: var(--text-body);
  line-height: var(--lh-normal);
  font-weight: var(--fw-regular);
  letter-spacing: var(--tracking-tight);
  color: var(--text-primary);
  background: var(--bg-base);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
}

/* every identifier — contract names, paths, versions, timestamps */
.mono,
code, kbd, samp, pre {
  font-family: var(--font-mono);
  font-feature-settings: "tnum" 1, "zero" 1;
  letter-spacing: var(--tracking-mono);
}

a { color: inherit; text-decoration: none; }

::selection { background: color-mix(in srgb, var(--amber) 30%, transparent); }

/* uppercase section eyebrow used across tower surfaces */
.eyebrow {
  font-family: var(--font-mono);
  font-size: var(--text-2xs);
  font-weight: var(--fw-medium);
  letter-spacing: var(--tracking-label);
  text-transform: uppercase;
  color: var(--text-tertiary);
}

/* thin custom scrollbars to match the dev-tool field */
* { scrollbar-width: thin; scrollbar-color: var(--border-strong) transparent; }
*::-webkit-scrollbar { width: 9px; height: 9px; }
*::-webkit-scrollbar-thumb {
  background: var(--border-strong);
  border-radius: var(--radius-pill);
  border: 2px solid transparent;
  background-clip: padding-box;
}
*::-webkit-scrollbar-track { background: transparent; }


/* ============================================================
   datum · webfonts — Geist + Geist Mono (OFL, self-hosted woff2)
   Official Vercel v1.7.2 builds. License: ./assets/fonts/OFL.txt
   More weights/italics available in uploads/geist-font-v1.7.2/.
   ============================================================ */

@font-face {
  font-family: "Geist";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("./assets/fonts/geist-400.woff2") format("woff2");
}
@font-face {
  font-family: "Geist";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("./assets/fonts/geist-500.woff2") format("woff2");
}
@font-face {
  font-family: "Geist";
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url("./assets/fonts/geist-600.woff2") format("woff2");
}
@font-face {
  font-family: "Geist";
  font-style: normal;
  font-weight: 700;
  font-display: swap;
  src: url("./assets/fonts/geist-700.woff2") format("woff2");
}

/* Geist Pixel — display face for MARKETING SURFACES ONLY.
   Never in product UI chrome, never for identifiers. */
@font-face {
  font-family: "Geist Pixel";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("./assets/fonts/geistpixel-square.woff2") format("woff2");
}

@font-face {
  font-family: "Geist Mono";
  font-style: normal;
  font-weight: 400;
  font-display: swap;
  src: url("./assets/fonts/geistmono-400.woff2") format("woff2");
}
@font-face {
  font-family: "Geist Mono";
  font-style: normal;
  font-weight: 500;
  font-display: swap;
  src: url("./assets/fonts/geistmono-500.woff2") format("woff2");
}
@font-face {
  font-family: "Geist Mono";
  font-style: normal;
  font-weight: 600;
  font-display: swap;
  src: url("./assets/fonts/geistmono-600.woff2") format("woff2");
}
