Skip to content
Framework-agnostic theming

The theming runtime for modern applications.

Semantic tokens, theme families, SSR-safe hydration, smooth transitions, scoped themes, and adapters — a runtime designed to stay out of your way.

T
Theme Kit
theme-kit-default-light
theme-kit · system
Revenue
$48,240
▲ 12.4% this week
Users
12,842
▲ 8.1% this week
Activity--theme-color-*
primary
secondary
accent
muted
success
destructive
ring

Try a family — click to switch live

Five primitives, one system

Everything else in Theme Kit builds on these five ideas. They're orientation, not the whole story.

Why Theme Kit?

Most libraries stop at a dark-mode toggle. Theme Kit treats theming as a runtime — and that changes every part of the architecture.

Works everywhere

One runtime. Native integrations. Shared semantics. Pick your framework — the concepts stay the same, only the wiring changes.

Every integration shares the same core runtime and semantic contract. See the framework guides →

SSR integrations

The theme survives a hard reload. The server resolves it, a blocking script applies it before paint, and the runtime takes over after hydration — the same lifecycle on both frameworks because both share the core runtime.

Next.js
@theme-kit/next
Full App Router integration
SSR theme resolution
blocking bootstrap
zero-flash first paint
hydration
runtime synchronization
Next.js guide
Nuxt 3
@theme-kit/nuxt
Full Nuxt SSR integration
SSR theme resolution
blocking bootstrap
zero-flash first paint
hydration
runtime synchronization
Nuxt guide
One mental model
Next resolves from cookies, Nuxt from the module's SSR hook — the rendered result (themed <html>, inline CSS variables, blocking script) and the client takeover are identical. Learn how on the zero-flash page.

A runtime, not a toggle

Every feature below is real — implemented in @theme-kit/core and exposed natively by each framework adapter. Click through to see the actual API.

Bring your existing UI system

Theme Kit doesn't replace your component library. It gives your component library a theme runtime. Two adapter classes cover the ecosystem.

CSS-variable adapters
Theme tokens → CSS variables → existing library

The adapter writes the active theme's tokens as a live :root stylesheet. Your components keep consuming CSS variables — nothing re-renders when the theme changes.

Generated-theme adapters
Theme tokens → library theme object → provider

The adapter rebuilds the library's native theme object (MUI Theme, Chakra system, Ant Design config) whenever the runtime theme changes, then hands it to the library's own provider.

Ship every theme that ships with the library

Built-in preset families and brand palettes, all themeable with one click. Click a card to apply it to this entire site — live, no reload.

Not a random sidebar — a path

The docs are sequenced the way you actually learn: grasp the mental model, play with a live runtime, put it in your app, go deeper.

Start in three lines

Wrap your app, call a hook, ship. Theme Kit handles persistence, cookies, SSR hydration, and zero-flash bootstrapping for you — in any framework.

Full getting-started guide →
app/layout.tsx
tsx
import { ThemeProvider } from "@theme-kit/next";

export default function RootLayout({ children }) {
  return <ThemeProvider defaultTheme="light">{children}</ThemeProvider>
};
Theme Kit