diff --git a/src/Theme/Theme.stories.tsx b/src/Theme/Theme.stories.tsx index 6ccd7d7c..0726e0e8 100644 --- a/src/Theme/Theme.stories.tsx +++ b/src/Theme/Theme.stories.tsx @@ -2,9 +2,10 @@ import React from 'react' import { Story, Meta } from '@storybook/react' import Theme, { ThemeProps } from '.' -import Button from '../Button' +import ThemeItem from './ThemeItem' + import { DEFAULT_THEMES } from '../defaultThemes' -import { toTitleCase } from '../utils' +import { useTheme } from './useTheme' export default { title: 'Utils/Theme', @@ -12,23 +13,100 @@ export default { } as Meta export const Default: Story = (args) => { + const { theme, setTheme } = useTheme() + return ( -
- {DEFAULT_THEMES.map((theme) => ( - +

Current Theme: {theme}

+
+ {DEFAULT_THEMES.map((t, i) => ( + { + document + .getElementsByTagName('html')[0] + .setAttribute('data-theme', t) + window.localStorage.setItem('sb-react-daisyui-preview-theme', t) + setTheme(t) + }} + /> + ))} +
+
+ ) +} +Default.args = {} + +export const NestedThemes: Story = (args) => { + const { theme, setTheme } = useTheme() + + const renderNestedThemes = (themes: readonly string[]) => { + const nodes: React.ReactNode[] = [] + + for (let i = 0; i < themes.length; i += 2) { + nodes.push( + { + e.stopPropagation() + + document + .getElementsByTagName('html')[0] + .setAttribute('data-theme', themes[i]) + window.localStorage.setItem( + 'sb-react-daisyui-preview-theme', + themes[i] + ) + setTheme(themes[i]) + }} > -

{toTitleCase(theme)}

-
- - - - -
- - ))} + { + e.stopPropagation() + + document + .getElementsByTagName('html')[0] + .setAttribute('data-theme', themes[i + 1]) + window.localStorage.setItem( + 'sb-react-daisyui-preview-theme', + themes[i + 1] + ) + setTheme(themes[i + 1]) + }} + /> + + ) + } + + return
{nodes}
+ } + + return ( +
+

Current Theme: {theme}

+
+ {renderNestedThemes(DEFAULT_THEMES)} +
) } +NestedThemes.args = {} diff --git a/src/Theme/ThemeItem.tsx b/src/Theme/ThemeItem.tsx new file mode 100644 index 00000000..d2b387b5 --- /dev/null +++ b/src/Theme/ThemeItem.tsx @@ -0,0 +1,59 @@ +import React from 'react' +import clsx from 'clsx' +import { twMerge } from 'tailwind-merge' + +export type ThemeItemProps = React.HTMLAttributes & { + dataTheme: string + selected?: boolean +} + +const ThemeItem = ({ + selected, + children, + dataTheme, + className, + ...props +}: ThemeItemProps) => { + const classes = twMerge( + className, + 'border-base-content/20 hover:border-base-content/40 outline-base-content\ + overflow-hidden rounded-lg border outline-2 outline-offset-2', + clsx({ + outline: selected, + }) + ) + + return ( +
+
+
+
+
+
+
{dataTheme}
+
+
+
A
+
+ +
+
A
+
+ +
+
A
+
+ +
+
A
+
+
+ {children &&
{children}
} +
+
+
+
+ ) +} + +export default ThemeItem