Join our Discord Community

Nature Shadcn Theme

Natural theme with earth tones and organic green accents for shadcn/ui. Calming nature-inspired design with peaceful aesthetics. TypeScript ready.

Working with shadcn themes?

Join our Discord community for help from other shadcn developers working with themes and design systems.

Nature Shadcn Theme

Been spending way too much time indoors coding and realized my interfaces were as sterile as my home office. This theme brings that outdoor calm inside—soft greens, earth tones, and the kind of color palette that doesn't make your eyes scream after 8 hours of debugging.

Perfect for wellness apps, environmental platforms, meditation tools, or any React project where you want users to feel grounded and relaxed rather than overstimulated. The Montserrat font keeps things readable while maintaining that organic, approachable feel.

Installation

npx shadcn@latest add https://www.shadcn.io/registry/nature.json
npx shadcn@latest add https://www.shadcn.io/registry/nature.json
pnpm dlx shadcn@latest add https://www.shadcn.io/registry/nature.json
bunx shadcn@latest add https://www.shadcn.io/registry/nature.json

Original theme by tweakcn.com

CSS Variables

Copy and paste the following CSS variables into your global CSS file:

:root {
  --background: oklch(0.97 0.01 80.72);
  --foreground: oklch(0.30 0.04 30.20);
  --card: oklch(0.97 0.01 80.72);
  --card-foreground: oklch(0.30 0.04 30.20);
  --popover: oklch(0.97 0.01 80.72);
  --popover-foreground: oklch(0.30 0.04 30.20);
  --primary: oklch(0.52 0.13 144.17);
  --primary-foreground: oklch(1.00 0 0);
  --secondary: oklch(0.96 0.02 147.64);
  --secondary-foreground: oklch(0.43 0.12 144.31);
  --muted: oklch(0.94 0.01 74.42);
  --muted-foreground: oklch(0.45 0.05 39.21);
  --accent: oklch(0.90 0.05 146.04);
  --accent-foreground: oklch(0.43 0.12 144.31);
  --destructive: oklch(0.54 0.19 26.72);
  --border: oklch(0.88 0.02 74.64);
  --input: oklch(0.88 0.02 74.64);
  --ring: oklch(0.52 0.13 144.17);
  --chart-1: oklch(0.67 0.16 144.21);
  --chart-2: oklch(0.58 0.14 144.18);
  --chart-3: oklch(0.52 0.13 144.17);
  --chart-4: oklch(0.43 0.12 144.31);
  --chart-5: oklch(0.22 0.05 145.73);
  --sidebar: oklch(0.94 0.01 74.42);
  --sidebar-foreground: oklch(0.30 0.04 30.20);
  --sidebar-primary: oklch(0.52 0.13 144.17);
  --sidebar-primary-foreground: oklch(1.00 0 0);
  --sidebar-accent: oklch(0.90 0.05 146.04);
  --sidebar-accent-foreground: oklch(0.43 0.12 144.31);
  --sidebar-border: oklch(0.88 0.02 74.64);
  --sidebar-ring: oklch(0.52 0.13 144.17);
  --destructive-foreground: oklch(1.0000 0 0);
  --font-sans: Montserrat, sans-serif;
  --font-serif: Merriweather, serif;
  --font-mono: Source Code Pro, monospace;
  --radius: 0.5rem;
  --shadow-2xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05);
  --shadow-xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05);
  --shadow-sm: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10);
  --shadow: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10);
  --shadow-md: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 2px 4px -2px hsl(0 0% 0% / 0.10);
  --shadow-lg: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 4px 6px -2px hsl(0 0% 0% / 0.10);
  --shadow-xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 8px 10px -2px hsl(0 0% 0% / 0.10);
  --shadow-2xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.25);
  --tracking-normal: 0em;
}

.dark {
  --background: oklch(0.27 0.03 150.77);
  --foreground: oklch(0.94 0.01 72.66);
  --card: oklch(0.33 0.03 146.99);
  --card-foreground: oklch(0.94 0.01 72.66);
  --popover: oklch(0.33 0.03 146.99);
  --popover-foreground: oklch(0.94 0.01 72.66);
  --primary: oklch(0.67 0.16 144.21);
  --primary-foreground: oklch(0.22 0.05 145.73);
  --secondary: oklch(0.39 0.03 142.99);
  --secondary-foreground: oklch(0.90 0.02 142.55);
  --muted: oklch(0.33 0.03 146.99);
  --muted-foreground: oklch(0.86 0.02 76.10);
  --accent: oklch(0.58 0.14 144.18);
  --accent-foreground: oklch(0.94 0.01 72.66);
  --destructive: oklch(0.54 0.19 26.72);
  --border: oklch(0.39 0.03 142.99);
  --input: oklch(0.39 0.03 142.99);
  --ring: oklch(0.67 0.16 144.21);
  --chart-1: oklch(0.77 0.12 145.30);
  --chart-2: oklch(0.72 0.14 144.89);
  --chart-3: oklch(0.67 0.16 144.21);
  --chart-4: oklch(0.63 0.15 144.20);
  --chart-5: oklch(0.58 0.14 144.18);
  --sidebar: oklch(0.27 0.03 150.77);
  --sidebar-foreground: oklch(0.94 0.01 72.66);
  --sidebar-primary: oklch(0.67 0.16 144.21);
  --sidebar-primary-foreground: oklch(0.22 0.05 145.73);
  --sidebar-accent: oklch(0.58 0.14 144.18);
  --sidebar-accent-foreground: oklch(0.94 0.01 72.66);
  --sidebar-border: oklch(0.39 0.03 142.99);
  --sidebar-ring: oklch(0.67 0.16 144.21);
  --destructive-foreground: oklch(1.0000 0 0);
  --font-sans: Montserrat, sans-serif;
  --font-serif: Merriweather, serif;
  --font-mono: Source Code Pro, monospace;
  --radius: 0.5rem;
  --shadow-2xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05);
  --shadow-xs: 0px 4px 8px -1px hsl(0 0% 0% / 0.05);
  --shadow-sm: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10);
  --shadow: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 1px 2px -2px hsl(0 0% 0% / 0.10);
  --shadow-md: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 2px 4px -2px hsl(0 0% 0% / 0.10);
  --shadow-lg: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 4px 6px -2px hsl(0 0% 0% / 0.10);
  --shadow-xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.10), 0px 8px 10px -2px hsl(0 0% 0% / 0.10);
  --shadow-2xl: 0px 4px 8px -1px hsl(0 0% 0% / 0.25);
}

