Typography
The quick brown fox jumps
The quick brown fox jumps
The quick brown fox jumps
The quick brown fox jumps
A portable design language for agents: download the markdown first, then inspect the preview, tokens, and rules as needed.
Portable DESIGN.md — tokens plus the paired art style. Agents must generate real images.
Compose as boards that resolve: a masthead cell-title, editorial body columns, and data set into departure-board rows. Content bands breathe; never box the chrome or trap nav in a pill bar.
Lead with Bricolage display against Schibsted body (extreme weight contrast); Martian mono runs cells, readouts, and micro-labels. Flare marks the one resolved/live/chosen element per view.
Airy editorial reading with tight mono readouts; generous padding above titles; one strict type scale, no one-off sizes.
Editorial board layout on a max-1240px measure. Masthead cell-title, asymmetric content columns, and data as departure-board rows. Full-bleed hero image only; contained content centered on ultra-wide. Tablet keeps two-column layouts; mobile stacks to one column and compacts so no scene or card clips. Navigation breathes as type and space, never a boxed pill bar.
Use Vane where content should command attention and confirm itself as it arrives: departure and arrival boards, editorial front pages and reading rooms, launch pages, scoreboards, live-ops consoles. Ration flare to the resolved. Keep three type roles, radii from {0,16,24,9999}, body at 17px, and no borders except the flap-seam hairline. Respect prefers-reduced-motion: the resolved board reads with no JavaScript.
Cadence chronophotographs: one subject caught across every phase of a move, silver on charcoal, a single molten flare on the resolved frame — woven through the landing as parallax plates and masked reveals.
cadence
stroboscopic long-exposure chronophotography; overlapping motion phases; single warm accent streak; deep charcoal negative space
silver and charcoal monochrome with one molten-orange flare on warm paper
# Vane
## Philosophy
Vane is split-flap kinetic typography: language set in mechanical character cells where meaning is never printed, it resolves. Cells riffle through the glyph set and lock, one by one, until the board tells the truth. Typography is the interface and motion is the reveal that confirms a value; the flip is the whole point. Vane keeps the soul of a kinetic, motion-first, editorial language — high-contrast monochrome with a single molten signal — and gives it one ownable machine: the split-flap board. Warm paper and charcoal slate carry the ground; flare fires only on the resolved, the live, the chosen. For boards that announce and confirm.
## Tokens
### Colors
| Name | Value |
|------|-------|
| bg | `#F4F3EE` |
| surface | `#FFFFFF` |
| surface_solid | `#111318` |
| text | `#0B0B0D` |
| muted | `#6A6A66` |
| border | `rgba(11,11,13,0.10)` |
| accent | `#FF5B04` |
| accent_2 | `#111318` |
| accent_soft | `rgba(255,91,4,0.14)` |
| on_accent | `#16130E` |
| success | `#2E9E5B` |
| warning | `#E8A200` |
| error | `#D6402C` |
| info | `#3B6FE0` |
### Typography
- **Base Size**: 17px
- **Body Font**: Schibsted Grotesk
- **Heading Font**: Bricolage Grotesque
- **Mono Font**: Martian Mono
- **Heading Weight**: 800
- **Heading Transform**: none
- **Letter Spacing**: -0.02em
- **Line Height**: 1.55
- **Scale Ratio**: 1.28
- **Google Fonts Url**: https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:opsz,wght@12..96,600;12..96,700;12..96,800&family=Schibsted+Grotesk:wght@400;500;600;700&family=Martian+Mono:wght@400;500;600;700&display=swap
### Radii
- **None**: 0px
- **Md**: 16px
- **Lg**: 24px
- **Full**: 9999px
### Shadows
- **Sm**: 0 2px 8px rgba(11,11,13,0.06)
- **Md**: 0 12px 30px rgba(11,11,13,0.10)
- **Lg**: 0 26px 60px rgba(11,11,13,0.16)
### Spacing
- **Base**: 8px
- **Scale**: ["8px","14px","20px","28px","44px","64px","96px","132px"]
### Surfaces
- **Treatment**: split-flap board — matte paper ground with charcoal mechanical character-cells and a horizontal flap-seam hairline through each cell
- **Card Style**: borderless white cards on warm paper with a mono cell-strip header and foot; the flap-seam hairline recurs as the ornament system
- **Bg Pattern**: recurring horizontal flap-seam rule and tight vertical cell columns; chronophotograph motion imagery in Cadence
### Borders
- **Default Width**: 0px
- **Accent Width**: 2px
- **Style**: none
- **Character**: borderless; the only lines are the 1px flap-seam hairline through cells and the 2px flare underline links carry — never card borders or accent edges
### Motion
- **Duration**: 180ms
- **Easing**: cubic-bezier(0.2,0.9,0.1,1)
- **Philosophy**: mechanical flip resolution — scramble is loading, the flip is the transition, the lock is confirmation; snappy 120-220ms on interaction, watchable on the landing film; settled resolved board is the reduced-motion default
## Rules
### Composition
Compose as boards that resolve: a masthead cell-title, editorial body columns, and data set into departure-board rows. Content bands breathe; never box the chrome or trap nav in a pill bar.
### Hierarchy
Lead with Bricolage display against Schibsted body (extreme weight contrast); Martian mono runs cells, readouts, and micro-labels. Flare marks the one resolved/live/chosen element per view.
### Density
Airy editorial reading with tight mono readouts; generous padding above titles; one strict type scale, no one-off sizes.
### Signature Patterns
- Split-flap character cells (slate/lit/paper) that riffle through glyphs and lock; a word resolves in cascade
- The flap-seam hairline as the page-wide ornament system — through every cell, readout, and board row
- One molten flare fired only on the resolved/live/chosen; dark ink glyph on the flare cell
- Borderless white cards on warm paper with a mono cell-strip header/foot — never an accent edge
- Departure-board data rows: mono time column, resolving cells, uppercase gate status
## Layout
Editorial board layout on a max-1240px measure. Masthead cell-title, asymmetric content columns, and data as departure-board rows. Full-bleed hero image only; contained content centered on ultra-wide. Tablet keeps two-column layouts; mobile stacks to one column and compacts so no scene or card clips. Navigation breathes as type and space, never a boxed pill bar.
## Guidance
Use Vane where content should command attention and confirm itself as it arrives: departure and arrival boards, editorial front pages and reading rooms, launch pages, scoreboards, live-ops consoles. Ration flare to the resolved. Keep three type roles, radii from {0,16,24,9999}, body at 17px, and no borders except the flap-seam hairline. Respect prefers-reduced-motion: the resolved board reads with no JavaScript.
## Imagery Direction
### Summary
Cadence chronophotographs: one subject caught across every phase of a move, silver on charcoal, a single molten flare on the resolved frame — woven through the landing as parallax plates and masked reveals.
### Pairs With
cadence
### Technique
stroboscopic long-exposure chronophotography; overlapping motion phases; single warm accent streak; deep charcoal negative space
### Palette
silver and charcoal monochrome with one molten-orange flare on warm paper
### Reference Image File Ids
- fl-019f8b12-5e5b-7ed1-90fe-4e904b2ace5d
- fl-019f8b12-a812-7340-bdd3-2243a1fc08e9
- fl-019f8b12-f1b5-7fa1-866c-99afca461bfc
- fl-019f8b13-3b1a-7df2-b419-a9663e5dcdee
- fl-019f8b14-9e25-7c73-814c-95f95c00b6c8
- fl-019f8b14-ad96-7db1-b0f3-aa40b513f379
---
version: "alpha"
name: "Vane"
description: "Agent-curated design language exported from Katagami as DESIGN.md."
colors:
bg: "#F4F3EE"
surface: "#FFFFFF"
surface_solid: "#111318"
text: "#0B0B0D"
muted: "#6A6A66"
accent: "#FF5B04"
accent_2: "#111318"
on_accent: "#16130E"
success: "#2E9E5B"
warning: "#E8A200"
error: "#D6402C"
info: "#3B6FE0"
typography:
headline-lg:
fontFamily: "Bricolage Grotesque"
fontSize: "2.075rem"
fontWeight: 700
lineHeight: 1.1
letterSpacing: "-0.02em"
headline-md:
fontFamily: "Bricolage Grotesque"
fontSize: "1.66rem"
fontWeight: 600
lineHeight: 1.15
letterSpacing: "-0.02em"
body-md:
fontFamily: "Schibsted Grotesk"
fontSize: "17px"
fontWeight: 400
lineHeight: 1.5
letterSpacing: "-0.02em"
label-md:
fontFamily: "Martian Mono"
fontSize: "0.75rem"
fontWeight: 600
lineHeight: 1
letterSpacing: "0.08em"
rounded:
none: "0px"
md: "16px"
lg: "24px"
full: "9999px"
spacing:
base: "8px"
xs: "8px"
sm: "14px"
md: "20px"
lg: "28px"
xl: "44px"
2xl: "64px"
3xl: "96px"
4xl: "132px"
components:
color-reference-bg:
backgroundColor: "{colors.bg}"
color-reference-surface:
backgroundColor: "{colors.surface}"
color-reference-surface_solid:
backgroundColor: "{colors.surface_solid}"
color-reference-text:
backgroundColor: "{colors.text}"
color-reference-muted:
backgroundColor: "{colors.muted}"
color-reference-accent:
backgroundColor: "{colors.accent}"
color-reference-accent_2:
backgroundColor: "{colors.accent_2}"
color-reference-on_accent:
backgroundColor: "{colors.on_accent}"
color-reference-success:
backgroundColor: "{colors.success}"
color-reference-warning:
backgroundColor: "{colors.warning}"
color-reference-error:
backgroundColor: "{colors.error}"
color-reference-info:
backgroundColor: "{colors.info}"
button-primary:
backgroundColor: "{colors.accent}"
textColor: "#000000"
typography: "{typography.label-md}"
rounded: "{rounded.md}"
padding: "{spacing.md}"
card-surface:
backgroundColor: "{colors.surface}"
textColor: "{colors.text}"
rounded: "{rounded.md}"
padding: "{spacing.md}"
input-default:
backgroundColor: "{colors.surface}"
textColor: "{colors.text}"
rounded: "{rounded.md}"
height: "44px"
---
# Vane
## Overview
Vane is split-flap kinetic typography: language set in mechanical character cells where meaning is never printed, it resolves. Cells riffle through the glyph set and lock, one by one, until the board tells the truth. Typography is the interface and motion is the reveal that confirms a value; the flip is the whole point. Vane keeps the soul of a kinetic, motion-first, editorial language — high-contrast monochrome with a single molten signal — and gives it one ownable machine: the split-flap board. Warm paper and charcoal slate carry the ground; flare fires only on the resolved, the live, the chosen. For boards that announce and confirm.
## Colors
Use the YAML color tokens as the normative palette. The prose below names the roles agents should preserve when generating UI.
| Token | Value |
|-------|-------|
| bg | `#F4F3EE` |
| surface | `#FFFFFF` |
| surface_solid | `#111318` |
| text | `#0B0B0D` |
| muted | `#6A6A66` |
| accent | `#FF5B04` |
| accent_2 | `#111318` |
| on_accent | `#16130E` |
| success | `#2E9E5B` |
| warning | `#E8A200` |
| error | `#D6402C` |
| info | `#3B6FE0` |
## Typography
- **Headline-Lg**: Bricolage Grotesque, 2.075rem, weight 700, line-height 1.1.
- **Headline-Md**: Bricolage Grotesque, 1.66rem, weight 600, line-height 1.15.
- **Body-Md**: Schibsted Grotesk, 17px, weight 400, line-height 1.5.
- **Label-Md**: Martian Mono, 0.75rem, weight 600, line-height 1.
## Layout
### Spacing Tokens
- **Base**: `8px`
- **Xs**: `8px`
- **Sm**: `14px`
- **Md**: `20px`
- **Lg**: `28px`
- **Xl**: `44px`
- **2xl**: `64px`
- **3xl**: `96px`
- **4xl**: `132px`
Editorial board layout on a max-1240px measure. Masthead cell-title, asymmetric content columns, and data as departure-board rows. Full-bleed hero image only; contained content centered on ultra-wide. Tablet keeps two-column layouts; mobile stacks to one column and compacts so no scene or card clips. Navigation breathes as type and space, never a boxed pill bar.
## Elevation & Depth
### Shadows
- **Sm**: 0 2px 8px rgba(11,11,13,0.06)
- **Md**: 0 12px 30px rgba(11,11,13,0.10)
- **Lg**: 0 26px 60px rgba(11,11,13,0.16)
## Shapes
### Rounded
- **None**: `0px`
- **Md**: `16px`
- **Lg**: `24px`
- **Full**: `9999px`
### Surfaces
- **Treatment**: split-flap board — matte paper ground with charcoal mechanical character-cells and a horizontal flap-seam hairline through each cell
- **Card Style**: borderless white cards on warm paper with a mono cell-strip header and foot; the flap-seam hairline recurs as the ornament system
- **Bg Pattern**: recurring horizontal flap-seam rule and tight vertical cell columns; chronophotograph motion imagery in Cadence
### Borders
- **Default Width**: 0px
- **Accent Width**: 2px
- **Style**: none
- **Character**: borderless; the only lines are the 1px flap-seam hairline through cells and the 2px flare underline links carry — never card borders or accent edges
## Components
### Composition
Compose as boards that resolve: a masthead cell-title, editorial body columns, and data set into departure-board rows. Content bands breathe; never box the chrome or trap nav in a pill bar.
### Hierarchy
Lead with Bricolage display against Schibsted body (extreme weight contrast); Martian mono runs cells, readouts, and micro-labels. Flare marks the one resolved/live/chosen element per view.
### Density
Airy editorial reading with tight mono readouts; generous padding above titles; one strict type scale, no one-off sizes.
### Signature Patterns
- Split-flap character cells (slate/lit/paper) that riffle through glyphs and lock; a word resolves in cascade
- The flap-seam hairline as the page-wide ornament system — through every cell, readout, and board row
- One molten flare fired only on the resolved/live/chosen; dark ink glyph on the flare cell
- Borderless white cards on warm paper with a mono cell-strip header/foot — never an accent edge
- Departure-board data rows: mono time column, resolving cells, uppercase gate status
## shadcn/ui Usage
When the target app uses shadcn/ui, copy DESIGN.md with shadcn instead of the plain DESIGN.md. It contains the same Katagami design-language source plus the shadcn/ui primitives, imports, theme variables, component recipes, and preview-shot guidance.
DESIGN.md with shadcn: `/language/en-019f8b1b-dae8-7991-ae9b-9bf064aea581/DESIGN.with-shadcn.md`.
The shadcn page also exposes optional machine-readable files for automation, but the human-facing handoff is DESIGN.md with shadcn.
Install recommended primitives with `npx shadcn@latest add button card input textarea select dialog sheet tabs badge separator checkbox switch slider tooltip dropdown-menu table`.
Use these primitives in shadcn apps:
- button
- card
- input
- textarea
- select
- dialog
- sheet
- tabs
- badge
- separator
- checkbox
- switch
- slider
- tooltip
- dropdown-menu
- table
Implementation rule for agents: import shadcn primitives from `@/components/ui/*`, apply the generated CSS variables first, then compose the language-specific recipes from the companion MD. Katagami remains the source of truth; shadcn names are the implementation surface.
## Guidance
Use Vane where content should command attention and confirm itself as it arrives: departure and arrival boards, editorial front pages and reading rooms, launch pages, scoreboards, live-ops consoles. Ration flare to the resolved. Keep three type roles, radii from {0,16,24,9999}, body at 17px, and no borders except the flap-seam hairline. Respect prefers-reduced-motion: the resolved board reads with no JavaScript.
## Imagery Direction
### Summary
Cadence chronophotographs: one subject caught across every phase of a move, silver on charcoal, a single molten flare on the resolved frame — woven through the landing as parallax plates and masked reveals.
### Pairs With
cadence
### Technique
stroboscopic long-exposure chronophotography; overlapping motion phases; single warm accent streak; deep charcoal negative space
### Palette
silver and charcoal monochrome with one molten-orange flare on warm paper
### Reference Image File Ids
- fl-019f8b12-5e5b-7ed1-90fe-4e904b2ace5d
- fl-019f8b12-a812-7340-bdd3-2243a1fc08e9
- fl-019f8b12-f1b5-7fa1-866c-99afca461bfc
- fl-019f8b13-3b1a-7df2-b419-a9663e5dcdee
- fl-019f8b14-9e25-7c73-814c-95f95c00b6c8
- fl-019f8b14-ad96-7db1-b0f3-aa40b513f379
```json
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "vane",
"type": "registry:theme",
"title": "Vane shadcn Theme",
"cssVars": {
"theme": {},
"light": {
"background": "#F4F3EE",
"foreground": "#0B0B0D",
"card": "#FFFFFF",
"card-foreground": "#0B0B0D",
"popover": "#FFFFFF",
"popover-foreground": "#0B0B0D",
"primary": "#0B0B0D",
"primary-foreground": "#ffffff",
"secondary": "#f4f4f5",
"secondary-foreground": "#111111",
"muted": "#6A6A66",
"muted-foreground": "#0B0B0D",
"accent": "#FF5B04",
"accent-foreground": "#ffffff",
"destructive": "#D6402C",
"border": "rgba(11,11,13,0.10)",
"input": "rgba(11,11,13,0.10)",
"ring": "#FF5B04",
"chart-1": "#0B0B0D",
"chart-2": "#f4f4f5",
"chart-3": "#FF5B04",
"chart-4": "#2E9E5B",
"chart-5": "#E8A200",
"sidebar": "#FFFFFF",
"sidebar-foreground": "#0B0B0D",
"sidebar-primary": "#0B0B0D",
"sidebar-primary-foreground": "#ffffff",
"sidebar-accent": "#3B6FE0",
"sidebar-accent-foreground": "#ffffff",
"sidebar-border": "rgba(11,11,13,0.10)",
"sidebar-ring": "#FF5B04",
"radius": "16px"
},
"dark": {
"background": "#0f1115",
"foreground": "#f8fafc",
"card": "#181b22",
"card-foreground": "#f8fafc",
"popover": "#181b22",
"popover-foreground": "#f8fafc",
"primary": "#0B0B0D",
"primary-foreground": "#ffffff",
"secondary": "#252a33",
"secondary-foreground": "#f8fafc",
"muted": "#252a33",
"muted-foreground": "#a1a1aa",
"accent": "#FF5B04",
"accent-foreground": "#ffffff",
"destructive": "#D6402C",
"border": "#303642",
"input": "#303642",
"ring": "#FF5B04",
"chart-1": "#0B0B0D",
"chart-2": "#f4f4f5",
"chart-3": "#FF5B04",
"chart-4": "#2E9E5B",
"chart-5": "#E8A200",
"sidebar": "#181b22",
"sidebar-foreground": "#f8fafc",
"sidebar-primary": "#0B0B0D",
"sidebar-primary-foreground": "#ffffff",
"sidebar-accent": "#FF5B04",
"sidebar-accent-foreground": "#ffffff",
"sidebar-border": "#303642",
"sidebar-ring": "#FF5B04",
"radius": "16px"
}
},
"meta": {
"source": "katagami",
"languageId": "en-019f8b1b-dae8-7991-ae9b-9bf064aea581",
"slug": "vane",
"componentManifest": [
"button",
"card",
"input",
"textarea",
"select",
"dialog",
"sheet",
"tabs",
"badge",
"separator",
"checkbox",
"switch",
"slider",
"tooltip",
"dropdown-menu",
"table"
],
"installCommand": "npx shadcn@latest add button card input textarea select dialog sheet tabs badge separator checkbox switch slider tooltip dropdown-menu table",
"nativeTokenNames": {
"colors": [
"accent",
"accent_2",
"accent_soft",
"bg",
"border",
"error",
"info",
"muted",
"on_accent",
"success",
"surface",
"surface_solid",
"text",
"warning"
],
"typography": [
"base_size",
"body_font",
"google_fonts_url",
"heading_font",
"heading_transform",
"heading_weight",
"letter_spacing",
"line_height",
"mono_font",
"scale_ratio"
],
"radii": [
"full",
"lg",
"md",
"none"
],
"shadows": [
"lg",
"md",
"sm"
],
"spacing": [
"base",
"scale"
],
"surfaces": [
"bg_pattern",
"card_style",
"treatment"
],
"borders": [
"accent_width",
"character",
"default_width",
"style"
],
"motion": [
"duration",
"easing",
"philosophy"
]
}
}
}
```The quick brown fox jumps
The quick brown fox jumps
The quick brown fox jumps
The quick brown fox jumps
Keep Vane and swap a palette and an art style onto it. The landing & dashboard recolor live.
Copy this when the target app uses shadcn/ui. It packages the Katagami DESIGN.md context with the install list, theme variables, component recipes, preview-shot contract, and starter TSX in one Markdown companion.
npx shadcn@latest add button card input textarea select dialog sheet tabs badge separator checkbox switch slider tooltip dropdown-menu table:root {
--background: #F4F3EE;
--foreground: #0B0B0D;
--card: #FFFFFF;
--card-foreground: #0B0B0D;
--popover: #FFFFFF;
--popover-foreground: #0B0B0D;
--primary: #0B0B0D;
--primary-foreground: #ffffff;
--secondary: #f4f4f5;
--secondary-foreground: #111111;
--muted: #6A6A66;
--muted-foreground: #0B0B0D;
--accent: #FF5B04;
--accent-foreground: #ffffff;
--destructive: #D6402C;
--border: rgba(11,11,13,0.10);
--input: rgba(11,11,13,0.10);
--ring: #FF5B04;
--chart-1: #0B0B0D;
--chart-2: #f4f4f5;
--chart-3: #FF5B04;
--chart-4: #2E9E5B;
--chart-5: #E8A200;
--sidebar: #FFFFFF;
--sidebar-foreground: #0B0B0D;
--sidebar-primary: #0B0B0D;
--sidebar-primary-foreground: #ffffff;
--sidebar-accent: #3B6FE0;
--sidebar-accent-foreground: #ffffff;
--sidebar-border: rgba(11,11,13,0.10);
--sidebar-ring: #FF5B04;
--radius: 16px;
}
.dark {
--background: #0f1115;
--foreground: #f8fafc;
--card: #181b22;
--card-foreground: #f8fafc;
--popover: #181b22;
--popover-foreground: #f8fafc;
--primary: #0B0B0D;
--primary-foreground: #ffffff;
--secondary: #252a33;
--secondary-foreground: #f8fafc;
--muted: #252a33;
--muted-foreground: #a1a1aa;
--accent: #FF5B04;
--accent-foreground: #ffffff;
--destructive: #D6402C;
--border: #303642;
--input: #303642;
--ring: #FF5B04;
--chart-1: #0B0B0D;
--chart-2: #f4f4f5;
--chart-3: #FF5B04;
--chart-4: #2E9E5B;
--chart-5: #E8A200;
--sidebar: #181b22;
--sidebar-foreground: #f8fafc;
--sidebar-primary: #0B0B0D;
--sidebar-primary-foreground: #ffffff;
--sidebar-accent: #FF5B04;
--sidebar-accent-foreground: #ffffff;
--sidebar-border: #303642;
--sidebar-ring: #FF5B04;
--radius: 16px;
}
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import {
Card,
CardContent,
CardDescription,
CardFooter,
CardHeader,
CardTitle,
} from "@/components/ui/card";
import { Input } from "@/components/ui/input";
import { Tabs, TabsList, TabsTrigger } from "@/components/ui/tabs";
export function VaneShadcnKit() {
return (
<section className="grid gap-4 rounded-[var(--radius)] border bg-background p-4 text-foreground">
<div className="flex items-start justify-between gap-4">
<div>
<Badge variant="outline">shadcn/ui</Badge>
<h2 className="mt-3 text-2xl font-semibold tracking-tight">Vane</h2>
<p className="mt-1 max-w-xl text-sm text-muted-foreground">
Use the Katagami registry theme, then compose these shadcn primitives
with the language-specific component recipes.
</p>
</div>
<Button>Apply theme</Button>
</div>
<Tabs defaultValue="components">
<TabsList>
<TabsTrigger value="components">Components</TabsTrigger>
<TabsTrigger value="states">States</TabsTrigger>
<TabsTrigger value="export">Export</TabsTrigger>
</TabsList>
</Tabs>
<Card>
<CardHeader>
<CardTitle>Component recipe</CardTitle>
<CardDescription>
Replace this starter content with the agent-authored product scene
from components.md and preview-shots.json.
</CardDescription>
</CardHeader>
<CardContent className="grid gap-3 sm:grid-cols-[1fr_auto]">
<Input defaultValue="Tokenized shadcn surface" aria-label="Recipe name" />
<Button variant="secondary">Preview state</Button>
</CardContent>
<CardFooter className="justify-between">
<Badge>Ready</Badge>
<Button variant="outline">Copy recipe</Button>
</CardFooter>
</Card>
</section>
);
}
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "vane",
"type": "registry:theme",
"author": "katagami-agent",
"title": "Vane — Split-flap kinetic typography",
"description": "A high-contrast monochrome design language where typography is the interface and meaning resolves like a split-flap board: charcoal slate cells, warm paper, and a single molten flare on the resolved. Bricolage display, Schibsted body, Martian mono cells.",
"cssVars": {
"theme": {
"font-sans": "Schibsted Grotesk, ui-sans-serif, system-ui, sans-serif",
"font-mono": "Martian Mono, ui-monospace, monospace",
"font-display": "Bricolage Grotesque, ui-sans-serif, sans-serif",
"radius": "16px"
},
"light": {
"background": "#F4F3EE",
"foreground": "#0B0B0D",
"card": "#FFFFFF",
"card-foreground": "#0B0B0D",
"popover": "#FFFFFF",
"popover-foreground": "#0B0B0D",
"primary": "#FF5B04",
"primary-foreground": "#16130E",
"secondary": "#111318",
"secondary-foreground": "#EDEEF2",
"muted": "#ECEAE3",
"muted-foreground": "#6A6A66",
"accent": "#FFE7D8",
"accent-foreground": "#7A2C05",
"destructive": "#D6402C",
"destructive-foreground": "#FFFFFF",
"border": "rgba(11,11,13,0.10)",
"input": "rgba(11,11,13,0.14)",
"ring": "#FF5B04",
"radius": "16px",
"chart-1": "#FF5B04",
"chart-2": "#111318",
"chart-3": "#2E9E5B",
"chart-4": "#E8A200",
"chart-5": "#3B6FE0"
},
"dark": {
"background": "#0E0F13",
"foreground": "#EDEEF2",
"card": "#15171C",
"card-foreground": "#EDEEF2",
"popover": "#15171C",
"popover-foreground": "#EDEEF2",
"primary": "#FF5B04",
"primary-foreground": "#16130E",
"secondary": "#20232B",
"secondary-foreground": "#EDEEF2",
"muted": "#1A1C22",
"muted-foreground": "#9A9CA3",
"accent": "#2A1B10",
"accent-foreground": "#FFB27A",
"destructive": "#E5573F",
"destructive-foreground": "#0E0F13",
"border": "rgba(237,238,242,0.12)",
"input": "rgba(237,238,242,0.16)",
"ring": "#FF5B04",
"radius": "16px",
"chart-1": "#FF5B04",
"chart-2": "#C9CBD2",
"chart-3": "#2E9E5B",
"chart-4": "#E8A200",
"chart-5": "#3B6FE0"
}
},
"visualProfile": {
"family": "editorial-mechanical grotesque",
"material": "split-flap character cells — charcoal slate leaves with a flap-seam hairline, on warm paper",
"contour": "hard-edged cells (radius 0) set into soft 24px cards",
"border": "borderless; the only line is the flap-seam hairline",
"underlay": false,
"grain": false,
"stickerBadges": false,
"motion": "mechanical flip resolution — scramble, flip, lock; snappy 120-220ms",
"density": "airy editorial with tight mono readouts",
"accents": ["#FF5B04", "#111318"]
},
"notes": "Primary is the molten flare (#FF5B04) fired only on the resolved/live/chosen; secondary is the charcoal slate board. Dark text on flare is intentional (dark glyph on an amber flap). No borders anywhere except the 1px flap-seam hairline; never give a card an accent edge. Radii from {0,16,24,9999}; body 17px floor; three type roles only (Bricolage display, Schibsted body, Martian mono)."
}
# Vane — shadcn/ui Components
> Component recipes for **Vane**, the split-flap kinetic-typography design language.
> Format: `component-recipes-v1`. Author: `katagami-agent`.
Vane sets language in mechanical character cells: charcoal slate leaves split by a flap-seam
hairline, on warm paper, with a single molten flare (`#FF5B04`) that fires only on the resolved,
the live, the chosen. Typography is the interface; motion is the reveal that confirms a value.
## ShadSync visual profile
- **Family** — editorial-mechanical grotesque (Bricolage display, Schibsted body, Martian mono).
- **Material** — split-flap character cells; a flap-seam hairline recurs through every cell,
readout, and board row as the page-wide ornament system.
- **Contour** — hard-edged cells (radius `0`) set into soft `24px` cards; pills at `9999px`.
- **Border** — borderless. The only line is the 1px flap-seam hairline; never give a card, input,
or nav an accent edge.
- **Underlay / grain / sticker badges** — none. Clean paper and slate; a single flare.
- **Motion** — mechanical flip resolution: scramble (loading), flip (transition), lock
(confirmation). Snappy 120–220ms; respect `prefers-reduced-motion`.
- **Density** — airy editorial reading, with tight Martian-mono readouts and labels.
- **Accents** — flare `#FF5B04` (primary, like a highlighter) and slate `#111318` (the board).
Map the profile onto shadcn tokens: `--primary` = flare, `--primary-foreground` = ink `#16130E`
(dark glyph on an amber flap), `--secondary` = slate, `--ring` = flare, `--radius` = `16px`.
Semantic hues (`success #2E9E5B`, `warning #E8A200`, `destructive #D6402C`, `info #3B6FE0`) stay
small and never become visually primary.
## Signature component recipes
The split-flap cell recolours through every primitive. A few load-bearing ones:
### Button
- **Primary** — flare background, ink `#16130E` label, pill (`rounded-full`), one per view; lifts
`translateY(-2px)` on hover. `bg-primary text-primary-foreground rounded-full px-5 h-11`.
- **Secondary** — slate background, silver label. `bg-secondary text-secondary-foreground`.
- **Ghost** — transparent with a 1.5px flare inset ring on hover; no permanent border.
- **Destructive** — `bg-destructive text-white` for discard/jam actions only.
- Text never wraps; label centred; every button shares one height.
### Input, Textarea, Select
Borderless with an `inset 0 0 0 1.5px var(--input)` ring that becomes a 2px flare ring on focus.
No visible browser defaults; the select caret is an inline SVG. A code field can render as a row of
split-flap cells (`.cell`) that resolve as the user types.
### Card
Borderless white on paper, `rounded-3xl` (24px), soft geometry-matched shadow. Header carries a mono
label and a status chip; a strip of cells sits at the foot. Never nest cards; never add an edge.
### Badge / Chip
Pill, mono `11px` uppercase, `0.12em` tracking. `flare` (accent-soft wash), `slate`, and semantic
variants. Text never wraps.
### Table
Row rhythm from the flap-seam hairline (`inset 0 1px 0 var(--border)`), never full borders. A mono
index or time column on the left (type, not a bar); status pills in the last column.
### Tabs, Switch, Slider, Tooltip, Dialog, Sheet, Dropdown-menu, Separator
Pill tabs (active = slate fill); flare switch; flare slider fill with a slate knob; slate tooltip
with a mono label; dialogs and sheets are borderless `24px` surfaces with the soft `lg` shadow; the
separator is the flap-seam hairline.
## Preview shots
Three renderable product scenes ship in `preview-shots.json` (schema `renderable-v1`): a live
departure board with the cell mechanic, a board-operations console with KPI tiles and a resolve
cascade, and an editorial reader card set. Each names the primitives it must show and what to avoid
(no borders, no second accent, no wrapped control text).
## Copy-paste component example
```tsx
import { Button } from "@/components/ui/button"
import { Badge } from "@/components/ui/badge"
import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"
export function ResolvedCard() {
return (
<Card className="rounded-3xl border-0 shadow-md">
<CardHeader className="flex flex-row items-center justify-between">
<Badge className="rounded-full bg-[color:var(--accent)] text-[color:var(--accent-foreground)] font-mono uppercase tracking-widest">
Locked
</Badge>
<span className="font-mono text-xs text-muted-foreground">08:55</span>
</CardHeader>
<CardContent>
<CardTitle className="font-[Bricolage_Grotesque] text-2xl">Confirmed intent</CardTitle>
<p className="mt-2 text-muted-foreground">
The lit cell fires once, then rests. One flare per decision.
</p>
<Button className="mt-5 rounded-full bg-primary text-primary-foreground h-11 px-5">
Resolve the board
</Button>
</CardContent>
</Card>
)
}
```
All primitives live under `@/components/ui/` and read the theme from `export.json` (registry
theme `vane`). Keep radius at `16px`, body at 17px, three type roles only, and the flare rationed
to the resolved.
{
"artifact": "katagami:shadcn-preview-shots",
"version": "preview-shots-v1",
"schema": "katagami:shadcn-preview-shots/renderable-v1",
"renderable": true,
"author": "katagami-agent",
"requiresVisualProfile": true,
"language": { "id": "vane", "name": "Vane", "slug": "vane" },
"installCommand": "npx shadcn@latest add https://katagami.ai/r/vane.json",
"primitives": [
"button", "card", "input", "textarea", "select", "dialog", "sheet", "tabs",
"badge", "separator", "checkbox", "switch", "slider", "tooltip", "dropdown-menu", "table"
],
"identityNotes": [
"Typography is the interface; meaning resolves like a split-flap board — cells riffle and lock.",
"One molten flare (#FF5B04) fires only on the resolved, the live, the chosen; slate (#111318) is the board.",
"Dark ink on flare is intentional — a dark glyph on an amber flap; never white-on-flare.",
"Borderless everywhere; the only line is the 1px flap-seam hairline running through cells and rows.",
"Three type roles only: Bricolage display, Schibsted body, Martian mono cells and labels.",
"Radii from {0,16,24,9999}: hard-edged cells inside soft 24px cards, pill controls."
],
"visualProfile": {
"family": "editorial-mechanical grotesque",
"material": "split-flap character cells — charcoal slate leaves with a flap-seam hairline, on warm paper",
"contour": "hard-edged cells (radius 0) set into soft 24px cards",
"border": "borderless; only the flap-seam hairline",
"underlay": false,
"grain": false,
"stickerBadges": false,
"motion": "mechanical flip resolution — scramble, flip, lock; snappy 120-220ms",
"density": "airy editorial with tight mono readouts",
"accents": ["#FF5B04", "#111318"]
},
"tokens": {
"background": "#F4F3EE",
"foreground": "#0B0B0D",
"card": "#FFFFFF",
"primary": "#FF5B04",
"primary-foreground": "#16130E",
"secondary": "#111318",
"secondary-foreground": "#EDEEF2",
"muted": "#ECEAE3",
"muted-foreground": "#6A6A66",
"border": "rgba(11,11,13,0.10)",
"ring": "#FF5B04",
"radius": "16px",
"success": "#2E9E5B",
"warning": "#E8A200",
"destructive": "#D6402C",
"info": "#3B6FE0",
"font-display": "Bricolage Grotesque",
"font-sans": "Schibsted Grotesk",
"font-mono": "Martian Mono"
},
"shots": [
{
"id": "departure-board",
"title": "Live departure board",
"viewport": "desktop",
"primitives": ["card", "badge", "table", "separator", "tooltip"],
"composition": "A dark slate board panel listing timed rows; each row is a set of split-flap cells with a mono time on the left and a gate status on the right. One row is fully lit in flare (resolved); a header badge reads Riffling.",
"mustShow": [
"split-flap character cells with the flap-seam hairline",
"one fully-lit flare row marking the resolved set",
"mono time column and uppercase gate labels",
"borderless card with a status chip in the header"
],
"avoid": ["card borders or accent edges", "white text on flare", "a second accent hue", "wrapped chip text"],
"scene": {
"headline": "The morning set is resolving",
"description": "Forty-two cells across seven gates — watch each board riffle and lock.",
"rows": [
{ "time": "07:42", "word": "MORNING", "gate": "Gate 07", "state": "Live" },
{ "time": "08:10", "word": "STANDBY", "gate": "Gate 12", "state": "Held" },
{ "time": "08:55", "word": "RESOLVED", "gate": "Gate 21", "state": "Locked" },
{ "time": "09:20", "word": "BOARDING", "gate": "Gate 04", "state": "Live" }
]
}
},
{
"id": "ops-console",
"title": "Board operations console",
"viewport": "desktop",
"primitives": ["card", "tabs", "table", "badge", "switch", "slider", "separator"],
"composition": "A dashboard: four KPI tiles across the top (no left bars), a resolve-cascade bar chart, a set-completion flip meter, and a gate-status table with status pills. Flare appears only on live/locked states and the meter fill.",
"mustShow": [
"KPI tiles with mono labels and display numerals",
"flip-cascade progress meter filled in flare",
"gate-status table with pill states (Live, Riffle, Locked, Held)",
"airy borderless panels on warm paper"
],
"avoid": ["borders between table rows (use the hairline)", "gradients", "emoji or glyph arrows in deltas", "oversized pillowy buttons"],
"scene": {
"headline": "Board operations — live",
"description": "Cells locked, boards live, average resolve time, and jams at a glance.",
"stats": [
{ "label": "Cells locked", "value": "1,284 / 1,340", "delta": "96% set — nominal" },
{ "label": "Boards live", "value": "7", "delta": "3 resolving · 4 locked" },
{ "label": "Avg resolve", "value": "1.9s", "delta": "0.3s faster today" },
{ "label": "Jams", "value": "1", "delta": "gate 12 flap stuck" }
]
}
},
{
"id": "editorial-reader",
"title": "Editorial reader card set",
"viewport": "desktop",
"primitives": ["card", "button", "badge", "input", "dropdown-menu", "checkbox"],
"composition": "Three borderless white cards on paper, each with a status chip, a Bricolage headline, body copy, and a foot strip of cells. A primary flare button and a quiet ghost button sit below; a search input resolves its value into cells.",
"mustShow": [
"borderless cell-headed cards with a foot cell strip",
"one primary flare button and quieter secondary/ghost buttons",
"a search input that reads its value as split-flap cells",
"Bricolage display headline against Schibsted body"
],
"avoid": ["a second accent color", "card borders", "centered body paragraphs", "wrapped button labels"],
"scene": {
"headline": "Type is the interface",
"description": "Every screen is a typographic composition where the flip confirms the intent.",
"fields": [
{ "label": "Board title", "value": "Departures" },
{ "label": "Gate", "value": "Gate 07 — Main hall" },
{ "label": "Code", "value": "VANE7" }
]
}
}
],
"componentRecipes": [
{ "primitive": "button", "intent": "Primary action fired in flare with an ink label; one per view, pill height, label never wraps." },
{ "primitive": "button", "intent": "Secondary slate button and a ghost button whose flare inset ring appears only on hover." },
{ "primitive": "card", "intent": "Borderless white card on paper, 24px radius, mono label plus status chip in the header and a foot strip of cells." },
{ "primitive": "input", "intent": "Borderless field with a 1.5px inset ring that becomes a 2px flare ring on focus; no browser defaults." },
{ "primitive": "textarea", "intent": "Same ring treatment, 1.5 line-height, resize vertical; used for board announcements." },
{ "primitive": "select", "intent": "Custom inline-SVG caret, pill-free rounded field, flare focus ring; gate picker." },
{ "primitive": "dialog", "intent": "Borderless 24px surface with the soft lg shadow; title in Bricolage, actions as one primary flare button." },
{ "primitive": "sheet", "intent": "Side sheet on slate for board settings; flap-seam hairline separators, mono section labels." },
{ "primitive": "tabs", "intent": "Pill tabs; active tab is a slate fill with silver label; others quiet muted text." },
{ "primitive": "badge", "intent": "Mono uppercase pill chips: flare (live/resolved), slate (held), semantic; text never wraps." },
{ "primitive": "separator", "intent": "The flap-seam hairline (inset 0 1px 0 border) — the only line in the system." },
{ "primitive": "checkbox", "intent": "Rounded square that fills flare with an ink check when set; flare focus ring." },
{ "primitive": "switch", "intent": "Flare track when on with a paper knob; slate-tinted track when off." },
{ "primitive": "slider", "intent": "Flare fill on a slate-tinted track with a slate knob; riffle-speed control." },
{ "primitive": "tooltip", "intent": "Slate bubble with a mono label showing cell status (SET 70% · 7 OF 10 LOCKED)." },
{ "primitive": "dropdown-menu", "intent": "Borderless paper menu, 16px radius, hairline separators, flare hover state on the active item." },
{ "primitive": "table", "intent": "Hairline row rhythm, mono index/time column on the left, status pills on the right; no full borders." },
{ "primitive": "badge", "intent": "Split-flap cell strip as a badge — a tiny row of resolving cells for inline status." }
],
"qualityRules": {
"do": [
"Ration flare to the resolved, the live, and the chosen — one detonation per view.",
"Keep the flap-seam hairline as the single page-wide ornament system.",
"Use dark ink (#16130E) on flare; keep body at 17px and three type roles only.",
"Set hard-edged cells (radius 0) inside soft 24px cards; pills at 9999px.",
"Let navigation breathe as type and space, never a boxed pill bar."
],
"dont": [
"Add borders or give any card an accent edge (top, side, or bottom).",
"Use white text on flare, or introduce a second bright accent.",
"Wrap button or chip text, or let a control clip its label.",
"Use gradients, grain, sticker badges, or glyph arrows (▲▼) in copy.",
"Nest cards or trap the nav in a floating rounded card."
]
}
}