Heartwood for shadcn/ui

Heartwood is a shadcn/ui theme built around a vivid pink primary color (#d7197b) with vivid green accents (#19d775). The light mode uses a neutral background (#fcf7fa). Dark mode keeps the vivid pink primary (#d7197b) on a neutral background (#000000).

Color palette

TokenLightDark
Background
#fcf7fasnow
#000000black
Foreground
#080205black
#fdfcfcsnow
Card
#fcf7fasnow
#000000black
Card foreground
#080205black
#fdfcfcsnow
Popover
#fcf7fasnow
#000000black
Popover foreground
#080205black
#fdfcfcsnow
Primary
#d7197bmediumvioletred
#d7197bmediumvioletred
Primary foreground
#ffffffwhite
#ffffffwhite
Secondary
#19d775springgreen
#19d775springgreen
Secondary foreground
#042011black
#042011black
Muted
#d6e6degainsboro
#192921black
Muted foreground
#4d6056dimgray
#9fb2a8darkgray
Accent
#19d775springgreen
#19d775springgreen
Accent foreground
#042011black
#042011black
Destructive
#7d2303maroon
#fb6028tomato
Destructive foreground
#fdc8b4peachpuff
#000000black
Border
#e5e7eblavender
#1f2937darkslategray
Input
#e5e7eblavender
#1f2937darkslategray
Ring
#d7197bmediumvioletred
#d7197bmediumvioletred

Contrast

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

Light mode
Text on background19.47:1AAA
Text on card19.47:1AAA
Primary button4.88:1AA
Secondary button8.99:1AAA
Muted text5.18:1AA
Accent8.99:1AAA
Destructive6.66:1AA
Dark mode
Text on background20.50:1AAA
Text on card20.50:1AAA
Primary button4.88:1AA
Secondary button8.99:1AAA
Muted text6.80:1AA
Accent8.99:1AAA
Destructive6.79:1AA

CSS variables

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

:root {
  --radius: 0.5rem;
  --background: oklch(0.982 0.006 344.45);
  --foreground: oklch(0.105 0.023 344.129);
  --muted: oklch(0.91 0.02 163.702);
  --muted-foreground: oklch(0.471 0.028 162.644);
  --popover: oklch(0.982 0.006 344.45);
  --popover-foreground: oklch(0.105 0.023 344.129);
  --card: oklch(0.982 0.006 344.45);
  --card-foreground: oklch(0.105 0.023 344.129);
  --border: oklch(0.928 0.006 264.531);
  --input: oklch(0.928 0.006 264.531);
  --primary: oklch(0.578 0.225 357.263);
  --primary-foreground: oklch(1 0 180);
  --secondary: oklch(0.771 0.195 152.787);
  --secondary-foreground: oklch(0.217 0.045 157.523);
  --accent: oklch(0.771 0.195 152.787);
  --accent-foreground: oklch(0.217 0.045 157.523);
  --destructive: oklch(0.396 0.129 37.254);
  --destructive-foreground: oklch(0.874 0.067 40.912);
  --ring: oklch(0.578 0.225 357.263);
  --chart-1: oklch(0.578 0.225 357.263);
  --chart-2: oklch(0.771 0.195 152.787);
  --chart-3: oklch(0.771 0.195 152.787);
  --chart-4: oklch(0.808 0.205 152.727);
  --chart-5: oklch(0.583 0.229 357.823);
}

.dark {
  --radius: 0.5rem;
  --background: oklch(0 0 0);
  --foreground: oklch(0.992 0.001 344.319);
  --muted: oklch(0.264 0.026 161.358);
  --muted-foreground: oklch(0.745 0.025 163.38);
  --popover: oklch(0 0 0);
  --popover-foreground: oklch(0.992 0.001 344.319);
  --card: oklch(0 0 0);
  --card-foreground: oklch(0.992 0.001 344.319);
  --border: oklch(0.278 0.03 256.848);
  --input: oklch(0.278 0.03 256.848);
  --primary: oklch(0.578 0.225 357.263);
  --primary-foreground: oklch(1 0 180);
  --secondary: oklch(0.771 0.195 152.787);
  --secondary-foreground: oklch(0.217 0.045 157.523);
  --accent: oklch(0.771 0.195 152.787);
  --accent-foreground: oklch(0.217 0.045 157.523);
  --destructive: oklch(0.683 0.2 38.551);
  --destructive-foreground: oklch(0 0 0);
  --ring: oklch(0.578 0.225 357.263);
  --chart-1: oklch(0.578 0.225 357.263);
  --chart-2: oklch(0.771 0.195 152.787);
  --chart-3: oklch(0.771 0.195 152.787);
  --chart-4: oklch(0.808 0.205 152.727);
  --chart-5: oklch(0.583 0.229 357.823);
}