Typography
The quick brown fox jumps
The quick brown fox jumps
The quick brown fox jumps
The quick brown fox jumps
A portable design language for agents: download the markdown first, then inspect the preview, tokens, and rules as needed.
Portable DESIGN.md — tokens plus the paired art style. Agents must generate real images.
Availability is read as warmth on one scale — ink (plenty) -> green (good) -> amber (filling) -> ember (almost gone) -> ink-on-ember (sold out). Status pills, demand bars and seat maps all use it; colour is never decorative.
Visible 12-column construction grid; asymmetric, left-weighted poster composition. The screen reads like the programme pinned by the door.
Dates, times, venues, durations and prices are set in IBM Plex Mono as fine print — a printed programme's caption layer.
Dense data (schedules, seat maps, wayfinding) sits in ink working-blocks; headlines breathe in white poster space.
Condensed display sets the headline; the heat signal sets the priority; mono carries the facts.
Tiered — poster-loose at the top, programme-dense in the middle, fine-print at the bottom.
12-column rational grid, visible alignment, asymmetric and left-weighted.
Tiered by section: hero (loose) -> schedule/timeline/seat-map (dense) -> metadata (fine print).
Generous; titles always carry padding above them.
0 / 16 / 9999 only; no borders.
risograph-ember
Two-ink risograph prints (ember + ink) on warm off-white paper — gig-poster and printed-programme energy. Bold flat shapes, visible halftone grain, slight misregistration. No photography, no gradients.
One large riso hero per landing; portrait/feature crops for featured events; never decorative texture.
# Civic Press ## Philosophy Civic Press is a design language for cultural institutions and the programmes they run — theatres, museums, festivals, libraries, community halls. It treats every screen like the printed programme pinned by the door: legible from across the foyer, honest about what's left, and warm enough to feel public-spirited rather than corporate. It evolves Constructive Grid Modernism's Swiss discipline and sharpens it with one governing idea — colour is a live demand signal, not decoration. ### Values - Legible at a glance - Honest about availability - Public, not corporate - The grid as civic order - Warmth without preciousness ### Anti-Values - Decorative gradients - Dark corporate dashboards - Hype and spectacle - Hidden availability - Four or more accents ## Tokens ### Colors | Name | Value | |------|-------| | primary | `#C8442A` | | secondary | `#14213D` | | accent | `#E8A33D` | | background | `#FFFFFF` | | surface | `#FFFFFF` | | text | `#000000` | | muted | `#5F5F5F` | | border | `#000000` | | error | `#C8442A` | | success | `#007A3D` | | warning | `#FFD400` | | info | `#14213D` | | neutral_100 | `#F3F3F3` | | neutral_200 | `#D9D9D9` | | black | `#000000` | | white | `#FFFFFF` | ### Typography - **Heading Font**: IBM Plex Sans Condensed - **Body Font**: IBM Plex Sans - **Mono Font**: IBM Plex Mono - **Base Size**: 16px - **Scale Ratio**: 1.25 - **Line Height**: 1.42 - **Letter Spacing**: -0.02em - **Google Fonts Url**: https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans+Condensed:wght@500;600;700&family=IBM+Plex+Sans:wght@400;500;600;700&display=swap ### Spacing - **Base**: 8px - **Scale**: ["4px","8px","12px","16px","24px","32px","48px","64px","96px"] ### Radii - **None**: 0px - **Sm**: 0px - **Md**: 16px - **Lg**: 16px - **Full**: 9999px ### Shadows - **Sm**: 3px 3px 0 #000000 - **Md**: 6px 6px 0 #000000 - **Lg**: 10px 10px 0 #000000 ### Surfaces - **Treatment**: flat - **Card Style**: Flat white rectangular panels with black 2px borders, internal ruled dividers, and occasional offset black slab shadows. - **Bg Pattern**: grid ### Borders - **Default Width**: 2px - **Accent Width**: 8px - **Style**: solid - **Character**: Hard black construction lines that behave like print crop marks and Swiss grid rules rather than decorative outlines. ### Motion - **Duration**: 140ms - **Easing**: cubic-bezier(0.2, 0, 0, 1) - **Philosophy**: snappy, mechanical state changes with no bounce and no ornamental animation ## Rules ### Heat Scale Availability is read as warmth on one scale — ink (plenty) -> green (good) -> amber (filling) -> ember (almost gone) -> ink-on-ember (sold out). Status pills, demand bars and seat maps all use it; colour is never decorative. ### Composition Visible 12-column construction grid; asymmetric, left-weighted poster composition. The screen reads like the programme pinned by the door. ### Metadata Dates, times, venues, durations and prices are set in IBM Plex Mono as fine print — a printed programme's caption layer. ### Working Blocks Dense data (schedules, seat maps, wayfinding) sits in ink working-blocks; headlines breathe in white poster space. ### Hierarchy Condensed display sets the headline; the heat signal sets the priority; mono carries the facts. ### Density Tiered — poster-loose at the top, programme-dense in the middle, fine-print at the bottom. ## Layout ### Grid 12-column rational grid, visible alignment, asymmetric and left-weighted. ### Density Tiered by section: hero (loose) -> schedule/timeline/seat-map (dense) -> metadata (fine print). ### Whitespace Generous; titles always carry padding above them. ### Radii 0 / 16 / 9999 only; no borders. ### Breakpoints - **Sm**: 640 - **Md**: 860 - **Lg**: 1200 ## Guidance ### Do - Let ember mean scarcity — reserve it for 'almost gone' and live signals. - Keep ink for text, structure and dense data. - Set all metadata in mono, like a printed programme. - Pair imagery with the Risograph Ember art style. - Give titles room; align everything to the grid. ### Don't - Tint backgrounds or use gradients. - Spend ember decoratively or as a fourth-accent flourish. - Hide availability or fake scarcity. - Add borders. - Let amber and ember compete at equal weight. ## Imagery Direction ### Pairs With Art Style risograph-ember ### Summary Two-ink risograph prints (ember + ink) on warm off-white paper — gig-poster and printed-programme energy. Bold flat shapes, visible halftone grain, slight misregistration. No photography, no gradients. ### Subjects - modernist civic architecture - performers and audiences - single bold objects - wayfinding and transit ### Usage One large riso hero per landing; portrait/feature crops for featured events; never decorative texture.
---
version: "alpha"
name: "Civic Press"
description: "Agent-curated design language exported from Katagami as DESIGN.md."
colors:
primary: "#C8442A"
secondary: "#14213D"
accent: "#E8A33D"
background: "#FFFFFF"
surface: "#FFFFFF"
text: "#000000"
muted: "#5F5F5F"
border: "#000000"
error: "#C8442A"
success: "#007A3D"
warning: "#FFD400"
info: "#14213D"
neutral_100: "#F3F3F3"
neutral_200: "#D9D9D9"
black: "#000000"
white: "#FFFFFF"
typography:
headline-lg:
fontFamily: "IBM Plex Sans Condensed"
fontSize: "1.953rem"
fontWeight: 700
lineHeight: 1.1
letterSpacing: "-0.02em"
headline-md:
fontFamily: "IBM Plex Sans Condensed"
fontSize: "1.563rem"
fontWeight: 600
lineHeight: 1.15
letterSpacing: "-0.02em"
body-md:
fontFamily: "IBM Plex Sans"
fontSize: "16px"
fontWeight: 400
lineHeight: 1.42
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"
step-8: "96px"
components:
color-reference-primary:
backgroundColor: "{colors.primary}"
color-reference-secondary:
backgroundColor: "{colors.secondary}"
color-reference-accent:
backgroundColor: "{colors.accent}"
color-reference-background:
backgroundColor: "{colors.background}"
color-reference-surface:
backgroundColor: "{colors.surface}"
color-reference-text:
backgroundColor: "{colors.text}"
color-reference-muted:
backgroundColor: "{colors.muted}"
color-reference-border:
backgroundColor: "{colors.border}"
color-reference-error:
backgroundColor: "{colors.error}"
color-reference-success:
backgroundColor: "{colors.success}"
color-reference-warning:
backgroundColor: "{colors.warning}"
color-reference-info:
backgroundColor: "{colors.info}"
color-reference-neutral_100:
backgroundColor: "{colors.neutral_100}"
color-reference-neutral_200:
backgroundColor: "{colors.neutral_200}"
color-reference-black:
backgroundColor: "{colors.black}"
color-reference-white:
backgroundColor: "{colors.white}"
button-primary:
backgroundColor: "{colors.primary}"
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"
---
# Civic Press
## Overview
Civic Press is a design language for cultural institutions and the programmes they run — theatres, museums, festivals, libraries, community halls. It treats every screen like the printed programme pinned by the door: legible from across the foyer, honest about what's left, and warm enough to feel public-spirited rather than corporate. It evolves Constructive Grid Modernism's Swiss discipline and sharpens it with one governing idea — colour is a live demand signal, not decoration.
### Values
- Legible at a glance
- Honest about availability
- Public, not corporate
- The grid as civic order
- Warmth without preciousness
### Anti-Values
- Decorative gradients
- Dark corporate dashboards
- Hype and spectacle
- Hidden availability
- Four or more accents
## Colors
Use the YAML color tokens as the normative palette. The prose below names the roles agents should preserve when generating UI.
| Token | Value |
|-------|-------|
| primary | `#C8442A` |
| secondary | `#14213D` |
| accent | `#E8A33D` |
| background | `#FFFFFF` |
| surface | `#FFFFFF` |
| text | `#000000` |
| muted | `#5F5F5F` |
| border | `#000000` |
| error | `#C8442A` |
| success | `#007A3D` |
| warning | `#FFD400` |
| info | `#14213D` |
| neutral_100 | `#F3F3F3` |
| neutral_200 | `#D9D9D9` |
| black | `#000000` |
| white | `#FFFFFF` |
## Typography
- **Headline-Lg**: IBM Plex Sans Condensed, 1.953rem, weight 700, line-height 1.1.
- **Headline-Md**: IBM Plex Sans Condensed, 1.563rem, weight 600, line-height 1.15.
- **Body-Md**: IBM Plex Sans, 16px, weight 400, line-height 1.42.
- **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`
- **Step-8**: `96px`
### Grid
12-column rational grid, visible alignment, asymmetric and left-weighted.
### Density
Tiered by section: hero (loose) -> schedule/timeline/seat-map (dense) -> metadata (fine print).
### Whitespace
Generous; titles always carry padding above them.
### Radii
0 / 16 / 9999 only; no borders.
### Breakpoints
- **Sm**: 640
- **Md**: 860
- **Lg**: 1200
## Elevation & Depth
### Shadows
- **Sm**: 3px 3px 0 #000000
- **Md**: 6px 6px 0 #000000
- **Lg**: 10px 10px 0 #000000
## Shapes
### Rounded
- **None**: `0px`
- **Sm**: `0px`
- **Md**: `16px`
- **Lg**: `16px`
- **Full**: `9999px`
### Surfaces
- **Treatment**: flat
- **Card Style**: Flat white rectangular panels with black 2px borders, internal ruled dividers, and occasional offset black slab shadows.
- **Bg Pattern**: grid
### Borders
- **Default Width**: 2px
- **Accent Width**: 8px
- **Style**: solid
- **Character**: Hard black construction lines that behave like print crop marks and Swiss grid rules rather than decorative outlines.
## Components
### Heat Scale
Availability is read as warmth on one scale — ink (plenty) -> green (good) -> amber (filling) -> ember (almost gone) -> ink-on-ember (sold out). Status pills, demand bars and seat maps all use it; colour is never decorative.
### Composition
Visible 12-column construction grid; asymmetric, left-weighted poster composition. The screen reads like the programme pinned by the door.
### Metadata
Dates, times, venues, durations and prices are set in IBM Plex Mono as fine print — a printed programme's caption layer.
### Working Blocks
Dense data (schedules, seat maps, wayfinding) sits in ink working-blocks; headlines breathe in white poster space.
### Hierarchy
Condensed display sets the headline; the heat signal sets the priority; mono carries the facts.
### Density
Tiered — poster-loose at the top, programme-dense in the middle, fine-print at the bottom.
## 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-019ef593-0eda-71c1-b412-f7f6fccf2570/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 ember mean scarcity — reserve it for 'almost gone' and live signals.
- Do Keep ink for text, structure and dense data.
- Do Set all metadata in mono, like a printed programme.
- Do Pair imagery with the Risograph Ember art style.
- Do Give titles room; align everything to the grid.
- Don't Tint backgrounds or use gradients.
- Don't Spend ember decoratively or as a fourth-accent flourish.
- Don't Hide availability or fake scarcity.
- Don't Add borders.
- Don't Let amber and ember compete at equal weight.
## Imagery Direction
### Pairs With Art Style
risograph-ember
### Summary
Two-ink risograph prints (ember + ink) on warm off-white paper — gig-poster and printed-programme energy. Bold flat shapes, visible halftone grain, slight misregistration. No photography, no gradients.
### Subjects
- modernist civic architecture
- performers and audiences
- single bold objects
- wayfinding and transit
### Usage
One large riso hero per landing; portrait/feature crops for featured events; never decorative texture.
```json
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "civic-press",
"type": "registry:theme",
"title": "Civic Press shadcn Theme",
"cssVars": {
"theme": {},
"light": {
"background": "#FFFFFF",
"foreground": "#000000",
"card": "#FFFFFF",
"card-foreground": "#000000",
"popover": "#FFFFFF",
"popover-foreground": "#000000",
"primary": "#C8442A",
"primary-foreground": "#ffffff",
"secondary": "#14213D",
"secondary-foreground": "#ffffff",
"muted": "#5F5F5F",
"muted-foreground": "#000000",
"accent": "#E8A33D",
"accent-foreground": "#ffffff",
"destructive": "#C8442A",
"border": "#000000",
"input": "#000000",
"ring": "#E8A33D",
"chart-1": "#C8442A",
"chart-2": "#14213D",
"chart-3": "#E8A33D",
"chart-4": "#007A3D",
"chart-5": "#FFD400",
"sidebar": "#FFFFFF",
"sidebar-foreground": "#000000",
"sidebar-primary": "#C8442A",
"sidebar-primary-foreground": "#ffffff",
"sidebar-accent": "#14213D",
"sidebar-accent-foreground": "#ffffff",
"sidebar-border": "#000000",
"sidebar-ring": "#E8A33D",
"radius": "16px"
},
"dark": {
"background": "#0f1115",
"foreground": "#f8fafc",
"card": "#181b22",
"card-foreground": "#f8fafc",
"popover": "#181b22",
"popover-foreground": "#f8fafc",
"primary": "#C8442A",
"primary-foreground": "#ffffff",
"secondary": "#252a33",
"secondary-foreground": "#f8fafc",
"muted": "#252a33",
"muted-foreground": "#a1a1aa",
"accent": "#E8A33D",
"accent-foreground": "#ffffff",
"destructive": "#C8442A",
"border": "#303642",
"input": "#303642",
"ring": "#E8A33D",
"chart-1": "#C8442A",
"chart-2": "#14213D",
"chart-3": "#E8A33D",
"chart-4": "#007A3D",
"chart-5": "#FFD400",
"sidebar": "#181b22",
"sidebar-foreground": "#f8fafc",
"sidebar-primary": "#C8442A",
"sidebar-primary-foreground": "#ffffff",
"sidebar-accent": "#E8A33D",
"sidebar-accent-foreground": "#ffffff",
"sidebar-border": "#303642",
"sidebar-ring": "#E8A33D",
"radius": "16px"
}
},
"meta": {
"source": "katagami",
"languageId": "en-019ef593-0eda-71c1-b412-f7f6fccf2570",
"slug": "civic-press",
"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",
"background",
"black",
"border",
"error",
"info",
"muted",
"neutral_100",
"neutral_200",
"primary",
"secondary",
"success",
"surface",
"text",
"warning",
"white"
],
"typography": [
"base_size",
"body_font",
"google_fonts_url",
"heading_font",
"letter_spacing",
"line_height",
"mono_font",
"scale_ratio"
],
"spacing": [
"base",
"scale"
],
"radii": [
"full",
"lg",
"md",
"none",
"sm"
],
"shadows": [
"lg",
"md",
"sm"
],
"surfaces": [
"bg_pattern",
"card_style",
"treatment"
],
"borders": [
"accent_width",
"character",
"default_width",
"style"
],
"motion": [
"duration",
"easing",
"philosophy"
]
}
}
}
```The quick brown fox jumps
The quick brown fox jumps
The quick brown fox jumps
The quick brown fox jumps
Keep Civic Press and swap a palette and an art style onto it. The landing & dashboard recolor live.
Agent-authored scenes, component recipes, and visual profile rendered on local shadcn-style primitives.
A programme team's workspace where navigation, KPIs, filters, and dense rows carry the heat scale and the visible grid.
A reservation form proving labels, validation, a reminder toggle, capacity, and a confirm decision.
A compact queue with rows, menus, tooltips, heat-scale badges, and a sold-out destructive affordance.
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: #FFFFFF;
--foreground: #000000;
--card: #FFFFFF;
--card-foreground: #000000;
--popover: #FFFFFF;
--popover-foreground: #000000;
--primary: #C8442A;
--primary-foreground: #ffffff;
--secondary: #14213D;
--secondary-foreground: #ffffff;
--muted: #5F5F5F;
--muted-foreground: #000000;
--accent: #E8A33D;
--accent-foreground: #ffffff;
--destructive: #C8442A;
--border: #000000;
--input: #000000;
--ring: #E8A33D;
--chart-1: #C8442A;
--chart-2: #14213D;
--chart-3: #E8A33D;
--chart-4: #007A3D;
--chart-5: #FFD400;
--sidebar: #FFFFFF;
--sidebar-foreground: #000000;
--sidebar-primary: #C8442A;
--sidebar-primary-foreground: #ffffff;
--sidebar-accent: #14213D;
--sidebar-accent-foreground: #ffffff;
--sidebar-border: #000000;
--sidebar-ring: #E8A33D;
--radius: 16px;
}
.dark {
--background: #0f1115;
--foreground: #f8fafc;
--card: #181b22;
--card-foreground: #f8fafc;
--popover: #181b22;
--popover-foreground: #f8fafc;
--primary: #C8442A;
--primary-foreground: #ffffff;
--secondary: #252a33;
--secondary-foreground: #f8fafc;
--muted: #252a33;
--muted-foreground: #a1a1aa;
--accent: #E8A33D;
--accent-foreground: #ffffff;
--destructive: #C8442A;
--border: #303642;
--input: #303642;
--ring: #E8A33D;
--chart-1: #C8442A;
--chart-2: #14213D;
--chart-3: #E8A33D;
--chart-4: #007A3D;
--chart-5: #FFD400;
--sidebar: #181b22;
--sidebar-foreground: #f8fafc;
--sidebar-primary: #C8442A;
--sidebar-primary-foreground: #ffffff;
--sidebar-accent: #E8A33D;
--sidebar-accent-foreground: #ffffff;
--sidebar-border: #303642;
--sidebar-ring: #E8A33D;
--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 CivicPressShadcnKit() {
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">Civic Press</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": "civic-press",
"type": "registry:theme",
"title": "Civic Press",
"description": "Warm Swiss working-poster theme for cultural programmes. Ember is the scarcity/heat signal; ink carries structure and data.",
"cssVars": {
"theme": {
"font-sans": "IBM Plex Sans, ui-sans-serif, sans-serif",
"font-mono": "IBM Plex Mono, ui-monospace, monospace",
"radius": "16px"
},
"light": {
"background": "#FFFFFF",
"foreground": "#14213D",
"card": "#F7F8FA",
"card-foreground": "#14213D",
"popover": "#FFFFFF",
"popover-foreground": "#14213D",
"primary": "#C8442A",
"primary-foreground": "#FFFFFF",
"secondary": "#14213D",
"secondary-foreground": "#FFFFFF",
"accent": "#E8A33D",
"accent-foreground": "#14213D",
"muted": "#F0F1F4",
"muted-foreground": "#5B6479",
"destructive": "#C8442A",
"destructive-foreground": "#FFFFFF",
"success": "#2E7D32",
"warning": "#E8A33D",
"border": "transparent",
"input": "#F0F1F4",
"ring": "#C8442A",
"radius": "16px"
}
}
}
# Civic Press shadcn/ui Components
Artifact: `component-recipes-v1`
Author: `katagami-agent`
Language ID: `en-019ef0b3-a14b-72c0-9a42-43d321d3b627`
Slug: `civic-press`
## Intent
Civic Press is a working-poster language for cultural institutions and the
programmes they run. Expressed through shadcn/ui, its one governing idea — **colour
is a live demand signal, not decoration** — must survive: `--accent` (ember) means
scarcity, the semantic roles carry the heat scale (good `--success` → filling
`--warning` → almost-gone `--destructive`), structure and dense data sit in ink
"working-blocks", and metadata reads as mono fine print. No borders, radius 16px,
generous space above titles.
## 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:
```json
{ "primary": "#C8442A", "accent": "#E8A33D", "ink": "#14213D", "background": "#FFFFFF", "surface": "#F5F6F8", "text": "#14213D", "muted": "#5F5F5F", "success": "#2E7D32", "warning": "#E8A33D", "error": "#C8442A", "info": "#14213D" }
```
Typography:
```json
{ "heading_font": "IBM Plex Sans Condensed", "body_font": "IBM Plex Sans", "mono_font": "IBM Plex Mono", "letter_spacing": "-0.02em", "base_size": "17px" }
```
## Visual character to preserve
- The heat scale: availability read as warmth across every status surface (pill, demand bar, badge).
- Visible construction grid; asymmetric, left-weighted, poster-like composition.
- Mono "caption" layer for dates / venues / times / prices (IBM Plex Mono).
- Ink working-blocks for dense data; white poster space for headlines.
- No borders; separation by tinted surfaces and spacing; radius 16px; pills 9999px.
## ShadSync visual profile
```json
{ "family": "constructivist-grid", "material": "flat", "contour": "default", "border": "none", "underlay": false, "grain": false, "stickerBadges": false, "motion": "still", "density": "balanced", "accents": ["primary", "accent", "success", "warning"] }
```
## Signature component recipes
### Button
Primary `Button` = `--primary` (ember) on `--primary-foreground` — reserved for the
single dominant action; `secondary` = ink; `outline`/`ghost` keep the tinted surface,
never a grey SaaS default. No border; 16px radius; focus ring `--ring` (ember). Use a
disabled state for "sold out".
### Card
`Card` / `CardHeader` / `CardContent` / `CardFooter` / `CardAction` is the programme
frame: a 4%-ink tinted surface, no border, 16px radius, generous padding, a mono
caption row for date/venue, and a demand bar in the footer keyed to the heat scale.
### Input and Textarea
`Input` / `Textarea` on white with a visible ember focus ring and a real label; show
a validation (invalid) state in `--destructive`. Reserve forms show real programme
content, not placeholder-only fields.
### Select, Tabs, and Table
`Select` filters programmes; `Tabs` switch Landing/Schedule/Ops; `Table` is the
schedule — mono header, ink-4% rows separated by white gaps (no grey dividers),
heat-scale status `Badge` per row, and a "sold out" empty/zero state.
### Dialog and Sheet
`Dialog` for "Confirm reservation" (centered decision, ink overlay); `Sheet` for the
seat picker / contextual editing. Both inherit 16px radius, no border, generous space.
### Badge, Switch, Slider, Tooltip, Separator, Checkbox, Dropdown-menu
`Badge` carries the heat-scale vocabulary (open=ink, filling=`--warning`, almost-gone
=`--destructive`, sold-out=ink-on-accent). `Switch` = settings/reminders (on = ember).
`Slider` = capacity. `Tooltip` = concise mono notes. `Separator` = white-gap rhythm,
never a grey line. `Checkbox` and `dropdown-menu` carry visible focus + grouped
choices.
## Preview shots
- `application-shell`: a season workspace — navigation, programme summary cards, filters, and the dense schedule region.
- `detail-editor`: a reserve / programme editor — labelled fields, validation, a switch, and a confirm dialog.
- `data-operations`: a box-office review queue — table rows, heat-scale badges, a dropdown menu, tooltips, and destructive/empty states.
- Each preview shot carries a renderable `scene` (headline, description, actions, and rows/fields/stats).
## Implementation contract
- Start from the local `@/components/ui/*` shadcn primitives; do not create a second component system.
- Apply `/katagami/shadcn/civic-press/registry-theme.json` variables first, then compose with these recipes.
- Keep Katagami token names as source metadata; shadcn semantic names are only the export surface.
- Do: let ember (`--accent`/`--primary`) mean scarcity; set metadata in mono; keep ink for text and dense data; give titles room.
- Do not: tint backgrounds, use gradients, add borders, spend ember decoratively, or collapse the language into generic shadcn defaults.
## Copy-paste component example
This shows the import shape and a real Civic Press 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 { Progress } from "@/components/ui/progress";
// A programme card: ink-tinted surface, mono caption, heat-scale demand.
export function ProgrammeCard() {
return (
<Card className="rounded-[var(--radius)] border-0 bg-card text-card-foreground">
<CardHeader>
<Badge className="bg-destructive/10 text-destructive">almost gone</Badge>
<CardTitle className="mt-2 text-2xl">Julie Okada Trio</CardTitle>
<CardDescription className="font-mono text-xs uppercase tracking-widest">
FRI 27 JUN · 20:00 · Hafenbühne · €18 / €12
</CardDescription>
</CardHeader>
<CardContent>
<Progress value={96} className="h-2" />
<p className="mt-2 font-mono text-xs text-muted-foreground">6 of 180 left</p>
</CardContent>
<CardFooter className="justify-between">
<span className="font-mono text-xs text-muted-foreground">90 min</span>
<Button>Reserve seats</Button>
</CardFooter>
</Card>
);
}
```
## Layout notes
```json
{ "grid": "12-column, visible, asymmetric", "density": "tiered: hero loose → schedule dense → metadata fine print", "radii": "0 / 16 / 9999", "no_borders": true }
```
{
"artifact": "katagami:shadcn-preview-shots",
"version": "preview-shots-v1",
"author": "katagami-agent",
"generatedBy": "katagami-agent",
"requiresVisualProfile": true,
"schema": "katagami:shadcn-preview-shots/renderable-v1",
"renderable": true,
"language": {
"id": "en-019ef0b3-a14b-72c0-9a42-43d321d3b627",
"name": "Civic Press",
"slug": "civic-press"
},
"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": [
"Colour is a live demand signal — ember means scarcity, never decoration.",
"Heat scale across every status surface: open=ink, filling=warning, almost-gone=destructive, sold-out=ink-on-accent.",
"Visible construction grid; mono caption layer; ink working-blocks; no borders; radius 16px."
],
"visualProfile": {
"family": "constructivist-grid",
"material": "flat",
"contour": "default",
"border": "none",
"underlay": false,
"grain": false,
"stickerBadges": false,
"motion": "still",
"density": "balanced",
"accents": ["primary", "accent", "success", "warning"]
},
"shots": [
{
"id": "application-shell",
"title": "Season workspace",
"viewport": "desktop",
"primitives": ["button", "card", "input", "select", "tabs", "badge", "separator", "table"],
"composition": "A cultural-house operations workspace: left nav, season KPI cards, a filter row, and the dense programme schedule with heat-scale status badges.",
"mustShow": ["primary (ember) vs secondary (ink) actions", "card surface + mono caption", "filter/select state", "schedule table density with heat-scale badges"],
"avoid": ["component inventory walls", "placeholder-only content", "grey borders or dividers", "generic SaaS chrome"],
"scene": {
"eyebrow": "forum ops",
"headline": "Season overview — Neues Forum",
"description": "A programme team's workspace where navigation, KPIs, filters, and dense rows carry the heat scale and the visible grid.",
"primaryAction": "New programme",
"secondaryAction": "Export schedule",
"stats": [
{ "label": "visitors / season", "value": "128k", "tone": "ink" },
{ "label": "fill rate", "value": "86%", "tone": "success" },
{ "label": "almost gone", "value": "3", "tone": "destructive" }
],
"rows": [
{ "label": "Building for everyone", "value": "Halle 1 · free", "status": "open" },
{ "label": "City in flux", "value": "Auditorium · 38 left", "status": "filling" },
{ "label": "Julie Okada Trio", "value": "Hafenbühne · 6 left", "status": "almost-gone" },
{ "label": "Harbour Lights", "value": "Café · 0 left", "status": "sold-out" }
],
"statuses": ["Open", "Filling", "Almost gone", "Sold out"]
}
},
{
"id": "detail-editor",
"title": "Reserve a programme",
"viewport": "tablet",
"primitives": ["button", "card", "input", "textarea", "select", "checkbox", "switch", "slider", "dialog", "sheet"],
"composition": "A focused reservation / programme-editing flow: labelled fields, a validation state, a reminder switch, a capacity slider, and a confirm dialog.",
"mustShow": ["ember focus ring on inputs", "an invalid (destructive) state", "confirm dialog treatment", "real programme content, not placeholders"],
"avoid": ["unstyled browser controls", "missing labels", "cards floating inside cards"],
"scene": {
"eyebrow": "reserve",
"headline": "Reserve — Julie Okada Trio",
"description": "A reservation form proving labels, validation, a reminder toggle, capacity, and a confirm decision.",
"primaryAction": "Confirm reservation",
"secondaryAction": "Hold seats",
"fields": [
{ "label": "Name", "value": "Rita Mirai", "type": "text" },
{ "label": "Email", "value": "rita@ — enter a valid email", "type": "invalid" },
{ "label": "Concession", "value": "Reduced · €12", "type": "select" },
{ "label": "Remind me Monday", "value": "on", "type": "switch" }
],
"statuses": ["Focus", "Invalid", "Confirmed"]
}
},
{
"id": "data-operations",
"title": "Box-office queue",
"viewport": "mobile",
"primitives": ["button", "tabs", "badge", "dropdown-menu", "table", "tooltip", "separator"],
"composition": "A narrow box-office review queue: stacked rows, per-row dropdown actions, heat-scale badges, tooltips, and destructive / empty states.",
"mustShow": ["responsive reflow", "dense row rhythm", "row action menu", "heat-scale badge system", "a sold-out / empty state"],
"avoid": ["desktop-only tables", "text overflow", "default shadcn spacing without Civic Press character"],
"scene": {
"eyebrow": "box office",
"headline": "Returns & waitlist",
"description": "A compact queue with rows, menus, tooltips, heat-scale badges, and a sold-out destructive affordance.",
"primaryAction": "Release returns",
"secondaryAction": "Filter",
"rows": [
{ "label": "Trio · returns", "value": "2 released", "status": "almost-gone" },
{ "label": "Panel · waitlist", "value": "11 waiting", "status": "filling" },
{ "label": "Film · café", "value": "no seats", "status": "sold-out" }
],
"statuses": ["Released", "Waitlist", "Sold out"]
}
}
],
"componentRecipes": [
{ "primitive": "button", "intent": "Action hierarchy: ember primary = the one dominant action; ink secondary; ghost keeps the surface; disabled = sold out; ember focus ring." },
{ "primitive": "card", "intent": "Programme frame: ink-4% surface, no border, 16px radius, mono caption row, heat-scale demand bar in the footer." },
{ "primitive": "input", "intent": "Labelled field on white, visible ember focus ring, destructive invalid state, real programme content." },
{ "primitive": "textarea", "intent": "Longer notes (access info, programme description) with the same focus + validation rhythm." },
{ "primitive": "select", "intent": "Programme / concession filtering with clear selection contrast and a tinted trigger." },
{ "primitive": "dialog", "intent": "Centered 'Confirm reservation' decision with an ink overlay; inherits 16px radius, no border." },
{ "primitive": "sheet", "intent": "Contextual side panel for the seat picker / editing on tablet+." },
{ "primitive": "tabs", "intent": "Switch Landing / Schedule / Ops; strong active vs inactive contrast, no underline-grey." },
{ "primitive": "badge", "intent": "Heat-scale status vocabulary: open=ink, filling=warning, almost-gone=destructive, sold-out=ink-on-accent." },
{ "primitive": "separator", "intent": "White-gap row rhythm — never a grey divider line." },
{ "primitive": "checkbox", "intent": "Opt-ins (newsletter, terms) with visible focus and checked contrast." },
{ "primitive": "switch", "intent": "Reminders / settings; on = ember, off = ink-12%." },
{ "primitive": "slider", "intent": "Capacity / price-range adjustment with ember track fill." },
{ "primitive": "tooltip", "intent": "Concise mono notes above compact controls (e.g. step-free access)." },
{ "primitive": "dropdown-menu", "intent": "Per-row box-office actions, grouped choices, a destructive 'cancel' item." },
{ "primitive": "table", "intent": "The schedule: mono header, ink-4% rows on white gaps, heat-scale status per row, sold-out empty state." }
],
"qualityRules": {
"do": [
"Let ember (--accent/--primary) mean scarcity; reserve it for live signals.",
"Set dates, venues, times and prices in mono, like a printed programme.",
"Keep ink for text, structure and dense data; give titles room.",
"Carry the heat scale through every status surface."
],
"dont": [
"Tint backgrounds or use gradients.",
"Add borders or grey dividers.",
"Spend ember decoratively or as a fourth accent.",
"Collapse the language into generic shadcn defaults."
]
}
}