i7a-themes
Version:
Universal theme provider for React apps (Next.js & Vite)
121 lines (90 loc) • 2.51 kB
Markdown
# i7a-themes
Lightweight and flexible theme management library for React projects. It allows you to easily switch between multiple themes (light, dark, or custom) and customize your UI experience.
## Features
- ✅ Support for multiple themes (`light`, `dark`, `system`, or custom`).
- ✅ Easy integration with React and Next.js projects.
- ✅ Automatic system theme detection (`prefers-color-scheme`).
- ✅ Persistent theme storage using `localStorage`.
- ✅ Fully typed with TypeScript.
## Installation
```bash
npm install i7a-themes
# or
yarn add i7a-themes
```
## Usage
### Setup Provider
Wrap your app with the `ThemeProvider`:
```tsx
import { ThemeProvider } from "i7a-themes";
import App from "./App";
export default function Root() {
return (
<ThemeProvider>
<App />
</ThemeProvider>
);
}
```
### CSS Custom Properties
i7a-themes supports using **CSS variables** for dynamic theming with Tailwind CSS or Vanilla CSS.
You can define variables for colors, fonts, or any other property and switch them depending on the theme.
#### Tailwind 4
```css
@import "tailwindcss";
:root {
--background: hsl(0, 0%, 100%);
--foreground: hsl(222, 47%, 11%);
}
.dark {
--background: hsl(225, 15%, 5%);
--foreground: #f8fafc;
}
/* Inline theme mapping for i7a-themes */
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
}
body {
@apply bg-background text-foreground;
}
```
#### Vanilla CSS
```css
:root {
--background: hsl(0, 0%, 100%);
--foreground: hsl(222, 47%, 11%);
}
.dark {
--background: hsl(225, 15%, 5%);
--foreground: #f8fafc;
}
body {
background-color: var(--background)
color: var(--foreground)
}
```
### Accessing the Theme
Use the `useTheme` hook to access or update the current theme:
```tsx
import { useTheme } from "i7a-themes";
export default function ThemeSwitcher() {
const { theme, resolvedTheme, setTheme, themes } = useTheme();
return (
<div>
<p>Current theme: {theme}</p>
<p>Resolved theme: {resolvedTheme}</p>
{themes.map((t) => (
<button key={t} onClick={() => setTheme(t)}>
{t}
</button>
))}
</div>
);
}
```
## Available Themes
- `light` – Light mode
- `dark` – Dark mode
- `system` – Matches the user's OS preference
- Custom themes – Extend the default theme list as needed