/* ============================================================
   GASPARI Design System — tokens (ported from claude.ai/design
   project "Tiston site" → gaspari-personal-site-design-system).
   Webfonts + colors + typography + spacing/motion + base resets.
   Dark is the default theme; [data-theme="light"] overrides the
   semantic layer only.
   ============================================================ */

/* --- Webfonts: Space Grotesk (display/UI) · JetBrains Mono (data) --- */
@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:ital,wght@0,400;0,500;0,700;1,400&display=swap');

:root {
  /* --- Brand accent: electric mint-green ("terminal phosphor") --- */
  --mint-100: #d6fff0;
  --mint-300: #7df5c6;
  --mint-400: #3ff5a8;
  --mint-500: #00e599;   /* primary accent */
  --mint-600: #00c281;
  --mint-700: #009966;

  /* --- Secondary accent: electric blue (links, info) --- */
  --blue-400: #6ea8ff;
  --blue-500: #4b8bff;
  --blue-600: #2f6fe6;

  /* --- Neutral ink scale (near-black → white) --- */
  --ink-950: #07090c;
  --ink-900: #0c0f14;
  --ink-850: #11151c;
  --ink-800: #161b24;
  --ink-700: #1e2530;
  --ink-600: #2a3340;
  --ink-500: #3b4654;
  --ink-400: #586475;
  --ink-300: #8a96a6;
  --ink-200: #b6c0cd;
  --ink-100: #dde3ea;
  --ink-050: #f1f4f7;
  --ink-000: #ffffff;

  /* --- Semantic status --- */
  --green-500: #00e599;
  --amber-500: #ffb84d;
  --red-500:   #ff5d5d;
  --cyan-500:  #4be3ff;

  /* --- Semantic aliases — default (DARK) --- */
  --bg-base:      var(--ink-950);
  --bg-canvas:    var(--ink-900);
  --surface-1:    var(--ink-850);
  --surface-2:    var(--ink-800);
  --surface-3:    var(--ink-700);
  --surface-hover:var(--ink-700);

  --border-subtle: var(--ink-700);
  --border-default:var(--ink-600);
  --border-strong: var(--ink-500);

  --text-primary:   var(--ink-050);
  --text-secondary: var(--ink-200);
  --text-muted:     var(--ink-300);
  --text-faint:     var(--ink-400);
  --text-inverse:   var(--ink-950);

  --accent:        var(--mint-500);
  --accent-hover:  var(--mint-400);
  --accent-press:  var(--mint-600);
  --accent-soft:   color-mix(in srgb, var(--mint-500) 14%, transparent);
  --accent-on:     var(--ink-950);

  --link:        var(--blue-400);
  --link-hover:  var(--blue-500);

  --success: var(--green-500);
  --warning: var(--amber-500);
  --danger:  var(--red-500);
  --info:    var(--cyan-500);

  --focus-ring: color-mix(in srgb, var(--mint-500) 55%, transparent);

  /* --- Typography --- */
  --font-display: 'Space Grotesk', ui-sans-serif, system-ui, sans-serif;
  --font-body:    'Space Grotesk', ui-sans-serif, system-ui, sans-serif;
  --font-mono:    'JetBrains Mono', ui-monospace, 'SFMono-Regular', Menlo, monospace;

  --text-2xs: 0.6875rem;  --text-xs: 0.75rem;  --text-sm: 0.875rem;
  --text-md: 1rem;        --text-lg: 1.25rem;  --text-xl: 1.5rem;
  --text-2xl: 2rem;       --text-3xl: 2.75rem; --text-4xl: 3.75rem;
  --text-5xl: 5rem;

  --fw-regular: 400; --fw-medium: 500; --fw-semibold: 600; --fw-bold: 700;
  --lh-tight: 1.05; --lh-snug: 1.2; --lh-normal: 1.5; --lh-relaxed: 1.7;
  --tracking-tight: -0.02em; --tracking-normal: 0;
  --tracking-wide: 0.04em;   --tracking-label: 0.12em;

  /* --- Spacing (4px base) --- */
  --space-0: 0;     --space-1: 0.25rem; --space-2: 0.5rem; --space-3: 0.75rem;
  --space-4: 1rem;  --space-5: 1.5rem;  --space-6: 2rem;   --space-7: 3rem;
  --space-8: 4rem;  --space-9: 6rem;    --space-10: 8rem;

  --radius-xs: 3px; --radius-sm: 6px; --radius-md: 10px;
  --radius-lg: 16px; --radius-pill: 999px;

  --shadow-sm: 0 1px 2px rgba(0,0,0,0.4);
  --shadow-md: 0 6px 20px rgba(0,0,0,0.45);
  --shadow-lg: 0 18px 50px rgba(0,0,0,0.55);
  --glow-accent: 0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent),
                 0 0 24px color-mix(in srgb, var(--accent) 28%, transparent);

  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);
  --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
  --dur-fast: 120ms; --dur-base: 200ms; --dur-slow: 360ms;

  --container: 1140px; --container-wide: 1320px; --gutter: var(--space-5);
  --z-sticky: 100; --z-overlay: 800; --z-modal: 900; --z-toast: 1000;
}

[data-theme="light"] {
  --bg-base: var(--ink-050); --bg-canvas: var(--ink-000);
  --surface-1: var(--ink-000); --surface-2: var(--ink-050);
  --surface-3: var(--ink-100); --surface-hover: var(--ink-100);
  --border-subtle: var(--ink-100); --border-default: var(--ink-200);
  --border-strong: var(--ink-300);
  --text-primary: var(--ink-900); --text-secondary: var(--ink-700);
  --text-muted: var(--ink-500); --text-faint: var(--ink-400);
  --text-inverse: var(--ink-000);
  --accent: var(--mint-600); --accent-hover: var(--mint-500);
  --accent-press: var(--mint-700);
  --accent-soft: color-mix(in srgb, var(--mint-600) 12%, transparent);
  --accent-on: var(--ink-000);
  --link: var(--blue-600); --link-hover: var(--blue-500);
}

/* --- Base resets wired to tokens --- */
*, *::before, *::after { box-sizing: border-box; }

body {
  margin: 0;
  background: var(--bg-base);
  color: var(--text-primary);
  font-family: var(--font-body);
  font-size: var(--text-md);
  line-height: var(--lh-normal);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

h1, h2, h3, h4 {
  font-family: var(--font-display);
  font-weight: var(--fw-bold);
  line-height: var(--lh-tight);
  letter-spacing: var(--tracking-tight);
  margin: 0 0 var(--space-4);
  color: var(--text-primary);
}

p { margin: 0 0 var(--space-4); color: var(--text-secondary); }

a { color: var(--link); text-decoration: none; transition: color var(--dur-fast) var(--ease-out); }
a:hover { color: var(--link-hover); }

code, kbd, samp { font-family: var(--font-mono); font-size: 0.9em; }

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

:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
