Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@ribbon-studios/react-utils

Package Overview
Dependencies
Maintainers
2
Versions
15
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@ribbon-studios/react-utils - npm Package Compare versions

Comparing version
4.1.1
to
4.2.0
+1
dist/hooks/__tests__/use-theme.spec.d.ts
export {};
export declare function createThemeHook<T extends string[]>(options: createThemeHook.Options<T>): {
(): readonly ["auto" | T[number], import('react').Dispatch<import('react').SetStateAction<"auto" | T[number]>>, T[number]];
$modes: readonly [...T, "auto"];
};
export declare namespace createThemeHook {
type Options<T extends string[]> = {
/**
* A list of the available themes.
*/
themes: T;
/**
* This theme will be used when light mode is detected.
*/
light: T[number];
/**
* This theme will be used when dark mode is detected.
*/
dark: T[number];
};
function getTheme<T extends string[]>(mode: T[number] | 'auto', options: Options<T>): T[number];
}
+1
-1
{
"name": "@ribbon-studios/react-utils",
"description": "Collection of react utilities curated by the Ribbon Studios Team~",
"version": "4.1.1",
"version": "4.2.0",
"type": "module",

@@ -6,0 +6,0 @@ "source": "src/*.ts",

@@ -21,2 +21,3 @@ [![NPM Version][npm-version-image]][npm-url]

- [`useSessionStorage`](#usesessionstorage)
- [`useTheme`](#usetheme)
- [React Router](#react-router)

@@ -88,2 +89,50 @@ - [`useLoaderData`](#useloaderdata)

### `createThemeHook`
Creates a hook that automatically updates the `data-theme` attribute on the body to the active theme.
```tsx
// use-theme.ts
import { createThemeHook } from '@ribbon-studios/react-utils';
export const useTheme = createThemeHook({
// Ensure you use `as const` or the types won't be correct!
themes: ['light', 'dark'] as const,
// This is the theme that will be used when light mode is preferred
light: 'light',
// This is the theme that will be used when dark mode is preferred
dark: 'dark',
});
type Modes = typeof useTheme.$modes;
// Navigation.tsx
const THEME_LABELS: Record<Modes, string> = {
auto: 'Auto',
light: 'Light',
dark: 'Dark',
};
const NEXT_THEME: Record<Modes, Modes> = {
auto: 'light',
light: 'dark',
dark: 'auto',
};
export function Navigation() {
const [mode, setMode] = useTheme();
const nextTheme = useCallback(() => {
setMode((mode) => NEXT_THEME[mode]);
}, [setMode]);
return (
<div>
<button onClick={nextTheme}>{THEME_LABELS[mode]}</button>
</div>
);
}
```
## React Router

@@ -90,0 +139,0 @@