Vintner for shadcn/ui

Vintner is a shadcn/ui theme built around a vivid light red primary color (#fe9e8f) with vivid light indigo accents (#9e8ffe). The light mode uses a neutral background (#ffffff). Dark mode keeps the vivid light red primary (#fe9e8f) on a neutral background (#080303).

Color palette

TokenLightDark
Background
#ffffffwhite
#080303black
Foreground
#100604black
#fdfcfcsnow
Card
#ffffffwhite
#080303black
Card foreground
#100604black
#fdfcfcsnow
Popover
#ffffffwhite
#080303black
Popover foreground
#100604black
#fdfcfcsnow
Primary
#fe9e8flightsalmon
#fe9e8flightsalmon
Primary foreground
#5b0d00maroon
#5b0d00maroon
Secondary
#8ffe9epalegreen
#8ffe9epalegreen
Secondary foreground
#005b0ddarkgreen
#005b0ddarkgreen
Muted
#d1e0d3lightgrey
#1f2e21darkslategray
Muted foreground
#3b4e3edarkslategray
#b1c4b3silver
Accent
#9e8ffemediumpurple
#9e8ffemediumpurple
Accent foreground
#0d005bmidnightblue
#0d005bmidnightblue
Destructive
#cb3106firebrick
#f83f0dorangered
Destructive foreground
#ffffffwhite
#ffffffwhite
Border
#e5e7eblavender
#1f2937darkslategray
Input
#e5e7eblavender
#1f2937darkslategray
Ring
#fe9e8flightsalmon
#fe9e8flightsalmon

Contrast

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

Light mode
Text on background20.00:1AAA
Text on card20.00:1AAA
Primary button7.01:1AAA
Secondary button6.75:1AA
Muted text6.53:1AA
Accent6.71:1AA
Destructive5.28:1AA
Dark mode
Text on background20.00:1AAA
Text on card20.00:1AAA
Primary button7.01:1AAA
Secondary button6.75:1AA
Muted text7.80:1AAA
Accent6.71:1AA
Destructive3.68:1AA Large

CSS variables

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

:root {
  --radius: 0.5rem;
  --background: oklch(1 0 180);
  --foreground: oklch(0.138 0.021 32.817);
  --muted: oklch(0.892 0.023 149.36);
  --muted-foreground: oklch(0.404 0.037 148.485);
  --popover: oklch(1 0 180);
  --popover-foreground: oklch(0.138 0.021 32.817);
  --card: oklch(1 0 180);
  --card-foreground: oklch(0.138 0.021 32.817);
  --border: oklch(0.928 0.006 264.531);
  --input: oklch(0.928 0.006 264.531);
  --primary: oklch(0.794 0.118 29.372);
  --primary-foreground: oklch(0.306 0.113 32.757);
  --secondary: oklch(0.909 0.166 147.053);
  --secondary-foreground: oklch(0.41 0.133 143.816);
  --accent: oklch(0.712 0.159 287.787);
  --accent-foreground: oklch(0.222 0.143 271.306);
  --destructive: oklch(0.552 0.195 33.951);
  --destructive-foreground: oklch(1 0 180);
  --ring: oklch(0.794 0.118 29.372);
  --chart-1: oklch(0.794 0.118 29.372);
  --chart-2: oklch(0.909 0.166 147.053);
  --chart-3: oklch(0.712 0.159 287.787);
  --chart-4: oklch(0.918 0.145 147.47);
  --chart-5: oklch(0.794 0.121 29.434);
}

.dark {
  --radius: 0.5rem;
  --background: oklch(0.109 0.013 32.485);
  --foreground: oklch(0.992 0.001 27.937);
  --muted: oklch(0.282 0.03 148.253);
  --muted-foreground: oklch(0.8 0.031 149.188);
  --popover: oklch(0.109 0.013 32.485);
  --popover-foreground: oklch(0.992 0.001 27.937);
  --card: oklch(0.109 0.013 32.485);
  --card-foreground: oklch(0.992 0.001 27.937);
  --border: oklch(0.278 0.03 256.848);
  --input: oklch(0.278 0.03 256.848);
  --primary: oklch(0.794 0.118 29.372);
  --primary-foreground: oklch(0.306 0.113 32.757);
  --secondary: oklch(0.909 0.166 147.053);
  --secondary-foreground: oklch(0.41 0.133 143.816);
  --accent: oklch(0.712 0.159 287.787);
  --accent-foreground: oklch(0.222 0.143 271.306);
  --destructive: oklch(0.643 0.226 34.075);
  --destructive-foreground: oklch(1 0 180);
  --ring: oklch(0.794 0.118 29.372);
  --chart-1: oklch(0.794 0.118 29.372);
  --chart-2: oklch(0.909 0.166 147.053);
  --chart-3: oklch(0.712 0.159 287.787);
  --chart-4: oklch(0.918 0.145 147.47);
  --chart-5: oklch(0.794 0.121 29.434);
}