# Vela Design System — Artifact Context

> **Generated:** 2026-04-17
> **Purpose:** Paste this file into a Claude conversation so it can produce HTML artifacts that match the Vela Intelligence design system — no external dependencies needed.

## Instructions for Claude

This file defines the **Vela Intelligence design language** — a set of colors, typography, spacing, and component building blocks. Use them to create original, creative UI designs that feel cohesive with the Vela brand.

**Be creative.** The tokens and recipes below are a vocabulary, not a template. Design layouts, dashboards, forms, reports, landing pages — whatever the user asks for. Compose the building blocks however makes sense for the content. Don't just recreate the examples shown here.

**Technical rules:**
- Create **HTML artifacts** with plain HTML + CSS. Use `.vi-*` CSS classes — not web components.
- Include the CSS Foundation block in a `<style>` tag (it defines all the design tokens as CSS custom properties).
- Use `oklch()` color values as provided (all modern browsers support them).
- Add `data-mode="dark"` to `<html>` for dark mode. Add `data-theme="editorial"` for the editorial theme.
- Load fonts via Google Fonts: `<link href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400;600;700&family=Montserrat:wght@600;700;800&display=swap" rel="stylesheet">`
- For the editorial theme, also load: `<link href="https://fonts.googleapis.com/css2?family=Libre+Baskerville:wght@400;700&display=swap" rel="stylesheet">`

## Quick Start Template

```html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400;600;700&family=Montserrat:wght@600;700;800&display=swap" rel="stylesheet">
  <style>
    /* Paste the CSS Foundation block here */
  </style>
</head>
<body>
  <!-- Your UI here -->
</body>
</html>
```

---

## CSS Foundation

Paste this into your artifact's `<style>` tag. It provides all resolved design tokens as CSS custom properties plus base typography and reset styles.

