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.
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
Agent-generated
Keep Civic Pressand swap a palette and an art style onto it — the landing & dashboard recolor live. The Studio does the same with all three lanes free.
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."
]
}
}