0.1.2 • Published 2 years ago

mantra-theme-switcher v0.1.2

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

React Theme Switcher

This is a simple theme switcher for React. It uses the Context API to provide a theme to the entire application.

Installation

npm install mantra-theme-switcher

Usage main.tsx

import React from 'react';
import ReactDOM from 'react-dom/client';
import { ThemeProvider } from 'mantra-theme-switcher';
import App from './App';

// ThemeContextSettings is optional
// These are the default settings
const ThemeContextSettings = {
  initialState: "light",
  matchDevicePreference: "initialy"
  savePreference: true,
}

ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
	<React.StrictMode>
		<ThemeContextProvider settings={ThemeContextSettings}>
				<App />
			</Provider>
	</React.StrictMode>
);

Usage SomeComponent.tsx

import React from 'react';
import { useTheme } from 'mantra-theme-switcher';

const SomeComponent = () => {
	const { theme, toggleTheme, isDark, isLight } = useTheme();

	return (
		<div>
			<h1>Current theme: {theme}</h1>
			<button onClick={() => toggleTheme('light')}>Set theme to light</button>
			<button onClick={() => toggleTheme('dark')}>Set theme to dark</button>
			{isDark ? <p>Help it's dark in here!</p> : <p>Actually it's light!</p>}
		</div>
	);
};

Usage in css

:root {
	--background: #fff;
	--text: #000;
}

html[data-theme='dark'] :root {
	--background: #000;
	--text: #fff;
}

Usage in Sass

$lightMode-background: #fff;
$darkMode-background: #000;

$lightMode-text: #000;
$darkMode-text: #fff;

@mixin dark {
	html[data-theme='dark'] & {
		@content;
	}
}
@mixin dark-hover {
	html[data-theme='dark'] &:hover {
		@content;
	}
}
@mixin dark-active {
	html[data-theme='dark'] &:active {
		@content;
	}
}

body {
	background: $lightMode-background;
	color: $lightMode-text;

	@include dark {
		background: $darkMode-background;
		color: $darkMode-text;
	}
}

.button {
	background: $lightMode-background;

	&:hover {
		background: lighten($lightMode-background, 10%);
	}

	@include dark {
		background: $darkMode-background;
	}

	@include dark-hover {
		background: lighten($darkMode-background, 10%);
	}
}

Settings

NameTypeDefaultDescription
initialState"light" "dark" "init""light"The initial theme to use. (Bypassed if there is a preference in localStorage or matchDevicePreference is activated)
matchDevicePreference"initialy" "always" "never""initialy"Match the device preference. ("initialy" = if the device theme switches during session, the theme won't be changed. "always" = the theme will change whenever the devices theme changes. "never" = the theme will never change with the device.)
savePreferencebooleantrueSave the preference in local storage.
0.1.2

2 years ago

0.1.1

2 years ago

0.1.0

2 years ago

0.0.3

2 years ago

0.0.2

2 years ago

0.0.1

2 years ago