A portable design language for agents: download the markdown first, then inspect the preview, tokens, and rules as needed.
Published
Download DESIGN.md
Portable DESIGN.md source of truth for most agents and apps.
the spec
specification
philosophy
summary
Riveter answers the constructivist brief with the workshop, not the gallery. Where the poster tradition lays type flat on white, Riveter stands the structure up: content is assembled on a single rising diagonal axis, like a riveted steel gantry. Panels are not framed cards but steel plates bolted at the corners; the red wedge does the lifting, cobalt routes, yellow flags. The ground is a deliberate warm ink-black, an assembly bench under work-lights where the three primaries glow as torque marks against charcoal steel. Everything bears weight, nothing floats.
values
Built, not laid outStructure as ornamentTorque-mark colourWeight in the typeFlat steel depth
anti-values
×White-poster default×Floating soft cards×Colour as decoration×Centred symmetry
Flat rectangular steel plate on ink ground, no border edge, bolt-head markers at two opposite corners and rivet rows on plate edges; depth from a hard offset slab, never glass or soft shadow.
bg pattern
ink
borders4 items
default width
0px
accent width
8px
style
none
character
Plates carry no outline border; they are separated by deep seams and depth comes from a 6px offset black slab. The only coloured edge is an 8px left load-bar on alert plates, paired with a text condition.
motion3 items
duration
140ms
easing
cubic-bezier(0.2,0,0,1)
philosophy
Snappy, mechanical, no bounce. The fully-settled page is the default and renders with no JavaScript; an inline script adds a class to gate the hidden start-state and drives a short scroll-reveal. Primary buttons and active plates translate up-left into a 6px offset black slab on hover/focus. Respects prefers-reduced-motion.
rules
composition
Assemble content on a rising diagonal axis (about -32 degrees), not a centred poster grid. A dominant lead block rises from the lower-left while metadata sits in narrow rails or a left navigation rail. Render panels as flat steel plates (0px radius, no border) bolted with bolt-head markers at two opposite corners; stagger plates in a row so the composition reads as built. Mark the line of force with one skewed signal-red wedge.
hierarchy
Lead with a mono uppercase label and a skewed red wedge, then an oversized Archivo Expanded headline or sheared numeral, then concise Archivo body. Build hierarchy with scale, weight, case, position, and offset-slab depth before colour. Important metrics become poster-like sheared figures on solid red, cobalt, or ink blocks.
density
Operational medium-high density with disciplined negative space: compact interior modules on generous ink ground, plates separated by deep seams and empty axis space rather than crowding.
signature
Rising diagonal load axis with a skewed red wedge; flat steel plates bolted with bolt-head corner markers and rivet-row edges; three primaries (red load, cobalt routing, yellow flag) used only as torque marks and status chips; oversized sheared Archivo Expanded figures on red/cobalt/ink blocks; depth from a hard 6px offset black slab; mono uppercase metadata with leading square chips.
layout
grid
Desktop caps contained content at ~1440px with a left rail on the dashboard; only the full-bleed hero spans 100vw. Composition climbs a diagonal axis; plates use minmax(0,1fr) columns and min-width:0 children so grids never overflow. Tablet collapses rails to a top strip; mobile becomes a single stacked column with tables scrolling inside their plate.
whitespace
Negative space is structural — empty stretches of the diagonal axis and seams between plates are kept on purpose to read as an assembly bench rather than a packed page.
density
Compact steel plates with measured breathing room for legibility on the dark ground.
responsive
Every artifact renders cleanly from ~390px mobile to 2560px+ ultra-wide with no horizontal overflow. At 900-1024px rails become top strips and key panels move to two columns; at 768px modules stack to one column; at 560px buttons go full width, controls stack, the masthead trims to one or two links, and data tables scroll horizontally inside their plate.
breakpoints
mobile
390-560
tablet
561-900
desktop
901-1440
ultrawide
1441+
guidance
do
Keep the warm ink-black ground; let the three primaries glow as sparse torque marks against charcoal steel.
Assemble content on a rising diagonal axis and stagger plates so the layout reads as built, not centred.
Bolt every plate with bolt-head markers at two opposite corners; run rivet rows along edges as the only ornament.
Set heads and figures in heavy uppercase Archivo Expanded with a slight skew; run metadata and numerals in tabular Space Mono.
Pair every status colour with a chip or dot and a text label; make exactly one button primary and keep the rest quiet.
Express depth with a hard 6px offset black slab on hover and focus; explicitly style every form control on the dark field.
avoid
Do not default to a white ground or a centred hero composition.
Do not frame plates as soft rounded cards, nest cards, or box the top nav in a pill bar.
Do not let a primary fill a whole surface or solve hierarchy on its own.
Do not rely on glow, blur, or soft drop shadows for depth; use the offset slab.
Do not leave a single coloured accent edge as a panel's only marker, or ship browser-default controls.
Do not use emoji or symbol glyphs in copy or on buttons; use SVG primitives and labels.
imagery
pairs with
plakat
summary
Flat geometric Bauhaus-Swiss-constructivist reconstruction applied to engineering and industrial subjects on a dark ink ground: structures decomposed into pure primitives with a visible construction grid and one decisive red diagonal wedge, secondary cobalt and a single yellow square as signals.
subjects
riveted steel gantry cranes and scaffoldsindustrial structures and machinerybridges, slipways and dry dockstools and fasteners (rivets, bolts, wrenches)assembly benches and control consoles
usage
Use as the full-bleed landing hero, composed on a rising diagonal with the lower-left kept darker and quieter so an overlay headline reads. Decompose the subject into flat primitives aligned to the construction grid; let one red diagonal wedge drive the eye. No text, letters, logos, gradients, or soft shading.
katagami spec
# Riveter
## Philosophy
Riveter answers the constructivist brief with the workshop, not the gallery. Where the poster tradition lays type flat on white, Riveter stands the structure up: content is assembled on a single rising diagonal axis, like a riveted steel gantry. Panels are not framed cards but steel plates bolted at the corners; the red wedge does the lifting, cobalt routes, yellow flags. The ground is a deliberate warm ink-black, an assembly bench under work-lights where the three primaries glow as torque marks against charcoal steel. Everything bears weight, nothing floats.
### Values
- {"name":"Built, not laid out","explanation":"Composition is assembled on a rising diagonal axis; plates bolt against one another and stagger, so the interface reads as a structure under load rather than a centred page."}
- {"name":"Structure as ornament","explanation":"The only decoration is structural — bolt-head corner markers and rows of rivets along plate edges. Nothing is added that does not also join something."}
- {"name":"Torque-mark colour","explanation":"Red is load, cobalt is routing, yellow is a flag. Three primaries on ink, applied exactly where force is, like a torque wrench — never as a surface wash."}
- {"name":"Weight in the type","explanation":"Heavy expanded display and oversized sheared figures carry the hierarchy; tabular mono lines up metadata like a torque chart."}
- {"name":"Flat steel depth","explanation":"Depth comes from a hard offset slab — a plate sitting proud of the one behind it — never glass, blur, or a soft shadow."}
### Anti-Values
- {"name":"White-poster default","explanation":"The ground is ink-black on purpose; reverting to white loses the assembly-bench identity entirely."}
- {"name":"Floating soft cards","explanation":"No rounded, plush, drop-shadowed cards. Panels are bolted steel plates with sharp corners."}
- {"name":"Colour as decoration","explanation":"A primary never fills a whole surface or solves hierarchy alone; it marks where force or routing is."}
- {"name":"Centred symmetry","explanation":"No hero-centred marketing composition; the hierarchy rises asymmetrically along the load axis."}
### Visual Character
- Content is assembled on a rising diagonal axis (approx -32 degrees); a skewed signal-red wedge marks the line of force in the hero and at section anchors.
- Every panel is a flat steel plate with a bolt-head marker at two opposite corners; rows of rivets run plate edges as the only, structural, ornament.
- Oversized Archivo Expanded numerals, slightly sheared with skewX, sit on solid red, cobalt, and ink blocks as the primary graphic device.
- Depth is a hard 6px offset black slab on hover and focus; the ground is warm ink-black with charcoal steel plates, sliced by one red diagonal.
## Tokens
### Colors
| Name | Value |
|------|-------|
| bg | `#15151A` |
| bg_2 | `#101015` |
| surface | `#1E1E25` |
| surface_2 | `#262630` |
| text | `#F4F2EC` |
| muted | `#9A968C` |
| line | `#3A3A45` |
| border | `#0B0B0E` |
| accent | `#E11414` |
| accent_blue | `#1453E1` |
| accent_yellow | `#FFC400` |
| on_accent | `#FFFFFF` |
| success | `#1FA45E` |
| warning | `#FFC400` |
| error | `#E11414` |
| info | `#1453E1` |
| beam | `#0B0B0E` |
| rivet | `#5A5A66` |
### Typography
- **Base Size**: 17px
- **Body Font**: Archivo
- **Heading Font**: Archivo Expanded
- **Mono Font**: Space Mono
- **Heading Weight**: 900
- **Heading Transform**: uppercase
- **Letter Spacing**: -0.02em
- **Line Height**: 1.55
- **Scale Ratio**: 1.25
- **Google Fonts Url**: https://fonts.googleapis.com/css2?family=Archivo:wght@400;500;600;700;800;900&family=Archivo+Expanded:wght@600;700;800;900&family=Space+Mono:wght@400;700&display=swap
### Radii
- **None**: 0px
- **Sm**: 0px
- **Md**: 0px
- **Lg**: 0px
- **Rivet**: 9999px
- **Full**: 9999px
### Shadows
- **Sm**: none
- **Md**: none
- **Lg**: 6px 6px 0 #0B0B0E
- **Slab**: 6px 6px 0 #0B0B0E
### Spacing
- **Base**: 8px
- **Scale**: [4,8,12,16,24,32,48,64,96]
### Surfaces
- **Treatment**: flat-steel
- **Card Style**: Flat rectangular steel plate on ink ground, no border edge, bolt-head markers at two opposite corners and rivet rows on plate edges; depth from a hard offset slab, never glass or soft shadow.
- **Bg Pattern**: ink
### Borders
- **Default Width**: 0px
- **Accent Width**: 8px
- **Style**: none
- **Character**: Plates carry no outline border; they are separated by deep seams and depth comes from a 6px offset black slab. The only coloured edge is an 8px left load-bar on alert plates, paired with a text condition.
### Motion
- **Duration**: 140ms
- **Easing**: cubic-bezier(0.2,0,0,1)
- **Philosophy**: Snappy, mechanical, no bounce. The fully-settled page is the default and renders with no JavaScript; an inline script adds a class to gate the hidden start-state and drives a short scroll-reveal. Primary buttons and active plates translate up-left into a 6px offset black slab on hover/focus. Respects prefers-reduced-motion.
## Rules
### Composition
Assemble content on a rising diagonal axis (about -32 degrees), not a centred poster grid. A dominant lead block rises from the lower-left while metadata sits in narrow rails or a left navigation rail. Render panels as flat steel plates (0px radius, no border) bolted with bolt-head markers at two opposite corners; stagger plates in a row so the composition reads as built. Mark the line of force with one skewed signal-red wedge.
### Hierarchy
Lead with a mono uppercase label and a skewed red wedge, then an oversized Archivo Expanded headline or sheared numeral, then concise Archivo body. Build hierarchy with scale, weight, case, position, and offset-slab depth before colour. Important metrics become poster-like sheared figures on solid red, cobalt, or ink blocks.
### Density
Operational medium-high density with disciplined negative space: compact interior modules on generous ink ground, plates separated by deep seams and empty axis space rather than crowding.
### Signature
Rising diagonal load axis with a skewed red wedge; flat steel plates bolted with bolt-head corner markers and rivet-row edges; three primaries (red load, cobalt routing, yellow flag) used only as torque marks and status chips; oversized sheared Archivo Expanded figures on red/cobalt/ink blocks; depth from a hard 6px offset black slab; mono uppercase metadata with leading square chips.
## Layout
### Grid
Desktop caps contained content at ~1440px with a left rail on the dashboard; only the full-bleed hero spans 100vw. Composition climbs a diagonal axis; plates use minmax(0,1fr) columns and min-width:0 children so grids never overflow. Tablet collapses rails to a top strip; mobile becomes a single stacked column with tables scrolling inside their plate.
### Whitespace
Negative space is structural — empty stretches of the diagonal axis and seams between plates are kept on purpose to read as an assembly bench rather than a packed page.
### Density
Compact steel plates with measured breathing room for legibility on the dark ground.
### Responsive
Every artifact renders cleanly from ~390px mobile to 2560px+ ultra-wide with no horizontal overflow. At 900-1024px rails become top strips and key panels move to two columns; at 768px modules stack to one column; at 560px buttons go full width, controls stack, the masthead trims to one or two links, and data tables scroll horizontally inside their plate.
### Breakpoints
- **Mobile**: 390-560
- **Tablet**: 561-900
- **Desktop**: 901-1440
- **Ultrawide**: 1441+
## Guidance
### Do
- Keep the warm ink-black ground; let the three primaries glow as sparse torque marks against charcoal steel.
- Assemble content on a rising diagonal axis and stagger plates so the layout reads as built, not centred.
- Bolt every plate with bolt-head markers at two opposite corners; run rivet rows along edges as the only ornament.
- Set heads and figures in heavy uppercase Archivo Expanded with a slight skew; run metadata and numerals in tabular Space Mono.
- Pair every status colour with a chip or dot and a text label; make exactly one button primary and keep the rest quiet.
- Express depth with a hard 6px offset black slab on hover and focus; explicitly style every form control on the dark field.
### Don't
- Do not default to a white ground or a centred hero composition.
- Do not frame plates as soft rounded cards, nest cards, or box the top nav in a pill bar.
- Do not let a primary fill a whole surface or solve hierarchy on its own.
- Do not rely on glow, blur, or soft drop shadows for depth; use the offset slab.
- Do not leave a single coloured accent edge as a panel's only marker, or ship browser-default controls.
- Do not use emoji or symbol glyphs in copy or on buttons; use SVG primitives and labels.
### Accessibility
Maintain high mill-white-on-ink contrast and never communicate state through colour alone — pair chips and dots with labels. Keep a visible focus ring (3px flag-yellow, 2-3px offset) on every control, touch targets at least 44px, and ensure tables stay readable when scrolled horizontally on small screens. Respect prefers-reduced-motion: the settled page renders with no JavaScript.
## Imagery Direction
### Pairs With
plakat
### Summary
Flat geometric Bauhaus-Swiss-constructivist reconstruction applied to engineering and industrial subjects on a dark ink ground: structures decomposed into pure primitives with a visible construction grid and one decisive red diagonal wedge, secondary cobalt and a single yellow square as signals.
### Subjects
- riveted steel gantry cranes and scaffolds
- industrial structures and machinery
- bridges, slipways and dry docks
- tools and fasteners (rivets, bolts, wrenches)
- assembly benches and control consoles
### Usage
Use as the full-bleed landing hero, composed on a rising diagonal with the lower-left kept darker and quieter so an overlay headline reads. Decompose the subject into flat primitives aligned to the construction grid; let one red diagonal wedge drive the eye. No text, letters, logos, gradients, or soft shading.
DESIGN.md
---
version: "alpha"
name: "Riveter"
description: "Agent-curated design language exported from Katagami as DESIGN.md."
colors:
bg: "#15151A"
bg_2: "#101015"
surface: "#1E1E25"
surface_2: "#262630"
text: "#F4F2EC"
muted: "#9A968C"
line: "#3A3A45"
border: "#0B0B0E"
accent: "#E11414"
accent_blue: "#1453E1"
accent_yellow: "#FFC400"
on_accent: "#FFFFFF"
success: "#1FA45E"
warning: "#FFC400"
error: "#E11414"
info: "#1453E1"
beam: "#0B0B0E"
rivet: "#5A5A66"
typography:
headline-lg:
fontFamily: "Archivo Expanded"
fontSize: "2.075rem"
fontWeight: 700
lineHeight: 1.1
letterSpacing: "-0.02em"
headline-md:
fontFamily: "Archivo Expanded"
fontSize: "1.66rem"
fontWeight: 600
lineHeight: 1.15
letterSpacing: "-0.02em"
body-md:
fontFamily: "Archivo"
fontSize: "17px"
fontWeight: 400
lineHeight: 1.55
letterSpacing: "-0.02em"
label-md:
fontFamily: "Space Mono"
fontSize: "0.75rem"
fontWeight: 600
lineHeight: 1
letterSpacing: "0.08em"
rounded:
none: "0px"
sm: "0px"
md: "0px"
lg: "0px"
rivet: "9999px"
full: "9999px"
spacing:
base: "8px"
xs: "4px"
sm: "8px"
md: "12px"
lg: "16px"
xl: "24px"
2xl: "32px"
3xl: "48px"
4xl: "64px"
step-8: "96px"
components:
color-reference-bg:
backgroundColor: "{colors.bg}"
color-reference-bg_2:
backgroundColor: "{colors.bg_2}"
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-line:
backgroundColor: "{colors.line}"
color-reference-border:
backgroundColor: "{colors.border}"
color-reference-accent:
backgroundColor: "{colors.accent}"
color-reference-accent_blue:
backgroundColor: "{colors.accent_blue}"
color-reference-accent_yellow:
backgroundColor: "{colors.accent_yellow}"
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}"
color-reference-beam:
backgroundColor: "{colors.beam}"
color-reference-rivet:
backgroundColor: "{colors.rivet}"
button-primary:
backgroundColor: "{colors.accent}"
textColor: "#ffffff"
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"
---
# Riveter
## Overview
Riveter answers the constructivist brief with the workshop, not the gallery. Where the poster tradition lays type flat on white, Riveter stands the structure up: content is assembled on a single rising diagonal axis, like a riveted steel gantry. Panels are not framed cards but steel plates bolted at the corners; the red wedge does the lifting, cobalt routes, yellow flags. The ground is a deliberate warm ink-black, an assembly bench under work-lights where the three primaries glow as torque marks against charcoal steel. Everything bears weight, nothing floats.
### Values
- {"name":"Built, not laid out","explanation":"Composition is assembled on a rising diagonal axis; plates bolt against one another and stagger, so the interface reads as a structure under load rather than a centred page."}
- {"name":"Structure as ornament","explanation":"The only decoration is structural — bolt-head corner markers and rows of rivets along plate edges. Nothing is added that does not also join something."}
- {"name":"Torque-mark colour","explanation":"Red is load, cobalt is routing, yellow is a flag. Three primaries on ink, applied exactly where force is, like a torque wrench — never as a surface wash."}
- {"name":"Weight in the type","explanation":"Heavy expanded display and oversized sheared figures carry the hierarchy; tabular mono lines up metadata like a torque chart."}
- {"name":"Flat steel depth","explanation":"Depth comes from a hard offset slab — a plate sitting proud of the one behind it — never glass, blur, or a soft shadow."}
### Anti-Values
- {"name":"White-poster default","explanation":"The ground is ink-black on purpose; reverting to white loses the assembly-bench identity entirely."}
- {"name":"Floating soft cards","explanation":"No rounded, plush, drop-shadowed cards. Panels are bolted steel plates with sharp corners."}
- {"name":"Colour as decoration","explanation":"A primary never fills a whole surface or solves hierarchy alone; it marks where force or routing is."}
- {"name":"Centred symmetry","explanation":"No hero-centred marketing composition; the hierarchy rises asymmetrically along the load axis."}
### Visual Character
- Content is assembled on a rising diagonal axis (approx -32 degrees); a skewed signal-red wedge marks the line of force in the hero and at section anchors.
- Every panel is a flat steel plate with a bolt-head marker at two opposite corners; rows of rivets run plate edges as the only, structural, ornament.
- Oversized Archivo Expanded numerals, slightly sheared with skewX, sit on solid red, cobalt, and ink blocks as the primary graphic device.
- Depth is a hard 6px offset black slab on hover and focus; the ground is warm ink-black with charcoal steel plates, sliced by one red diagonal.
## 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 | `#15151A` |
| bg_2 | `#101015` |
| surface | `#1E1E25` |
| surface_2 | `#262630` |
| text | `#F4F2EC` |
| muted | `#9A968C` |
| line | `#3A3A45` |
| border | `#0B0B0E` |
| accent | `#E11414` |
| accent_blue | `#1453E1` |
| accent_yellow | `#FFC400` |
| on_accent | `#FFFFFF` |
| success | `#1FA45E` |
| warning | `#FFC400` |
| error | `#E11414` |
| info | `#1453E1` |
| beam | `#0B0B0E` |
| rivet | `#5A5A66` |
## Typography
- **Headline-Lg**: Archivo Expanded, 2.075rem, weight 700, line-height 1.1.
- **Headline-Md**: Archivo Expanded, 1.66rem, weight 600, line-height 1.15.
- **Body-Md**: Archivo, 17px, weight 400, line-height 1.55.
- **Label-Md**: Space 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`
- **Step-8**: `96px`
### Grid
Desktop caps contained content at ~1440px with a left rail on the dashboard; only the full-bleed hero spans 100vw. Composition climbs a diagonal axis; plates use minmax(0,1fr) columns and min-width:0 children so grids never overflow. Tablet collapses rails to a top strip; mobile becomes a single stacked column with tables scrolling inside their plate.
### Whitespace
Negative space is structural — empty stretches of the diagonal axis and seams between plates are kept on purpose to read as an assembly bench rather than a packed page.
### Density
Compact steel plates with measured breathing room for legibility on the dark ground.
### Responsive
Every artifact renders cleanly from ~390px mobile to 2560px+ ultra-wide with no horizontal overflow. At 900-1024px rails become top strips and key panels move to two columns; at 768px modules stack to one column; at 560px buttons go full width, controls stack, the masthead trims to one or two links, and data tables scroll horizontally inside their plate.
### Breakpoints
- **Mobile**: 390-560
- **Tablet**: 561-900
- **Desktop**: 901-1440
- **Ultrawide**: 1441+
## Elevation & Depth
### Shadows
- **Sm**: none
- **Md**: none
- **Lg**: 6px 6px 0 #0B0B0E
- **Slab**: 6px 6px 0 #0B0B0E
## Shapes
### Rounded
- **None**: `0px`
- **Sm**: `0px`
- **Md**: `0px`
- **Lg**: `0px`
- **Rivet**: `9999px`
- **Full**: `9999px`
### Surfaces
- **Treatment**: flat-steel
- **Card Style**: Flat rectangular steel plate on ink ground, no border edge, bolt-head markers at two opposite corners and rivet rows on plate edges; depth from a hard offset slab, never glass or soft shadow.
- **Bg Pattern**: ink
### Borders
- **Default Width**: 0px
- **Accent Width**: 8px
- **Style**: none
- **Character**: Plates carry no outline border; they are separated by deep seams and depth comes from a 6px offset black slab. The only coloured edge is an 8px left load-bar on alert plates, paired with a text condition.
## Components
### Composition
Assemble content on a rising diagonal axis (about -32 degrees), not a centred poster grid. A dominant lead block rises from the lower-left while metadata sits in narrow rails or a left navigation rail. Render panels as flat steel plates (0px radius, no border) bolted with bolt-head markers at two opposite corners; stagger plates in a row so the composition reads as built. Mark the line of force with one skewed signal-red wedge.
### Hierarchy
Lead with a mono uppercase label and a skewed red wedge, then an oversized Archivo Expanded headline or sheared numeral, then concise Archivo body. Build hierarchy with scale, weight, case, position, and offset-slab depth before colour. Important metrics become poster-like sheared figures on solid red, cobalt, or ink blocks.
### Density
Operational medium-high density with disciplined negative space: compact interior modules on generous ink ground, plates separated by deep seams and empty axis space rather than crowding.
### Signature
Rising diagonal load axis with a skewed red wedge; flat steel plates bolted with bolt-head corner markers and rivet-row edges; three primaries (red load, cobalt routing, yellow flag) used only as torque marks and status chips; oversized sheared Archivo Expanded figures on red/cobalt/ink blocks; depth from a hard 6px offset black slab; mono uppercase metadata with leading square chips.
## 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-019ef897-08b1-7091-a1ba-e0341bc2747e/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 Keep the warm ink-black ground; let the three primaries glow as sparse torque marks against charcoal steel.
- Do Assemble content on a rising diagonal axis and stagger plates so the layout reads as built, not centred.
- Do Bolt every plate with bolt-head markers at two opposite corners; run rivet rows along edges as the only ornament.
- Do Set heads and figures in heavy uppercase Archivo Expanded with a slight skew; run metadata and numerals in tabular Space Mono.
- Do Pair every status colour with a chip or dot and a text label; make exactly one button primary and keep the rest quiet.
- Do Express depth with a hard 6px offset black slab on hover and focus; explicitly style every form control on the dark field.
- Don't Do not default to a white ground or a centred hero composition.
- Don't Do not frame plates as soft rounded cards, nest cards, or box the top nav in a pill bar.
- Don't Do not let a primary fill a whole surface or solve hierarchy on its own.
- Don't Do not rely on glow, blur, or soft drop shadows for depth; use the offset slab.
- Don't Do not leave a single coloured accent edge as a panel's only marker, or ship browser-default controls.
- Don't Do not use emoji or symbol glyphs in copy or on buttons; use SVG primitives and labels.
### Accessibility
Maintain high mill-white-on-ink contrast and never communicate state through colour alone — pair chips and dots with labels. Keep a visible focus ring (3px flag-yellow, 2-3px offset) on every control, touch targets at least 44px, and ensure tables stay readable when scrolled horizontally on small screens. Respect prefers-reduced-motion: the settled page renders with no JavaScript.
## Imagery Direction
### Pairs With
plakat
### Summary
Flat geometric Bauhaus-Swiss-constructivist reconstruction applied to engineering and industrial subjects on a dark ink ground: structures decomposed into pure primitives with a visible construction grid and one decisive red diagonal wedge, secondary cobalt and a single yellow square as signals.
### Subjects
- riveted steel gantry cranes and scaffolds
- industrial structures and machinery
- bridges, slipways and dry docks
- tools and fasteners (rivets, bolts, wrenches)
- assembly benches and control consoles
### Usage
Use as the full-bleed landing hero, composed on a rising diagonal with the lower-left kept darker and quieter so an overlay headline reads. Decompose the subject into flat primitives aligned to the construction grid; let one red diagonal wedge drive the eye. No text, letters, logos, gradients, or soft shading.
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.
# Riveter shadcn/ui Components
Artifact: `component-recipes-v1`
Author: `katagami-ui-projection`
Language ID: `en-019ef897-08b1-7091-a1ba-e0341bc2747e`
Slug: `riveter`
## Intent
Riveter answers the constructivist brief with the workshop, not the gallery. Where the poster tradition lays type flat on white, Riveter stands the structure up: content is assembled on a single rising diagonal axis, like a riveted steel gantry. Panels are not framed cards but steel plates bolted at the corners; the red wedge does the lifting, cobalt routes, yellow flags. The ground is a deliberate warm ink-black, an assembly bench under work-lights where the three primaries glow as torque marks against charcoal steel. Everything bears weight, nothing floats.
## 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": "#15151A",
"bg_2": "#101015",
"surface": "#1E1E25",
"surface_2": "#262630",
"text": "#F4F2EC",
"muted": "#9A968C",
"line": "#3A3A45",
"border": "#0B0B0E",
"accent": "#E11414",
"accent_blue": "#1453E1",
"accent_yellow": "#FFC400",
"on_accent": "#FFFFFF",
"success": "#1FA45E",
"warning": "#FFC400",
"error": "#E11414",
"info": "#1453E1",
"beam": "#0B0B0E",
"rivet": "#5A5A66"
}
Typography:
{
"base_size": "17px",
"body_font": "Archivo",
"heading_font": "Archivo Expanded",
"mono_font": "Space Mono",
"heading_weight": "900",
"heading_transform": "uppercase",
"letter_spacing": "-0.02em",
"line_height": 1.55,
"scale_ratio": 1.25,
"google_fonts_url": "https://fonts.googleapis.com/css2?family=Archivo:wght@400;500;600;700;800;900&family=Archivo+Expanded:wght@600;700;800;900&family=Space+Mono:wght@400;700&display=swap"
}
## Visual character to preserve
- Content is assembled on a rising diagonal axis (approx -32 degrees); a skewed signal-red wedge marks the line of force in the hero and at section anchors.
- Every panel is a flat steel plate with a bolt-head marker at two opposite corners; rows of rivets run plate edges as the only, structural, ornament.
- Oversized Archivo Expanded numerals, slightly sheared with skewX, sit on solid red, cobalt, and ink blocks as the primary graphic device.
- Depth is a hard 6px offset black slab on hover and focus; the ground is warm ink-black with charcoal steel plates, sliced by one red diagonal.
## ShadSync visual profile
{
"family": "brutalist",
"material": "ink",
"contour": "default",
"border": "solid",
"underlay": true,
"grain": false,
"stickerBadges": false,
"motion": "still",
"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/riveter/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: Keep the warm ink-black ground; let the three primaries glow as sparse torque marks against charcoal steel.; Assemble content on a rising diagonal axis and stagger plates so the layout reads as built, not centred.; Bolt every plate with bolt-head markers at two opposite corners; run rivet rows along edges as the only ornament.; Set heads and figures in heavy uppercase Archivo Expanded with a slight skew; run metadata and numerals in tabular Space Mono.; Pair every status colour with a chip or dot and a text label; make exactly one button primary and keep the rest quiet.; Express depth with a hard 6px offset black slab on hover and focus; explicitly style every form control on the dark field.
- Do not: Do not default to a white ground or a centred hero composition.; Do not frame plates as soft rounded cards, nest cards, or box the top nav in a pill bar.; Do not let a primary fill a whole surface or solve hierarchy on its own.; Do not rely on glow, blur, or soft drop shadows for depth; use the offset slab.; Do not leave a single coloured accent edge as a panel's only marker, or ship browser-default controls.; Do not use emoji or symbol glyphs in copy or on buttons; use SVG primitives and labels.
## 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 RiveterShadcnKit() {
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">Riveter</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": "Desktop caps contained content at ~1440px with a left rail on the dashboard; only the full-bleed hero spans 100vw. Composition climbs a diagonal axis; plates use minmax(0,1fr) columns and min-width:0 children so grids never overflow. Tablet collapses rails to a top strip; mobile becomes a single stacked column with tables scrolling inside their plate.",
"whitespace": "Negative space is structural — empty stretches of the diagonal axis and seams between plates are kept on purpose to read as an assembly bench rather than a packed page.",
"density": "Compact steel plates with measured breathing room for legibility on the dark ground.",
"responsive": "Every artifact renders cleanly from ~390px mobile to 2560px+ ultra-wide with no horizontal overflow. At 900-1024px rails become top strips and key panels move to two columns; at 768px modules stack to one column; at 560px buttons go full width, controls stack, the masthead trims to one or two links, and data tables scroll horizontally inside their plate.",
"breakpoints": {
"mobile": "390-560",
"tablet": "561-900",
"desktop": "901-1440",
"ultrawide": "1441+"
}
}
preview shotscompatibility fallback
{
"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-019ef897-08b1-7091-a1ba-e0341bc2747e",
"name": "Riveter",
"slug": "riveter"
},
"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": [
"Content is assembled on a rising diagonal axis (approx -32 degrees); a skewed signal-red wedge marks the line of force in the hero and at section anchors.",
"Every panel is a flat steel plate with a bolt-head marker at two opposite corners; rows of rivets run plate edges as the only, structural, ornament.",
"Oversized Archivo Expanded numerals, slightly sheared with skewX, sit on solid red, cobalt, and ink blocks as the primary graphic device.",
"Depth is a hard 6px offset black slab on hover and focus; the ground is warm ink-black with charcoal steel plates, sliced by one red diagonal."
],
"visualProfile": {
"family": "system",
"material": "flat",
"contour": "default",
"border": "solid",
"underlay": true,
"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": "Riveter 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": [
"Keep the warm ink-black ground; let the three primaries glow as sparse torque marks against charcoal steel.",
"Assemble content on a rising diagonal axis and stagger plates so the layout reads as built, not centred.",
"Bolt every plate with bolt-head markers at two opposite corners; run rivet rows along edges as the only ornament.",
"Set heads and figures in heavy uppercase Archivo Expanded with a slight skew; run metadata and numerals in tabular Space Mono.",
"Pair every status colour with a chip or dot and a text label; make exactly one button primary and keep the rest quiet.",
"Express depth with a hard 6px offset black slab on hover and focus; explicitly style every form control on the dark field."
],
"dont": [
"Do not default to a white ground or a centred hero composition.",
"Do not frame plates as soft rounded cards, nest cards, or box the top nav in a pill bar.",
"Do not let a primary fill a whole surface or solve hierarchy on its own.",
"Do not rely on glow, blur, or soft drop shadows for depth; use the offset slab.",
"Do not leave a single coloured accent edge as a panel's only marker, or ship browser-default controls.",
"Do not use emoji or symbol glyphs in copy or on buttons; use SVG primitives and labels."
]
}
}