```css
/* ── Reset ── */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

:root {
  /* ── Semantic Tokens (Light Mode) ── */
  --vi-sem-brand-primary: oklch(0.450 0.152 260.0);
  --vi-sem-brand-primary-50: oklch(0.980 0.072 260.0);
  --vi-sem-brand-primary-100: oklch(0.930 0.097 260.0);
  --vi-sem-brand-primary-200: oklch(0.830 0.122 260.0);
  --vi-sem-brand-primary-300: oklch(0.730 0.143 260.0);
  --vi-sem-brand-primary-400: oklch(0.630 0.156 260.0);
  --vi-sem-brand-primary-500: oklch(0.550 0.160 260.0);
  --vi-sem-brand-primary-600: oklch(0.450 0.152 260.0);
  --vi-sem-brand-primary-700: oklch(0.370 0.135 260.0);
  --vi-sem-brand-primary-800: oklch(0.300 0.112 260.0);
  --vi-sem-brand-primary-900: oklch(0.260 0.087 260.0);
  --vi-sem-brand-primary-950: oklch(0.220 0.063 260.0);
  --vi-sem-brand-secondary: oklch(0.450 0.114 163.0);
  --vi-sem-brand-secondary-50: oklch(0.980 0.054 163.0);
  --vi-sem-brand-secondary-100: oklch(0.930 0.073 163.0);
  --vi-sem-brand-secondary-200: oklch(0.830 0.091 163.0);
  --vi-sem-brand-secondary-300: oklch(0.730 0.107 163.0);
  --vi-sem-brand-secondary-400: oklch(0.630 0.117 163.0);
  --vi-sem-brand-secondary-500: oklch(0.550 0.120 163.0);
  --vi-sem-brand-secondary-600: oklch(0.450 0.114 163.0);
  --vi-sem-brand-secondary-700: oklch(0.370 0.101 163.0);
  --vi-sem-brand-secondary-800: oklch(0.300 0.084 163.0);
  --vi-sem-brand-secondary-900: oklch(0.260 0.065 163.0);
  --vi-sem-brand-secondary-950: oklch(0.220 0.047 163.0);
  --vi-sem-brand-accent: oklch(0.450 0.176 50.0);
  --vi-sem-brand-accent-50: oklch(0.980 0.083 50.0);
  --vi-sem-brand-accent-100: oklch(0.930 0.112 50.0);
  --vi-sem-brand-accent-200: oklch(0.830 0.141 50.0);
  --vi-sem-brand-accent-300: oklch(0.730 0.165 50.0);
  --vi-sem-brand-accent-400: oklch(0.630 0.181 50.0);
  --vi-sem-brand-accent-500: oklch(0.550 0.185 50.0);
  --vi-sem-brand-accent-600: oklch(0.450 0.176 50.0);
  --vi-sem-brand-accent-700: oklch(0.370 0.156 50.0);
  --vi-sem-brand-accent-800: oklch(0.300 0.130 50.0);
  --vi-sem-brand-accent-900: oklch(0.260 0.100 50.0);
  --vi-sem-brand-accent-950: oklch(0.220 0.073 50.0);
  --vi-sem-surface-canvas: oklch(0.990 0.013 250.0);
  --vi-sem-surface-default: oklch(1.000 0 0);
  --vi-sem-surface-default-translucent: oklch(1.000 0 0 / 0.85);
  --vi-sem-surface-muted: oklch(0.930 0.007 240.0);
  --vi-sem-surface-muted-translucent: oklch(0.630 0.012 240.0 / 0.07);
  --vi-sem-surface-hover: oklch(0.220 0.059 255.0 / 0.06);
  --vi-sem-surface-selected: oklch(0.300 0.105 255.0 / 0.12);
  --vi-sem-text-default: oklch(0.260 0.015 250.0);
  --vi-sem-text-muted: oklch(0.370 0.024 250.0);
  --vi-sem-text-subtle: oklch(0.550 0.028 250.0);
  --vi-sem-text-on-accent: oklch(1.000 0 0);
  --vi-sem-surface-inverse: oklch(0.260 0.007 240.0);
  --vi-sem-text-inverse: oklch(1.000 0 0);
  --vi-sem-action-primary: oklch(0.450 0.152 260.0);
  --vi-sem-action-primary-hover: oklch(0.370 0.135 260.0);
  --vi-sem-action-secondary: oklch(1.000 0 0);
  --vi-sem-action-secondary-hover: oklch(0.930 0.017 250.0);
  --vi-sem-border-default: oklch(0.730 0.025 250.0);
  --vi-sem-border-subtle: oklch(0.830 0.021 250.0);
  --vi-sem-border-strong: oklch(0.630 0.027 250.0);
  --vi-sem-border-danger: oklch(0.450 0.209 27.0);
  --vi-sem-border-info: oklch(0.450 0.138 255.0);
  --vi-sem-border-success: oklch(0.450 0.169 150.0);
  --vi-sem-border-warning: oklch(0.450 0.162 55.0);
  --vi-sem-border-accent: oklch(0.450 0.176 50.0);
  --vi-sem-scroll-cue: oklch(0.260 0.015 250.0 / 0.12);
  --vi-sem-backdrop: oklch(0.260 0.015 250.0 / 0.6);
  --vi-sem-table-header-bg: oklch(0.930 0.017 250.0);
  --vi-sem-table-header-text: oklch(0.550 0.028 250.0);
  --vi-sem-table-header-text-transform: uppercase;
  --vi-sem-table-header-letter-spacing: 0.04em;
  --vi-sem-table-body-bg: oklch(1.000 0 0);
  --vi-sem-table-body-text: oklch(0.370 0.024 250.0);
  --vi-sem-table-stripe-bg: oklch(0.990 0.013 250.0);
  --vi-sem-table-border: oklch(0.830 0.021 250.0);
  --vi-sem-neutral-lt: oklch(0.930 0.017 250.0);
  --vi-sem-neutral-dk: oklch(0.300 0.020 250.0);
  --vi-sem-neutral-lt-text: oklch(0.930 0.017 250.0);
  --vi-sem-neutral-dk-text: oklch(0.300 0.020 250.0);
  --vi-sem-info-lt: oklch(0.930 0.088 255.0);
  --vi-sem-info-lt-hover: oklch(0.830 0.111 255.0);
  --vi-sem-info-lt-border: oklch(0.730 0.130 255.0);
  --vi-sem-info-dk: oklch(0.450 0.138 255.0);
  --vi-sem-info-dk-hover: oklch(0.550 0.145 255.0);
  --vi-sem-info-dk-border: oklch(0.370 0.123 255.0);
  --vi-sem-info-lt-text: oklch(0.930 0.088 255.0);
  --vi-sem-info-dk-text: oklch(0.450 0.138 255.0);
  --vi-sem-info-text: oklch(0.450 0.138 255.0);
  --vi-sem-info: oklch(0.450 0.138 255.0);
  --vi-sem-info-hover: oklch(0.550 0.145 255.0);
  --vi-sem-info-border: oklch(0.370 0.123 255.0);
  --vi-sem-success-lt: oklch(0.930 0.108 150.0);
  --vi-sem-success-lt-hover: oklch(0.830 0.136 150.0);
  --vi-sem-success-lt-border: oklch(0.730 0.159 150.0);
  --vi-sem-success-dk: oklch(0.450 0.169 150.0);
  --vi-sem-success-dk-hover: oklch(0.550 0.178 150.0);
  --vi-sem-success-dk-border: oklch(0.370 0.151 150.0);
  --vi-sem-success-lt-text: oklch(0.930 0.108 150.0);
  --vi-sem-success-dk-text: oklch(0.450 0.169 150.0);
  --vi-sem-success-text: oklch(0.450 0.169 150.0);
  --vi-sem-success: oklch(0.450 0.169 150.0);
  --vi-sem-success-hover: oklch(0.550 0.178 150.0);
  --vi-sem-success-border: oklch(0.370 0.151 150.0);
  --vi-sem-warning-lt: oklch(0.930 0.103 55.0);
  --vi-sem-warning-lt-hover: oklch(0.830 0.130 55.0);
  --vi-sem-warning-lt-border: oklch(0.730 0.152 55.0);
  --vi-sem-warning-dk: oklch(0.630 0.166 55.0);
  --vi-sem-warning-dk-hover: oklch(0.730 0.152 55.0);
  --vi-sem-warning-dk-border: oklch(0.550 0.170 55.0);
  --vi-sem-warning-lt-text: oklch(0.930 0.103 55.0);
  --vi-sem-warning-dk-text: oklch(0.630 0.166 55.0);
  --vi-sem-warning-text: oklch(0.630 0.166 55.0);
  --vi-sem-warning: oklch(0.630 0.166 55.0);
  --vi-sem-warning-hover: oklch(0.730 0.152 55.0);
  --vi-sem-warning-border: oklch(0.550 0.170 55.0);
  --vi-sem-danger-lt: oklch(0.930 0.133 27.0);
  --vi-sem-danger-lt-hover: oklch(0.830 0.168 27.0);
  --vi-sem-danger-lt-border: oklch(0.730 0.197 27.0);
  --vi-sem-danger-dk: oklch(0.450 0.209 27.0);
  --vi-sem-danger-dk-hover: oklch(0.550 0.220 27.0);
  --vi-sem-danger-dk-border: oklch(0.370 0.186 27.0);
  --vi-sem-danger-lt-text: oklch(0.930 0.133 27.0);
  --vi-sem-danger-dk-text: oklch(0.450 0.209 27.0);
  --vi-sem-danger-text: oklch(0.450 0.209 27.0);
  --vi-sem-danger: oklch(0.450 0.209 27.0);
  --vi-sem-danger-hover: oklch(0.550 0.220 27.0);
  --vi-sem-danger-border: oklch(0.370 0.186 27.0);
  --vi-sem-accent-lt: oklch(0.930 0.112 50.0);
  --vi-sem-accent-lt-hover: oklch(0.830 0.141 50.0);
  --vi-sem-accent-lt-border: oklch(0.730 0.165 50.0);
  --vi-sem-accent-dk: oklch(0.450 0.176 50.0);
  --vi-sem-accent-dk-hover: oklch(0.550 0.185 50.0);
  --vi-sem-accent-dk-border: oklch(0.370 0.156 50.0);
  --vi-sem-accent-lt-text: oklch(0.930 0.112 50.0);
  --vi-sem-accent-dk-text: oklch(0.450 0.176 50.0);
  --vi-sem-accent-text: oklch(0.450 0.176 50.0);
  --vi-sem-accent: oklch(0.450 0.176 50.0);
  --vi-sem-accent-hover: oklch(0.550 0.185 50.0);
  --vi-sem-accent-border: oklch(0.370 0.156 50.0);
  --vi-sem-heading-family: 'Montserrat', 'Lato', sans-serif;
  --vi-sem-heading-weight: 700;
  --vi-sem-heading-line-height: 1.2;
  --vi-sem-heading-letter-spacing: -0.01em;
  --vi-sem-heading-1-size: 2.25rem;
  --vi-sem-heading-2-size: 1.5rem;
  --vi-sem-heading-3-size: 1.25rem;
  --vi-sem-heading-4-size: 1rem;
  --vi-sem-heading-5-size: 0.875rem;
  --vi-sem-heading-6-size: 0.8125rem;
  --vi-sem-heading-1-weight: 700;
  --vi-sem-heading-2-weight: 700;
  --vi-sem-heading-3-weight: 600;
  --vi-sem-heading-4-weight: 600;
  --vi-sem-heading-5-weight: 600;
  --vi-sem-heading-6-weight: 600;
  --vi-sem-heading-1-line-height: 1.2;
  --vi-sem-heading-2-line-height: 1.2;
  --vi-sem-heading-3-line-height: 1.2;
  --vi-sem-heading-4-line-height: 1.2;
  --vi-sem-heading-5-line-height: 1.2;
  --vi-sem-heading-6-line-height: 1.2;
  --vi-sem-heading-1-letter-spacing: -0.01em;
  --vi-sem-heading-2-letter-spacing: -0.01em;
  --vi-sem-heading-3-letter-spacing: 0;
  --vi-sem-heading-4-letter-spacing: 0;
  --vi-sem-heading-5-letter-spacing: 0;
  --vi-sem-heading-6-letter-spacing: 0;
  --vi-sem-heading-1-color: oklch(0.260 0.015 250.0);
  --vi-sem-heading-2-color: oklch(0.260 0.015 250.0);
  --vi-sem-heading-3-color: oklch(0.260 0.015 250.0);
  --vi-sem-heading-4-color: oklch(0.260 0.015 250.0);
  --vi-sem-heading-5-color: oklch(0.260 0.015 250.0);
  --vi-sem-heading-6-color: oklch(0.370 0.024 250.0);
  --vi-sem-heading-1-text-transform: none;
  --vi-sem-heading-2-text-transform: none;
  --vi-sem-heading-3-text-transform: none;
  --vi-sem-heading-4-text-transform: none;
  --vi-sem-heading-5-text-transform: none;
  --vi-sem-heading-6-text-transform: uppercase;
  --vi-sem-body-family: 'Lato', 'Segoe UI', sans-serif;
  --vi-sem-body-weight: 400;
  --vi-sem-body-line-height: 1.5;
  --vi-sem-body-letter-spacing: 0;
  --vi-sem-body-text-transform: none;
  --vi-sem-body-color: oklch(0.260 0.015 250.0);
  --vi-sem-body-sm-size: 0.8125rem;
  --vi-sem-body-md-size: 0.875rem;
  --vi-sem-body-lg-size: 1rem;
  --vi-sem-caption-family: 'Lato', 'Segoe UI', sans-serif;
  --vi-sem-caption-weight: 400;
  --vi-sem-caption-line-height: 1.4;
  --vi-sem-caption-letter-spacing: 0;
  --vi-sem-caption-text-transform: uppercase;
  --vi-sem-caption-color: oklch(0.550 0.028 250.0);
  --vi-sem-caption-sm-size: 0.75rem;
  --vi-sem-caption-md-size: 0.8125rem;
  --vi-sem-label-family: 'Lato', 'Segoe UI', sans-serif;
  --vi-sem-label-weight: 600;
  --vi-sem-label-line-height: 1.4;
  --vi-sem-label-letter-spacing: 0;
  --vi-sem-label-text-transform: none;
  --vi-sem-label-color: oklch(0.260 0.015 250.0);
  --vi-sem-label-sm-size: 0.75rem;
  --vi-sem-label-md-size: 0.8125rem;
  --vi-sem-label-lg-size: 0.875rem;
  --vi-sem-long-text-family: 'Lato', 'Segoe UI', sans-serif;
  --vi-sem-long-text-weight: 400;
  --vi-sem-long-text-line-height: 1.75;
  --vi-sem-long-text-letter-spacing: 0;
  --vi-sem-long-text-text-transform: none;
  --vi-sem-long-text-color: oklch(0.260 0.015 250.0);
  --vi-sem-long-text-sm-size: 0.8125rem;
  --vi-sem-long-text-md-size: 0.875rem;
  --vi-sem-long-text-lg-size: 1rem;
  --vi-sem-overline-family: 'Lato', 'Segoe UI', sans-serif;
  --vi-sem-overline-weight: 600;
  --vi-sem-overline-size: 0.75rem;
  --vi-sem-overline-sm-size: 0.6875rem;
  --vi-sem-overline-line-height: 1.5;
  --vi-sem-overline-letter-spacing: 0.06em;
  --vi-sem-overline-text-transform: uppercase;
  --vi-sem-overline-color: oklch(0.370 0.024 250.0);
  --vi-sem-shadow-card: 0 4px 10px rgba(16, 24, 40, 0.09);
  --vi-sem-shadow-popup: 0 8px 20px rgba(16, 24, 40, 0.12);
  --vi-sem-shadow-overlay: 0 14px 36px rgba(16, 24, 40, 0.15);
  --vi-sem-space-inset-xs: 0.25rem;
  --vi-sem-space-inset-sm: 0.5rem;
  --vi-sem-space-inset-md: 0.75rem;
  --vi-sem-space-inset-lg: 1rem;
  --vi-sem-space-inset-xl: 1.5rem;
  --vi-sem-space-gap-xs: 0.125rem;
  --vi-sem-space-gap-sm: 0.25rem;
  --vi-sem-space-gap-md: 0.5rem;
  --vi-sem-space-gap-lg: 0.75rem;
  --vi-sem-space-gap-xl: 1rem;
  --vi-sem-space-stack-xs: 0.25rem;
  --vi-sem-space-stack-sm: 0.5rem;
  --vi-sem-space-stack-md: 0.75rem;
  --vi-sem-space-stack-lg: 1rem;
  --vi-sem-space-stack-xl: 1.5rem;
  --vi-sem-space-target-sm: 2rem;
  --vi-sem-space-target-md: 2.125rem;
  --vi-sem-space-target-lg: 2.5rem;

  /* ── Component Tokens ── */
  --vi-cmp-button-height-sm: 1.875rem;
  --vi-cmp-button-height-md: 2.125rem;
  --vi-cmp-button-height-lg: 2.375rem;
  --vi-cmp-button-padding-inline: 0.875rem;
  --vi-cmp-input-height: 2.125rem;
  --vi-cmp-input-padding-inline: 0.75rem;
  --vi-cmp-card-padding: 1rem;
  --vi-cmp-card-gap: 0.75rem;
  --vi-cmp-badge-border-width: 0.5px;
  --vi-cmp-badge-gap: 0.125rem;
  --vi-cmp-badge-padding-block: 0.125rem;
  --vi-cmp-badge-padding-inline: 0.5rem;
  --vi-cmp-tag-gap: 0.125rem;
  --vi-cmp-tag-padding-block: 0.125rem;
  --vi-cmp-tag-padding-inline: 0.5rem;
  --vi-cmp-callout-leading-start-radius: 0;
  --vi-cmp-callout-leading-end-radius: 0;
  --vi-cmp-callout-border-width: 4px;
  --vi-cmp-toast-leading-start-radius: 0;
  --vi-cmp-toast-leading-end-radius: 0;
  --vi-cmp-list-hover: oklch(0.220 0.059 255.0 / 0.06);
  --vi-cmp-vertical-nav-item-hover-surface: oklch(0.220 0.059 255.0 / 0.06);
  --vi-cmp-vertical-nav-item-active-surface: oklch(0.300 0.105 255.0 / 0.12);
  --vi-cmp-vertical-nav-item-hover-border: transparent;
  --vi-cmp-vertical-nav-item-hover-text: oklch(0.260 0.015 250.0);
  --vi-cmp-vertical-nav-item-active-border: transparent;
  --vi-cmp-vertical-nav-item-active-text: oklch(0.260 0.015 250.0);
  --vi-cmp-vertical-nav-item-active-weight: 500;
  --vi-cmp-skeleton-base: oklch(0.830 0.021 250.0);
  --vi-cmp-skeleton-highlight: oklch(1.000 0 0);
  --vi-cmp-drawer-border: 1px solid oklch(0.830 0.021 250.0);

  /* ── Reference Values ── */
  --vi-ref-radius-1: 0.25rem;
  --vi-ref-radius-2: 0.3125rem;
  --vi-ref-radius-3: 0.4375rem;
  --vi-ref-radius-4: 0.5625rem;
  --vi-ref-radius-5: 0.6875rem;
  --vi-ref-radius-6: 0.8125rem;
  --vi-ref-radius-pill: 999px;
  --vi-ref-shadow-1: 0 1px 2px rgba(16, 24, 40, 0.05);
  --vi-ref-shadow-2: 0 4px 10px rgba(16, 24, 40, 0.09);
  --vi-ref-shadow-3: 0 8px 20px rgba(16, 24, 40, 0.12);
  --vi-ref-shadow-4: 0 14px 36px rgba(16, 24, 40, 0.15);
  --vi-ref-focus-ring: 0 0 0 2px rgba(20, 82, 184, 0.28);
  --vi-ref-opacity-disabled: 0.6;
  --vi-ref-motion-fast: 120ms;
}

body {
  font-family: 'Lato', 'Segoe UI', sans-serif;
  font-size: 0.875rem;
  line-height: 1.5;
  color: var(--vi-sem-text-default);
  background: var(--vi-sem-surface-canvas);
}

/* ── Typography Classes ── */
.vi-h1 { font-family: 'Montserrat', 'Lato', sans-serif; font-size: 2.25rem; font-weight: 700; line-height: 1.2; letter-spacing: -0.01em; color: var(--vi-sem-text-default); }
.vi-h2 { font-family: 'Montserrat', 'Lato', sans-serif; font-size: 1.5rem; font-weight: 700; line-height: 1.2; letter-spacing: -0.01em; color: var(--vi-sem-text-default); }
.vi-h3 { font-family: 'Montserrat', 'Lato', sans-serif; font-size: 1.25rem; font-weight: 600; line-height: 1.2; letter-spacing: 0; color: var(--vi-sem-text-default); }
.vi-h4 { font-family: 'Montserrat', 'Lato', sans-serif; font-size: 1rem; font-weight: 600; line-height: 1.2; letter-spacing: 0; color: var(--vi-sem-text-default); }
.vi-h5 { font-family: 'Montserrat', 'Lato', sans-serif; font-size: 0.875rem; font-weight: 600; line-height: 1.2; letter-spacing: 0; color: var(--vi-sem-text-default); }
.vi-h6 { font-family: 'Montserrat', 'Lato', sans-serif; font-size: 0.8125rem; font-weight: 600; line-height: 1.2; letter-spacing: 0; color: var(--vi-sem-text-muted); text-transform: uppercase; }

.vi-body { font-size: 0.875rem; line-height: 1.5; color: var(--vi-sem-text-default); }
.vi-body-sm { font-size: 0.8125rem; }
.vi-body-lg { font-size: 1rem; }
.vi-caption { font-size: 0.75rem; text-transform: uppercase; color: var(--vi-sem-text-subtle); }
.vi-overline { font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; color: var(--vi-sem-text-muted); }
.vi-label { font-size: 0.8125rem; font-weight: 600; color: var(--vi-sem-text-default); }

.vi-text-muted { color: var(--vi-sem-text-muted); }
.vi-text-subtle { color: var(--vi-sem-text-subtle); }
```

