Grasshopper for shadcn/ui

Grasshopper is a shadcn/ui theme built around a vivid yellow primary color (#b9c11a) with vivid indigo accents (#231ac1). The light mode uses a neutral background (#ffffff). Dark mode keeps the vivid yellow primary (#b9c11a) on a yellow-tinted background (#0b0c04).

Color palette

TokenLightDark
Background
#ffffffwhite
#0b0c04black
Foreground
#141504black
#f9f9f6whitesmoke
Card
#fcfcfcsnow
#0f1005black
Card foreground
#101103black
#fbfbf9snow
Popover
#ffffffwhite
#0b0c04black
Popover foreground
#141504black
#f9f9f6whitesmoke
Primary
#b9c11ayellowgreen
#b9c11ayellowgreen
Primary foreground
#0d0d02black
#0d0d02black
Secondary
#231ac1mediumblue
#231ac1mediumblue
Secondary foreground
#ffffffwhite
#ffffffwhite
Muted
#ececf4lavender
#0c0b13black
Muted foreground
#5a5969dimgray
#9796a6darkgray
Accent
#231ac1mediumblue
#231ac1mediumblue
Accent foreground
#ffffffwhite
#ffffffwhite
Destructive
#7c2009maroon
#ef491forangered
Destructive foreground
#fac9bcpeachpuff
#ffffffwhite
Border
#e5e7eblavender
#1f2937darkslategray
Input
#e5e7eblavender
#1f2937darkslategray
Ring
#b9c11ayellowgreen
#b9c11ayellowgreen

Contrast

WCAG 2 contrast ratios between each background and its foreground color.

Light mode
Text on background18.44:1AAA
Text on card18.62:1AAA
Primary button9.94:1AAA
Secondary button10.54:1AAA
Muted text5.81:1AA
Accent10.54:1AAA
Destructive6.85:1AA
Dark mode
Text on background18.65:1AAA
Text on card18.52:1AAA
Primary button9.94:1AAA
Secondary button10.54:1AAA
Muted text6.72:1AA
Accent10.54:1AAA
Destructive3.71:1AA Large

CSS variables

Paste this into your globals.css to use Grasshopper in your shadcn/ui project.

:root {
  --radius: 0.5rem;
  --background: oklch(1 0 180);
  --foreground: oklch(0.19 0.032 111.479);
  --muted: oklch(0.945 0.011 288.499);
  --muted-foreground: oklch(0.471 0.025 287.698);
  --popover: oklch(1 0 180);
  --popover-foreground: oklch(0.19 0.032 111.479);
  --card: oklch(0.992 0 161.565);
  --card-foreground: oklch(0.172 0.028 111.257);
  --border: oklch(0.928 0.006 264.531);
  --input: oklch(0.928 0.006 264.531);
  --primary: oklch(0.779 0.168 112.883);
  --primary-foreground: oklch(0.156 0.028 111.226);
  --secondary: oklch(0.393 0.236 269.877);
  --secondary-foreground: oklch(1 0 180);
  --accent: oklch(0.393 0.236 269.877);
  --accent-foreground: oklch(1 0 180);
  --destructive: oklch(0.391 0.131 34.315);
  --destructive-foreground: oklch(0.875 0.059 34.387);
  --ring: oklch(0.779 0.168 112.883);
  --chart-1: oklch(0.779 0.168 112.883);
  --chart-2: oklch(0.393 0.236 269.877);
  --chart-3: oklch(0.393 0.236 269.877);
  --chart-4: oklch(0.412 0.249 269.716);
  --chart-5: oklch(0.788 0.171 112.954);
}

.dark {
  --radius: 0.5rem;
  --background: oklch(0.149 0.02 110.565);
  --foreground: oklch(0.981 0.004 108.782);
  --muted: oklch(0.156 0.017 286.558);
  --muted-foreground: oklch(0.68 0.023 288.079);
  --popover: oklch(0.149 0.02 110.565);
  --popover-foreground: oklch(0.981 0.004 108.782);
  --card: oklch(0.167 0.023 110.873);
  --card-foreground: oklch(0.987 0.003 108.757);
  --border: oklch(0.278 0.03 256.848);
  --input: oklch(0.278 0.03 256.848);
  --primary: oklch(0.779 0.168 112.883);
  --primary-foreground: oklch(0.156 0.028 111.226);
  --secondary: oklch(0.393 0.236 269.877);
  --secondary-foreground: oklch(1 0 180);
  --accent: oklch(0.393 0.236 269.877);
  --accent-foreground: oklch(1 0 180);
  --destructive: oklch(0.638 0.21 34.447);
  --destructive-foreground: oklch(1 0 180);
  --ring: oklch(0.779 0.168 112.883);
  --chart-1: oklch(0.779 0.168 112.883);
  --chart-2: oklch(0.393 0.236 269.877);
  --chart-3: oklch(0.393 0.236 269.877);
  --chart-4: oklch(0.412 0.249 269.716);
  --chart-5: oklch(0.788 0.171 112.954);
}