@poodle-kit/ui 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +148 -0
- package/dist/components/image-uploader/image-uploader.d.mts +4 -0
- package/dist/components/image-uploader/image-uploader.d.ts +4 -0
- package/dist/components/image-uploader/image-uploader.js +471 -0
- package/dist/components/image-uploader/image-uploader.js.map +1 -0
- package/dist/components/image-uploader/image-uploader.mjs +452 -0
- package/dist/components/image-uploader/image-uploader.mjs.map +1 -0
- package/dist/image-uploader-BFvQ4s0a.d.mts +100 -0
- package/dist/image-uploader-BFvQ4s0a.d.ts +100 -0
- package/dist/index.css +557 -49
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +84 -13
- package/dist/index.d.ts +84 -13
- package/dist/index.js +976 -33
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +975 -33
- package/dist/index.mjs.map +1 -1
- package/dist/lib/cn.d.mts +5 -0
- package/dist/lib/cn.d.ts +5 -0
- package/dist/lib/cn.js +35 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/cn.mjs +10 -0
- package/dist/lib/cn.mjs.map +1 -0
- package/dist/theme/index.d.mts +287 -0
- package/dist/theme/index.d.ts +287 -0
- package/dist/theme/index.js +386 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/index.mjs +355 -0
- package/dist/theme/index.mjs.map +1 -0
- package/dist/theme/theme.css +110 -0
- package/package.json +27 -9
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/theme/index.ts","../../src/theme/provider.tsx","../../src/theme/theme-to-css-vars.ts","../../src/theme/use-theme.ts","../../src/theme/types.ts","../../src/theme/defaults/default.ts"],"sourcesContent":["export { ThemeProvider } from './provider';\r\nexport { useTheme } from './use-theme';\r\nexport type {\r\n Theme,\r\n ThemeColors,\r\n ThemeConfig,\r\n ThemeProviderProps,\r\n ThemeProviderState,\r\n CustomThemeDefinition,\r\n} from './types';\r\nexport { defineTheme } from './types';\r\nexport {\r\n themeToCssVars,\r\n applyCssVars,\r\n removeCssVars,\r\n formatCssVars,\r\n generateThemeCss,\r\n} from './theme-to-css-vars';\r\nexport {\r\n defaultLightTheme,\r\n defaultDarkTheme,\r\n} from './defaults/default';\r\n","import React, {\r\n createContext,\r\n useEffect,\r\n useState,\r\n useMemo,\r\n} from 'react';\r\nimport type {\r\n Theme,\r\n ThemeProviderProps,\r\n ThemeProviderState,\r\n} from './types';\r\nimport { themeToCssVars, applyCssVars } from './theme-to-css-vars';\r\n\r\nexport const ThemeContext = createContext<\r\n ThemeProviderState | undefined\r\n>(undefined);\r\n\r\nexport function ThemeProvider({\r\n children,\r\n defaultTheme = 'system',\r\n storageKey = 'poodle-ui-theme',\r\n config,\r\n darkConfig,\r\n customThemes = {},\r\n enableColorSchemeSync = true,\r\n}: ThemeProviderProps) {\r\n const [theme, setTheme] = useState<Theme>(() => {\r\n if (typeof window === 'undefined') {\r\n return defaultTheme;\r\n }\r\n try {\r\n return (\r\n (localStorage.getItem(storageKey) as Theme) || defaultTheme\r\n );\r\n } catch {\r\n return defaultTheme;\r\n }\r\n });\r\n\r\n // Convert theme configs to CSS variables (memoized)\r\n const lightCssVars = useMemo(\r\n () => (config ? themeToCssVars(config) : null),\r\n [config],\r\n );\r\n\r\n const darkCssVars = useMemo(\r\n () => (darkConfig ? themeToCssVars(darkConfig) : null),\r\n [darkConfig],\r\n );\r\n\r\n useEffect(() => {\r\n const root = window.document.documentElement;\r\n\r\n root.classList.remove(\r\n 'light',\r\n 'dark',\r\n ...Object.keys(customThemes),\r\n );\r\n\r\n let actualTheme: string;\r\n\r\n if (theme === 'system') {\r\n actualTheme = window.matchMedia('(prefers-color-scheme: dark)')\r\n .matches\r\n ? 'dark'\r\n : 'light';\r\n } else {\r\n actualTheme = theme;\r\n }\r\n\r\n root.classList.add(actualTheme);\r\n\r\n if (enableColorSchemeSync) {\r\n const isDark =\r\n actualTheme === 'dark' || customThemes[actualTheme]?.dark;\r\n root.style.colorScheme = isDark ? 'dark' : 'light';\r\n }\r\n\r\n // Apply custom theme config (priority: config > customThemes)\r\n if (actualTheme === 'light' && lightCssVars) {\r\n applyCssVars(root, lightCssVars);\r\n } else if (actualTheme === 'dark' && darkCssVars) {\r\n applyCssVars(root, darkCssVars);\r\n } else if (customThemes[actualTheme]?.cssVars) {\r\n // Legacy support for customThemes\r\n Object.entries(customThemes[actualTheme].cssVars!).forEach(\r\n ([key, value]) => {\r\n root.style.setProperty(key, value);\r\n },\r\n );\r\n }\r\n }, [\r\n theme,\r\n lightCssVars,\r\n darkCssVars,\r\n customThemes,\r\n enableColorSchemeSync,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (theme !== 'system') return;\r\n\r\n const mediaQuery = window.matchMedia(\r\n '(prefers-color-scheme: dark)',\r\n );\r\n const handler = () => {\r\n setTheme('system');\r\n };\r\n\r\n mediaQuery.addEventListener('change', handler);\r\n return () => mediaQuery.removeEventListener('change', handler);\r\n }, [theme]);\r\n\r\n const handleSetTheme = (newTheme: Theme) => {\r\n try {\r\n localStorage.setItem(storageKey, newTheme);\r\n } catch {\r\n // localStorage not available\r\n }\r\n setTheme(newTheme);\r\n };\r\n\r\n const value: ThemeProviderState = {\r\n theme,\r\n setTheme: handleSetTheme,\r\n };\r\n\r\n return (\r\n <ThemeContext.Provider value={value}>\r\n {children}\r\n </ThemeContext.Provider>\r\n );\r\n}\r\n","import type { ThemeConfig } from './types';\r\n\r\n/**\r\n * Convert ThemeConfig to CSS variables object\r\n */\r\nexport function themeToCssVars(\r\n theme: ThemeConfig,\r\n): Record<string, string> {\r\n const cssVars: Record<string, string> = {};\r\n\r\n // Colors\r\n if (theme.colors) {\r\n Object.entries(theme.colors).forEach(([key, value]) => {\r\n if (typeof value === 'string') {\r\n cssVars[`--color-${key}`] = value;\r\n } else if (typeof value === 'object' && value !== null) {\r\n if ('DEFAULT' in value) {\r\n cssVars[`--color-${key}`] = value.DEFAULT;\r\n }\r\n if ('foreground' in value) {\r\n cssVars[`--color-${key}-foreground`] = value.foreground;\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Radius\r\n if (theme.radius) {\r\n Object.entries(theme.radius).forEach(([key, value]) => {\r\n cssVars[`--radius-${key}`] = value;\r\n });\r\n }\r\n\r\n // Font sizes\r\n if (theme.fontSize) {\r\n Object.entries(theme.fontSize).forEach(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n const [size, config] = value;\r\n cssVars[`--text-${key}`] = size;\r\n if (config.lineHeight) {\r\n cssVars[`--leading-${key}`] = config.lineHeight;\r\n }\r\n } else {\r\n cssVars[`--text-${key}`] = value;\r\n }\r\n });\r\n }\r\n\r\n // Font families\r\n if (theme.fontFamily) {\r\n Object.entries(theme.fontFamily).forEach(([key, value]) => {\r\n cssVars[`--font-${key}`] = value.join(', ');\r\n });\r\n }\r\n\r\n // Font weights\r\n if (theme.fontWeight) {\r\n Object.entries(theme.fontWeight).forEach(([key, value]) => {\r\n cssVars[`--font-weight-${key}`] = value;\r\n });\r\n }\r\n\r\n // Shadows\r\n if (theme.shadows) {\r\n Object.entries(theme.shadows).forEach(([key, value]) => {\r\n cssVars[`--shadow-${key}`] = value;\r\n });\r\n }\r\n\r\n // Z-index\r\n if (theme.zIndex) {\r\n Object.entries(theme.zIndex).forEach(([key, value]) => {\r\n cssVars[`--z-${key}`] = value.toString();\r\n });\r\n }\r\n\r\n // Animation\r\n if (theme.animation) {\r\n if (theme.animation.duration) {\r\n Object.entries(theme.animation.duration).forEach(\r\n ([key, value]) => {\r\n cssVars[`--duration-${key}`] = value;\r\n },\r\n );\r\n }\r\n if (theme.animation.ease) {\r\n Object.entries(theme.animation.ease).forEach(([key, value]) => {\r\n cssVars[`--ease-${key}`] = value;\r\n });\r\n }\r\n }\r\n\r\n // Spacing (Tailwind v4 compatible)\r\n if (theme.spacing) {\r\n Object.entries(theme.spacing).forEach(([key, value]) => {\r\n cssVars[`--spacing-${key}`] = value;\r\n });\r\n }\r\n\r\n return cssVars;\r\n}\r\n\r\n/**\r\n * Apply CSS variables to an element\r\n */\r\nexport function applyCssVars(\r\n element: HTMLElement,\r\n cssVars: Record<string, string>,\r\n): void {\r\n Object.entries(cssVars).forEach(([key, value]) => {\r\n element.style.setProperty(key, value);\r\n });\r\n}\r\n\r\n/**\r\n * Remove CSS variables from an element\r\n */\r\nexport function removeCssVars(\r\n element: HTMLElement,\r\n keys: string[],\r\n): void {\r\n keys.forEach((key) => {\r\n element.style.removeProperty(key);\r\n });\r\n}\r\n\r\n/**\r\n * Format CSS variables object to CSS string\r\n * Useful for build-time CSS generation\r\n *\r\n * @example\r\n * ```ts\r\n * const cssVars = themeToCssVars(myTheme);\r\n * const cssString = formatCssVars(cssVars);\r\n * console.log(cssString);\r\n * // Output:\r\n * // --color-primary: oklch(0.5 0.2 250);\r\n * // --color-primary-foreground: oklch(1 0 0);\r\n * ```\r\n */\r\nexport function formatCssVars(\r\n cssVars: Record<string, string>,\r\n): string {\r\n return Object.entries(cssVars)\r\n .map(([key, value]) => ` ${key}: ${value};`)\r\n .join('\\n');\r\n}\r\n\r\n/**\r\n * Generate CSS variables string from theme config\r\n * Combines themeToCssVars + formatCssVars for convenience\r\n *\r\n * @example\r\n * ```ts\r\n * import { defineTheme, generateThemeCss } from '@poodle-kit/ui/theme';\r\n *\r\n * const myTheme = defineTheme({ colors: { ... } });\r\n * const cssString = generateThemeCss(myTheme);\r\n * console.log(cssString);\r\n * // Output:\r\n * // --color-primary: oklch(0.5 0.2 250);\r\n * // --color-primary-foreground: oklch(1 0 0);\r\n * ```\r\n */\r\nexport function generateThemeCss(theme: ThemeConfig): string {\r\n const cssVars = themeToCssVars(theme);\r\n return formatCssVars(cssVars);\r\n}\r\n","import { useContext } from 'react';\r\nimport { ThemeContext } from './provider';\r\nimport type { ThemeProviderState } from './types';\r\n\r\nexport function useTheme(): ThemeProviderState {\r\n const context = useContext(ThemeContext);\r\n\r\n if (context === undefined) {\r\n throw new Error('useTheme must be used within a ThemeProvider');\r\n }\r\n\r\n return context;\r\n}\r\n","export type Theme = 'light' | 'dark' | 'system' | string;\r\n\r\nexport type ColorValue =\r\n | string\r\n | {\r\n DEFAULT: string;\r\n foreground: string;\r\n };\r\n\r\nexport interface ThemeColors {\r\n // Page & Container colors\r\n background?: ColorValue;\r\n foreground?: ColorValue;\r\n muted?: ColorValue;\r\n accent?: ColorValue;\r\n card?: ColorValue;\r\n popover?: ColorValue;\r\n\r\n // Brand & Action colors\r\n primary?: ColorValue;\r\n secondary?: ColorValue;\r\n\r\n // Semantic colors\r\n info?: ColorValue;\r\n danger?: ColorValue;\r\n warning?: ColorValue;\r\n success?: ColorValue;\r\n destructive?: ColorValue;\r\n\r\n // Border & Input colors\r\n border?: ColorValue;\r\n input?: ColorValue;\r\n ring?: ColorValue;\r\n\r\n // Custom colors\r\n [key: string]: ColorValue | undefined;\r\n}\r\n\r\nexport interface ThemeConfig {\r\n colors: ThemeColors;\r\n spacing?: Record<string, string>;\r\n radius?: Record<string, string>;\r\n fontSize?: Record<\r\n string,\r\n string | [string, { lineHeight: string; letterSpacing?: string }]\r\n >;\r\n fontFamily?: Record<string, string[]>;\r\n fontWeight?: Record<string, string>;\r\n shadows?: Record<string, string>;\r\n zIndex?: Record<string, string>;\r\n animation?: {\r\n duration?: Record<string, string>;\r\n ease?: Record<string, string>;\r\n };\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface CustomThemeDefinition {\r\n dark?: boolean;\r\n cssVars?: Record<string, string>;\r\n}\r\n\r\nexport interface ThemeProviderProps {\r\n children: React.ReactNode;\r\n defaultTheme?: Theme;\r\n storageKey?: string;\r\n /** Custom theme configuration for light mode */\r\n config?: ThemeConfig;\r\n /** Custom theme configuration for dark mode */\r\n darkConfig?: ThemeConfig;\r\n /** Legacy: Custom theme definitions (deprecated, use config instead) */\r\n customThemes?: Record<string, CustomThemeDefinition>;\r\n enableColorSchemeSync?: boolean;\r\n}\r\n\r\nexport interface ThemeProviderState {\r\n theme: Theme;\r\n setTheme: (theme: Theme) => void;\r\n}\r\n\r\nexport function defineTheme<T extends ThemeConfig>(config: T): T {\r\n return config;\r\n}\r\n","/**\r\n * Default Theme Tokens\r\n *\r\n * This is a reference implementation showing how to define themes.\r\n * Copy this pattern to your project and customize the values.\r\n *\r\n * @example\r\n * ```tsx\r\n * // your-app/src/theme/my-theme.ts\r\n * import { defineTheme } from '@poodle-kit/ui/theme';\r\n *\r\n * export const myLightTheme = defineTheme({\r\n * colors: {\r\n * primary: { DEFAULT: 'oklch(0.5 0.2 250)', foreground: 'oklch(1 0 0)' },\r\n * // ... your custom colors\r\n * },\r\n * radius: { md: '0.5rem' },\r\n * });\r\n *\r\n * export const myDarkTheme = defineTheme({\r\n * colors: {\r\n * primary: { DEFAULT: 'oklch(0.7 0.2 250)', foreground: 'oklch(0.09 0 0)' },\r\n * // ... your custom colors\r\n * },\r\n * radius: { md: '0.5rem' },\r\n * });\r\n * ```\r\n *\r\n * Then use in your app:\r\n * ```tsx\r\n * import { ThemeProvider } from '@poodle-kit/ui';\r\n * import { myLightTheme, myDarkTheme } from './theme/my-theme';\r\n *\r\n * <ThemeProvider config={myLightTheme} darkConfig={myDarkTheme}>\r\n * <App />\r\n * </ThemeProvider>\r\n * ```\r\n */\r\n\r\nimport { defineTheme } from '../types';\r\n\r\n/**\r\n * Default Light Theme\r\n * Clean neutral design with semantic color tokens\r\n */\r\nexport const defaultLightTheme = defineTheme({\r\n colors: {\r\n // Page & Container colors\r\n background: {\r\n DEFAULT: 'oklch(1 0 0)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n muted: {\r\n DEFAULT: 'oklch(0.96 0 0)',\r\n foreground: 'oklch(0.45 0 0)',\r\n },\r\n\r\n accent: {\r\n DEFAULT: 'oklch(0.96 0 0)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n card: {\r\n DEFAULT: 'oklch(1 0 0)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n popover: {\r\n DEFAULT: 'oklch(1 0 0)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n // Brand & Action colors\r\n primary: {\r\n DEFAULT: 'oklch(0.09 0 0)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n secondary: {\r\n DEFAULT: 'oklch(0.45 0 0)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n // Semantic colors\r\n info: {\r\n DEFAULT: 'oklch(0.55 0.15 250)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n danger: {\r\n DEFAULT: 'oklch(0.576 0.204 27.325)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n warning: {\r\n DEFAULT: 'oklch(0.75 0.15 75)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n success: {\r\n DEFAULT: 'oklch(0.60 0.15 145)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n // Border & Input colors\r\n border: 'oklch(0.90 0 0)',\r\n input: 'oklch(0.90 0 0)',\r\n ring: 'oklch(0.09 0 0)',\r\n },\r\n\r\n radius: {\r\n none: '0',\r\n sm: '0.125rem',\r\n base: '0.25rem',\r\n md: '0.375rem',\r\n lg: '0.5rem',\r\n xl: '0.75rem',\r\n '2xl': '1rem',\r\n '3xl': '1.5rem',\r\n full: '9999px',\r\n },\r\n});\r\n\r\n/**\r\n * Default Dark Theme\r\n * Clean neutral design with semantic color tokens\r\n */\r\nexport const defaultDarkTheme = defineTheme({\r\n colors: {\r\n // Page & Container colors\r\n background: {\r\n DEFAULT: 'oklch(0.09 0 0)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n muted: {\r\n DEFAULT: 'oklch(0.17 0 0)',\r\n foreground: 'oklch(0.65 0 0)',\r\n },\r\n\r\n accent: {\r\n DEFAULT: 'oklch(0.17 0 0)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n card: {\r\n DEFAULT: 'oklch(0.09 0 0)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n popover: {\r\n DEFAULT: 'oklch(0.09 0 0)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n // Brand & Action colors\r\n primary: {\r\n DEFAULT: 'oklch(0.98 0 0)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n secondary: {\r\n DEFAULT: 'oklch(0.65 0 0)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n // Semantic colors\r\n info: {\r\n DEFAULT: 'oklch(0.65 0.15 250)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n danger: {\r\n DEFAULT: 'oklch(0.701 0.191 29.234)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n warning: {\r\n DEFAULT: 'oklch(0.80 0.15 75)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n success: {\r\n DEFAULT: 'oklch(0.70 0.15 145)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n // Border & Input colors\r\n border: 'oklch(0.27 0 0)',\r\n input: 'oklch(0.27 0 0)',\r\n ring: 'oklch(0.98 0 0)',\r\n },\r\n\r\n radius: {\r\n none: '0',\r\n sm: '0.125rem',\r\n base: '0.25rem',\r\n md: '0.375rem',\r\n lg: '0.5rem',\r\n xl: '0.75rem',\r\n '2xl': '1rem',\r\n '3xl': '1.5rem',\r\n full: '9999px',\r\n },\r\n});\r\n"],"mappings":"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","names":["value","import_react"]}
|
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
// src/theme/provider.tsx
|
|
2
|
+
import {
|
|
3
|
+
createContext,
|
|
4
|
+
useEffect,
|
|
5
|
+
useState,
|
|
6
|
+
useMemo
|
|
7
|
+
} from "react";
|
|
8
|
+
|
|
9
|
+
// src/theme/theme-to-css-vars.ts
|
|
10
|
+
function themeToCssVars(theme) {
|
|
11
|
+
const cssVars = {};
|
|
12
|
+
if (theme.colors) {
|
|
13
|
+
Object.entries(theme.colors).forEach(([key, value]) => {
|
|
14
|
+
if (typeof value === "string") {
|
|
15
|
+
cssVars[`--color-${key}`] = value;
|
|
16
|
+
} else if (typeof value === "object" && value !== null) {
|
|
17
|
+
if ("DEFAULT" in value) {
|
|
18
|
+
cssVars[`--color-${key}`] = value.DEFAULT;
|
|
19
|
+
}
|
|
20
|
+
if ("foreground" in value) {
|
|
21
|
+
cssVars[`--color-${key}-foreground`] = value.foreground;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
if (theme.radius) {
|
|
27
|
+
Object.entries(theme.radius).forEach(([key, value]) => {
|
|
28
|
+
cssVars[`--radius-${key}`] = value;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
if (theme.fontSize) {
|
|
32
|
+
Object.entries(theme.fontSize).forEach(([key, value]) => {
|
|
33
|
+
if (Array.isArray(value)) {
|
|
34
|
+
const [size, config] = value;
|
|
35
|
+
cssVars[`--text-${key}`] = size;
|
|
36
|
+
if (config.lineHeight) {
|
|
37
|
+
cssVars[`--leading-${key}`] = config.lineHeight;
|
|
38
|
+
}
|
|
39
|
+
} else {
|
|
40
|
+
cssVars[`--text-${key}`] = value;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
if (theme.fontFamily) {
|
|
45
|
+
Object.entries(theme.fontFamily).forEach(([key, value]) => {
|
|
46
|
+
cssVars[`--font-${key}`] = value.join(", ");
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (theme.fontWeight) {
|
|
50
|
+
Object.entries(theme.fontWeight).forEach(([key, value]) => {
|
|
51
|
+
cssVars[`--font-weight-${key}`] = value;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
if (theme.shadows) {
|
|
55
|
+
Object.entries(theme.shadows).forEach(([key, value]) => {
|
|
56
|
+
cssVars[`--shadow-${key}`] = value;
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (theme.zIndex) {
|
|
60
|
+
Object.entries(theme.zIndex).forEach(([key, value]) => {
|
|
61
|
+
cssVars[`--z-${key}`] = value.toString();
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (theme.animation) {
|
|
65
|
+
if (theme.animation.duration) {
|
|
66
|
+
Object.entries(theme.animation.duration).forEach(
|
|
67
|
+
([key, value]) => {
|
|
68
|
+
cssVars[`--duration-${key}`] = value;
|
|
69
|
+
}
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
if (theme.animation.ease) {
|
|
73
|
+
Object.entries(theme.animation.ease).forEach(([key, value]) => {
|
|
74
|
+
cssVars[`--ease-${key}`] = value;
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (theme.spacing) {
|
|
79
|
+
Object.entries(theme.spacing).forEach(([key, value]) => {
|
|
80
|
+
cssVars[`--spacing-${key}`] = value;
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return cssVars;
|
|
84
|
+
}
|
|
85
|
+
function applyCssVars(element, cssVars) {
|
|
86
|
+
Object.entries(cssVars).forEach(([key, value]) => {
|
|
87
|
+
element.style.setProperty(key, value);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
function removeCssVars(element, keys) {
|
|
91
|
+
keys.forEach((key) => {
|
|
92
|
+
element.style.removeProperty(key);
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
function formatCssVars(cssVars) {
|
|
96
|
+
return Object.entries(cssVars).map(([key, value]) => ` ${key}: ${value};`).join("\n");
|
|
97
|
+
}
|
|
98
|
+
function generateThemeCss(theme) {
|
|
99
|
+
const cssVars = themeToCssVars(theme);
|
|
100
|
+
return formatCssVars(cssVars);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// src/theme/provider.tsx
|
|
104
|
+
import { jsx } from "react/jsx-runtime";
|
|
105
|
+
var ThemeContext = createContext(void 0);
|
|
106
|
+
function ThemeProvider({
|
|
107
|
+
children,
|
|
108
|
+
defaultTheme = "system",
|
|
109
|
+
storageKey = "poodle-ui-theme",
|
|
110
|
+
config,
|
|
111
|
+
darkConfig,
|
|
112
|
+
customThemes = {},
|
|
113
|
+
enableColorSchemeSync = true
|
|
114
|
+
}) {
|
|
115
|
+
const [theme, setTheme] = useState(() => {
|
|
116
|
+
if (typeof window === "undefined") {
|
|
117
|
+
return defaultTheme;
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
return localStorage.getItem(storageKey) || defaultTheme;
|
|
121
|
+
} catch {
|
|
122
|
+
return defaultTheme;
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
const lightCssVars = useMemo(
|
|
126
|
+
() => config ? themeToCssVars(config) : null,
|
|
127
|
+
[config]
|
|
128
|
+
);
|
|
129
|
+
const darkCssVars = useMemo(
|
|
130
|
+
() => darkConfig ? themeToCssVars(darkConfig) : null,
|
|
131
|
+
[darkConfig]
|
|
132
|
+
);
|
|
133
|
+
useEffect(() => {
|
|
134
|
+
var _a, _b;
|
|
135
|
+
const root = window.document.documentElement;
|
|
136
|
+
root.classList.remove(
|
|
137
|
+
"light",
|
|
138
|
+
"dark",
|
|
139
|
+
...Object.keys(customThemes)
|
|
140
|
+
);
|
|
141
|
+
let actualTheme;
|
|
142
|
+
if (theme === "system") {
|
|
143
|
+
actualTheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
144
|
+
} else {
|
|
145
|
+
actualTheme = theme;
|
|
146
|
+
}
|
|
147
|
+
root.classList.add(actualTheme);
|
|
148
|
+
if (enableColorSchemeSync) {
|
|
149
|
+
const isDark = actualTheme === "dark" || ((_a = customThemes[actualTheme]) == null ? void 0 : _a.dark);
|
|
150
|
+
root.style.colorScheme = isDark ? "dark" : "light";
|
|
151
|
+
}
|
|
152
|
+
if (actualTheme === "light" && lightCssVars) {
|
|
153
|
+
applyCssVars(root, lightCssVars);
|
|
154
|
+
} else if (actualTheme === "dark" && darkCssVars) {
|
|
155
|
+
applyCssVars(root, darkCssVars);
|
|
156
|
+
} else if ((_b = customThemes[actualTheme]) == null ? void 0 : _b.cssVars) {
|
|
157
|
+
Object.entries(customThemes[actualTheme].cssVars).forEach(
|
|
158
|
+
([key, value2]) => {
|
|
159
|
+
root.style.setProperty(key, value2);
|
|
160
|
+
}
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
}, [
|
|
164
|
+
theme,
|
|
165
|
+
lightCssVars,
|
|
166
|
+
darkCssVars,
|
|
167
|
+
customThemes,
|
|
168
|
+
enableColorSchemeSync
|
|
169
|
+
]);
|
|
170
|
+
useEffect(() => {
|
|
171
|
+
if (theme !== "system") return;
|
|
172
|
+
const mediaQuery = window.matchMedia(
|
|
173
|
+
"(prefers-color-scheme: dark)"
|
|
174
|
+
);
|
|
175
|
+
const handler = () => {
|
|
176
|
+
setTheme("system");
|
|
177
|
+
};
|
|
178
|
+
mediaQuery.addEventListener("change", handler);
|
|
179
|
+
return () => mediaQuery.removeEventListener("change", handler);
|
|
180
|
+
}, [theme]);
|
|
181
|
+
const handleSetTheme = (newTheme) => {
|
|
182
|
+
try {
|
|
183
|
+
localStorage.setItem(storageKey, newTheme);
|
|
184
|
+
} catch {
|
|
185
|
+
}
|
|
186
|
+
setTheme(newTheme);
|
|
187
|
+
};
|
|
188
|
+
const value = {
|
|
189
|
+
theme,
|
|
190
|
+
setTheme: handleSetTheme
|
|
191
|
+
};
|
|
192
|
+
return /* @__PURE__ */ jsx(ThemeContext.Provider, { value, children });
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// src/theme/use-theme.ts
|
|
196
|
+
import { useContext } from "react";
|
|
197
|
+
function useTheme() {
|
|
198
|
+
const context = useContext(ThemeContext);
|
|
199
|
+
if (context === void 0) {
|
|
200
|
+
throw new Error("useTheme must be used within a ThemeProvider");
|
|
201
|
+
}
|
|
202
|
+
return context;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// src/theme/types.ts
|
|
206
|
+
function defineTheme(config) {
|
|
207
|
+
return config;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// src/theme/defaults/default.ts
|
|
211
|
+
var defaultLightTheme = defineTheme({
|
|
212
|
+
colors: {
|
|
213
|
+
// Page & Container colors
|
|
214
|
+
background: {
|
|
215
|
+
DEFAULT: "oklch(1 0 0)",
|
|
216
|
+
foreground: "oklch(0.09 0 0)"
|
|
217
|
+
},
|
|
218
|
+
muted: {
|
|
219
|
+
DEFAULT: "oklch(0.96 0 0)",
|
|
220
|
+
foreground: "oklch(0.45 0 0)"
|
|
221
|
+
},
|
|
222
|
+
accent: {
|
|
223
|
+
DEFAULT: "oklch(0.96 0 0)",
|
|
224
|
+
foreground: "oklch(0.09 0 0)"
|
|
225
|
+
},
|
|
226
|
+
card: {
|
|
227
|
+
DEFAULT: "oklch(1 0 0)",
|
|
228
|
+
foreground: "oklch(0.09 0 0)"
|
|
229
|
+
},
|
|
230
|
+
popover: {
|
|
231
|
+
DEFAULT: "oklch(1 0 0)",
|
|
232
|
+
foreground: "oklch(0.09 0 0)"
|
|
233
|
+
},
|
|
234
|
+
// Brand & Action colors
|
|
235
|
+
primary: {
|
|
236
|
+
DEFAULT: "oklch(0.09 0 0)",
|
|
237
|
+
foreground: "oklch(0.98 0 0)"
|
|
238
|
+
},
|
|
239
|
+
secondary: {
|
|
240
|
+
DEFAULT: "oklch(0.45 0 0)",
|
|
241
|
+
foreground: "oklch(0.98 0 0)"
|
|
242
|
+
},
|
|
243
|
+
// Semantic colors
|
|
244
|
+
info: {
|
|
245
|
+
DEFAULT: "oklch(0.55 0.15 250)",
|
|
246
|
+
foreground: "oklch(0.98 0 0)"
|
|
247
|
+
},
|
|
248
|
+
danger: {
|
|
249
|
+
DEFAULT: "oklch(0.576 0.204 27.325)",
|
|
250
|
+
foreground: "oklch(0.98 0 0)"
|
|
251
|
+
},
|
|
252
|
+
warning: {
|
|
253
|
+
DEFAULT: "oklch(0.75 0.15 75)",
|
|
254
|
+
foreground: "oklch(0.09 0 0)"
|
|
255
|
+
},
|
|
256
|
+
success: {
|
|
257
|
+
DEFAULT: "oklch(0.60 0.15 145)",
|
|
258
|
+
foreground: "oklch(0.98 0 0)"
|
|
259
|
+
},
|
|
260
|
+
// Border & Input colors
|
|
261
|
+
border: "oklch(0.90 0 0)",
|
|
262
|
+
input: "oklch(0.90 0 0)",
|
|
263
|
+
ring: "oklch(0.09 0 0)"
|
|
264
|
+
},
|
|
265
|
+
radius: {
|
|
266
|
+
none: "0",
|
|
267
|
+
sm: "0.125rem",
|
|
268
|
+
base: "0.25rem",
|
|
269
|
+
md: "0.375rem",
|
|
270
|
+
lg: "0.5rem",
|
|
271
|
+
xl: "0.75rem",
|
|
272
|
+
"2xl": "1rem",
|
|
273
|
+
"3xl": "1.5rem",
|
|
274
|
+
full: "9999px"
|
|
275
|
+
}
|
|
276
|
+
});
|
|
277
|
+
var defaultDarkTheme = defineTheme({
|
|
278
|
+
colors: {
|
|
279
|
+
// Page & Container colors
|
|
280
|
+
background: {
|
|
281
|
+
DEFAULT: "oklch(0.09 0 0)",
|
|
282
|
+
foreground: "oklch(0.98 0 0)"
|
|
283
|
+
},
|
|
284
|
+
muted: {
|
|
285
|
+
DEFAULT: "oklch(0.17 0 0)",
|
|
286
|
+
foreground: "oklch(0.65 0 0)"
|
|
287
|
+
},
|
|
288
|
+
accent: {
|
|
289
|
+
DEFAULT: "oklch(0.17 0 0)",
|
|
290
|
+
foreground: "oklch(0.98 0 0)"
|
|
291
|
+
},
|
|
292
|
+
card: {
|
|
293
|
+
DEFAULT: "oklch(0.09 0 0)",
|
|
294
|
+
foreground: "oklch(0.98 0 0)"
|
|
295
|
+
},
|
|
296
|
+
popover: {
|
|
297
|
+
DEFAULT: "oklch(0.09 0 0)",
|
|
298
|
+
foreground: "oklch(0.98 0 0)"
|
|
299
|
+
},
|
|
300
|
+
// Brand & Action colors
|
|
301
|
+
primary: {
|
|
302
|
+
DEFAULT: "oklch(0.98 0 0)",
|
|
303
|
+
foreground: "oklch(0.09 0 0)"
|
|
304
|
+
},
|
|
305
|
+
secondary: {
|
|
306
|
+
DEFAULT: "oklch(0.65 0 0)",
|
|
307
|
+
foreground: "oklch(0.09 0 0)"
|
|
308
|
+
},
|
|
309
|
+
// Semantic colors
|
|
310
|
+
info: {
|
|
311
|
+
DEFAULT: "oklch(0.65 0.15 250)",
|
|
312
|
+
foreground: "oklch(0.09 0 0)"
|
|
313
|
+
},
|
|
314
|
+
danger: {
|
|
315
|
+
DEFAULT: "oklch(0.701 0.191 29.234)",
|
|
316
|
+
foreground: "oklch(0.09 0 0)"
|
|
317
|
+
},
|
|
318
|
+
warning: {
|
|
319
|
+
DEFAULT: "oklch(0.80 0.15 75)",
|
|
320
|
+
foreground: "oklch(0.09 0 0)"
|
|
321
|
+
},
|
|
322
|
+
success: {
|
|
323
|
+
DEFAULT: "oklch(0.70 0.15 145)",
|
|
324
|
+
foreground: "oklch(0.09 0 0)"
|
|
325
|
+
},
|
|
326
|
+
// Border & Input colors
|
|
327
|
+
border: "oklch(0.27 0 0)",
|
|
328
|
+
input: "oklch(0.27 0 0)",
|
|
329
|
+
ring: "oklch(0.98 0 0)"
|
|
330
|
+
},
|
|
331
|
+
radius: {
|
|
332
|
+
none: "0",
|
|
333
|
+
sm: "0.125rem",
|
|
334
|
+
base: "0.25rem",
|
|
335
|
+
md: "0.375rem",
|
|
336
|
+
lg: "0.5rem",
|
|
337
|
+
xl: "0.75rem",
|
|
338
|
+
"2xl": "1rem",
|
|
339
|
+
"3xl": "1.5rem",
|
|
340
|
+
full: "9999px"
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
export {
|
|
344
|
+
ThemeProvider,
|
|
345
|
+
applyCssVars,
|
|
346
|
+
defaultDarkTheme,
|
|
347
|
+
defaultLightTheme,
|
|
348
|
+
defineTheme,
|
|
349
|
+
formatCssVars,
|
|
350
|
+
generateThemeCss,
|
|
351
|
+
removeCssVars,
|
|
352
|
+
themeToCssVars,
|
|
353
|
+
useTheme
|
|
354
|
+
};
|
|
355
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/theme/provider.tsx","../../src/theme/theme-to-css-vars.ts","../../src/theme/use-theme.ts","../../src/theme/types.ts","../../src/theme/defaults/default.ts"],"sourcesContent":["import React, {\r\n createContext,\r\n useEffect,\r\n useState,\r\n useMemo,\r\n} from 'react';\r\nimport type {\r\n Theme,\r\n ThemeProviderProps,\r\n ThemeProviderState,\r\n} from './types';\r\nimport { themeToCssVars, applyCssVars } from './theme-to-css-vars';\r\n\r\nexport const ThemeContext = createContext<\r\n ThemeProviderState | undefined\r\n>(undefined);\r\n\r\nexport function ThemeProvider({\r\n children,\r\n defaultTheme = 'system',\r\n storageKey = 'poodle-ui-theme',\r\n config,\r\n darkConfig,\r\n customThemes = {},\r\n enableColorSchemeSync = true,\r\n}: ThemeProviderProps) {\r\n const [theme, setTheme] = useState<Theme>(() => {\r\n if (typeof window === 'undefined') {\r\n return defaultTheme;\r\n }\r\n try {\r\n return (\r\n (localStorage.getItem(storageKey) as Theme) || defaultTheme\r\n );\r\n } catch {\r\n return defaultTheme;\r\n }\r\n });\r\n\r\n // Convert theme configs to CSS variables (memoized)\r\n const lightCssVars = useMemo(\r\n () => (config ? themeToCssVars(config) : null),\r\n [config],\r\n );\r\n\r\n const darkCssVars = useMemo(\r\n () => (darkConfig ? themeToCssVars(darkConfig) : null),\r\n [darkConfig],\r\n );\r\n\r\n useEffect(() => {\r\n const root = window.document.documentElement;\r\n\r\n root.classList.remove(\r\n 'light',\r\n 'dark',\r\n ...Object.keys(customThemes),\r\n );\r\n\r\n let actualTheme: string;\r\n\r\n if (theme === 'system') {\r\n actualTheme = window.matchMedia('(prefers-color-scheme: dark)')\r\n .matches\r\n ? 'dark'\r\n : 'light';\r\n } else {\r\n actualTheme = theme;\r\n }\r\n\r\n root.classList.add(actualTheme);\r\n\r\n if (enableColorSchemeSync) {\r\n const isDark =\r\n actualTheme === 'dark' || customThemes[actualTheme]?.dark;\r\n root.style.colorScheme = isDark ? 'dark' : 'light';\r\n }\r\n\r\n // Apply custom theme config (priority: config > customThemes)\r\n if (actualTheme === 'light' && lightCssVars) {\r\n applyCssVars(root, lightCssVars);\r\n } else if (actualTheme === 'dark' && darkCssVars) {\r\n applyCssVars(root, darkCssVars);\r\n } else if (customThemes[actualTheme]?.cssVars) {\r\n // Legacy support for customThemes\r\n Object.entries(customThemes[actualTheme].cssVars!).forEach(\r\n ([key, value]) => {\r\n root.style.setProperty(key, value);\r\n },\r\n );\r\n }\r\n }, [\r\n theme,\r\n lightCssVars,\r\n darkCssVars,\r\n customThemes,\r\n enableColorSchemeSync,\r\n ]);\r\n\r\n useEffect(() => {\r\n if (theme !== 'system') return;\r\n\r\n const mediaQuery = window.matchMedia(\r\n '(prefers-color-scheme: dark)',\r\n );\r\n const handler = () => {\r\n setTheme('system');\r\n };\r\n\r\n mediaQuery.addEventListener('change', handler);\r\n return () => mediaQuery.removeEventListener('change', handler);\r\n }, [theme]);\r\n\r\n const handleSetTheme = (newTheme: Theme) => {\r\n try {\r\n localStorage.setItem(storageKey, newTheme);\r\n } catch {\r\n // localStorage not available\r\n }\r\n setTheme(newTheme);\r\n };\r\n\r\n const value: ThemeProviderState = {\r\n theme,\r\n setTheme: handleSetTheme,\r\n };\r\n\r\n return (\r\n <ThemeContext.Provider value={value}>\r\n {children}\r\n </ThemeContext.Provider>\r\n );\r\n}\r\n","import type { ThemeConfig } from './types';\r\n\r\n/**\r\n * Convert ThemeConfig to CSS variables object\r\n */\r\nexport function themeToCssVars(\r\n theme: ThemeConfig,\r\n): Record<string, string> {\r\n const cssVars: Record<string, string> = {};\r\n\r\n // Colors\r\n if (theme.colors) {\r\n Object.entries(theme.colors).forEach(([key, value]) => {\r\n if (typeof value === 'string') {\r\n cssVars[`--color-${key}`] = value;\r\n } else if (typeof value === 'object' && value !== null) {\r\n if ('DEFAULT' in value) {\r\n cssVars[`--color-${key}`] = value.DEFAULT;\r\n }\r\n if ('foreground' in value) {\r\n cssVars[`--color-${key}-foreground`] = value.foreground;\r\n }\r\n }\r\n });\r\n }\r\n\r\n // Radius\r\n if (theme.radius) {\r\n Object.entries(theme.radius).forEach(([key, value]) => {\r\n cssVars[`--radius-${key}`] = value;\r\n });\r\n }\r\n\r\n // Font sizes\r\n if (theme.fontSize) {\r\n Object.entries(theme.fontSize).forEach(([key, value]) => {\r\n if (Array.isArray(value)) {\r\n const [size, config] = value;\r\n cssVars[`--text-${key}`] = size;\r\n if (config.lineHeight) {\r\n cssVars[`--leading-${key}`] = config.lineHeight;\r\n }\r\n } else {\r\n cssVars[`--text-${key}`] = value;\r\n }\r\n });\r\n }\r\n\r\n // Font families\r\n if (theme.fontFamily) {\r\n Object.entries(theme.fontFamily).forEach(([key, value]) => {\r\n cssVars[`--font-${key}`] = value.join(', ');\r\n });\r\n }\r\n\r\n // Font weights\r\n if (theme.fontWeight) {\r\n Object.entries(theme.fontWeight).forEach(([key, value]) => {\r\n cssVars[`--font-weight-${key}`] = value;\r\n });\r\n }\r\n\r\n // Shadows\r\n if (theme.shadows) {\r\n Object.entries(theme.shadows).forEach(([key, value]) => {\r\n cssVars[`--shadow-${key}`] = value;\r\n });\r\n }\r\n\r\n // Z-index\r\n if (theme.zIndex) {\r\n Object.entries(theme.zIndex).forEach(([key, value]) => {\r\n cssVars[`--z-${key}`] = value.toString();\r\n });\r\n }\r\n\r\n // Animation\r\n if (theme.animation) {\r\n if (theme.animation.duration) {\r\n Object.entries(theme.animation.duration).forEach(\r\n ([key, value]) => {\r\n cssVars[`--duration-${key}`] = value;\r\n },\r\n );\r\n }\r\n if (theme.animation.ease) {\r\n Object.entries(theme.animation.ease).forEach(([key, value]) => {\r\n cssVars[`--ease-${key}`] = value;\r\n });\r\n }\r\n }\r\n\r\n // Spacing (Tailwind v4 compatible)\r\n if (theme.spacing) {\r\n Object.entries(theme.spacing).forEach(([key, value]) => {\r\n cssVars[`--spacing-${key}`] = value;\r\n });\r\n }\r\n\r\n return cssVars;\r\n}\r\n\r\n/**\r\n * Apply CSS variables to an element\r\n */\r\nexport function applyCssVars(\r\n element: HTMLElement,\r\n cssVars: Record<string, string>,\r\n): void {\r\n Object.entries(cssVars).forEach(([key, value]) => {\r\n element.style.setProperty(key, value);\r\n });\r\n}\r\n\r\n/**\r\n * Remove CSS variables from an element\r\n */\r\nexport function removeCssVars(\r\n element: HTMLElement,\r\n keys: string[],\r\n): void {\r\n keys.forEach((key) => {\r\n element.style.removeProperty(key);\r\n });\r\n}\r\n\r\n/**\r\n * Format CSS variables object to CSS string\r\n * Useful for build-time CSS generation\r\n *\r\n * @example\r\n * ```ts\r\n * const cssVars = themeToCssVars(myTheme);\r\n * const cssString = formatCssVars(cssVars);\r\n * console.log(cssString);\r\n * // Output:\r\n * // --color-primary: oklch(0.5 0.2 250);\r\n * // --color-primary-foreground: oklch(1 0 0);\r\n * ```\r\n */\r\nexport function formatCssVars(\r\n cssVars: Record<string, string>,\r\n): string {\r\n return Object.entries(cssVars)\r\n .map(([key, value]) => ` ${key}: ${value};`)\r\n .join('\\n');\r\n}\r\n\r\n/**\r\n * Generate CSS variables string from theme config\r\n * Combines themeToCssVars + formatCssVars for convenience\r\n *\r\n * @example\r\n * ```ts\r\n * import { defineTheme, generateThemeCss } from '@poodle-kit/ui/theme';\r\n *\r\n * const myTheme = defineTheme({ colors: { ... } });\r\n * const cssString = generateThemeCss(myTheme);\r\n * console.log(cssString);\r\n * // Output:\r\n * // --color-primary: oklch(0.5 0.2 250);\r\n * // --color-primary-foreground: oklch(1 0 0);\r\n * ```\r\n */\r\nexport function generateThemeCss(theme: ThemeConfig): string {\r\n const cssVars = themeToCssVars(theme);\r\n return formatCssVars(cssVars);\r\n}\r\n","import { useContext } from 'react';\r\nimport { ThemeContext } from './provider';\r\nimport type { ThemeProviderState } from './types';\r\n\r\nexport function useTheme(): ThemeProviderState {\r\n const context = useContext(ThemeContext);\r\n\r\n if (context === undefined) {\r\n throw new Error('useTheme must be used within a ThemeProvider');\r\n }\r\n\r\n return context;\r\n}\r\n","export type Theme = 'light' | 'dark' | 'system' | string;\r\n\r\nexport type ColorValue =\r\n | string\r\n | {\r\n DEFAULT: string;\r\n foreground: string;\r\n };\r\n\r\nexport interface ThemeColors {\r\n // Page & Container colors\r\n background?: ColorValue;\r\n foreground?: ColorValue;\r\n muted?: ColorValue;\r\n accent?: ColorValue;\r\n card?: ColorValue;\r\n popover?: ColorValue;\r\n\r\n // Brand & Action colors\r\n primary?: ColorValue;\r\n secondary?: ColorValue;\r\n\r\n // Semantic colors\r\n info?: ColorValue;\r\n danger?: ColorValue;\r\n warning?: ColorValue;\r\n success?: ColorValue;\r\n destructive?: ColorValue;\r\n\r\n // Border & Input colors\r\n border?: ColorValue;\r\n input?: ColorValue;\r\n ring?: ColorValue;\r\n\r\n // Custom colors\r\n [key: string]: ColorValue | undefined;\r\n}\r\n\r\nexport interface ThemeConfig {\r\n colors: ThemeColors;\r\n spacing?: Record<string, string>;\r\n radius?: Record<string, string>;\r\n fontSize?: Record<\r\n string,\r\n string | [string, { lineHeight: string; letterSpacing?: string }]\r\n >;\r\n fontFamily?: Record<string, string[]>;\r\n fontWeight?: Record<string, string>;\r\n shadows?: Record<string, string>;\r\n zIndex?: Record<string, string>;\r\n animation?: {\r\n duration?: Record<string, string>;\r\n ease?: Record<string, string>;\r\n };\r\n [key: string]: unknown;\r\n}\r\n\r\nexport interface CustomThemeDefinition {\r\n dark?: boolean;\r\n cssVars?: Record<string, string>;\r\n}\r\n\r\nexport interface ThemeProviderProps {\r\n children: React.ReactNode;\r\n defaultTheme?: Theme;\r\n storageKey?: string;\r\n /** Custom theme configuration for light mode */\r\n config?: ThemeConfig;\r\n /** Custom theme configuration for dark mode */\r\n darkConfig?: ThemeConfig;\r\n /** Legacy: Custom theme definitions (deprecated, use config instead) */\r\n customThemes?: Record<string, CustomThemeDefinition>;\r\n enableColorSchemeSync?: boolean;\r\n}\r\n\r\nexport interface ThemeProviderState {\r\n theme: Theme;\r\n setTheme: (theme: Theme) => void;\r\n}\r\n\r\nexport function defineTheme<T extends ThemeConfig>(config: T): T {\r\n return config;\r\n}\r\n","/**\r\n * Default Theme Tokens\r\n *\r\n * This is a reference implementation showing how to define themes.\r\n * Copy this pattern to your project and customize the values.\r\n *\r\n * @example\r\n * ```tsx\r\n * // your-app/src/theme/my-theme.ts\r\n * import { defineTheme } from '@poodle-kit/ui/theme';\r\n *\r\n * export const myLightTheme = defineTheme({\r\n * colors: {\r\n * primary: { DEFAULT: 'oklch(0.5 0.2 250)', foreground: 'oklch(1 0 0)' },\r\n * // ... your custom colors\r\n * },\r\n * radius: { md: '0.5rem' },\r\n * });\r\n *\r\n * export const myDarkTheme = defineTheme({\r\n * colors: {\r\n * primary: { DEFAULT: 'oklch(0.7 0.2 250)', foreground: 'oklch(0.09 0 0)' },\r\n * // ... your custom colors\r\n * },\r\n * radius: { md: '0.5rem' },\r\n * });\r\n * ```\r\n *\r\n * Then use in your app:\r\n * ```tsx\r\n * import { ThemeProvider } from '@poodle-kit/ui';\r\n * import { myLightTheme, myDarkTheme } from './theme/my-theme';\r\n *\r\n * <ThemeProvider config={myLightTheme} darkConfig={myDarkTheme}>\r\n * <App />\r\n * </ThemeProvider>\r\n * ```\r\n */\r\n\r\nimport { defineTheme } from '../types';\r\n\r\n/**\r\n * Default Light Theme\r\n * Clean neutral design with semantic color tokens\r\n */\r\nexport const defaultLightTheme = defineTheme({\r\n colors: {\r\n // Page & Container colors\r\n background: {\r\n DEFAULT: 'oklch(1 0 0)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n muted: {\r\n DEFAULT: 'oklch(0.96 0 0)',\r\n foreground: 'oklch(0.45 0 0)',\r\n },\r\n\r\n accent: {\r\n DEFAULT: 'oklch(0.96 0 0)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n card: {\r\n DEFAULT: 'oklch(1 0 0)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n popover: {\r\n DEFAULT: 'oklch(1 0 0)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n // Brand & Action colors\r\n primary: {\r\n DEFAULT: 'oklch(0.09 0 0)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n secondary: {\r\n DEFAULT: 'oklch(0.45 0 0)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n // Semantic colors\r\n info: {\r\n DEFAULT: 'oklch(0.55 0.15 250)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n danger: {\r\n DEFAULT: 'oklch(0.576 0.204 27.325)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n warning: {\r\n DEFAULT: 'oklch(0.75 0.15 75)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n success: {\r\n DEFAULT: 'oklch(0.60 0.15 145)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n // Border & Input colors\r\n border: 'oklch(0.90 0 0)',\r\n input: 'oklch(0.90 0 0)',\r\n ring: 'oklch(0.09 0 0)',\r\n },\r\n\r\n radius: {\r\n none: '0',\r\n sm: '0.125rem',\r\n base: '0.25rem',\r\n md: '0.375rem',\r\n lg: '0.5rem',\r\n xl: '0.75rem',\r\n '2xl': '1rem',\r\n '3xl': '1.5rem',\r\n full: '9999px',\r\n },\r\n});\r\n\r\n/**\r\n * Default Dark Theme\r\n * Clean neutral design with semantic color tokens\r\n */\r\nexport const defaultDarkTheme = defineTheme({\r\n colors: {\r\n // Page & Container colors\r\n background: {\r\n DEFAULT: 'oklch(0.09 0 0)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n muted: {\r\n DEFAULT: 'oklch(0.17 0 0)',\r\n foreground: 'oklch(0.65 0 0)',\r\n },\r\n\r\n accent: {\r\n DEFAULT: 'oklch(0.17 0 0)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n card: {\r\n DEFAULT: 'oklch(0.09 0 0)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n popover: {\r\n DEFAULT: 'oklch(0.09 0 0)',\r\n foreground: 'oklch(0.98 0 0)',\r\n },\r\n\r\n // Brand & Action colors\r\n primary: {\r\n DEFAULT: 'oklch(0.98 0 0)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n secondary: {\r\n DEFAULT: 'oklch(0.65 0 0)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n // Semantic colors\r\n info: {\r\n DEFAULT: 'oklch(0.65 0.15 250)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n danger: {\r\n DEFAULT: 'oklch(0.701 0.191 29.234)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n warning: {\r\n DEFAULT: 'oklch(0.80 0.15 75)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n success: {\r\n DEFAULT: 'oklch(0.70 0.15 145)',\r\n foreground: 'oklch(0.09 0 0)',\r\n },\r\n\r\n // Border & Input colors\r\n border: 'oklch(0.27 0 0)',\r\n input: 'oklch(0.27 0 0)',\r\n ring: 'oklch(0.98 0 0)',\r\n },\r\n\r\n radius: {\r\n none: '0',\r\n sm: '0.125rem',\r\n base: '0.25rem',\r\n md: '0.375rem',\r\n lg: '0.5rem',\r\n xl: '0.75rem',\r\n '2xl': '1rem',\r\n '3xl': '1.5rem',\r\n full: '9999px',\r\n },\r\n});\r\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;;;ACAA,SAAS,eACd,OACwB;AACxB,QAAM,UAAkC,CAAC;AAGzC,MAAI,MAAM,QAAQ;AAChB,WAAO,QAAQ,MAAM,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACrD,UAAI,OAAO,UAAU,UAAU;AAC7B,gBAAQ,WAAW,GAAG,EAAE,IAAI;AAAA,MAC9B,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AACtD,YAAI,aAAa,OAAO;AACtB,kBAAQ,WAAW,GAAG,EAAE,IAAI,MAAM;AAAA,QACpC;AACA,YAAI,gBAAgB,OAAO;AACzB,kBAAQ,WAAW,GAAG,aAAa,IAAI,MAAM;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,MAAM,QAAQ;AAChB,WAAO,QAAQ,MAAM,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACrD,cAAQ,YAAY,GAAG,EAAE,IAAI;AAAA,IAC/B,CAAC;AAAA,EACH;AAGA,MAAI,MAAM,UAAU;AAClB,WAAO,QAAQ,MAAM,QAAQ,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACvD,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,cAAM,CAAC,MAAM,MAAM,IAAI;AACvB,gBAAQ,UAAU,GAAG,EAAE,IAAI;AAC3B,YAAI,OAAO,YAAY;AACrB,kBAAQ,aAAa,GAAG,EAAE,IAAI,OAAO;AAAA,QACvC;AAAA,MACF,OAAO;AACL,gBAAQ,UAAU,GAAG,EAAE,IAAI;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,MAAM,YAAY;AACpB,WAAO,QAAQ,MAAM,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACzD,cAAQ,UAAU,GAAG,EAAE,IAAI,MAAM,KAAK,IAAI;AAAA,IAC5C,CAAC;AAAA,EACH;AAGA,MAAI,MAAM,YAAY;AACpB,WAAO,QAAQ,MAAM,UAAU,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACzD,cAAQ,iBAAiB,GAAG,EAAE,IAAI;AAAA,IACpC,CAAC;AAAA,EACH;AAGA,MAAI,MAAM,SAAS;AACjB,WAAO,QAAQ,MAAM,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACtD,cAAQ,YAAY,GAAG,EAAE,IAAI;AAAA,IAC/B,CAAC;AAAA,EACH;AAGA,MAAI,MAAM,QAAQ;AAChB,WAAO,QAAQ,MAAM,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACrD,cAAQ,OAAO,GAAG,EAAE,IAAI,MAAM,SAAS;AAAA,IACzC,CAAC;AAAA,EACH;AAGA,MAAI,MAAM,WAAW;AACnB,QAAI,MAAM,UAAU,UAAU;AAC5B,aAAO,QAAQ,MAAM,UAAU,QAAQ,EAAE;AAAA,QACvC,CAAC,CAAC,KAAK,KAAK,MAAM;AAChB,kBAAQ,cAAc,GAAG,EAAE,IAAI;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AACA,QAAI,MAAM,UAAU,MAAM;AACxB,aAAO,QAAQ,MAAM,UAAU,IAAI,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC7D,gBAAQ,UAAU,GAAG,EAAE,IAAI;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,MAAM,SAAS;AACjB,WAAO,QAAQ,MAAM,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACtD,cAAQ,aAAa,GAAG,EAAE,IAAI;AAAA,IAChC,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKO,SAAS,aACd,SACA,SACM;AACN,SAAO,QAAQ,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAChD,YAAQ,MAAM,YAAY,KAAK,KAAK;AAAA,EACtC,CAAC;AACH;AAKO,SAAS,cACd,SACA,MACM;AACN,OAAK,QAAQ,CAAC,QAAQ;AACpB,YAAQ,MAAM,eAAe,GAAG;AAAA,EAClC,CAAC;AACH;AAgBO,SAAS,cACd,SACQ;AACR,SAAO,OAAO,QAAQ,OAAO,EAC1B,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,KAAK,GAAG,KAAK,KAAK,GAAG,EAC3C,KAAK,IAAI;AACd;AAkBO,SAAS,iBAAiB,OAA4B;AAC3D,QAAM,UAAU,eAAe,KAAK;AACpC,SAAO,cAAc,OAAO;AAC9B;;;ADvCI;AAnHG,IAAM,eAAe,cAE1B,MAAS;AAEJ,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,eAAe;AAAA,EACf,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,eAAe,CAAC;AAAA,EAChB,wBAAwB;AAC1B,GAAuB;AACrB,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAgB,MAAM;AAC9C,QAAI,OAAO,WAAW,aAAa;AACjC,aAAO;AAAA,IACT;AACA,QAAI;AACF,aACG,aAAa,QAAQ,UAAU,KAAe;AAAA,IAEnD,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAGD,QAAM,eAAe;AAAA,IACnB,MAAO,SAAS,eAAe,MAAM,IAAI;AAAA,IACzC,CAAC,MAAM;AAAA,EACT;AAEA,QAAM,cAAc;AAAA,IAClB,MAAO,aAAa,eAAe,UAAU,IAAI;AAAA,IACjD,CAAC,UAAU;AAAA,EACb;AAEA,YAAU,MAAM;AAlDlB;AAmDI,UAAM,OAAO,OAAO,SAAS;AAE7B,SAAK,UAAU;AAAA,MACb;AAAA,MACA;AAAA,MACA,GAAG,OAAO,KAAK,YAAY;AAAA,IAC7B;AAEA,QAAI;AAEJ,QAAI,UAAU,UAAU;AACtB,oBAAc,OAAO,WAAW,8BAA8B,EAC3D,UACC,SACA;AAAA,IACN,OAAO;AACL,oBAAc;AAAA,IAChB;AAEA,SAAK,UAAU,IAAI,WAAW;AAE9B,QAAI,uBAAuB;AACzB,YAAM,SACJ,gBAAgB,YAAU,kBAAa,WAAW,MAAxB,mBAA2B;AACvD,WAAK,MAAM,cAAc,SAAS,SAAS;AAAA,IAC7C;AAGA,QAAI,gBAAgB,WAAW,cAAc;AAC3C,mBAAa,MAAM,YAAY;AAAA,IACjC,WAAW,gBAAgB,UAAU,aAAa;AAChD,mBAAa,MAAM,WAAW;AAAA,IAChC,YAAW,kBAAa,WAAW,MAAxB,mBAA2B,SAAS;AAE7C,aAAO,QAAQ,aAAa,WAAW,EAAE,OAAQ,EAAE;AAAA,QACjD,CAAC,CAAC,KAAKA,MAAK,MAAM;AAChB,eAAK,MAAM,YAAY,KAAKA,MAAK;AAAA,QACnC;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,YAAU,MAAM;AACd,QAAI,UAAU,SAAU;AAExB,UAAM,aAAa,OAAO;AAAA,MACxB;AAAA,IACF;AACA,UAAM,UAAU,MAAM;AACpB,eAAS,QAAQ;AAAA,IACnB;AAEA,eAAW,iBAAiB,UAAU,OAAO;AAC7C,WAAO,MAAM,WAAW,oBAAoB,UAAU,OAAO;AAAA,EAC/D,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,iBAAiB,CAAC,aAAoB;AAC1C,QAAI;AACF,mBAAa,QAAQ,YAAY,QAAQ;AAAA,IAC3C,QAAQ;AAAA,IAER;AACA,aAAS,QAAQ;AAAA,EACnB;AAEA,QAAM,QAA4B;AAAA,IAChC;AAAA,IACA,UAAU;AAAA,EACZ;AAEA,SACE,oBAAC,aAAa,UAAb,EAAsB,OACpB,UACH;AAEJ;;;AEpIA,SAAS,kBAAkB;AAIpB,SAAS,WAA+B;AAC7C,QAAM,UAAU,WAAW,YAAY;AAEvC,MAAI,YAAY,QAAW;AACzB,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAChE;AAEA,SAAO;AACT;;;ACoEO,SAAS,YAAmC,QAAc;AAC/D,SAAO;AACT;;;ACrCO,IAAM,oBAAoB,YAAY;AAAA,EAC3C,QAAQ;AAAA;AAAA,IAEN,YAAY;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IAEA,OAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IAEA,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IAEA,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IAEA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA;AAAA,IAGA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IAEA,WAAW;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA;AAAA,IAGA,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IAEA,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IAEA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IAEA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA;AAAA,IAGA,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EAEA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AACF,CAAC;AAMM,IAAM,mBAAmB,YAAY;AAAA,EAC1C,QAAQ;AAAA;AAAA,IAEN,YAAY;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IAEA,OAAO;AAAA,MACL,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IAEA,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IAEA,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IAEA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA;AAAA,IAGA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IAEA,WAAW;AAAA,MACT,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA;AAAA,IAGA,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IAEA,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IAEA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA,IAEA,SAAS;AAAA,MACP,SAAS;AAAA,MACT,YAAY;AAAA,IACd;AAAA;AAAA,IAGA,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EAEA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AACF,CAAC;","names":["value"]}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Default Theme Tokens
|
|
3
|
+
*
|
|
4
|
+
* These are fallback values when no custom theme is provided.
|
|
5
|
+
* Users should override these by passing `config` and `darkConfig` to ThemeProvider.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* import { ThemeProvider, defineTheme } from '@poodle-kit/ui';
|
|
10
|
+
*
|
|
11
|
+
* const myTheme = defineTheme({
|
|
12
|
+
* colors: {
|
|
13
|
+
* primary: { DEFAULT: 'oklch(0.5 0.2 250)', foreground: 'oklch(1 0 0)' }
|
|
14
|
+
* }
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* <ThemeProvider config={myTheme} darkConfig={myDarkTheme}>
|
|
18
|
+
* <App />
|
|
19
|
+
* </ThemeProvider>
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
@import 'tailwindcss';
|
|
24
|
+
|
|
25
|
+
/* ==================== Light Mode (Default) ==================== */
|
|
26
|
+
|
|
27
|
+
@theme {
|
|
28
|
+
/* Page & Container colors */
|
|
29
|
+
--color-background: oklch(1 0 0);
|
|
30
|
+
--color-background-foreground: oklch(0.09 0 0);
|
|
31
|
+
--color-foreground: oklch(0.09 0 0);
|
|
32
|
+
--color-muted: oklch(0.96 0 0);
|
|
33
|
+
--color-muted-foreground: oklch(0.45 0 0);
|
|
34
|
+
--color-accent: oklch(0.96 0 0);
|
|
35
|
+
--color-accent-foreground: oklch(0.09 0 0);
|
|
36
|
+
--color-card: oklch(1 0 0);
|
|
37
|
+
--color-card-foreground: oklch(0.09 0 0);
|
|
38
|
+
--color-popover: oklch(1 0 0);
|
|
39
|
+
--color-popover-foreground: oklch(0.09 0 0);
|
|
40
|
+
|
|
41
|
+
/* Brand & Action colors */
|
|
42
|
+
--color-primary: oklch(0.09 0 0);
|
|
43
|
+
--color-primary-foreground: oklch(0.98 0 0);
|
|
44
|
+
--color-secondary: oklch(0.45 0 0);
|
|
45
|
+
--color-secondary-foreground: oklch(0.98 0 0);
|
|
46
|
+
|
|
47
|
+
/* Semantic colors */
|
|
48
|
+
--color-info: oklch(0.55 0.15 250);
|
|
49
|
+
--color-info-foreground: oklch(0.98 0 0);
|
|
50
|
+
--color-danger: oklch(0.576 0.204 27.325);
|
|
51
|
+
--color-danger-foreground: oklch(0.98 0 0);
|
|
52
|
+
--color-warning: oklch(0.75 0.15 75);
|
|
53
|
+
--color-warning-foreground: oklch(0.09 0 0);
|
|
54
|
+
--color-success: oklch(0.60 0.15 145);
|
|
55
|
+
--color-success-foreground: oklch(0.98 0 0);
|
|
56
|
+
|
|
57
|
+
/* Border & Input colors */
|
|
58
|
+
--color-border: oklch(0.90 0 0);
|
|
59
|
+
--color-input: oklch(0.90 0 0);
|
|
60
|
+
--color-ring: oklch(0.09 0 0);
|
|
61
|
+
|
|
62
|
+
/* Radius */
|
|
63
|
+
--radius-none: 0;
|
|
64
|
+
--radius-sm: 0.125rem;
|
|
65
|
+
--radius-base: 0.25rem;
|
|
66
|
+
--radius-md: 0.375rem;
|
|
67
|
+
--radius-lg: 0.5rem;
|
|
68
|
+
--radius-xl: 0.75rem;
|
|
69
|
+
--radius-2xl: 1rem;
|
|
70
|
+
--radius-3xl: 1.5rem;
|
|
71
|
+
--radius-full: 9999px;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* ==================== Dark Mode ==================== */
|
|
75
|
+
|
|
76
|
+
.dark {
|
|
77
|
+
/* Page & Container colors */
|
|
78
|
+
--color-background: oklch(0.09 0 0);
|
|
79
|
+
--color-background-foreground: oklch(0.98 0 0);
|
|
80
|
+
--color-foreground: oklch(0.98 0 0);
|
|
81
|
+
--color-muted: oklch(0.17 0 0);
|
|
82
|
+
--color-muted-foreground: oklch(0.65 0 0);
|
|
83
|
+
--color-accent: oklch(0.17 0 0);
|
|
84
|
+
--color-accent-foreground: oklch(0.98 0 0);
|
|
85
|
+
--color-card: oklch(0.09 0 0);
|
|
86
|
+
--color-card-foreground: oklch(0.98 0 0);
|
|
87
|
+
--color-popover: oklch(0.09 0 0);
|
|
88
|
+
--color-popover-foreground: oklch(0.98 0 0);
|
|
89
|
+
|
|
90
|
+
/* Brand & Action colors */
|
|
91
|
+
--color-primary: oklch(0.98 0 0);
|
|
92
|
+
--color-primary-foreground: oklch(0.09 0 0);
|
|
93
|
+
--color-secondary: oklch(0.65 0 0);
|
|
94
|
+
--color-secondary-foreground: oklch(0.09 0 0);
|
|
95
|
+
|
|
96
|
+
/* Semantic colors */
|
|
97
|
+
--color-info: oklch(0.65 0.15 250);
|
|
98
|
+
--color-info-foreground: oklch(0.09 0 0);
|
|
99
|
+
--color-danger: oklch(0.701 0.191 29.234);
|
|
100
|
+
--color-danger-foreground: oklch(0.09 0 0);
|
|
101
|
+
--color-warning: oklch(0.80 0.15 75);
|
|
102
|
+
--color-warning-foreground: oklch(0.09 0 0);
|
|
103
|
+
--color-success: oklch(0.70 0.15 145);
|
|
104
|
+
--color-success-foreground: oklch(0.09 0 0);
|
|
105
|
+
|
|
106
|
+
/* Border & Input colors */
|
|
107
|
+
--color-border: oklch(0.27 0 0);
|
|
108
|
+
--color-input: oklch(0.27 0 0);
|
|
109
|
+
--color-ring: oklch(0.98 0 0);
|
|
110
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@poodle-kit/ui",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "React UI component library with Tailwind CSS",
|
|
5
5
|
"author": "",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,19 +19,26 @@
|
|
|
19
19
|
"types": "./dist/index.d.ts",
|
|
20
20
|
"exports": {
|
|
21
21
|
".": {
|
|
22
|
-
"
|
|
22
|
+
"types": "./dist/index.d.ts",
|
|
23
23
|
"import": "./dist/index.mjs",
|
|
24
|
-
"
|
|
24
|
+
"require": "./dist/index.js"
|
|
25
25
|
},
|
|
26
|
-
"./
|
|
26
|
+
"./theme": {
|
|
27
|
+
"types": "./dist/theme/index.d.ts",
|
|
28
|
+
"import": "./dist/theme/index.mjs",
|
|
29
|
+
"require": "./dist/theme/index.js"
|
|
30
|
+
},
|
|
31
|
+
"./utils": {
|
|
32
|
+
"types": "./dist/lib/cn.d.ts",
|
|
33
|
+
"import": "./dist/lib/cn.mjs",
|
|
34
|
+
"require": "./dist/lib/cn.js"
|
|
35
|
+
},
|
|
36
|
+
"./styles.css": "./dist/index.css",
|
|
37
|
+
"./theme.css": "./dist/theme/theme.css"
|
|
27
38
|
},
|
|
28
39
|
"files": [
|
|
29
40
|
"dist"
|
|
30
41
|
],
|
|
31
|
-
"scripts": {
|
|
32
|
-
"build": "tsup",
|
|
33
|
-
"dev": "tsup --watch"
|
|
34
|
-
},
|
|
35
42
|
"peerDependencies": {
|
|
36
43
|
"react": ">=18",
|
|
37
44
|
"react-dom": ">=18"
|
|
@@ -43,5 +50,16 @@
|
|
|
43
50
|
"react-dom": "^18.2.0",
|
|
44
51
|
"tsup": "^8.5.1",
|
|
45
52
|
"typescript": "^5.9.3"
|
|
53
|
+
},
|
|
54
|
+
"dependencies": {
|
|
55
|
+
"@radix-ui/react-slot": "^1.2.4",
|
|
56
|
+
"class-variance-authority": "^0.7.1",
|
|
57
|
+
"clsx": "^2.1.1",
|
|
58
|
+
"tailwind-merge": "^3.4.0"
|
|
59
|
+
},
|
|
60
|
+
"scripts": {
|
|
61
|
+
"build": "tsup",
|
|
62
|
+
"dev": "tsup --watch",
|
|
63
|
+
"typecheck": "tsc --noEmit"
|
|
46
64
|
}
|
|
47
|
-
}
|
|
65
|
+
}
|