---

## Dark Mode Overrides

Add `data-mode="dark"` to the `<html>` element and include this CSS block:

```css
[data-mode="dark"] {
  --vi-sem-surface-canvas: oklch(0.220 0.011 250.0);
  --vi-sem-surface-default: oklch(0.260 0.015 250.0);
  --vi-sem-surface-default-translucent: oklch(0.260 0.015 250.0 / 0.85);
  --vi-sem-surface-muted: oklch(0.300 0.020 250.0);
  --vi-sem-surface-muted-translucent: oklch(0.730 0.025 250.0 / 0.15);
  --vi-sem-surface-hover: oklch(0.830 0.114 255.0 / 0.3);
  --vi-sem-surface-selected: oklch(0.830 0.114 255.0 / 0.18);
  --vi-sem-surface-inverse: oklch(0.930 0.017 250.0);
  --vi-sem-text-default: oklch(0.990 0.013 250.0);
  --vi-sem-text-muted: oklch(0.830 0.021 250.0);
  --vi-sem-text-subtle: oklch(0.630 0.027 250.0);
  --vi-sem-text-inverse: oklch(0.260 0.015 250.0);
  --vi-sem-action-primary: oklch(0.630 0.156 260.0);
  --vi-sem-action-primary-hover: oklch(0.730 0.143 260.0);
  --vi-sem-action-secondary: oklch(0.300 0.020 250.0);
  --vi-sem-action-secondary-hover: oklch(0.370 0.024 250.0);
  --vi-sem-border-default: oklch(0.370 0.024 250.0);
  --vi-sem-border-subtle: oklch(0.300 0.020 250.0);
  --vi-sem-border-strong: oklch(0.450 0.027 250.0);
  --vi-sem-border-danger: oklch(0.630 0.215 27.0);
  --vi-sem-border-info: oklch(0.630 0.142 255.0);
  --vi-sem-border-success: oklch(0.630 0.174 150.0);
  --vi-sem-border-warning: oklch(0.630 0.166 55.0);
  --vi-sem-border-accent: oklch(0.630 0.181 50.0);
  --vi-sem-scroll-cue: oklch(0.930 0.017 250.0 / 0.14);
  --vi-sem-backdrop: oklch(0.220 0.011 250.0 / 0.85);
  --vi-sem-table-header-bg: oklch(0.300 0.020 250.0);
  --vi-sem-table-header-text: oklch(0.630 0.027 250.0);
  --vi-sem-table-body-bg: oklch(0.260 0.015 250.0);
  --vi-sem-table-body-text: oklch(0.730 0.025 250.0);
  --vi-sem-table-stripe-bg: oklch(0.220 0.011 250.0);
  --vi-sem-table-border: oklch(0.370 0.024 250.0);
  --vi-sem-info: oklch(0.630 0.142 255.0);
  --vi-sem-info-hover: oklch(0.730 0.130 255.0);
  --vi-sem-info-border: oklch(0.550 0.145 255.0);
  --vi-sem-info-text: oklch(0.630 0.142 255.0);
  --vi-sem-success: oklch(0.630 0.174 150.0);
  --vi-sem-success-hover: oklch(0.730 0.159 150.0);
  --vi-sem-success-border: oklch(0.550 0.178 150.0);
  --vi-sem-success-text: oklch(0.630 0.174 150.0);
  --vi-sem-warning: oklch(0.730 0.152 55.0);
  --vi-sem-warning-hover: oklch(0.830 0.130 55.0);
  --vi-sem-warning-border: oklch(0.630 0.166 55.0);
  --vi-sem-warning-text: oklch(0.730 0.152 55.0);
  --vi-sem-danger: oklch(0.630 0.215 27.0);
  --vi-sem-danger-hover: oklch(0.730 0.197 27.0);
  --vi-sem-danger-border: oklch(0.550 0.220 27.0);
  --vi-sem-danger-text: oklch(0.630 0.215 27.0);
  --vi-sem-accent: oklch(0.630 0.181 50.0);
  --vi-sem-accent-hover: oklch(0.730 0.165 50.0);
  --vi-sem-accent-border: oklch(0.550 0.185 50.0);
  --vi-sem-accent-text: oklch(0.630 0.181 50.0);
  --vi-sem-neutral-lt: oklch(0.830 0.021 250.0);
  --vi-sem-neutral-dk: oklch(0.370 0.024 250.0);
  --vi-ref-focus-ring: 0 0 0 3px rgba(74, 125, 212, 0.40);
}
```