@theme inline {
  --color-background: var(--background);
  --color-foreground: var(--foreground);
  --color-card: var(--card);
  --color-card-foreground: var(--card-foreground);
  --color-popover: var(--popover);
  --color-popover-foreground: var(--popover-foreground);
  --color-primary: var(--primary);
  --color-primary-foreground: var(--primary-foreground);
  --color-secondary: var(--secondary);
  --color-secondary-foreground: var(--secondary-foreground);
  --color-muted: var(--muted);
  --color-muted-foreground: var(--muted-foreground);
  --color-accent: var(--accent);
  --color-accent-foreground: var(--accent-foreground);
  --color-destructive: var(--destructive);
  --color-border: var(--border);
  --color-input: var(--input);
  --color-ring: var(--ring);
  --color-chart-1: var(--chart-1);
  --color-chart-2: var(--chart-2);
  --color-chart-3: var(--chart-3);
  --color-chart-4: var(--chart-4);
  --color-chart-5: var(--chart-5);
  --color-sidebar: var(--sidebar);
  --color-sidebar-foreground: var(--sidebar-foreground);
  --color-sidebar-primary: var(--sidebar-primary);
  --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
  --color-sidebar-accent: var(--sidebar-accent);
  --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
  --color-sidebar-border: var(--sidebar-border);
  --color-sidebar-ring: var(--sidebar-ring);
  --color-destructive-foreground: var(--destructive-foreground);

  --font-sans: var(--font-sans);
  --font-mono: var(--font-mono);
  --font-serif: var(--font-serif);

  --radius-sm: calc(var(--radius) - 4px);
  --radius-md: calc(var(--radius) - 2px);
  --radius-lg: var(--radius);
  --radius-xl: calc(var(--radius) + 4px);

  --shadow-2xs: var(--shadow-2xs);
  --shadow-xs: var(--shadow-xs);
  --shadow-sm: var(--shadow-sm);
  --shadow: var(--shadow);
  --shadow-md: var(--shadow-md);
  --shadow-lg: var(--shadow-lg);
  --shadow-xl: var(--shadow-xl);
  --shadow-2xl: var(--shadow-2xl);
}

Why this theme actually works

After building apps for healthcare and wellness companies, learned that green isn't just "nature color"—it's scientifically proven to reduce eye strain and promote calm focus. This theme uses the right shade of green that feels alive without being aggressive or too "environmental activist."

Most nature themes either go full forest ranger with dark greens that feel heavy, or they use those artificial lime greens that hurt to look at. This theme hits the sweet spot—calming earth tones that feel organic and approachable while maintaining professional credibility.

Dark mode shifts to deeper forest tones that maintain the natural feeling while being comfortable for night work. The greens stay calming but become more sophisticated, like stepping into a cozy cabin instead of standing in bright sunlight.

What's actually in this theme

Dead simple setup—copy the CSS variables into your globals.css and you're done. The Montserrat font provides clean readability while the organic green accents create that grounded, natural feeling without being distracting.

That calm green is perfect for primary actions that should feel safe and reassuring—"Join," "Subscribe," "Get Started." The earth-tone backgrounds create environments where users can actually think and focus instead of feeling rushed by aggressive colors.

All contrast ratios pass WCAG AA standards because good design never sacrifices accessibility for aesthetics. Since it uses standard shadcn color tokens, your TypeScript autocomplete for bg-primary, text-foreground, etc. works perfectly.

How to use this in projects

The soft green should mark actions that feel safe and inviting—anything related to health, growth, learning, or positive outcomes. Use the earth tones to create calm, focused environments where users can think clearly about important decisions.

This works especially well for healthcare apps, educational platforms, financial wellness tools, or any interface where trust and calm matter more than excitement. Think meditation app, not energy drink marketing.

In practice, embrace the breathing room this palette creates. The generous contrast and organic color relationships reduce cognitive load, letting users focus on content and tasks rather than fighting with the interface design.

You might also like

FAQ