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.
Hang every screen from one continuous vertical custody spine: a 2px thread connecting circular seal nodes top to bottom. Embodiment = sticky spine rail + single descending deposition column; landing = full-viewport photostat hero with a centered low verdict bar, then the spine as section flow; dashboard = spine sidebar + live custody feed. Redaction appears only inline, cropping sworn text as mass.
Tribunal register: uppercase Archivo 900 docket headings at -0.02em, IBM Plex Mono timestamps/hashes/labels, Inter body at 17px. Seal nodes outrank everything; cyan is the only verified light and is always countable.
Dense threaded transcript rhythm beside large sealed negative space — a deposition given under oath, never a packed console.
The custody spine (threaded seal nodes), tamper-seal state chips (sealed cyan / quorum brass / contested oxblood), inline redaction mass, and a centered verdict bar.
Desktop: a 248-300px spine rail (sticky) + a single descending column, max-width ~1280px. Dashboard uses a spine sidebar + a 1.55fr/1fr content grid.
Tribunal calm: 64-96px section gaps, 24-32px sheet padding, 13-16px node rhythm on the spine; sealed fields feel intentionally untouched.
High-contrast density: dense threaded custody rows beside large quiet sealed fields.
Below ~980px the spine rail unsticks and stacks above the column; tables collapse to two columns hiding hashes; nav links hide on mobile; never overflow horizontally; body stays 16px+.
exhibit-hand
Full-bleed declassified evidence photostat: harsh high-contrast black-and-white photocopy, coarse halftone grain, solid black redaction bars cropping the subject as mass, hairline registration brackets, docket hash stamps, and one flat matte cyan verification tick. Composed darkest at the bottom so a centered verdict bar reads cleanly.
Hero and feature imagery is full-frame photostat bleeding to all four edges; keep cyan countable, redaction bars solid and opaque, no glow or readable secret text.
# Bulla ## Philosophy Bulla treats interface work the way a tribunal treats a sworn exhibit: not a static case file on a cold desk but a living deposition — a single unbroken thread of custody, pressed at every step, reconstructed top to bottom on a deep oxblood-tribunal ground, where the only verified light you ever have to count is one cyan node. ### Values - Custody is the proof: every screen hangs from one continuous custody spine, and a record is admitted only when the thread runs unbroken from intake to verdict. - Countable light: three accents and no more — cyan verifies, brass presses, oxblood contests — sparse enough to count on any screen. - Redaction as inline mass: censorship crops sworn text in place as a structural block, never a decorative stripe. - Forensic tribunal calm: warm near-black ground, exact mono labels, sealed negative space that reads interrogation-room, not console. - Provenance as ornament: seal nodes, hashes, timestamps and sworn statements are the only decorative system. ### Anti-Values - No static paper-desk case file, checksum gutter rails, or hard-square scanner sheets — that is the source refinement's grammar, not Bulla's. - No glow, neon, matrix code, glowing skulls, or hacker-dashboard spectacle. - No fourth accent and no scattering color until the seal can no longer be counted. - No glassmorphism, blur theatrics, or friendly rounded pill cards trapping the chrome. - No filling every field; sealed negative space is part of the tribunal calm. ## Tokens ### Colors | Name | Value | |------|-------| | bg | `#14100F` | | surface | `#1E1917` | | surface_2 | `#262020` | | sunk | `#0D0A09` | | text | `#F3EEE7` | | muted | `#9C918A` | | faint | `#5C534E` | | border | `#352D2A` | | accent | `#5BC8E6` | | on_accent | `#0D0A09` | | seal | `#C8A24A` | | alarm | `#C84A3E` | | primary | `#5BC8E6` | | secondary | `#C8A24A` | | success | `#5BC8E6` | | warning | `#C8A24A` | | error | `#C84A3E` | | info | `#5BC8E6` | ### Typography - **Base Size**: 17px - **Body Font**: Inter - **Heading Font**: Archivo - **Mono Font**: IBM Plex Mono - **Heading Weight**: 900 - **Heading Transform**: uppercase - **Letter Spacing**: -0.02em - **Google Fonts Url**: https://fonts.googleapis.com/css2?family=Archivo:wght@500;600;800;900&family=IBM+Plex+Mono:ital,wght@0,400;0,500;1,400&family=Inter:wght@400;500;600&display=swap ### Radii - **None**: 0 - **Sm**: 0 - **Md**: 16px - **Lg**: 16px - **Node**: 9999px ### Shadows - **Sm**: 0 1px 2px rgba(0,0,0,.4) - **Md**: 0 8px 24px rgba(0,0,0,.45) ### Spacing - **Base**: 8px - **Scale**: [4,8,12,16,24,32,48,64,96] ### Surfaces - **Bg Pattern**: Faint warm photocopy-grain dots on a deep oxblood-tribunal near-black; no rule grid, no glass. - **Card Style**: Warm-charcoal evidence sheets, 1px warm hairline border, 16px radius, soft depth shadow, mono index stamp + uppercase Archivo title; never an accent edge, never nested. - **Treatment**: Warm near-black ground stepping up to charcoal surfaces and a recessed vault-floor well; flat, matte, no glow. ### Borders - **Default Width**: 1px - **Accent Width**: 2px - **Style**: solid - **Character**: 1px warm hairline dividers; a single cyan focus ring; seal nodes carry the only colored rings. ### Motion - **Duration**: 160ms - **Easing**: cubic-bezier(0.2,0,0,1) - **Philosophy**: Short and deliberate, like a seal pressing shut. The hero verdict bar wipes closed left-to-right; sections reveal on scroll. The settled page renders without JavaScript; reveals are layered on top and respect prefers-reduced-motion. ## Rules ### Composition Hang every screen from one continuous vertical custody spine: a 2px thread connecting circular seal nodes top to bottom. Embodiment = sticky spine rail + single descending deposition column; landing = full-viewport photostat hero with a centered low verdict bar, then the spine as section flow; dashboard = spine sidebar + live custody feed. Redaction appears only inline, cropping sworn text as mass. ### Hierarchy Tribunal register: uppercase Archivo 900 docket headings at -0.02em, IBM Plex Mono timestamps/hashes/labels, Inter body at 17px. Seal nodes outrank everything; cyan is the only verified light and is always countable. ### Density Dense threaded transcript rhythm beside large sealed negative space — a deposition given under oath, never a packed console. ### Signature The custody spine (threaded seal nodes), tamper-seal state chips (sealed cyan / quorum brass / contested oxblood), inline redaction mass, and a centered verdict bar. ## Layout ### Grid Desktop: a 248-300px spine rail (sticky) + a single descending column, max-width ~1280px. Dashboard uses a spine sidebar + a 1.55fr/1fr content grid. ### Whitespace Tribunal calm: 64-96px section gaps, 24-32px sheet padding, 13-16px node rhythm on the spine; sealed fields feel intentionally untouched. ### Density High-contrast density: dense threaded custody rows beside large quiet sealed fields. ### Responsive Below ~980px the spine rail unsticks and stacks above the column; tables collapse to two columns hiding hashes; nav links hide on mobile; never overflow horizontally; body stays 16px+. ### Breakpoints - **Desktop**: >=980px spine rail + descending column - **Tablet**: 720-979px stacked spine over column - **Mobile**: <720px single-file deposition, spine inlined, tables to two columns ## Guidance ### Do - Hang every screen from one custody spine and let the thread carry continuity. - Keep the three accents countable; one cyan node is the verified light. - Crop sworn text with inline redaction as mass, never as decoration. - Name modules as tribunal operations: intake, deposition, hash match, challenge, re-press, verdict. - Tune neutrals warm so the dark ground never reads cold-blue. - Make one button clearly primary (Press the seal); keep the rest quieter. ### Don't - Do not rebuild the refinement's static paper desk, checksum gutter rails, or hard-square scanner sheets. - Do not add glow, neon, matrix code, or hacker-dashboard spectacle. - Do not let a fourth accent creep in or scatter color until the seal can't be counted. - Do not trap navigation in a floating pill bar or nest cards. - Do not fill every field; sealed negative space is part of the tribunal calm. ### Accessibility Maintain AA contrast with bone text on the deep warm ground; pair every cyan/brass/oxblood seal node with a text label (never color-only); provide a visible cyan focus ring on every control; keep redaction non-essential to comprehension. ## Imagery Direction ### Pairs With exhibit-hand ### Summary Full-bleed declassified evidence photostat: harsh high-contrast black-and-white photocopy, coarse halftone grain, solid black redaction bars cropping the subject as mass, hairline registration brackets, docket hash stamps, and one flat matte cyan verification tick. Composed darkest at the bottom so a centered verdict bar reads cleanly. ### Subjects - sealed evidence-locker corridors - pressed lead-and-wax custody seals - deposition-room exhibits - forensic mugshot-style portraits - near-blank sealed exhibit sheets ### Usage Hero and feature imagery is full-frame photostat bleeding to all four edges; keep cyan countable, redaction bars solid and opaque, no glow or readable secret text.
---
version: "alpha"
name: "Bulla"
description: "Agent-curated design language exported from Katagami as DESIGN.md."
colors:
bg: "#14100F"
surface: "#1E1917"
surface_2: "#262020"
sunk: "#0D0A09"
text: "#F3EEE7"
muted: "#9C918A"
faint: "#5C534E"
border: "#352D2A"
accent: "#5BC8E6"
on_accent: "#0D0A09"
seal: "#C8A24A"
alarm: "#C84A3E"
primary: "#5BC8E6"
secondary: "#C8A24A"
success: "#5BC8E6"
warning: "#C8A24A"
error: "#C84A3E"
info: "#5BC8E6"
typography:
headline-lg:
fontFamily: "Archivo"
fontSize: "2.075rem"
fontWeight: 700
lineHeight: 1.1
letterSpacing: "-0.02em"
headline-md:
fontFamily: "Archivo"
fontSize: "1.66rem"
fontWeight: 600
lineHeight: 1.15
letterSpacing: "-0.02em"
body-md:
fontFamily: "Inter"
fontSize: "17px"
fontWeight: 400
lineHeight: 1.5
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"
node: "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-surface:
backgroundColor: "{colors.surface}"
color-reference-surface_2:
backgroundColor: "{colors.surface_2}"
color-reference-sunk:
backgroundColor: "{colors.sunk}"
color-reference-text:
backgroundColor: "{colors.text}"
color-reference-muted:
backgroundColor: "{colors.muted}"
color-reference-faint:
backgroundColor: "{colors.faint}"
color-reference-border:
backgroundColor: "{colors.border}"
color-reference-accent:
backgroundColor: "{colors.accent}"
color-reference-on_accent:
backgroundColor: "{colors.on_accent}"
color-reference-seal:
backgroundColor: "{colors.seal}"
color-reference-alarm:
backgroundColor: "{colors.alarm}"
color-reference-primary:
backgroundColor: "{colors.primary}"
color-reference-secondary:
backgroundColor: "{colors.secondary}"
color-reference-success:
backgroundColor: "{colors.success}"
color-reference-warning:
backgroundColor: "{colors.warning}"
color-reference-error:
backgroundColor: "{colors.error}"
color-reference-info:
backgroundColor: "{colors.info}"
button-primary:
backgroundColor: "{colors.primary}"
textColor: "#000000"
typography: "{typography.label-md}"
rounded: "{rounded.md}"
padding: "{spacing.md}"
card-surface:
backgroundColor: "{colors.surface}"
textColor: "{colors.text}"
rounded: "{rounded.md}"
padding: "{spacing.md}"
input-default:
backgroundColor: "{colors.surface}"
textColor: "{colors.text}"
rounded: "{rounded.md}"
height: "44px"
---
# Bulla
## Overview
Bulla treats interface work the way a tribunal treats a sworn exhibit: not a static case file on a cold desk but a living deposition — a single unbroken thread of custody, pressed at every step, reconstructed top to bottom on a deep oxblood-tribunal ground, where the only verified light you ever have to count is one cyan node.
### Values
- Custody is the proof: every screen hangs from one continuous custody spine, and a record is admitted only when the thread runs unbroken from intake to verdict.
- Countable light: three accents and no more — cyan verifies, brass presses, oxblood contests — sparse enough to count on any screen.
- Redaction as inline mass: censorship crops sworn text in place as a structural block, never a decorative stripe.
- Forensic tribunal calm: warm near-black ground, exact mono labels, sealed negative space that reads interrogation-room, not console.
- Provenance as ornament: seal nodes, hashes, timestamps and sworn statements are the only decorative system.
### Anti-Values
- No static paper-desk case file, checksum gutter rails, or hard-square scanner sheets — that is the source refinement's grammar, not Bulla's.
- No glow, neon, matrix code, glowing skulls, or hacker-dashboard spectacle.
- No fourth accent and no scattering color until the seal can no longer be counted.
- No glassmorphism, blur theatrics, or friendly rounded pill cards trapping the chrome.
- No filling every field; sealed negative space is part of the tribunal calm.
## 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 | `#14100F` |
| surface | `#1E1917` |
| surface_2 | `#262020` |
| sunk | `#0D0A09` |
| text | `#F3EEE7` |
| muted | `#9C918A` |
| faint | `#5C534E` |
| border | `#352D2A` |
| accent | `#5BC8E6` |
| on_accent | `#0D0A09` |
| seal | `#C8A24A` |
| alarm | `#C84A3E` |
| primary | `#5BC8E6` |
| secondary | `#C8A24A` |
| success | `#5BC8E6` |
| warning | `#C8A24A` |
| error | `#C84A3E` |
| info | `#5BC8E6` |
## Typography
- **Headline-Lg**: Archivo, 2.075rem, weight 700, line-height 1.1.
- **Headline-Md**: Archivo, 1.66rem, weight 600, line-height 1.15.
- **Body-Md**: Inter, 17px, weight 400, line-height 1.5.
- **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
Desktop: a 248-300px spine rail (sticky) + a single descending column, max-width ~1280px. Dashboard uses a spine sidebar + a 1.55fr/1fr content grid.
### Whitespace
Tribunal calm: 64-96px section gaps, 24-32px sheet padding, 13-16px node rhythm on the spine; sealed fields feel intentionally untouched.
### Density
High-contrast density: dense threaded custody rows beside large quiet sealed fields.
### Responsive
Below ~980px the spine rail unsticks and stacks above the column; tables collapse to two columns hiding hashes; nav links hide on mobile; never overflow horizontally; body stays 16px+.
### Breakpoints
- **Desktop**: >=980px spine rail + descending column
- **Tablet**: 720-979px stacked spine over column
- **Mobile**: <720px single-file deposition, spine inlined, tables to two columns
## Elevation & Depth
### Shadows
- **Sm**: 0 1px 2px rgba(0,0,0,.4)
- **Md**: 0 8px 24px rgba(0,0,0,.45)
## Shapes
### Rounded
- **None**: `0px`
- **Sm**: `0px`
- **Md**: `16px`
- **Lg**: `16px`
- **Node**: `9999px`
### Surfaces
- **Bg Pattern**: Faint warm photocopy-grain dots on a deep oxblood-tribunal near-black; no rule grid, no glass.
- **Card Style**: Warm-charcoal evidence sheets, 1px warm hairline border, 16px radius, soft depth shadow, mono index stamp + uppercase Archivo title; never an accent edge, never nested.
- **Treatment**: Warm near-black ground stepping up to charcoal surfaces and a recessed vault-floor well; flat, matte, no glow.
### Borders
- **Default Width**: 1px
- **Accent Width**: 2px
- **Style**: solid
- **Character**: 1px warm hairline dividers; a single cyan focus ring; seal nodes carry the only colored rings.
## Components
### Composition
Hang every screen from one continuous vertical custody spine: a 2px thread connecting circular seal nodes top to bottom. Embodiment = sticky spine rail + single descending deposition column; landing = full-viewport photostat hero with a centered low verdict bar, then the spine as section flow; dashboard = spine sidebar + live custody feed. Redaction appears only inline, cropping sworn text as mass.
### Hierarchy
Tribunal register: uppercase Archivo 900 docket headings at -0.02em, IBM Plex Mono timestamps/hashes/labels, Inter body at 17px. Seal nodes outrank everything; cyan is the only verified light and is always countable.
### Density
Dense threaded transcript rhythm beside large sealed negative space — a deposition given under oath, never a packed console.
### Signature
The custody spine (threaded seal nodes), tamper-seal state chips (sealed cyan / quorum brass / contested oxblood), inline redaction mass, and a centered verdict bar.
## 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-019efa10-5a85-7e00-ae76-b90080f04a69/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 Hang every screen from one custody spine and let the thread carry continuity.
- Do Keep the three accents countable; one cyan node is the verified light.
- Do Crop sworn text with inline redaction as mass, never as decoration.
- Do Name modules as tribunal operations: intake, deposition, hash match, challenge, re-press, verdict.
- Do Tune neutrals warm so the dark ground never reads cold-blue.
- Do Make one button clearly primary (Press the seal); keep the rest quieter.
- Don't Do not rebuild the refinement's static paper desk, checksum gutter rails, or hard-square scanner sheets.
- Don't Do not add glow, neon, matrix code, or hacker-dashboard spectacle.
- Don't Do not let a fourth accent creep in or scatter color until the seal can't be counted.
- Don't Do not trap navigation in a floating pill bar or nest cards.
- Don't Do not fill every field; sealed negative space is part of the tribunal calm.
### Accessibility
Maintain AA contrast with bone text on the deep warm ground; pair every cyan/brass/oxblood seal node with a text label (never color-only); provide a visible cyan focus ring on every control; keep redaction non-essential to comprehension.
## Imagery Direction
### Pairs With
exhibit-hand
### Summary
Full-bleed declassified evidence photostat: harsh high-contrast black-and-white photocopy, coarse halftone grain, solid black redaction bars cropping the subject as mass, hairline registration brackets, docket hash stamps, and one flat matte cyan verification tick. Composed darkest at the bottom so a centered verdict bar reads cleanly.
### Subjects
- sealed evidence-locker corridors
- pressed lead-and-wax custody seals
- deposition-room exhibits
- forensic mugshot-style portraits
- near-blank sealed exhibit sheets
### Usage
Hero and feature imagery is full-frame photostat bleeding to all four edges; keep cyan countable, redaction bars solid and opaque, no glow or readable secret text.
```json
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "bulla",
"type": "registry:theme",
"title": "Bulla shadcn Theme",
"cssVars": {
"theme": {},
"light": {
"background": "#14100F",
"foreground": "#F3EEE7",
"card": "#1E1917",
"card-foreground": "#F3EEE7",
"popover": "#1E1917",
"popover-foreground": "#F3EEE7",
"primary": "#5BC8E6",
"primary-foreground": "#ffffff",
"secondary": "#C8A24A",
"secondary-foreground": "#ffffff",
"muted": "#9C918A",
"muted-foreground": "#F3EEE7",
"accent": "#5BC8E6",
"accent-foreground": "#ffffff",
"destructive": "#C84A3E",
"border": "#352D2A",
"input": "#352D2A",
"ring": "#5BC8E6",
"chart-1": "#5BC8E6",
"chart-2": "#C8A24A",
"chart-3": "#5BC8E6",
"chart-4": "#5BC8E6",
"chart-5": "#C8A24A",
"sidebar": "#1E1917",
"sidebar-foreground": "#F3EEE7",
"sidebar-primary": "#5BC8E6",
"sidebar-primary-foreground": "#ffffff",
"sidebar-accent": "#5BC8E6",
"sidebar-accent-foreground": "#ffffff",
"sidebar-border": "#352D2A",
"sidebar-ring": "#5BC8E6",
"radius": "16px"
},
"dark": {
"background": "#0f1115",
"foreground": "#f8fafc",
"card": "#181b22",
"card-foreground": "#f8fafc",
"popover": "#181b22",
"popover-foreground": "#f8fafc",
"primary": "#5BC8E6",
"primary-foreground": "#ffffff",
"secondary": "#252a33",
"secondary-foreground": "#f8fafc",
"muted": "#252a33",
"muted-foreground": "#a1a1aa",
"accent": "#5BC8E6",
"accent-foreground": "#ffffff",
"destructive": "#C84A3E",
"border": "#303642",
"input": "#303642",
"ring": "#5BC8E6",
"chart-1": "#5BC8E6",
"chart-2": "#C8A24A",
"chart-3": "#5BC8E6",
"chart-4": "#5BC8E6",
"chart-5": "#C8A24A",
"sidebar": "#181b22",
"sidebar-foreground": "#f8fafc",
"sidebar-primary": "#5BC8E6",
"sidebar-primary-foreground": "#ffffff",
"sidebar-accent": "#5BC8E6",
"sidebar-accent-foreground": "#ffffff",
"sidebar-border": "#303642",
"sidebar-ring": "#5BC8E6",
"radius": "16px"
}
},
"meta": {
"source": "katagami",
"languageId": "en-019efa10-5a85-7e00-ae76-b90080f04a69",
"slug": "bulla",
"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",
"alarm",
"bg",
"border",
"error",
"faint",
"info",
"muted",
"on_accent",
"primary",
"seal",
"secondary",
"success",
"sunk",
"surface",
"surface_2",
"text",
"warning"
],
"typography": [
"base_size",
"body_font",
"google_fonts_url",
"heading_font",
"heading_transform",
"heading_weight",
"letter_spacing",
"mono_font"
],
"radii": [
"lg",
"md",
"node",
"none",
"sm"
],
"shadows": [
"md",
"sm"
],
"spacing": [
"base",
"scale"
],
"surfaces": [
"bg_pattern",
"card_style",
"treatment"
],
"borders": [
"accent_width",
"character",
"default_width",
"style"
],
"motion": [
"duration",
"easing",
"philosophy"
]
}
}
}
```The quick brown fox jumps
The quick brown fox jumps
The quick brown fox jumps
The quick brown fox jumps
Agent-generated
Keep Bullaand swap a palette and an art style onto it — the landing & dashboard recolor live. The Studio does the same with all three lanes free.
Copy this when the target app uses shadcn/ui. It packages the Katagami DESIGN.md context with the install list, theme variables, component recipes, preview-shot contract, and starter TSX in one Markdown companion.
npx shadcn@latest add button card input textarea select dialog sheet tabs badge separator checkbox switch slider tooltip dropdown-menu table:root {
--background: #14100F;
--foreground: #F3EEE7;
--card: #1E1917;
--card-foreground: #F3EEE7;
--popover: #1E1917;
--popover-foreground: #F3EEE7;
--primary: #5BC8E6;
--primary-foreground: #ffffff;
--secondary: #C8A24A;
--secondary-foreground: #ffffff;
--muted: #9C918A;
--muted-foreground: #F3EEE7;
--accent: #5BC8E6;
--accent-foreground: #ffffff;
--destructive: #C84A3E;
--border: #352D2A;
--input: #352D2A;
--ring: #5BC8E6;
--chart-1: #5BC8E6;
--chart-2: #C8A24A;
--chart-3: #5BC8E6;
--chart-4: #5BC8E6;
--chart-5: #C8A24A;
--sidebar: #1E1917;
--sidebar-foreground: #F3EEE7;
--sidebar-primary: #5BC8E6;
--sidebar-primary-foreground: #ffffff;
--sidebar-accent: #5BC8E6;
--sidebar-accent-foreground: #ffffff;
--sidebar-border: #352D2A;
--sidebar-ring: #5BC8E6;
--radius: 16px;
}
.dark {
--background: #0f1115;
--foreground: #f8fafc;
--card: #181b22;
--card-foreground: #f8fafc;
--popover: #181b22;
--popover-foreground: #f8fafc;
--primary: #5BC8E6;
--primary-foreground: #ffffff;
--secondary: #252a33;
--secondary-foreground: #f8fafc;
--muted: #252a33;
--muted-foreground: #a1a1aa;
--accent: #5BC8E6;
--accent-foreground: #ffffff;
--destructive: #C84A3E;
--border: #303642;
--input: #303642;
--ring: #5BC8E6;
--chart-1: #5BC8E6;
--chart-2: #C8A24A;
--chart-3: #5BC8E6;
--chart-4: #5BC8E6;
--chart-5: #C8A24A;
--sidebar: #181b22;
--sidebar-foreground: #f8fafc;
--sidebar-primary: #5BC8E6;
--sidebar-primary-foreground: #ffffff;
--sidebar-accent: #5BC8E6;
--sidebar-accent-foreground: #ffffff;
--sidebar-border: #303642;
--sidebar-ring: #5BC8E6;
--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 BullaShadcnKit() {
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">Bulla</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": "bulla",
"type": "registry:theme",
"author": "katagami-agent",
"cssVars": {
"theme": {
"font-sans": "Inter, system-ui, sans-serif",
"font-mono": "\"IBM Plex Mono\", ui-monospace, monospace",
"font-display": "Archivo, system-ui, sans-serif",
"radius": "16px"
},
"dark": {
"background": "#14100F",
"foreground": "#F3EEE7",
"card": "#1E1917",
"card-foreground": "#F3EEE7",
"popover": "#1E1917",
"popover-foreground": "#F3EEE7",
"primary": "#5BC8E6",
"primary-foreground": "#0D0A09",
"secondary": "#262020",
"secondary-foreground": "#F3EEE7",
"muted": "#262020",
"muted-foreground": "#9C918A",
"accent": "#C8A24A",
"accent-foreground": "#0D0A09",
"destructive": "#C84A3E",
"destructive-foreground": "#F3EEE7",
"border": "#352D2A",
"input": "#0D0A09",
"ring": "#5BC8E6",
"chart-1": "#5BC8E6",
"chart-2": "#C8A24A",
"chart-3": "#C84A3E",
"chart-4": "#9C918A",
"chart-5": "#F3EEE7",
"radius": "16px"
},
"light": {
"background": "#14100F",
"foreground": "#F3EEE7",
"card": "#1E1917",
"card-foreground": "#F3EEE7",
"popover": "#1E1917",
"popover-foreground": "#F3EEE7",
"primary": "#5BC8E6",
"primary-foreground": "#0D0A09",
"secondary": "#262020",
"secondary-foreground": "#F3EEE7",
"muted": "#262020",
"muted-foreground": "#9C918A",
"accent": "#C8A24A",
"accent-foreground": "#0D0A09",
"destructive": "#C84A3E",
"destructive-foreground": "#F3EEE7",
"border": "#352D2A",
"input": "#0D0A09",
"ring": "#5BC8E6",
"radius": "16px"
}
},
"visualProfile": {
"mode": "dark-only",
"ground": "#14100F",
"material": "flat warm-charcoal surfaces on a deep oxblood-tribunal ground; no glass, no glow",
"radius": "16px primary surfaces and inputs; 9999px for seal nodes, chips, and buttons; 0 reserved for hairline dividers",
"border": "1px warm hairline (#352D2A); single point of cyan focus ring; no accent edges on cards",
"elevation": "soft depth shadows only (0 8px 24px rgba(0,0,0,.45)); never hard offset scanner-bed shadows",
"accentUse": "three countable accents — cyan verifies (primary/ring), brass presses (accent/authority), oxblood contests (destructive); never a fourth",
"typography": "Archivo 900 uppercase display, IBM Plex Mono labels/timestamps, Inter 17px body",
"signature": "custody-spine thread with circular seal nodes; tamper-seal state chips; inline redaction as mass"
}
}
# Bulla shadcn/ui Components
Artifact: `component-recipes-v1`
Author: `katagami-ui-projection`
Language ID: `en-019efa10-5a85-7e00-ae76-b90080f04a69`
Slug: `bulla`
## Intent
Bulla treats interface work the way a tribunal treats a sworn exhibit: not a static case file on a cold desk but a living deposition — a single unbroken thread of custody, pressed at every step, reconstructed top to bottom on a deep oxblood-tribunal ground, where the only verified light you ever have to count is one cyan node.
## 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": "#14100F",
"surface": "#1E1917",
"surface_2": "#262020",
"sunk": "#0D0A09",
"text": "#F3EEE7",
"muted": "#9C918A",
"faint": "#5C534E",
"border": "#352D2A",
"accent": "#5BC8E6",
"on_accent": "#0D0A09",
"seal": "#C8A24A",
"alarm": "#C84A3E",
"primary": "#5BC8E6",
"secondary": "#C8A24A",
"success": "#5BC8E6",
"warning": "#C8A24A",
"error": "#C84A3E",
"info": "#5BC8E6"
}
Typography:
{
"base_size": "17px",
"body_font": "Inter",
"heading_font": "Archivo",
"mono_font": "IBM Plex Mono",
"heading_weight": "900",
"heading_transform": "uppercase",
"letter_spacing": "-0.02em",
"google_fonts_url": "https://fonts.googleapis.com/css2?family=Archivo:wght@500;600;800;900&family=IBM+Plex+Mono:ital,wght@0,400;0,500;1,400&family=Inter:wght@400;500;600&display=swap"
}
## Visual character to preserve
- Make the source language's structural identity visible in every component state.
## ShadSync visual profile
{
"family": "paper-collage",
"material": "paper",
"contour": "default",
"border": "solid",
"underlay": true,
"grain": true,
"stickerBadges": true,
"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/bulla/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: Hang every screen from one custody spine and let the thread carry continuity.; Keep the three accents countable; one cyan node is the verified light.; Crop sworn text with inline redaction as mass, never as decoration.; Name modules as tribunal operations: intake, deposition, hash match, challenge, re-press, verdict.; Tune neutrals warm so the dark ground never reads cold-blue.; Make one button clearly primary (Press the seal); keep the rest quieter.
- Do not: Do not rebuild the refinement's static paper desk, checksum gutter rails, or hard-square scanner sheets.; Do not add glow, neon, matrix code, or hacker-dashboard spectacle.; Do not let a fourth accent creep in or scatter color until the seal can't be counted.; Do not trap navigation in a floating pill bar or nest cards.; Do not fill every field; sealed negative space is part of the tribunal calm.
## 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 BullaShadcnKit() {
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">Bulla</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: a 248-300px spine rail (sticky) + a single descending column, max-width ~1280px. Dashboard uses a spine sidebar + a 1.55fr/1fr content grid.",
"whitespace": "Tribunal calm: 64-96px section gaps, 24-32px sheet padding, 13-16px node rhythm on the spine; sealed fields feel intentionally untouched.",
"density": "High-contrast density: dense threaded custody rows beside large quiet sealed fields.",
"responsive": "Below ~980px the spine rail unsticks and stacks above the column; tables collapse to two columns hiding hashes; nav links hide on mobile; never overflow horizontally; body stays 16px+.",
"breakpoints": {
"desktop": ">=980px spine rail + descending column",
"tablet": "720-979px stacked spine over column",
"mobile": "<720px single-file deposition, spine inlined, tables to two columns"
}
}
{
"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-019efa10-5a85-7e00-ae76-b90080f04a69",
"name": "Bulla",
"slug": "bulla"
},
"installCommand": "npx shadcn@latest add button card input textarea select dialog sheet tabs badge separator checkbox switch slider tooltip dropdown-menu table",
"primitives": [
"button",
"card",
"input",
"textarea",
"select",
"dialog",
"sheet",
"tabs",
"badge",
"separator",
"checkbox",
"switch",
"slider",
"tooltip",
"dropdown-menu",
"table"
],
"identityNotes": [],
"visualProfile": {
"family": "system",
"material": "flat",
"contour": "default",
"border": "solid",
"underlay": false,
"grain": false,
"stickerBadges": false,
"motion": "still",
"density": "balanced",
"accents": [
"primary",
"accent",
"secondary",
"muted"
]
},
"shots": [
{
"id": "application-shell",
"title": "Application shell",
"viewport": "desktop",
"primitives": [
"button",
"card",
"input",
"select",
"tabs",
"badge",
"separator",
"table"
],
"composition": "A real product workspace with navigation, summary cards, filtering controls, and one dense content region.",
"mustShow": [
"primary and secondary actions",
"card hierarchy",
"filterable state",
"table or list density"
],
"avoid": [
"component inventory walls",
"placeholder-only content",
"generic rounded SaaS chrome"
],
"scene": {
"eyebrow": "workspace spread",
"headline": "Bulla 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": [
"Hang every screen from one custody spine and let the thread carry continuity.",
"Keep the three accents countable; one cyan node is the verified light.",
"Crop sworn text with inline redaction as mass, never as decoration.",
"Name modules as tribunal operations: intake, deposition, hash match, challenge, re-press, verdict.",
"Tune neutrals warm so the dark ground never reads cold-blue.",
"Make one button clearly primary (Press the seal); keep the rest quieter."
],
"dont": [
"Do not rebuild the refinement's static paper desk, checksum gutter rails, or hard-square scanner sheets.",
"Do not add glow, neon, matrix code, or hacker-dashboard spectacle.",
"Do not let a fourth accent creep in or scatter color until the seal can't be counted.",
"Do not trap navigation in a floating pill bar or nest cards.",
"Do not fill every field; sealed negative space is part of the tribunal calm."
]
}
}