---

## Editorial Theme Overrides

Add `data-theme="editorial"` to the `<html>` element and include this CSS block. Also load the Libre Baskerville font.

```css
[data-theme="editorial"] {
  --vi-sem-brand-primary: oklch(0.450 0.152 48.0);
  --vi-sem-brand-primary-50: oklch(0.980 0.072 48.0);
  --vi-sem-brand-primary-100: oklch(0.930 0.097 48.0);
  --vi-sem-brand-primary-200: oklch(0.830 0.122 48.0);
  --vi-sem-brand-primary-300: oklch(0.730 0.143 48.0);
  --vi-sem-brand-primary-400: oklch(0.630 0.156 48.0);
  --vi-sem-brand-primary-500: oklch(0.550 0.160 48.0);
  --vi-sem-brand-primary-600: oklch(0.450 0.152 48.0);
  --vi-sem-brand-primary-700: oklch(0.370 0.135 48.0);
  --vi-sem-brand-primary-800: oklch(0.300 0.112 48.0);
  --vi-sem-brand-primary-900: oklch(0.260 0.087 48.0);
  --vi-sem-brand-primary-950: oklch(0.220 0.063 48.0);
  --vi-sem-brand-accent: oklch(0.450 0.143 85.0);
  --vi-sem-brand-accent-50: oklch(0.980 0.068 85.0);
  --vi-sem-brand-accent-100: oklch(0.930 0.091 85.0);
  --vi-sem-brand-accent-200: oklch(0.830 0.114 85.0);
  --vi-sem-brand-accent-300: oklch(0.730 0.134 85.0);
  --vi-sem-brand-accent-400: oklch(0.630 0.147 85.0);
  --vi-sem-brand-accent-500: oklch(0.550 0.150 85.0);
  --vi-sem-brand-accent-600: oklch(0.450 0.143 85.0);
  --vi-sem-brand-accent-700: oklch(0.370 0.127 85.0);
  --vi-sem-brand-accent-800: oklch(0.300 0.105 85.0);
  --vi-sem-brand-accent-900: oklch(0.260 0.081 85.0);
  --vi-sem-brand-accent-950: oklch(0.220 0.059 85.0);
  --vi-sem-surface-canvas: oklch(0.990 0.013 82.0);
  --vi-sem-surface-default: oklch(1.000 0 0);
  --vi-sem-surface-muted: oklch(0.930 0.017 82.0);
  --vi-sem-surface-hover: oklch(0.260 0.028 82.0 / 0.06);
  --vi-sem-surface-selected: oklch(0.260 0.028 82.0 / 0.10);
  --vi-sem-surface-inverse: oklch(0.260 0.007 30.0);
  --vi-sem-text-default: oklch(0.260 0.007 30.0);
  --vi-sem-text-muted: oklch(0.370 0.010 30.0);
  --vi-sem-text-subtle: oklch(0.550 0.012 30.0);
  --vi-sem-action-primary: oklch(0.450 0.152 48.0);
  --vi-sem-action-primary-hover: oklch(0.370 0.135 48.0);
  --vi-sem-action-secondary-hover: oklch(0.930 0.017 82.0);
  --vi-sem-border-default: oklch(0.730 0.025 82.0);
  --vi-sem-border-subtle: oklch(0.830 0.021 82.0);
  --vi-sem-border-strong: oklch(0.630 0.027 82.0);
  --vi-sem-table-header-bg: oklch(0.930 0.017 82.0);
  --vi-sem-table-header-text: oklch(0.450 0.011 30.0);
  --vi-sem-table-body-text: oklch(0.370 0.010 30.0);
  --vi-sem-table-stripe-bg: oklch(0.990 0.013 82.0);
  --vi-sem-table-border: oklch(0.830 0.021 82.0);
  --vi-sem-heading-family: 'Libre Baskerville', 'Georgia', 'Times New Roman', serif;
  --vi-sem-heading-weight: 700;
  --vi-sem-overline-color: oklch(0.450 0.011 30.0);
  --vi-ref-shadow-1: 0 1px 2px rgba(60, 40, 20, 0.06);
  --vi-ref-shadow-2: 0 4px 10px rgba(60, 40, 20, 0.08);
  --vi-ref-shadow-3: 0 8px 20px rgba(60, 40, 20, 0.10);
  --vi-ref-shadow-4: 0 14px 36px rgba(60, 40, 20, 0.13);
  --vi-ref-radius-1: 0.125rem;
  --vi-ref-radius-2: 0.125rem;
  --vi-ref-radius-3: 0.1875rem;
  --vi-ref-radius-4: 0.25rem;
  --vi-ref-radius-5: 0.3125rem;
  --vi-ref-radius-6: 0.375rem;
  --vi-ref-focus-ring: 0 0 0 2px rgba(120, 70, 30, 0.25);
}
```

