# Cyberpunk theme — Build report (wave-1) ## What landed ### Module + metadata - `plugin.mod` with `name="cyberpunk"`, `kind="theme"`, `scope="@themes"`, `categories=["templates","developer"]`, `tags=["dark","neon","glitch", "monospace","saas","developer","tech","crypto","fintech"]`, and `[compatibility] block_core = ">=0.11.0 <0.12.0"`. Verbatim from spec §2. - `go.mod` pins `git.dev.alexdunmow.com/block/core v0.11.1` (matches the rest of the themes repo) and `github.com/a-h/templ v0.3.1020`. No `replace` directives. ### Registration - `registration.go` exports `var Registration plugin.PluginRegistration`, including the `CSSManifest` hook so the theme's custom utilities reach the host Tailwind input. - `register.go` wires: - 1 system template (`cyberpunk`). - 4 page templates: `default` (header/main/footer), `landing` (hero/features/cta/footer), `article` (header/main/aside/footer), `full-width` (header/main/footer). Slots match spec byte-for-byte. - `br.LoadSchemasFromFS(Schemas())` is called **before** any `br.Register(...)`, satisfying the UAT §3 ordering check. - 7 theme-owned blocks (one `br.Register(...)` call each): `hero_glitch`, `cta_terminal`, `navbar_terminal`, `footer_grid`, `feature_card_neon`, `stats_glow`, `code_neon`. - 4 built-in overrides registered as `RegisterTemplateOverride("cyberpunk", ...)`: `heading`, `text`, `button`, `card`. - 1 email wrapper (`cyberpunk:email_wrapper`). - `DefaultMasterPages()` returns the three master pages with the block / slot / sort-order layout from the spec: `cyberpunk:default-master`, `cyberpunk:landing-master`, `cyberpunk:full-master`. ### Schemas Seven draft-07 schemas under `schemas/`, one per theme block. Properties match the Go content-map keys exactly. `x-editor` values are all members of the allowed set `{text, richtext, media, color, select, number, slug, textarea, array, collection, bucket-picker, menu-select, template-select, link}`. ### Presets `presets.json` ships three presets in the spec's stated order: 1. `neon-noir` — magenta-led default 2. `acid-rain` — cyan-led 3. `toxic-bloom` — lime-led Each preset carries both `lightColors` and `darkColors` blocks (the spec declares `mode: "both"`), with all 19 shadcn tokens populated. Every value is an HSL triple string (`H S% L%`) — no `hsl(...)` wrappers, no hex. Values are byte-for-byte from the spec §4 tables. ### Fonts - `fonts.json = []` per the wave-1 fonts policy (`themes/docs/FONTS.md` overrides spec §5 and UAT §11). - `RECOMMENDED_FONTS.md` lists Space Grotesk / Inter / JetBrains Mono as Google Fonts picker recommendations with per-slot how-tos. - All template `font-family` usage flows through `var(--font-heading|body|mono, )` declarations. The fallback stacks lead with the recommended Google family so the page already looks close to the intended aesthetic on systems that have those fonts installed. ### CSS / aesthetics `assets/css/cyberpunk.css` is wired through `CSSManifest.InputCSSAppend` and contains: - Scanline overlay utility (`.scanlines`) — 1px stripe `linear-gradient`, 4% opacity, `scanline-drift` keyframe. - Glitch text-shadow utility (`.glitch`) — magenta on negative-x, cyan on positive-x, `glitch-x` keyframe. - RGB-split chromatic-aberration hover (`.rgb-split`) — 2px box-shadow pair on `:hover` / `:focus-visible` and a matching `:active` mirror so the brand microinteraction still reads on touch devices. - Caret blink utility (`.caret-blink`) — single `@keyframes caret` definition (UAT §13.7 expects exactly one). - `.neon-edge-{magenta|cyan|lime}` utilities — three accent variants with glow box-shadows, each consuming the host shadcn tokens. - `@media (prefers-reduced-motion: reduce)` disables glitch, caret, scanline, and status-dot animations. - `@media (prefers-contrast: more)` hides the scanline overlay entirely. - `:focus-visible` outline uses `hsl(var(--ring))`. - All colour values consume the host shadcn HSL token via `hsl(var(--token))`. No hardcoded hex / rgb / named colours in the CSS, `.go`, or `.templ` files (the email wrapper keeps its UAT §10 mandated `body { background:#0a0a12 }` in a `