# GFS Dashboard Header Standard

**Version:** 8.0 | **Updated:** May 2026
**Reference:** [gfs-hub.pages.dev/design-system](https://gfs-hub.pages.dev/design-system)

Copy this exact `<head>` block into every GFS dashboard. No deviations.

---

## Complete Header Block

```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="theme-color" content="#092F64">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-title" content="GFS">
<title>PAGE TITLE — GFS</title>

<!-- Fonts: Inter + JetBrains Mono -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">

<!-- Icons: Lucide -->
<script src="https://unpkg.com/lucide@latest"></script>

<!-- Charts: Chart.js (only if dashboard has charts) -->
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>

<!-- KPI Animation: CountUp.js (only if dashboard has animated KPIs) -->
<script src="https://cdn.jsdelivr.net/npm/countup.js@2/dist/countUp.umd.min.js"></script>

<!-- GFS Components + Utilities -->
<link rel="stylesheet" href="css/gfs-components.css">

<style>
  :root {
    /* ═══ BRAND BLUES ═══ */
    --primary: #1A5799;
    --primary-dark: #092F64;
    --primary-mid: #468BE6;
    --primary-light: #93BFEF;
    --primary-bg: #E9F5FF;

    /* ═══ SURFACES ═══ */
    --bg-page: #F7F7F8;
    --bg-card: #FFFFFF;
    --bg-sunken: #FAFAFA;
    --bg-hover: #F0F0F0;
    --bg-active: #EBEBEB;

    /* ═══ TEXT ═══ */
    --text-heading: #1F1F1F;
    --text-body: #1F1F1F;
    --text-secondary: #4B5F7A;
    --text-muted: #6B7280;
    --text-faint: #8E8EA0;
    --text-label: #888888;
    --text-placeholder: #9CA3AF;

    /* ═══ BORDERS ═══ */
    --border: #E5E5E5;
    --border-light: #EBEBEB;
    --border-row: #F0F0F0;
    --border-hover: #D0D0D0;

    /* ═══ SEMANTIC STATUS — 8 statuses, 3 tokens each ═══ */
    /* --status       = vibrant (icons, dots, indicators)   */
    /* --status-text  = dark (text on --status-bg) WCAG AAA */
    /* --status-bg    = light (alert/badge backgrounds)     */
    --success: #10B981;    --success-text: #065F46;    --success-bg: #ECFDF5;
    --warning: #F59E0B;    --warning-text: #92400E;    --warning-bg: #FFFBEB;
    --danger: #EF4444;     --danger-text: #991B1B;     --danger-bg: #FEF2F2;
    --info: #468BE6;       --info-text: #1A5799;       --info-bg: #E9F5FF;
    --purple: #8B5CF6;     --purple-text: #7C3AED;     --purple-bg: #F5F3FF;
    --neutral: #6B7280;    --neutral-text: #4B5563;    --neutral-bg: #F3F4F6;
    --teal: #14B8A6;       --teal-text: #0D9488;       --teal-bg: #F0FDFA;
    --orange: #F97316;     --orange-text: #EA580C;     --orange-bg: #FFF7ED;

    /* ═══ LAYOUT ═══ */
    --radius: 10px;
    --radius-sm: 8px;
    --radius-lg: 12px;
    --primary-bg-hover: #f7faff;

    /* ═══ TYPOGRAPHY ═══ */
    --font-body: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
    --font-mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', monospace;
  }

  * { margin: 0; padding: 0; box-sizing: border-box; }
  body {
    font-family: var(--font-body);
    background: var(--bg-page);
    color: var(--text-body);
    line-height: 1.5;
    font-size: 15px;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    font-feature-settings: 'cv01', 'cv02';
  }
</style>
</head>
```

---

## Closing Body Block

```html
<!-- GFS Utilities — auto-inits Lucide, Chart.js defaults, [data-copyable], [data-countup] -->
<script src="js/gfs-init.js"></script>
</body>
</html>
```

---

## Rules

| Rule | Detail |
|------|--------|
| **Title format** | `Page Name — GFS` |
| **Fonts** | Inter (400/500/600/700) + JetBrains Mono (400/500/600) via Google Fonts CDN |
| **Font features** | `font-feature-settings: 'cv01', 'cv02'` on body (Inter alternate glyphs) |
| **Icons** | Lucide via unpkg CDN — init with `lucide.createIcons()` or via `gfs-init.js` |
| **Charts** | Chart.js via jsDelivr — only include if dashboard has charts |
| **CountUp** | Only include if dashboard has animated KPI numbers |
| **CSS tokens** | Copy the entire `:root` block exactly — no modifications, no partial copies |
| **Status tokens** | Always use the 3-token pattern: `--status` (icon), `--status-text` (text on bg), `--status-bg` (background) |
| **Body reset** | `* { margin: 0; padding: 0; box-sizing: border-box; }` — always included |
| **Smoothing** | `-webkit-font-smoothing: antialiased` — always included |
| **Grid columns** | Always `minmax(0,1fr)` — never plain `1fr` |
| **Numeric columns** | `font-family: var(--font-mono); font-variant-numeric: tabular-nums; text-align: right` |
| **Negative numbers** | Parentheses + `color: var(--danger)` — e.g. `($12,400)` |
| **Empty cells** | Em dash `—` — never blank |
| **Cards** | No box-shadow, `1px solid var(--border)`, `border-radius: 10px` |

---

## Do Not

- Change any hex value in `:root`
- Use a different font stack
- Add `box-shadow` to cards
- Use `1fr` instead of `minmax(0,1fr)` for equal columns
- Hardcode colors — always use `var(--token)`
- Skip the body reset or font-smoothing
- Mix icon libraries — Lucide only
- Use emoji in place of Lucide icons
- Use casual/excited language ("Yay!", "Oops!", exclamation marks)
- Name files with spaces or camelCase — always `kebab-case.html`
- Use CSS classes without the `.gfs-` prefix
- Use stock photography or decorative images in dashboards