---

## Component Recipes

Each recipe shows the HTML structure and CSS needed to recreate a Vela component using plain HTML.

### Button

Interactive action element. Default tone is "brand" (primary color).

**Variants:** solid (default), outline, ghost, soft
**Tones:** brand, action, danger, success, warning, info, neutral
**Sizes:** sm (2rem), md (2.25rem), lg (2.5rem)

```html
<button class="vi-btn">Run Analysis</button>
<button class="vi-btn vi-btn--outline">Settings</button>
<button class="vi-btn vi-btn--ghost">Cancel</button>
<button class="vi-btn vi-btn--danger">Delete</button>
<button class="vi-btn vi-btn--outline vi-btn--danger">Remove</button>
<button class="vi-btn vi-btn--sm">Small</button>
<button class="vi-btn vi-btn--lg">Large</button>
<button class="vi-btn" disabled>Disabled</button>
```

```css
.vi-btn {
  align-items: center;
  background: var(--vi-sem-action-primary);
  border: 1px solid var(--vi-sem-action-primary);
  border-radius: var(--vi-ref-radius-2);
  color: oklch(1.000 0 0);
  cursor: pointer;
  display: inline-flex;
  font-family: inherit;
  font-size: inherit;
  font-weight: 600;
  gap: 0.5rem;
  height: 2.25rem;
  justify-content: center;
  padding: 0 0.875rem;
  transition: background-color 120ms ease, border-color 120ms ease;
  white-space: nowrap;
}
.vi-btn:hover { background: var(--vi-sem-action-primary-hover); border-color: var(--vi-sem-action-primary-hover); }
.vi-btn:focus-visible { box-shadow: var(--vi-ref-focus-ring); outline: none; }
.vi-btn:disabled { opacity: 0.6; cursor: not-allowed; }

/* Sizes */
.vi-btn--sm { height: 2rem; }
.vi-btn--lg { height: 2.5rem; }

/* Outline variant */
.vi-btn--outline { background: var(--vi-sem-surface-default); border-color: var(--vi-sem-action-primary); color: var(--vi-sem-action-primary); }
.vi-btn--outline:hover { background: var(--vi-sem-surface-hover); }

/* Ghost variant */
.vi-btn--ghost { background: transparent; border-color: transparent; color: var(--vi-sem-action-primary); }
.vi-btn--ghost:hover { background: var(--vi-sem-surface-hover); }

/* Tone: danger */
.vi-btn--danger { background: var(--vi-sem-danger-dk); border-color: var(--vi-sem-danger-dk); color: oklch(1.000 0 0); }
.vi-btn--danger:hover { background: var(--vi-sem-danger-dk-hover); border-color: var(--vi-sem-danger-dk-hover); }
.vi-btn--outline.vi-btn--danger { background: var(--vi-sem-surface-default); border-color: var(--vi-sem-danger-lt-border); color: var(--vi-sem-danger-dk-text); }
.vi-btn--outline.vi-btn--danger:hover { background: var(--vi-sem-danger-lt); }

/* Tone: success */
.vi-btn--success { background: var(--vi-sem-success-dk); border-color: var(--vi-sem-success-dk); color: oklch(1.000 0 0); }
.vi-btn--success:hover { background: var(--vi-sem-success-dk-hover); border-color: var(--vi-sem-success-dk-hover); }

/* Tone: warning */
.vi-btn--warning { background: var(--vi-sem-warning-dk); border-color: var(--vi-sem-warning-dk); color: oklch(1.000 0 0); }
.vi-btn--warning:hover { background: var(--vi-sem-warning-dk-hover); border-color: var(--vi-sem-warning-dk-hover); }

/* Tone: info */
.vi-btn--info { background: var(--vi-sem-info-dk); border-color: var(--vi-sem-info-dk); color: oklch(1.000 0 0); }
.vi-btn--info:hover { background: var(--vi-sem-info-dk-hover); border-color: var(--vi-sem-info-dk-hover); }

/* Tone: neutral */
.vi-btn--neutral { background: var(--vi-sem-action-secondary); border: 1px solid var(--vi-sem-border-default); color: var(--vi-sem-text-default); }
.vi-btn--neutral:hover { background: var(--vi-sem-action-secondary-hover); }
```

