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.
Plot a run on one calibrated axis (the Reticle Rail): a spacious live-bench area, a left measurement gutter or evidence rail, and analytical plates aligned to content columns rather than a visible grid.
Spectral for engraved headings, IBM Plex Sans for explanation, IBM Plex Mono for all values; hierarchy comes from size, whitespace, and tabular alignment before colour.
Medium-low on a dark ground with generous gutters; tables stay information-rich but keep 14-18px vertical padding and calm hairline row separation.
Invisible 12-column content grid at desktop; a left measurement gutter beside a wide plotting plate on the bench; collapses to 6 then 1 column with no visible grid lines.
Outer dark space is treated as material: 28-64px margins on large screens, never filled with decoration.
medium-low
Single-column stack on mobile with the gutter collapsed and non-essential nav/table columns hidden; only the full-bleed hero spans 100vw; contained content capped and centred on ultra-wide.
calibration-plate-optical-slate-technique
Subjects reconstructed from fine hairline contour lines on a near-dark field, with faint concentric optical guide rings, scattered registration cross-ticks, one luminous phosphor-green data trace, and one sodium-amber threshold pin.
One full-bleed hero per landing applying the calibration-plate technique to an observatory subject, composed with calm negative space (upper-left) so the overlay stays legible; the studio swaps the hero via --hero-image.
# Vernier ## Philosophy Vernier is an observatory decision bench: every reading is plotted on one engraved calibration axis on a deep obsidian plate, where a single phosphor-green trace shows what is live and a single sodium-amber pin marks the threshold a human still has to lock. ### Values - evidence on one axis - rationed signal colour - instrument-grade precision - dark observatory ground - a human signs the decision ### Anti-Values - white premium analytics default - rainbow charting - coloured side rails or card stripes - glass-rounded aperture cards - blank pre-animation states ## Tokens ### Colors | Name | Value | |------|-------| | bg | `#0B0F14` | | surface | `#121821` | | surface_2 | `#0E141C` | | text | `#E8EEF2` | | muted | `#8A97A6` | | border | `#222E3A` | | accent | `#5BE6A8` | | accent_soft | `#15281F` | | accent_2 | `#F2A23C` | | accent_2_soft | `#2A1E0E` | | on_accent | `#07120C` | | success | `#5BE6A8` | | warning | `#F2A23C` | | error | `#E8607A` | | info | `#6FB7FF` | ### Typography - **Base Size**: 17px - **Body Font**: IBM Plex Sans - **Heading Font**: Spectral - **Mono Font**: IBM Plex Mono - **Heading Weight**: 700 - **Heading Transform**: none - **Letter Spacing**: -0.02em - **Line Height**: 1.55 - **Google Fonts Url**: https://fonts.googleapis.com/css2?family=Spectral:ital,wght@0,400;0,500;0,600;0,700;0,800;1,500&family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap ### Radii - **None**: 0 - **Sm**: 0 - **Md**: 16px - **Lg**: 16px - **Full**: 9999px ### Shadows - **Sm**: 0 1px 2px rgba(0,0,0,0.4) - **Md**: 0 14px 34px rgba(0,0,0,0.45) - **Lg**: 0 30px 70px rgba(0,0,0,0.55) ### Spacing - **Base**: 8px - **Scale**: [4,8,12,16,24,32,48,64] ### Surfaces - **Bg Pattern**: none; obsidian ground with raised slate plates and recessed channels, no texture - **Card Style**: square-cut etched slate plates (radius 0; 16 only on a few feature plates), 1px slate hairline borders, ambient shadow on the dark ground, never a coloured edge - **Treatment**: deep ink observatory plate; structure carried by slate hairlines and the calibrated Reticle Rail ### Borders - **Default Width**: 1px - **Accent Width**: 2px - **Style**: solid - **Character**: low-contrast slate hairlines and etched calibration ticks; accents appear only as the rail pin, focus rings, chart traces, or threshold markers, never as side rails or card stripes ### Motion - **Duration**: 180ms - **Easing**: cubic-bezier(0.2, 0.8, 0.2, 1) - **Philosophy**: settled state is the default and renders with no JavaScript; motion adds micro-lift and opacity clarification on scroll, gated behind an html.js class; respects prefers-reduced-motion; no bounce or colour sweep ## Rules ### Composition Plot a run on one calibrated axis (the Reticle Rail): a spacious live-bench area, a left measurement gutter or evidence rail, and analytical plates aligned to content columns rather than a visible grid. ### Hierarchy Spectral for engraved headings, IBM Plex Sans for explanation, IBM Plex Mono for all values; hierarchy comes from size, whitespace, and tabular alignment before colour. ### Density Medium-low on a dark ground with generous gutters; tables stay information-rich but keep 14-18px vertical padding and calm hairline row separation. ### Signature - Reticle Rail: a 1px slate axis with etched calibration ticks running edge to edge, dividing sections; data sits on it as nodes; it turns vertical to become the dashboard gutter. - Two indicator lamps: a single phosphor-green trace marks what is live; a single sodium-amber pin marks thresholds and the records a human must lock; everything else stays slate. - Monospace evidence capsules: square-cut plates with IBM Plex Mono tabular numerals, tiny uppercase labels, and one semantic dot (green or amber) only when meaningful. - Non-rainbow chart grammar: slate opacity bars carry structure with exactly one green trace and one amber threshold ring in any visible chart. - Square-cut etched plates: radius 0 modules (16 only on a few feature plates), no glass-rounded aperture cards, no coloured side rails. ## Layout ### Grid Invisible 12-column content grid at desktop; a left measurement gutter beside a wide plotting plate on the bench; collapses to 6 then 1 column with no visible grid lines. ### Whitespace Outer dark space is treated as material: 28-64px margins on large screens, never filled with decoration. ### Density medium-low ### Responsive Single-column stack on mobile with the gutter collapsed and non-essential nav/table columns hidden; only the full-bleed hero spans 100vw; contained content capped and centred on ultra-wide. ### Breakpoints - **Mobile**: 390px - **Tablet**: 768px - **Desktop**: 1200px - **Wide**: 1440px ## Guidance ### Do - Plot evidence on the Reticle Rail and let mono tabular numerals line up to the digit. - Keep colour rationed to two lamps: green for live, amber for thresholds and human locks. - Let slate opacity carry every chart, table, and structural surface. - Treat the obsidian ground and outer space as a premium material; render the settled state with no JavaScript. ### Don't - Do not add a third accent, a rainbow chart, multicolor KPI tiles, or coloured side rails / card stripes. - Do not round modules into glass aperture cards or use in-between radii. - Do not box the nav into a floating pill or rounded card; let it sit open across the header. - Do not default to a white analytics surface or ship a blank pre-animation state. ### Accessibility Body 17px on a high-contrast dark ground (text #E8EEF2 on #0B0F14); phosphor focus rings on every control; semantic colour never the sole signal (paired with label and shape); respects prefers-reduced-motion. ## Imagery Direction ### Pairs With calibration-plate-optical-slate-technique ### Summary Subjects reconstructed from fine hairline contour lines on a near-dark field, with faint concentric optical guide rings, scattered registration cross-ticks, one luminous phosphor-green data trace, and one sodium-amber threshold pin. ### Subjects - meridian transit telescopes and observatory instruments - star fields and constellation arcs as measured plates - optical mechanisms: gears, mounts, reticles - light curves and orbital paths rendered as engraved traces ### Usage One full-bleed hero per landing applying the calibration-plate technique to an observatory subject, composed with calm negative space (upper-left) so the overlay stays legible; the studio swaps the hero via --hero-image.
---
version: "alpha"
name: "Vernier"
description: "Agent-curated design language exported from Katagami as DESIGN.md."
colors:
bg: "#0B0F14"
surface: "#121821"
surface_2: "#0E141C"
text: "#E8EEF2"
muted: "#8A97A6"
border: "#222E3A"
accent: "#5BE6A8"
accent_soft: "#15281F"
accent_2: "#F2A23C"
accent_2_soft: "#2A1E0E"
on_accent: "#07120C"
success: "#5BE6A8"
warning: "#F2A23C"
error: "#E8607A"
info: "#6FB7FF"
typography:
headline-lg:
fontFamily: "Spectral"
fontSize: "2.075rem"
fontWeight: 700
lineHeight: 1.1
letterSpacing: "-0.02em"
headline-md:
fontFamily: "Spectral"
fontSize: "1.66rem"
fontWeight: 600
lineHeight: 1.15
letterSpacing: "-0.02em"
body-md:
fontFamily: "IBM Plex Sans"
fontSize: "17px"
fontWeight: 400
lineHeight: 1.55
letterSpacing: "-0.02em"
label-md:
fontFamily: "IBM Plex Mono"
fontSize: "0.75rem"
fontWeight: 600
lineHeight: 1
letterSpacing: "0.08em"
rounded:
none: "0px"
sm: "0px"
md: "16px"
lg: "16px"
full: "9999px"
spacing:
base: "8px"
xs: "4px"
sm: "8px"
md: "12px"
lg: "16px"
xl: "24px"
2xl: "32px"
3xl: "48px"
4xl: "64px"
components:
color-reference-bg:
backgroundColor: "{colors.bg}"
color-reference-surface:
backgroundColor: "{colors.surface}"
color-reference-surface_2:
backgroundColor: "{colors.surface_2}"
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_soft:
backgroundColor: "{colors.accent_soft}"
color-reference-accent_2:
backgroundColor: "{colors.accent_2}"
color-reference-accent_2_soft:
backgroundColor: "{colors.accent_2_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"
---
# Vernier
## Overview
Vernier is an observatory decision bench: every reading is plotted on one engraved calibration axis on a deep obsidian plate, where a single phosphor-green trace shows what is live and a single sodium-amber pin marks the threshold a human still has to lock.
### Values
- evidence on one axis
- rationed signal colour
- instrument-grade precision
- dark observatory ground
- a human signs the decision
### Anti-Values
- white premium analytics default
- rainbow charting
- coloured side rails or card stripes
- glass-rounded aperture cards
- blank pre-animation states
## 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 | `#0B0F14` |
| surface | `#121821` |
| surface_2 | `#0E141C` |
| text | `#E8EEF2` |
| muted | `#8A97A6` |
| border | `#222E3A` |
| accent | `#5BE6A8` |
| accent_soft | `#15281F` |
| accent_2 | `#F2A23C` |
| accent_2_soft | `#2A1E0E` |
| on_accent | `#07120C` |
| success | `#5BE6A8` |
| warning | `#F2A23C` |
| error | `#E8607A` |
| info | `#6FB7FF` |
## Typography
- **Headline-Lg**: Spectral, 2.075rem, weight 700, line-height 1.1.
- **Headline-Md**: Spectral, 1.66rem, weight 600, line-height 1.15.
- **Body-Md**: IBM Plex Sans, 17px, weight 400, line-height 1.55.
- **Label-Md**: IBM Plex Mono, 0.75rem, weight 600, line-height 1.
## Layout
### Spacing Tokens
- **Base**: `8px`
- **Xs**: `4px`
- **Sm**: `8px`
- **Md**: `12px`
- **Lg**: `16px`
- **Xl**: `24px`
- **2xl**: `32px`
- **3xl**: `48px`
- **4xl**: `64px`
### Grid
Invisible 12-column content grid at desktop; a left measurement gutter beside a wide plotting plate on the bench; collapses to 6 then 1 column with no visible grid lines.
### Whitespace
Outer dark space is treated as material: 28-64px margins on large screens, never filled with decoration.
### Density
medium-low
### Responsive
Single-column stack on mobile with the gutter collapsed and non-essential nav/table columns hidden; only the full-bleed hero spans 100vw; contained content capped and centred on ultra-wide.
### Breakpoints
- **Mobile**: 390px
- **Tablet**: 768px
- **Desktop**: 1200px
- **Wide**: 1440px
## Elevation & Depth
### Shadows
- **Sm**: 0 1px 2px rgba(0,0,0,0.4)
- **Md**: 0 14px 34px rgba(0,0,0,0.45)
- **Lg**: 0 30px 70px rgba(0,0,0,0.55)
## Shapes
### Rounded
- **None**: `0px`
- **Sm**: `0px`
- **Md**: `16px`
- **Lg**: `16px`
- **Full**: `9999px`
### Surfaces
- **Bg Pattern**: none; obsidian ground with raised slate plates and recessed channels, no texture
- **Card Style**: square-cut etched slate plates (radius 0; 16 only on a few feature plates), 1px slate hairline borders, ambient shadow on the dark ground, never a coloured edge
- **Treatment**: deep ink observatory plate; structure carried by slate hairlines and the calibrated Reticle Rail
### Borders
- **Default Width**: 1px
- **Accent Width**: 2px
- **Style**: solid
- **Character**: low-contrast slate hairlines and etched calibration ticks; accents appear only as the rail pin, focus rings, chart traces, or threshold markers, never as side rails or card stripes
## Components
### Composition
Plot a run on one calibrated axis (the Reticle Rail): a spacious live-bench area, a left measurement gutter or evidence rail, and analytical plates aligned to content columns rather than a visible grid.
### Hierarchy
Spectral for engraved headings, IBM Plex Sans for explanation, IBM Plex Mono for all values; hierarchy comes from size, whitespace, and tabular alignment before colour.
### Density
Medium-low on a dark ground with generous gutters; tables stay information-rich but keep 14-18px vertical padding and calm hairline row separation.
### Signature
- Reticle Rail: a 1px slate axis with etched calibration ticks running edge to edge, dividing sections; data sits on it as nodes; it turns vertical to become the dashboard gutter.
- Two indicator lamps: a single phosphor-green trace marks what is live; a single sodium-amber pin marks thresholds and the records a human must lock; everything else stays slate.
- Monospace evidence capsules: square-cut plates with IBM Plex Mono tabular numerals, tiny uppercase labels, and one semantic dot (green or amber) only when meaningful.
- Non-rainbow chart grammar: slate opacity bars carry structure with exactly one green trace and one amber threshold ring in any visible chart.
- Square-cut etched plates: radius 0 modules (16 only on a few feature plates), no glass-rounded aperture cards, no coloured side rails.
## 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-019ef99a-18a8-7433-adff-4cbb74fa82f2/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 Plot evidence on the Reticle Rail and let mono tabular numerals line up to the digit.
- Do Keep colour rationed to two lamps: green for live, amber for thresholds and human locks.
- Do Let slate opacity carry every chart, table, and structural surface.
- Do Treat the obsidian ground and outer space as a premium material; render the settled state with no JavaScript.
- Don't Do not add a third accent, a rainbow chart, multicolor KPI tiles, or coloured side rails / card stripes.
- Don't Do not round modules into glass aperture cards or use in-between radii.
- Don't Do not box the nav into a floating pill or rounded card; let it sit open across the header.
- Don't Do not default to a white analytics surface or ship a blank pre-animation state.
### Accessibility
Body 17px on a high-contrast dark ground (text #E8EEF2 on #0B0F14); phosphor focus rings on every control; semantic colour never the sole signal (paired with label and shape); respects prefers-reduced-motion.
## Imagery Direction
### Pairs With
calibration-plate-optical-slate-technique
### Summary
Subjects reconstructed from fine hairline contour lines on a near-dark field, with faint concentric optical guide rings, scattered registration cross-ticks, one luminous phosphor-green data trace, and one sodium-amber threshold pin.
### Subjects
- meridian transit telescopes and observatory instruments
- star fields and constellation arcs as measured plates
- optical mechanisms: gears, mounts, reticles
- light curves and orbital paths rendered as engraved traces
### Usage
One full-bleed hero per landing applying the calibration-plate technique to an observatory subject, composed with calm negative space (upper-left) so the overlay stays legible; the studio swaps the hero via --hero-image.
```json
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "vernier",
"type": "registry:theme",
"title": "Vernier shadcn Theme",
"cssVars": {
"theme": {},
"light": {
"background": "#0B0F14",
"foreground": "#E8EEF2",
"card": "#121821",
"card-foreground": "#E8EEF2",
"popover": "#121821",
"popover-foreground": "#E8EEF2",
"primary": "#E8EEF2",
"primary-foreground": "#111111",
"secondary": "#f4f4f5",
"secondary-foreground": "#111111",
"muted": "#8A97A6",
"muted-foreground": "#E8EEF2",
"accent": "#5BE6A8",
"accent-foreground": "#111111",
"destructive": "#E8607A",
"border": "#222E3A",
"input": "#222E3A",
"ring": "#5BE6A8",
"chart-1": "#E8EEF2",
"chart-2": "#f4f4f5",
"chart-3": "#5BE6A8",
"chart-4": "#5BE6A8",
"chart-5": "#F2A23C",
"sidebar": "#121821",
"sidebar-foreground": "#E8EEF2",
"sidebar-primary": "#E8EEF2",
"sidebar-primary-foreground": "#111111",
"sidebar-accent": "#6FB7FF",
"sidebar-accent-foreground": "#ffffff",
"sidebar-border": "#222E3A",
"sidebar-ring": "#5BE6A8",
"radius": "16px"
},
"dark": {
"background": "#0f1115",
"foreground": "#f8fafc",
"card": "#181b22",
"card-foreground": "#f8fafc",
"popover": "#181b22",
"popover-foreground": "#f8fafc",
"primary": "#E8EEF2",
"primary-foreground": "#111111",
"secondary": "#252a33",
"secondary-foreground": "#f8fafc",
"muted": "#252a33",
"muted-foreground": "#a1a1aa",
"accent": "#5BE6A8",
"accent-foreground": "#111111",
"destructive": "#E8607A",
"border": "#303642",
"input": "#303642",
"ring": "#5BE6A8",
"chart-1": "#E8EEF2",
"chart-2": "#f4f4f5",
"chart-3": "#5BE6A8",
"chart-4": "#5BE6A8",
"chart-5": "#F2A23C",
"sidebar": "#181b22",
"sidebar-foreground": "#f8fafc",
"sidebar-primary": "#E8EEF2",
"sidebar-primary-foreground": "#111111",
"sidebar-accent": "#5BE6A8",
"sidebar-accent-foreground": "#111111",
"sidebar-border": "#303642",
"sidebar-ring": "#5BE6A8",
"radius": "16px"
}
},
"meta": {
"source": "katagami",
"languageId": "en-019ef99a-18a8-7433-adff-4cbb74fa82f2",
"slug": "vernier",
"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_2_soft",
"accent_soft",
"bg",
"border",
"error",
"info",
"muted",
"on_accent",
"success",
"surface",
"surface_2",
"text",
"warning"
],
"typography": [
"base_size",
"body_font",
"google_fonts_url",
"heading_font",
"heading_transform",
"heading_weight",
"letter_spacing",
"line_height",
"mono_font"
],
"radii": [
"full",
"lg",
"md",
"none",
"sm"
],
"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 Vernierand 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: #0B0F14;
--foreground: #E8EEF2;
--card: #121821;
--card-foreground: #E8EEF2;
--popover: #121821;
--popover-foreground: #E8EEF2;
--primary: #E8EEF2;
--primary-foreground: #111111;
--secondary: #f4f4f5;
--secondary-foreground: #111111;
--muted: #8A97A6;
--muted-foreground: #E8EEF2;
--accent: #5BE6A8;
--accent-foreground: #111111;
--destructive: #E8607A;
--border: #222E3A;
--input: #222E3A;
--ring: #5BE6A8;
--chart-1: #E8EEF2;
--chart-2: #f4f4f5;
--chart-3: #5BE6A8;
--chart-4: #5BE6A8;
--chart-5: #F2A23C;
--sidebar: #121821;
--sidebar-foreground: #E8EEF2;
--sidebar-primary: #E8EEF2;
--sidebar-primary-foreground: #111111;
--sidebar-accent: #6FB7FF;
--sidebar-accent-foreground: #ffffff;
--sidebar-border: #222E3A;
--sidebar-ring: #5BE6A8;
--radius: 16px;
}
.dark {
--background: #0f1115;
--foreground: #f8fafc;
--card: #181b22;
--card-foreground: #f8fafc;
--popover: #181b22;
--popover-foreground: #f8fafc;
--primary: #E8EEF2;
--primary-foreground: #111111;
--secondary: #252a33;
--secondary-foreground: #f8fafc;
--muted: #252a33;
--muted-foreground: #a1a1aa;
--accent: #5BE6A8;
--accent-foreground: #111111;
--destructive: #E8607A;
--border: #303642;
--input: #303642;
--ring: #5BE6A8;
--chart-1: #E8EEF2;
--chart-2: #f4f4f5;
--chart-3: #5BE6A8;
--chart-4: #5BE6A8;
--chart-5: #F2A23C;
--sidebar: #181b22;
--sidebar-foreground: #f8fafc;
--sidebar-primary: #E8EEF2;
--sidebar-primary-foreground: #111111;
--sidebar-accent: #5BE6A8;
--sidebar-accent-foreground: #111111;
--sidebar-border: #303642;
--sidebar-ring: #5BE6A8;
--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 VernierShadcnKit() {
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">Vernier</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": "vernier",
"type": "registry:theme",
"cssVars": {
"theme": {
"font-sans": "'IBM Plex Sans', system-ui, sans-serif",
"font-serif": "'Spectral', Georgia, serif",
"font-mono": "'IBM Plex Mono', ui-monospace, monospace",
"radius": "0px"
},
"light": {
"background": "#0B0F14",
"foreground": "#E8EEF2",
"card": "#121821",
"card-foreground": "#E8EEF2",
"popover": "#121821",
"popover-foreground": "#E8EEF2",
"primary": "#5BE6A8",
"primary-foreground": "#07120C",
"secondary": "#0E141C",
"secondary-foreground": "#E8EEF2",
"muted": "#0E141C",
"muted-foreground": "#8A97A6",
"accent": "#F2A23C",
"accent-foreground": "#07120C",
"destructive": "#E8607A",
"destructive-foreground": "#0B0F14",
"border": "#222E3A",
"input": "#222E3A",
"ring": "#5BE6A8",
"chart-1": "#5BE6A8",
"chart-2": "#8A97A6",
"chart-3": "#3FA178",
"chart-4": "#5B6675",
"chart-5": "#F2A23C"
},
"dark": {
"background": "#0B0F14",
"foreground": "#E8EEF2",
"card": "#121821",
"card-foreground": "#E8EEF2",
"popover": "#121821",
"popover-foreground": "#E8EEF2",
"primary": "#5BE6A8",
"primary-foreground": "#07120C",
"secondary": "#0E141C",
"secondary-foreground": "#E8EEF2",
"muted": "#0E141C",
"muted-foreground": "#8A97A6",
"accent": "#F2A23C",
"accent-foreground": "#07120C",
"destructive": "#E8607A",
"destructive-foreground": "#0B0F14",
"border": "#222E3A",
"input": "#222E3A",
"ring": "#5BE6A8",
"chart-1": "#5BE6A8",
"chart-2": "#8A97A6",
"chart-3": "#3FA178",
"chart-4": "#5B6675",
"chart-5": "#F2A23C"
}
}
}
# Vernier shadcn/ui Components
Artifact: `component-recipes-v1`
Author: `katagami-ui-projection`
Language ID: `en-019ef99a-18a8-7433-adff-4cbb74fa82f2`
Slug: `vernier`
## Intent
Vernier is an observatory decision bench: every reading is plotted on one engraved calibration axis on a deep obsidian plate, where a single phosphor-green trace shows what is live and a single sodium-amber pin marks the threshold a human still has to lock.
## Required primitives
- button
- card
- input
- textarea
- select
- dialog
- sheet
- tabs
- badge
- separator
- checkbox
- switch
- slider
- tooltip
- dropdown-menu
- table
Install with `npx shadcn@latest add button card input textarea select dialog sheet tabs badge separator checkbox switch slider tooltip dropdown-menu table`.
## Token cues
Colors:
{
"bg": "#0B0F14",
"surface": "#121821",
"surface_2": "#0E141C",
"text": "#E8EEF2",
"muted": "#8A97A6",
"border": "#222E3A",
"accent": "#5BE6A8",
"accent_soft": "#15281F",
"accent_2": "#F2A23C",
"accent_2_soft": "#2A1E0E",
"on_accent": "#07120C",
"success": "#5BE6A8",
"warning": "#F2A23C",
"error": "#E8607A",
"info": "#6FB7FF"
}
Typography:
{
"base_size": "17px",
"body_font": "IBM Plex Sans",
"heading_font": "Spectral",
"mono_font": "IBM Plex Mono",
"heading_weight": "700",
"heading_transform": "none",
"letter_spacing": "-0.02em",
"line_height": 1.55,
"google_fonts_url": "https://fonts.googleapis.com/css2?family=Spectral:ital,wght@0,400;0,500;0,600;0,700;0,800;1,500&family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap"
}
## Visual character to preserve
- Make the source language's structural identity visible in every component state.
## ShadSync visual profile
{
"family": "system",
"material": "flat",
"contour": "default",
"border": "solid",
"underlay": false,
"grain": true,
"stickerBadges": false,
"motion": "lift",
"density": "balanced",
"accents": [
"primary",
"accent",
"secondary",
"muted"
]
}
## Signature component recipes
### Button
Use `Button` for primary, secondary, outline, and ghost actions. Primary actions must expose the language's strongest contrast pair, while secondary and ghost actions should preserve the surface treatment instead of falling back to default neutral SaaS styling.
### Card
Use `Card`, `CardHeader`, `CardContent`, `CardFooter`, and `CardAction` as the main composition frame. Cards should demonstrate the language's surface, border, hierarchy, and density rules rather than appearing as generic rounded rectangles.
### Input and Textarea
Use `Input` and `Textarea` with visible focus rings, field labels, validation states, and the language's rhythm. Forms should show real product content, not placeholder-only controls.
### Select, Tabs, and Table
Use `Select`, `Tabs`, and `Table` to prove navigation, filtering, and dense data states. The table should show row rhythm, separators, hover/focus states, and an empty or status state when the language calls for it.
### Dialog and Sheet
Use `Dialog` for centered decisions and `Sheet` for contextual editing. Both should inherit the language's spacing, border, overlay, and motion rules.
## Preview shots
- `application-shell`: dashboard or workspace shell with navigation, cards, forms, and state badges.
- `detail-editor`: focused editing flow using input, textarea, select, switch/checkbox, dialog or sheet, and action buttons.
- `data-operations`: table-heavy operational view with tabs, dropdown menu affordances, badges, and destructive/empty states.
- Each preview shot must include a renderable `scene` payload with concrete headline, description, actions, and rows/fields/stats for the UI preview.
## Implementation contract
- Start from local `ui/src/components/ui` shadcn-style primitives; do not create a second component system.
- Apply `/katagami/shadcn/vernier/registry-theme.json` variables, then use these recipes for composition and state design.
- Preserve Katagami token names as source metadata; shadcn semantic names are only the export surface.
- Do: Plot evidence on the Reticle Rail and let mono tabular numerals line up to the digit.; Keep colour rationed to two lamps: green for live, amber for thresholds and human locks.; Let slate opacity carry every chart, table, and structural surface.; Treat the obsidian ground and outer space as a premium material; render the settled state with no JavaScript.
- Do not: Do not add a third accent, a rainbow chart, multicolor KPI tiles, or coloured side rails / card stripes.; Do not round modules into glass aperture cards or use in-between radii.; Do not box the nav into a floating pill or rounded card; let it sit open across the header.; Do not default to a white analytics surface or ship a blank pre-animation state.
## Copy-paste component example
This generated starter proves the import shape. Production Katagami agents should replace it with a language-specific product composition.
```tsx
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 VernierShadcnKit() {
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">Vernier</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>
);
}
```
## Layout notes
{
"grid": "Invisible 12-column content grid at desktop; a left measurement gutter beside a wide plotting plate on the bench; collapses to 6 then 1 column with no visible grid lines.",
"whitespace": "Outer dark space is treated as material: 28-64px margins on large screens, never filled with decoration.",
"density": "medium-low",
"responsive": "Single-column stack on mobile with the gutter collapsed and non-essential nav/table columns hidden; only the full-bleed hero spans 100vw; contained content capped and centred on ultra-wide.",
"breakpoints": {
"mobile": "390px",
"tablet": "768px",
"desktop": "1200px",
"wide": "1440px"
}
}
{
"artifact": "katagami:shadcn-preview-shots",
"version": "preview-shots-v1",
"generator": "katagami-ui-compatibility-projection",
"generatedBy": "katagami-ui-projection",
"requiresVisualProfile": true,
"schema": "katagami:shadcn-preview-shots/renderable-v1",
"renderable": true,
"language": {
"id": "en-019ef99a-18a8-7433-adff-4cbb74fa82f2",
"name": "Vernier",
"slug": "vernier"
},
"installCommand": "npx shadcn@latest add button card input textarea select dialog sheet tabs badge separator checkbox switch slider tooltip dropdown-menu table",
"primitives": [
"button",
"card",
"input",
"textarea",
"select",
"dialog",
"sheet",
"tabs",
"badge",
"separator",
"checkbox",
"switch",
"slider",
"tooltip",
"dropdown-menu",
"table"
],
"identityNotes": [],
"visualProfile": {
"family": "system",
"material": "flat",
"contour": "default",
"border": "solid",
"underlay": false,
"grain": false,
"stickerBadges": false,
"motion": "still",
"density": "balanced",
"accents": [
"primary",
"accent",
"secondary",
"muted"
]
},
"shots": [
{
"id": "application-shell",
"title": "Application shell",
"viewport": "desktop",
"primitives": [
"button",
"card",
"input",
"select",
"tabs",
"badge",
"separator",
"table"
],
"composition": "A real product workspace with navigation, summary cards, filtering controls, and one dense content region.",
"mustShow": [
"primary and secondary actions",
"card hierarchy",
"filterable state",
"table or list density"
],
"avoid": [
"component inventory walls",
"placeholder-only content",
"generic rounded SaaS chrome"
],
"scene": {
"eyebrow": "workspace spread",
"headline": "Vernier launch room",
"description": "A product team workspace where navigation, filters, metrics, and dense rows carry the language's visible structure.",
"primaryAction": "Apply theme",
"secondaryAction": "Review states",
"stats": [
{
"label": "components",
"value": "16",
"tone": "accent"
},
{
"label": "states",
"value": "ready"
},
{
"label": "density",
"value": "balanced",
"tone": "warning"
}
],
"rows": [
{
"label": "Primary flow",
"value": "mapped",
"status": "active"
},
{
"label": "Token coverage",
"value": "semantic",
"status": "synced"
},
{
"label": "Responsive proof",
"value": "queued",
"status": "review"
}
],
"statuses": [
"Active",
"Synced",
"Draft"
]
}
},
{
"id": "detail-editor",
"title": "Detail editor",
"viewport": "tablet",
"primitives": [
"button",
"card",
"input",
"textarea",
"select",
"checkbox",
"switch",
"slider",
"dialog",
"sheet"
],
"composition": "A focused editing flow with form fields, validation, confirmation, and a contextual side panel.",
"mustShow": [
"focus ring",
"error or destructive state",
"dialog or sheet treatment",
"written guidance content"
],
"avoid": [
"unstyled browser controls",
"floating cards inside cards",
"missing labels"
],
"scene": {
"eyebrow": "editing flow",
"headline": "Language recipe editor",
"description": "A focused form proving labels, validation, toggles, panel rhythm, and action hierarchy.",
"primaryAction": "Save recipe",
"secondaryAction": "Open sheet",
"fields": [
{
"label": "Component family",
"value": "Narrative cards"
},
{
"label": "State treatment",
"value": "Visible focus + validation"
},
{
"label": "Motion",
"value": "Small lift, no opacity-only fade"
}
],
"statuses": [
"Focus",
"Invalid",
"Confirmed"
]
}
},
{
"id": "data-operations",
"title": "Data operations",
"viewport": "mobile",
"primitives": [
"button",
"tabs",
"badge",
"dropdown-menu",
"table",
"tooltip",
"separator"
],
"composition": "A compact operational view proving row rhythm, stacked actions, menu states, badges, and empty/destructive states.",
"mustShow": [
"responsive reflow",
"dense row styling",
"menu affordance",
"status badge system"
],
"avoid": [
"desktop-only tables",
"text overflow",
"default shadcn spacing without Katagami character"
],
"scene": {
"eyebrow": "operations",
"headline": "Compact review queue",
"description": "A narrow viewport scene with rows, menus, tooltips, badges, and destructive affordances.",
"primaryAction": "Resolve",
"secondaryAction": "Filter",
"rows": [
{
"label": "Button hierarchy",
"value": "approved",
"status": "ok"
},
{
"label": "Table rhythm",
"value": "needs pass",
"status": "watch"
},
{
"label": "Empty state",
"value": "designed",
"status": "done"
}
],
"statuses": [
"Queued",
"Blocked",
"Done"
]
}
}
],
"componentRecipes": [
{
"primitive": "button",
"intent": "Prove action hierarchy, focus, disabled, and destructive states."
},
{
"primitive": "card",
"intent": "Carry the language surface, border, elevation, and density rules."
},
{
"primitive": "input",
"intent": "Show labels, focus rings, validation, and spacing rhythm."
},
{
"primitive": "textarea",
"intent": "Show longer guidance, validation copy, and writing density."
},
{
"primitive": "select",
"intent": "Show filtering, selection contrast, and menu trigger styling."
},
{
"primitive": "dialog",
"intent": "Show centered decision states and overlay treatment."
},
{
"primitive": "sheet",
"intent": "Show contextual side panels and responsive editing."
},
{
"primitive": "tabs",
"intent": "Show navigational structure and active/inactive contrast."
},
{
"primitive": "badge",
"intent": "Show compact status vocabulary and semantic colors."
},
{
"primitive": "separator",
"intent": "Show section rhythm without generic gray dividers."
},
{
"primitive": "checkbox",
"intent": "Show binary selection with visible focus and checked states."
},
{
"primitive": "switch",
"intent": "Show settings toggles and on/off contrast."
},
{
"primitive": "slider",
"intent": "Show numeric adjustment with track/thumb styling."
},
{
"primitive": "tooltip",
"intent": "Show concise explanation styling above compact controls."
},
{
"primitive": "dropdown-menu",
"intent": "Show action menus, destructive items, and grouped choices."
},
{
"primitive": "table",
"intent": "Show dense operational data, separators, row states, and responsive behavior."
}
],
"qualityRules": {
"do": [
"Plot evidence on the Reticle Rail and let mono tabular numerals line up to the digit.",
"Keep colour rationed to two lamps: green for live, amber for thresholds and human locks.",
"Let slate opacity carry every chart, table, and structural surface.",
"Treat the obsidian ground and outer space as a premium material; render the settled state with no JavaScript."
],
"dont": [
"Do not add a third accent, a rainbow chart, multicolor KPI tiles, or coloured side rails / card stripes.",
"Do not round modules into glass aperture cards or use in-between radii.",
"Do not box the nav into a floating pill or rounded card; let it sit open across the header.",
"Do not default to a white analytics surface or ship a blank pre-animation state."
]
}
}