Join our Discord Community

Marvel Shadcn Theme

Marvel Comics inspired theme with bold reds and heroic blues for shadcn/ui. Comic book aesthetic with strong visual impact. TypeScript ready.

Working with shadcn themes?

Join our Discord community for help from other shadcn developers working with themes and design systems.

Marvel Shadcn Theme

Been a Marvel fan since the 90s and always loved how their visual branding just commands attention. This theme captures that same bold, heroic energy with those iconic reds and blues that make everything feel important and action-packed.

Perfect for gaming platforms, sports apps, fitness trackers, or any React project where you want that confident, high-energy feeling that gets users pumped up and ready to take action. The Outfit font adds to that modern superhero aesthetic.

Installation

npx shadcn@latest add https://www.shadcn.io/registry/marvel.json
npx shadcn@latest add https://www.shadcn.io/registry/marvel.json
pnpm dlx shadcn@latest add https://www.shadcn.io/registry/marvel.json
bunx shadcn@latest add https://www.shadcn.io/registry/marvel.json

Original theme by tweakcn.com

CSS Variables

Copy and paste the following CSS variables into your global CSS file:

:root {
  --background: oklch(0.98 0.01 25.23);
  --foreground: oklch(0.20 0.01 18.05);
  --card: oklch(0.95 0.01 25.23);
  --card-foreground: oklch(0.18 0.01 29.18);
  --popover: oklch(0.94 0.01 25.23);
  --popover-foreground: oklch(0.22 0.01 29.09);
  --primary: oklch(0.55 0.22 27.03);
  --primary-foreground: oklch(0.98 0.01 100.72);
  --secondary: oklch(0.52 0.14 247.51);
  --secondary-foreground: oklch(0.98 0.01 100.72);
  --muted: oklch(0.91 0.01 25.23);
  --muted-foreground: oklch(0.38 0.01 17.71);
  --accent: oklch(0.86 0.04 33.03);
  --accent-foreground: oklch(0.18 0.01 29.18);
  --destructive: oklch(0.56 0.23 29.23);
  --border: oklch(0.84 0.01 25.22);
  --input: oklch(0.80 0.01 25.22);
  --ring: oklch(0.50 0.12 244.86);
  --chart-1: oklch(0.58 0.23 27.06);
  --chart-2: oklch(0.61 0.18 251.95);
  --chart-3: oklch(0.72 0.15 83.96);
  --chart-4: oklch(0.67 0.15 144.89);
  --chart-5: oklch(0.75 0.15 304.74);
  --sidebar: oklch(0.97 0 0);
  --sidebar-foreground: oklch(0.20 0.01 18.05);
  --sidebar-primary: oklch(0.52 0.14 247.51);
  --sidebar-primary-foreground: oklch(0.98 0.01 100.72);
  --sidebar-accent: oklch(0.69 0.14 79.64);
  --sidebar-accent-foreground: oklch(0.20 0.01 18.05);
  --sidebar-border: oklch(0.87 0.01 25.23);
  --sidebar-ring: oklch(0.52 0.14 247.51);
  --destructive-foreground: oklch(1.0000 0 0);
  --font-sans: Outfit, sans-serif;
  --font-serif: Merriweather, serif;
  --font-mono: Geist Mono, monospace;
  --radius: 0rem;
  --shadow-2xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05);
  --shadow-xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05);
  --shadow-sm: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10);
  --shadow: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10);
  --shadow-md: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 2px 4px -2px hsl(0 0% 0% / 0.10);
  --shadow-lg: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 4px 6px -2px hsl(0 0% 0% / 0.10);
  --shadow-xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 8px 10px -2px hsl(0 0% 0% / 0.10);
  --shadow-2xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.25);
  --tracking-normal: 0em;
}

.dark {
  --background: oklch(0.12 0.01 38.49);
  --foreground: oklch(0.95 0.01 25.23);
  --card: oklch(0.18 0.01 29.18);
  --card-foreground: oklch(0.95 0.01 25.23);
  --popover: oklch(0.18 0.01 29.18);
  --popover-foreground: oklch(0.95 0.01 25.23);
  --primary: oklch(0.65 0.23 27.09);
  --primary-foreground: oklch(0.98 0.01 100.72);
  --secondary: oklch(0.50 0.14 249.16);
  --secondary-foreground: oklch(0.98 0.01 100.72);
  --muted: oklch(0.20 0.01 18.05);
  --muted-foreground: oklch(0.70 0.01 25.22);
  --accent: oklch(0.59 0.12 78.11);
  --accent-foreground: oklch(0.95 0.01 25.23);
  --destructive: oklch(0.56 0.23 29.23);
  --border: oklch(0.38 0.01 17.71);
  --input: oklch(0.38 0.01 17.71);
  --ring: oklch(0.49 0.14 250.75);
  --chart-1: oklch(0.64 0.25 26.85);
  --chart-2: oklch(0.66 0.19 250.17);
  --chart-3: oklch(0.78 0.16 87.01);
  --chart-4: oklch(0.68 0.15 144.94);
  --chart-5: oklch(0.75 0.15 304.74);
  --sidebar: oklch(0.14 0.01 33.25);
  --sidebar-foreground: oklch(0.95 0.01 25.23);
  --sidebar-primary: oklch(0.50 0.14 249.16);
  --sidebar-primary-foreground: oklch(0.98 0.01 100.72);
  --sidebar-accent: oklch(0.59 0.12 78.11);
  --sidebar-accent-foreground: oklch(0.95 0.01 25.23);
  --sidebar-border: oklch(0.32 0.01 27.45 / 30%);
  --sidebar-ring: oklch(0.50 0.14 249.16);
  --destructive-foreground: oklch(1.0000 0 0);
  --font-sans: Outfit, sans-serif;
  --font-serif: Merriweather, serif;
  --font-mono: Geist Mono, monospace;
  --radius: 0rem;
  --shadow-2xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05);
  --shadow-xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05);
  --shadow-sm: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10);
  --shadow: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10);
  --shadow-md: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 2px 4px -2px hsl(0 0% 0% / 0.10);
  --shadow-lg: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 4px 6px -2px hsl(0 0% 0% / 0.10);
  --shadow-xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 8px 10px -2px hsl(0 0% 0% / 0.10);
  --shadow-2xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.25);
}