---

### Card

Container for related content with optional header and footer.

**Variants:** default (shadow + border), tinted (translucent fill, no border), outlined (border only, no shadow)

```html
<div class="vi-card">
  <div class="vi-card__header">Card Title</div>
  <div class="vi-card__body">Card content goes here.</div>
  <div class="vi-card__footer">Updated 2h ago</div>
</div>

<div class="vi-card vi-card--tinted">
  <div class="vi-card__header">Tinted Card</div>
  <div class="vi-card__body">Translucent background.</div>
</div>

<div class="vi-card vi-card--outlined">
  <div class="vi-card__header">Outlined Card</div>
  <div class="vi-card__body">Border only, no shadow.</div>
</div>
```

```css
.vi-card {
  background: var(--vi-sem-surface-default);
  border: 1px solid var(--vi-sem-border-default);
  border-radius: var(--vi-ref-radius-3);
  box-shadow: var(--vi-ref-shadow-1);
  display: grid;
  grid-template-rows: auto 1fr auto;
  gap: 0.75rem;
  overflow: hidden;
  padding: 1rem;
}
.vi-card__header { font-size: 1rem; font-weight: 600; }
.vi-card__footer { color: var(--vi-sem-text-subtle); font-size: 0.8125rem; }

.vi-card--tinted { background: var(--vi-sem-surface-muted-translucent); border-color: transparent; box-shadow: none; }
.vi-card--outlined { background: transparent; box-shadow: none; }
```

---

### Badge

Small label for status or counts.

**Tones:** neutral (default), success, warning, danger, info, accent
**Variants:** default (tinted fill), outline, solid

```html
<span class="vi-badge">Default</span>
<span class="vi-badge vi-badge--success">Passed</span>
<span class="vi-badge vi-badge--danger">Failed</span>
<span class="vi-badge vi-badge--warning">Pending</span>
<span class="vi-badge vi-badge--info">Info</span>
<span class="vi-badge vi-badge--outline vi-badge--success">Outline</span>
<span class="vi-badge vi-badge--solid vi-badge--danger">Solid</span>
```

```css
.vi-badge {
  align-items: center;
  border: 1px solid transparent;
  border-radius: 999px;
  display: inline-flex;
  font-size: 0.75rem;
  font-weight: 600;
  gap: 0.25rem;
  line-height: 1.5;
  padding: 0.125rem 0.5rem;
  background: var(--vi-sem-neutral-lt);
  color: var(--vi-sem-neutral-dk-text);
}
.vi-badge--success { background: var(--vi-sem-success-lt); color: var(--vi-sem-success-dk-text); }
.vi-badge--warning { background: var(--vi-sem-warning-lt); color: var(--vi-sem-warning-dk-text); }
.vi-badge--danger { background: var(--vi-sem-danger-lt); color: var(--vi-sem-danger-dk-text); }
.vi-badge--info { background: var(--vi-sem-info-lt); color: var(--vi-sem-info-dk-text); }
.vi-badge--accent { background: var(--vi-sem-accent-lt); color: var(--vi-sem-accent-dk-text); }

/* Outline variant */
.vi-badge--outline { background: transparent; }
.vi-badge--outline.vi-badge--success { border-color: var(--vi-sem-success-lt-border); }
.vi-badge--outline.vi-badge--danger { border-color: var(--vi-sem-danger-lt-border); }
.vi-badge--outline.vi-badge--warning { border-color: var(--vi-sem-warning-lt-border); }
.vi-badge--outline.vi-badge--info { border-color: var(--vi-sem-info-lt-border); }

/* Solid variant */
.vi-badge--solid { color: oklch(1.000 0 0); }
.vi-badge--solid.vi-badge--success { background: var(--vi-sem-success-dk); border-color: var(--vi-sem-success-dk); }
.vi-badge--solid.vi-badge--danger { background: var(--vi-sem-danger-dk); border-color: var(--vi-sem-danger-dk); }
.vi-badge--solid.vi-badge--warning { background: var(--vi-sem-warning-dk); border-color: var(--vi-sem-warning-dk); }
.vi-badge--solid.vi-badge--info { background: var(--vi-sem-info-dk); border-color: var(--vi-sem-info-dk); }
```

