NASAPUNK DESIGN SYSTEM (× STARFIELD-MODERN)
Build pages that read as "1970s government aerospace documentation meets worn flight hardware — polished with Starfield's modern brand-system confidence."
Reference implementation (baseline template): assets/reference.html (open in browser — single file, zero dependencies).
Copy-paste CSS recipes: references/snippets.css.
0. STACK PORTABILITY (global constraint)
Every law and recipe in this skill MUST remain implementable across React, Next.js, Vue, Svelte, SwiftUI, React Native, Flutter, Tailwind, shadcn/ui:
- The single-file HTML reference is the CANONICAL spec. When the target stack differs, translate tokens/structure - never drop laws.
- Tokens: CSS custom properties are canonical; map them 1:1 to platform equivalents (SwiftUI Color/Font extensions, RN theme object, Flutter ThemeData, Tailwind theme.extend.colors).
- Effects matrix: hatching/stripe fills = repeating-linear-gradient (web/Tailwind arbitrary values) | SwiftUI
.linear-gradient stripes or ShapeStyle | RN gradient lib | Flutter DecoratedBox/CustomPainter. Donut/dial = conic-gradient | SwiftUI Circle().trim(AngularGradient) | RN react-native-svg Circle strokeDasharray | Flutter CustomPaint. blend/mask tricks degrade gracefully - substitute precomputed colors where a stack lacks mask support.
- Component mapping: figure plates/cards become components per stack (shadcn/ui = recipe over primitives; SwiftUI/RN/Flutter = view structs/widgets); semantic roles (figure/figcaption, table headers) preserved for a11y.
- Workflow: build against the HTML reference first when unsure, then port; visual verification (§9 step 10) applies to EVERY stack output.
0B. STYLE SYSTEM (one base skin, two surface families)
One base skin carries TWO surface families. Both deploy AUTOMATICALLY when the scene fits - and the user can always explicitly request either:
| Surface family |
Ground |
Deploy when |
| PRINT DOCUMENT (dominant) |
Light paper + ink; report figures; document props woven in |
Default for pages and sections; always the page-level base |
| CONSOLE INSTRUMENTS |
Dark #0A1420/panel grounds + §2B tokens + §5g components |
Scene fits an instrument: terminals, logs, dashboards, status walls, data-dense readouts, HUD widgets - OR user explicitly requests dark/console mode |
Base skin composition (always on)
- §2 light tokens + ALL §4 texture recipes
- §6 print-document layer woven in (>=2 Band-15 artifacts)
- §2B console tokens + §5g component grammar, deployed onto fitting sections
- Era grades are part of this skin's toolkit: apply a root class (.era-apollo etc.) when the scene warrants a commemorative/heritage tone; default none
Deployment laws
- Page-level ground stays LIGHT unless the user explicitly requests full-console mode
- Dark instrument surfaces attach to instrument-shaped content: terminals, log walls, telemetry, status-heavy clusters - never to body text or reading surfaces
- If the user asks "which styles exist", present both surface families from this table
- If the user wants BOTH skins on one subject, deliver a variant set: PRINT version first as canonical, then a CONSOLE twin
- Silence = PRINT-dominant build with autonomous dark-instrument deployment where scenes fit
1. THE ONE RULE (dual-layer decision filter)
Layer 1 (retro body): "Would this look at home in a 1979 government technical exhibit?"
Layer 2 (modern soul): "…and would Starfield's brand team ship it today?"
Every visual decision passes through BOTH. Layer 1 blocks cyberpunk drift; layer 2 blocks museum-piece stiffness. NASApunk is NOT cyberpunk, NOT neon sci-fi — and NOT a costume: the retro language is executed with contemporary cleanliness.
Spirit checklist — the page must feel:
- Grounded: everything extrapolated from real aerospace tech; function parts visible (tanks cylindrical, pipes exposed, radiators prominent)
- Institutional optimism: "High tech, high hope" → extended by Starfield's "Forever in adventure" — scientifically inspired, grounded warmth, unapologetically optimistic
- Utility first: design serves engineering truth, not gloss; hardware looks like it just came out of a lab
- Worn, not ruined: "乐观主义的磨损" — scuffed paint, lived-in surfaces, but maintained and loved ("a worn and loved futuretech" — ESA). Never decayed/abandoned
- Analog-first: physical switches > touchscreens; CRT texture only on instrument widgets
- Systematically branded: like AKQA's Clio-winning brand book — consistent tokens, deliberate motion, dos-over-don'ts coherence
2. COLOR TOKENS (hardcode exactly — no free interpretation)
:root{
/* Brand layer */
--red:#E4002B; /* signal red (proven default) */
/* Official alternatives: worm red PMS 179 = #E03C31 (warm orange-red,
light backgrounds ONLY); meatball red PMS 185 = #FC3D21 */
--navy:#0B3D91; /* NASA blue PMS 286 */
--ink:#20232A;
/* Paint / metal layer */
--paint:#F4F3EF; /* off-white baked paint — page base, LIGHT-dominant */
--paint-alt:#E9E7E1;
--metal-light:#A8ACAF;
--metal-mid:#6E7378;
--metal-dark:#43484C;
--rule:rgba(67,72,76,.28);
--seam:rgba(67,72,76,.38);
/* Rust / orange-brown layer */
--rust:#C96A2B;
--rust-deep:#8C4A22;
/* Kapton gold layer — use SPARINGLY (1–2 hero elements max) */
--gold-1:#E8B84B;
--gold-2:#C9932E;
--gold-3:#A87A1F;
--gold-sheen:#B98A5A;
/* STARFIELD-MODERN accent layer (extracted from game assets, ColorKit)
ACCENT ONLY — base stays red/white/blue dominant.
Division of labor: Kapton gold = hardware foil; sf-gold = brand badge. */
--sf-gold:#d4ac63;
--sf-crimson:#cd2435;
--sf-orange:#e56335;
--sf-navy:#2b4d7d;
--sf-offwhite:#f4f5f7;
/* Motion tokens (Starfield motion language) */
--ease-out:cubic-bezier(.2,0,0,1);
--ease-in:cubic-bezier(.4,0,1,1);
--dur-enter:240ms;
--dur-exit:180ms;
--stagger:30ms;
}
Color laws (worm-era graphics standards, 1976-92, used as stylistic reference window):
- Red/white/blue dominant + gray-white metal base + orange-brown accents
- NO PASTELS — explicitly banned by the manual; bright primaries only
- Warm red is THE signature color; navy is structure; gold is rare and precious (Kapton foil reads as expensive thermal hardware)
- Worm-style red only on white/light backgrounds
--sf-* tokens are a thin accent layer: emblem stripes, small chips, motion highlights. Never repaint base surfaces with them.
Shared noise/grunge data-URIs (inline feTurbulence, zero network):
--noise:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)'/%3E%3C/svg%3E");
--grunge:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.55' numOctaves='3' seed='7' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.92 0'/%3E%3C/filter%3E%3Crect width='120' height='120' filter='url(%23g)'/%3E%3C/svg%3E");
2B. CONSOLE-MODE TOKENS (dark surface mode)
Console mode is the sanctioned full-page dark variant: instrument-band logic expanded to a whole page. Deploy it in EITHER of two ways: (a) autonomously, when the scene is instrument-shaped (terminal/dashboard/log wall), or (b) on explicit user request for dark/console/HUD mode (§6). Hardcode exactly:
| Token |
Value |
Role |
--bg-deep |
#0A1420 |
Page base, deep space blue-black |
--panel-base |
#15181C |
Console panel ground |
--slate |
#35444A |
Structural metal, rules, bezels on dark |
--info-cyan |
#4AA8C0 |
Passive data / tech / info |
--screen-glow |
#7FC8B0 |
Phosphor readouts, live values |
--alert-amber |
#E29726 |
Alerts / actions / interactive states |
--danger-red |
#E71D24 |
Failure and danger states |
--equipment-cream |
#D8D2C0 |
Primary body text on dark |
--equipment-cream-hi |
#E8E4DA |
Emphasized text, headlines on dark |
Console-mode color laws:
- SEMANTIC AXIS: the cyan family (
--info-cyan, --screen-glow) marks passive data/tech/info ONLY; amber (--alert-amber) marks alerts/actions/interactive states ONLY, never decorative rest-state
- NO pure
#000 or #FFF surfaces anywhere in console mode
- Panels are FLAT alpha overlays of
--panel-base at ~55-66% opacity over --bg-deep; backdrop-filter:blur FORBIDDEN (Scaleform-faithful flatness)
- Console mode inherits every other §2 law unchanged; the light palette remains the default page mode
2C. ERA COLOR GRADES (optional light-mode tint grades)
Optional tint grades over the standard §2 print palette, named after Starfield's real photo-mode filters (Mercury Era / Gemini Era / Apollo Era). Implement each as a class-scoped :root override on the root element (<html class="era-apollo">): the class re-maps existing tokens, it never adds new ones. Hardcode exactly:
| Class |
Shift direction |
When to use |
.era-mercury |
Cool grey-blue shift: slightly desaturate warm tones, nudge --paint toward grey |
Early-program austere documents, cold test-phase sobriety |
.era-gemini |
Neutral steel: balanced temperature, no channel bias |
Program-midpoint neutrality; the baseline read with a cooler spine |
.era-apollo |
Warm sepia shift: nudge neutrals toward tan/brown |
Golden-age warmth, commemorative and heritage pieces |
ERA GRADE LAWS:
- Grades are SUBTLE: token-level tints only, never new hues; the base §2 palette must stay identifiable through the grade
- ONE grade per page, applied at the root; never mix grades inside a page
- Console mode (§2B) ignores era grades entirely
- Recipe:
references/snippets.css Band 14
3. TYPOGRAPHY LAWS (Swiss / NHB 1430.2)
--font-head:"Helvetica Neue",Helvetica,Arial,"Liberation Sans",sans-serif;
--font-mono:ui-monospace,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;
| Element |
Rule |
| Headings |
Helvetica stack, UPPERCASE, weight 800, tight tracking -0.02em, line-height 1.04–1.08 when multiline (below ~1.02 descenders/comma tails invade the next line's caps); ≤1.0 only for single-line display |
| Stencil labels |
Monospace uppercase, wide tracking +.12em to +.16em, size 9.5–11px — technical tag voice |
| Alignment |
flush-left / ragged-right (never justified) |
| Data tables |
Monospace, font-variant-numeric:tabular-nums, thin bottom rules, labels left / values right-aligned bold |
| Body |
Line-height ≥1.45 |
Nasalization note (Starfield's UI typeface): Starfield's menus use Nasalization (Ray Larabie, 1997) — a geometric sans whose letterforms descend from the worm logotype of the worm-era graphics standards (1976-92) used as stylistic reference window. It is the spiritual benchmark for display type. Web zero-dependency strategy: keep the Helvetica stack as default; if the host project already loads a licensed Nasalization or similar geometric sans, apply it to display headings via an optional @font-face hook. Without it, hint the geometry with slightly wider tracking (+0.01em) on the largest headline only.
Font tiering note (reference faces vs free chain): Starfield's actual UI faces are NB Architekt and NB Grotesk R (Neubau Berlin, commercial licenses, diamond-grid construction). They are the REFERENCE faces: study their proportions, never hotlink or embed them. Free implementation chain for tech display: Exo 2 first, Chakra Petch where a harder stencil-technical voice is needed; both via host-project font loading only (zero external requests law still applies to shipped output). Directional arrows ← ↑ → ↓ are set in the text font itself, never swapped for icon sprites. CJK note: when CJK glyphs enter the stack, the Latin face carries identity alone; pair any system CJK fallback and do not attempt to stylize CJK glyphs.
Prop document fonts (diegetic print props): memos, forms, crates and other diegetic prop documents MAY set BODY text in a plain late-90s system stack "Verdana",Tahoma,Geneva,sans-serif, reproducing the game's actual printed-prop texture (community font surveys report stock Microsoft-era faces on posters/signage). The display/headline layer stays Helvetica-family. Law: prop fonts never exceed body/small sizes and never appear in mastheads or display settings.
4. TEXTURE RECIPES (effect → technique → where)
Full copy-paste code in references/snippets.css; live examples in assets/reference.html.
| Effect |
Technique |
| Worn white paint |
Layered radial-gradient scuffs (white highlight top-right + faint rust/gray stains) over flat --paint; site-wide 5% --noise grain via fixed overlay |
| Metal plate panel |
--paint-alt bg + inset bevel box-shadows (top-light/bottom-dark) + hard offset shadow (5px 6px 0 rgba(...)) + 1px seam border |
| Rivet rows |
repeating radial-gradient dot tile (dark core + white highlight), repeat-x top & bottom edges of panels — see .rivets |
| Corner screws |
Radial-gradient dots via panel ::before/::after, highlight at 35%/30% |
| Panel seams |
1px --seam borders + inset bevel shadows |
| Gold Kapton foil |
Multi-stop linear-gradient (#E8B84B→#C9932E→#A87A1F + #B98A5A sheen) × TWO crossing repeating-linear-gradient crinkle facets (~112deg + ~23deg) + noise multiply overlay — see .kapton-rail |
| Rubber stamp |
Rotated bordered text, double ring (::before inset border), grunge ink via mask-image:var(--grunge) + mix-blend-mode:multiply, opacity .88 — see .stamp |
| Hazard stripe |
repeating-linear-gradient(45deg,#17181A 0 13px,var(--gold-1) 13px 26px) full-bleed strip + caution note in rust-deep mono |
| Blueprint section |
Navy --navy background + dual-scale light grid (two repeating-linear-gradient pairs: 24px fine + 120px coarse) + dashed leader lines → SVG line-art annotations |
| Drafting-paper surface |
Cream #FBFAF7 + light gray grid 22px (α.05), optional coarse 110px majors - section/card background for document-genre pages; recipes .np-graphpaper(--pad) Band 15b |
| Mission patch |
Circular SVG badge: navy ring, circular textPath lettering, red planet arc, gold capsule on dashed trajectory, stars |
| Telemetry widget |
Dark --metal-dark band, mono tabular values in --gold-1, blinking caution lamp; CRT scanlines (repeating-linear 0deg 1px/3px + flicker keyframe) confined to THIS widget only |
| Doc-control bar |
Top strip on --metal-dark: mono 10px DOC NO. XXX-71-C • REV C • FORM 8-246 metadata |
| Constellation emblem stripe |
Four SOLID bars side-by-side, hard edges (navy→gold→orange→crimson) as accent — see §5a |
| Motion polish |
Ease-out/stagger system + shine sweep + scan reveal — see §5 |
| Charts & meters |
Segmented bars / horizontal meters / donut gauges in framed instrument panels — see §5e |
| Brushed-metal bevel panel |
Console-mode counterpart of "Metal plate panel": dark --panel-base ground + inset highlight/shadow bevel box-shadows + low-opacity streak gradients along the brush direction; ALWAYS matte, never glossed |
| Wet-gloss streak |
ONE low-opacity linear highlight band across a dark panel; never on text surfaces |
| Breathing vignette |
Radial-gradient corner darkening at ~50-60% strength behind hero and empty states; sits under content, never over it |
| Warm-cool split light |
Cool shadow tint rgba(58,90,110,.25) paired with warm key tint rgba(232,136,48,.35); keep the pair balanced wherever dark surfaces meet light |
4.1 Blueprint grid — required scenarios
The navy dual-scale grid (§4 "Blueprint section" row) is a signature device. Apply it as a REQUIREMENT to:
- Any technical drawing / diagram / schematic section
- Data-dense exhibits: spec tables wider than 2 columns, dashboards, telemetry-adjacent readouts
- Sections whose content IS engineering documentation (drawings, tolerances, revision history)
Do NOT apply to: body-text paragraphs, footer/legal fine print, hero headline zone, or anywhere it would sit behind running text at full strength.
Legibility law: grid lines ≤7% opacity equivalent (rgba(244,243,239,.035–.075) on navy); content contrast always wins over texture. A light-on-paint variant (--rule colored lines) may serve data sections on light surfaces.
4.2 Small-icon style contract
| Property |
Rule |
| Format |
Inline SVG only; stroke-based line art; fill="none" on shapes |
| Stroke |
1.5–2 units at a 24–48 viewBox (visually ≈ hairline-to-medium); round caps |
| Color |
Single hue via currentColor/--metal-dark on light, --paint-alt on dark; ONE small filled accent allowed per icon (dot/square in --red or --gold-1) |
| Geometry |
Circles, rects, 45°/60° diagonals; engineering-glyph voice (gyro rings, chip pins, blanket waves); no filled silhouettes except tiny status dots |
| Family consistency |
Same stroke width + corner language across every icon on the page |
| Forbidden |
Emoji, icon fonts, external icon libraries |
4.3 Composition coherence rules
- Max TWO texture systems per component (a plate may be rivets+seams; not rivets+hazard+stamp+foil stacked)
- Max ONE grid-breaking element per section (chip/stamp); everything else sits on the grid
- Color proportion target: ~70% neutral paint/metal · ~20% structure (navy/ink) · ~10% accents (red/emblem bars/Kapton)
- Nested blocks inherit their host's alignment; never stack independently rotated children
- Every decorative layer must EARN its place: hazard=warning, stamp=approval, emblem=identity. Decoration stacked on decoration with no meaning = delete it
4.4 Layout collision prevention (hard rules)
- Text-over-block requires ≥4.5:1 contrast against THE BLOCK's color — never dark glyphs on navy/red, never light on paint
- Hanging decorations: negative offset + element width must fit inside container side margin — or reserve space with padding instead of hanging into the margin at all
- z-index registry — background slabs
1 < content 2 < accents 3 < rails 4 < stamps 6; never improvise values
- Breakpoint audit: every absolutely-positioned element re-checked at 1440/1020/720/380px; when base geometry changes, DELETE stale responsive overrides (don't patch around them)
white-space:nowrap data gets an ellipsis/shrink guard at ≤720px; wide tables scroll horizontally instead of compressing
- Stamps/chips may overlap only EMPTY space or their own host's border — never glyphs of unrelated text
4.5 Ambient line-art backdrop (doodles)
Low-opacity stroke-only SVG motifs scattered as background decoration: ringed planet, latitude planet, spiral galaxy, constellation + four-point sparkle, retro rocket, orbit diagram. Build ONE hidden <defs> symbol library; instantiate with <svg class="doodle"><use href="#dd-*"/></svg>.
Laws:
- Stroke
currentColor, fill:none, stroke-width ~2 @ 120 viewBox — same drafting voice as §4.2 icons
- Opacity 0.06–0.10 on light surfaces (
color:--metal-dark), 0.10–0.14 on navy/blueprint (--paint-alt)
- Always
pointer-events:none; z-index:0 with every section's .container lifted to z-index:1 — doodles may pass under text but must never lower its contrast; prefer placing them in padding/margin whitespace zones
- Deterministic hand-placed positions, sizes 60–180px, slight rotations — NO JS random placement (reproducibility + collision control); ≤2 per section; skip dense instrument bands (telemetry) entirely
- Text-in-box law: compute rendered width BEFORE boxing text — monospace advance ≈
0.6em + letter-spacing per char; rendered text must fit its box minus ≥6% side padding. Size the box to the string, never squeeze the string into a pre-existing box
- Circular textPath law: baseline radius = ring-band midpoint − cap-height/2 (glyphs grow OUTWARD from the baseline on top arcs); path length must exceed text length (
semicircle = π·r) — verify with the 0.6em+tracking estimate, shrink font/tracking until it fits with ≥5% margin. Clipped glyphs or baseline-hugging rings are defects
- Marker/label lane separation: timeline/map markers and their labels live in separate perpendicular lanes — ≥6px clearance between marker's rotated/hover bounding extent and label ink at BOTH rest and hover states. Preferred pattern: step the label diagonally up-right of its marker (both axes offset, technical-callout style) — diagonal separation survives hover growth far better than direct stacking; on mobile collapse to stacked flow with the marker moved into a side gutter
5. STARFIELD-MODERN LAYER (the evolution, not a repaint)
This is what separates "museum-piece retro" from Starfield's shipped aesthetic. Apply AFTER the NASApunk base is complete.
5a. Constellation four-color emblem stripes
The signature motif — from AKQA's brand book: "a stripe composed of four earthly colours became their emblem."
Construction (critical): NOT a smooth gradient. It is 4 equal-width SOLID-COLOR bars side-by-side with hard edges, square ends, tight/no gaps, full height. Color sequence left→right is blue → gold(yellow) → orange → red, deliberately mirroring stellar spectral classification cooling down (O blue → M red) — an astronomy easter egg confirmed in Bethesda interviews.
/* hard-stop gradient form — single element, zero markup */
.sf-bars{
background:linear-gradient(90deg,
var(--sf-navy) 0 25%,
var(--sf-gold) 25% 50%,
var(--sf-orange) 50% 75%,
var(--sf-crimson) 75% 100%);
}
.sf-stripe-v{width:clamp(5px,.8vw,14px)} /* vertical bar cluster — hero side */
.sf-stripe-h{height:clamp(4px,.6vw,8px)} /* horizontal variant — structural bands */
/* flex form — when bars need individual widths/gaps */
.sf-flag{display:flex;gap:0} /* gap:2px for the spaced variant seen on merch */
.sf-flag > i{flex:1}
Note: the Constellation circular badge (navy disc + white star dots + warm semicircle arc) is a SEPARATE element from this stripe — don't conflate them.
Optional display variant — white block, blue text: in composed lockups (NOT inside the 4-bar rail itself), an --sf-offwhite block may sit to the RIGHT of a red block, carrying text set in stripe-blue (--sf-navy). Use for value chips, short labels, or a secondary headline word. Pairing law: always place it after/near red or a full stripe so the white reads as part of the sequence, never as a floating gray box. Recipe: .sf-chip-white in snippets.css.
Placement rules (restraint is the point):
- ONE prominent vertical bar-cluster beside the hero headline
- Thin 4–6px vertical accents on card/plate left edges
- ONE horizontal band under masthead or atop footer
- Small chip near mission patch
- Never more than ~4 stripe instances per page; never on dark instrument bands
Faction-livery variant (UC ship paint): white body with hard red/blue side bars — use as color-blocked panel headers sparingly.
5b. Motion system
| Pattern |
Spec |
| Enter/open |
var(--dur-enter) var(--ease-out) (200–300ms range) |
| Exit/close |
var(--dur-exit) var(--ease-in) |
| List/card reveal |
stagger items by var(--stagger) (20–40ms) |
| Badge shine |
diagonal light-band ::after sweeping once on load + on hover (~900ms ease-out) |
| Scan reveal |
thin gold line sweeping over blueprint line-art, slow loop (~7s), low opacity — orbital-scan read |
| Breathing attention |
opacity loop .55 → 1, 2.5s ease-in-out (sine), infinite — the ONLY sanctioned attention loop (see MOTION TEMPO LAW) |
| Accessibility |
ALL decorative motion inside @media (prefers-reduced-motion: no-preference) |
MOTION TEMPO LAW (hard):
- Attention states BREATHE: 2.5s ease-in-out sine opacity loop,
.55 → 1. They never blink
- Blinking or pulsing under 500ms is a HARD FAIL (also §10)
- Entrances/exits run 150-250ms ease-out; the §2 duration tokens remain canonical for the light mode
- Holographic / flicker / sci-fi glow effects are permitted in AT MOST ONE designated special zone per page (the SANCTIONED EXCEPTION ZONE); everything else stays flat vector. Name the zone in a comment before styling it
5c. Panel modernization
- Keep square corners and hard offset shadows (retro character) but LAYER a soft modern shadow first in the stack:
0 2px 10px rgba(32,35,42,.08)
- Hover lifts use
var(--ease-out) timing
- Dual-mode split is codified: LIGHT menus/pages + DARK instrument bands (telemetry/HUD widgets) — both exist, cleanly separated
5d. Interaction states (hover / press — required, not optional)
Every interactive element answers the pointer. Timing from micro-interaction standards: hover 150–200ms, press ≤150ms; animate transform/opacity only.
| Element |
Hover |
Press/:active |
| Nav link |
text→red + 2px red bar sweeps in from left along baseline (right:100%→0) |
n/a |
| Card/plate |
lift −3px + soft shadow deepens (existing §5c) |
settles to −1px — physical depression |
| List row / timeline item |
4px --sf-crimson left-edge marker slides in; marker dot scales 1.35 |
n/a |
| Button/badge |
background shifts one token step lighter |
scale .97 or translateY +1px |
| Focus (keyboard) |
global outline:2px solid var(--red); offset:2px — never remove |
n/a |
Laws: states must remain readable with motion disabled (global reduced-motion kill-switch handles it); hover may REVEAL information but never MOVE text the user is reading; only ONE sweep animation per region — a page of everywhere-sweeping underlines is noise, not polish.
5e. Data visualization - technical-report figures
Charts are rendered as PRINTED REPORT FIGURES set into light figure plates - monochrome ink first, color only as accent. This mirrors actual 1960s-70s NASA TN/SP report figures (verified against NTRS primary sources). Recipes: references/snippets.css SS12e.
Four-fill ladder (series encoding WITHOUT color):
| Fill |
Spec |
Semantic |
| Outline |
transparent fill, 1.5px --ink border |
default series |
| Solid |
--ink fill |
emphasized / current value |
| 45-deg single hatch |
1px ink strokes @ 6px spacing, outlined |
caution / secondary emphasis (may tint rust) |
| Cross-hatch |
two crossing hatches, outlined |
tertiary / limit envelope |
Plot-area laws (from primary sources):
- NO graph paper inside plots - plain face only; sparse DASHED reference lines when needed
- AXES DEFAULT OFF: do not draw X/Y axis lines unless the layout guarantees >=12px clearance from every label and bar - a fixed-position axis line crossing label lanes is the most frequent NASApunk-chart defect. Tick stubs alone (
.fig-ticks) carry the scale; when axes ARE justified use the opt-in .fig-plot--axed modifier and re-run the collision scan
- Event flags: HOLLOW squares; dashed verticals mark events
- Caption strip inside plate bottom:
FIG. 2A - TITLE letterspaced mono caps, hairline rule above
- Monochrome-first is authentic: era reports were 1-2 color prints (NHB 1430.2); red/rust reserved for emphasis
Gauge state vocabulary (scoped to dials/meters only):
- Range bands: muted aviation green
#3A8C3A / amber #E8B830 / brick #C62828 - desaturated, painted-on-dial authenticity; page palette elsewhere unchanged
- Three-state flags (Apollo Experience Report): GRAY = operating/open, BLACK-WHITE STRIPED (
repeating-linear-gradient(45deg,#1A1A1A 0 4px,#F4F3EF 4px 8px)) = deactivated/closed, RED = failed
- Annunciator tiles: sage frosted lens
linear-gradient(#CFD4CF,#A8B0A8) + olive bezel #85857F, lit amber #E39A2F; green #4FC04F permitted ONLY inside annunciator rows (restored-MOCR evidence)
Instrument hierarchy: the THREE-RING INSTRUMENT (§5g) supersedes the plain dial gauge for HERO instruments (FIG. 9E, Band 14); keep the plain dial for dense multi-gauge arrays.
5f. Figure sheets (charts as printed document inserts)
One figure per sheet; present 3-up exactly like the spec-plates section - but the sheets must NOT reuse the metal-plate shell (avoid section homogeneity). Instead each chart sits on a report-figure sheet: bone paper, thin ink frame, graph-grid texture, FIG tab notch breaking the top border, crop marks outside two corners, caption below.
Construction:
.fig-sheet: bone #FBFAF7 + dual-scale light grid (22px) + 1px ink border; padding reserves a top band for the tab
.fig-tab: FIG id chip breaking the top border (background matches sheet so the border reads "interrupted")
.sheet-head: mono caps title left / qualifier right, above the plot
.fig-plot: L-axes + ticks per §5e; modifiers: --hbar drops the Y axis (horizontal charts own that lane for labels), --bare drops axes entirely (dial plates)
.sheet-cap: letterspaced mono caption below the plot
- Optional annunciator tile row (max 4) under one sheet per section
Laws: one chart type per sheet; values plausible + consistent across sheets; ink-on-paper only (no backlight/glow).
Live example: Section 02 in
assets/reference.html. Recipes: references/snippets.css SS12e/SS12f.
5g. Component grammar (console/HUD vocabulary)
Named components of the console/instrument vocabulary (deployed per §0B deployment laws). Each is a closed construction: build it as specified, do not improvise variants except through the faction skin system.
- SCANNER MONOCLE VIEWER: circular reticle + horizon line + vignette inside the lens. Unscanned state = cyan outline only; scanned state = solid fill. A flat survey card docks LEFT of the monocle, never overlapping it
- STARMAP PANEL: concentric orbit rings + one dotted ellipse + double-ring planet nodes; info card docked left of the ring system
- LEADER-LINE CALLOUT: 1px line + terminal dot connecting a label card to its target; same lane-separation laws as §4.5 rule 9
- STATUS CHIP TRIAD: green/amber/red state chips (console-mode extension of the §5e gauge vocabulary to chip scale) plus the rarity trio
#73CCDF / #9A7BFF / #EEC162; chips carry status ONLY, never decoration
- HERITAGE SERIF LAYER: gold
#D4A94A serif headlines on deep ground + an eight-point compass-rose SVG mark; reserved for fictional heritage brands ONLY (§8: never real insignia, never Starfield's actual marks)
- FACTION SKIN SYSTEM: ONE neutral geometry + N paint packs (e.g. EXPLORER / MILITARY / CORPORATE / FRONTIER). Same geometry, different livery tokens; NEVER redraw geometry per faction
- ROUNDEL CONSTRUCTION FORMULA: faction/corp badge in four zones: outer inscription ring (curved
textPath: org name + est. year) + upper field (star cluster or glyph) + lower semicircle band split into 2-3 color arcs (gold/orange/red family) + center core glyph. Annotate the zones when presenting the badge. All branding fictional per §8; zone grammar descends from worm-era graphics standards (1976-92) used as stylistic reference window. Reference: assets/reference.html FIG. 9D; recipe: references/snippets.css Band 14
- ROUNDEL CONCENTRIC LAW: every zone circle/arc in a roundel/badge shares ONE center - verify with
scripts/icon-geometry-check.js (arc-center reconstruction catches off-axis bands eyeballing misses). A band tip crossing the field boundary is a HARD FAIL.
- WAYFINDING SIGN: navy-ground plate, white text: large letter-code station ID + station name + arrow rows with district codes + corner map thumbnail. This is the SANCTIONED EXCEPTION where a solid navy ground replaces cream; every other surface stays light-dominant (§10). Reference:
assets/reference.html FIG. 9G; recipe: references/snippets.css Band 14
- THREE-RING INSTRUMENT: dial upgrade: outer ring = function ticks/icons, middle ring = percentage arc + needle, inner circle = date/time/status line. Replaces the single-ring gauge whenever an "instrument cluster" feel is requested. Spec lineage: Chronomark watch FCC filing. Reference:
assets/reference.html FIG. 9E; recipe: references/snippets.css Band 14. DIAL GEOMETRY LAW: value-arc endpoints must be typed ON the dominant center - both endpoints exactly at ring radius (a single mistyped coordinate drifts the entire sweep off-axis; caught by scripts/icon-geometry-check.js single-arc rule). The needle tip must reach the ring-track inner edge, never float short of its scale.
5h. Interface component gallery (ten standard patterns - DEFAULT VOCABULARY)
Ten complete, interaction-ready page patterns. Selection is driven by STRUCTURE, not keywords: inspect what the page (or request) actually contains - lists, cards, meters, forms, maps, dialogs, logs, tables - and apply the matching pattern. The game flavor in the names is optional paint; the grammar below fits ANY domain (e-commerce, CMS, SaaS admin, portfolio, docs, blog...).
| # |
Pattern |
Apply to ANY UI containing... |
| G1 |
Data Menu trio |
a category sidebar + item list + detail card: admin panels, product/CMS/file managers, inventories, libraries, mail clients, dashboards |
| G2 |
Terminal |
command consoles, log viewers, CLI-flavored sections, system status readouts; any diegetic terminal block |
| G3 |
Power allocation |
any shared-pool allocation widget: storage quotas, budget splits, load distribution, skill-point spenders, progress pools |
| G4 |
Starmap panel |
node-and-link graphics: maps, org charts, relationship/network graphs, flowcharts, location pickers |
| G5 |
Mission board |
task/job/ticket/quest/announcement listings, TODO boards, application queues |
| G6 |
Settings form |
preference/config pages, any toggle+slider+select control cluster |
| G7 |
Modal confirm |
confirmations, destructive-action warnings, hazard dialogs |
| G8 |
Credits roll |
about/team/acknowledgment sections, end matter, changelog closers |
| G9 |
Reading page |
articles, documentation entries, book chapters, help centers - any long-form reading surface |
| G10 |
Item inspect card |
product/profile/item detail cards: stats, delta-vs-comparison values, mini meters, brand slot |
Laws: one pattern per section; compose up to 3-4 per page; every pattern inherits Bands 1-14 base laws unchanged; interactions are vanilla JS; live implementations render in assets/reference.html SECTION 07 (FIG. G1-G10); recipes in references/snippets.css BAND 15.
COMPOSITE SIGNATURE (candidate, not mandate): a G-pattern fires when its signature atoms co-occur on one screen - but the detection output is a CANDIDATE with confidence, never a forced command. Agent verifies before composing. Signatures live in references/component-matrix.md M-G sections.
DUAL-CHANNEL DETECTION (G1 data-menu, G9 reading, M-IMG images): these patterns fire via TWO independent channels, kept deliberately parallel:
- Channel A — SCRIPTED:
refactor-inventory.js detects structural signals and emits candidates — G1 via data-menu-trio (rail+list+detail in one pane) or counting signature; G9 via long-form-prose (≥5 non-list paragraphs, ≥300 chars, outside card/table/form); M-IMG via img-photo/carousel atoms (any photo image or carousel → IMG?, plus img-avatar/img-gallery role hints).
- Channel B — AGENT/MANUAL: the agent judges scenes per the §5h table and M-IMG grammar, independent of any script signal — G1 on any category-rail+list+detail screen (including framework three-pane compositions the script cannot see), G9 on any long-form reading surface, M-IMG on any image-bearing surface (banner, long figure, carousel, avatar, gallery, inline figure, thumbnails) including framework image components the regex cannot see.
Either channel alone may raise a candidate; the agent confirms the scene/role before composing. Keep BOTH channels — never replace one with the other: scripted detection catches repeatable structure the eye may skip, manual judgment catches framework containers the regex cannot see.
5i. Image presentation grammar (photo/image layout — M-IMG)
Image-rich pages (nasa.gov-style: banners, long figure shots, carousels, portraits, galleries, inline figure photos) must map EVERY image to the NASApunk image-presentation grammar — never a plain embed. Full per-role table + stack mappings + verification in references/component-matrix.md M-IMG; live implementations in assets/reference.html FIG. 14A-14H. Rules:
- Framing: every photo sits in an ink 1px frame with corner crop marks (L-marks outside two corners). No rounded frames (crop marks need square corners) — portraits included.
- Captions: every image gets a FIG plate — mono
FIG. N-M id (red) + title + credit; preserve the figcaption element for a11y and re-skin it.
- Role grammar (per M-IMG table): banner = full-bleed + caption slab (red/ink, contrast-checked) over dark image area; long figure = ink frame + binding rail + fold ticks; carousel = framed + mono index chips
01/04 + square arrow buttons (no animated dots); avatar = square frame + initials chip fallback (navy fill, mono caps); gallery = equal-width cells each with own FIG chip + own caption; inline figure = float left/right max-width 45% + 16px gutter; thumbnails = small square frames + mono indices; loading/error = hatch placeholder + "LOADING"/"NO DATA" stencil, breathe 2.5s (never blink).
- Zero image/text occlusion: figure gutters ≥ 12px; caption bars never overlap image pixels; overlaid headline slabs contrast-checked; inline figures keep body copy clear.
- Zero external requests: no external image sources — inline SVG/data-URI placeholders, or the original image inlined; framework image components (
el-image, next/image) wrapped with frame classes.
- Data preservation (SAFETY LAW #2): original
src, dimensions, alt, and caption TEXT are never altered — only the frame/chrome/caption STYLE changes.
PRIORITY & DISAMBIGUATION (advisory): when one screen matches several composites - charts >= 3 -> M-DASH first; sidebar+list+detail -> G1; confirm-dialog present -> G7 always wins for that dialog; ambiguity unresolved -> present the shortlist to the user, never blind-pick.
OPTIONAL SCENE PATTERNS: G2 (Terminal), G3 (Power allocation), G8 (Credits roll) are scene-optional: they compose ONLY when the scene genuinely matches (log viewer / allocation widget / acknowledgments reel). They are never forced, and their absence from a page is a correct outcome, not a coverage miss.
SAFETY LAW (hard, all refactors):
- LAYERED IRREVERSIBILITY: L1 token/color layer = always safe & reversible. L2 structural layer = allowed ONLY while the framework behavior contract is preserved (sorting, validation, pagination, v-model bindings, ARIA). L3 dataviz = option-object changes only, never swap rendering engines.
- SKIN NEVER TOUCHES LOGIC: data flow, validation, accessibility, and framework contract stay byte-identical. A pattern that requires DOM replacement of a behavior-bearing component is implemented as deep-selector overrides instead.
- COMPOSITE CANDIDATES NEED AGENT CONFIRMATION: never blind-compose on signature count alone.
- COVERAGE GATE CHECKS BEHAVIOR PRESERVATION: transformation evidence = computed-style assertion AND original event bindings/methods still usable - not just "style changed".
- REVERSIBLE BY DEFAULT: every transformed screen must be revertible by removing the injected skin layer (no baked-in data mutations).
REFACTOR LAW (whole-project application): when restyling an EXISTING frontend, this skill applies IN FULL - there is no partial mode. Procedure: (1) structurally inventory the target (nav / lists / cards / forms / tables / modals / footers / logos); (2) map every structure to its gallery pattern and texture set; (3) re-skin everything with §2 to
…(truncated)
1---2name: nasapunk-design3description: NASApunk retro-futurist frontend design system with a Starfield-inspired modern layer — NASA golden age (1960s–1980s) aesthetic evolved with Starfield's contemporary polish, for building or restyling web pages. Worn white baked-paint panels, gold Kapton insulation foil crinkle gradients, worm-style single-stroke red wordmark, Swiss grid typography (Helvetica + monospace stencil labels), technical documentation textures (rubber stamps, blueprint grids, hazard stripes, rivets, monospace spec tables, mission patches, doc-control bars) — plus Constellation-style four-color emblem stripes, soft-shadow panel refinement, and a systematic ease-out/stagger motion language. Spirit: "High tech, high hope" meets "Forever in adventure" — institutional optimism, worn-not-ruined hardware, utility-first engineering realism, warmly modernized. Use for building or refactoring ANY page into NASApunk/Starfield style: retro space-agency landing pages, aerospace-themed dashboards, mission-control UIs, magazine covers, agency memos4---56# NASAPUNK DESIGN SYSTEM (× STARFIELD-MODERN)78Build pages that read as "1970s government aerospace documentation meets worn flight hardware — polished with Starfield's modern brand-system confidence."9Reference implementation (baseline template): `assets/reference.html` (open in browser — single file, zero dependencies).10Copy-paste CSS recipes: `references/snippets.css`.1112---1314## 0. STACK PORTABILITY (global constraint)1516Every law and recipe in this skill MUST remain implementable across **React, Next.js, Vue, Svelte, SwiftUI, React Native, Flutter, Tailwind, shadcn/ui**:1718- The single-file HTML reference is the CANONICAL spec. When the target stack differs, translate tokens/structure - never drop laws.19- Tokens: CSS custom properties are canonical; map them 1:1 to platform equivalents (SwiftUI Color/Font extensions, RN theme object, Flutter ThemeData, Tailwind theme.extend.colors).20- Effects matrix: hatching/stripe fills = repeating-linear-gradient (web/Tailwind arbitrary values) | SwiftUI `.linear-gradient` stripes or ShapeStyle | RN gradient lib | Flutter `DecoratedBox`/CustomPainter. Donut/dial = conic-gradient | SwiftUI `Circle().trim(AngularGradient)` | RN `react-native-svg` Circle strokeDasharray | Flutter CustomPaint. blend/mask tricks degrade gracefully - substitute precomputed colors where a stack lacks mask support.21- Component mapping: figure plates/cards become components per stack (shadcn/ui = recipe over primitives; SwiftUI/RN/Flutter = view structs/widgets); semantic roles (figure/figcaption, table headers) preserved for a11y.22- Workflow: build against the HTML reference first when unsure, then port; visual verification (§9 step 10) applies to EVERY stack output.2324---2526## 0B. STYLE SYSTEM (one base skin, two surface families)2728One base skin carries TWO surface families. Both deploy AUTOMATICALLY when the scene fits - and the user can always explicitly request either:2930| Surface family | Ground | Deploy when |31|---|---|---|32| **PRINT DOCUMENT** (dominant) | Light paper + ink; report figures; document props woven in | Default for pages and sections; always the page-level base |33| **CONSOLE INSTRUMENTS** | Dark `#0A1420`/panel grounds + §2B tokens + §5g components | Scene fits an instrument: terminals, logs, dashboards, status walls, data-dense readouts, HUD widgets - OR user explicitly requests dark/console mode |3435### Base skin composition (always on)3637- §2 light tokens + ALL §4 texture recipes38- §6 print-document layer woven in (>=2 Band-15 artifacts)39- §2B console tokens + §5g component grammar, deployed onto fitting sections40- **Era grades are part of this skin's toolkit**: apply a root class (.era-apollo etc.) when the scene warrants a commemorative/heritage tone; default none4142### Deployment laws4344- Page-level ground stays LIGHT unless the user explicitly requests full-console mode45- Dark instrument surfaces attach to instrument-shaped content: terminals, log walls, telemetry, status-heavy clusters - never to body text or reading surfaces46- If the user asks "which styles exist", present both surface families from this table47- If the user wants BOTH skins on one subject, deliver a variant set: PRINT version first as canonical, then a CONSOLE twin48- Silence = PRINT-dominant build with autonomous dark-instrument deployment where scenes fit4950## 1. THE ONE RULE (dual-layer decision filter)5152> **Layer 1 (retro body): "Would this look at home in a 1979 government technical exhibit?"**53> **Layer 2 (modern soul): "…and would Starfield's brand team ship it today?"**5455Every visual decision passes through BOTH. Layer 1 blocks cyberpunk drift; layer 2 blocks museum-piece stiffness. NASApunk is NOT cyberpunk, NOT neon sci-fi — and NOT a costume: the retro language is executed with contemporary cleanliness.5657Spirit checklist — the page must feel:58- **Grounded**: everything extrapolated from real aerospace tech; function parts visible (tanks cylindrical, pipes exposed, radiators prominent)59- **Institutional optimism**: "High tech, high hope" → extended by Starfield's "Forever in adventure" — scientifically inspired, grounded warmth, unapologetically optimistic60- **Utility first**: design serves engineering truth, not gloss; hardware looks like it just came out of a lab61- **Worn, not ruined**: "乐观主义的磨损" — scuffed paint, lived-in surfaces, but maintained and loved ("a worn and loved futuretech" — ESA). Never decayed/abandoned62- **Analog-first**: physical switches > touchscreens; CRT texture only on instrument widgets63- **Systematically branded**: like AKQA's Clio-winning brand book — consistent tokens, deliberate motion, dos-over-don'ts coherence6465---6667## 2. COLOR TOKENS (hardcode exactly — no free interpretation)6869```css70:root{71 /* Brand layer */72 --red:#E4002B; /* signal red (proven default) */73 /* Official alternatives: worm red PMS 179 = #E03C31 (warm orange-red,74 light backgrounds ONLY); meatball red PMS 185 = #FC3D21 */75 --navy:#0B3D91; /* NASA blue PMS 286 */76 --ink:#20232A;7778 /* Paint / metal layer */79 --paint:#F4F3EF; /* off-white baked paint — page base, LIGHT-dominant */80 --paint-alt:#E9E7E1;81 --metal-light:#A8ACAF;82 --metal-mid:#6E7378;83 --metal-dark:#43484C;84 --rule:rgba(67,72,76,.28);85 --seam:rgba(67,72,76,.38);8687 /* Rust / orange-brown layer */88 --rust:#C96A2B;89 --rust-deep:#8C4A22;9091 /* Kapton gold layer — use SPARINGLY (1–2 hero elements max) */92 --gold-1:#E8B84B;93 --gold-2:#C9932E;94 --gold-3:#A87A1F;95 --gold-sheen:#B98A5A;9697 /* STARFIELD-MODERN accent layer (extracted from game assets, ColorKit)98 ACCENT ONLY — base stays red/white/blue dominant.99 Division of labor: Kapton gold = hardware foil; sf-gold = brand badge. */100 --sf-gold:#d4ac63;101 --sf-crimson:#cd2435;102 --sf-orange:#e56335;103 --sf-navy:#2b4d7d;104 --sf-offwhite:#f4f5f7;105106 /* Motion tokens (Starfield motion language) */107 --ease-out:cubic-bezier(.2,0,0,1);108 --ease-in:cubic-bezier(.4,0,1,1);109 --dur-enter:240ms;110 --dur-exit:180ms;111 --stagger:30ms;112}113```114115**Color laws** (worm-era graphics standards, 1976-92, used as stylistic reference window):116- Red/white/blue dominant + gray-white metal base + orange-brown accents117- **NO PASTELS** — explicitly banned by the manual; bright primaries only118- Warm red is THE signature color; navy is structure; gold is rare and precious (Kapton foil reads as expensive thermal hardware)119- Worm-style red only on white/light backgrounds120- `--sf-*` tokens are a thin accent layer: emblem stripes, small chips, motion highlights. Never repaint base surfaces with them.121122Shared noise/grunge data-URIs (inline feTurbulence, zero network):123```css124--noise:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)'/%3E%3C/svg%3E");125--grunge:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.55' numOctaves='3' seed='7' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0.92 0'/%3E%3C/filter%3E%3Crect width='120' height='120' filter='url(%23g)'/%3E%3C/svg%3E");126```127128### 2B. CONSOLE-MODE TOKENS (dark surface mode)129130Console mode is the sanctioned full-page dark variant: instrument-band logic expanded to a whole page. Deploy it in EITHER of two ways: (a) autonomously, when the scene is instrument-shaped (terminal/dashboard/log wall), or (b) on explicit user request for dark/console/HUD mode (§6). Hardcode exactly:131132| Token | Value | Role |133|---|---|---|134| `--bg-deep` | `#0A1420` | Page base, deep space blue-black |135| `--panel-base` | `#15181C` | Console panel ground |136| `--slate` | `#35444A` | Structural metal, rules, bezels on dark |137| `--info-cyan` | `#4AA8C0` | Passive data / tech / info |138| `--screen-glow` | `#7FC8B0` | Phosphor readouts, live values |139| `--alert-amber` | `#E29726` | Alerts / actions / interactive states |140| `--danger-red` | `#E71D24` | Failure and danger states |141| `--equipment-cream` | `#D8D2C0` | Primary body text on dark |142| `--equipment-cream-hi` | `#E8E4DA` | Emphasized text, headlines on dark |143144**Console-mode color laws**:145- **SEMANTIC AXIS**: the cyan family (`--info-cyan`, `--screen-glow`) marks passive data/tech/info ONLY; amber (`--alert-amber`) marks alerts/actions/interactive states ONLY, never decorative rest-state146- NO pure `#000` or `#FFF` surfaces anywhere in console mode147- Panels are FLAT alpha overlays of `--panel-base` at ~55-66% opacity over `--bg-deep`; `backdrop-filter:blur` FORBIDDEN (Scaleform-faithful flatness)148- Console mode inherits every other §2 law unchanged; the light palette remains the default page mode149150### 2C. ERA COLOR GRADES (optional light-mode tint grades)151152Optional tint grades over the standard §2 print palette, named after Starfield's real photo-mode filters (Mercury Era / Gemini Era / Apollo Era). Implement each as a class-scoped `:root` override on the root element (`<html class="era-apollo">`): the class re-maps existing tokens, it never adds new ones. Hardcode exactly:153154| Class | Shift direction | When to use |155|---|---|---|156| `.era-mercury` | Cool grey-blue shift: slightly desaturate warm tones, nudge `--paint` toward grey | Early-program austere documents, cold test-phase sobriety |157| `.era-gemini` | Neutral steel: balanced temperature, no channel bias | Program-midpoint neutrality; the baseline read with a cooler spine |158| `.era-apollo` | Warm sepia shift: nudge neutrals toward tan/brown | Golden-age warmth, commemorative and heritage pieces |159160**ERA GRADE LAWS**:161- Grades are SUBTLE: token-level tints only, never new hues; the base §2 palette must stay identifiable through the grade162- ONE grade per page, applied at the root; never mix grades inside a page163- Console mode (§2B) ignores era grades entirely164- Recipe: `references/snippets.css` Band 14165166---167168## 3. TYPOGRAPHY LAWS (Swiss / NHB 1430.2)169170```css171--font-head:"Helvetica Neue",Helvetica,Arial,"Liberation Sans",sans-serif;172--font-mono:ui-monospace,"SF Mono",Menlo,Consolas,"Liberation Mono",monospace;173```174175| Element | Rule |176|---|---|177| Headings | Helvetica stack, UPPERCASE, weight 800, tight tracking `-0.02em`, line-height **1.04–1.08 when multiline** (below ~1.02 descenders/comma tails invade the next line's caps); ≤1.0 only for single-line display |178| Stencil labels | Monospace uppercase, wide tracking `+.12em` to `+.16em`, size 9.5–11px — technical tag voice |179| Alignment | **flush-left / ragged-right** (never justified) |180| Data tables | Monospace, `font-variant-numeric:tabular-nums`, thin bottom rules, labels left / values right-aligned bold |181| Body | Line-height ≥1.45 |182183**Nasalization note (Starfield's UI typeface)**: Starfield's menus use **Nasalization** (Ray Larabie, 1997) — a geometric sans whose letterforms descend from the worm logotype of the worm-era graphics standards (1976-92) used as stylistic reference window. It is the *spiritual benchmark* for display type. Web zero-dependency strategy: keep the Helvetica stack as default; if the host project already loads a licensed Nasalization or similar geometric sans, apply it to display headings via an optional `@font-face` hook. Without it, hint the geometry with slightly wider tracking (+0.01em) on the largest headline only.184185**Font tiering note (reference faces vs free chain)**: Starfield's actual UI faces are **NB Architekt** and **NB Grotesk R** (Neubau Berlin, commercial licenses, diamond-grid construction). They are the REFERENCE faces: study their proportions, never hotlink or embed them. Free implementation chain for tech display: **Exo 2** first, **Chakra Petch** where a harder stencil-technical voice is needed; both via host-project font loading only (zero external requests law still applies to shipped output). Directional arrows `←` `↑` `→` `↓` are set in the text font itself, never swapped for icon sprites. CJK note: when CJK glyphs enter the stack, the Latin face carries identity alone; pair any system CJK fallback and do not attempt to stylize CJK glyphs.186187**Prop document fonts (diegetic print props)**: memos, forms, crates and other diegetic prop documents MAY set BODY text in a plain late-90s system stack `"Verdana",Tahoma,Geneva,sans-serif`, reproducing the game's actual printed-prop texture (community font surveys report stock Microsoft-era faces on posters/signage). The display/headline layer stays Helvetica-family. Law: prop fonts never exceed body/small sizes and never appear in mastheads or display settings.188189---190191## 4. TEXTURE RECIPES (effect → technique → where)192193Full copy-paste code in `references/snippets.css`; live examples in `assets/reference.html`.194195| Effect | Technique |196|---|---|197| Worn white paint | Layered radial-gradient scuffs (white highlight top-right + faint rust/gray stains) over flat `--paint`; site-wide 5% `--noise` grain via fixed overlay |198| Metal plate panel | `--paint-alt` bg + inset bevel box-shadows (top-light/bottom-dark) + hard offset shadow (`5px 6px 0 rgba(...)`) + 1px seam border |199| Rivet rows | `repeating` radial-gradient dot tile (dark core + white highlight), repeat-x top & bottom edges of panels — see `.rivets` |200| Corner screws | Radial-gradient dots via panel `::before/::after`, highlight at 35%/30% |201| Panel seams | 1px `--seam` borders + inset bevel shadows |202| Gold Kapton foil | Multi-stop linear-gradient (#E8B84B→#C9932E→#A87A1F + #B98A5A sheen) × TWO crossing `repeating-linear-gradient` crinkle facets (~112deg + ~23deg) + noise multiply overlay — see `.kapton-rail` |203| Rubber stamp | Rotated bordered text, double ring (::before inset border), grunge ink via `mask-image:var(--grunge)` + `mix-blend-mode:multiply`, opacity .88 — see `.stamp` |204| Hazard stripe | `repeating-linear-gradient(45deg,#17181A 0 13px,var(--gold-1) 13px 26px)` full-bleed strip + caution note in rust-deep mono |205| Blueprint section | Navy `--navy` background + dual-scale light grid (two `repeating-linear-gradient` pairs: 24px fine + 120px coarse) + dashed leader lines → SVG line-art annotations |206| Drafting-paper surface | Cream `#FBFAF7` + light gray grid 22px (α.05), optional coarse 110px majors - section/card background for document-genre pages; recipes `.np-graphpaper(--pad)` Band 15b |207| Mission patch | Circular SVG badge: navy ring, circular `textPath` lettering, red planet arc, gold capsule on dashed trajectory, stars |208| Telemetry widget | Dark `--metal-dark` band, mono tabular values in `--gold-1`, blinking caution lamp; **CRT scanlines (repeating-linear 0deg 1px/3px + flicker keyframe) confined to THIS widget only** |209| Doc-control bar | Top strip on `--metal-dark`: mono 10px `DOC NO. XXX-71-C • REV C • FORM 8-246` metadata |210| **Constellation emblem stripe** | Four SOLID bars side-by-side, hard edges (`navy→gold→orange→crimson`) as accent — see §5a |211| Motion polish | Ease-out/stagger system + shine sweep + scan reveal — see §5 |212| Charts & meters | Segmented bars / horizontal meters / donut gauges in framed instrument panels — see §5e |213| Brushed-metal bevel panel | Console-mode counterpart of "Metal plate panel": dark `--panel-base` ground + inset highlight/shadow bevel box-shadows + low-opacity streak gradients along the brush direction; ALWAYS matte, never glossed |214| Wet-gloss streak | ONE low-opacity linear highlight band across a dark panel; never on text surfaces |215| Breathing vignette | Radial-gradient corner darkening at ~50-60% strength behind hero and empty states; sits under content, never over it |216| Warm-cool split light | Cool shadow tint `rgba(58,90,110,.25)` paired with warm key tint `rgba(232,136,48,.35)`; keep the pair balanced wherever dark surfaces meet light |217218### 4.1 Blueprint grid — required scenarios219220The navy dual-scale grid (§4 "Blueprint section" row) is a signature device. Apply it as a REQUIREMENT to:221- Any technical drawing / diagram / schematic section222- Data-dense exhibits: spec tables wider than 2 columns, dashboards, telemetry-adjacent readouts223- Sections whose content IS engineering documentation (drawings, tolerances, revision history)224225Do NOT apply to: body-text paragraphs, footer/legal fine print, hero headline zone, or anywhere it would sit behind running text at full strength.226Legibility law: grid lines ≤7% opacity equivalent (`rgba(244,243,239,.035–.075)` on navy); content contrast always wins over texture. A light-on-paint variant (`--rule` colored lines) may serve data sections on light surfaces.227228### 4.2 Small-icon style contract229230| Property | Rule |231|---|---|232| Format | Inline SVG only; stroke-based line art; `fill="none"` on shapes |233| Stroke | 1.5–2 units at a 24–48 viewBox (visually ≈ hairline-to-medium); round caps |234| Color | Single hue via `currentColor`/`--metal-dark` on light, `--paint-alt` on dark; ONE small filled accent allowed per icon (dot/square in `--red` or `--gold-1`) |235| Geometry | Circles, rects, 45°/60° diagonals; engineering-glyph voice (gyro rings, chip pins, blanket waves); no filled silhouettes except tiny status dots |236| Family consistency | Same stroke width + corner language across every icon on the page |237| Forbidden | Emoji, icon fonts, external icon libraries |238239### 4.3 Composition coherence rules240241- Max TWO texture systems per component (a plate may be rivets+seams; not rivets+hazard+stamp+foil stacked)242- Max ONE grid-breaking element per section (chip/stamp); everything else sits on the grid243- Color proportion target: ~70% neutral paint/metal · ~20% structure (navy/ink) · ~10% accents (red/emblem bars/Kapton)244- Nested blocks inherit their host's alignment; never stack independently rotated children245- Every decorative layer must EARN its place: hazard=warning, stamp=approval, emblem=identity. Decoration stacked on decoration with no meaning = delete it246247### 4.4 Layout collision prevention (hard rules)2482491. Text-over-block requires ≥4.5:1 contrast against THE BLOCK's color — never dark glyphs on navy/red, never light on paint2502. Hanging decorations: negative offset + element width must fit inside container side margin — or reserve space with padding instead of hanging into the margin at all2513. z-index registry — background slabs `1` < content `2` < accents `3` < rails `4` < stamps `6`; never improvise values2524. Breakpoint audit: every absolutely-positioned element re-checked at 1440/1020/720/380px; when base geometry changes, DELETE stale responsive overrides (don't patch around them)2535. `white-space:nowrap` data gets an ellipsis/shrink guard at ≤720px; wide tables scroll horizontally instead of compressing2546. Stamps/chips may overlap only EMPTY space or their own host's border — never glyphs of unrelated text255256### 4.5 Ambient line-art backdrop (doodles)257258Low-opacity stroke-only SVG motifs scattered as background decoration: ringed planet, latitude planet, spiral galaxy, constellation + four-point sparkle, retro rocket, orbit diagram. Build ONE hidden `<defs>` symbol library; instantiate with `<svg class="doodle"><use href="#dd-*"/></svg>`.259260Laws:261- Stroke `currentColor`, `fill:none`, stroke-width ~2 @ 120 viewBox — same drafting voice as §4.2 icons262- Opacity **0.06–0.10** on light surfaces (`color:--metal-dark`), **0.10–0.14** on navy/blueprint (`--paint-alt`)263- Always `pointer-events:none`; `z-index:0` with every section's `.container` lifted to `z-index:1` — doodles may pass under text but must never lower its contrast; prefer placing them in padding/margin whitespace zones264- Deterministic hand-placed positions, sizes 60–180px, slight rotations — NO JS random placement (reproducibility + collision control); ≤2 per section; skip dense instrument bands (telemetry) entirely2657. **Text-in-box law**: compute rendered width BEFORE boxing text — monospace advance ≈ `0.6em + letter-spacing` per char; rendered text must fit its box minus ≥6% side padding. Size the box to the string, never squeeze the string into a pre-existing box2668. **Circular textPath law**: baseline radius = ring-band midpoint − cap-height/2 (glyphs grow OUTWARD from the baseline on top arcs); path length must exceed text length (`semicircle = π·r`) — verify with the 0.6em+tracking estimate, shrink font/tracking until it fits with ≥5% margin. Clipped glyphs or baseline-hugging rings are defects2679. **Marker/label lane separation**: timeline/map markers and their labels live in separate perpendicular lanes — ≥6px clearance between marker's rotated/hover bounding extent and label ink at BOTH rest and hover states. Preferred pattern: step the label **diagonally up-right of its marker** (both axes offset, technical-callout style) — diagonal separation survives hover growth far better than direct stacking; on mobile collapse to stacked flow with the marker moved into a side gutter268269---270271## 5. STARFIELD-MODERN LAYER (the evolution, not a repaint)272273This is what separates "museum-piece retro" from Starfield's shipped aesthetic. Apply AFTER the NASApunk base is complete.274275### 5a. Constellation four-color emblem stripes276277The signature motif — from AKQA's brand book: *"a stripe composed of four earthly colours became their emblem."*278279**Construction (critical)**: NOT a smooth gradient. It is **4 equal-width SOLID-COLOR bars side-by-side with hard edges**, square ends, tight/no gaps, full height. Color sequence left→right is **blue → gold(yellow) → orange → red**, deliberately mirroring stellar spectral classification cooling down (O blue → M red) — an astronomy easter egg confirmed in Bethesda interviews.280281```css282/* hard-stop gradient form — single element, zero markup */283.sf-bars{284 background:linear-gradient(90deg,285 var(--sf-navy) 0 25%,286 var(--sf-gold) 25% 50%,287 var(--sf-orange) 50% 75%,288 var(--sf-crimson) 75% 100%);289}290.sf-stripe-v{width:clamp(5px,.8vw,14px)} /* vertical bar cluster — hero side */291.sf-stripe-h{height:clamp(4px,.6vw,8px)} /* horizontal variant — structural bands */292293/* flex form — when bars need individual widths/gaps */294.sf-flag{display:flex;gap:0} /* gap:2px for the spaced variant seen on merch */295.sf-flag > i{flex:1}296```297298Note: the Constellation **circular badge** (navy disc + white star dots + warm semicircle arc) is a SEPARATE element from this stripe — don't conflate them.299300**Optional display variant — white block, blue text**: in composed lockups (NOT inside the 4-bar rail itself), an `--sf-offwhite` block may sit to the RIGHT of a red block, carrying text set in stripe-blue (`--sf-navy`). Use for value chips, short labels, or a secondary headline word. Pairing law: always place it after/near red or a full stripe so the white reads as part of the sequence, never as a floating gray box. Recipe: `.sf-chip-white` in snippets.css.301302Placement rules (restraint is the point):303- ONE prominent vertical bar-cluster beside the hero headline304- Thin 4–6px vertical accents on card/plate left edges305- ONE horizontal band under masthead or atop footer306- Small chip near mission patch307- Never more than ~4 stripe instances per page; never on dark instrument bands308309Faction-livery variant (UC ship paint): white body with hard red/blue side bars — use as color-blocked panel headers sparingly.310311### 5b. Motion system312313| Pattern | Spec |314|---|---|315| Enter/open | `var(--dur-enter)` `var(--ease-out)` (200–300ms range) |316| Exit/close | `var(--dur-exit)` `var(--ease-in)` |317| List/card reveal | stagger items by `var(--stagger)` (20–40ms) |318| Badge shine | diagonal light-band ::after sweeping once on load + on hover (~900ms ease-out) |319| Scan reveal | thin gold line sweeping over blueprint line-art, slow loop (~7s), low opacity — orbital-scan read |320| Breathing attention | opacity loop `.55 → 1`, 2.5s `ease-in-out` (sine), infinite — the ONLY sanctioned attention loop (see MOTION TEMPO LAW) |321| Accessibility | ALL decorative motion inside `@media (prefers-reduced-motion: no-preference)` |322323**MOTION TEMPO LAW (hard)**:324- Attention states BREATHE: 2.5s ease-in-out sine opacity loop, `.55 → 1`. They never blink325- Blinking or pulsing under 500ms is a HARD FAIL (also §10)326- Entrances/exits run 150-250ms ease-out; the §2 duration tokens remain canonical for the light mode327- Holographic / flicker / sci-fi glow effects are permitted in AT MOST ONE designated special zone per page (the SANCTIONED EXCEPTION ZONE); everything else stays flat vector. Name the zone in a comment before styling it328329### 5c. Panel modernization330331- Keep square corners and hard offset shadows (retro character) but LAYER a soft modern shadow first in the stack: `0 2px 10px rgba(32,35,42,.08)`332- Hover lifts use `var(--ease-out)` timing333- Dual-mode split is codified: LIGHT menus/pages + DARK instrument bands (telemetry/HUD widgets) — both exist, cleanly separated334335### 5d. Interaction states (hover / press — required, not optional)336337Every interactive element answers the pointer. Timing from micro-interaction standards: hover 150–200ms, press ≤150ms; animate transform/opacity only.338339| Element | Hover | Press/`:active` |340|---|---|---|341| Nav link | text→red + 2px red bar sweeps in from left along baseline (`right:100%→0`) | n/a |342| Card/plate | lift −3px + soft shadow deepens (existing §5c) | settles to −1px — physical depression |343| List row / timeline item | 4px `--sf-crimson` left-edge marker slides in; marker dot scales 1.35 | n/a |344| Button/badge | background shifts one token step lighter | scale .97 or translateY +1px |345| Focus (keyboard) | global `outline:2px solid var(--red); offset:2px` — never remove | n/a |346347Laws: states must remain readable with motion disabled (global reduced-motion kill-switch handles it); hover may REVEAL information but never MOVE text the user is reading; only ONE sweep animation per region — a page of everywhere-sweeping underlines is noise, not polish.348349### 5e. Data visualization - technical-report figures350351Charts are rendered as PRINTED REPORT FIGURES set into light figure plates - monochrome ink first, color only as accent. This mirrors actual 1960s-70s NASA TN/SP report figures (verified against NTRS primary sources). Recipes: `references/snippets.css` SS12e.352353**Four-fill ladder (series encoding WITHOUT color):**354| Fill | Spec | Semantic |355|---|---|---|356| Outline | transparent fill, 1.5px `--ink` border | default series |357| Solid | `--ink` fill | emphasized / current value |358| 45-deg single hatch | 1px ink strokes @ 6px spacing, outlined | caution / secondary emphasis (may tint rust) |359| Cross-hatch | two crossing hatches, outlined | tertiary / limit envelope |360361**Plot-area laws (from primary sources):**362- NO graph paper inside plots - plain face only; sparse DASHED reference lines when needed363- AXES DEFAULT OFF: do not draw X/Y axis lines unless the layout guarantees >=12px clearance from every label and bar - a fixed-position axis line crossing label lanes is the most frequent NASApunk-chart defect. Tick stubs alone (`.fig-ticks`) carry the scale; when axes ARE justified use the opt-in `.fig-plot--axed` modifier and re-run the collision scan364- Event flags: HOLLOW squares; dashed verticals mark events365- Caption strip inside plate bottom: `FIG. 2A - TITLE` letterspaced mono caps, hairline rule above366- Monochrome-first is authentic: era reports were 1-2 color prints (NHB 1430.2); red/rust reserved for emphasis367368**Gauge state vocabulary (scoped to dials/meters only):**369- Range bands: muted aviation green `#3A8C3A` / amber `#E8B830` / brick `#C62828` - desaturated, painted-on-dial authenticity; page palette elsewhere unchanged370- Three-state flags (Apollo Experience Report): GRAY = operating/open, BLACK-WHITE STRIPED (`repeating-linear-gradient(45deg,#1A1A1A 0 4px,#F4F3EF 4px 8px)`) = deactivated/closed, RED = failed371- Annunciator tiles: sage frosted lens `linear-gradient(#CFD4CF,#A8B0A8)` + olive bezel `#85857F`, lit amber `#E39A2F`; green `#4FC04F` permitted ONLY inside annunciator rows (restored-MOCR evidence)372373**Instrument hierarchy**: the THREE-RING INSTRUMENT (§5g) supersedes the plain dial gauge for HERO instruments (FIG. 9E, Band 14); keep the plain dial for dense multi-gauge arrays.374375### 5f. Figure sheets (charts as printed document inserts)376377One figure per sheet; present 3-up exactly like the spec-plates section - but the sheets must NOT reuse the metal-plate shell (avoid section homogeneity). Instead each chart sits on a **report-figure sheet**: bone paper, thin ink frame, graph-grid texture, FIG tab notch breaking the top border, crop marks outside two corners, caption below.378379Construction:3801. `.fig-sheet`: bone `#FBFAF7` + dual-scale light grid (22px) + 1px ink border; padding reserves a top band for the tab3812. `.fig-tab`: FIG id chip breaking the top border (background matches sheet so the border reads "interrupted")3823. `.sheet-head`: mono caps title left / qualifier right, above the plot3834. `.fig-plot`: L-axes + ticks per §5e; modifiers: `--hbar` drops the Y axis (horizontal charts own that lane for labels), `--bare` drops axes entirely (dial plates)3845. `.sheet-cap`: letterspaced mono caption below the plot3856. Optional annunciator tile row (max 4) under one sheet per section386Laws: one chart type per sheet; values plausible + consistent across sheets; ink-on-paper only (no backlight/glow).387Live example: Section 02 in `assets/reference.html`. Recipes: `references/snippets.css` SS12e/SS12f.388389### 5g. Component grammar (console/HUD vocabulary)390391Named components of the console/instrument vocabulary (deployed per §0B deployment laws). Each is a closed construction: build it as specified, do not improvise variants except through the faction skin system.392393- **SCANNER MONOCLE VIEWER**: circular reticle + horizon line + vignette inside the lens. Unscanned state = cyan outline only; scanned state = solid fill. A flat survey card docks LEFT of the monocle, never overlapping it394- **STARMAP PANEL**: concentric orbit rings + one dotted ellipse + double-ring planet nodes; info card docked left of the ring system395- **LEADER-LINE CALLOUT**: 1px line + terminal dot connecting a label card to its target; same lane-separation laws as §4.5 rule 9396- **STATUS CHIP TRIAD**: green/amber/red state chips (console-mode extension of the §5e gauge vocabulary to chip scale) plus the rarity trio `#73CCDF` / `#9A7BFF` / `#EEC162`; chips carry status ONLY, never decoration397- **HERITAGE SERIF LAYER**: gold `#D4A94A` serif headlines on deep ground + an eight-point compass-rose SVG mark; reserved for fictional heritage brands ONLY (§8: never real insignia, never Starfield's actual marks)398- **FACTION SKIN SYSTEM**: ONE neutral geometry + N paint packs (e.g. EXPLORER / MILITARY / CORPORATE / FRONTIER). Same geometry, different livery tokens; NEVER redraw geometry per faction399- **ROUNDEL CONSTRUCTION FORMULA**: faction/corp badge in four zones: outer inscription ring (curved `textPath`: org name + est. year) + upper field (star cluster or glyph) + lower semicircle band split into 2-3 color arcs (gold/orange/red family) + center core glyph. Annotate the zones when presenting the badge. All branding fictional per §8; zone grammar descends from worm-era graphics standards (1976-92) used as stylistic reference window. Reference: `assets/reference.html` FIG. 9D; recipe: `references/snippets.css` Band 14400- **ROUNDEL CONCENTRIC LAW**: every zone circle/arc in a roundel/badge shares ONE center - verify with `scripts/icon-geometry-check.js` (arc-center reconstruction catches off-axis bands eyeballing misses). A band tip crossing the field boundary is a HARD FAIL.401- **WAYFINDING SIGN**: navy-ground plate, white text: large letter-code station ID + station name + arrow rows with district codes + corner map thumbnail. This is the SANCTIONED EXCEPTION where a solid navy ground replaces cream; every other surface stays light-dominant (§10). Reference: `assets/reference.html` FIG. 9G; recipe: `references/snippets.css` Band 14402- **THREE-RING INSTRUMENT**: dial upgrade: outer ring = function ticks/icons, middle ring = percentage arc + needle, inner circle = date/time/status line. Replaces the single-ring gauge whenever an "instrument cluster" feel is requested. Spec lineage: Chronomark watch FCC filing. Reference: `assets/reference.html` FIG. 9E; recipe: `references/snippets.css` Band 14. DIAL GEOMETRY LAW: value-arc endpoints must be typed ON the dominant center - both endpoints exactly at ring radius (a single mistyped coordinate drifts the entire sweep off-axis; caught by `scripts/icon-geometry-check.js` single-arc rule). The needle tip must reach the ring-track inner edge, never float short of its scale.403404---405406### 5h. Interface component gallery (ten standard patterns - DEFAULT VOCABULARY)407408Ten complete, interaction-ready page patterns. **Selection is driven by STRUCTURE, not keywords**: inspect what the page (or request) actually contains - lists, cards, meters, forms, maps, dialogs, logs, tables - and apply the matching pattern. The game flavor in the names is optional paint; the grammar below fits ANY domain (e-commerce, CMS, SaaS admin, portfolio, docs, blog...).409410| # | Pattern | Apply to ANY UI containing... |411|---|---|---|412| G1 | Data Menu trio | a category sidebar + item list + detail card: admin panels, product/CMS/file managers, inventories, libraries, mail clients, dashboards |413| G2 | Terminal | command consoles, log viewers, CLI-flavored sections, system status readouts; any diegetic terminal block |414| G3 | Power allocation | any shared-pool allocation widget: storage quotas, budget splits, load distribution, skill-point spenders, progress pools |415| G4 | Starmap panel | node-and-link graphics: maps, org charts, relationship/network graphs, flowcharts, location pickers |416| G5 | Mission board | task/job/ticket/quest/announcement listings, TODO boards, application queues |417| G6 | Settings form | preference/config pages, any toggle+slider+select control cluster |418| G7 | Modal confirm | confirmations, destructive-action warnings, hazard dialogs |419| G8 | Credits roll | about/team/acknowledgment sections, end matter, changelog closers |420| G9 | Reading page | articles, documentation entries, book chapters, help centers - any long-form reading surface |421| G10 | Item inspect card | product/profile/item detail cards: stats, delta-vs-comparison values, mini meters, brand slot |422423Laws: one pattern per section; compose up to 3-4 per page; every pattern inherits Bands 1-14 base laws unchanged; interactions are vanilla JS; live implementations render in `assets/reference.html` SECTION 07 (FIG. G1-G10); recipes in `references/snippets.css` BAND 15.424425**COMPOSITE SIGNATURE (candidate, not mandate)**: a G-pattern fires when its signature atoms co-occur on one screen - but the detection output is a CANDIDATE with confidence, never a forced command. Agent verifies before composing. Signatures live in `references/component-matrix.md` M-G sections.426427**DUAL-CHANNEL DETECTION (G1 data-menu, G9 reading, M-IMG images)**: these patterns fire via TWO independent channels, kept deliberately parallel:428- Channel A — SCRIPTED: `refactor-inventory.js` detects structural signals and emits candidates — G1 via `data-menu-trio` (rail+list+detail in one pane) or counting signature; G9 via `long-form-prose` (≥5 non-list paragraphs, ≥300 chars, outside card/table/form); M-IMG via `img-photo`/`carousel` atoms (any photo image or carousel → `IMG?`, plus `img-avatar`/`img-gallery` role hints).429- Channel B — AGENT/MANUAL: the agent judges scenes per the §5h table and M-IMG grammar, independent of any script signal — G1 on any category-rail+list+detail screen (including framework three-pane compositions the script cannot see), G9 on any long-form reading surface, M-IMG on any image-bearing surface (banner, long figure, carousel, avatar, gallery, inline figure, thumbnails) including framework image components the regex cannot see.430Either channel alone may raise a candidate; the agent confirms the scene/role before composing. Keep BOTH channels — never replace one with the other: scripted detection catches repeatable structure the eye may skip, manual judgment catches framework containers the regex cannot see.431432### 5i. Image presentation grammar (photo/image layout — M-IMG)433434Image-rich pages (nasa.gov-style: banners, long figure shots, carousels, portraits, galleries, inline figure photos) must map EVERY image to the NASApunk image-presentation grammar — never a plain embed. Full per-role table + stack mappings + verification in `references/component-matrix.md` M-IMG; live implementations in `assets/reference.html` FIG. 14A-14H. Rules:4354361. **Framing**: every photo sits in an ink 1px frame with corner crop marks (L-marks outside two corners). No rounded frames (crop marks need square corners) — portraits included.4372. **Captions**: every image gets a FIG plate — mono `FIG. N-M` id (red) + title + credit; preserve the `figcaption` element for a11y and re-skin it.4383. **Role grammar** (per M-IMG table): banner = full-bleed + caption slab (red/ink, contrast-checked) over dark image area; long figure = ink frame + binding rail + fold ticks; carousel = framed + mono index chips `01/04` + square arrow buttons (no animated dots); avatar = square frame + initials chip fallback (navy fill, mono caps); gallery = equal-width cells each with own FIG chip + own caption; inline figure = float left/right max-width 45% + 16px gutter; thumbnails = small square frames + mono indices; loading/error = hatch placeholder + "LOADING"/"NO DATA" stencil, breathe 2.5s (never blink).4394. **Zero image/text occlusion**: figure gutters ≥ 12px; caption bars never overlap image pixels; overlaid headline slabs contrast-checked; inline figures keep body copy clear.4405. **Zero external requests**: no external image sources — inline SVG/data-URI placeholders, or the original image inlined; framework image components (`el-image`, `next/image`) wrapped with frame classes.4416. **Data preservation (SAFETY LAW #2)**: original `src`, dimensions, `alt`, and caption TEXT are never altered — only the frame/chrome/caption STYLE changes.442443**PRIORITY & DISAMBIGUATION (advisory)**: when one screen matches several composites - charts >= 3 -> M-DASH first; sidebar+list+detail -> G1; confirm-dialog present -> G7 always wins for that dialog; ambiguity unresolved -> present the shortlist to the user, never blind-pick.444445**OPTIONAL SCENE PATTERNS**: G2 (Terminal), G3 (Power allocation), G8 (Credits roll) are scene-optional: they compose ONLY when the scene genuinely matches (log viewer / allocation widget / acknowledgments reel). They are never forced, and their absence from a page is a correct outcome, not a coverage miss.446447**SAFETY LAW (hard, all refactors)**:4481. LAYERED IRREVERSIBILITY: L1 token/color layer = always safe & reversible. L2 structural layer = allowed ONLY while the framework behavior contract is preserved (sorting, validation, pagination, v-model bindings, ARIA). L3 dataviz = option-object changes only, never swap rendering engines.4492. SKIN NEVER TOUCHES LOGIC: data flow, validation, accessibility, and framework contract stay byte-identical. A pattern that requires DOM replacement of a behavior-bearing component is implemented as deep-selector overrides instead.4503. COMPOSITE CANDIDATES NEED AGENT CONFIRMATION: never blind-compose on signature count alone.4514. COVERAGE GATE CHECKS BEHAVIOR PRESERVATION: transformation evidence = computed-style assertion AND original event bindings/methods still usable - not just "style changed".4525. REVERSIBLE BY DEFAULT: every transformed screen must be revertible by removing the injected skin layer (no baked-in data mutations).453454**REFACTOR LAW (whole-project application)**: when restyling an EXISTING frontend, this skill applies IN FULL - there is no partial mode. Procedure: (1) structurally inventory the target (nav / lists / cards / forms / tables / modals / footers / logos); (2) map every structure to its gallery pattern and texture set; (3) re-skin everything with §2 to455456…(truncated)