Miserly for shadcn/ui

Miserly is a shadcn/ui theme built around a near-white primary color (#f2f3f2) with near-white accents (#f3f2f2). The light mode uses a neutral background (#fdfdfc). Dark mode keeps the near-white primary (#f2f3f2) on a neutral background (#050703).

Color palette

TokenLightDark
Background
#fdfdfcwhite
#050703black
Foreground
#080c03black
#fafcf8snow
Card
#fafcf8snow
#080b05black
Card foreground
#050802black
#fdfdfcwhite
Popover
#fafcf8snow
#080b05black
Popover foreground
#050802black
#fdfdfcwhite
Primary
#f2f3f2whitesmoke
#f2f3f2whitesmoke
Primary foreground
#5a5c57dimgray
#5a5c57dimgray
Secondary
#f2f2f3whitesmoke
#f2f2f3whitesmoke
Secondary foreground
#575a5cdimgray
#575a5cdimgray
Muted
#d3dfe8gainsboro
#17222cblack
Muted foreground
#434546darkslategray
#b9babcsilver
Accent
#f3f2f2whitesmoke
#f3f2f2whitesmoke
Accent foreground
#5c575adimgray
#5c575adimgray
Destructive
#692007maroon
#ef4f1aorangered
Destructive foreground
#f9bda9lightpink
#ffffffwhite
Border
#e5e7eblavender
#1f2937darkslategray
Input
#e5e7eblavender
#1f2937darkslategray
Ring
#f2f3f2whitesmoke
#f2f3f2whitesmoke

Contrast

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

Light mode
Text on background19.41:1AAA
Text on card19.50:1AAA
Primary button6.07:1AA
Secondary button6.21:1AA
Muted text7.11:1AAA
Accent6.32:1AA
Destructive7.13:1AAA
Dark mode
Text on background19.58:1AAA
Text on card19.49:1AAA
Primary button6.07:1AA
Secondary button6.21:1AA
Muted text8.30:1AAA
Accent6.32:1AA
Destructive3.61:1AA Large

CSS variables

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

:root {
  --radius: 0.5rem;
  --background: oklch(0.994 0.003 126.462);
  --foreground: oklch(0.146 0.022 125.738);
  --muted: oklch(0.897 0.018 242.462);
  --muted-foreground: oklch(0.389 0.003 242.292);
  --popover: oklch(0.988 0.005 126.497);
  --popover-foreground: oklch(0.127 0.019 125.498);
  --card: oklch(0.988 0.005 126.497);
  --card-foreground: oklch(0.127 0.019 125.498);
  --border: oklch(0.928 0.006 264.531);
  --input: oklch(0.928 0.006 264.531);
  --primary: oklch(0.963 0.001 126.443);
  --primary-foreground: oklch(0.471 0.009 126.675);
  --secondary: oklch(0.962 0.001 242.203);
  --secondary-foreground: oklch(0.464 0.005 242.348);
  --accent: oklch(0.961 0.001 342.643);
  --accent-foreground: oklch(0.461 0.008 343.055);
  --destructive: oklch(0.355 0.11 37.2);
  --destructive-foreground: oklch(0.848 0.075 39.224);
  --ring: oklch(0.963 0.001 126.443);
  --chart-1: oklch(0.963 0.001 126.443);
  --chart-2: oklch(0.962 0.001 242.203);
  --chart-3: oklch(0.961 0.001 342.643);
  --chart-4: oklch(0.985 0 242.197);
  --chart-5: oklch(0.963 0.002 126.457);
}

.dark {
  --radius: 0.5rem;
  --background: oklch(0.124 0.014 125.753);
  --foreground: oklch(0.988 0.005 126.49);
  --muted: oklch(0.246 0.025 243.675);
  --muted-foreground: oklch(0.789 0.002 242.235);
  --popover: oklch(0.142 0.016 125.782);
  --popover-foreground: oklch(0.994 0.002 126.459);
  --card: oklch(0.142 0.016 125.782);
  --card-foreground: oklch(0.994 0.002 126.459);
  --border: oklch(0.278 0.03 256.848);
  --input: oklch(0.278 0.03 256.848);
  --primary: oklch(0.963 0.001 126.443);
  --primary-foreground: oklch(0.471 0.009 126.675);
  --secondary: oklch(0.962 0.001 242.203);
  --secondary-foreground: oklch(0.464 0.005 242.348);
  --accent: oklch(0.961 0.001 342.643);
  --accent-foreground: oklch(0.461 0.008 343.055);
  --destructive: oklch(0.645 0.205 36.765);
  --destructive-foreground: oklch(1 0 180);
  --ring: oklch(0.963 0.001 126.443);
  --chart-1: oklch(0.963 0.001 126.443);
  --chart-2: oklch(0.962 0.001 242.203);
  --chart-3: oklch(0.961 0.001 342.643);
  --chart-4: oklch(0.985 0 242.197);
  --chart-5: oklch(0.963 0.002 126.457);
}