---

### Callout

Highlighted block for important inline content.

**Tones:** info (default), success, warning, danger
**Variants:** default (left accent border), soft (opaque tone fill), tinted (translucent tone fill + left border)

```html
<div class="vi-callout vi-callout--info">
  <div class="vi-callout__title">Notice</div>
  <div>Threshold exceeded for this transaction.</div>
</div>

<div class="vi-callout vi-callout--success vi-callout--soft">
  <div class="vi-callout__title">Complete</div>
  <div>All checks passed successfully.</div>
</div>

<div class="vi-callout vi-callout--warning vi-callout--tinted">
  Missing diligence artifact detected.
</div>

<div class="vi-callout vi-callout--danger">
  <div class="vi-callout__title">Critical Alert</div>
  <div>Immediate action required.</div>
</div>
```

```css
.vi-callout {
  background: var(--vi-sem-surface-default);
  border-radius: var(--vi-ref-radius-2);
  color: var(--vi-sem-text-default);
  padding: 0.75rem;
}
.vi-callout__title { font-weight: 700; margin-bottom: 0.25rem; }

/* Left accent border via box-shadow */
.vi-callout--info { box-shadow: inset 4px 0 0 0 var(--vi-sem-info-dk); }
.vi-callout--success { box-shadow: inset 4px 0 0 0 var(--vi-sem-success-dk); }
.vi-callout--warning { box-shadow: inset 4px 0 0 0 var(--vi-sem-warning-dk); }
.vi-callout--danger { box-shadow: inset 4px 0 0 0 var(--vi-sem-danger-dk); }

/* Soft variant — opaque fill, no border */
.vi-callout--soft.vi-callout--info { background: var(--vi-sem-info-lt); box-shadow: none; color: var(--vi-sem-info-text); border-radius: var(--vi-ref-radius-2); }
.vi-callout--soft.vi-callout--success { background: var(--vi-sem-success-lt); box-shadow: none; color: var(--vi-sem-success-text); }
.vi-callout--soft.vi-callout--warning { background: var(--vi-sem-warning-lt); box-shadow: none; color: var(--vi-sem-warning-text); }
.vi-callout--soft.vi-callout--danger { background: var(--vi-sem-danger-lt); box-shadow: none; color: var(--vi-sem-danger-text); }

/* Tinted variant — translucent fill, keeps left border */
.vi-callout--tinted.vi-callout--info { background: color-mix(in oklch, var(--vi-sem-info-dk) 15%, transparent); }
.vi-callout--tinted.vi-callout--success { background: color-mix(in oklch, var(--vi-sem-success-dk) 15%, transparent); }
.vi-callout--tinted.vi-callout--warning { background: color-mix(in oklch, var(--vi-sem-warning-dk) 15%, transparent); }
.vi-callout--tinted.vi-callout--danger { background: color-mix(in oklch, var(--vi-sem-danger-dk) 15%, transparent); }
```

---

### Metric Card

KPI display with value, label, and optional accent bar.

**Variants:** default (accent bar + icon circle), topped (top-edge colored bar)

```html
<!-- Default variant -->
<div class="vi-metric-card">
  <span class="vi-metric-card__accent"></span>
  <div class="vi-metric-card__content">
    <span class="vi-metric-card__value">8</span>
    <span class="vi-metric-card__label">Active Tasks</span>
  </div>
  <div class="vi-metric-card__icon">📊</div>
</div>

<!-- Topped variant -->
<div class="vi-metric-card vi-metric-card--topped">
  <span class="vi-metric-card__accent"></span>
  <div class="vi-metric-card__content">
    <span class="vi-metric-card__label">Revenue</span>
    <span class="vi-metric-card__value">$1.2M</span>
  </div>
</div>
```

```css
.vi-metric-card {
  background: var(--vi-sem-surface-default);
  border: 1px solid var(--vi-sem-border-default);
  border-radius: var(--vi-ref-radius-6);
  box-shadow: var(--vi-ref-shadow-1);
  display: grid;
  gap: 1rem;
  grid-template-columns: 0.35rem 1fr auto;
  padding: 1rem 1rem 1.25rem;
  position: relative;
}
.vi-metric-card__accent {
  background: var(--vi-sem-action-primary);
  border-radius: 999px;
}
.vi-metric-card__content {
  align-content: center;
  display: grid;
  gap: 0.125rem;
}
.vi-metric-card__value {
  color: var(--vi-sem-action-primary);
  font-family: 'Montserrat', 'Lato', sans-serif;
  font-size: clamp(2rem, 2.5vw, 3rem);
  font-weight: 700;
  letter-spacing: -0.02em;
  line-height: 1;
}
.vi-metric-card__label {
  color: var(--vi-sem-text-muted);
  font-family: 'Montserrat', 'Lato', sans-serif;
  font-size: 0.75rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
.vi-metric-card__icon {
  align-items: center;
  background: var(--vi-sem-surface-muted);
  border-radius: 999px;
  color: var(--vi-sem-action-primary);
  display: inline-flex;
  height: 4rem;
  justify-content: center;
  width: 4rem;
  font-size: 1.25rem;
}

/* Topped variant */
.vi-metric-card--topped {
  box-shadow: none;
  grid-template-columns: 1fr;
  padding: 0;
}
.vi-metric-card--topped .vi-metric-card__accent {
  border-radius: 0;
  grid-column: 1 / -1;
  height: 3px;
}
.vi-metric-card--topped .vi-metric-card__content {
  padding: 0.125rem 1rem 0.75rem;
}
.vi-metric-card--topped .vi-metric-card__value {
  font-size: clamp(1.5rem, 2vw, 2rem);
}
.vi-metric-card--topped .vi-metric-card__label {
  order: -1;
}
.vi-metric-card--topped .vi-metric-card__icon { display: none; }
```

---

### Data Table

Structured tabular data display.

**Options:** add `.vi-table--striped` for alternating row colors, `.vi-table--dense` for compact padding.

```html
<table class="vi-table vi-table--striped">
  <thead>
    <tr>
      <th>Task</th>
      <th>Assignee</th>
      <th>Status</th>
      <th style="text-align:right">Due</th>
    </tr>
  </thead>
  <tbody>
    <tr><td>Schema migration</td><td>Alice</td><td><span class="vi-badge vi-badge--success">Done</span></td><td style="text-align:right">Feb 10</td></tr>
    <tr><td>Auth flow update</td><td>Bob</td><td><span class="vi-badge vi-badge--warning">In Progress</span></td><td style="text-align:right">Feb 14</td></tr>
    <tr><td>API rate limiting</td><td>Dave</td><td><span class="vi-badge">To Do</span></td><td style="text-align:right">Feb 18</td></tr>
  </tbody>
</table>
```

