Join our Discord Community

Ghibli Studio Shadcn Theme

Studio Ghibli inspired theme with warm earth tones and gentle greens for shadcn/ui. Whimsical nature-inspired design with organic feel. TypeScript ready.

Working with shadcn themes?

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

Ghibli Studio Shadcn Theme

Been rewatching Spirited Away and Totoro way too much lately and couldn't help but notice how Ghibli films have this perfect color palette—warm earth tones, gentle greens, and that organic feeling that somehow makes everything feel alive and welcoming.

Perfect for creative portfolios, wellness apps, educational platforms, or any React project where you want that magical, approachable feeling that Studio Ghibli captures so well. The Nunito font adds to that friendly, hand-drawn aesthetic.

Installation

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

Original theme by tweakcn.com

CSS Variables

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

:root {
  --background: oklch(0.91 0.05 82.69);
  --foreground: oklch(0.41 0.08 79.04);
  --card: oklch(0.92 0.04 83.86);
  --card-foreground: oklch(0.41 0.08 73.75);
  --popover: oklch(0.92 0.04 83.86);
  --popover-foreground: oklch(0.41 0.08 73.75);
  --primary: oklch(0.71 0.10 111.99);
  --primary-foreground: oklch(0.98 0.01 3.71);
  --secondary: oklch(0.88 0.05 83.41);
  --secondary-foreground: oklch(0.51 0.08 79.21);
  --muted: oklch(0.86 0.06 83.48);
  --muted-foreground: oklch(0.51 0.08 74.26);
  --accent: oklch(0.86 0.05 84.50);
  --accent-foreground: oklch(0.26 0.02 358.42);
  --destructive: oklch(0.63 0.24 29.21);
  --border: oklch(0.74 0.06 79.81);
  --input: oklch(0.74 0.06 79.81);
  --ring: oklch(0.51 0.08 74.26);
  --chart-1: oklch(0.66 0.19 41.68);
  --chart-2: oklch(0.70 0.12 183.20);
  --chart-3: oklch(0.48 0.08 211.46);
  --chart-4: oklch(0.84 0.17 85.07);
  --chart-5: oklch(0.74 0.17 60.21);
  --sidebar: oklch(0.87 0.06 83.96);
  --sidebar-foreground: oklch(0.41 0.08 79.04);
  --sidebar-primary: oklch(0.26 0.02 358.42);
  --sidebar-primary-foreground: oklch(0.98 0.01 3.71);
  --sidebar-accent: oklch(0.83 0.06 84.46);
  --sidebar-accent-foreground: oklch(0.26 0.02 358.42);
  --sidebar-border: oklch(0.91 0.00 0.43);
  --sidebar-ring: oklch(0.71 0.00 0.37);
  --destructive-foreground: oklch(1.0000 0 0);
  --font-sans: Nunito, sans-serif;
  --font-serif: PT Serif, serif;
  --font-mono: JetBrains Mono, monospace;
  --radius: 0.625rem;
  --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.20 0.01 48.35);
  --foreground: oklch(0.88 0.05 79.26);
  --card: oklch(0.25 0.01 56.14);
  --card-foreground: oklch(0.88 0.05 79.26);
  --popover: oklch(0.25 0.01 56.14);
  --popover-foreground: oklch(0.88 0.05 79.26);
  --primary: oklch(0.64 0.05 115.39);
  --primary-foreground: oklch(0.98 0.01 3.71);
  --secondary: oklch(0.33 0.02 60.70);
  --secondary-foreground: oklch(0.88 0.05 83.41);
  --muted: oklch(0.27 0.01 39.35);
  --muted-foreground: oklch(0.74 0.06 79.81);
  --accent: oklch(0.33 0.02 60.70);
  --accent-foreground: oklch(0.86 0.05 84.50);
  --destructive: oklch(0.63 0.24 29.21);
  --border: oklch(0.33 0.02 60.70);
  --input: oklch(0.33 0.02 60.70);
  --ring: oklch(0.64 0.05 115.39);
  --chart-1: oklch(0.66 0.19 41.68);
  --chart-2: oklch(0.70 0.12 183.20);
  --chart-3: oklch(0.48 0.08 211.46);
  --chart-4: oklch(0.84 0.17 85.07);
  --chart-5: oklch(0.74 0.17 60.21);
  --sidebar: oklch(0.23 0.01 56.09);
  --sidebar-foreground: oklch(0.88 0.05 79.26);
  --sidebar-primary: oklch(0.64 0.05 115.39);
  --sidebar-primary-foreground: oklch(0.98 0.01 3.71);
  --sidebar-accent: oklch(0.33 0.02 60.70);
  --sidebar-accent-foreground: oklch(0.86 0.05 84.50);
  --sidebar-border: oklch(0.33 0.02 60.70);
  --sidebar-ring: oklch(0.64 0.05 115.39);
  --destructive-foreground: oklch(1.0000 0 0);
  --font-sans: Nunito, sans-serif;
  --font-serif: PT Serif, serif;
  --font-mono: JetBrains Mono, monospace;
  --radius: 0.625rem;
  --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

Studio Ghibli films have this incredible ability to make digital spaces feel organic and alive. The secret is in their color theory—warm earth tones mixed with gentle greens that feel natural instead of artificial. This theme captures that same magic in web interfaces.

Most "nature" themes either go full forest green everywhere or use colors that look like they came from a lawn care website. This theme uses the actual color relationships from Ghibli films—warm yellows, soft greens, and earth tones that work together like they grew that way.

Dark mode shifts to deeper forest tones while keeping that organic warmth. It's like stepping into a cozy cabin at night—still connected to nature but comfortable and inviting. Most green themes fail completely in dark mode, but this one feels intentional.

What's actually in this theme

Dead simple setup—copy the CSS variables into your globals.css and you're done. The Nunito font gives you that friendly, approachable feel that works perfectly with the organic color palette.

The gentle green primary is perfect for CTAs that should feel welcoming rather than aggressive. The warm earth tones create a sense of comfort and trust. All contrast ratios pass WCAG AA standards so accessibility is covered.

The generous border radius gives everything that soft, organic feeling—no harsh edges here. Since it uses standard shadcn color tokens, your TypeScript autocomplete for bg-primary, text-foreground, etc. just works.

How to use this in projects

The gentle green should be your primary action color for things like "Join," "Learn More," or "Get Started"—anything that should feel welcoming rather than pushy. Think forest path, not traffic light.

The warm earth tones should dominate the interface, creating that cozy, natural feeling. This works especially well for educational apps, wellness platforms, creative portfolios, or any interface where you want users to feel relaxed and engaged.

In practice, embrace the organic aesthetic but keep it clean. This isn't rustic or outdated—it's modern nature-inspired design. The colors are sophisticated enough for professional use while maintaining that magical Ghibli warmth.

You might also like

FAQ