@wrksz/themes
Drop-in replacement for next-themes. React 19 hydration fixed, full TypeScript types, zero dependencies.
Features
What you're getting.
React 19 ready
Fixes the inline script warning, Activity/cacheComponents stale theme, and the __name minification bug.
Drop-in replacement
Same API as next-themes. Change one import.
Hybrid storage
Use storage="hybrid" for cookie-first SSR correctness plus cross-tab sync via localStorage.
Nested providers
Independent theme instances per section. No shared state between them.
Full type safety
createThemes(...) infers your theme union once and types useTheme, useThemeValue, and setTheme everywhere.
Zero runtime deps
No runtime dependencies. A tiny inline script plus React hooks, nothing more.
Comparison
How it compares.
next-themes still has React 19 bugs open.
| Feature | next-themes | @wrksz/themes |
|---|---|---|
| React 19 script warning | Bug | Fixed (useServerInsertedHTML)Fixed |
| __name minification bug | Bug | FixedFixed |
| React 19 Activity / cacheComponents stale theme | Bug | Fixed (useSyncExternalStore)Fixed |
| Multiple classes per theme | Bug | Fixed (correct class removal)Fixed |
| Nested providers | No | per-instance storeYes |
| sessionStorage support | No | YesYes |
| cookie storage (zero-flash SSR) | No | storage="cookie"Yes |
| Disable storage | No | storage="none"Yes |
| meta theme-color support | No | themeColor propYes |
| Server-provided theme | No | initialTheme propYes |
| Always follow system preference | No | followSystem propYes |
| disableTransitionOnChange per property | No | CSS string + inline scriptYes |
| Read theme outside React | No | getTheme()Yes |
| Generic types | No | useTheme<AppTheme>()Yes |
| Zero runtime dependencies | YesYes | YesYes |
Roadmap
What's next.
Framework agnostic
Remix, Vite, SvelteKit, and other React-based frameworks.
More features
More storage adapters and finer-grained resolution options.
Open to contributions
Bug reports, feature requests, and PRs are welcome on GitHub.