FedM8 · UX · fedm8-003
Card hub + social
FedM8's standard for all new app work, approved Nov 2, 2026. Warm ground, navy for where you are, one amber action, big choice cards, Reddit-style threads, team-up (Prime, Sub, 1099) and an 'I can do this' button on every opportunity. Fully token-driven, so members can change the look at runtime. Rollout to every page is in progress.
standard
- Project
- FedM8
- Use for
- every FedM8 app screen as pages are rebuilt; every new FedM8 screen, tool or page
- Source of truth
- Original page
- Copied from
jbnx/fedm8-scan@c079166 design/003on 2026-11-06
Screens
Approved comps. Each has a text source an AI can read.
Copy the code
tokens.json
{
"id": "003",
"name": "Card hub + social",
"version": "2026-11-02",
"status": "standard",
"summary": "Warm ground, navy for 'where you are', one amber action, big choice cards, and a social layer (threads, team-up, presence) on every screen. Fully token-driven so each user can change the look at runtime.",
"page": "https://fedm8.com/design/003/",
"spec": "https://fedm8.com/design/003/spec.json",
"catalog": "https://fedm8.com/design/catalog.json",
"source_canvas": "https://claude.ai/artifact/EyVJ6iwBFst8c2BheBoS7v",
"use_for": [
"The app: every screen in fedm8.com/os",
"Every new screen, tool or page"
],
"not_for": [
"Brand marks, videos, print: design 001"
],
"precedence": "spec.json (v2 rules R1–R9) wins over the comps. Design 003 is the app standard since 2026-11-02; design 002 is retired.",
"overrides_002": [
"002 rule 'no dark theme' is replaced by runtime themes (presets + user overrides) under the contrast guard"
],
"inherits_from_catalog": [
"shared.comments_box (every page)",
"shared.plan_tile (B/P after paid tools)",
"shared.naming (Match-M8, FedM8 AI · not a member, room, Post)"
],
"how_to_use": [
"Components read ONLY semantic --fm-* tokens. Never write a hex, px size, radius or font name inside a component.",
"Apply a theme by setting data-theme on <html> and loading theme CSS generated from presets[preset] merged with the user's overrides.",
"Map catalog shared variables from semantic tokens: --pc-surface=var(--fm-surface), --pc-ink=var(--fm-ink), --pc-muted=var(--fm-ink-3), --pc-line=var(--fm-line), --pc-accent=var(--fm-action), --pc-accent-ink=var(--fm-action-ink), --pc-soft=var(--fm-surface-alt), --pc-radius=var(--fm-radius-md), --pc-font=var(--fm-font-sans); --plan-p-ink=var(--fm-pro), --plan-p-bg=var(--fm-pro-soft), --plan-p-line=var(--fm-pro), --plan-b-ink=var(--fm-accent-ink), --plan-b-bg=var(--fm-accent-soft), --plan-b-line=var(--fm-accent-ink).",
"Check every screen at 1440x1000 and 375x812, in all three colour presets."
],
"roles": {
"--fm-bg": {
"name": "Ground",
"use": "Page behind cards"
},
"--fm-surface": {
"name": "Surface",
"use": "Cards, header, fields, dialogs"
},
"--fm-surface-alt": {
"name": "Surface alt",
"use": "Highlight cards, claim bar, continue card"
},
"--fm-line": {
"name": "Line",
"use": "Hairlines, card edges"
},
"--fm-line-strong": {
"name": "Line strong",
"use": "Dashed empty states, disabled edges"
},
"--fm-ink": {
"name": "Ink",
"use": "Primary text, headings"
},
"--fm-ink-2": {
"name": "Ink 2",
"use": "Secondary text"
},
"--fm-ink-3": {
"name": "Ink 3",
"use": "Meta text (min 13px)"
},
"--fm-on-dark": {
"name": "On dark",
"use": "Text on navy/selected fills"
},
"--fm-nav-active-bg": {
"name": "Nav active",
"use": "Active nav pill, current chevron segment"
},
"--fm-nav-active-ink": {
"name": "Nav active ink",
"use": "Text on active nav"
},
"--fm-selected-bg": {
"name": "Selected",
"use": "Selected ChoiceCard"
},
"--fm-selected-ink": {
"name": "Selected ink",
"use": "Text on selected card"
},
"--fm-row-selected-bg": {
"name": "Row selected",
"use": "Selected list row / chat item (R1)"
},
"--fm-row-selected-ink": {
"name": "Row selected ink",
"use": "Text on selected row"
},
"--fm-action": {
"name": "Action",
"use": "The one primary button per screen (R2)"
},
"--fm-action-ink": {
"name": "Action ink",
"use": "Text on primary button"
},
"--fm-action-hover": {
"name": "Action hover",
"use": "Primary button hover"
},
"--fm-accent-soft": {
"name": "Accent soft",
"use": "Badges, chevron middle segment, highlights"
},
"--fm-accent-ink": {
"name": "Accent ink",
"use": "Text on accent soft"
},
"--fm-chip-selected-bg": {
"name": "Chip selected",
"use": "Selected filter chip (R7)"
},
"--fm-chip-selected-ink": {
"name": "Chip selected ink",
"use": "Text on selected chip"
},
"--fm-success": {
"name": "Success",
"use": "I can do this ON, checks, online dot"
},
"--fm-success-soft": {
"name": "Success soft",
"use": "Accepted answer, success fills"
},
"--fm-pro": {
"name": "Pro",
"use": "Pro plan tile, FedM8 AI badge"
},
"--fm-pro-soft": {
"name": "Pro soft",
"use": "Pro/AI fills"
},
"--fm-urgent": {
"name": "Urgent",
"use": "Due ≤48h (R5)"
},
"--fm-urgent-soft": {
"name": "Urgent soft",
"use": "Urgent chip fill"
},
"--fm-warn": {
"name": "Warn",
"use": "Due ≤7 days (R5)"
},
"--fm-warn-soft": {
"name": "Warn soft",
"use": "Warn chip fill"
},
"--fm-info-soft": {
"name": "Info soft",
"use": "Neutral type badges"
},
"--fm-focus-ring": {
"name": "Focus ring",
"use": "Keyboard focus, 2px, never removed"
}
},
"presets": {
"card-hub": {
"name": "Card hub (default)",
"colors": {
"--fm-bg": "#f3f1ec",
"--fm-surface": "#ffffff",
"--fm-surface-alt": "#fffaf0",
"--fm-line": "#e0dccf",
"--fm-line-strong": "#8b8676",
"--fm-ink": "#14284b",
"--fm-ink-2": "#3d4f6e",
"--fm-ink-3": "#4a5b78",
"--fm-on-dark": "#ffffff",
"--fm-nav-active-bg": "#14284b",
"--fm-nav-active-ink": "#ffffff",
"--fm-selected-bg": "#14284b",
"--fm-selected-ink": "#ffffff",
"--fm-row-selected-bg": "#fdf3dc",
"--fm-row-selected-ink": "#14284b",
"--fm-action": "#f5a524",
"--fm-action-ink": "#14284b",
"--fm-action-hover": "#e0951a",
"--fm-accent-soft": "#fde3b0",
"--fm-accent-ink": "#8a4b00",
"--fm-chip-selected-bg": "#fde3b0",
"--fm-chip-selected-ink": "#14284b",
"--fm-success": "#1f6b4a",
"--fm-success-soft": "#e3f1ea",
"--fm-pro": "#5b3a8a",
"--fm-pro-soft": "#efe8f7",
"--fm-urgent": "#a3262a",
"--fm-urgent-soft": "#fbe3e3",
"--fm-warn": "#8a4b00",
"--fm-warn-soft": "#fde3b0",
"--fm-info-soft": "#eaf0fb",
"--fm-focus-ring": "#1d4ed8"
},
"scalars": {
"--fm-density": 1,
"--fm-type-scale": 1,
"--fm-radius-scale": 1
}
},
"high-contrast": {
"name": "High contrast",
"colors": {
"--fm-bg": "#ffffff",
"--fm-surface": "#ffffff",
"--fm-surface-alt": "#fff6e0",
"--fm-line": "#5b6475",
"--fm-line-strong": "#3a4152",
"--fm-ink": "#000814",
"--fm-ink-2": "#1b2a44",
"--fm-ink-3": "#26334d",
"--fm-on-dark": "#ffffff",
"--fm-nav-active-bg": "#000814",
"--fm-nav-active-ink": "#ffffff",
"--fm-selected-bg": "#000814",
"--fm-selected-ink": "#ffffff",
"--fm-row-selected-bg": "#ffe7a8",
"--fm-row-selected-ink": "#000814",
"--fm-action": "#ffb020",
"--fm-action-ink": "#000814",
"--fm-action-hover": "#e89a00",
"--fm-accent-soft": "#ffe7a8",
"--fm-accent-ink": "#5a3000",
"--fm-chip-selected-bg": "#ffe7a8",
"--fm-chip-selected-ink": "#000814",
"--fm-success": "#0b4d31",
"--fm-success-soft": "#d4f0e2",
"--fm-pro": "#3f1f70",
"--fm-pro-soft": "#ebe0fa",
"--fm-urgent": "#7a0a0f",
"--fm-urgent-soft": "#ffd9d9",
"--fm-warn": "#5a3000",
"--fm-warn-soft": "#ffe7a8",
"--fm-info-soft": "#dde8ff",
"--fm-focus-ring": "#0033cc"
},
"scalars": {
"--fm-density": 1,
"--fm-type-scale": 1.1,
"--fm-radius-scale": 1
}
},
"dark": {
"name": "Dark",
"colors": {
"--fm-bg": "#0f1726",
"--fm-surface": "#172238",
"--fm-surface-alt": "#1d2a44",
"--fm-line": "#2c3c5c",
"--fm-line-strong": "#7085ad",
"--fm-ink": "#eef2f8",
"--fm-ink-2": "#c6d0e2",
"--fm-ink-3": "#a9b6cd",
"--fm-on-dark": "#0f1726",
"--fm-nav-active-bg": "#e8edf6",
"--fm-nav-active-ink": "#14284b",
"--fm-selected-bg": "#e8edf6",
"--fm-selected-ink": "#14284b",
"--fm-row-selected-bg": "#26365a",
"--fm-row-selected-ink": "#eef2f8",
"--fm-action": "#f5a524",
"--fm-action-ink": "#14284b",
"--fm-action-hover": "#ffb948",
"--fm-accent-soft": "#3a2e16",
"--fm-accent-ink": "#f5c46b",
"--fm-chip-selected-bg": "#3a2e16",
"--fm-chip-selected-ink": "#f5c46b",
"--fm-success": "#6fd3a3",
"--fm-success-soft": "#163328",
"--fm-pro": "#c7a8f0",
"--fm-pro-soft": "#2a2140",
"--fm-urgent": "#ff9a9a",
"--fm-urgent-soft": "#3a1d22",
"--fm-warn": "#f5c46b",
"--fm-warn-soft": "#3a2e16",
"--fm-info-soft": "#1f2d4a",
"--fm-focus-ring": "#8fb4ff"
},
"scalars": {
"--fm-density": 1,
"--fm-type-scale": 1,
"--fm-radius-scale": 1
}
},
"compact": {
"name": "Compact",
"colors": "card-hub",
"scalars": {
"--fm-density": 0.85,
"--fm-type-scale": 0.95,
"--fm-radius-scale": 0.75
}
}
},
"scalars": {
"type": {
"--fm-font-sans": "\"Plus Jakarta Sans\", ui-sans-serif, system-ui, sans-serif",
"--fm-font-mono": "\"JetBrains Mono\", ui-monospace, monospace",
"--fm-text-xs": "calc(12px * var(--fm-type-scale))",
"--fm-text-sm": "calc(13px * var(--fm-type-scale))",
"--fm-text-md": "calc(15px * var(--fm-type-scale))",
"--fm-text-lg": "calc(18px * var(--fm-type-scale))",
"--fm-text-xl": "calc(22px * var(--fm-type-scale))",
"--fm-text-2xl": "calc(28px * var(--fm-type-scale))",
"--fm-text-3xl": "calc(34px * var(--fm-type-scale))",
"--fm-text-stat": "calc(40px * var(--fm-type-scale))",
"--fm-weight-regular": "400",
"--fm-weight-medium": "500",
"--fm-weight-semibold": "600",
"--fm-weight-bold": "700"
},
"space": {
"--fm-space-1": "calc(4px * var(--fm-density))",
"--fm-space-2": "calc(8px * var(--fm-density))",
"--fm-space-3": "calc(12px * var(--fm-density))",
"--fm-space-4": "calc(16px * var(--fm-density))",
"--fm-space-5": "calc(20px * var(--fm-density))",
"--fm-space-6": "calc(24px * var(--fm-density))",
"--fm-space-7": "calc(32px * var(--fm-density))",
"--fm-space-8": "calc(48px * var(--fm-density))"
},
"shape": {
"--fm-radius-sm": "calc(8px * var(--fm-radius-scale))",
"--fm-radius-md": "calc(12px * var(--fm-radius-scale))",
"--fm-radius-lg": "calc(16px * var(--fm-radius-scale))",
"--fm-radius-xl": "calc(20px * var(--fm-radius-scale))",
"--fm-radius-pill": "999px",
"--fm-border-width": "1px",
"--fm-shadow-1": "0 1px 2px rgba(20,40,75,.06)",
"--fm-shadow-2": "0 6px 20px rgba(20,40,75,.10)"
},
"motion": {
"--fm-motion-fast": "120ms",
"--fm-motion-base": "200ms",
"--fm-ease": "cubic-bezier(.2,.7,.2,1)"
},
"layout": {
"--fm-page-max": "1440px",
"--fm-gutter": "24px",
"--fm-gutter-mobile": "16px",
"--fm-rail-left": "320px",
"--fm-rail-right": "320px",
"--fm-tap-min": "44px",
"--fm-header-h": "64px"
}
},
"user_limits": {
"--fm-type-scale": {
"min": 0.9,
"max": 1.3,
"step": 0.05,
"default": 1,
"label": "Text size"
},
"--fm-density": {
"options": {
"compact": 0.85,
"comfortable": 1,
"roomy": 1.15
},
"default": "comfortable",
"label": "Spacing"
},
"--fm-radius-scale": {
"options": {
"square": 0.25,
"rounded": 1,
"extra-round": 1.5
},
"default": "rounded",
"label": "Corners"
},
"accent": {
"swatches": [
"#f5a524",
"#2f7de1",
"#1f8a5b",
"#c2410c",
"#7c3aed"
],
"applies_to": [
"--fm-action",
"--fm-action-hover",
"--fm-accent-soft",
"--fm-chip-selected-bg"
],
"rule": "Only swatches that keep every PAIRS check ≥ min in the active preset are offered; ink is chosen automatically (dark or white) for ≥4.5:1."
},
"reduce_motion": {
"type": "boolean",
"default": "follows OS prefers-reduced-motion"
},
"preset": {
"options": [
"card-hub",
"high-contrast",
"dark",
"compact"
],
"default": "card-hub"
}
},
"theme_schema": "https://fedm8.com/design/003/theme.schema.json",
"contrast": {
"card-hub": [
{
"fg": "--fm-ink",
"bg": "--fm-bg",
"fg_hex": "#14284b",
"bg_hex": "#f3f1ec",
"ratio": 12.97,
"min": 4.5,
"pass": true,
"use": "Body on ground"
},
{
"fg": "--fm-ink",
"bg": "--fm-surface",
"fg_hex": "#14284b",
"bg_hex": "#ffffff",
"ratio": 14.64,
"min": 4.5,
"pass": true,
"use": "Body on card"
},
{
"fg": "--fm-ink-2",
"bg": "--fm-surface",
"fg_hex": "#3d4f6e",
"bg_hex": "#ffffff",
"ratio": 8.26,
"min": 4.5,
"pass": true,
"use": "Secondary on card"
},
{
"fg": "--fm-ink-3",
"bg": "--fm-bg",
"fg_hex": "#4a5b78",
"bg_hex": "#f3f1ec",
"ratio": 6.08,
"min": 4.5,
"pass": true,
"use": "Meta on ground"
},
{
"fg": "--fm-ink-3",
"bg": "--fm-surface",
"fg_hex": "#4a5b78",
"bg_hex": "#ffffff",
"ratio": 6.87,
"min": 4.5,
"pass": true,
"use": "Meta on card"
},
{
"fg": "--fm-ink-3",
"bg": "--fm-surface-alt",
"fg_hex": "#4a5b78",
"bg_hex": "#fffaf0",
"ratio": 6.6,
"min": 4.5,
"pass": true,
"use": "Meta on highlight card"
},
{
"fg": "--fm-nav-active-ink",
"bg": "--fm-nav-active-bg",
"fg_hex": "#ffffff",
"bg_hex": "#14284b",
"ratio": 14.64,
"min": 4.5,
"pass": true,
"use": "Active nav"
},
{
"fg": "--fm-selected-ink",
"bg": "--fm-selected-bg",
"fg_hex": "#ffffff",
"bg_hex": "#14284b",
"ratio": 14.64,
"min": 4.5,
"pass": true,
"use": "Selected card text"
},
{
"fg": "--fm-row-selected-ink",
"bg": "--fm-row-selected-bg",
"fg_hex": "#14284b",
"bg_hex": "#fdf3dc",
"ratio": 13.26,
"min": 4.5,
"pass": true,
"use": "Selected row"
},
{
"fg": "--fm-action-ink",
"bg": "--fm-action",
"fg_hex": "#14284b",
"bg_hex": "#f5a524",
"ratio": 7.17,
"min": 4.5,
"pass": true,
"use": "Primary button"
},
{
"fg": "--fm-accent-ink",
"bg": "--fm-accent-soft",
"fg_hex": "#8a4b00",
"bg_hex": "#fde3b0",
"ratio": 5.44,
"min": 4.5,
"pass": true,
"use": "Badge"
},
{
"fg": "--fm-chip-selected-ink",
"bg": "--fm-chip-selected-bg",
"fg_hex": "#14284b",
"bg_hex": "#fde3b0",
"ratio": 11.7,
"min": 4.5,
"pass": true,
"use": "Selected chip"
},
{
"fg": "--fm-success",
"bg": "--fm-success-soft",
"fg_hex": "#1f6b4a",
"bg_hex": "#e3f1ea",
"ratio": 5.53,
"min": 4.5,
"pass": true,
"use": "Success text"
},
{
"fg": "--fm-success",
"bg": "--fm-surface",
"fg_hex": "#1f6b4a",
"bg_hex": "#ffffff",
"ratio": 6.44,
"min": 4.5,
"pass": true,
"use": "Success on card"
},
{
"fg": "--fm-pro",
"bg": "--fm-pro-soft",
"fg_hex": "#5b3a8a",
"bg_hex": "#efe8f7",
"ratio": 7.26,
"min": 4.5,
"pass": true,
"use": "Pro tag"
},
{
"fg": "--fm-urgent",
"bg": "--fm-urgent-soft",
"fg_hex": "#a3262a",
"bg_hex": "#fbe3e3",
"ratio": 6.0,
"min": 4.5,
"pass": true,
"use": "Urgent chip"
},
{
"fg": "--fm-urgent",
"bg": "--fm-surface",
"fg_hex": "#a3262a",
"bg_hex": "#ffffff",
"ratio": 7.32,
"min": 4.5,
"pass": true,
"use": "Urgent on card"
},
{
"fg": "--fm-warn",
"bg": "--fm-warn-soft",
"fg_hex": "#8a4b00",
"bg_hex": "#fde3b0",
"ratio": 5.44,
"min": 4.5,
"pass": true,
"use": "Warn chip"
},
{
"fg": "--fm-ink",
"bg": "--fm-info-soft",
"fg_hex": "#14284b",
"bg_hex": "#eaf0fb",
"ratio": 12.79,
"min": 4.5,
"pass": true,
"use": "Type badge"
},
{
"fg": "--fm-line-strong",
"bg": "--fm-surface",
"fg_hex": "#8b8676",
"bg_hex": "#ffffff",
"ratio": 3.64,
"min": 3.0,
"pass": true,
"use": "Non-text edges"
},
{
"fg": "--fm-focus-ring",
"bg": "--fm-surface",
"fg_hex": "#1d4ed8",
"bg_hex": "#ffffff",
"ratio": 6.7,
"min": 3.0,
"pass": true,
"use": "Focus ring"
},
{
"fg": "--fm-success",
"bg": "--fm-bg",
"fg_hex": "#1f6b4a",
"bg_hex": "#f3f1ec",
"ratio": 5.71,
"min": 3.0,
"pass": true,
"use": "Online dot / toggle ON"
}
],
"high-contrast": [
{
"fg": "--fm-ink",
"bg": "--fm-bg",
"fg_hex": "#000814",
"bg_hex": "#ffffff",
"ratio": 20.1,
"min": 4.5,
"pass": true,
"use": "Body on ground"
},
{
"fg": "--fm-ink",
"bg": "--fm-surface",
"fg_hex": "#000814",
"bg_hex": "#ffffff",
"ratio": 20.1,
"min": 4.5,
"pass": true,
"use": "Body on card"
},
{
"fg": "--fm-ink-2",
"bg": "--fm-surface",
"fg_hex": "#1b2a44",
"bg_hex": "#ffffff",
"ratio": 14.37,
"min": 4.5,
"pass": true,
"use": "Secondary on card"
},
{
"fg": "--fm-ink-3",
"bg": "--fm-bg",
"fg_hex": "#26334d",
"bg_hex": "#ffffff",
"ratio": 12.63,
"min": 4.5,
"pass": true,
"use": "Meta on ground"
},
{
"fg": "--fm-ink-3",
"bg": "--fm-surface",
"fg_hex": "#26334d",
"bg_hex": "#ffffff",
"ratio": 12.63,
"min": 4.5,
"pass": true,
"use": "Meta on card"
},
{
"fg": "--fm-ink-3",
"bg": "--fm-surface-alt",
"fg_hex": "#26334d",
"bg_hex": "#fff6e0",
"ratio": 11.73,
"min": 4.5,
"pass": true,
"use": "Meta on highlight card"
},
{
"fg": "--fm-nav-active-ink",
"bg": "--fm-nav-active-bg",
"fg_hex": "#ffffff",
"bg_hex": "#000814",
"ratio": 20.1,
"min": 4.5,
"pass": true,
"use": "Active nav"
},
{
"fg": "--fm-selected-ink",
"bg": "--fm-selected-bg",
"fg_hex": "#ffffff",
"bg_hex": "#000814",
"ratio": 20.1,
"min": 4.5,
"pass": true,
"use": "Selected card text"
},
{
"fg": "--fm-row-selected-ink",
"bg": "--fm-row-selected-bg",
"fg_hex": "#000814",
"bg_hex": "#ffe7a8",
"ratio": 16.51,
"min": 4.5,
"pass": true,
"use": "Selected row"
},
{
"fg": "--fm-action-ink",
"bg": "--fm-action",
"fg_hex": "#000814",
"bg_hex": "#ffb020",
"ratio": 10.99,
"min": 4.5,
"pass": true,
"use": "Primary button"
},
{
"fg": "--fm-accent-ink",
"bg": "--fm-accent-soft",
"fg_hex": "#5a3000",
"bg_hex": "#ffe7a8",
"ratio": 9.29,
"min": 4.5,
"pass": true,
"use": "Badge"
},
{
"fg": "--fm-chip-selected-ink",
"bg": "--fm-chip-selected-bg",
"fg_hex": "#000814",
"bg_hex": "#ffe7a8",
"ratio": 16.51,
"min": 4.5,
"pass": true,
"use": "Selected chip"
},
{
"fg": "--fm-success",
"bg": "--fm-success-soft",
"fg_hex": "#0b4d31",
"bg_hex": "#d4f0e2",
"ratio": 8.19,
"min": 4.5,
"pass": true,
"use": "Success text"
},
{
"fg": "--fm-success",
"bg": "--fm-surface",
"fg_hex": "#0b4d31",
"bg_hex": "#ffffff",
"ratio": 9.91,
"min": 4.5,
"pass": true,
"use": "Success on card"
},
{
"fg": "--fm-pro",
"bg": "--fm-pro-soft",
"fg_hex": "#3f1f70",
"bg_hex": "#ebe0fa",
"ratio": 10.1,
"min": 4.5,
"pass": true,
"use": "Pro tag"
},
{
"fg": "--fm-urgent",
"bg": "--fm-urgent-soft",
"fg_hex": "#7a0a0f",
"bg_hex": "#ffd9d9",
"ratio": 8.62,
"min": 4.5,
"pass": true,
"use": "Urgent chip"
},
{
"fg": "--fm-urgent",
"bg": "--fm-surface",
"fg_hex": "#7a0a0f",
"bg_hex": "#ffffff",
"ratio": 11.18,
"min": 4.5,
"pass": true,
"use": "Urgent on card"
},
{
"fg": "--fm-warn",
"bg": "--fm-warn-soft",
"fg_hex": "#5a3000",
"bg_hex": "#ffe7a8",
"ratio": 9.29,
"min": 4.5,
"pass": true,
"use": "Warn chip"
},
{
"fg": "--fm-ink",
"bg": "--fm-info-soft",
"fg_hex": "#000814",
"bg_hex": "#dde8ff",
"ratio": 16.33,
"min": 4.5,
"pass": true,
"use": "Type badge"
},
{
"fg": "--fm-line-strong",
"bg": "--fm-surface",
"fg_hex": "#3a4152",
"bg_hex": "#ffffff",
"ratio": 10.2,
"min": 3.0,
"pass": true,
"use": "Non-text edges"
},
{
"fg": "--fm-focus-ring",
"bg": "--fm-surface",
"fg_hex": "#0033cc",
"bg_hex": "#ffffff",
"ratio": 8.95,
"min": 3.0,
"pass": true,
"use": "Focus ring"
},
{
"fg": "--fm-success",
"bg": "--fm-bg",
"fg_hex": "#0b4d31",
"bg_hex": "#ffffff",
"ratio": 9.91,
"min": 3.0,
"pass": true,
"use": "Online dot / toggle ON"
}
],
"dark": [
{
"fg": "--fm-ink",
"bg": "--fm-bg",
"fg_hex": "#eef2f8",
"bg_hex": "#0f1726",
"ratio": 15.96,
"min": 4.5,
"pass": true,
"use": "Body on ground"
},
{
"fg": "--fm-ink",
"bg": "--fm-surface",
"fg_hex": "#eef2f8",
"bg_hex": "#172238",
"ratio": 14.14,
"min": 4.5,
"pass": true,
"use": "Body on card"
},
{
"fg": "--fm-ink-2",
"bg": "--fm-surface",
"fg_hex": "#c6d0e2",
"bg_hex": "#172238",
"ratio": 10.23,
"min": 4.5,
"pass": true,
"use": "Secondary on card"
},
{
"fg": "--fm-ink-3",
"bg": "--fm-bg",
"fg_hex": "#a9b6cd",
"bg_hex": "#0f1726",
"ratio": 8.76,
"min": 4.5,
"pass": true,
"use": "Meta on ground"
},
{
"fg": "--fm-ink-3",
"bg": "--fm-surface",
"fg_hex": "#a9b6cd",
"bg_hex": "#172238",
"ratio": 7.76,
"min": 4.5,
"pass": true,
"use": "Meta on card"
},
{
"fg": "--fm-ink-3",
"bg": "--fm-surface-alt",
"fg_hex": "#a9b6cd",
"bg_hex": "#1d2a44",
"ratio": 6.99,
"min": 4.5,
"pass": true,
"use": "Meta on highlight card"
},
{
"fg": "--fm-nav-active-ink",
"bg": "--fm-nav-active-bg",
"fg_hex": "#14284b",
"bg_hex": "#e8edf6",
"ratio": 12.46,
"min": 4.5,
"pass": true,
"use": "Active nav"
},
{
"fg": "--fm-selected-ink",
"bg": "--fm-selected-bg",
"fg_hex": "#14284b",
"bg_hex": "#e8edf6",
"ratio": 12.46,
"min": 4.5,
"pass": true,
"use": "Selected card text"
},
{
"fg": "--fm-row-selected-ink",
"bg": "--fm-row-selected-bg",
"fg_hex": "#eef2f8",
"bg_hex": "#26365a",
"ratio": 10.63,
"min": 4.5,
"pass": true,
"use": "Selected row"
},
{
"fg": "--fm-action-ink",
"bg": "--fm-action",
"fg_hex": "#14284b",
"bg_hex": "#f5a524",
"ratio": 7.17,
"min": 4.5,
"pass": true,
"use": "Primary button"
},
{
"fg": "--fm-accent-ink",
"bg": "--fm-accent-soft",
"fg_hex": "#f5c46b",
"bg_hex": "#3a2e16",
"ratio": 8.21,
"min": 4.5,
"pass": true,
"use": "Badge"
},
{
"fg": "--fm-chip-selected-ink",
"bg": "--fm-chip-selected-bg",
"fg_hex": "#f5c46b",
"bg_hex": "#3a2e16",
"ratio": 8.21,
"min": 4.5,
"pass": true,
"use": "Selected chip"
},
{
"fg": "--fm-success",
"bg": "--fm-success-soft",
"fg_hex": "#6fd3a3",
"bg_hex": "#163328",
"ratio": 7.49,
"min": 4.5,
"pass": true,
"use": "Success text"
},
{
"fg": "--fm-success",
"bg": "--fm-surface",
"fg_hex": "#6fd3a3",
"bg_hex": "#172238",
"ratio": 8.71,
"min": 4.5,
"pass": true,
"use": "Success on card"
},
{
"fg": "--fm-pro",
"bg": "--fm-pro-soft",
"fg_hex": "#c7a8f0",
"bg_hex": "#2a2140",
"ratio": 7.4,
"min": 4.5,
"pass": true,
"use": "Pro tag"
},
{
"fg": "--fm-urgent",
"bg": "--fm-urgent-soft",
"fg_hex": "#ff9a9a",
"bg_hex": "#3a1d22",
"ratio": 7.5,
"min": 4.5,
"pass": true,
"use": "Urgent chip"
},
{
"fg": "--fm-urgent",
"bg": "--fm-surface",
"fg_hex": "#ff9a9a",
"bg_hex": "#172238",
"ratio": 7.82,
"min": 4.5,
"pass": true,
"use": "Urgent on card"
},
{
"fg": "--fm-warn",
"bg": "--fm-warn-soft",
"fg_hex": "#f5c46b",
"bg_hex": "#3a2e16",
"ratio": 8.21,
"min": 4.5,
"pass": true,
"use": "Warn chip"
},
{
"fg": "--fm-ink",
"bg": "--fm-info-soft",
"fg_hex": "#eef2f8",
"bg_hex": "#1f2d4a",
"ratio": 12.2,
"min": 4.5,
"pass": true,
"use": "Type badge"
},
{
"fg": "--fm-line-strong",
"bg": "--fm-surface",
"fg_hex": "#7085ad",
"bg_hex": "#172238",
"ratio": 4.27,
"min": 3.0,
"pass": true,
"use": "Non-text edges"
},
{
"fg": "--fm-focus-ring",
"bg": "--fm-surface",
"fg_hex": "#8fb4ff",
"bg_hex": "#172238",
"ratio": 7.67,
"min": 3.0,
"pass": true,
"use": "Focus ring"
},
{
"fg": "--fm-success",
"bg": "--fm-bg",
"fg_hex": "#6fd3a3",
"bg_hex": "#0f1726",
"ratio": 9.84,
"min": 3.0,
"pass": true,
"use": "Online dot / toggle ON"
}
]
},
"avatar_palette": [
"#14284b",
"#1f6b4a",
"#5b3a8a",
"#8a4b00",
"#a3262a",
"#2f5d8a"
],
"approved": "2026-11-02"
}design-003.css
/* FedM8 design 003 — generated from tokens.json. Do not edit by hand. */
:root{
--fm-font-sans:"Plus Jakarta Sans", ui-sans-serif, system-ui, sans-serif;
--fm-font-mono:"JetBrains Mono", ui-monospace, monospace;
--fm-text-xs:calc(12px * var(--fm-type-scale));
--fm-text-sm:calc(13px * var(--fm-type-scale));
--fm-text-md:calc(15px * var(--fm-type-scale));
--fm-text-lg:calc(18px * var(--fm-type-scale));
--fm-text-xl:calc(22px * var(--fm-type-scale));
--fm-text-2xl:calc(28px * var(--fm-type-scale));
--fm-text-3xl:calc(34px * var(--fm-type-scale));
--fm-text-stat:calc(40px * var(--fm-type-scale));
--fm-weight-regular:400;
--fm-weight-medium:500;
--fm-weight-semibold:600;
--fm-weight-bold:700;
--fm-space-1:calc(4px * var(--fm-density));
--fm-space-2:calc(8px * var(--fm-density));
--fm-space-3:calc(12px * var(--fm-density));
--fm-space-4:calc(16px * var(--fm-density));
--fm-space-5:calc(20px * var(--fm-density));
--fm-space-6:calc(24px * var(--fm-density));
--fm-space-7:calc(32px * var(--fm-density));
--fm-space-8:calc(48px * var(--fm-density));
--fm-radius-sm:calc(8px * var(--fm-radius-scale));
--fm-radius-md:calc(12px * var(--fm-radius-scale));
--fm-radius-lg:calc(16px * var(--fm-radius-scale));
--fm-radius-xl:calc(20px * var(--fm-radius-scale));
--fm-radius-pill:999px;
--fm-border-width:1px;
--fm-shadow-1:0 1px 2px rgba(20,40,75,.06);
--fm-shadow-2:0 6px 20px rgba(20,40,75,.10);
--fm-motion-fast:120ms;
--fm-motion-base:200ms;
--fm-ease:cubic-bezier(.2,.7,.2,1);
--fm-page-max:1440px;
--fm-gutter:24px;
--fm-gutter-mobile:16px;
--fm-rail-left:320px;
--fm-rail-right:320px;
--fm-tap-min:44px;
--fm-header-h:64px;
--fm-density:1;
--fm-type-scale:1;
--fm-radius-scale:1;
--fm-bg:#f3f1ec;
--fm-surface:#ffffff;
--fm-surface-alt:#fffaf0;
--fm-line:#e0dccf;
--fm-line-strong:#8b8676;
--fm-ink:#14284b;
--fm-ink-2:#3d4f6e;
--fm-ink-3:#4a5b78;
--fm-on-dark:#ffffff;
--fm-nav-active-bg:#14284b;
--fm-nav-active-ink:#ffffff;
--fm-selected-bg:#14284b;
--fm-selected-ink:#ffffff;
--fm-row-selected-bg:#fdf3dc;
--fm-row-selected-ink:#14284b;
--fm-action:#f5a524;
--fm-action-ink:#14284b;
--fm-action-hover:#e0951a;
--fm-accent-soft:#fde3b0;
--fm-accent-ink:#8a4b00;
--fm-chip-selected-bg:#fde3b0;
--fm-chip-selected-ink:#14284b;
--fm-success:#1f6b4a;
--fm-success-soft:#e3f1ea;
--fm-pro:#5b3a8a;
--fm-pro-soft:#efe8f7;
--fm-urgent:#a3262a;
--fm-urgent-soft:#fbe3e3;
--fm-warn:#8a4b00;
--fm-warn-soft:#fde3b0;
--fm-info-soft:#eaf0fb;
--fm-focus-ring:#1d4ed8;
}
:root[data-theme="card-hub"]{--fm-bg:#f3f1ec;--fm-surface:#ffffff;--fm-surface-alt:#fffaf0;--fm-line:#e0dccf;--fm-line-strong:#8b8676;--fm-ink:#14284b;--fm-ink-2:#3d4f6e;--fm-ink-3:#4a5b78;--fm-on-dark:#ffffff;--fm-nav-active-bg:#14284b;--fm-nav-active-ink:#ffffff;--fm-selected-bg:#14284b;--fm-selected-ink:#ffffff;--fm-row-selected-bg:#fdf3dc;--fm-row-selected-ink:#14284b;--fm-action:#f5a524;--fm-action-ink:#14284b;--fm-action-hover:#e0951a;--fm-accent-soft:#fde3b0;--fm-accent-ink:#8a4b00;--fm-chip-selected-bg:#fde3b0;--fm-chip-selected-ink:#14284b;--fm-success:#1f6b4a;--fm-success-soft:#e3f1ea;--fm-pro:#5b3a8a;--fm-pro-soft:#efe8f7;--fm-urgent:#a3262a;--fm-urgent-soft:#fbe3e3;--fm-warn:#8a4b00;--fm-warn-soft:#fde3b0;--fm-info-soft:#eaf0fb;--fm-focus-ring:#1d4ed8;--fm-density:1;--fm-type-scale:1;--fm-radius-scale:1;}
:root[data-theme="high-contrast"]{--fm-bg:#ffffff;--fm-surface:#ffffff;--fm-surface-alt:#fff6e0;--fm-line:#5b6475;--fm-line-strong:#3a4152;--fm-ink:#000814;--fm-ink-2:#1b2a44;--fm-ink-3:#26334d;--fm-on-dark:#ffffff;--fm-nav-active-bg:#000814;--fm-nav-active-ink:#ffffff;--fm-selected-bg:#000814;--fm-selected-ink:#ffffff;--fm-row-selected-bg:#ffe7a8;--fm-row-selected-ink:#000814;--fm-action:#ffb020;--fm-action-ink:#000814;--fm-action-hover:#e89a00;--fm-accent-soft:#ffe7a8;--fm-accent-ink:#5a3000;--fm-chip-selected-bg:#ffe7a8;--fm-chip-selected-ink:#000814;--fm-success:#0b4d31;--fm-success-soft:#d4f0e2;--fm-pro:#3f1f70;--fm-pro-soft:#ebe0fa;--fm-urgent:#7a0a0f;--fm-urgent-soft:#ffd9d9;--fm-warn:#5a3000;--fm-warn-soft:#ffe7a8;--fm-info-soft:#dde8ff;--fm-focus-ring:#0033cc;--fm-density:1;--fm-type-scale:1.1;--fm-radius-scale:1;}
:root[data-theme="dark"]{--fm-bg:#0f1726;--fm-surface:#172238;--fm-surface-alt:#1d2a44;--fm-line:#2c3c5c;--fm-line-strong:#7085ad;--fm-ink:#eef2f8;--fm-ink-2:#c6d0e2;--fm-ink-3:#a9b6cd;--fm-on-dark:#0f1726;--fm-nav-active-bg:#e8edf6;--fm-nav-active-ink:#14284b;--fm-selected-bg:#e8edf6;--fm-selected-ink:#14284b;--fm-row-selected-bg:#26365a;--fm-row-selected-ink:#eef2f8;--fm-action:#f5a524;--fm-action-ink:#14284b;--fm-action-hover:#ffb948;--fm-accent-soft:#3a2e16;--fm-accent-ink:#f5c46b;--fm-chip-selected-bg:#3a2e16;--fm-chip-selected-ink:#f5c46b;--fm-success:#6fd3a3;--fm-success-soft:#163328;--fm-pro:#c7a8f0;--fm-pro-soft:#2a2140;--fm-urgent:#ff9a9a;--fm-urgent-soft:#3a1d22;--fm-warn:#f5c46b;--fm-warn-soft:#3a2e16;--fm-info-soft:#1f2d4a;--fm-focus-ring:#8fb4ff;--fm-density:1;--fm-type-scale:1;--fm-radius-scale:1;}
:root[data-density="compact"]{--fm-density:.85}:root[data-density="roomy"]{--fm-density:1.15}
:root[data-corners="square"]{--fm-radius-scale:.25}:root[data-corners="extra-round"]{--fm-radius-scale:1.5}
@media (prefers-reduced-motion: reduce){:root{--fm-motion-fast:0ms;--fm-motion-base:0ms}}:root[data-reduce-motion="true"]{--fm-motion-fast:0ms;--fm-motion-base:0ms}
/* catalog shared bridges */ :root{--pc-surface:var(--fm-surface);--pc-ink:var(--fm-ink);--pc-muted:var(--fm-ink-3);--pc-line:var(--fm-line);--pc-accent:var(--fm-action);--pc-accent-ink:var(--fm-action-ink);--pc-soft:var(--fm-surface-alt);--pc-radius:var(--fm-radius-md);--pc-font:var(--fm-font-sans);--plan-p-ink:var(--fm-pro);--plan-p-bg:var(--fm-pro-soft);--plan-p-line:var(--fm-pro);--plan-b-ink:var(--fm-accent-ink);--plan-b-bg:var(--fm-accent-soft);--plan-b-line:var(--fm-accent-ink)}
All files
- DESIGN.md
- acceptance/community.json
- acceptance/messages.json
- acceptance/mobile-community.json
- acceptance/mobile-home.json
- components-page.css
- components-page.js
- comps/01-home.dc.txt
- comps/02-find-work.dc.txt
- comps/03-grants.dc.txt
- comps/04-pipeline.dc.txt
- comps/05-teaming.dc.txt
- comps/06-profile.dc.txt
- comps/07-messages.dc.txt
- comps/08-community.dc.txt
- comps/09-veterans.dc.txt
- comps/10-certs.dc.txt
- comps/11-learn.dc.txt
- comps/12-settings.dc.txt
- comps/Main.dc.txt
- comps/m1-home.dc.txt
- comps/m2-contract.dc.txt
- comps/m3-community.dc.txt
- design-003-boot.js
- design-003-page.css
- design-003-page.js
- design-003-review.pdf
- design-003.css
- screens/01-home.png
- screens/02-find-work.png
- screens/03-grants.png
- screens/04-pipeline.png
- screens/05-teaming.png
- screens/06-profile.png
- screens/07-messages.png
- screens/08-community.png
- screens/09-veterans.png
- screens/10-certs.png
- screens/11-learn.png
- screens/12-settings.png
- screens/Main.png
- screens/m1-home.png
- screens/m2-contract.png
- screens/m3-community.png
- source-components.html
- source-page.html
- spec.json
- spec.md
- status.json
- theme.schema.json
- tokens.json
source-*.html files are the original page source, served as text. Open the original page for the live, interactive version.