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 source of truth for most agents and apps.
Compose screens as regions of a vector scope: an instrument bar or rail, channel-coloured readout panels, scope traces and a plot-log table, all on a graticule ground aligned to an 8px grid.
Hierarchy comes from the display/mono contrast, channel colour, and the beam-trace outline — large display type is reserved for screen titles and critical counters.
Compact and information-rich; readouts expose many states at once without collapsing into minimalism.
12-column desktop grid on an 8px base; panels align to the graticule and internal spacing resolves in multiples of 4/8px.
Tablet (768-1024) is its own layout — the rail collapses to a horizontal strip and grids drop to two columns; mobile stacks to a single column, wraps headlines, hides non-essential nav, and scrolls dense tables horizontally.
Economical and structural — gaps separate panels and control groups without erasing the workstation density.
gantry-plot
Single-weight pen-plotter line art on the vector-scope ground: any subject drawn as one continuous phosphor contour with glowing endpoint nodes over a faint graticule.
A wide plotted composition of oscilloscope traces and function curves, calm dark space reserved for the overlay.
photographic imagery, glossy 3D, neon bloom, synthwave perspective floors, any text.
# Gantry ## Philosophy Gantry is a vector-scope workstation language for tools that report honestly. It keeps the early-computing machine-room discipline — a limited palette where colour codes system state, quantized readouts, and a compact information-rich surface — but reconceives the expression from the CRT/DOS costume into a pen-plotter table. The signature move is the beam trace: every panel is drawn by one continuous plotted stroke that lifts at a glowing node, and data arrives as scope traces and segmented cells rather than smooth bars. ### Values - Colour carries operational meaning: three plotter channels (cyan / amber / magenta) code system state. - The drawn beam-trace outline is the frame — no box borders, no accent-edge cards. - Data stays quantized and machine-honest: scope traces and segmented meters, never smooth marketing curves. - Dense and information-rich, yet high-contrast and legible at every size. - One strict type scale; a clean grotesque for display, mono for all data. ### Anti-Values - Scanline overlays, CRT bevels, checker-dither, or a pixel display font (the abandoned costume). - Grey box borders and nested cards. - Navigation trapped in a floating pill or rounded widget. - Smooth gradient progress bars and soft drop-shadow elevation. - Muddy grounds; airy luxury minimalism that erases the workstation density. ### Visual Character - Every module is drawn by a single continuous plotted stroke; the panel outline is the trace, ending in a glowing endpoint node. - A faint teal graticule grid underlies every surface, so panels read as regions of a vector scope rather than floating marketing cards. - Numbers render as two- or three-channel scope traces and segmented quantized meters keyed to the channel colours. - Elevation is a tight phosphor glow (0 0 N glow), never a soft drop shadow; geometry is sharp with radius 0 by default. - Type pairs a clean grotesque for screen titles with dense mono for data; labels are uppercase with wide tracking like instrument signage. ## Tokens ### Colors | Name | Value | |------|-------| | bg | `#04121a` | | surface | `#0a1f2b` | | surface_solid | `#0d2733` | | text | `#e6f7ff` | | muted | `#6f97a6` | | border | `#1d4150` | | accent | `#31e6ff` | | accent_2 | `#ffb02e` | | accent_soft | `#0d2733` | | on_accent | `#04121a` | | success | `#3dffa2` | | warning | `#ffd23d` | | error | `#ff5c6c` | | info | `#31e6ff` | ### Typography - **Base Size**: 17px - **Body Font**: JetBrains Mono, ui-monospace, monospace - **Heading Font**: Space Grotesk, system-ui, sans-serif - **Mono Font**: JetBrains Mono, ui-monospace, monospace - **Heading Weight**: 700 - **Heading Transform**: none - **Letter Spacing**: -0.02em - **Line Height**: 1.55 - **Scale Ratio**: 1.2 - **Google Fonts Url**: https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap ### Radii - **None**: 0px - **Md**: 16px - **Lg**: 24px - **Full**: 9999px ### Shadows - **Sm**: 0 0 8px color-mix(in srgb,#31e6ff 45%,transparent) - **Md**: 0 0 16px color-mix(in srgb,#31e6ff 55%,transparent) - **Lg**: 0 0 26px color-mix(in srgb,#31e6ff 55%,transparent) ### Spacing - **Base**: 8px - **Scale**: ["4px","8px","16px","24px","32px","48px","64px"] ### Surfaces - **Treatment**: graticule - **Card Style**: Flat phosphor panel drawn by a beam-trace outline with a glowing endpoint node; no border, no nested cards. - **Bg Pattern**: graticule-grid ### Borders - **Default Width**: 0px - **Accent Width**: 1.6px - **Style**: drawn-trace - **Character**: The frame is a drawn beam trace (SVG stroke + glow), not a box border; each stroke ends in a glowing node. ### Motion - **Duration**: 200ms - **Easing**: cubic-bezier(.2,.7,.2,1) - **Philosophy**: snappy beam-draw reveals; settled state is the default ## Rules ### Composition Compose screens as regions of a vector scope: an instrument bar or rail, channel-coloured readout panels, scope traces and a plot-log table, all on a graticule ground aligned to an 8px grid. ### Hierarchy Hierarchy comes from the display/mono contrast, channel colour, and the beam-trace outline — large display type is reserved for screen titles and critical counters. ### Density Compact and information-rich; readouts expose many states at once without collapsing into minimalism. ### Signature Patterns - The beam trace: every panel outline is a single drawn stroke ending in a glowing node — never a box border. - Quantized data: segmented meters and multi-channel scope traces sampled at intervals, never smooth gradient bars. - Status lamps: chips whose leading dot glows in the state or channel colour. - Three plotter channels (cyan A / amber B / magenta C) mapped onto semantic roles so a palette swap re-inks every trace at once. - Phosphor-glow elevation: focus rings, live beams and lamps glow; there are no soft drop shadows. ## Layout ### Grid 12-column desktop grid on an 8px base; panels align to the graticule and internal spacing resolves in multiples of 4/8px. ### Breakpoints Tablet (768-1024) is its own layout — the rail collapses to a horizontal strip and grids drop to two columns; mobile stacks to a single column, wraps headlines, hides non-essential nav, and scrolls dense tables horizontally. ### Whitespace Economical and structural — gaps separate panels and control groups without erasing the workstation density. ## Guidance ### Do - Let the beam-trace outline be the frame; end each stroke in a glowing node. - Keep data quantized — scope traces and segmented cells. - Use the three channels for meaning; keep semantic colours small. - Keep geometry sharp and elevation a tight phosphor glow. - Pair a grotesque display face with a mono data face on one strict scale. ### Don't - Do not reintroduce scanlines, CRT bevels, checker-dither, or a pixel display font. - Do not add box borders or nest cards; do not box the navigation. - Do not use smooth gradient bars or soft drop shadows. - Do not use emoji or symbol glyphs on controls or in copy. - Do not let a headline or table run off the mobile edge. ## Imagery Direction ### Pairs With gantry-plot ### Summary Single-weight pen-plotter line art on the vector-scope ground: any subject drawn as one continuous phosphor contour with glowing endpoint nodes over a faint graticule. ### Hero A wide plotted composition of oscilloscope traces and function curves, calm dark space reserved for the overlay. ### Avoid photographic imagery, glossy 3D, neon bloom, synthwave perspective floors, any text.
---
version: "alpha"
name: "Gantry"
description: "Agent-curated design language exported from Katagami as DESIGN.md."
colors:
bg: "#04121a"
surface: "#0a1f2b"
surface_solid: "#0d2733"
text: "#e6f7ff"
muted: "#6f97a6"
border: "#1d4150"
accent: "#31e6ff"
accent_2: "#ffb02e"
accent_soft: "#0d2733"
on_accent: "#04121a"
success: "#3dffa2"
warning: "#ffd23d"
error: "#ff5c6c"
info: "#31e6ff"
typography:
headline-lg:
fontFamily: "Space Grotesk, system-ui, sans-serif"
fontSize: "2.075rem"
fontWeight: 700
lineHeight: 1.1
letterSpacing: "-0.02em"
headline-md:
fontFamily: "Space Grotesk, system-ui, sans-serif"
fontSize: "1.66rem"
fontWeight: 600
lineHeight: 1.15
letterSpacing: "-0.02em"
body-md:
fontFamily: "JetBrains Mono, ui-monospace, monospace"
fontSize: "17px"
fontWeight: 400
lineHeight: 1.5
letterSpacing: "-0.02em"
label-md:
fontFamily: "JetBrains 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"
xs: "4px"
sm: "8px"
md: "16px"
lg: "24px"
xl: "32px"
2xl: "48px"
3xl: "64px"
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: "#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"
---
# Gantry
## Overview
Gantry is a vector-scope workstation language for tools that report honestly. It keeps the early-computing machine-room discipline — a limited palette where colour codes system state, quantized readouts, and a compact information-rich surface — but reconceives the expression from the CRT/DOS costume into a pen-plotter table. The signature move is the beam trace: every panel is drawn by one continuous plotted stroke that lifts at a glowing node, and data arrives as scope traces and segmented cells rather than smooth bars.
### Values
- Colour carries operational meaning: three plotter channels (cyan / amber / magenta) code system state.
- The drawn beam-trace outline is the frame — no box borders, no accent-edge cards.
- Data stays quantized and machine-honest: scope traces and segmented meters, never smooth marketing curves.
- Dense and information-rich, yet high-contrast and legible at every size.
- One strict type scale; a clean grotesque for display, mono for all data.
### Anti-Values
- Scanline overlays, CRT bevels, checker-dither, or a pixel display font (the abandoned costume).
- Grey box borders and nested cards.
- Navigation trapped in a floating pill or rounded widget.
- Smooth gradient progress bars and soft drop-shadow elevation.
- Muddy grounds; airy luxury minimalism that erases the workstation density.
### Visual Character
- Every module is drawn by a single continuous plotted stroke; the panel outline is the trace, ending in a glowing endpoint node.
- A faint teal graticule grid underlies every surface, so panels read as regions of a vector scope rather than floating marketing cards.
- Numbers render as two- or three-channel scope traces and segmented quantized meters keyed to the channel colours.
- Elevation is a tight phosphor glow (0 0 N glow), never a soft drop shadow; geometry is sharp with radius 0 by default.
- Type pairs a clean grotesque for screen titles with dense mono for data; labels are uppercase with wide tracking like instrument signage.
## 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 | `#04121a` |
| surface | `#0a1f2b` |
| surface_solid | `#0d2733` |
| text | `#e6f7ff` |
| muted | `#6f97a6` |
| border | `#1d4150` |
| accent | `#31e6ff` |
| accent_2 | `#ffb02e` |
| accent_soft | `#0d2733` |
| on_accent | `#04121a` |
| success | `#3dffa2` |
| warning | `#ffd23d` |
| error | `#ff5c6c` |
| info | `#31e6ff` |
## Typography
- **Headline-Lg**: Space Grotesk, system-ui, sans-serif, 2.075rem, weight 700, line-height 1.1.
- **Headline-Md**: Space Grotesk, system-ui, sans-serif, 1.66rem, weight 600, line-height 1.15.
- **Body-Md**: JetBrains Mono, ui-monospace, monospace, 17px, weight 400, line-height 1.5.
- **Label-Md**: JetBrains Mono, ui-monospace, monospace, 0.75rem, weight 600, line-height 1.
## Layout
### Spacing Tokens
- **Base**: `8px`
- **Xs**: `4px`
- **Sm**: `8px`
- **Md**: `16px`
- **Lg**: `24px`
- **Xl**: `32px`
- **2xl**: `48px`
- **3xl**: `64px`
### Grid
12-column desktop grid on an 8px base; panels align to the graticule and internal spacing resolves in multiples of 4/8px.
### Breakpoints
Tablet (768-1024) is its own layout — the rail collapses to a horizontal strip and grids drop to two columns; mobile stacks to a single column, wraps headlines, hides non-essential nav, and scrolls dense tables horizontally.
### Whitespace
Economical and structural — gaps separate panels and control groups without erasing the workstation density.
## Elevation & Depth
### Shadows
- **Sm**: 0 0 8px color-mix(in srgb,#31e6ff 45%,transparent)
- **Md**: 0 0 16px color-mix(in srgb,#31e6ff 55%,transparent)
- **Lg**: 0 0 26px color-mix(in srgb,#31e6ff 55%,transparent)
## Shapes
### Rounded
- **None**: `0px`
- **Md**: `16px`
- **Lg**: `24px`
- **Full**: `9999px`
### Surfaces
- **Treatment**: graticule
- **Card Style**: Flat phosphor panel drawn by a beam-trace outline with a glowing endpoint node; no border, no nested cards.
- **Bg Pattern**: graticule-grid
### Borders
- **Default Width**: 0px
- **Accent Width**: 1.6px
- **Style**: drawn-trace
- **Character**: The frame is a drawn beam trace (SVG stroke + glow), not a box border; each stroke ends in a glowing node.
## Components
### Composition
Compose screens as regions of a vector scope: an instrument bar or rail, channel-coloured readout panels, scope traces and a plot-log table, all on a graticule ground aligned to an 8px grid.
### Hierarchy
Hierarchy comes from the display/mono contrast, channel colour, and the beam-trace outline — large display type is reserved for screen titles and critical counters.
### Density
Compact and information-rich; readouts expose many states at once without collapsing into minimalism.
### Signature Patterns
- The beam trace: every panel outline is a single drawn stroke ending in a glowing node — never a box border.
- Quantized data: segmented meters and multi-channel scope traces sampled at intervals, never smooth gradient bars.
- Status lamps: chips whose leading dot glows in the state or channel colour.
- Three plotter channels (cyan A / amber B / magenta C) mapped onto semantic roles so a palette swap re-inks every trace at once.
- Phosphor-glow elevation: focus rings, live beams and lamps glow; there are no soft drop shadows.
## 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-019f3dd6-79ef-79d2-8c50-6a6fb4fcefab/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 Let the beam-trace outline be the frame; end each stroke in a glowing node.
- Do Keep data quantized — scope traces and segmented cells.
- Do Use the three channels for meaning; keep semantic colours small.
- Do Keep geometry sharp and elevation a tight phosphor glow.
- Do Pair a grotesque display face with a mono data face on one strict scale.
- Don't Do not reintroduce scanlines, CRT bevels, checker-dither, or a pixel display font.
- Don't Do not add box borders or nest cards; do not box the navigation.
- Don't Do not use smooth gradient bars or soft drop shadows.
- Don't Do not use emoji or symbol glyphs on controls or in copy.
- Don't Do not let a headline or table run off the mobile edge.
## Imagery Direction
### Pairs With
gantry-plot
### Summary
Single-weight pen-plotter line art on the vector-scope ground: any subject drawn as one continuous phosphor contour with glowing endpoint nodes over a faint graticule.
### Hero
A wide plotted composition of oscilloscope traces and function curves, calm dark space reserved for the overlay.
### Avoid
photographic imagery, glossy 3D, neon bloom, synthwave perspective floors, any text.
```json
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "gantry",
"type": "registry:theme",
"title": "Gantry shadcn Theme",
"cssVars": {
"theme": {},
"light": {
"background": "#04121a",
"foreground": "#e6f7ff",
"card": "#0a1f2b",
"card-foreground": "#e6f7ff",
"popover": "#0a1f2b",
"popover-foreground": "#e6f7ff",
"primary": "#e6f7ff",
"primary-foreground": "#111111",
"secondary": "#f4f4f5",
"secondary-foreground": "#111111",
"muted": "#6f97a6",
"muted-foreground": "#e6f7ff",
"accent": "#31e6ff",
"accent-foreground": "#111111",
"destructive": "#ff5c6c",
"border": "#1d4150",
"input": "#1d4150",
"ring": "#31e6ff",
"chart-1": "#e6f7ff",
"chart-2": "#f4f4f5",
"chart-3": "#31e6ff",
"chart-4": "#3dffa2",
"chart-5": "#ffd23d",
"sidebar": "#0a1f2b",
"sidebar-foreground": "#e6f7ff",
"sidebar-primary": "#e6f7ff",
"sidebar-primary-foreground": "#111111",
"sidebar-accent": "#31e6ff",
"sidebar-accent-foreground": "#111111",
"sidebar-border": "#1d4150",
"sidebar-ring": "#31e6ff",
"radius": "16px"
},
"dark": {
"background": "#0f1115",
"foreground": "#f8fafc",
"card": "#181b22",
"card-foreground": "#f8fafc",
"popover": "#181b22",
"popover-foreground": "#f8fafc",
"primary": "#e6f7ff",
"primary-foreground": "#111111",
"secondary": "#252a33",
"secondary-foreground": "#f8fafc",
"muted": "#252a33",
"muted-foreground": "#a1a1aa",
"accent": "#31e6ff",
"accent-foreground": "#111111",
"destructive": "#ff5c6c",
"border": "#303642",
"input": "#303642",
"ring": "#31e6ff",
"chart-1": "#e6f7ff",
"chart-2": "#f4f4f5",
"chart-3": "#31e6ff",
"chart-4": "#3dffa2",
"chart-5": "#ffd23d",
"sidebar": "#181b22",
"sidebar-foreground": "#f8fafc",
"sidebar-primary": "#e6f7ff",
"sidebar-primary-foreground": "#111111",
"sidebar-accent": "#31e6ff",
"sidebar-accent-foreground": "#111111",
"sidebar-border": "#303642",
"sidebar-ring": "#31e6ff",
"radius": "16px"
}
},
"meta": {
"source": "katagami",
"languageId": "en-019f3dd6-79ef-79d2-8c50-6a6fb4fcefab",
"slug": "gantry",
"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
Keep Gantryand 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: #04121a;
--foreground: #e6f7ff;
--card: #0a1f2b;
--card-foreground: #e6f7ff;
--popover: #0a1f2b;
--popover-foreground: #e6f7ff;
--primary: #e6f7ff;
--primary-foreground: #111111;
--secondary: #f4f4f5;
--secondary-foreground: #111111;
--muted: #6f97a6;
--muted-foreground: #e6f7ff;
--accent: #31e6ff;
--accent-foreground: #111111;
--destructive: #ff5c6c;
--border: #1d4150;
--input: #1d4150;
--ring: #31e6ff;
--chart-1: #e6f7ff;
--chart-2: #f4f4f5;
--chart-3: #31e6ff;
--chart-4: #3dffa2;
--chart-5: #ffd23d;
--sidebar: #0a1f2b;
--sidebar-foreground: #e6f7ff;
--sidebar-primary: #e6f7ff;
--sidebar-primary-foreground: #111111;
--sidebar-accent: #31e6ff;
--sidebar-accent-foreground: #111111;
--sidebar-border: #1d4150;
--sidebar-ring: #31e6ff;
--radius: 16px;
}
.dark {
--background: #0f1115;
--foreground: #f8fafc;
--card: #181b22;
--card-foreground: #f8fafc;
--popover: #181b22;
--popover-foreground: #f8fafc;
--primary: #e6f7ff;
--primary-foreground: #111111;
--secondary: #252a33;
--secondary-foreground: #f8fafc;
--muted: #252a33;
--muted-foreground: #a1a1aa;
--accent: #31e6ff;
--accent-foreground: #111111;
--destructive: #ff5c6c;
--border: #303642;
--input: #303642;
--ring: #31e6ff;
--chart-1: #e6f7ff;
--chart-2: #f4f4f5;
--chart-3: #31e6ff;
--chart-4: #3dffa2;
--chart-5: #ffd23d;
--sidebar: #181b22;
--sidebar-foreground: #f8fafc;
--sidebar-primary: #e6f7ff;
--sidebar-primary-foreground: #111111;
--sidebar-accent: #31e6ff;
--sidebar-accent-foreground: #111111;
--sidebar-border: #303642;
--sidebar-ring: #31e6ff;
--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 GantryShadcnKit() {
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">Gantry</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": "gantry",
"type": "registry:theme",
"author": "katagami-agent",
"title": "Gantry",
"description": "A vector-scope workstation theme: deep phosphor-blue ground, three plotter channels (cyan / amber / magenta) as accents, sharp geometry, and glowing beam-trace outlines instead of borders.",
"cssVars": {
"theme": {
"font-sans": "Space Grotesk, system-ui, sans-serif",
"font-mono": "JetBrains Mono, ui-monospace, monospace",
"radius": "0px"
},
"light": {
"background": "#04121a",
"foreground": "#e6f7ff",
"card": "#0a1f2b",
"card-foreground": "#e6f7ff",
"popover": "#0d2733",
"popover-foreground": "#e6f7ff",
"primary": "#31e6ff",
"primary-foreground": "#04121a",
"secondary": "#0d2733",
"secondary-foreground": "#e6f7ff",
"muted": "#0d2733",
"muted-foreground": "#6f97a6",
"accent": "#ffb02e",
"accent-foreground": "#04121a",
"destructive": "#ff5c6c",
"destructive-foreground": "#04121a",
"border": "#1d4150",
"input": "#1d4150",
"ring": "#31e6ff",
"chart-1": "#31e6ff",
"chart-2": "#ffb02e",
"chart-3": "#ff4fd8",
"chart-4": "#3dffa2",
"chart-5": "#ffd23d",
"radius": "0px"
},
"dark": {
"background": "#04121a",
"foreground": "#e6f7ff",
"card": "#0a1f2b",
"card-foreground": "#e6f7ff",
"popover": "#0d2733",
"popover-foreground": "#e6f7ff",
"primary": "#31e6ff",
"primary-foreground": "#04121a",
"secondary": "#0d2733",
"secondary-foreground": "#e6f7ff",
"muted": "#0d2733",
"muted-foreground": "#6f97a6",
"accent": "#ffb02e",
"accent-foreground": "#04121a",
"destructive": "#ff5c6c",
"destructive-foreground": "#04121a",
"border": "#1d4150",
"input": "#1d4150",
"ring": "#31e6ff",
"chart-1": "#31e6ff",
"chart-2": "#ffb02e",
"chart-3": "#ff4fd8",
"chart-4": "#3dffa2",
"chart-5": "#ffd23d",
"radius": "0px"
}
},
"visualProfile": {
"family": "vector-scope workstation",
"material": "flat phosphor panels on a graticule ground",
"contour": "sharp",
"border": "beam-trace outline (drawn stroke, not a box border)",
"underlay": true,
"grain": false,
"stickerBadges": false,
"motion": "snappy beam-draw reveals; settled state default",
"density": "compact",
"accents": ["#31e6ff", "#ffb02e", "#ff4fd8"]
},
"notes": "Ground is a true blue-black (#04121a), never grey. The three accents behave like plotter channels A/B/C and carry operational meaning; semantic success/warning/error stay small. Elevation is a tight phosphor glow, not a drop shadow. Radius is 0 by default; do not round panels into pills."
}
# Gantry — shadcn/ui Components
> Component recipes for the **Gantry** vector-scope workstation language.
> Format: `component-recipes-v1`
> Author: `katagami-agent`
Gantry dresses shadcn/ui as a plotter table: a deep phosphor-blue ground, sharp geometry, three plotter-channel accents (cyan / amber / magenta), and — the signature move — panel outlines that are **drawn beam traces**, not box borders, each ending in a glowing node.
## ShadSync visual profile
- **family**: vector-scope workstation
- **material**: flat phosphor panels on a faint graticule ground
- **contour**: sharp (radius 0 by default; 16/24 reserved for rare soft elements)
- **border**: beam-trace outline — an SVG stroke that draws the panel frame; never a grey box border
- **underlay**: a low-contrast graticule grid under every surface
- **grain**: none (this is the plotter, not the CRT costume — no scanlines)
- **stickerBadges**: none
- **motion**: snappy beam-draw reveals; the fully settled state is the default and renders with no JS
- **density**: compact, information-rich
- **accents**: `#31e6ff` (Channel A / primary), `#ffb02e` (Channel B), `#ff4fd8` (Channel C)
The renderer follows this `visualProfile`; it must honour the sharp radius, the drawn outline, and the glow-as-elevation rather than stamping a generic house chassis.
## Signature component recipes
### Button
One shape, 44px height, uppercase mono label centred, a small state LED to the left. Primary is solid cyan on the phosphor ground; the rest are quiet ghosts (transparent with a hairline inset); an alarm variant reads red. Hover lifts a tight cyan glow. Labels never wrap.
```
@/components/ui/button
- primary: bg-primary text-primary-foreground (led = ground colour)
- ghost: bg-transparent + inset ring (border colour) -> ring goes cyan on hover
- alarm: text-destructive + destructive inset ring
```
### Card
No border. A relative container whose outline is a beam-trace `<rect>` stroked in the channel colour, with a drop-shadow glow, plus an absolutely-positioned node dot at a corner. Content sits above the trace.
```
@/components/ui/card
- wrap the CardContent in a relative box
- overlay an inline SVG rect (stroke = channel accent, filter = glow)
- channel variants: .ch-a (cyan) / .ch-b (amber) / .ch-c (magenta)
```
### Input / Textarea / Select
Explicitly styled, no browser defaults. Fill is the ground colour with an inset hairline; focus lights the beam (cyan inset ring + glow). Select draws its own plotted caret. Textarea resizes vertically only.
```
@/components/ui/input @/components/ui/textarea @/components/ui/select
- box-shadow: inset 0 0 0 1.5px var(--border)
- focus: inset 0 0 0 1.5px var(--ring), 0 0 16px glow
```
### Switch / Checkbox
Latching relays: a square track/box with an inset hairline; the ON state fills cyan and adds a glow. Sharp, never a rounded pill toggle.
```
@/components/ui/switch @/components/ui/checkbox
```
### Slider
A thin graticule track with a narrow vertical plotted thumb (a beam), glowing.
```
@/components/ui/slider
```
### Badge
A chip / status lamp: uppercase mono, a leading dot that glows in the state colour (success / warning / error / info / channel).
```
@/components/ui/badge
```
### Tabs / Separator
Tabs are underlined text on a hairline rail — the active tab lights a cyan underline with a glow. Separator is a single graticule hairline; never a heavy divider.
```
@/components/ui/tabs @/components/ui/separator
```
### Dialog / Sheet / Tooltip / Dropdown-menu
Surfaces float on the ground with a beam-trace outline and a soft scrim (never a lazy gradient). Tooltips are compact mono labels. Menus keep the sharp geometry and channel accent on the active row.
```
@/components/ui/dialog @/components/ui/sheet @/components/ui/tooltip @/components/ui/dropdown-menu
```
### Table
Ledger-dense, mono, `14.5px+` rows on a graticule. Header labels are uppercase muted; amounts read in Channel B amber. Scrolls horizontally on narrow screens rather than collapsing.
```
@/components/ui/table
```
## Copy-paste component example
A Gantry primary button with its state LED:
```tsx
import { Button } from "@/components/ui/button"
export function RunPlot() {
return (
<Button className="h-11 gap-2 rounded-none bg-primary uppercase tracking-widest
text-primary-foreground shadow-[0_0_0_0_var(--ring)]
transition-shadow hover:shadow-[0_0_22px_var(--ring)]">
<span className="h-2 w-2 bg-primary-foreground" aria-hidden />
Run Plot
</Button>
)
}
```
A beam-trace card outline (the signature, over any `@/components/ui/card`):
```tsx
<div className="relative bg-card p-6">
<svg className="pointer-events-none absolute inset-0 h-full w-full overflow-visible">
<rect x="1" y="1" width="99%" height="98%" fill="none"
stroke="var(--primary)" strokeWidth="1.6"
style={{ filter: "drop-shadow(0 0 4px var(--ring))" }} />
</svg>
<div className="relative">{/* CardContent */}</div>
</div>
```
## Preview shots
The renderable preview scenes live in `preview-shots.json` (`renderable-v1`): a plot console, a job-queue form, and a status-lamp board — each exercising the 16 primitives against the Gantry `visualProfile` so the preview looks like the language itself, not a generic house chassis.
{
"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": "gantry",
"name": "Gantry",
"slug": "gantry"
},
"installCommand": "npx shadcn@latest add https://katagami.ai/r/gantry.json",
"primitives": [
"button", "card", "input", "textarea", "select", "dialog", "sheet",
"tabs", "badge", "separator", "checkbox", "switch", "slider",
"tooltip", "dropdown-menu", "table"
],
"identityNotes": [
"Panel outlines are drawn beam traces (an SVG stroked rect with a glow), not box borders.",
"Each drawn stroke ends in a small glowing node dot.",
"Ground is a true phosphor blue-black (#04121a); a faint graticule grid underlies every surface.",
"Three accents behave like plotter channels A/B/C (cyan / amber / magenta) and carry operational meaning.",
"Elevation is a tight phosphor glow, never a soft drop shadow; geometry is sharp (radius 0).",
"Data is quantized — segmented meters and scope traces, never smooth gradient bars.",
"Labels are uppercase mono with wide tracking, like instrument signage."
],
"visualProfile": {
"family": "vector-scope workstation",
"material": "flat phosphor panels on a graticule ground",
"contour": "sharp",
"border": "beam-trace outline",
"underlay": true,
"grain": false,
"stickerBadges": false,
"motion": "snappy beam-draw reveals; settled state default",
"density": "compact",
"accents": ["#31e6ff", "#ffb02e", "#ff4fd8"]
},
"tokens": {
"background": "#04121a",
"foreground": "#e6f7ff",
"card": "#0a1f2b",
"muted-foreground": "#6f97a6",
"primary": "#31e6ff",
"primary-foreground": "#04121a",
"accent": "#ffb02e",
"channel-c": "#ff4fd8",
"border": "#1d4150",
"ring": "#31e6ff",
"success": "#3dffa2",
"warning": "#ffd23d",
"destructive": "#ff5c6c",
"info": "#31e6ff",
"radius": "0px",
"font-sans": "Space Grotesk, system-ui, sans-serif",
"font-mono": "JetBrains Mono, ui-monospace, monospace"
},
"shots": [
{
"id": "plot-console",
"title": "Plot console",
"viewport": "desktop",
"primitives": ["card", "badge", "button", "table", "separator", "tabs", "tooltip"],
"composition": "A monitoring console: a header row of status lamps and a primary action, a row of four channel-coloured stat cards with segmented meters, a two-channel scope trace, and a dense plot-log table below.",
"mustShow": [
"beam-trace card outlines with a glowing corner node",
"segmented quantized meters in channel colours",
"status-lamp badges (running / waiting / stopped)",
"one solid cyan primary button with a state LED"
],
"avoid": [
"grey box borders on cards",
"smooth gradient progress bars",
"rounded pill panels",
"drop-shadow elevation"
],
"scene": {
"headline": "Plot console",
"description": "Table 3 online — channel A running, buffer holding at 82 percent.",
"stats": [
{ "label": "Throughput", "value": "4.2", "unit": "k/s", "delta": "up 12% this hour", "channel": "A" },
{ "label": "Buffer", "value": "82", "unit": "%", "delta": "4 pt over ceiling", "channel": "B" },
{ "label": "Nodes drawn", "value": "1,908", "unit": "", "delta": "steady", "channel": "A" },
{ "label": "Pen wear", "value": "31", "unit": "%", "delta": "fresh", "channel": "C" }
]
}
},
{
"id": "queue-form",
"title": "New plot job",
"viewport": "desktop",
"primitives": ["input", "textarea", "select", "switch", "checkbox", "slider", "button", "card", "separator"],
"composition": "A form panel to queue a plot job beside an options panel of latching switches and quantized checks; both panels carry a beam-trace outline.",
"mustShow": [
"custom inputs with an inset hairline that lights the beam on focus",
"a select with its own plotted caret",
"latching square switches and checks (no rounded pill toggles)",
"a plotted-thumb slider on a graticule track"
],
"avoid": [
"default browser form controls",
"rounded pill switches",
"borders around the whole form"
],
"scene": {
"headline": "New plot job",
"description": "Queue a trace onto the table and set the pen options.",
"fields": [
{ "label": "Job name", "type": "input", "value": "orbital-sweep-014" },
{ "label": "Channel", "type": "select", "value": "A — Cyan / primary" },
{ "label": "Operator note", "type": "textarea", "value": "Hold pen speed at 40; watch the buffer past 80 percent." },
{ "label": "Pen speed", "type": "slider", "value": "40" },
{ "label": "Graticule overlay", "type": "switch", "value": "on" },
{ "label": "Snap to grid (8px)", "type": "checkbox", "value": "checked" }
]
}
},
{
"id": "status-board",
"title": "Channel status board",
"viewport": "desktop",
"primitives": ["badge", "card", "table", "dropdown-menu", "dialog", "sheet", "button", "tooltip", "separator"],
"composition": "A status board listing plot jobs with their channel, node count and lamp state, plus a row-actions menu and a confirmation dialog for aborting a job.",
"mustShow": [
"status-lamp badges keyed to state colour",
"a ledger-dense mono table that reads like a plot log",
"amounts rendered in Channel B amber",
"a dialog and dropdown that keep the sharp geometry and beam outline"
],
"avoid": [
"muddy grey rows",
"emoji in badges or buttons",
"heavy dividers between rows"
],
"scene": {
"headline": "Channel status board",
"description": "Five jobs on the table — one pen jam on channel C.",
"rows": [
{ "job": "orbital-sweep-014", "channel": "A · cyan", "nodes": "412", "length": "1,204", "state": "Plotting" },
{ "job": "lissajous-b7", "channel": "B · amber", "nodes": "309", "length": "880", "state": "Queued" },
{ "job": "contour-terrain-3", "channel": "A · cyan", "nodes": "1,024", "length": "3,410", "state": "Warming" },
{ "job": "bode-plot-91", "channel": "C · magenta", "nodes": "168", "length": "602", "state": "Pen jam" },
{ "job": "phase-portrait-2", "channel": "B · amber", "nodes": "540", "length": "1,776", "state": "Done" }
]
}
}
],
"componentRecipes": [
{ "primitive": "button", "intent": "Primary: solid cyan on ground, 44px, uppercase mono label centred, leading state LED, tight glow on hover." },
{ "primitive": "button", "intent": "Ghost: transparent with a hairline inset ring that goes cyan on hover; the quiet majority of a button set." },
{ "primitive": "button", "intent": "Alarm: red text and destructive inset ring for abort/stop actions." },
{ "primitive": "card", "intent": "No border — the frame is a beam-trace SVG rect in the channel colour with a glow and a corner node dot." },
{ "primitive": "input", "intent": "Ground fill, inset hairline; focus lights a cyan inset ring plus glow; no browser default." },
{ "primitive": "textarea", "intent": "Same as input, vertical resize only, min-height ~96px." },
{ "primitive": "select", "intent": "Custom control with its own plotted (triangular) caret drawn from accent gradients." },
{ "primitive": "checkbox", "intent": "Square box with inset hairline; checked fills cyan inset with a glow — a latched relay, never rounded." },
{ "primitive": "switch", "intent": "Rectangular track and knob; ON slides to cyan with a glow; sharp geometry, no pill." },
{ "primitive": "slider", "intent": "Thin graticule track with a narrow vertical beam thumb that glows." },
{ "primitive": "badge", "intent": "Status lamp: uppercase mono with a leading dot glowing in the state or channel colour." },
{ "primitive": "separator", "intent": "A single graticule hairline; never a heavy divider." },
{ "primitive": "tabs", "intent": "Underlined text on a hairline rail; active tab lights a cyan underline with a glow." },
{ "primitive": "tooltip", "intent": "Compact mono label on a raised surface with a beam-trace outline; no gradient scrim." },
{ "primitive": "dropdown-menu", "intent": "Sharp surface with a beam outline; active row takes a channel accent, keys stay mono." },
{ "primitive": "dialog", "intent": "Floats on the ground with a beam-trace outline and a soft flat scrim; sharp corners, glow elevation." },
{ "primitive": "sheet", "intent": "Edge panel sliding from the side, beam-trace outline, graticule ground carried through." },
{ "primitive": "table", "intent": "Ledger-dense mono, 14.5px+ rows on a graticule, amber amounts, horizontal scroll on narrow widths." }
],
"qualityRules": {
"do": [
"Draw panel frames as beam traces with a glowing node, never as grey box borders.",
"Keep data quantized: segmented meters and scope traces, not smooth bars.",
"Use the three channels for operational meaning and keep semantic colours small.",
"Keep geometry sharp (radius 0) and elevation a tight phosphor glow.",
"Use uppercase mono for labels and keep body text 17px+."
],
"dont": [
"Don't add scanlines, CRT bevels, or a pixel display font — this is the plotter, not the CRT costume.",
"Don't box navigation into a pill or floating card.",
"Don't use emoji or symbol glyphs on buttons or in copy.",
"Don't let a headline or table run off the mobile edge — wrap the headline, scroll the table.",
"Don't stamp a generic house chassis; follow the Gantry visualProfile."
]
}
}