Join our Discord Community

Valorant Shadcn Theme

Valorant tactical shooter inspired theme with orange accents and sharp edges for shadcn/ui. Competitive gaming aesthetic with precision design. TypeScript ready.

Working with shadcn themes?

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

Valorant Shadcn Theme

Spent way too many hours in Valorant ranked and always loved how Riot nailed that tactical, precise aesthetic. The orange highlights against those sharp blacks create this perfect competitive energy—clean enough for pros but with just enough edge to feel intense.

Perfect for gaming platforms, esports dashboards, competitive apps, or any React project where you want that focused, high-performance feeling. The Barlow font gives you that tactical, no-nonsense typography that serious players expect.

Installation

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

Original theme by tweakcn.com

CSS Variables

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

:root {
  --background: oklch(0.97 0.02 12.78);
  --foreground: oklch(0.24 0.07 17.81);
  --card: oklch(0.98 0.01 17.28);
  --card-foreground: oklch(0.26 0.07 19);
  --popover: oklch(0.98 0.01 17.28);
  --popover-foreground: oklch(0.26 0.07 19);
  --primary: oklch(0.67 0.22 21.34);
  --primary-foreground: oklch(0.99 0.00 359.99);
  --secondary: oklch(0.95 0.02 11.28);
  --secondary-foreground: oklch(0.24 0.07 17.81);
  --muted: oklch(0.98 0.01 17.28);
  --muted-foreground: oklch(0.26 0.07 19);
  --accent: oklch(0.99 0.00 359.99);
  --accent-foreground: oklch(0.43 0.13 20.62);
  --destructive: oklch(0.80 0.17 73.27);
  --border: oklch(0.91 0.05 11.40);
  --input: oklch(0.90 0.05 12.59);
  --ring: oklch(0.92 0.04 12.39);
  --chart-1: oklch(0.86 0.18 88.49);
  --chart-2: oklch(0.62 0.21 255.13);
  --chart-3: oklch(0.54 0.29 297.82);
  --chart-4: oklch(0.95 0.10 98.39);
  --chart-5: oklch(0.87 0.12 100.28);
  --sidebar: oklch(0.97 0.02 12.78);
  --sidebar-foreground: oklch(0.26 0.07 19);
  --sidebar-primary: oklch(0.67 0.22 21.34);
  --sidebar-primary-foreground: oklch(0.98 0.01 17.28);
  --sidebar-accent: oklch(0.98 0.01 17.28);
  --sidebar-accent-foreground: oklch(0.43 0.13 20.62);
  --sidebar-border: oklch(0.91 0.05 11.40);
  --sidebar-ring: oklch(0.92 0.04 12.39);
  --destructive-foreground: oklch(1.0000 0 0);
  --font-sans: Barlow;
  --font-serif: Merriweather;
  --font-mono: JetBrains Mono;
  --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.16 0.03 17.48);
  --foreground: oklch(0.99 0.00 359.99);
  --card: oklch(0.21 0.05 19.26);
  --card-foreground: oklch(0.98 0 0);
  --popover: oklch(0.26 0.07 19);
  --popover-foreground: oklch(0.99 0.00 359.99);
  --primary: oklch(0.67 0.22 21.34);
  --primary-foreground: oklch(0.99 0.00 359.99);
  --secondary: oklch(0.3 0.0891 19.6);
  --secondary-foreground: oklch(0.95 0.02 11.28);
  --muted: oklch(0.26 0.07 19);
  --muted-foreground: oklch(0.99 0.00 359.99);
  --accent: oklch(0.43 0.13 20.62);
  --accent-foreground: oklch(0.99 0.00 359.99);
  --destructive: oklch(0.80 0.17 73.27);
  --border: oklch(0.31 0.09 19.80);
  --input: oklch(0.39 0.12 20.37);
  --ring: oklch(0.50 0.16 20.89);
  --chart-1: oklch(0.86 0.18 88.49);
  --chart-2: oklch(0.62 0.21 255.13);
  --chart-3: oklch(0.54 0.29 297.82);
  --chart-4: oklch(0.95 0.10 98.39);
  --chart-5: oklch(0.87 0.12 100.28);
  --sidebar: oklch(0.26 0.07 19);
  --sidebar-foreground: oklch(0.99 0.00 359.99);
  --sidebar-primary: oklch(0.67 0.22 21.34);
  --sidebar-primary-foreground: oklch(0.99 0.00 359.99);
  --sidebar-accent: oklch(0.43 0.13 20.62);
  --sidebar-accent-foreground: oklch(0.99 0.00 359.99);
  --sidebar-border: oklch(0.39 0.12 20.37);
  --sidebar-ring: oklch(0.50 0.16 20.89);
  --destructive-foreground: oklch(1.0000 0 0);
  --font-sans: Barlow;
  --font-serif: Merriweather;
  --font-mono: JetBrains Mono;
  --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

Riot's design team knows their audience. That orange isn't just any orange—it's the exact frequency that pops against dark backgrounds without causing eye strain during long gaming sessions. The zero border radius creates that tactical, no-nonsense feel that competitive players associate with precision and performance.

Most gaming themes go way overboard with neon colors and flashy effects that actually hurt usability. Valorant's aesthetic is the opposite—clean, focused, and designed for extended use. When you're tracking headshots for hours, you need an interface that gets out of the way.

Dark mode maintains that competitive edge while keeping everything readable. The orange highlights guide attention to critical actions—perfect for dashboards where split-second decisions matter. Light mode keeps the same tactical feel but works in office environments.

What's actually in this theme

Dead simple setup—copy the CSS variables into your globals.css and you're done. The Barlow font gives you that modern tactical typography that's legible at any size, perfect for data-heavy interfaces.

That Valorant orange is perfect for critical actions, active states, or anything that needs immediate attention. The sharp corners and clean lines create a precision feeling—no soft, rounded elements here. This is for interfaces that mean business.

All contrast ratios pass WCAG AA standards because competitive players need maximum clarity. Since it uses standard shadcn color tokens, your TypeScript autocomplete for bg-primary, text-foreground, etc. works perfectly.

How to use this in projects

The orange should mark critical actions and active states—"Fire," "Execute," "Confirm," anything that requires precision and immediate response. Think tactical rather than decorative. The clean whites and grays should dominate for maximum readability.

This works especially well for analytics dashboards, trading platforms, gaming interfaces, or any app where users need to make quick, accurate decisions under pressure. The aesthetic says "professional tool" rather than "flashy game."

In practice, embrace the utilitarian design but keep it clean. The zero radius and sharp contrasts work because they create clear hierarchy. Users know exactly where to look and what's actionable. Less distraction, more focus.

You might also like

FAQ