---
title: "Themes"
type: guide
version: "2.2.1"
doc_version: "2.4.3"
status: stable
date: 2026-04-21
library: Frutjam
stack: tailwind_css
compatibility: universal
framework_agnostic: true
runtime_requirement: none
description: "Learn how Frutjam's theming works. Apply light, dark, or custom themes using CSS variables and a single data attribute with no JavaScript required."
url: https://frutjam.com/docs/themes
---

# Theming

Frutjam ships with a Berry theming system — a set of named themes built on OKLCH color values. Apply a theme to your entire app or nest themes inside specific sections using the `data-theme` attribute.

Snowberry

P

S

A

![SVG Image](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiB2aWV3Qm94PSIwIDAgMjQgMjQiIHN0cm9rZT0iY3VycmVudENvbG9yIiBmaWxsPSJub25lIiB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgcnk9IjIiIHg9IjgiIGhlaWdodD0iMTQiIHJ4PSIyIiB5PSI4IiB3aWR0aD0iMTQiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4=)

Darkberry

P

S

A

![SVG Image](data:image/svg+xml;base64,PHN2ZyBzdHJva2UtbGluZWNhcD0icm91bmQiIHdpZHRoPSIxNiIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgdmlld0JveD0iMCAwIDI0IDI0IiBzdHJva2U9ImN1cnJlbnRDb2xvciIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBzdHJva2Utd2lkdGg9IjIiIGhlaWdodD0iMTYiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9IjE0IiByeT0iMiIgaGVpZ2h0PSIxNCIgcng9IjIiIHg9IjgiIHk9IjgiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4=)

Blueberry

P

S

A

![SVG Image](data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjE2IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZT0iY3VycmVudENvbG9yIiB2aWV3Qm94PSIwIDAgMjQgMjQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeT0iOCIgeD0iOCIgcng9IjIiIGhlaWdodD0iMTQiIHdpZHRoPSIxNCIgcnk9IjIiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4=)

Strawberry

P

S

A

![SVG Image](data:image/svg+xml;base64,PHN2ZyBzdHJva2UtbGluZWNhcD0icm91bmQiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDI0IDI0IiBoZWlnaHQ9IjE2IiB3aWR0aD0iMTYiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2Utd2lkdGg9IjIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD0iOCIgcng9IjIiIHdpZHRoPSIxNCIgaGVpZ2h0PSIxNCIgeT0iOCIgcnk9IjIiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4=)

Grapeberry

P

S

A

![SVG Image](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBoZWlnaHQ9IjE2IiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZT0iY3VycmVudENvbG9yIiBmaWxsPSJub25lIiB2aWV3Qm94PSIwIDAgMjQgMjQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3QgeD0iOCIgcng9IjIiIGhlaWdodD0iMTQiIHdpZHRoPSIxNCIgeT0iOCIgcnk9IjIiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4=)

Peachberry

P

S

A

![SVG Image](data:image/svg+xml;base64,PHN2ZyBzdHJva2UtbGluZWpvaW49InJvdW5kIiB3aWR0aD0iMTYiIHN0cm9rZS13aWR0aD0iMiIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjE2IiB2aWV3Qm94PSIwIDAgMjQgMjQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgcnk9IjIiIGhlaWdodD0iMTQiIHk9IjgiIHJ4PSIyIiB4PSI4IiB3aWR0aD0iMTQiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNCAxNmMtMS4xIDAtMi0uOS0yLTJWNGMwLTEuMS45LTIgMi0yaDEwYzEuMSAwIDIgLjkgMiAyIiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz4=)

## Built-in Themes

Frutjam includes two built-in themes out of the box:

### Snowberry (Light)

The default light theme. Applied automatically when no `data-theme` is set.

```html
<html data-theme="snowberry">
  <!-- or use the alias -->
</html>

<html data-theme="light">
  <!-- same as snowberry -->
</html>
```


### Darkberry (Dark)

The built-in dark theme.

```html
<html data-theme="darkberry">
  <!-- or use the alias -->
</html>

<html data-theme="dark">
  <!-- same as darkberry -->
</html>
```


## Applying a Theme

Add `data-theme` to any HTML element. The theme cascades down to all children.

```html
<!-- Apply globally -->
<html data-theme="snowberry">
  <body>
    <!-- All components use snowberry theme -->
  </body>
</html>
```


## Nested Themes

Themes can be nested — a child element overrides the parent theme for its subtree.

```html
<html data-theme="snowberry">
  <section data-theme="darkberry">
    <!-- This section uses the dark theme -->
    <button class="btn btn-primary">Dark Button</button>
  </section>

  <!-- Back to light theme here -->
  <button class="btn btn-primary">Light Button</button>
</html>
```


## Dark Mode Variant

Use Tailwind's `dark:` prefix — it activates on both `data-theme="dark"` and `data-theme="darkberry"`.

```html
<p class="text-on-base dark:text-primary">
  Adapts to the active theme automatically.
</p>
```


## Custom Themes

Create your own theme by defining CSS variables inside a `[data-theme]` selector. See the [Configuration](/docs/configuration) page for the full variable reference.

```css
@layer theme {
  :is([data-theme="myberry"]) {
    --scheme-color: light;
    --border-radius: 0.5rem;
    --color-base: oklch(1 0 0);
    --color-primary: oklch(55% 0.22 142);
    --color-secondary: oklch(60% 0.18 280);
    --color-accent: oklch(70% 0.20 60);
  }
}
```

```html
<html data-theme="myberry">
  <!-- Your custom theme is active -->
</html>
```