@theme inline {
  --color-background: var(--background);
  --color-foreground: var(--foreground);
  --color-card: var(--card);
  --color-card-foreground: var(--card-foreground);
  --color-popover: var(--popover);
  --color-popover-foreground: var(--popover-foreground);
  --color-primary: var(--primary);
  --color-primary-foreground: var(--primary-foreground);
  --color-secondary: var(--secondary);
  --color-secondary-foreground: var(--secondary-foreground);
  --color-muted: var(--muted);
  --color-muted-foreground: var(--muted-foreground);
  --color-accent: var(--accent);
  --color-accent-foreground: var(--accent-foreground);
  --color-destructive: var(--destructive);
  --color-border: var(--border);
  --color-input: var(--input);
  --color-ring: var(--ring);
  --color-chart-1: var(--chart-1);
  --color-chart-2: var(--chart-2);
  --color-chart-3: var(--chart-3);
  --color-chart-4: var(--chart-4);
  --color-chart-5: var(--chart-5);
  --color-sidebar: var(--sidebar);
  --color-sidebar-foreground: var(--sidebar-foreground);
  --color-sidebar-primary: var(--sidebar-primary);
  --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
  --color-sidebar-accent: var(--sidebar-accent);
  --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
  --color-sidebar-border: var(--sidebar-border);
  --color-sidebar-ring: var(--sidebar-ring);
  --color-destructive-foreground: var(--destructive-foreground);

  --font-sans: var(--font-sans);
  --font-mono: var(--font-mono);
  --font-serif: var(--font-serif);

  --radius-sm: calc(var(--radius) - 4px);
  --radius-md: calc(var(--radius) - 2px);
  --radius-lg: var(--radius);
  --radius-xl: calc(var(--radius) + 4px);

  --shadow-2xs: var(--shadow-2xs);
  --shadow-xs: var(--shadow-xs);
  --shadow-sm: var(--shadow-sm);
  --shadow: var(--shadow);
  --shadow-md: var(--shadow-md);
  --shadow-lg: var(--shadow-lg);
  --shadow-xl: var(--shadow-xl);
  --shadow-2xl: var(--shadow-2xl);
}

Why this theme actually works

Marvel's been perfecting their visual identity for over 80 years, and they've figured out exactly which colors create that sense of power and heroism. The red-and-blue combination isn't random—it's the most universally recognized "hero" palette in Western culture.

Most comic book inspired themes either go full Saturday morning cartoon and look childish, or they try to be "edgy" with dark colors that miss the point entirely. Marvel's genius is making bold colors feel sophisticated and trustworthy rather than juvenile.

Dark mode maintains that heroic energy while becoming more comfortable for extended use. The red maintains its impact while the blue provides that trustworthy, dependable feeling that makes users confident in taking action.

What's actually in this theme

Dead simple setup—copy the CSS variables into your globals.css and you're done. The Outfit font gives you that modern superhero aesthetic without looking like a comic book font that's hard to read for UI text.

That bold red primary is perfect for CTAs that need to feel urgent and important—"Sign Up Now," "Start Your Journey," "Join the Fight." The blue secondary provides balance and trust, while the sharp corners keep everything feeling strong and decisive.

All contrast ratios pass WCAG AA standards so you won't run into accessibility issues. Since it uses standard shadcn color tokens, your TypeScript autocomplete for bg-primary, text-foreground, etc. just works.

How to use this in projects

The bold red should be your primary action color for high-impact moments—anything where you want users to feel empowered and take decisive action. Think fitness apps where you're motivating workouts, gaming platforms where competition drives engagement, or any app where confidence is key.

The blue secondary should provide that trustworthy foundation throughout the interface. Red grabs attention, blue builds trust. This combination works especially well for apps where users need to feel both excited and secure.

In practice, embrace the bold aesthetic but use it strategically. Too much red becomes overwhelming, so let the blue and neutral tones give users' eyes places to rest. The goal is sustained energy and confidence, not visual fatigue.

You might also like

FAQ