Dense for shadcn/ui

Dense is a shadcn/ui theme built around a light teal primary color (#b3efd4) with neutral gray accents (#cfcfcf). The light mode uses a neutral background (#fbfefd). Dark mode keeps the light teal primary (#b3efd4) on a neutral background (#020403).

Color palette

TokenLightDark
Background
#fbfefdwhite
#020403black
Foreground
#050f0bblack
#ffffffwhite
Card
#f7fdfamintcream
#030705black
Card foreground
#040c08black
#ffffffwhite
Popover
#f7fdfamintcream
#030705black
Popover foreground
#040c08black
#ffffffwhite
Primary
#b3efd4powderblue
#b3efd4powderblue
Primary foreground
#145d3cdarkslategray
#145d3cdarkslategray
Secondary
#cfcfcflightgrey
#303633darkslategray
Secondary foreground
#363636darkslategray
#c9cfcclightgrey
Muted
#ebd1d1gainsboro
#142e22black
Muted foreground
#504444darkslategray
#afbbb6silver
Accent
#cfcfcflightgrey
#303633darkslategray
Accent foreground
#363636darkslategray
#c9cfcclightgrey
Destructive
#6a0f01maroon
#fd4326orangered
Destructive foreground
#feac9flightpink
#ffffffwhite
Border
#e5e7eblavender
#1f2937darkslategray
Input
#e5e7eblavender
#1f2937darkslategray
Ring
#b3efd4powderblue
#b3efd4powderblue

Contrast

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

Light mode
Text on background19.15:1AAA
Text on card19.18:1AAA
Primary button6.09:1AA
Secondary button7.72:1AAA
Muted text6.46:1AA
Accent7.72:1AAA
Destructive6.90:1AA
Dark mode
Text on background20.61:1AAA
Text on card20.24:1AAA
Primary button6.09:1AA
Secondary button7.83:1AAA
Muted text7.33:1AAA
Accent7.83:1AAA
Destructive3.50:1AA Large

CSS variables

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

:root {
  --radius: 0.5rem;
  --background: oklch(0.994 0.003 167.716);
  --foreground: oklch(0.157 0.02 165.76);
  --muted: oklch(0.882 0.029 17.714);
  --muted-foreground: oklch(0.399 0.016 17.853);
  --popover: oklch(0.988 0.007 167.619);
  --popover-foreground: oklch(0.141 0.017 167.763);
  --card: oklch(0.988 0.007 167.619);
  --card-foreground: oklch(0.141 0.017 167.763);
  --border: oklch(0.928 0.006 264.531);
  --input: oklch(0.928 0.006 264.531);
  --primary: oklch(0.904 0.071 165.424);
  --primary-foreground: oklch(0.424 0.089 158.743);
  --secondary: oklch(0.853 0 168.69);
  --secondary-foreground: oklch(0.331 0 180);
  --accent: oklch(0.853 0 168.69);
  --accent-foreground: oklch(0.331 0 180);
  --destructive: oklch(0.339 0.126 32.229);
  --destructive-foreground: oklch(0.82 0.099 29.023);
  --ring: oklch(0.904 0.071 165.424);
  --chart-1: oklch(0.904 0.071 165.424);
  --chart-2: oklch(0.853 0 168.69);
  --chart-3: oklch(0.853 0 168.69);
  --chart-4: oklch(0.877 0 180);
  --chart-5: oklch(0.906 0.074 165.314);
}

.dark {
  --radius: 0.5rem;
  --background: oklch(0.097 0.009 167.984);
  --foreground: oklch(1 0 180);
  --muted: oklch(0.277 0.039 162.932);
  --muted-foreground: oklch(0.781 0.015 167.27);
  --popover: oklch(0.122 0.012 167.984);
  --popover-foreground: oklch(1 0 180);
  --card: oklch(0.122 0.012 167.984);
  --card-foreground: oklch(1 0 180);
  --border: oklch(0.278 0.03 256.848);
  --input: oklch(0.278 0.03 256.848);
  --primary: oklch(0.904 0.071 165.424);
  --primary-foreground: oklch(0.424 0.089 158.743);
  --secondary: oklch(0.325 0.008 167.112);
  --secondary-foreground: oklch(0.848 0.006 167.603);
  --accent: oklch(0.325 0.008 167.112);
  --accent-foreground: oklch(0.848 0.006 167.603);
  --destructive: oklch(0.656 0.226 31.656);
  --destructive-foreground: oklch(1 0 180);
  --ring: oklch(0.904 0.071 165.424);
  --chart-1: oklch(0.904 0.071 165.424);
  --chart-2: oklch(0.325 0.008 167.112);
  --chart-3: oklch(0.325 0.008 167.112);
  --chart-4: oklch(0.356 0.009 167.091);
  --chart-5: oklch(0.906 0.074 165.314);
}