Visual kits for agents that need to design well
Pick what you're building, preview every kit on that surface, and hand your agent a complete visual system — fonts, colors, tokens, and component rules.
Pick what you're building, preview every kit on that surface, and hand your agent a complete visual system — fonts, colors, tokens, and component rules.
A Swiss International Style kit built on a seven-color categorical system: each section is assigned an exclusive solid matte color (sand #d4b78b, amber #e8a820, cobalt #1f62a0, orange #c95d2a, olive #7a8d52, steel-blue #85a8be, gray #c0c8cc) that fills its entire surface edge-to-edge with no imagery or decoration. Display headings run bold and lowercase in Jost 700, an identity-defining rule. A single uppercase alphabetic index letter anchors the top-right corner; a hairline horizontal rule opens each text zone. Border-radius is 0 everywhere. A deep forest green (#193924) carries the dark-mode ambient surface.
categoricalwayfinding.com
Categorical Wayfinding
Supporting copy goes here.
categoricalwayfinding.com
Categorical Wayfinding
Every kit is judged per use case against concrete criteria — chart-series distinctness, text contrast, information density — not keyword matching.
---
# Machine-readable tokens (the WHAT). The prose body gives the WHY + the rules.
# contract is THIS DOCUMENT'S shape and has nothing to do with the kit's
# revision below. It moves when a section is added, renamed or removed; a kit
# that never changed can arrive under a new one, and a kit that changed every
# token arrives under the same one. Read them independently.
#
# FIRST key on purpose. `name` is caller-supplied and yamlQuote escapes only the
# double quote, so a crafted kit name can inject lines into this block — every
# reader of this front matter honours the FIRST occurrence of a key, which puts
# an injected duplicate too late to matter.
contract: "1.0"
kit:
# The id is the durable handle; name and slug are both mutable.
# version is this record's monotonic revision: 0 = never versioned,
# null = the server did not report one. Diff against it; don't hash the file.
id: "c78c17ba-ca40-4eda-807e-db48638258ef"
version: 0
slug: "categorical-wayfinding"
name: "Categorical Wayfinding"
colors:
roles_light:
background: "#D4B78B"
foreground: "#1A1A18"
card: "#CDB586"
card-foreground: "#1A1A18"
popover: "#C8AE80"
popover-foreground: "#1A1A18"
primary: "#BE5422"
primary-foreground: "#FFFFFF"
secondary: "#85A8BE"
secondary-foreground: "#1A1A18"
muted: "#C5AA7E"
muted-foreground: "#4A3F2C"
accent: "#E8A820"
accent-foreground: "#1A1A18"
destructive: "#C0392B"
destructive-foreground: "#FFFFFF"
border: "#B0966E"
input: "#B0966E"
ring: "#BE5422"
success: "#3D7A54"
success-foreground: "#FFFFFF"
warning: "#E8A820"
warning-foreground: "#1A1A18"
chart-1: "#C95D2A"
chart-2: "#1F62A0"
chart-3: "#7A8D52"
chart-4: "#E8A820"
chart-5: "#85A8BE"
roles_dark:
background: "#193924"Three ways from the same kit: run "npx identityforge@latest apply categorical-wayfinding" with the CLI to write the tokens and DESIGN.md into your project, fetch it through the Identity Forge MCP server inside Claude Code, Cursor, or OpenCode, or install from the shadcn registry at /r/categorical-wayfinding.json with "npx shadcn add".
A complete brand system: a font pairing, 28 semantic color tokens in light and dark, a typography scale, spacing and elevation, per-element treatments, distinctive motifs, do's and don'ts, and a DESIGN.md a coding agent builds from. Exports cover shadcn registry items, Tailwind v3 and v4 themes, DTCG tokens JSON, and plain CSS variables.
Categorical Wayfinding is free: its full color tokens, fonts, DESIGN.md, and every export are available at no cost.
Supporting copy goes here.
/*
* Categorical Wayfinding — Identity Forge design kit.
* Kit id: c78c17ba-ca40-4eda-807e-db48638258ef
* Kit slug: categorical-wayfinding (a mutable alias; the id is the durable handle)
* Kit version: 0 (no version minted yet)
*/
@import url("https://fonts.googleapis.com/css2?family=Jost:wght@400;500;600;700&family=IBM%20Plex%20Mono:wght@400;500;600&display=swap");
:root {
--radius: 0rem;
--font-heading: 'Jost', sans-serif;
--font-sans: 'Jost', sans-serif;
--font-mono: 'IBM Plex Mono', monospace;
--background: 36 46% 69%;
--foreground: 60 4% 10%;
--card: 40 42% 66%;
--card-foreground: 60 4% 10%;
--popover: 38 40% 64%;
--popover-foreground: 60 4% 10%;
--primary: 19 70% 44%;
--primary-foreground: 0 0% 100%;
--secondary: 203 30% 63%;
--secondary-foreground: 60 4% 10%;
--muted: 37 38% 63%;
--muted-foreground: 38 25% 23%;
--accent: 41 81% 52%;
--accent-foreground: 60 4% 10%;
--destructive: 6 63% 46%;
--destructive-foreground: 0 0% 100%;
--border: 36 29% 56%;
--input: 36 29% 56%;
--ring: 19 70% 44%;
--success: 143 33% 36%;
--success-foreground: 0 0% 100%;
--warning: 41 81% 52%;
--warning-foreground: 60 4% 10%;
--chart-1: 19 65% 48%;
--chart-2: 209 68% 37%;
--chart-3: 79 26% 44%;
--chart-4: 41 81% 52%;
--chart-5: 203 30% 63%;
--shadow-sm: 0 1px 2px 0 rgba(0,0,0,0.06);
--shadow-md: 0 2px 4px 0 rgba(0,0,0,0.08);
--shadow-lg: 0 4px 8px 0 rgba(0,0,0,0.10);
--shadow-xl: 0 8px 16px 0 rgba(0,0,0,0.12);
--gradient-hero: linear-gradient(135deg, #d4b78b 0%, #c5a87a 100%);
--gradient-brand: linear-gradient(135deg, #e8a820 0%, #c95d2a 100%);
--gradient-subtle: linear-gradient(180deg, #d4b78b 0%, #cdb586 100%);
--duration: 150ms;
--duration-slow: 300ms;
--ease: cubic-bezier(0.0, 0.0, 0.2, 1.0);
--tracking-tight: -0.01em;
--tracking-normal: 0em;
--font-weight-heading: 700;
--font-weight-body: 400;
--button-radius: 0rem;
--card-radius: 0rem;
--input-radius: 0rem;
--badge-radius: 0rem;
--border-width: 1px;Registry
/r/categorical-wayfinding.jsonTailwind v4
/*
* Categorical Wayfinding — Identity Forge design kit.
* Kit id: c78c17ba-ca40-4eda-807e-db48638258ef
* Kit slug: categorical-wayfinding (a mutable alias; the id is the durable handle)
* Kit version: 0 (no version minted yet)
*
* Drop-in Tailwind v4 theme: font import, the custom properties the theme
* aliases, and the @theme block. Expects `@import "tailwindcss";` above it,
* and the @import lines must stay at the top of the stylesheet.
*/
@import url("https://fonts.googleapis.com/css2?family=Jost:wght@400;500;600;700&family=IBM%20Plex%20Mono:wght@400;500;600&display=swap");
:root {
--radius: 0rem;
--font-heading: 'Jost', sans-serif;
--font-sans: 'Jost', sans-serif;
--font-mono: 'IBM Plex Mono', monospace;
--background: 36 46% 69%;
--foreground: 60 4% 10%;
--card: 40 42% 66%;
--card-foreground: 60 4% 10%;
--popover: 38 40% 64%;
--popover-foreground: 60 4% 10%;
--primary: 19 70% 44%;
--primary-foreground: 0 0% 100%;
--secondary: 203 30% 63%;
--secondary-foreground: 60 4% 10%;
--muted: 37 38% 63%;
--muted-foreground: 38 25% 23%;
--accent: 41 81% 52%;
--accent-foreground: 60 4% 10%;
--destructive: 6 63% 46%;
--destructive-foreground: 0 0% 100%;
--border: 36 29% 56%;
--input: 36 29% 56%;
--ring: 19 70% 44%;
--success: 143 33% 36%;
--success-foreground: 0 0% 100%;
--warning: 41 81% 52%;
--warning-foreground: 60 4% 10%;
--chart-1: 19 65% 48%;
--chart-2: 209 68% 37%;
--chart-3: 79 26% 44%;
--chart-4: 41 81% 52%;
--chart-5: 203 30% 63%;
--shadow-sm: 0 1px 2px 0 rgba(0,0,0,0.06);
--shadow-md: 0 2px 4px 0 rgba(0,0,0,0.08);
--shadow-lg: 0 4px 8px 0 rgba(0,0,0,0.10);
--shadow-xl: 0 8px 16px 0 rgba(0,0,0,0.12);
--gradient-hero: linear-gradient(135deg, #d4b78b 0%, #c5a87a 100%);
--gradient-brand: linear-gradient(135deg, #e8a820 0%, #c95d2a 100%);
--gradient-subtle: linear-gradient(180deg, #d4b78b 0%, #cdb586 100%);
--duration: 150ms;
--duration-slow: 300ms;
--ease: cubic-bezier(0.0, 0.0, 0.2, 1.0);
--tracking-tight: -0.01em;
--tracking-normal: 0em;
--font-weight-heading: 700;
--font-weight-body: 400;
--button-radius: 0rem;
--card-radius: 0rem;
--input-radius: 0rem;
--badge-radius: 0rem;
--border-width: 1px;
--card-border-width: 1px;
--input-border-width: 1px;
--button-border-width: 1px;
--badge-border-width: 1px;
--heading-transform: none;
--label-transform: uppercase;
--kit-id: "c78c17ba-ca40-4eda-807e-db48638258ef";
--kit-version: 0;
}
.dark {
--radius: 0rem;
--font-heading: 'Jost', sans-serif;
--font-sans: 'Jost', sans-serif;
--font-mono: 'IBM Plex Mono', monospace;
--background: 141 39% 16%;
--foreground: 36 46% 69%;
--card: 147 40% 17%;
--card-foreground: 36 46% 69%;
--popover: 153 39% 18%;
--popover-foreground: 36 46% 69%;
--primary: 41 81% 52%;
--primary-foreground: 60 4% 10%;
--secondary: 151 34% 25%;
--secondary-foreground: 0 0% 100%;
--muted: 143 34% 18%;
--muted-foreground: 33 28% 62%;
--accent: 19 65% 48%;
--accent-foreground: 0 0% 0%;
--destructive: 0 67% 48%;
--destructive-foreground: 0 0% 100%;
--border: 153 28% 25%;
--input: 153 28% 25%;
--ring: 41 81% 52%;
--success: 141 36% 45%;
--success-foreground: 60 4% 10%;
--warning: 41 81% 52%;
--warning-foreground: 60 4% 10%;
--chart-1: 41 81% 52%;
--chart-2: 19 65% 48%;
--chart-3: 203 30% 63%;
--chart-4: 79 26% 44%;
--chart-5: 200 11% 78%;
}
@theme inline {
--font-heading: 'Jost', sans-serif;
--font-sans: 'Jost', sans-serif;
--font-mono: 'IBM Plex Mono', monospace;
--color-background: hsl(var(--background));
--color-foreground: hsl(var(--foreground));
--color-card: hsl(var(--card));
--color-card-foreground: hsl(var(--card-foreground));
--color-popover: hsl(var(--popover));
--color-popover-foreground: hsl(var(--popover-foreground));
--color-primary: hsl(var(--primary));
--color-primary-foreground: hsl(var(--primary-foreground));
--color-secondary: hsl(var(--secondary));
--color-secondary-foreground: hsl(var(--secondary-foreground));
--color-muted: hsl(var(--muted));
--color-muted-foreground: hsl(var(--muted-foreground));
--color-accent: hsl(var(--accent));
--color-accent-foreground: hsl(var(--accent-foreground));
--color-destructive: hsl(var(--destructive));
--color-destructive-foreground: hsl(var(--destructive-foreground));
--color-border: hsl(var(--border));
--color-input: hsl(var(--input));
--color-ring: hsl(var(--ring));
--color-success: hsl(var(--success));
--color-success-foreground: hsl(var(--success-foreground));
--color-warning: hsl(var(--warning));
--color-warning-foreground: hsl(var(--warning-foreground));
--color-chart-1: hsl(var(--chart-1));
--color-chart-2: hsl(var(--chart-2));
--color-chart-3: hsl(var(--chart-3));
--color-chart-4: hsl(var(--chart-4));
--color-chart-5: hsl(var(--chart-5));
--radius-sm: 0rem;
--radius-md: 0rem;
--radius-lg: 0rem;
--radius-xl: 0rem;
--radius-button: 0rem;
--radius-card: 0rem;
--radius-input: 0rem;
--radius-badge: 0rem;
--border-width: 1px;
--card-border-width: 1px;
--input-border-width: 1px;
--button-border-width: 1px;
--badge-border-width: 1px;
--shadow-sm: 0 1px 2px 0 rgba(0,0,0,0.06);
--shadow-md: 0 2px 4px 0 rgba(0,0,0,0.08);
--shadow-lg: 0 4px 8px 0 rgba(0,0,0,0.10);
--shadow-xl: 0 8px 16px 0 rgba(0,0,0,0.12);
--tracking-tight: -0.01em;
--tracking-normal: 0em;
--ease-kit: cubic-bezier(0.0, 0.0, 0.2, 1.0);
--duration-kit: 150ms;
--duration-kit-slow: 300ms;
--gradient-hero: linear-gradient(135deg, #d4b78b 0%, #c5a87a 100%);
--gradient-brand: linear-gradient(135deg, #e8a820 0%, #c95d2a 100%);
--gradient-subtle: linear-gradient(180deg, #d4b78b 0%, #cdb586 100%);
--font-weight-heading: 700;
--font-weight-body: 400;
}Registry payload
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "categorical-wayfinding",
"type": "registry:theme",
"title": "Categorical Wayfinding",
"description": "A Swiss modernist system where each section owns one exclusive flat matte cover color as its full edge-to-edge surface, with bold lowercase grotesque headings.",
"categories": [
"swiss-style",
"editorial",
"flat",
"multi-color",
"categorical",
"modernist",
"lowercase",
"minimal"
],© 2026 Identity Forge. All rights reserved.
Munich, Germany