# Cyberpunk theme — codeless .bnp manifest (WO-TF-015, Wave A). # Synthesized into manifest.pb by `ninja plugin build` (no plugin.wasm). theme_presets: presets.json bundled_fonts: fonts.json master_pages: master_pages.json required_icon_packs: ["lucide", "simple-icons"] system_templates: - key: cyberpunk title: Cyberpunk description: "Neon-on-black game-studio / hacker-collective theme — RGB-split glitch, CRT scanlines, HUD brackets, angled clip cuts, and a canvas digital-rain hero." page_templates: - system: cyberpunk key: default title: Default description: "Standard dark page with scanline overlay and a sticky terminal-style header" slots: [header, main, footer] - system: cyberpunk key: full-width title: Full Width description: "Edge-to-edge dashboard / showcase layout, no max-width" slots: [header, main, footer] - system: cyberpunk key: landing title: Landing description: "Canvas digital-rain hero, neon feature grid, glowing CTA, footer" slots: [header, main, footer] - system: cyberpunk key: article title: Article description: "Mono-metadata header, prose column, HUD-framed aside" slots: [header, main, aside, footer] - system: cyberpunk key: blog-index title: Blog Index description: "Patch-notes feed layout with neon post cards and sidebar" slots: [header, main, footer] - system: cyberpunk key: contact title: Contact description: "Terminal contact console — form panel plus HUD contact card" slots: [header, main, footer] - system: cyberpunk key: auth title: Auth description: "Centered neon auth console for login / register / reset" slots: [header, main, footer] # All 49 mandatory-tier builtin overrides (OVERRIDE-CONTRACT §1), dashed keys. template_overrides: # Chrome (4) - { template: cyberpunk, block: navbar } - { template: cyberpunk, block: footer } - { template: cyberpunk, block: utility-bar } - { template: cyberpunk, block: announcement-bar } # Marketing (12) - { template: cyberpunk, block: hero } - { template: cyberpunk, block: feature-grid } - { template: cyberpunk, block: rich-section } - { template: cyberpunk, block: stats } - { template: cyberpunk, block: testimonial } - { template: cyberpunk, block: logo-strip } - { template: cyberpunk, block: pricing } - { template: cyberpunk, block: team } - { template: cyberpunk, block: faq } - { template: cyberpunk, block: timeline } - { template: cyberpunk, block: cta } - { template: cyberpunk, block: countdown } # Primitives (11) - { template: cyberpunk, block: heading } - { template: cyberpunk, block: text } - { template: cyberpunk, block: rich-text } - { template: cyberpunk, block: image } - { template: cyberpunk, block: quote } - { template: cyberpunk, block: divider } - { template: cyberpunk, block: button } - { template: cyberpunk, block: card } - { template: cyberpunk, block: gallery } - { template: cyberpunk, block: video-embed } - { template: cyberpunk, block: audio-embed } # Commerce / local (6) - { template: cyberpunk, block: menu-list } - { template: cyberpunk, block: event-list } - { template: cyberpunk, block: contact-form } - { template: cyberpunk, block: contact-card } - { template: cyberpunk, block: hours-location } - { template: cyberpunk, block: social-links } # Blog family (12) - { template: cyberpunk, block: blog-hero } - { template: cyberpunk, block: featured-posts } - { template: cyberpunk, block: related-posts } - { template: cyberpunk, block: popular-posts } - { template: cyberpunk, block: category-list } - { template: cyberpunk, block: post-hero } - { template: cyberpunk, block: post-metadata } - { template: cyberpunk, block: author-bio } - { template: cyberpunk, block: author-bio-hero } - { template: cyberpunk, block: newsletter-signup } - { template: cyberpunk, block: breadcrumbs } - { template: cyberpunk, block: sidebar-nav } # Auth surface (3) - { template: cyberpunk, block: auth-form } - { template: cyberpunk, block: password-reset-form } - { template: cyberpunk, block: auth-status } # System (1) - { template: cyberpunk, block: page-suggestions } email_wrappers: - cyberpunk css: input_css_append: | /* ============================================================ Cyberpunk — Neon-on-black game-studio / hacker-collective theme (WO-TF-015). Scanlines / glitch / RGB-split / caret-blink / neon-edge / HUD-bracket / clip-cut / digital-rain utilities. All colours consume the host shadcn HSL tokens via hsl(var(--token)). No hardcoded hex / rgb / named colours. ============================================================ */ /* --- Typography ------------------------------------------- */ /* Families flow through the admin-bound CSS variables; the fallback leads with the bundled OFL family so the intended look survives before the admin assigns a slot. @font-face for the bundled families is auto-emitted from fonts.json (source=template rows). */ .cyberpunk-body { font-family: var(--font-body, "Inter", system-ui, -apple-system, "Segoe UI", sans-serif); } .cyberpunk-mono, .cyberpunk-mono code, pre.cyberpunk-mono, code.cyberpunk-mono { font-family: var(--font-mono, "Share Tech Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, monospace); } .cyberpunk-display { font-family: var(--font-heading, "Orbitron", system-ui, -apple-system, "Segoe UI", sans-serif); letter-spacing: 0.01em; } .cyberpunk-prose, .cyberpunk-prose p, .cyberpunk-prose li { font-family: var(--font-body, "Inter", system-ui, sans-serif); line-height: 1.75; } /* Eyebrow / kicker: mono, uppercase, wide-tracked accent readout. Carries enough on its own that it is never a silent no-op when used alone. */ .cyberpunk-eyebrow { font-family: var(--font-mono, "Share Tech Mono", ui-monospace, monospace); text-transform: uppercase; letter-spacing: 0.2em; font-size: 0.75rem; color: hsl(var(--accent)); } .cyberpunk-prose code { color: hsl(var(--accent)); background-color: hsl(var(--muted)); padding: 0.125rem 0.375rem; border-radius: 0.25rem; font-family: var(--font-mono, "Share Tech Mono", ui-monospace, monospace); font-size: 0.875em; } /* --- Scanlines -------------------------------------------- */ .scanlines { opacity: 0.05; background-image: linear-gradient( to bottom, hsl(var(--foreground)) 0px, hsl(var(--foreground)) 1px, transparent 1px, transparent 3px ); background-size: 100% 3px; animation: scanline-drift 6s linear infinite; } @keyframes scanline-drift { 0% { background-position: 0 0; } 100% { background-position: 0 3px; } } /* --- Glitch (RGB-split text-shadow) on big headings ------- */ .glitch { position: relative; text-shadow: -2px 0 hsl(var(--primary)), 2px 0 hsl(var(--accent)); animation: glitch-x 3.6s steps(1, end) infinite; } @keyframes glitch-x { 0%, 92%, 100% { text-shadow: -2px 0 hsl(var(--primary)), 2px 0 hsl(var(--accent)); } 93% { text-shadow: -3px 0 hsl(var(--primary)), 3px 0 hsl(var(--accent)), 0 1px hsl(var(--accent)); } 95% { text-shadow: -1px 0 hsl(var(--accent)), 4px 0 hsl(var(--primary)); } 97% { text-shadow: -2px 0 hsl(var(--primary)), 2px 0 hsl(var(--accent)); } } /* --- RGB-split hover/focus/active on primary buttons ------ */ .rgb-split { transition: transform 120ms ease, box-shadow 120ms ease; } .rgb-split:hover, .rgb-split:focus-visible { box-shadow: -2px 0 0 hsl(var(--primary)), 2px 0 0 hsl(var(--accent)); transform: translateY(-1px); } .cyberpunk-btn:active, .rgb-split:active, button.cyberpunk-btn:active { box-shadow: -2px 0 0 hsl(var(--primary)), 2px 0 0 hsl(var(--accent)); } .cyberpunk-btn:focus-visible, .cyberpunk-btn-ghost:focus-visible, button:focus-visible, a:focus-visible { outline: 2px solid hsl(var(--ring)); outline-offset: 2px; } /* --- Caret blink ------------------------------------------ */ .caret-blink { display: inline-block; animation: caret 1.05s steps(2, end) infinite; } @keyframes caret { 0%, 50% { opacity: 1; } 51%, 100% { opacity: 0; } } /* --- Neon edge utilities (magenta / cyan / lime channels) - */ /* --primary is the lead accent, --accent the secondary, --ring the third neon channel (present in every preset). */ .neon-edge-magenta { box-shadow: 0 0 0 1px hsl(var(--primary) / 0.4), 0 0 18px hsl(var(--primary) / 0.22); transition: box-shadow 180ms ease, transform 180ms ease; } .neon-edge-magenta:hover, .neon-edge-magenta:focus-within { box-shadow: 0 0 0 1px hsl(var(--primary) / 0.85), 0 0 28px hsl(var(--primary) / 0.42); transform: translateY(-1px); } .neon-edge-cyan { box-shadow: 0 0 0 1px hsl(var(--accent) / 0.4), 0 0 18px hsl(var(--accent) / 0.22); transition: box-shadow 180ms ease, transform 180ms ease; } .neon-edge-cyan:hover, .neon-edge-cyan:focus-within { box-shadow: 0 0 0 1px hsl(var(--accent) / 0.85), 0 0 28px hsl(var(--accent) / 0.42); transform: translateY(-1px); } .neon-edge-lime { box-shadow: 0 0 0 1px hsl(var(--ring) / 0.4), 0 0 18px hsl(var(--ring) / 0.22); transition: box-shadow 180ms ease, transform 180ms ease; } .neon-edge-lime:hover, .neon-edge-lime:focus-within { box-shadow: 0 0 0 1px hsl(var(--ring) / 0.85), 0 0 28px hsl(var(--ring) / 0.42); transform: translateY(-1px); } /* --- HUD corner brackets ---------------------------------- */ /* Draw two L-brackets (top-left, bottom-right) around any panel. */ .hud-frame { position: relative; } .hud-frame::before, .hud-frame::after { content: ""; position: absolute; width: 14px; height: 14px; pointer-events: none; z-index: 1; } .hud-frame::before { top: 0; left: 0; border-top: 2px solid hsl(var(--primary)); border-left: 2px solid hsl(var(--primary)); } .hud-frame::after { bottom: 0; right: 0; border-bottom: 2px solid hsl(var(--accent)); border-right: 2px solid hsl(var(--accent)); } /* --- Angled clip-path cut (arcade panel silhouette) ------- */ .clip-cut { clip-path: polygon(0 0, calc(100% - 10px) 0, 100% 10px, 100% 100%, 10px 100%, 0 calc(100% - 10px)); } /* --- Status pill / dot pulse ------------------------------ */ .cyberpunk-status-dot { animation: cyberpunk-pulse 2.2s ease-in-out infinite; } @keyframes cyberpunk-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } /* --- Digital-rain canvas showpiece (hero override only) --- */ /* The lazy-inits from the hero's inline script. This block styles the container + the static no-JS neon fallback layer. */ .cyberpunk-rain-wrap { position: absolute; inset: 0; overflow: hidden; pointer-events: none; } .cyberpunk-rain-canvas { position: absolute; inset: 0; width: 100%; height: 100%; display: block; opacity: 0.5; } /* Static fallback: a neon vertical-gradient wash shown until (or instead of) the canvas. Tokens only. */ .cyberpunk-rain-fallback { position: absolute; inset: 0; background: radial-gradient(120% 80% at 50% 0%, hsl(var(--primary) / 0.18), transparent 60%), radial-gradient(120% 80% at 100% 100%, hsl(var(--accent) / 0.16), transparent 55%), linear-gradient(to bottom, transparent, hsl(var(--background) / 0.6)); } /* --- Responsive layout utilities (theme-owned, media-query driven) ---- */ /* The host Tailwind build does NOT reliably compile responsive utility variants (sm:/md:/lg:grid-cols-*, min-h-screen, arbitrary values) that appear only in this theme's templates, so multi-column grids collapse to a single column at every width and heroes lose their min-height. Drive the load-bearing responsive layout from explicit CSS instead. Layout only — no colour literals (colours stay on semantic tokens). */ .cp-grid { display: grid; gap: 1.5rem; grid-template-columns: minmax(0, 1fr); } .cp-grid.cp-g-none { gap: 0; } .cp-grid.cp-g-tight { gap: 1rem; } .cp-grid.cp-g-wide { gap: 2rem; } .cp-grid.cp-g-xl { gap: 2.5rem; } .cp-grid.cp-m2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } @media (min-width: 640px) { .cp-grid.cp-s2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (min-width: 768px) { .cp-grid.cp-md2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .cp-grid.cp-md3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } .cp-grid.cp-md4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } } @media (min-width: 1024px) { .cp-grid.cp-lg2 { grid-template-columns: repeat(2, minmax(0, 1fr)); } .cp-grid.cp-lg3 { grid-template-columns: repeat(3, minmax(0, 1fr)); } .cp-grid.cp-lg4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } .cp-grid.cp-lg5 { grid-template-columns: repeat(5, minmax(0, 1fr)); } } .cp-span2 { grid-column: span 2; } @media (min-width: 1024px) { .cp-lg-span1 { grid-column: span 1; } } /* Masonry column-count (gallery) with the same reliability guarantee. */ .cp-cols { column-gap: 1rem; } .cp-cols.cp-c2 { columns: 2; } @media (min-width: 768px) { .cp-cols.cp-md-c2 { columns: 2; } .cp-cols.cp-md-c3 { columns: 3; } .cp-cols.cp-md-c4 { columns: 4; } } /* Two-column content split (rich-section, hours-location) + article aside. */ .cp-split { display: grid; gap: 2.5rem; grid-template-columns: minmax(0, 1fr); } @media (min-width: 768px) { .cp-split.cp-split-md { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 4rem; } } .cp-article-grid { display: grid; gap: 2.5rem; grid-template-columns: minmax(0, 1fr); } @media (min-width: 1024px) { .cp-article-grid { grid-template-columns: minmax(0, 1fr) 260px; } } /* --- Hero heights (bounded; host drops min-h-screen / arbitrary vh) ---- */ /* Capped so a sparse hero never balloons into an empty neon void, while a populated hero still reads full-bleed. */ .cp-hero-tall { min-height: clamp(32rem, 82vh, 50rem); } .cp-hero-mid { min-height: clamp(28rem, 70vh, 44rem); } .cp-hero-short { min-height: clamp(20rem, 50vh, 30rem); } .cp-hero-auto { min-height: 22rem; } .cp-hero-split { min-height: clamp(20rem, 46vh, 28rem); } /* Vertical-timeline connector line (arbitrary before:* utilities dropped). */ .cp-timeline { position: relative; } .cp-timeline::before { content: ""; position: absolute; left: 1rem; top: 0.5rem; width: 1px; height: calc(100% - 1rem); background: hsl(var(--primary) / 0.5); } /* --- Reduced motion: kill all motion --------------------- */ @media (prefers-reduced-motion: reduce) { .glitch, .caret-blink, .scanlines, .cyberpunk-status-dot, .cyberpunk-rain-canvas { animation: none !important; animation-duration: 0.01ms !important; } .glitch { text-shadow: none; } .scanlines { opacity: 0; } .cyberpunk-rain-canvas { display: none; } .rgb-split:hover, .rgb-split:focus-visible { transform: none; } } /* --- High-contrast: kill scanlines + rain ---------------- */ @media (prefers-contrast: more) { .scanlines, .cyberpunk-rain-canvas { display: none; } }