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.
Compose screens as cinematic cuts on a max-1360px shell: one dominant panel, one narrow console rail, asymmetric 7/5 or 5/4/3 column splits, black gutters breathing between. Open every module with a cue mark (ember square + mono label + phosphor timestamp). Let one oversized stroke-only numeral clip a panel corner per viewport. Spend ember only on what is live, primary, or just changed.
Medium-high inside readouts and ledgers, offset by open black pauses and cream panels holding blank fields. The tablet band gets its own two-column board; mobile stacks to one column with cue marks preserved above each section.
Antonio 700 uppercase at -0.02em for title cards and stat numerals; Afacad Flux at 17px+ for operational copy; Martian Mono 12/15px caps for every label, prompt, slug and table row. One strict scale — 12/15/17/21/27/34/43 plus two display clamps — and no one-off sizes. Scale and placement rank first; the ember cue confirms, never carries alone.
Desktop composes 7/5 and 5/4/3 column cuts with minmax(0,1fr) tracks so grids never blow out; a 230px app rail anchors dashboards.
Dense only inside readouts; the frame stays open and smoky so the interface breathes like a late-night room.
Black gutters are active negative space — at least 20px between panels, generous padding above every title, cream panels allowed large blank fields.
Display type shrinks with clamp() and wraps, never clips; buttons and chips never wrap — layouts stack instead; ultra-wide caps and centres the shell while only the hero spans 100vw.
Cinematic after-hours interiors and instruments lit by one warm practical against deep warm black: film grain, low key, ember highlights, black negative space left where panels sit.
Low-key photographic noir with visible grain; monochrome linework silhouettes may sit masked at low opacity behind panels.
The landing hero is an after-hours lounge seen from the quiet side — double bass, ember light streak, starfield window — composed to hold the title card in its black field.
# Nighthawk ## Philosophy Nighthawk is a design language for systems operated after midnight: a warm near-black stage, cream paper tickets, one ember accent used like a reel-change cue, and gold phosphor readouts paced like jazz cuts. It keeps the discipline of a 90s anime title card and the restraint of a noir lounge — clipped panels, cue marks, and quiet tension between the hits. ### Values - Restraint before decoration: warm black, cream paper and one ember cue carry the identity; everything else stays small and functional. - Cinematic pacing: screens are edited as cuts — a dominant panel, a narrow console rail, black gutters as active negative space. - Diegetic utility: every module opens with a cue mark — an ember square, a mono label, a phosphor timestamp — so the page reads as a cue sheet being worked, not a display. - One machine voice: Martian Mono carries every prompt, slug, timestamp and table row; the interface speaks in phosphor. - Typographic authority: condensed Antonio title cards and stroke-only ghost numerals build hierarchy before any icon or illustration. - Existential calm: black pauses between dense readouts; nothing fills every gap. ### Anti-Values - Generic cyberpunk neon, blue-purple gradients, hologram glow, or rain-soaked clutter. - Cute anime lettering, mascots, stickers, or pastel accents that break the noir tone. - Accent-edge rails, grey card borders, nested cards, or boxed pill navigation. - Component-catalog sameness: equal columns of identical cards with no cinematic cut. - Texture for its own sake — scanlines and grain stay masked, low-opacity, structural. ### Visual Character - A warm near-black page shell where cream paper panels and smoked console panels cut against each other asymmetrically. - Cue marks recurring page-wide: ember squares on wordmarks, section heads, chips, checkboxes, stat labels and list feet. - Phosphor mono readouts — prompts, timestamps, diagnostic micro-labels — in dim gold on smoked ground under a faint scanline mask. - Oversized stroke-only Antonio numerals clipping through panel corners like title-card frame numbers. - Square terminal geometry: hairlines only inside tables and under form fields, value jumps instead of borders, almost no shadow. ## Tokens ### Colors | Name | Value | |------|-------| | bg | `#0A0908` | | surface | `#171310` | | surface_solid | `#171310` | | text | `#F5EBD4` | | muted | `#9B8E78` | | border | `#2A2520` | | accent | `#C1502F` | | accent_2 | `#B78B45` | | accent_soft | `#27140E` | | on_accent | `#FBF1DC` | | success | `#8A9A5B` | | warning | `#C17A2B` | | error | `#D0452B` | | info | `#B78B45` | ### Typography - **Base Size**: 17px - **Body Font**: Afacad Flux - **Heading Font**: Antonio - **Mono Font**: Martian Mono - **Heading Weight**: 700 - **Heading Transform**: uppercase - **Letter Spacing**: -0.02em - **Line Height**: 1.55 - **Scale Ratio**: 1.26 - **Google Fonts Url**: https://fonts.googleapis.com/css2?family=Afacad+Flux:wght@400;500;600;700&family=Antonio:wght@500;600;700&family=Martian+Mono:wght@400;500;600;700&display=swap ### Radii - **None**: 0px - **Md**: 16px - **Lg**: 24px - **Full**: 9999px ### Shadows - **Sm**: 0 1px 0 rgba(245,235,212,0.06) - **Md**: 0 24px 60px rgba(0,0,0,0.34) - **Lg**: 0 40px 120px rgba(0,0,0,0.48) ### Spacing - **Base**: 8px - **Scale**: [4,8,12,16,24,32,48,64,96,128] ### Surfaces - **Treatment**: Flat matte fields; hierarchy comes from the cream-paper-on-warm-black value jump, not borders or shadows. - **Card Style**: Square cream paper tickets and smoked console panels in black gutters; each opens with a cue mark; a stroke-only ghost numeral may clip one corner. - **Bg Pattern**: Warm black field; console panels may carry a repeating-linear-gradient scanline mask at or under 4% opacity and sparse mono coordinate ticks. ### Borders - **Default Width**: 1px - **Accent Width**: 2px - **Style**: solid - **Character**: Hairline dividers live only inside tables and as 2px form-field baselines that ignite ember on focus; cards and panels carry no borders and no accent edges. ### Motion - **Duration**: 180ms - **Easing**: cubic-bezier(0.2, 0.8, 0.2, 1) - **Philosophy**: Cut like a title sequence: opacity snaps and short lateral shifts; the settled page is the no-JS default; prefers-reduced-motion collapses everything. ## Rules ### Composition Compose screens as cinematic cuts on a max-1360px shell: one dominant panel, one narrow console rail, asymmetric 7/5 or 5/4/3 column splits, black gutters breathing between. Open every module with a cue mark (ember square + mono label + phosphor timestamp). Let one oversized stroke-only numeral clip a panel corner per viewport. Spend ember only on what is live, primary, or just changed. ### Density Medium-high inside readouts and ledgers, offset by open black pauses and cream panels holding blank fields. The tablet band gets its own two-column board; mobile stacks to one column with cue marks preserved above each section. ### Hierarchy Antonio 700 uppercase at -0.02em for title cards and stat numerals; Afacad Flux at 17px+ for operational copy; Martian Mono 12/15px caps for every label, prompt, slug and table row. One strict scale — 12/15/17/21/27/34/43 plus two display clamps — and no one-off sizes. Scale and placement rank first; the ember cue confirms, never carries alone. ### Signature Patterns - The cue mark: a 7-12px ember square, a Martian Mono caps label and a phosphor timestamp opening every page, panel, chip, checkbox and stat. - The cue sweep: links carry a 2px ember baseline that floods to a full ember fill on hover. - Paper tickets: cream panels in black gutters with Antonio heads, mono meta slugs, and a stroke-only ghost numeral clipping the corner. - Phosphor readouts: >-prompted mono feeds in dim gold on smoked panels under a masked 4%-opacity scanline. - Segmented meters: twelve square cells filling in ember or phosphor with a mono readout line. - The docking ledger: mono tables with hairline rows, muted caps headers, an ember hover wash and coloured status words. ## Layout ### Breakpoints - **Mobile**: 390px-767px single column, 20px gutters, decorative numerals clamped, non-essential nav and table columns dropped - **Tablet**: 768px-1023px its own considered board: two-column cuts, the app rail turning horizontal — never a stretched phone column - **Desktop**: 1024px+ asymmetric cockpit cuts on a max-1360px shell with 20-24px black gutters ### Grid Desktop composes 7/5 and 5/4/3 column cuts with minmax(0,1fr) tracks so grids never blow out; a 230px app rail anchors dashboards. ### Density Dense only inside readouts; the frame stays open and smoky so the interface breathes like a late-night room. ### Whitespace Black gutters are active negative space — at least 20px between panels, generous padding above every title, cream panels allowed large blank fields. ### Responsive Display type shrinks with clamp() and wraps, never clips; buttons and chips never wrap — layouts stack instead; ultra-wide caps and centres the shell while only the hero spans 100vw. ## Guidance ### Do - Lead with warm black and cream; spend ember only on what is live, primary, or just changed. - Open every module with a cue mark; let timestamps and prompts make the page feel operated. - Keep panels square and gutters black; let one oversized outline numeral clip per viewport. - Set every label, slug and table row in Martian Mono caps at 12 or 15px. - Hold the strict type scale, headings to footers. - Build pages as scenes: booking desks, session boards, tape logs, settle sheets, late bar ledgers. ### Don't - No neon, blue-purple gradients, or hologram glow. - No accent-edge rails on cards, no grey borders, no nested cards, no boxed nav pills. - No cute anime lettering, mascots, or pastel accents. - No second warm accent family beyond the semantic set. - No equal-column grids of identical cards — keep the cuts asymmetric. - No symbol glyphs in copy; cue squares and inline SVG only. - No default browser controls — every form control is styled. ### Accessibility Cream-on-black and ink-on-cream pairs exceed WCAG AA at body sizes; ember and semantic colours are always supported by a label, position, or the cue square — never colour alone. Scanline masks stay at or under 4% opacity and never sit behind small text. Focus states ignite a visible ember baseline. prefers-reduced-motion collapses all reveals. ### Usage Context Booking and session desks, night-operations consoles, tape and recording logs, venue ledgers, cinematic portfolios and editorial tools that want a noir, operated-at-02:17 atmosphere with daylight legibility. ## Imagery Direction ### Summary Cinematic after-hours interiors and instruments lit by one warm practical against deep warm black: film grain, low key, ember highlights, black negative space left where panels sit. ### Technique Low-key photographic noir with visible grain; monochrome linework silhouettes may sit masked at low opacity behind panels. ### Hero The landing hero is an after-hours lounge seen from the quiet side — double bass, ember light streak, starfield window — composed to hold the title card in its black field.
---
version: "alpha"
name: "Nighthawk"
description: "Agent-curated design language exported from Katagami as DESIGN.md."
colors:
bg: "#0A0908"
surface: "#171310"
surface_solid: "#171310"
text: "#F5EBD4"
muted: "#9B8E78"
border: "#2A2520"
accent: "#C1502F"
accent_2: "#B78B45"
accent_soft: "#27140E"
on_accent: "#FBF1DC"
success: "#8A9A5B"
warning: "#C17A2B"
error: "#D0452B"
info: "#B78B45"
typography:
headline-lg:
fontFamily: "Antonio"
fontSize: "2.125rem"
fontWeight: 700
lineHeight: 1.1
letterSpacing: "-0.02em"
headline-md:
fontFamily: "Antonio"
fontSize: "1.687rem"
fontWeight: 600
lineHeight: 1.15
letterSpacing: "-0.02em"
body-md:
fontFamily: "Afacad Flux"
fontSize: "17px"
fontWeight: 400
lineHeight: 1.55
letterSpacing: "-0.02em"
label-md:
fontFamily: "Martian Mono"
fontSize: "0.75rem"
fontWeight: 600
lineHeight: 1
letterSpacing: "0.08em"
rounded:
none: "0px"
md: "16px"
lg: "24px"
full: "9999px"
spacing:
base: "8px"
xs: "4px"
sm: "8px"
md: "12px"
lg: "16px"
xl: "24px"
2xl: "32px"
3xl: "48px"
4xl: "64px"
step-8: "96px"
step-9: "128px"
components:
color-reference-bg:
backgroundColor: "{colors.bg}"
color-reference-surface:
backgroundColor: "{colors.surface}"
color-reference-surface_solid:
backgroundColor: "{colors.surface_solid}"
color-reference-text:
backgroundColor: "{colors.text}"
color-reference-muted:
backgroundColor: "{colors.muted}"
color-reference-border:
backgroundColor: "{colors.border}"
color-reference-accent:
backgroundColor: "{colors.accent}"
color-reference-accent_2:
backgroundColor: "{colors.accent_2}"
color-reference-accent_soft:
backgroundColor: "{colors.accent_soft}"
color-reference-on_accent:
backgroundColor: "{colors.on_accent}"
color-reference-success:
backgroundColor: "{colors.success}"
color-reference-warning:
backgroundColor: "{colors.warning}"
color-reference-error:
backgroundColor: "{colors.error}"
color-reference-info:
backgroundColor: "{colors.info}"
button-primary:
backgroundColor: "{colors.accent}"
textColor: "#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"
---
# Nighthawk
## Overview
Nighthawk is a design language for systems operated after midnight: a warm near-black stage, cream paper tickets, one ember accent used like a reel-change cue, and gold phosphor readouts paced like jazz cuts. It keeps the discipline of a 90s anime title card and the restraint of a noir lounge — clipped panels, cue marks, and quiet tension between the hits.
### Values
- Restraint before decoration: warm black, cream paper and one ember cue carry the identity; everything else stays small and functional.
- Cinematic pacing: screens are edited as cuts — a dominant panel, a narrow console rail, black gutters as active negative space.
- Diegetic utility: every module opens with a cue mark — an ember square, a mono label, a phosphor timestamp — so the page reads as a cue sheet being worked, not a display.
- One machine voice: Martian Mono carries every prompt, slug, timestamp and table row; the interface speaks in phosphor.
- Typographic authority: condensed Antonio title cards and stroke-only ghost numerals build hierarchy before any icon or illustration.
- Existential calm: black pauses between dense readouts; nothing fills every gap.
### Anti-Values
- Generic cyberpunk neon, blue-purple gradients, hologram glow, or rain-soaked clutter.
- Cute anime lettering, mascots, stickers, or pastel accents that break the noir tone.
- Accent-edge rails, grey card borders, nested cards, or boxed pill navigation.
- Component-catalog sameness: equal columns of identical cards with no cinematic cut.
- Texture for its own sake — scanlines and grain stay masked, low-opacity, structural.
### Visual Character
- A warm near-black page shell where cream paper panels and smoked console panels cut against each other asymmetrically.
- Cue marks recurring page-wide: ember squares on wordmarks, section heads, chips, checkboxes, stat labels and list feet.
- Phosphor mono readouts — prompts, timestamps, diagnostic micro-labels — in dim gold on smoked ground under a faint scanline mask.
- Oversized stroke-only Antonio numerals clipping through panel corners like title-card frame numbers.
- Square terminal geometry: hairlines only inside tables and under form fields, value jumps instead of borders, almost no shadow.
## 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 | `#0A0908` |
| surface | `#171310` |
| surface_solid | `#171310` |
| text | `#F5EBD4` |
| muted | `#9B8E78` |
| border | `#2A2520` |
| accent | `#C1502F` |
| accent_2 | `#B78B45` |
| accent_soft | `#27140E` |
| on_accent | `#FBF1DC` |
| success | `#8A9A5B` |
| warning | `#C17A2B` |
| error | `#D0452B` |
| info | `#B78B45` |
## Typography
- **Headline-Lg**: Antonio, 2.125rem, weight 700, line-height 1.1.
- **Headline-Md**: Antonio, 1.687rem, weight 600, line-height 1.15.
- **Body-Md**: Afacad Flux, 17px, weight 400, line-height 1.55.
- **Label-Md**: Martian 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`
- **Step-9**: `128px`
### Breakpoints
- **Mobile**: 390px-767px single column, 20px gutters, decorative numerals clamped, non-essential nav and table columns dropped
- **Tablet**: 768px-1023px its own considered board: two-column cuts, the app rail turning horizontal — never a stretched phone column
- **Desktop**: 1024px+ asymmetric cockpit cuts on a max-1360px shell with 20-24px black gutters
### Grid
Desktop composes 7/5 and 5/4/3 column cuts with minmax(0,1fr) tracks so grids never blow out; a 230px app rail anchors dashboards.
### Density
Dense only inside readouts; the frame stays open and smoky so the interface breathes like a late-night room.
### Whitespace
Black gutters are active negative space — at least 20px between panels, generous padding above every title, cream panels allowed large blank fields.
### Responsive
Display type shrinks with clamp() and wraps, never clips; buttons and chips never wrap — layouts stack instead; ultra-wide caps and centres the shell while only the hero spans 100vw.
## Elevation & Depth
### Shadows
- **Sm**: 0 1px 0 rgba(245,235,212,0.06)
- **Md**: 0 24px 60px rgba(0,0,0,0.34)
- **Lg**: 0 40px 120px rgba(0,0,0,0.48)
## Shapes
### Rounded
- **None**: `0px`
- **Md**: `16px`
- **Lg**: `24px`
- **Full**: `9999px`
### Surfaces
- **Treatment**: Flat matte fields; hierarchy comes from the cream-paper-on-warm-black value jump, not borders or shadows.
- **Card Style**: Square cream paper tickets and smoked console panels in black gutters; each opens with a cue mark; a stroke-only ghost numeral may clip one corner.
- **Bg Pattern**: Warm black field; console panels may carry a repeating-linear-gradient scanline mask at or under 4% opacity and sparse mono coordinate ticks.
### Borders
- **Default Width**: 1px
- **Accent Width**: 2px
- **Style**: solid
- **Character**: Hairline dividers live only inside tables and as 2px form-field baselines that ignite ember on focus; cards and panels carry no borders and no accent edges.
## Components
### Composition
Compose screens as cinematic cuts on a max-1360px shell: one dominant panel, one narrow console rail, asymmetric 7/5 or 5/4/3 column splits, black gutters breathing between. Open every module with a cue mark (ember square + mono label + phosphor timestamp). Let one oversized stroke-only numeral clip a panel corner per viewport. Spend ember only on what is live, primary, or just changed.
### Density
Medium-high inside readouts and ledgers, offset by open black pauses and cream panels holding blank fields. The tablet band gets its own two-column board; mobile stacks to one column with cue marks preserved above each section.
### Hierarchy
Antonio 700 uppercase at -0.02em for title cards and stat numerals; Afacad Flux at 17px+ for operational copy; Martian Mono 12/15px caps for every label, prompt, slug and table row. One strict scale — 12/15/17/21/27/34/43 plus two display clamps — and no one-off sizes. Scale and placement rank first; the ember cue confirms, never carries alone.
### Signature Patterns
- The cue mark: a 7-12px ember square, a Martian Mono caps label and a phosphor timestamp opening every page, panel, chip, checkbox and stat.
- The cue sweep: links carry a 2px ember baseline that floods to a full ember fill on hover.
- Paper tickets: cream panels in black gutters with Antonio heads, mono meta slugs, and a stroke-only ghost numeral clipping the corner.
- Phosphor readouts: >-prompted mono feeds in dim gold on smoked panels under a masked 4%-opacity scanline.
- Segmented meters: twelve square cells filling in ember or phosphor with a mono readout line.
- The docking ledger: mono tables with hairline rows, muted caps headers, an ember hover wash and coloured status words.
## 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-019f2e6e-d19d-72b2-8500-d710161f6627/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 Lead with warm black and cream; spend ember only on what is live, primary, or just changed.
- Do Open every module with a cue mark; let timestamps and prompts make the page feel operated.
- Do Keep panels square and gutters black; let one oversized outline numeral clip per viewport.
- Do Set every label, slug and table row in Martian Mono caps at 12 or 15px.
- Do Hold the strict type scale, headings to footers.
- Do Build pages as scenes: booking desks, session boards, tape logs, settle sheets, late bar ledgers.
- Don't No neon, blue-purple gradients, or hologram glow.
- Don't No accent-edge rails on cards, no grey borders, no nested cards, no boxed nav pills.
- Don't No cute anime lettering, mascots, or pastel accents.
- Don't No second warm accent family beyond the semantic set.
- Don't No equal-column grids of identical cards — keep the cuts asymmetric.
- Don't No symbol glyphs in copy; cue squares and inline SVG only.
- Don't No default browser controls — every form control is styled.
### Accessibility
Cream-on-black and ink-on-cream pairs exceed WCAG AA at body sizes; ember and semantic colours are always supported by a label, position, or the cue square — never colour alone. Scanline masks stay at or under 4% opacity and never sit behind small text. Focus states ignite a visible ember baseline. prefers-reduced-motion collapses all reveals.
### Usage Context
Booking and session desks, night-operations consoles, tape and recording logs, venue ledgers, cinematic portfolios and editorial tools that want a noir, operated-at-02:17 atmosphere with daylight legibility.
## Imagery Direction
### Summary
Cinematic after-hours interiors and instruments lit by one warm practical against deep warm black: film grain, low key, ember highlights, black negative space left where panels sit.
### Technique
Low-key photographic noir with visible grain; monochrome linework silhouettes may sit masked at low opacity behind panels.
### Hero
The landing hero is an after-hours lounge seen from the quiet side — double bass, ember light streak, starfield window — composed to hold the title card in its black field.
```json
{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "nighthawk",
"type": "registry:theme",
"title": "Nighthawk shadcn Theme",
"cssVars": {
"theme": {},
"light": {
"background": "#0A0908",
"foreground": "#F5EBD4",
"card": "#171310",
"card-foreground": "#F5EBD4",
"popover": "#171310",
"popover-foreground": "#F5EBD4",
"primary": "#F5EBD4",
"primary-foreground": "#111111",
"secondary": "#f4f4f5",
"secondary-foreground": "#111111",
"muted": "#9B8E78",
"muted-foreground": "#F5EBD4",
"accent": "#C1502F",
"accent-foreground": "#ffffff",
"destructive": "#D0452B",
"border": "#2A2520",
"input": "#2A2520",
"ring": "#C1502F",
"chart-1": "#F5EBD4",
"chart-2": "#f4f4f5",
"chart-3": "#C1502F",
"chart-4": "#8A9A5B",
"chart-5": "#C17A2B",
"sidebar": "#171310",
"sidebar-foreground": "#F5EBD4",
"sidebar-primary": "#F5EBD4",
"sidebar-primary-foreground": "#111111",
"sidebar-accent": "#B78B45",
"sidebar-accent-foreground": "#ffffff",
"sidebar-border": "#2A2520",
"sidebar-ring": "#C1502F",
"radius": "16px"
},
"dark": {
"background": "#0f1115",
"foreground": "#f8fafc",
"card": "#181b22",
"card-foreground": "#f8fafc",
"popover": "#181b22",
"popover-foreground": "#f8fafc",
"primary": "#F5EBD4",
"primary-foreground": "#111111",
"secondary": "#252a33",
"secondary-foreground": "#f8fafc",
"muted": "#252a33",
"muted-foreground": "#a1a1aa",
"accent": "#C1502F",
"accent-foreground": "#ffffff",
"destructive": "#D0452B",
"border": "#303642",
"input": "#303642",
"ring": "#C1502F",
"chart-1": "#F5EBD4",
"chart-2": "#f4f4f5",
"chart-3": "#C1502F",
"chart-4": "#8A9A5B",
"chart-5": "#C17A2B",
"sidebar": "#181b22",
"sidebar-foreground": "#f8fafc",
"sidebar-primary": "#F5EBD4",
"sidebar-primary-foreground": "#111111",
"sidebar-accent": "#C1502F",
"sidebar-accent-foreground": "#ffffff",
"sidebar-border": "#303642",
"sidebar-ring": "#C1502F",
"radius": "16px"
}
},
"meta": {
"source": "katagami",
"languageId": "en-019f2e6e-d19d-72b2-8500-d710161f6627",
"slug": "nighthawk",
"componentManifest": [
"button",
"card",
"input",
"textarea",
"select",
"dialog",
"sheet",
"tabs",
"badge",
"separator",
"checkbox",
"switch",
"slider",
"tooltip",
"dropdown-menu",
"table"
],
"installCommand": "npx shadcn@latest add button card input textarea select dialog sheet tabs badge separator checkbox switch slider tooltip dropdown-menu table",
"nativeTokenNames": {
"colors": [
"accent",
"accent_2",
"accent_soft",
"bg",
"border",
"error",
"info",
"muted",
"on_accent",
"success",
"surface",
"surface_solid",
"text",
"warning"
],
"typography": [
"base_size",
"body_font",
"google_fonts_url",
"heading_font",
"heading_transform",
"heading_weight",
"letter_spacing",
"line_height",
"mono_font",
"scale_ratio"
],
"radii": [
"full",
"lg",
"md",
"none"
],
"shadows": [
"lg",
"md",
"sm"
],
"spacing": [
"base",
"scale"
],
"surfaces": [
"bg_pattern",
"card_style",
"treatment"
],
"borders": [
"accent_width",
"character",
"default_width",
"style"
],
"motion": [
"duration",
"easing",
"philosophy"
]
}
}
}
```The quick brown fox jumps
The quick brown fox jumps
The quick brown fox jumps
The quick brown fox jumps
Agent-generated
Keep Nighthawkand 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: #0A0908;
--foreground: #F5EBD4;
--card: #171310;
--card-foreground: #F5EBD4;
--popover: #171310;
--popover-foreground: #F5EBD4;
--primary: #F5EBD4;
--primary-foreground: #111111;
--secondary: #f4f4f5;
--secondary-foreground: #111111;
--muted: #9B8E78;
--muted-foreground: #F5EBD4;
--accent: #C1502F;
--accent-foreground: #ffffff;
--destructive: #D0452B;
--border: #2A2520;
--input: #2A2520;
--ring: #C1502F;
--chart-1: #F5EBD4;
--chart-2: #f4f4f5;
--chart-3: #C1502F;
--chart-4: #8A9A5B;
--chart-5: #C17A2B;
--sidebar: #171310;
--sidebar-foreground: #F5EBD4;
--sidebar-primary: #F5EBD4;
--sidebar-primary-foreground: #111111;
--sidebar-accent: #B78B45;
--sidebar-accent-foreground: #ffffff;
--sidebar-border: #2A2520;
--sidebar-ring: #C1502F;
--radius: 16px;
}
.dark {
--background: #0f1115;
--foreground: #f8fafc;
--card: #181b22;
--card-foreground: #f8fafc;
--popover: #181b22;
--popover-foreground: #f8fafc;
--primary: #F5EBD4;
--primary-foreground: #111111;
--secondary: #252a33;
--secondary-foreground: #f8fafc;
--muted: #252a33;
--muted-foreground: #a1a1aa;
--accent: #C1502F;
--accent-foreground: #ffffff;
--destructive: #D0452B;
--border: #303642;
--input: #303642;
--ring: #C1502F;
--chart-1: #F5EBD4;
--chart-2: #f4f4f5;
--chart-3: #C1502F;
--chart-4: #8A9A5B;
--chart-5: #C17A2B;
--sidebar: #181b22;
--sidebar-foreground: #f8fafc;
--sidebar-primary: #F5EBD4;
--sidebar-primary-foreground: #111111;
--sidebar-accent: #C1502F;
--sidebar-accent-foreground: #ffffff;
--sidebar-border: #303642;
--sidebar-ring: #C1502F;
--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 NighthawkShadcnKit() {
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">Nighthawk</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": "nighthawk",
"type": "registry:theme",
"author": "katagami-agent",
"title": "Nighthawk",
"description": "After-midnight console theme: warm near-black stage, cream paper panels, one ember cue accent, gold phosphor mono readouts. Square terminal geometry, cue-mark ornament, strict type scale.",
"cssVars": {
"theme": {
"font-sans": "'Afacad Flux', sans-serif",
"font-heading": "'Antonio', sans-serif",
"font-mono": "'Martian Mono', monospace",
"radius": "0px"
},
"dark": {
"background": "#0A0908",
"foreground": "#F5EBD4",
"card": "#171310",
"card-foreground": "#F5EBD4",
"popover": "#171310",
"popover-foreground": "#F5EBD4",
"primary": "#C1502F",
"primary-foreground": "#FBF1DC",
"secondary": "#EDE2C6",
"secondary-foreground": "#12100C",
"muted": "#171310",
"muted-foreground": "#9B8E78",
"accent": "#27140E",
"accent-foreground": "#C1502F",
"destructive": "#D0452B",
"destructive-foreground": "#FBF1DC",
"border": "#2A2520",
"input": "#2A2520",
"ring": "#C1502F",
"chart-1": "#C1502F",
"chart-2": "#B78B45",
"chart-3": "#8A9A5B",
"chart-4": "#C17A2B",
"chart-5": "#9B8E78",
"sidebar": "#0A0908",
"sidebar-foreground": "#F5EBD4",
"sidebar-primary": "#C1502F",
"sidebar-primary-foreground": "#FBF1DC",
"sidebar-accent": "#171310",
"sidebar-accent-foreground": "#F5EBD4",
"sidebar-border": "#2A2520",
"sidebar-ring": "#C1502F"
}
},
"visualProfile": {
"family": "terminal-noir",
"material": "matte paper on warm black",
"contour": "square",
"border": "hairline, tables and field baselines only",
"underlay": false,
"grain": true,
"stickerBadges": false,
"motion": "180ms title-card cuts",
"density": "medium-high in readouts, open black gutters between",
"accents": ["#C1502F", "#B78B45"]
},
"notes": "Dark is the native mode — the language is built for after-midnight operation. Secondary is the cream 'paper' surface used as a light panel inside the dark shell. Buttons and cards are radius 0; switches alone take the full pill radius. Every label, badge and table row sets font-mono uppercase with 0.10-0.14em tracking. Exactly one ember primary button per view."
}
# Nighthawk — shadcn/ui Components
Author: `katagami-agent`
Format: `component-recipes-v1`
Theme: `nighthawk` (registry-theme-v1, dark-native)
Nighthawk dresses shadcn/ui as an after-midnight console: warm near-black stage, cream paper panels, one ember cue accent (#C1502F), gold phosphor mono labels (#B78B45). Square geometry everywhere except switches; every label is Martian Mono caps; exactly one ember primary per view.
## ShadSync visual profile
- **family**: `terminal-noir` — flat matte panels on a warm black ground; depth comes from the paper-on-black value jump, not shadows.
- **contour**: square. `--radius: 0px`; only Switch (and its thumb) takes the 9999px pill.
- **border**: hairline `#2A2520`, used only inside tables and as form-field baselines. Cards carry no borders and no accent edges — the cue mark (7-12px ember square + mono label) does the pointing.
- **grain**: a `repeating-linear-gradient` scanline mask at ≤4% opacity, applied inside console panels only.
- **type**: Antonio 700 uppercase `-0.02em` for headings; Afacad Flux ≥17px for body; Martian Mono 12/15px caps `0.10-0.14em` for every label, badge, tab and cell. Strict scale: 12/15/17/21/27/34/43.
- **motion**: 180ms `cubic-bezier(0.2,0.8,0.2,1)` — opacity snaps and short lateral shifts, like reel cuts.
- **accents**: ember `#C1502F` (live/primary), phosphor `#B78B45` (machine voice), semantics `#8A9A5B / #C17A2B / #D0452B` kept to a 7px square + label.
## Signature component recipes
| Primitive | Nighthawk treatment |
|---|---|
| button | Mono caps, height 52 (44 compact), radius 0, no wrap. One ember `default` per view; `secondary` is cream paper with near-black ink; `ghost` is smoked surface. Active state nudges 2px right — a tape transport click. |
| card | Either cream paper (`secondary` tones) or smoked console (`card`), padding 32-48, no border, no shadow. Opens with a cue mark; may carry a stroke-only Antonio ghost numeral clipping a corner. |
| input | Flat well `color-mix(bg 70%, card)`, radius 0, no side borders — a 2px baseline in `border` that ignites ember on focus. Placeholder in dim muted. |
| textarea | Same baseline treatment, min-height 120, vertical resize only. |
| select | Input treatment + an inline ember chevron SVG; option text in body face. |
| dialog | A paper ticket dropped on the black stage: cream panel, cue mark header, mono slug footer; overlay is 82% warm black, no blur. |
| sheet | Slides from the right like a reel change, 320ms; smoked surface with scanline mask and a phosphor timestamp header. |
| tabs | Square strip, no pill: inactive tabs smoked with muted mono caps, the active tab flips to cream paper with near-black ink. |
| badge | The status chip: mono caps 12px, square, tinted ground (`color-mix(status 14%, bg)`), a 7px leading square in the status colour. |
| separator | Hairline `#2A2520`; section-level separators may carry coordinate ticks (mono 12px) at their ends. |
| checkbox | 22px square, 2px `border` frame, radius 0; checked fills ember with an 8px inner cream square — a cue square, not a checkmark. |
| switch | The one pill: 52x28 track in `border`, cream thumb; checked track ember, thumb `on-accent`. |
| slider | 4px square track, filled span in ember, 18px square thumb — a fader on the booking console. |
| tooltip | Phosphor mono 12px caps on smoked surface, square, 8px offset; reads like a booth annotation. |
| dropdown-menu | Smoked square panel; items mono 15px; hover ignites an ember wash (`color-mix(accent 8%, card)`) with the leading cue square appearing. |
| table | The docking ledger: mono 15px rows, hairline row rules, muted 12px caps headers, ember hover wash, status words coloured (`on stage` ember, `settled` plain, `hold` muted). |
## Copy-paste component example
```tsx
import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
import { Card, CardContent, CardFooter, CardHeader } from "@/components/ui/card"
export function BookingTicket() {
return (
<Card className="rounded-none border-0 bg-secondary text-secondary-foreground p-8 relative overflow-hidden">
<CardHeader className="p-0 flex-row items-center gap-3">
<span aria-hidden className="size-2.5 bg-primary" />
<span className="font-mono text-xs font-medium uppercase tracking-[0.14em] text-secondary-foreground/60">
Booking <span className="text-primary">23:40</span>
</span>
</CardHeader>
<CardContent className="p-0 mt-4 space-y-3">
<h3 className="font-heading text-[27px] font-bold uppercase leading-none tracking-[-0.02em]">
Mizuno Trio — Set II
</h3>
<p className="text-[17px] text-secondary-foreground/60">
Upright bass, brushed kit, tenor. Forty-minute set, one encore held.
</p>
<div className="flex gap-3">
<Badge className="rounded-none font-mono text-xs uppercase tracking-[0.12em]">Stage B</Badge>
<Badge className="rounded-none font-mono text-xs uppercase tracking-[0.12em]">40 min</Badge>
</div>
</CardContent>
<CardFooter className="p-0 mt-6 gap-4">
<Button className="rounded-none h-11 px-6 font-mono text-xs font-semibold uppercase tracking-[0.1em]">
Cue the set
</Button>
<Button variant="secondary" className="rounded-none h-11 px-6 font-mono text-xs font-semibold uppercase tracking-[0.1em] bg-background text-foreground">
Hold encore
</Button>
</CardFooter>
</Card>
)
}
```
## Preview shots
Three renderable product scenes ship in `preview-shots.json` (`preview-shots-v1`, all 16 primitives covered):
1. **Night board** (desktop 1440×900) — stat cards with segmented meters, the cue sheet table, live badges, one ember "Cue next" button.
2. **Booking console** (desktop 1280×800) — the form set: inputs with ember focus baselines, select, textarea, cue-square checkboxes, pill switch, fader slider, tabs.
3. **Settle dialog** (mobile 390×844) — the paper settle ticket as a dialog over the dimmed board, dropdown and tooltip visible, mono ledger rows.
## Usage notes
- Never render two ember primaries side by side; the second action drops to paper or smoke.
- Badge/button text never wraps — shrink the layout, not the control.
- Keep semantic colour to the 7px square and the label; never flood a panel with a status tint.
- Links take the cue sweep (2px ember baseline that floods on hover), not a default underline.
{
"artifact": "katagami:shadcn-preview-shots",
"version": "preview-shots-v1",
"schema": "katagami:shadcn-preview-shots/renderable-v1",
"renderable": true,
"author": "katagami-agent",
"requiresVisualProfile": true,
"language": {
"id": "nighthawk",
"name": "Nighthawk",
"slug": "nighthawk"
},
"installCommand": "npx shadcn@latest add https://katagami.ai/r/nighthawk.json",
"primitives": [
"button", "card", "input", "textarea", "select", "dialog", "sheet", "tabs",
"badge", "separator", "checkbox", "switch", "slider", "tooltip", "dropdown-menu", "table"
],
"identityNotes": [
"Warm near-black stage (#0A0908) with cream paper panels (#EDE2C6 tones) — the value jump IS the elevation; no card borders, no accent edges.",
"One ember accent #C1502F used like a reel-change cue: primary button, live states, cue squares, link sweep. Gold phosphor #B78B45 carries machine text.",
"Every module opens with a cue mark: a small ember square + Martian Mono caps label + phosphor timestamp.",
"Square geometry (radius 0) everywhere except the switch pill; labels/badges/tables in mono caps at 12/15px with 0.10-0.14em tracking.",
"Strict type scale 12/15/17/21/27/34/43; Antonio 700 uppercase -0.02em display; body Afacad Flux at 17px minimum."
],
"visualProfile": {
"family": "terminal-noir",
"material": "matte paper on warm black",
"contour": "square",
"border": "hairline, tables and field baselines only",
"underlay": false,
"grain": true,
"stickerBadges": false,
"motion": "180ms title-card cuts",
"density": "medium-high readouts, open black gutters",
"accents": ["#C1502F", "#B78B45"]
},
"tokens": {
"background": "#0A0908",
"card": "#171310",
"foreground": "#F5EBD4",
"mutedForeground": "#9B8E78",
"border": "#2A2520",
"primary": "#C1502F",
"primaryForeground": "#FBF1DC",
"secondary": "#EDE2C6",
"secondaryForeground": "#12100C",
"accentSoft": "#27140E",
"success": "#8A9A5B",
"warning": "#C17A2B",
"destructive": "#D0452B",
"info": "#B78B45",
"fontSans": "'Afacad Flux', sans-serif",
"fontHeading": "'Antonio', sans-serif",
"fontMono": "'Martian Mono', monospace",
"radius": "0px"
},
"shots": [
{
"id": "night-board",
"title": "The night board",
"viewport": { "width": 1440, "height": 900 },
"primitives": ["card", "badge", "button", "table", "separator", "tooltip"],
"composition": "Left app rail on warm black with mono nav; main board opens with a cue mark and an Antonio uppercase title. A four-up stat row of smoked cards with segmented square meters, then the cue-sheet table with hairline rows and one live ember badge. Exactly one ember primary button top right.",
"mustShow": [
"cue mark (ember square + mono caps label + phosphor timestamp) opening the page",
"segmented 12-cell meter filling in ember inside a stat card",
"table row hover wash in ember with 'on stage' status word coloured ember",
"single ember primary button 'Cue next' beside a quiet smoked button"
],
"avoid": [
"card borders or accent edge rails",
"rounded corners on cards, buttons or badges",
"more than one ember primary button",
"status colour flooding a whole row or panel"
],
"scene": {
"headline": "Tonight, on the board",
"description": "The Komet Room's night desk at 02:17 — Set II on stage, tape rolling, settle queued.",
"stats": [
{ "label": "Door count", "value": "214 / 260" },
{ "label": "Night take", "value": "¥612K" },
{ "label": "Tape · reel B", "value": "62 min left" },
{ "label": "Bar pace", "value": "4.2 pours/min" }
],
"rows": [
{ "slug": "NH-0219", "act": "Kessler Quartet", "cue": "21:30", "fee": "¥210,000", "status": "settled" },
{ "slug": "NH-0221", "act": "Mizuno Trio", "cue": "23:40", "fee": "¥180,000", "status": "on stage" },
{ "slug": "NH-0222", "act": "Ada Reyes", "cue": "00:55", "fee": "¥120,000", "status": "armed" },
{ "slug": "NH-0223", "act": "Late jam — open", "cue": "01:45", "fee": "door", "status": "hold" }
]
}
},
{
"id": "booking-console",
"title": "Booking console",
"viewport": { "width": 1280, "height": 800 },
"primitives": ["input", "textarea", "select", "checkbox", "switch", "slider", "tabs", "button", "badge"],
"composition": "A smoked console panel under a faint scanline mask, opened by a cue mark. Two-column form grid: flat input wells with 2px baselines that ignite ember on focus, an ember-chevron select, a rider textarea, cue-square checkboxes, one pill switch, and a square-thumb fader slider. A square tab strip (Tonight / This week / Settled) sits above; the active tab flips to cream paper.",
"mustShow": [
"input focus state with ember baseline and phosphor mono hint text below",
"checkbox checked as an ember square with inner cream square (no checkmark glyph)",
"switch as the only pill-shaped control on the page",
"active tab in cream paper against smoked inactive tabs"
],
"avoid": [
"full borders around inputs",
"default browser controls",
"rounded input corners",
"wrapping button or badge labels"
],
"scene": {
"headline": "Book the next set",
"description": "Filing the Mizuno Trio's Thursday offer between songs — cue time, stage, fee split, rider.",
"fields": [
{ "label": "Act name", "value": "Mizuno Trio", "hint": "> verified against the ledger" },
{ "label": "Set time", "value": "23:40", "hint": "> stage B free from 23:20" },
{ "label": "Stage", "value": "Stage B — bar side" },
{ "label": "Fee", "value": "¥180,000", "hint": "> door split 60/40" },
{ "label": "Rider notes", "value": "House Rhodes tuned Tuesday. Two clean pours at the break, no ice." }
]
}
},
{
"id": "settle-ticket",
"title": "Settle dialog",
"viewport": { "width": 390, "height": 844 },
"primitives": ["dialog", "sheet", "dropdown-menu", "table", "button", "badge", "separator", "tooltip", "card"],
"composition": "Mobile night board dimmed under an 82% warm-black overlay; a cream paper settle ticket drops in as the dialog — cue mark header, mono ledger rows with hairline rules, a bold total line with the amount in ember, one near-black primary button. A dropdown menu (Print / Reopen / Export reel log) sits open from the ticket's corner action.",
"mustShow": [
"cream paper dialog on the warm black overlay, radius 0",
"ledger rows with hairline rules and a 2px total rule, total amount in ember",
"dropdown menu items in mono 15px with an ember cue square on the hovered item",
"mono slug footer 'NH-0221 · REEL B · 02:40' on the ticket"
],
"avoid": [
"backdrop blur",
"rounded dialog corners",
"centered-text lorem content",
"more than one primary action inside the dialog"
],
"scene": {
"headline": "Night deposit",
"description": "The 02:40 auto-settle: door and bar in, fees and comps out, one line to the safe.",
"rows": [
{ "line": "Door — 214 covers", "amount": "¥428,000" },
{ "line": "Bar — through 02:17", "amount": "¥184,300" },
{ "line": "Fees — three acts", "amount": "−¥395,000" },
{ "line": "Comps — band tables", "amount": "−¥21,600" },
{ "line": "To the safe", "amount": "¥195,700" }
]
}
}
],
"componentRecipes": [
{ "primitive": "button", "intent": "Mono caps, radius 0, height 52/44; one ember primary per view, cream paper secondary, smoked ghost; 2px lateral nudge on press; labels never wrap." },
{ "primitive": "card", "intent": "Cream paper or smoked console panel, padding 32-48, no border/shadow; opens with a cue mark; may clip a stroke-only Antonio ghost numeral." },
{ "primitive": "input", "intent": "Flat well with a 2px bottom baseline in border colour igniting ember on focus; radius 0; phosphor mono hint below." },
{ "primitive": "textarea", "intent": "Baseline treatment, min-height 120px, vertical resize; body face at 17px." },
{ "primitive": "select", "intent": "Input well plus inline ember chevron SVG; never the native arrow." },
{ "primitive": "dialog", "intent": "Cream paper ticket on an 82% warm-black overlay, radius 0, cue-mark header, mono slug footer." },
{ "primitive": "sheet", "intent": "Right-slide reel change at 320ms; smoked surface, scanline mask, phosphor timestamp header." },
{ "primitive": "tabs", "intent": "Square strip; inactive smoked + muted mono caps, active flips to cream paper with near-black ink." },
{ "primitive": "badge", "intent": "Status chip: square, mono caps 12px, tinted ground (status 14% into bg), 7px leading status square." },
{ "primitive": "separator", "intent": "Hairline #2A2520; section separators may end in mono coordinate ticks." },
{ "primitive": "checkbox", "intent": "22px square with 2px frame; checked = ember fill + 8px inner cream square, no checkmark glyph." },
{ "primitive": "switch", "intent": "The single pill: 52x28 track, cream thumb; checked ember track with on-accent thumb." },
{ "primitive": "slider", "intent": "4px square track, ember filled span, 18px square thumb — a console fader." },
{ "primitive": "tooltip", "intent": "Phosphor mono 12px caps on smoked square panel; booth-annotation voice." },
{ "primitive": "dropdown-menu", "intent": "Smoked square panel; mono 15px items; hover = ember wash + appearing cue square." },
{ "primitive": "table", "intent": "Docking ledger: mono 15px rows, hairline rules, 12px caps headers, ember hover wash, coloured status words." }
],
"qualityRules": {
"do": [
"Open every panel and page with a cue mark",
"Keep exactly one ember primary action per view",
"Set all labels, badges, tabs and table text in Martian Mono caps",
"Use the paper-on-black value jump for hierarchy instead of borders or shadows",
"Hold the strict type scale: 12/15/17/21/27/34/43"
],
"dont": [
"No card borders, accent edge rails, or nested cards",
"No rounded corners except the switch pill",
"No neon, gradients, or hologram glow",
"No status colour floods — 7px square + label only",
"No wrapping control labels; shrink the layout instead"
]
}
}