Typography
headline-lgArchivo · 33px · 700
The quick brown fox jumps
headline-mdArchivo · 27px · 600
The quick brown fox jumps
body-mdIBM Plex Sans · 17px · 400
The quick brown fox jumps
label-mdIBM Plex Mono · 12px · 600
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 source of truth for most agents and apps.
Build on a disciplined modular grid with a persistent left index rail. Every section opens with a narrow red signal bar and an oversized index number anchored to the left grid edge. Major zones are separated by open space and hairline rules, never nested boxes.
Hierarchy comes from scale jumps, weight changes, red signal markers, and grid position. Headlines are oversized Archivo, flush-left, tight leading; supporting data is compact, uppercase, and mono tabular.
Medium information density with high legibility: generous structural margins, compressed leading in headlines, and tightly ruled tables. Whitespace is architectural, never padding inflation inside controls.
Desktop section head is a 120px index rail plus a flexible content column; content blocks span controlled widths and align flush-left. Tablet (~768–1024) keeps the rail but tightens it into its own considered layout. Mobile collapses so the red bar and index sit inline above their block.
At ~1024px tighten outer margins and reduce column spans. At ~768px stack the hero and operational panels vertically while preserving rule-based separators and the tablet rail. At ~480px convert multi-column rows to a single column, make actions full-width, and allow tables to scroll horizontally inside ruled wrappers.
Whitespace is structural: large outer margins, 48–64px between sections, an 8px internal baseline grid. Negative space frames typography like poster composition rather than filling gaps evenly.
Spare, diagrammatic, objective. Photography is a crop field, not a scene: transit information panels, ordered city plans, objective still lifes — each on warm paper, each holding a single red mark. Text and image never contest the same ground; copy sits on its own ink panel or in open space.
kursbuch
# Kursbuch ## Philosophy Kursbuch translates modernist clarity into an interface standard for operational surfaces — timetables, control rooms, transit information. Hierarchy comes from scale, weight, and position; structure from a strict grid and hairline rules; emphasis from type before any colour is spent. One signal red marks position and delay. ### Values - grid discipline over improvisation - objective communication over stylistic flourish - flush-left typographic hierarchy with measured rhythm - contrast through scale, weight, and placement rather than ornament - modular systems reproducible across signage, print, and interface ### Anti-Values - skeuomorphic texture - centred ornamental composition - rounded friendly softness - decorative drop shadows and gratuitous gradients - ambiguous hierarchy or inconsistent alignment ### Visual Character - strict asymmetric grid with an oversized left rail for section indices and metadata - hairline ink rules separating modules, rows, and headings with no decorative framing - large neo-grotesk headlines flush-left with tight leading and generous surrounding space - small uppercase utility labels tracked wide and aligned to a common baseline grid - a limited paper-ink palette punctuated by one urgent signal red as bars, dots, and action accents ## Tokens ### Colors | Name | Value | |------|-------| | bg | `#ECE9E1` | | surface | `#FCFBF7` | | surface_solid | `#FCFBF7` | | text | `#121212` | | muted | `#6F6A63` | | border | `#121212` | | accent | `#D62828` | | accent_2 | `#B00020` | | accent_soft | `#F2DEDA` | | on_accent | `#FCFBF7` | | success | `#1D6B3C` | | warning | `#B26A00` | | error | `#B00020` | | info | `#005F8C` | ### Typography - **Base Size**: 17px - **Body Font**: IBM Plex Sans, Arial, sans-serif - **Heading Font**: Archivo, Helvetica Neue, Arial, sans-serif - **Mono Font**: IBM Plex Mono, ui-monospace, monospace - **Heading Weight**: 800 - **Heading Transform**: none - **Letter Spacing**: -0.02em - **Line Height**: 1.5 - **Scale Ratio**: 1.25 - **Google Fonts Url**: https://fonts.googleapis.com/css2?family=Archivo:wght@500;600;700;800;900&family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap ### Radii - **None**: 0px - **Md**: 16px - **Lg**: 24px - **Full**: 9999px ### Shadows - **Sm**: none - **Md**: none - **Lg**: none ### Spacing - **Base**: 8px - **Scale**: ["4px","8px","16px","24px","32px","48px","64px","96px"] ### Surfaces - **Treatment**: paper - **Card Style**: hairline-ruled planes separated by open space, no elevation - **Bg Pattern**: grid ### Borders - **Default Width**: 1px - **Accent Width**: 6px - **Style**: solid - **Character**: hairline ink dividers; the accent bar is a thick vertical signal at the left grid edge ### Motion - **Duration**: 140ms - **Easing**: cubic-bezier(0.2,0,0,1) - **Philosophy**: snappy and purposeful; settled state is the default ## Rules ### Composition Build on a disciplined modular grid with a persistent left index rail. Every section opens with a narrow red signal bar and an oversized index number anchored to the left grid edge. Major zones are separated by open space and hairline rules, never nested boxes. ### Hierarchy Hierarchy comes from scale jumps, weight changes, red signal markers, and grid position. Headlines are oversized Archivo, flush-left, tight leading; supporting data is compact, uppercase, and mono tabular. ### Density Medium information density with high legibility: generous structural margins, compressed leading in headlines, and tightly ruled tables. Whitespace is architectural, never padding inflation inside controls. ### Signature Patterns - every major section begins with a narrow red vertical bar and an oversized index number anchored to the left grid edge - module boundaries are drawn with 1px horizontal hairline rules instead of rounded cards or shadows - section index numbers live in an oversized detached left rail - all utility labels are uppercase mono with wide letter-spacing on a common baseline grid - tables, forms, and tabs use monochrome fields with hairline underlines or perimeter rules rather than filled controls - the departure board component spends red only on delay; everything on time stays monochrome ## Layout ### Grid Desktop section head is a 120px index rail plus a flexible content column; content blocks span controlled widths and align flush-left. Tablet (~768–1024) keeps the rail but tightens it into its own considered layout. Mobile collapses so the red bar and index sit inline above their block. ### Breakpoints At ~1024px tighten outer margins and reduce column spans. At ~768px stack the hero and operational panels vertically while preserving rule-based separators and the tablet rail. At ~480px convert multi-column rows to a single column, make actions full-width, and allow tables to scroll horizontally inside ruled wrappers. ### Whitespace Whitespace is structural: large outer margins, 48–64px between sections, an 8px internal baseline grid. Negative space frames typography like poster composition rather than filling gaps evenly. ## Guidance ### Do - Spend red as a positional and delay signal, not as decorative fill. - Keep major text flush-left; let the rag create rhythm. - Separate information blocks with rules and space instead of extra containers. - Use tabular mono for schedules, codes, and numeric summaries. - Let typography carry emphasis before reaching for colour or iconography. ### Don't - Centre headlines or balance pages symmetrically. - Introduce rounded corners, soft shadows, or glass effects. - Use a second accent colour or an illustrative gradient. - Wrap regions in heavy boxes that destroy the open grid. - Make controls look tactile; they are engineered and flat. ## Imagery Direction ### Summary Spare, diagrammatic, objective. Photography is a crop field, not a scene: transit information panels, ordered city plans, objective still lifes — each on warm paper, each holding a single red mark. Text and image never contest the same ground; copy sits on its own ink panel or in open space. ### Pairs With kursbuch ### Techniques - objective modernist graphic photography - diagrammatic crop fields - matte print texture - hairline-rule overlays on a warm paper ground
---
version: "alpha"
name: "Kursbuch"
description: "Agent-curated design language exported from Katagami as DESIGN.md."
colors:
bg: "#ECE9E1"
surface: "#FCFBF7"
surface_solid: "#FCFBF7"
text: "#121212"
muted: "#6F6A63"
border: "#121212"
accent: "#D62828"
accent_2: "#B00020"
accent_soft: "#F2DEDA"
on_accent: "#FCFBF7"
success: "#1D6B3C"
warning: "#B26A00"
error: "#B00020"
info: "#005F8C"
typography:
headline-lg:
fontFamily: "Archivo, Helvetica Neue, Arial, sans-serif"
fontSize: "2.075rem"
fontWeight: 700
lineHeight: 1.1
letterSpacing: "-0.02em"
headline-md:
fontFamily: "Archivo, Helvetica Neue, Arial, sans-serif"
fontSize: "1.66rem"
fontWeight: 600
lineHeight: 1.15
letterSpacing: "-0.02em"
body-md:
fontFamily: "IBM Plex Sans, Arial, sans-serif"
fontSize: "17px"
fontWeight: 400
lineHeight: 1.5
letterSpacing: "-0.02em"
label-md:
fontFamily: "IBM Plex Mono, ui-monospace, monospace"
fontSize: "0.75rem"
fontWeight: 600
lineHeight: 1
letterSpacing: "0.08em"
rounded:
none: "0px"
md: "16px"
lg: "24px"
full: "9999px"
spacing:
base: "8px"
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-border:
backgroundColor: "{colors.border}"
color-reference-accent:
backgroundColor: "{colors.accent}"
color-reference-accent_2:
backgroundColor: "{colors.accent_2}"
color-reference-accent_soft:
backgroundColor: "{colors.accent_soft}"
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: "#ffffff"
typography: "{typography.label-md}"
rounded: "{rounded.md}"
padding: "{spacing.base}"
card-surface:
backgroundColor: "{colors.surface}"
textColor: "{colors.text}"
rounded: "{rounded.md}"
padding: "{spacing.base}"
input-default:
backgroundColor: "{colors.surface}"
textColor: "{colors.text}"
rounded: "{rounded.md}"
height: "44px"
---
# Kursbuch
## Overview
Kursbuch translates modernist clarity into an interface standard for operational surfaces — timetables, control rooms, transit information. Hierarchy comes from scale, weight, and position; structure from a strict grid and hairline rules; emphasis from type before any colour is spent. One signal red marks position and delay.
### Values
- grid discipline over improvisation
- objective communication over stylistic flourish
- flush-left typographic hierarchy with measured rhythm
- contrast through scale, weight, and placement rather than ornament
- modular systems reproducible across signage, print, and interface
### Anti-Values
- skeuomorphic texture
- centred ornamental composition
- rounded friendly softness
- decorative drop shadows and gratuitous gradients
- ambiguous hierarchy or inconsistent alignment
### Visual Character
- strict asymmetric grid with an oversized left rail for section indices and metadata
- hairline ink rules separating modules, rows, and headings with no decorative framing
- large neo-grotesk headlines flush-left with tight leading and generous surrounding space
- small uppercase utility labels tracked wide and aligned to a common baseline grid
- a limited paper-ink palette punctuated by one urgent signal red as bars, dots, and action accents
## 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 | `#ECE9E1` |
| surface | `#FCFBF7` |
| surface_solid | `#FCFBF7` |
| text | `#121212` |
| muted | `#6F6A63` |
| border | `#121212` |
| accent | `#D62828` |
| accent_2 | `#B00020` |
| accent_soft | `#F2DEDA` |
| on_accent | `#FCFBF7` |
| success | `#1D6B3C` |
| warning | `#B26A00` |
| error | `#B00020` |
| info | `#005F8C` |
## Typography
- **Headline-Lg**: Archivo, Helvetica Neue, Arial, sans-serif, 2.075rem, weight 700, line-height 1.1.
- **Headline-Md**: Archivo, Helvetica Neue, Arial, sans-serif, 1.66rem, weight 600, line-height 1.15.
- **Body-Md**: IBM Plex Sans, Arial, sans-serif, 17px, weight 400, line-height 1.5.
- **Label-Md**: IBM Plex Mono, ui-monospace, monospace, 0.75rem, weight 600, line-height 1.
## Layout
### Spacing Tokens
- **Base**: `8px`
### Grid
Desktop section head is a 120px index rail plus a flexible content column; content blocks span controlled widths and align flush-left. Tablet (~768–1024) keeps the rail but tightens it into its own considered layout. Mobile collapses so the red bar and index sit inline above their block.
### Breakpoints
At ~1024px tighten outer margins and reduce column spans. At ~768px stack the hero and operational panels vertically while preserving rule-based separators and the tablet rail. At ~480px convert multi-column rows to a single column, make actions full-width, and allow tables to scroll horizontally inside ruled wrappers.
### Whitespace
Whitespace is structural: large outer margins, 48–64px between sections, an 8px internal baseline grid. Negative space frames typography like poster composition rather than filling gaps evenly.
## Elevation & Depth
### Shadows
- **Sm**: none
- **Md**: none
- **Lg**: none
## Shapes
### Rounded
- **None**: `0px`
- **Md**: `16px`
- **Lg**: `24px`
- **Full**: `9999px`
### Surfaces
- **Treatment**: paper
- **Card Style**: hairline-ruled planes separated by open space, no elevation
- **Bg Pattern**: grid
### Borders
- **Default Width**: 1px
- **Accent Width**: 6px
- **Style**: solid
- **Character**: hairline ink dividers; the accent bar is a thick vertical signal at the left grid edge
## Components
### Composition
Build on a disciplined modular grid with a persistent left index rail. Every section opens with a narrow red signal bar and an oversized index number anchored to the left grid edge. Major zones are separated by open space and hairline rules, never nested boxes.
### Hierarchy
Hierarchy comes from scale jumps, weight changes, red signal markers, and grid position. Headlines are oversized Archivo, flush-left, tight leading; supporting data is compact, uppercase, and mono tabular.
### Density
Medium information density with high legibility: generous structural margins, compressed leading in headlines, and tightly ruled tables. Whitespace is architectural, never padding inflation inside controls.
### Signature Patterns
- every major section begins with a narrow red vertical bar and an oversized index number anchored to the left grid edge
- module boundaries are drawn with 1px horizontal hairline rules instead of rounded cards or shadows
- section index numbers live in an oversized detached left rail
- all utility labels are uppercase mono with wide letter-spacing on a common baseline grid
- tables, forms, and tabs use monochrome fields with hairline underlines or perimeter rules rather than filled controls
- the departure board component spends red only on delay; everything on time stays monochrome
## 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-019f706f-f170-7d73-a198-20cdccfd54b7/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.
## Do's and Don'ts
- Do Spend red as a positional and delay signal, not as decorative fill.
- Do Keep major text flush-left; let the rag create rhythm.
- Do Separate information blocks with rules and space instead of extra containers.
- Do Use tabular mono for schedules, codes, and numeric summaries.
- Do Let typography carry emphasis before reaching for colour or iconography.
- Don't Centre headlines or balance pages symmetrically.
- Don't Introduce rounded corners, soft shadows, or glass effects.
- Don't Use a second accent colour or an illustrative gradient.
- Don't Wrap regions in heavy boxes that destroy the open grid.
- Don't Make controls look tactile; they are engineered and flat.
## Imagery Direction
### Summary
Spare, diagrammatic, objective. Photography is a crop field, not a scene: transit information panels, ordered city plans, objective still lifes — each on warm paper, each holding a single red mark. Text and image never contest the same ground; copy sits on its own ink panel or in open space.
### Pairs With
kursbuch
### Techniques
- objective modernist graphic photography
- diagrammatic crop fields
- matte print texture
- hairline-rule overlays on a warm paper ground
```json
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "kursbuch",
"type": "registry:theme",
"title": "Kursbuch shadcn Theme",
"cssVars": {
"theme": {},
"light": {
"background": "#ECE9E1",
"foreground": "#121212",
"card": "#FCFBF7",
"card-foreground": "#121212",
"popover": "#FCFBF7",
"popover-foreground": "#121212",
"primary": "#121212",
"primary-foreground": "#ffffff",
"secondary": "#f4f4f5",
"secondary-foreground": "#111111",
"muted": "#6F6A63",
"muted-foreground": "#121212",
"accent": "#D62828",
"accent-foreground": "#ffffff",
"destructive": "#B00020",
"border": "#121212",
"input": "#121212",
"ring": "#D62828",
"chart-1": "#121212",
"chart-2": "#f4f4f5",
"chart-3": "#D62828",
"chart-4": "#1D6B3C",
"chart-5": "#B26A00",
"sidebar": "#FCFBF7",
"sidebar-foreground": "#121212",
"sidebar-primary": "#121212",
"sidebar-primary-foreground": "#ffffff",
"sidebar-accent": "#005F8C",
"sidebar-accent-foreground": "#ffffff",
"sidebar-border": "#121212",
"sidebar-ring": "#D62828",
"radius": "16px"
},
"dark": {
"background": "#0f1115",
"foreground": "#f8fafc",
"card": "#181b22",
"card-foreground": "#f8fafc",
"popover": "#181b22",
"popover-foreground": "#f8fafc",
"primary": "#121212",
"primary-foreground": "#ffffff",
"secondary": "#252a33",
"secondary-foreground": "#f8fafc",
"muted": "#252a33",
"muted-foreground": "#a1a1aa",
"accent": "#D62828",
"accent-foreground": "#ffffff",
"destructive": "#B00020",
"border": "#303642",
"input": "#303642",
"ring": "#D62828",
"chart-1": "#121212",
"chart-2": "#f4f4f5",
"chart-3": "#D62828",
"chart-4": "#1D6B3C",
"chart-5": "#B26A00",
"sidebar": "#181b22",
"sidebar-foreground": "#f8fafc",
"sidebar-primary": "#121212",
"sidebar-primary-foreground": "#ffffff",
"sidebar-accent": "#D62828",
"sidebar-accent-foreground": "#ffffff",
"sidebar-border": "#303642",
"sidebar-ring": "#D62828",
"radius": "16px"
}
},
"meta": {
"source": "katagami",
"languageId": "en-019f706f-f170-7d73-a198-20cdccfd54b7",
"slug": "kursbuch",
"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
Agent-generated
images by fal-ai/flux-pro/v1.1-ultra
Keep Kursbuchand swap a palette and an art style onto it — the landing & dashboard recolor live. The Studio does the same with all three lanes free.
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: #ECE9E1;
--foreground: #121212;
--card: #FCFBF7;
--card-foreground: #121212;
--popover: #FCFBF7;
--popover-foreground: #121212;
--primary: #121212;
--primary-foreground: #ffffff;
--secondary: #f4f4f5;
--secondary-foreground: #111111;
--muted: #6F6A63;
--muted-foreground: #121212;
--accent: #D62828;
--accent-foreground: #ffffff;
--destructive: #B00020;
--border: #121212;
--input: #121212;
--ring: #D62828;
--chart-1: #121212;
--chart-2: #f4f4f5;
--chart-3: #D62828;
--chart-4: #1D6B3C;
--chart-5: #B26A00;
--sidebar: #FCFBF7;
--sidebar-foreground: #121212;
--sidebar-primary: #121212;
--sidebar-primary-foreground: #ffffff;
--sidebar-accent: #005F8C;
--sidebar-accent-foreground: #ffffff;
--sidebar-border: #121212;
--sidebar-ring: #D62828;
--radius: 16px;
}
.dark {
--background: #0f1115;
--foreground: #f8fafc;
--card: #181b22;
--card-foreground: #f8fafc;
--popover: #181b22;
--popover-foreground: #f8fafc;
--primary: #121212;
--primary-foreground: #ffffff;
--secondary: #252a33;
--secondary-foreground: #f8fafc;
--muted: #252a33;
--muted-foreground: #a1a1aa;
--accent: #D62828;
--accent-foreground: #ffffff;
--destructive: #B00020;
--border: #303642;
--input: #303642;
--ring: #D62828;
--chart-1: #121212;
--chart-2: #f4f4f5;
--chart-3: #D62828;
--chart-4: #1D6B3C;
--chart-5: #B26A00;
--sidebar: #181b22;
--sidebar-foreground: #f8fafc;
--sidebar-primary: #121212;
--sidebar-primary-foreground: #ffffff;
--sidebar-accent: #D62828;
--sidebar-accent-foreground: #ffffff;
--sidebar-border: #303642;
--sidebar-ring: #D62828;
--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 KursbuchShadcnKit() {
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">Kursbuch</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": "kursbuch",
"type": "registry:theme",
"author": "katagami-agent",
"title": "Kursbuch",
"description": "Operational Swiss-modernist theme: warm paper ground, near-black neo-grotesk, hairline rules, square corners, and one signal red used as a positional and delay cue. Built for control-room and timetable surfaces that must read at a distance and scan in seconds.",
"cssVars": {
"theme": {
"font-sans": "IBM Plex Sans, Arial, sans-serif",
"font-mono": "IBM Plex Mono, ui-monospace, monospace",
"font-display": "Archivo, Helvetica Neue, Arial, sans-serif",
"radius": "0px"
},
"light": {
"background": "#ECE9E1",
"foreground": "#121212",
"card": "#FCFBF7",
"card-foreground": "#121212",
"popover": "#FCFBF7",
"popover-foreground": "#121212",
"primary": "#121212",
"primary-foreground": "#FCFBF7",
"secondary": "#F5F3EE",
"secondary-foreground": "#121212",
"muted": "#F5F3EE",
"muted-foreground": "#6F6A63",
"accent": "#D62828",
"accent-foreground": "#FCFBF7",
"destructive": "#B00020",
"destructive-foreground": "#FCFBF7",
"success": "#1D6B3C",
"warning": "#B26A00",
"info": "#005F8C",
"border": "#121212",
"input": "#121212",
"ring": "#D62828",
"radius": "0px"
},
"dark": {
"background": "#121212",
"foreground": "#ECE9E1",
"card": "#1A1A1A",
"card-foreground": "#ECE9E1",
"popover": "#1A1A1A",
"popover-foreground": "#ECE9E1",
"primary": "#ECE9E1",
"primary-foreground": "#121212",
"secondary": "#222222",
"secondary-foreground": "#ECE9E1",
"muted": "#222222",
"muted-foreground": "#A6A099",
"accent": "#E5433F",
"accent-foreground": "#121212",
"destructive": "#E5484D",
"destructive-foreground": "#121212",
"success": "#3FA968",
"warning": "#D08A2C",
"info": "#4AA3CE",
"border": "#3A3A3A",
"input": "#3A3A3A",
"ring": "#E5433F",
"radius": "0px"
}
},
"visualProfile": {
"family": "swiss-modernist",
"material": "matte paper, flat ink",
"contour": "square",
"border": "hairline",
"underlay": false,
"grain": false,
"stickerBadges": false,
"motion": "snappy",
"density": "medium",
"accents": ["#D62828"]
},
"notes": "Corners are square (radius 0) everywhere; separation is by 1px hairline rule and open space, never by elevation. Spend accent red only on the section signal bar, delay states, focus rings, and one primary action per view. Buttons and labels are uppercase mono; figures are tabular mono. Never a second accent, never a soft shadow on a square corner."
}
# Kursbuch — shadcn/ui Components
Author: `katagami-agent`
Kursbuch dresses [shadcn/ui](https://ui.shadcn.com) as an operational Swiss-modernist system: warm paper ground, near-black neo-grotesk, hairline rules, square corners, and one signal red used as a positional and delay cue. The theme is designed for control-room and timetable surfaces — dense, legible, engineered, flat.
## ShadSync visual profile
The renderer reads this profile to keep every primitive on-language:
| Trait | Value |
|---|---|
| family | swiss-modernist |
| material | matte paper, flat ink |
| contour | square (radius `0`) |
| border | hairline (`1px`, ink) |
| underlay | false — no soft fills behind controls |
| grain | false |
| stickerBadges | false |
| motion | snappy (140–160ms, `cubic-bezier(0.2,0,0,1)`) |
| density | medium |
| accents | `#D62828` (signal red only) |
Fonts: **Archivo** for display, **IBM Plex Sans** for body, **IBM Plex Mono** for labels, codes, and figures. Base size 17px, one strict 1.25 scale.
## Signature component recipes
These recipes make shadcn primitives read as Kursbuch rather than a generic house chassis.
### Button
Square corners, height `46px` (`h-11` with a flat radius), label `font-mono uppercase tracking-[0.16em]`. `default` is ink on paper (primary); `destructive`/accent is signal red; `outline` is a hairline ink ring; `ghost` is bare with an ink-soft hover. One primary action per view; the rest stay quiet. Labels never wrap (`whitespace-nowrap`).
```tsx
import { Button } from "@/components/ui/button"
<Button className="rounded-none h-11 font-mono uppercase tracking-[0.16em]">
Publish bulletin
</Button>
<Button variant="outline" className="rounded-none h-11 font-mono uppercase tracking-[0.16em]">
Export schedule
</Button>
```
### Card
No shadow, no rounded corner. A card is a `surface` plane separated by a hairline rule or a `1px` grid gutter — never elevation, never a single accent edge. Titles get padding above them; body is `muted-foreground`.
### Input / Textarea / Select
Monochrome field, hairline underline (`border-b`), square. Focus inks the baseline red via `ring`. No filled tactile chrome, no browser default. Labels are `font-mono uppercase tracking-[0.2em] text-muted-foreground`.
### Table
Ruled, not boxed. Header cells are mono uppercase; body figures are `font-mono tabular-nums`; rows separate on a faint hairline. Status is a `Badge` pill.
### Badge
A status pill: mono uppercase, a small leading square swatch in the semantic colour (`success`/`warning`/`destructive`/`info`). Square corners.
### Tabs
Underlined tab list; the active trigger carries a `3px` red baseline. No pill container.
### Alert
A ruled banner with a single role bar at the left edge (`shadow-[inset_3px_0_0]` in the role colour). Title mono uppercase, body muted.
## Preview shots
The renderable preview set lives in `preview-shots.json` (`preview-shots-v1`, all 16 primitives, three product scenes). It renders these scenes:
1. **Network control board** — a dashboard header with metric tiles, a live departure table, and status pills; red spent only on delay.
2. **Bulletin composer** — a form scene: inputs, select, textarea, checkbox, switch, radio, and a primary/ghost button pair.
3. **Incident panel** — alerts with role bars, a tabs strip, badges, tooltip, and a capacity slider.
Each shot names the primitives it must show, what to compose, and what to avoid (no rounded corners, no shadows, no second accent).
## Copy-paste component example
A departure row assembled from primitives, styled to the theme:
```tsx
import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from "@/components/ui/table"
import { Badge } from "@/components/ui/badge"
export function DepartureBoard() {
return (
<Table className="[&_*]:rounded-none">
<TableHeader>
<TableRow>
<TableHead className="font-mono uppercase tracking-[0.18em]">Line</TableHead>
<TableHead className="font-mono uppercase tracking-[0.18em]">Destination</TableHead>
<TableHead className="font-mono uppercase tracking-[0.18em] text-right">Depart</TableHead>
<TableHead className="font-mono uppercase tracking-[0.18em] text-right">Status</TableHead>
</TableRow>
</TableHeader>
<TableBody>
<TableRow>
<TableCell className="font-display font-extrabold text-xl">S4</TableCell>
<TableCell>Steinweg — Ostkai</TableCell>
<TableCell className="text-right font-mono tabular-nums text-[color:var(--accent)]">07:48</TableCell>
<TableCell className="text-right">
<Badge className="rounded-none font-mono uppercase bg-transparent text-[color:var(--warning)]">Delayed</Badge>
</TableCell>
</TableRow>
</TableBody>
</Table>
)
}
```
All primitives are imported from `@/components/ui/` and inherit the Kursbuch tokens from `export.json`. Keep corners square, separation by hairline rule, and red reserved for the signal.
{
"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": "en-019f706f-f170-7d73-a198-20cdccfd54b7",
"name": "Kursbuch",
"slug": "kursbuch"
},
"installCommand": "npx shadcn@latest add https://katagami.ai/r/kursbuch.json",
"primitives": [
"button",
"card",
"input",
"textarea",
"select",
"dialog",
"sheet",
"tabs",
"badge",
"separator",
"checkbox",
"switch",
"slider",
"tooltip",
"dropdown-menu",
"table"
],
"identityNotes": [
"Square corners everywhere (radius 0); a rounded corner breaks the language.",
"Separation is by 1px hairline ink rule and open space, never elevation — no shadows on square corners.",
"Signal red is spent only on the section bar, delay states, focus rings, and one primary action per view.",
"Labels, codes, and figures are IBM Plex Mono; figures use tabular-nums so columns align on a common baseline.",
"Display headlines are oversized Archivo, flush-left, tight leading; nothing is centred.",
"Every section opens with the red signal bar and an oversized index number — the signature mechanic."
],
"visualProfile": {
"family": "swiss-modernist",
"material": "matte paper, flat ink",
"contour": "square",
"border": "hairline",
"underlay": false,
"grain": false,
"stickerBadges": false,
"motion": "snappy",
"density": "medium",
"accents": [
"#D62828"
]
},
"tokens": {
"background": "#ECE9E1",
"surface": "#FCFBF7",
"foreground": "#121212",
"muted": "#6F6A63",
"accent": "#D62828",
"onAccent": "#FCFBF7",
"success": "#1D6B3C",
"warning": "#B26A00",
"error": "#B00020",
"info": "#005F8C",
"border": "#121212",
"radius": "0px",
"fontDisplay": "Archivo, Helvetica Neue, Arial, sans-serif",
"fontBody": "IBM Plex Sans, Arial, sans-serif",
"fontMono": "IBM Plex Mono, ui-monospace, monospace",
"baseSize": "17px"
},
"shots": [
{
"id": "control-board",
"title": "Network control board",
"viewport": "desktop",
"primitives": [
"card",
"table",
"badge",
"button",
"separator",
"dropdown-menu",
"tabs"
],
"composition": "A dashboard header with an oversized flush-left title behind a red signal bar, a row of four ruled metric tiles, then a live departure table with mono tabular times and status pills. A tabs strip switches views; a dropdown-menu filters lines.",
"mustShow": [
"red signal bar left of the section title",
"hairline rules separating metric tiles instead of boxes",
"mono tabular-nums times in the table",
"delayed row rendered in signal red, on-time rows monochrome",
"square corners on every element"
],
"avoid": [
"rounded corners",
"drop shadows",
"a second accent colour",
"centred headings"
],
"scene": {
"headline": "Network Control Timetable",
"description": "Morning peak — 24 lines running, 96.4% on time, 3 open incidents.",
"rows": [
{
"line": "S1",
"destination": "Hafenmarkt — Nordbogen",
"depart": "07:42",
"status": "On time"
},
{
"line": "S4",
"destination": "Steinweg — Ostkai",
"depart": "07:48",
"status": "Delayed +6"
},
{
"line": "S7",
"destination": "Universitat — Werkhof",
"depart": "07:55",
"status": "Boarding"
},
{
"line": "R2",
"destination": "Bergpass — Talstation",
"depart": "08:03",
"status": "On time"
}
]
}
},
{
"id": "bulletin-composer",
"title": "Bulletin composer",
"viewport": "desktop",
"primitives": [
"card",
"input",
"select",
"textarea",
"checkbox",
"switch",
"button",
"separator"
],
"composition": "A service-bulletin form under a red-barred section head: two ruled input fields, a select for the service window, a textarea for the note, a checkbox and a switch for options, closed by a primary ink button and a ghost reset. Fields are monochrome with hairline underlines; focus inks the baseline red.",
"mustShow": [
"monochrome fields with hairline underline, no filled chrome",
"mono uppercase field labels tracked wide",
"one primary button (ink) and one quieter ghost button",
"square switch and square checkbox primitives"
],
"avoid": [
"rounded pill inputs",
"tactile raised buttons",
"browser-default controls",
"soft shadows"
],
"scene": {
"headline": "Compose service bulletin",
"description": "Post an incident notice to controllers and the public board.",
"fields": [
{
"label": "Service line",
"value": "S4 — Steinweg / Ostkai"
},
{
"label": "Control code",
"value": "OPS-118A"
},
{
"label": "Window",
"value": "Morning peak · 06:00–09:30"
},
{
"label": "Bulletin note",
"value": "Station works between Steinweg and Ostkai reduce throughput for ninety minutes."
}
]
}
},
{
"id": "incident-panel",
"title": "Incident panel",
"viewport": "desktop",
"primitives": [
"tabs",
"badge",
"slider",
"tooltip",
"dialog",
"sheet",
"separator",
"card"
],
"composition": "An incident-log panel: a tabs strip with a red active baseline, a stack of alert cards each carrying a single role bar at the left edge, status badges, a capacity slider, and a tooltip on a metric. A dialog confirms a reroute; a sheet holds line detail.",
"mustShow": [
"role bar at the left edge of each alert, in the semantic colour",
"active tab with a 3px red baseline, no pill container",
"status badges as mono uppercase pills with a leading swatch",
"capacity slider track filled in accent red"
],
"avoid": [
"boxed nav pills",
"rounded cards",
"multiple competing accents",
"shadow elevation"
],
"scene": {
"headline": "Incident log",
"description": "Three open incidents across the morning peak.",
"stats": [
{
"label": "Peak capacity",
"value": "82%"
},
{
"label": "Fleet available",
"value": "94%"
},
{
"label": "Platform load",
"value": "67%"
}
]
}
}
],
"componentRecipes": [
{
"primitive": "button",
"intent": "Primary action: ink-on-paper, square, height 46px, mono uppercase label tracked 0.16em, never wraps; one per view."
},
{
"primitive": "button",
"intent": "Accent/destructive: signal red fill with on-accent label for a dispatch or delete action."
},
{
"primitive": "card",
"intent": "Surface plane separated by a hairline rule or 1px grid gutter — no shadow, no radius, no single accent edge."
},
{
"primitive": "input",
"intent": "Monochrome field with a hairline underline; focus inks the baseline red; mono uppercase label above."
},
{
"primitive": "textarea",
"intent": "Same field treatment with a full hairline perimeter rule; square; note-length content."
},
{
"primitive": "select",
"intent": "Hairline-underlined field with an SVG chevron primitive; options in body sans; square popover."
},
{
"primitive": "dialog",
"intent": "Square modal on a surface plane, hairline rule under the title, primary/ghost button pair; no rounded corners."
},
{
"primitive": "sheet",
"intent": "Edge-anchored panel with a persistent left index rail feel; hairline divider; slides in snappy (160ms)."
},
{
"primitive": "tabs",
"intent": "Underlined tab list; active trigger carries a 3px red baseline; mono uppercase labels; no pill container."
},
{
"primitive": "badge",
"intent": "Status pill: mono uppercase with a small leading square swatch in the semantic colour; square corners."
},
{
"primitive": "separator",
"intent": "1px ink hairline; the primary structural device in place of boxes and elevation."
},
{
"primitive": "checkbox",
"intent": "Square box with a hairline ring; checked state fills accent red with an SVG tick primitive."
},
{
"primitive": "switch",
"intent": "Square track with a square knob; on-state fills accent red; no pill rounding."
},
{
"primitive": "slider",
"intent": "Thin flat track with a square handle; filled portion in accent red; tabular value label in mono."
},
{
"primitive": "tooltip",
"intent": "Square ink tooltip on paper text, mono caption, snappy fade; no shadow, hairline only if needed."
},
{
"primitive": "dropdown-menu",
"intent": "Square surface menu, hairline divider between groups, mono uppercase item labels, red hover marker."
},
{
"primitive": "table",
"intent": "Ruled not boxed: mono uppercase headers, tabular-nums figures, faint hairline row rules, status via badge pill."
}
],
"qualityRules": {
"do": [
"Keep every corner square (radius 0).",
"Separate with hairline rules and open space, not elevation.",
"Spend red only on the signal bar, delay, focus ring, and one primary action.",
"Set codes and figures in mono with tabular-nums.",
"Give titles padding above them; keep composition flush-left."
],
"dont": [
"Add rounded corners, soft shadows, or glass.",
"Introduce a second accent or a decorative gradient.",
"Box navigation into a floating pill or nest cards.",
"Let a button or label wrap.",
"Center headings or balance the page symmetrically."
]
}
}