```css
.vi-table {
  border-collapse: collapse;
  table-layout: fixed;
  width: 100%;
}
.vi-table th {
  background: var(--vi-sem-table-header-bg);
  color: var(--vi-sem-table-header-text);
  font-size: 0.75rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  padding: 0.5rem;
  text-align: left;
  text-transform: uppercase;
}
.vi-table td {
  background: var(--vi-sem-table-body-bg);
  border-bottom: 1px solid var(--vi-sem-table-border);
  color: var(--vi-sem-table-body-text);
  padding: 0.5rem;
}
.vi-table--striped tbody tr:nth-child(even) td {
  background: var(--vi-sem-table-stripe-bg);
}
.vi-table--dense th,
.vi-table--dense td {
  padding: 0.25rem 0.5rem;
}
```

---

### Alert

Full-width banner for page-level notifications.

**Tones:** info (default), success, warning, danger

```html
<div class="vi-alert vi-alert--info">Sprint 14 — 3 days remaining · 8 of 12 tasks completed</div>
<div class="vi-alert vi-alert--success">Deployment complete.</div>
<div class="vi-alert vi-alert--warning">Rate limit approaching.</div>
<div class="vi-alert vi-alert--danger">Service degraded.</div>
```

```css
.vi-alert {
  border-radius: var(--vi-ref-radius-2);
  font-size: 0.875rem;
  font-weight: 600;
  padding: 0.625rem 1rem;
}
.vi-alert--info { background: var(--vi-sem-info-lt); color: var(--vi-sem-info-dk-text); }
.vi-alert--success { background: var(--vi-sem-success-lt); color: var(--vi-sem-success-dk-text); }
.vi-alert--warning { background: var(--vi-sem-warning-lt); color: var(--vi-sem-warning-dk-text); }
.vi-alert--danger { background: var(--vi-sem-danger-lt); color: var(--vi-sem-danger-dk-text); }
```

---

### Input / Field

Text input with label wrapper.

```html
<label class="vi-field">
  <span class="vi-field__label">Issuer Name</span>
  <input class="vi-input" type="text" placeholder="Search issuer...">
</label>
```

```css
.vi-field {
  display: grid;
  gap: 0.25rem;
}
.vi-field__label {
  font-size: 0.8125rem;
  font-weight: 600;
  color: var(--vi-sem-text-default);
}
.vi-input {
  background: var(--vi-sem-surface-default);
  border: 1px solid var(--vi-sem-border-default);
  border-radius: var(--vi-ref-radius-2);
  color: var(--vi-sem-text-default);
  font-family: inherit;
  font-size: inherit;
  height: 2.125rem;
  padding: 0 0.75rem;
  transition: border-color 120ms ease;
}
.vi-input:focus {
  border-color: var(--vi-sem-action-primary);
  box-shadow: var(--vi-ref-focus-ring);
  outline: none;
}
.vi-input::placeholder { color: var(--vi-sem-text-subtle); }
```

---

### Tag

Removable label for categorization. Similar to badge but with a remove button.

```html
<span class="vi-tag vi-tag--info">Compliance</span>
<span class="vi-tag vi-tag--success">Approved</span>
<span class="vi-tag vi-tag--danger">Overdue <button class="vi-tag__remove">&times;</button></span>
```

```css
.vi-tag {
  align-items: center;
  border: 1px solid transparent;
  border-radius: 999px;
  display: inline-flex;
  font-size: 0.75rem;
  font-weight: 600;
  gap: 0.25rem;
  padding: 0.125rem 0.5rem;
}
.vi-tag--info { background: var(--vi-sem-info-lt); color: var(--vi-sem-info-dk-text); }
.vi-tag--success { background: var(--vi-sem-success-lt); color: var(--vi-sem-success-dk-text); }
.vi-tag--warning { background: var(--vi-sem-warning-lt); color: var(--vi-sem-warning-dk-text); }
.vi-tag--danger { background: var(--vi-sem-danger-lt); color: var(--vi-sem-danger-dk-text); }
.vi-tag__remove {
  background: none;
  border: none;
  color: inherit;
  cursor: pointer;
  font-size: 1em;
  line-height: 1;
  opacity: 0.6;
  padding: 0;
}
.vi-tag__remove:hover { opacity: 1; }
```

---

## Layout Utilities

These are composable layout helpers. Mix and match them freely — there is no required page structure.

```css
/* Vertical stack with consistent gap */
.vi-stack { display: flex; flex-direction: column; gap: 0.75rem; }
.vi-stack--sm { gap: 0.5rem; }
.vi-stack--lg { gap: 1rem; }
.vi-stack--xl { gap: 1.5rem; }

/* Equal-column grid */
.vi-grid { display: grid; gap: 0.75rem; }
.vi-grid--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.vi-grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.vi-grid--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }

/* Horizontal space-between */
.vi-flank { align-items: center; display: flex; justify-content: space-between; }
```

---

## Design Language

### Visual Identity
Vela Intelligence builds tools for regulated financial services. The design language is **clean, professional, and data-dense** — but not sterile. Use generous whitespace, clear hierarchy, and purposeful color to create UIs that feel trustworthy and modern.

### Spacing
- **0.25rem** tight inner spacing | **0.5rem** compact gaps | **0.75rem** standard gap | **1rem** card padding | **1.5rem** section separation
- Prefer consistent spacing over pixel-perfect alignment. When in doubt, use 0.75rem for gaps and 1rem for padding.

### Color
- **Surfaces:** `canvas` (page background), `default` (cards/panels), `muted` (secondary areas, sidebars)
- **Text:** `default` (primary), `muted` (secondary), `subtle` (captions, placeholders)
- **Status tones:** info (blue), success (green), warning (amber), danger (red) — each has `-lt` (light fill) and `-dk` (bold/text) variants
- Use `action-primary` for primary CTAs and key accents. Use status tones for data visualization and feedback.

### Typography
- **Montserrat** for headings, metric values, and prominent labels — bold weight, tight letter-spacing
- **Lato** for body text, form inputs, and captions — normal weight, comfortable line-height
- Use the `.vi-h1` through `.vi-h6` classes for headings. Use `.vi-overline` for small uppercase section labels.

### Elevation
Four shadow levels: `shadow-1` (cards), `shadow-2` (raised panels), `shadow-3` (dropdowns), `shadow-4` (modals/overlays)

### Composition Tips
- Mix metric cards, tables, and charts in grids to create dashboards
- Use callouts to highlight important information within any layout
- Cards can contain anything — text, tables, lists, charts, forms
- Badges work inline within text, table cells, or card headers
- Create your own layouts with CSS grid/flexbox — the layout utilities are just shortcuts, not constraints
