From cyberpunk-frontend-design-skill
Cyberpunk UI design system for building dark-themed, terminal-inspired interfaces. Use this skill whenever the user asks to build any frontend UI — pages, dashboards, components, forms, apps, landing pages, widgets, or any visual interface. Always apply this design system's aesthetic unless the user explicitly requests a different style. Triggers on any mention of UI, frontend, web page, dashboard, component, form, layout, app shell, or design work. Even partial UI tasks like "add a table" or "style this form" should use this system.
How this skill is triggered — by the user, by Claude, or both
Slash command
/cyberpunk-frontend-design-skill:cyberpunk-frontend-design-skillThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Apply this design system to ALL frontend/UI work. These are strong defaults — you may extend creatively but never contradict the core tokens or aesthetic.
Apply this design system to ALL frontend/UI work. These are strong defaults — you may extend creatively but never contradict the core tokens or aesthetic.
When bootstrapping a new project or adding to an existing one, use this stack:
@tailwindcss/vite)Use fetch (or ky if already installed) for HTTP requests inside query/mutation functions — never raw useEffect + fetch patterns.
Follow Vite's conventions and project structure. Use npm create vite@latest with the react-ts template as the baseline. Install Tailwind via its Vite plugin (@tailwindcss/vite) — not PostCSS.
When adding UI to an existing project, adapt to whatever stack is already in place rather than re-scaffolding.
The design system has two CSS layers that coexist:
.cyber-btn, .cyber-card, .cyber-input, etc.) — the design system components. These use var() references to :root tokens. Copy them from the component and pattern reference files.flex, gap-4, text-cyan, bg-pink, etc.) — for layout, spacing, and quick one-off styling. These are powered by the @theme bridge below.app.css or index.css)@import "tailwindcss";
@import url('https://fonts.googleapis.com/css2?family=Press+Start+2P&family=JetBrains+Mono:wght@400;700&family=Noto+Sans+JP:wght@700;900&display=swap');
/* ── Bridge tokens into Tailwind so utilities work ── */
@theme {
--color-cyan: #00f0ff;
--color-pink: #ff003c;
--color-yellow: #fcee0a;
--color-green: #39ff14;
--color-bg-deep: #05050a;
--color-bg-surface: rgba(10, 10, 15, 0.8);
--color-bg-panel: #0a0a0f;
--color-text-primary: #ffffff;
--color-text-secondary: rgba(255, 255, 255, 0.8);
--color-text-muted: rgba(255, 255, 255, 0.55);
--color-border-subtle: rgba(255, 255, 255, 0.08);
--color-border-medium: rgba(255, 255, 255, 0.15);
--font-pixel: 'Press Start 2P', cursive;
--font-body: 'JetBrains Mono', monospace;
--font-mono: 'JetBrains Mono', monospace;
}
/* ── Full design system tokens (source of truth — from tokens.md) ── */
:root {
/* ...paste full :root block from references/tokens.md... */
}
/* ── Shared @keyframes (from tokens.md) ── */
/* ...paste @keyframes from references/tokens.md... */
/* ── Component CSS (from components-core.md + components-extended.md) ── */
/* ...paste .cyber-btn, .cyber-card, .cyber-input, etc... */
/* ── Pattern CSS (from patterns-layout.md + patterns-effects.md) ── */
/* ...paste .section-header, .ds-nav, .cyber-timeline, etc... */
.cyber-* classes for design system components (buttons, cards, forms, tables, alerts, badges, tabs, modals, toasts, progress bars, etc.).quiet-card, .panel-header, .stat-row, .stat-cell, .stat-label, .stat-value, .kv-label, .kv-value) for recurring structural patterns — see patterns-layout.mdflex, grid, gap-*), spacing (p-*, m-*), and one-off styles where creating a custom class isn't worth itstyle attributes only for one-off structural adjustments (max-width, unique padding, color overrides). Never for recurring patterns — if you write the same inline block twice, make it a classThe @theme block is a slim bridge — it maps key tokens into Tailwind's namespace so utilities like text-cyan, bg-bg-deep, font-mono work. The :root block is the full source of truth for all component CSS.
Dark, terminal-inspired cyberpunk. Think sci-fi command interfaces, not gaming neon. The tone is technical and precise — clean grids, monospaced data, subtle glows. Restraint over spectacle.
Key principles:
.cyber-card with cyan border, glow, and pink corners. Everything else — supporting panels, secondary cards, metadata sections — uses quiet styling (.quiet-card class, subtle borders). When a page has many panels, only the most important one is loud. Sidebar, topbar, and structural layout are always quietBefore writing any code, pause and understand what you're building:
.cyber-card). Supporting panels, metadata cards, stat rows, and ancillary content stay quiet. On a dashboard with a single table, the table is loud. On a detail page with many panels, the header card is loud and the rest are quiet. A page with too many glowing panels looks as bad as one with none.This system is opinionated but flexible — the aesthetic is fixed, but how you compose components should respond to the specific problem.
All tokens are defined as CSS custom properties in references/tokens.md. Copy the full :root block from that file into your stylesheet — every component and pattern references these via var().
Key variable groups: --bg-* (backgrounds), --cyan/--pink/--yellow/--green (accents + opacity scales at 03–40), --text-* (hierarchy), --border-* (structural), --font-* (3 families), --text-display through --text-nano (type scale, plus --text-title for headings), --tracking-* (letter-spacing), --space-* (spacing), --transition-*, --shadow-*, --z-*.
Shared @keyframes animations (spin, pulse, blink, skeletonShimmer, crtFlicker, glitchTop, glitchBottom, gridScroll) are also in tokens.md.
Labels: JetBrains Mono, uppercase, letter-spacing var(--tracking-wide) to var(--tracking-wider), muted color
Hover states: Always include transition (0.15–0.2s ease). Pattern: cyan bg tint + border hint + text color shift to #00f0ff
Focus states: Cyan border + box-shadow glow 0 0 10px rgba(0,240,255,0.2)
Corner decorations (loud cards only): ::before top-left pink, ::after bottom-right pink, 20px × 20px
This system is dense and terminal-inspired, but readability comes first. The working type scale is deliberately bumped up from ultra-small pixel aesthetics to ensure comfortable reading.
Working range (95% of your UI):
clamp(0.8rem, 1.5vw, 1.1rem)var(--text-title) (0.9rem)var(--text-body) (0.9rem) — JetBrains Monovar(--text-sm) (0.8rem) JetBrains Monovar(--text-xs) (0.75rem) uppercase JetBrains Monovar(--text-label) (0.7rem) JetBrains Monovar(--text-micro) (0.65rem) / var(--text-nano) (0.6rem)Display range (rare — hero sections, landing pages, large stat values):
--text-display (2.2rem) — standalone hero/landing page titles only--text-stat (1.4rem) — large dashboard stat values (JetBrains Mono bold)Font roles:
body is set to JetBrains Mono via var(--font-body)Letter-spacing tiers (always paired with uppercase JetBrains Mono):
var(--tracking-normal) (0.1em) — table headers, tabs, alert titlesvar(--tracking-wide) (0.12em) — stat labels, KV keys, metadatavar(--tracking-wider) (0.15em) — buttons, form labels, nav itemsvar(--tracking-widest) (0.2em) — nav section/group labelsRead references/components-core.md and references/components-extended.md for full specs. Key classes:
| Component | Class | Notes |
|---|---|---|
| Card (loud) | .cyber-card | Cyan border, glow, pink corner decorations via ::before/::after. Use for the main focal element of each page — the primary table, hero card, or sole form |
| Card (quiet) | .quiet-card | Supporting/secondary panels, metadata, multi-panel layouts. Subtle border, dim surface bg, no glow |
| Button | .cyber-btn | Color: .cyan .pink .yellow .green. Size: .sm. Also .icon-btn for icon-only |
| Input | .cyber-input | Cyan-tinted bg, .error for red border. Pair with .cyber-label |
| Textarea | .cyber-textarea | Same as input, min-height: 100px |
| Select | .cyber-select | Custom dropdown: .cyber-select-trigger, .cyber-select-dropdown, .cyber-select-option |
| Table | .cyber-table | Cyan header border, row hover, corner decorations, .pagination-btn |
| Alert | .cyber-alert | Variants: .info .warning .error .success |
| Badge | .cyber-badge | Outline: .cyan .pink .yellow .green. Filled: .filled-cyan etc. Size: .sm for compact |
| Code | .cyber-code | data-lang attribute, syntax classes: .comment .keyword .string .function .variable |
| Tabs | .cyber-tabs > .cyber-tab | Bottom border active state, hover animation |
| Modal | .cyber-modal | Centered, backdrop blur, .cyber-modal-backdrop overlay |
| Toast | .cyber-toast | Variants: .toast-success .toast-error .toast-warning .toast-info |
| Tooltip | .cyber-tooltip-wrap | Dark bg, cyan accent bar, .bottom variant |
| Progress | .cyber-progress | .fill with .cyan/.pink/.yellow/.green |
| Spinner | .cyber-spinner | Cyan default, .pink/.green variants |
| Avatar | .cyber-avatar | Text-initials, sizes .xs–.xl, colors .pink/.yellow/.green |
| Timeline | .cyber-timeline | Vertical line with dot markers via ::before |
| Toggle | .cyber-toggle | Custom switch with cyan active |
| Checkbox | .cyber-checkbox | Custom check with accent colors |
| Context menu | .context-menu | .context-menu-item, .context-menu-divider, .danger variant |
| Skeleton | .skeleton | .skeleton-text (.sm/.md/.lg), .skeleton-heading, .skeleton-avatar, .skeleton-btn |
Read references/patterns-layout.md for full specs.
border-left active indicator, cyan highlightborder-bottom separator.stat-row > .stat-cell > .stat-label + .stat-value. 4-column grid, accent-colored values.quiet-card > .kv-label + .kv-value. Stacked pairs, typically supporting role.panel-header > .panel-header-title. Title bar with bottom dividerEvery interactive element needs a transition. But also think about larger motion patterns:
0.15–0.2s ease for nav/tabs, 0.2s ease for inputs, 0.3s ease for buttons. Never ship a hover/focus state without a transition.animation-delay for cards and sections appearing on load. A fade-in with translateY(10px) at 0.05s intervals creates a satisfying cascade.fade-in animations as sections enter the viewport. Use IntersectionObserver — not scroll event listeners..skeleton placeholders before data arrives. The shimmer animation (1.5s infinite) signals "loading" without spinners.Principle: One well-orchestrated page load with staggered reveals creates more impact than scattered micro-interactions everywhere.
This system creates depth through layered transparency and environmental details — not drop shadows or gradients:
#05050a) → subtle card surface (rgba(10,10,15,0.4–0.8)) → input fields (rgba(0,240,255,0.03)). Each layer is slightly more visible.backdrop-filter: blur(5px) on cards and modals creates glass-over-dark depth.writing-mode. Creates atmosphere in margins/backgrounds without competing with content.box-shadow on loud cards makes them feel "closer". Quiet cards with no glow recede. This is the primary depth mechanism.rgba(255,255,255,0.06–0.08)) create panel edges. They define space without being visually heavy.::before/::after pink corner marks on loud cards create a "targeting reticle" effect — use on focal elements only.This system's tokens and classes exist so that every page looks consistent without duplicating code. Follow these rules:
var() — never hardcode a value that has a token equivalent. Use var(--text-sm) not 0.8rem, var(--tracking-wide) not 0.12em, var(--space-6) not 24px. If a value doesn't match any token, that's fine — hardcode it. But if a token exists, use it.quiet-card, .panel-header, .stat-cell, .stat-label, .stat-value, .kv-label, .kv-value (see patterns-layout.md). Use them instead of writing inline styles for the same structure repeatedlyvar(--space-*) for spacing — var(--space-2) not 8px, var(--space-6) not 24px. The spacing scale: 4/8/12/16/20/24/32/48/80px. Values outside the scale (10px, 6px, 14px) can be hardcodedThe code you generate must work, not just look right:
<nav>, <main>, <section>, <button>, <label>. Don't <div> everything.clamp() for headings — e.g., clamp(0.8rem, 1.5vw, 1.1rem) for page titles in Press Start 2P. Flex-wrap for card grids. The sidebar should collapse on narrow viewports.:root level. Reference them throughout. This makes the system maintainable.rgba(255,255,255,0.55) on #05050a passes AA contrast. Don't drop text opacity below 0.45.DO:
DON'T:
.cyber-card or .cyber-table). The main table or primary content card should glowtransition property on interactive elementsborder-radius: 50% on ≤8px circles) are fine--text-display or --text-stat for normal page headings — those are rare display sizes. Page titles use Press Start 2P at clamp(0.8rem, 1.5vw, 1.1rem)<link href="https://fonts.googleapis.com/css2?family=Press+Start+2P&family=JetBrains+Mono:wght@400;700&family=Noto+Sans+JP:wght@700;900&display=swap" rel="stylesheet">
references/tokens.md first — it has the full :root block (copy into your stylesheet) and all shared @keyframes animationsreferences/components-core.mdreferences/components-extended.mdreferences/patterns-layout.mdreferences/patterns-effects.mdnpx claudepluginhub thebrunolopes/bruno-agentic-skills --plugin cyberpunk-frontend-design-skillGenerates distinctive production-grade frontend UIs for web components, pages, and apps with bold creative designs avoiding generic AI aesthetics.
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.