@omnitron-dev/prism 0.1.3 → 0.2.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.
Files changed (60) hide show
  1. package/dist/blocks/index.js +49 -9
  2. package/dist/blocks/index.js.map +1 -1
  3. package/dist/chunk-2FYNRDXR.js +192 -0
  4. package/dist/chunk-2FYNRDXR.js.map +1 -0
  5. package/dist/chunk-A2Z7NVGL.js +11496 -0
  6. package/dist/chunk-A2Z7NVGL.js.map +1 -0
  7. package/dist/{chunk-E3XANPTO.js → chunk-IZOIO7PA.js} +5 -191
  8. package/dist/{chunk-E3XANPTO.js.map → chunk-IZOIO7PA.js.map} +1 -1
  9. package/dist/{chunk-LAEY5USO.js → chunk-KTCWPGON.js} +55 -25
  10. package/dist/chunk-KTCWPGON.js.map +1 -0
  11. package/dist/{chunk-DXXZ3ITR.js → chunk-MEFT6XPH.js} +721 -455
  12. package/dist/chunk-MEFT6XPH.js.map +1 -0
  13. package/dist/{chunk-BTIT7WYH.js → chunk-SNKGGHBT.js} +2 -2
  14. package/dist/chunk-SNKGGHBT.js.map +1 -0
  15. package/dist/{chunk-UR6X3W5I.js → chunk-VAAIHNWQ.js} +3 -3
  16. package/dist/{chunk-UR6X3W5I.js.map → chunk-VAAIHNWQ.js.map} +1 -1
  17. package/dist/{chunk-GYDT5EKX.js → chunk-XQXGE2PW.js} +760 -472
  18. package/dist/chunk-XQXGE2PW.js.map +1 -0
  19. package/dist/{chunk-WC2WM2JD.js → chunk-XXP3ZGU6.js} +18 -8
  20. package/dist/chunk-XXP3ZGU6.js.map +1 -0
  21. package/dist/chunk-YJMAQL3S.js +1887 -0
  22. package/dist/chunk-YJMAQL3S.js.map +1 -0
  23. package/dist/cli/index.js +4 -4
  24. package/dist/cli/index.js.map +1 -1
  25. package/dist/components/editor/index.d.ts +107 -0
  26. package/dist/components/editor/index.js +4 -0
  27. package/dist/components/editor/index.js.map +1 -0
  28. package/dist/components/index.css +131 -0
  29. package/dist/components/index.css.map +1 -0
  30. package/dist/components/index.d.ts +7073 -0
  31. package/dist/components/index.js +13 -0
  32. package/dist/components/index.js.map +1 -0
  33. package/dist/components-BCGZ-Rwt.d.ts +142 -0
  34. package/dist/{config-BA6IeTq9.d.ts → config-Pct0n_Kq.d.ts} +2 -2
  35. package/dist/core/index.d.ts +20 -5
  36. package/dist/core/index.js +2 -2
  37. package/dist/hooks/index.d.ts +3 -2
  38. package/dist/hooks/index.js +4 -3
  39. package/dist/{index-odhPSv9I.d.ts → index-nmJ8Muwg.d.ts} +4 -127
  40. package/dist/index.d.ts +265 -6615
  41. package/dist/index.js +119 -11662
  42. package/dist/index.js.map +1 -1
  43. package/dist/layouts/index.js +1 -1
  44. package/dist/popover-Dmw7SJLR.d.ts +127 -0
  45. package/dist/registry/index.d.ts +2 -2
  46. package/dist/{registry-BrDNftd5.d.ts → registry-DQcIzW2s.d.ts} +2 -2
  47. package/dist/{settings-plpR26Xk.d.ts → settings-CAC0qFjS.d.ts} +2 -2
  48. package/dist/state/index.d.ts +2 -2
  49. package/dist/state/index.js +1 -1
  50. package/dist/text-transform-D6MzzF7V.d.ts +165 -0
  51. package/dist/theme/index.d.ts +2 -2
  52. package/dist/theme/index.js +2 -2
  53. package/dist/{theme-CrXLfP1c.d.ts → theme-B4Q3Bg5o.d.ts} +1 -1
  54. package/dist/types/index.d.ts +6 -145
  55. package/package.json +46 -40
  56. package/dist/chunk-BTIT7WYH.js.map +0 -1
  57. package/dist/chunk-DXXZ3ITR.js.map +0 -1
  58. package/dist/chunk-GYDT5EKX.js.map +0 -1
  59. package/dist/chunk-LAEY5USO.js.map +0 -1
  60. package/dist/chunk-WC2WM2JD.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/context.ts","../src/core/hooks/use-media-query.ts","../src/core/provider.tsx","../src/core/provider-stack.tsx","../src/core/hooks/use-set-state.ts","../src/core/hooks/use-multi-select.ts","../src/core/hooks/use-local-storage.ts","../src/core/hooks/use-copy-to-clipboard.ts","../src/core/hooks/use-debounce.ts","../src/core/hooks/use-countdown.ts","../src/core/hooks/use-breakpoints.ts","../src/core/hooks/use-is-client.ts","../src/core/hooks/use-mounted.ts","../src/core/hooks/use-previous.ts","../src/core/hooks/use-event-listener.ts","../src/core/hooks/use-click-outside.ts","../src/core/hooks/use-interval.ts","../src/core/hooks/use-timeout.ts"],"names":["useMuiMediaQuery","MuiThemeProvider","useMemo","jsx","useCallback","useState","useEffect","useRef"],"mappings":"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","file":"chunk-WC2WM2JD.js","sourcesContent":["/**\n * Prism Context\n *\n * Global context for Prism configuration and state.\n *\n * @module @omnitron-dev/prism/core/context\n */\n\nimport { createContext, useContext } from 'react';\nimport type { PrismConfig } from '../types/config.js';\nimport type { PrismTheme, ThemeMode, ThemePreset, ThemeDirection } from '../types/theme.js';\nimport type { NavLayout, NavColor } from '../state/stores/settings.js';\n\n/**\n * Settings state managed by Prism.\n * @deprecated Use useSettingsStore from '@omnitron-dev/prism/state' for full settings access.\n * This interface is maintained for backwards compatibility with PrismContext.\n */\nexport interface PrismSettingsState {\n /** Current theme mode */\n mode: ThemeMode;\n /** Current theme preset */\n preset: ThemePreset;\n /** Text direction */\n direction: ThemeDirection;\n /** Sidebar collapsed state */\n sidebarCollapsed: boolean;\n /** Settings drawer open */\n settingsDrawerOpen: boolean;\n /** Primary color override */\n primaryColor: string | null;\n /** High contrast mode */\n contrast: 'default' | 'high';\n /** Base font size (12-20) */\n fontSize: number;\n /** Selected font family */\n fontFamily: string;\n /** Navigation layout */\n navLayout: NavLayout;\n /** Navigation color mode */\n navColor: NavColor;\n}\n\n/**\n * Prism context value.\n */\nexport interface PrismContextValue {\n /** Current configuration */\n config: PrismConfig;\n /** Current theme */\n theme: PrismTheme;\n /** Settings state */\n settings: PrismSettingsState;\n\n // Theme actions\n /** Set theme mode */\n setMode: (mode: ThemeMode) => void;\n /** Toggle between light/dark */\n toggleMode: () => void;\n /** Set theme preset */\n setPreset: (preset: ThemePreset) => void;\n /** Set text direction */\n setDirection: (direction: ThemeDirection) => void;\n\n // Settings actions\n /** Toggle sidebar */\n toggleSidebar: () => void;\n /** Set sidebar collapsed */\n setSidebarCollapsed: (collapsed: boolean) => void;\n /** Open settings drawer */\n openSettingsDrawer: () => void;\n /** Close settings drawer */\n closeSettingsDrawer: () => void;\n /** Toggle settings drawer */\n toggleSettingsDrawer: () => void;\n\n // Reset\n /** Reset all settings to defaults */\n resetSettings: () => void;\n}\n\n/**\n * Prism context.\n */\nexport const PrismContext = createContext<PrismContextValue | null>(null);\n\nPrismContext.displayName = 'PrismContext';\n\n/**\n * Hook to access Prism context.\n *\n * @returns Prism context value\n * @throws If used outside PrismProvider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { theme, setMode, toggleSidebar } = usePrismContext();\n *\n * return (\n * <Button onClick={() => setMode('dark')}>\n * Switch to Dark Mode\n * </Button>\n * );\n * }\n * ```\n */\nexport function usePrismContext(): PrismContextValue {\n const context = useContext(PrismContext);\n\n if (!context) {\n throw new Error('usePrismContext must be used within a PrismProvider');\n }\n\n return context;\n}\n\n/**\n * Default settings state.\n */\nexport const defaultSettingsState: PrismSettingsState = {\n mode: 'light',\n preset: 'default-light',\n direction: 'ltr',\n sidebarCollapsed: false,\n settingsDrawerOpen: false,\n primaryColor: null,\n contrast: 'default',\n fontSize: 16,\n fontFamily: 'Public Sans Variable',\n navLayout: 'vertical',\n navColor: 'integrate',\n};\n","'use client';\n\n/**\n * useMediaQuery Hook\n *\n * Re-export and extension of MUI's useMediaQuery.\n *\n * @module @omnitron-dev/prism/core/hooks/use-media-query\n */\n\nimport { useMediaQuery as useMuiMediaQuery } from '@mui/material';\nimport type { UseMediaQueryOptions } from '@mui/material';\n\nexport { useMuiMediaQuery as useMediaQuery };\nexport type { UseMediaQueryOptions };\n\n/**\n * Hook for detecting system color scheme preference.\n *\n * @returns true if user prefers dark mode\n *\n * @example\n * ```tsx\n * function ThemeToggle() {\n * const prefersDark = usePrefersDarkMode();\n * const { setMode } = usePrismContext();\n *\n * useEffect(() => {\n * setMode(prefersDark ? 'dark' : 'light');\n * }, [prefersDark, setMode]);\n *\n * return null;\n * }\n * ```\n */\nexport function usePrefersDarkMode(): boolean {\n return useMuiMediaQuery('(prefers-color-scheme: dark)');\n}\n\n/**\n * Hook for detecting reduced motion preference.\n *\n * @returns true if user prefers reduced motion\n *\n * @example\n * ```tsx\n * function AnimatedComponent() {\n * const prefersReducedMotion = usePrefersReducedMotion();\n *\n * return (\n * <motion.div\n * animate={{ x: 100 }}\n * transition={{\n * duration: prefersReducedMotion ? 0 : 0.3,\n * }}\n * />\n * );\n * }\n * ```\n */\nexport function usePrefersReducedMotion(): boolean {\n return useMuiMediaQuery('(prefers-reduced-motion: reduce)');\n}\n\n/**\n * Hook for detecting high contrast preference.\n *\n * @returns true if user prefers high contrast\n */\nexport function usePrefersHighContrast(): boolean {\n return useMuiMediaQuery('(prefers-contrast: more)');\n}\n\n/**\n * Hook for detecting touch device.\n *\n * @returns true if device supports hover (likely not touch)\n *\n * @example\n * ```tsx\n * function Tooltip() {\n * const canHover = useCanHover();\n *\n * // Only show hover tooltips on non-touch devices\n * if (!canHover) {\n * return <TouchTooltip />;\n * }\n *\n * return <HoverTooltip />;\n * }\n * ```\n */\nexport function useCanHover(): boolean {\n return useMuiMediaQuery('(hover: hover) and (pointer: fine)');\n}\n\n/**\n * Hook for detecting print mode.\n *\n * @returns true if currently printing\n */\nexport function useIsPrinting(): boolean {\n return useMuiMediaQuery('print');\n}\n\n/**\n * Hook that resolves 'system' mode to actual 'light' or 'dark' based on system preference.\n * If mode is already 'light' or 'dark', returns it unchanged.\n *\n * @param mode - The theme mode ('light' | 'dark' | 'system')\n * @returns Resolved mode ('light' | 'dark')\n *\n * @example\n * ```tsx\n * function ThemeProvider({ mode, children }) {\n * const resolvedMode = useResolvedMode(mode);\n *\n * return (\n * <MuiThemeProvider theme={createTheme({ mode: resolvedMode })}>\n * {children}\n * </MuiThemeProvider>\n * );\n * }\n * ```\n */\nexport function useResolvedMode(mode: 'light' | 'dark' | 'system'): 'light' | 'dark' {\n const prefersDark = usePrefersDarkMode();\n\n if (mode === 'system') {\n return prefersDark ? 'dark' : 'light';\n }\n\n return mode;\n}\n","/**\n * Prism Provider\n *\n * Root provider for the Prism design system.\n * Uses useSettingsStore (Zustand) as the single source of truth for settings.\n *\n * @module @omnitron-dev/prism/core/provider\n */\n\nimport type { ReactNode } from 'react';\nimport { useMemo, useEffect, useCallback } from 'react';\nimport createCache from '@emotion/cache';\nimport { CacheProvider } from '@emotion/react';\nimport { ThemeProvider as MuiThemeProvider } from '@mui/material/styles';\nimport CssBaseline from '@mui/material/CssBaseline';\nimport { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider';\nimport { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs';\nimport rtlPlugin from 'stylis-plugin-rtl';\n\nimport type { PrismConfig, PartialPrismConfig } from '../types/config.js';\nimport type { PrismTheme } from '../types/theme.js';\nimport { defaultPrismConfig } from '../types/config.js';\nimport { PrismContext } from './context.js';\nimport type { PrismSettingsState } from './context.js';\nimport { useResolvedMode } from './hooks/use-media-query.js';\nimport { createPrismTheme } from '../theme/create-theme.js';\nimport { useSettingsStore } from '../state/stores/settings.js';\n\n/**\n * Props for PrismProvider.\n */\nexport interface PrismProviderProps {\n /** Child components */\n children: ReactNode;\n /** Configuration overrides */\n config?: PartialPrismConfig;\n /** Default settings (overrides defaults but not persisted values) */\n defaultSettings?: Partial<PrismSettingsState>;\n /** Disable CSS baseline */\n disableCssBaseline?: boolean;\n /** Custom theme overrides */\n themeOverrides?: Record<string, unknown>;\n}\n\n/**\n * Merge configurations deeply.\n */\nfunction mergeConfig(base: PrismConfig, overrides?: PartialPrismConfig): PrismConfig {\n if (!overrides) return base;\n\n return {\n ...base,\n ...overrides,\n paths: { ...base.paths, ...overrides.paths },\n registries: { ...base.registries, ...overrides.registries },\n theme: { ...base.theme, ...overrides.theme },\n style: { ...base.style, ...overrides.style },\n features: { ...base.features, ...overrides.features },\n } as PrismConfig;\n}\n\n/** Stable no-op for deprecated drawer controls */\nconst noOpDrawerWarning = () => {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n '[PrismProvider] Settings drawer is now managed by SettingsProvider. ' +\n 'Use useSettingsDrawer() from @omnitron-dev/prism/components/settings instead.'\n );\n }\n};\n\n/**\n * PrismProvider - Root provider for Prism design system.\n *\n * Provides theme, settings, and configuration to all child components.\n * Uses Zustand's useSettingsStore as the single source of truth for settings.\n *\n * @example\n * ```tsx\n * import { PrismProvider } from '@omnitron-dev/prism';\n *\n * function App() {\n * return (\n * <PrismProvider\n * config={{\n * theme: { preset: 'luxury', mode: 'dark' },\n * features: { darkMode: true, rtl: true },\n * }}\n * >\n * <YourApp />\n * </PrismProvider>\n * );\n * }\n * ```\n */\nexport function PrismProvider({\n children,\n config: configOverrides,\n defaultSettings,\n disableCssBaseline = false,\n themeOverrides,\n}: PrismProviderProps): ReactNode {\n // Merge configuration\n const config = useMemo(() => mergeConfig(defaultPrismConfig, configOverrides), [configOverrides]);\n\n // Use Zustand store as single source of truth for settings\n // Zustand actions are stable references, no need for useCallback wrappers\n const {\n // State values\n mode: storeMode,\n preset: storePreset,\n direction: storeDirection,\n primaryColor: storePrimaryColor,\n contrast: storeContrast,\n compactSidebar,\n fontSize: storeFontSize,\n fontFamily: storeFontFamily,\n navLayout: storeNavLayout,\n navColor: storeNavColor,\n // Actions (stable references from Zustand)\n setMode,\n toggleMode,\n setPreset,\n setDirection,\n setCompactSidebar,\n reset: resetSettings,\n } = useSettingsStore();\n\n // Initialize store with config values on first mount\n useEffect(() => {\n if (defaultSettings?.mode) setMode(defaultSettings.mode);\n if (defaultSettings?.preset) setPreset(defaultSettings.preset);\n if (defaultSettings?.direction) setDirection(defaultSettings.direction);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []); // Only on mount - intentionally empty deps\n\n // Create settings object for context (backwards compatibility)\n const settings = useMemo<PrismSettingsState>(\n () => ({\n mode: storeMode,\n preset: storePreset,\n direction: storeDirection,\n sidebarCollapsed: compactSidebar,\n settingsDrawerOpen: false, // Managed by SettingsProvider component\n primaryColor: storePrimaryColor,\n contrast: storeContrast,\n fontSize: storeFontSize,\n fontFamily: storeFontFamily ?? 'Public Sans Variable',\n navLayout: storeNavLayout,\n navColor: storeNavColor,\n }),\n [\n storeMode,\n storePreset,\n storeDirection,\n compactSidebar,\n storePrimaryColor,\n storeContrast,\n storeFontSize,\n storeFontFamily,\n storeNavLayout,\n storeNavColor,\n ]\n );\n\n // Sidebar toggle — uses functional read from store to avoid stale closure\n const toggleSidebar = useCallback(() => {\n const current = useSettingsStore.getState().compactSidebar;\n setCompactSidebar(!current);\n }, [setCompactSidebar]);\n\n // Settings drawer is managed by SettingsProvider component\n // These are no-ops for backwards compatibility (stable reference, hoisted below)\n\n // Emotion cache for RTL support — flips CSS properties automatically via Stylis plugin\n const emotionCache = useMemo(\n () =>\n storeDirection === 'rtl'\n ? createCache({ key: 'prism-rtl', stylisPlugins: [rtlPlugin] })\n : createCache({ key: 'prism-ltr' }),\n [storeDirection]\n );\n\n // Set document direction attribute (SSR-safe)\n useEffect(() => {\n if (typeof document !== 'undefined') {\n document.documentElement.dir = storeDirection;\n }\n }, [storeDirection]);\n\n // Set document font size (SSR-safe)\n useEffect(() => {\n if (typeof document !== 'undefined') {\n if (storeFontSize && storeFontSize !== 16) {\n document.documentElement.style.fontSize = `${storeFontSize}px`;\n } else {\n document.documentElement.style.removeProperty('font-size');\n }\n }\n }, [storeFontSize]);\n\n // Resolve 'system' mode to actual 'light' or 'dark' based on OS preference\n const resolvedMode = useResolvedMode(storeMode);\n\n // Create theme based on current settings\n const theme = useMemo<PrismTheme>(\n () =>\n createPrismTheme({\n preset: storePreset,\n mode: resolvedMode,\n direction: storeDirection,\n primaryColor: storePrimaryColor || config.theme.primaryColor,\n typography: config.theme.typography,\n cssVariables: config.theme.cssVariables,\n components: config.theme.components,\n contrast: storeContrast,\n fontFamily: storeFontFamily,\n fontSize: storeFontSize,\n overrides: themeOverrides,\n }),\n [\n storePreset,\n resolvedMode,\n storeDirection,\n storePrimaryColor,\n storeContrast,\n storeFontSize,\n storeFontFamily,\n config.theme,\n themeOverrides,\n ]\n );\n\n // Context value\n // Zustand actions are stable, so they don't need to be in deps\n const contextValue = useMemo(\n () => ({\n config,\n theme,\n settings,\n // Zustand actions (stable references)\n setMode,\n toggleMode,\n setPreset,\n setDirection,\n toggleSidebar,\n setSidebarCollapsed: setCompactSidebar,\n resetSettings,\n // Deprecated drawer controls (no-ops, stable module-level reference)\n openSettingsDrawer: noOpDrawerWarning,\n closeSettingsDrawer: noOpDrawerWarning,\n toggleSettingsDrawer: noOpDrawerWarning,\n }),\n [\n config,\n theme,\n settings,\n setMode,\n toggleMode,\n setPreset,\n setDirection,\n toggleSidebar,\n setCompactSidebar,\n resetSettings,\n ]\n );\n\n return (\n <CacheProvider value={emotionCache}>\n <PrismContext.Provider value={contextValue}>\n <MuiThemeProvider theme={theme}>\n <LocalizationProvider dateAdapter={AdapterDayjs}>\n {!disableCssBaseline && <CssBaseline />}\n {children}\n </LocalizationProvider>\n </MuiThemeProvider>\n </PrismContext.Provider>\n </CacheProvider>\n );\n}\n","'use client';\n\n/**\n * Provider Stack Utilities\n *\n * Composable provider pattern for building flexible provider hierarchies.\n *\n * @module @omnitron-dev/prism/core/provider-stack\n */\n\nimport type { ReactNode, ComponentType, FC } from 'react';\nimport { createElement, useMemo } from 'react';\n\n/**\n * A provider component with its props.\n */\nexport type ProviderEntry<P = Record<string, unknown>> = [ComponentType<P & { children: ReactNode }>, P];\n\n/**\n * A provider that takes only children.\n */\nexport type SimpleProvider = ComponentType<{ children: ReactNode }>;\n\n/**\n * Provider entry that can be a simple component or a tuple with props.\n */\nexport type ProviderConfig = SimpleProvider | ProviderEntry;\n\n/**\n * Options for createProviderStack.\n */\nexport interface ProviderStackOptions {\n /** Display name for debugging */\n displayName?: string;\n}\n\n/**\n * Compose multiple providers into a single component.\n * Providers are applied from left to right (first provider wraps outermost).\n *\n * @param providers - Array of providers to compose\n * @returns A single component that renders all providers\n *\n * @example\n * ```tsx\n * const AppProviders = composeProviders([\n * ThemeProvider,\n * [AuthProvider, { client: authClient }],\n * [QueryProvider, { client: queryClient }],\n * ToastProvider,\n * ]);\n *\n * function App() {\n * return (\n * <AppProviders>\n * <YourApp />\n * </AppProviders>\n * );\n * }\n * ```\n */\nexport function composeProviders(providers: ProviderConfig[]): FC<{ children: ReactNode }> {\n const ComposedProviders: FC<{ children: ReactNode }> = ({ children }) =>\n // Build the provider tree from inside-out (reverse iteration)\n providers.reduceRight<ReactNode>((acc, provider) => {\n if (Array.isArray(provider)) {\n const [Component, props] = provider;\n return createElement(Component, { ...props, children: acc });\n }\n return createElement(provider, { children: acc });\n }, children);\n ComposedProviders.displayName = 'ComposedProviders';\n return ComposedProviders;\n}\n\n/**\n * Create a provider stack factory for building customizable provider hierarchies.\n *\n * @param baseProviders - Base providers that are always included\n * @param options - Configuration options\n * @returns A factory function for creating provider components\n *\n * @example\n * ```tsx\n * // Define base stack\n * const createAppProviders = createProviderStack([\n * ThemeProvider,\n * [I18nProvider, { locale: 'en' }],\n * ]);\n *\n * // Create with additional providers\n * const AppProviders = createAppProviders({\n * prepend: [ErrorBoundaryProvider],\n * append: [ToastProvider, NotificationProvider],\n * });\n *\n * // Or use without modifications\n * const SimpleProviders = createAppProviders();\n * ```\n */\nexport function createProviderStack(\n baseProviders: ProviderConfig[],\n options: ProviderStackOptions = {}\n): (config?: {\n prepend?: ProviderConfig[];\n append?: ProviderConfig[];\n replace?: ProviderConfig[];\n}) => FC<{ children: ReactNode }> {\n const { displayName = 'ProviderStack' } = options;\n\n return (config = {}) => {\n const { prepend = [], append = [], replace } = config;\n\n const providers = replace ?? [...prepend, ...baseProviders, ...append];\n const Component = composeProviders(providers);\n Component.displayName = displayName;\n\n return Component;\n };\n}\n\n/**\n * Props for ProviderStack component.\n */\nexport interface ProviderStackProps {\n /** Provider configurations */\n providers: ProviderConfig[];\n /** Child components */\n children: ReactNode;\n}\n\n/**\n * ProviderStack - Declarative provider composition component.\n *\n * @example\n * ```tsx\n * function App() {\n * const providers = useMemo(() => [\n * ThemeProvider,\n * [AuthProvider, { client }],\n * ToastProvider,\n * ], [client]);\n *\n * return (\n * <ProviderStack providers={providers}>\n * <YourApp />\n * </ProviderStack>\n * );\n * }\n * ```\n */\nexport function ProviderStack({ providers, children }: ProviderStackProps): ReactNode {\n const Provider = useMemo(() => composeProviders(providers), [providers]);\n return <Provider>{children}</Provider>;\n}\n\n/**\n * Create a provider component with bound props.\n * Useful for creating reusable provider configurations.\n *\n * @param Provider - The provider component\n * @param props - Props to bind to the provider\n * @returns A new component with bound props\n *\n * @example\n * ```tsx\n * const BoundQueryProvider = withProviderProps(QueryClientProvider, {\n * client: queryClient,\n * });\n *\n * // Use like a simple provider\n * <BoundQueryProvider>\n * <App />\n * </BoundQueryProvider>\n * ```\n */\nexport function withProviderProps<P extends object>(\n Provider: ComponentType<P & { children: ReactNode }>,\n props: P\n): SimpleProvider {\n const BoundProvider: SimpleProvider = ({ children }) => createElement(Provider, { ...props, children });\n\n BoundProvider.displayName = `withProviderProps(${Provider.displayName || Provider.name || 'Component'})`;\n return BoundProvider;\n}\n\n/**\n * Create a conditional provider that only renders when condition is true.\n *\n * @param Provider - The provider component\n * @param condition - Whether to render the provider\n * @returns A provider that renders conditionally\n *\n * @example\n * ```tsx\n * const providers = [\n * ThemeProvider,\n * conditionalProvider(DevToolsProvider, process.env.NODE_ENV === 'development'),\n * AuthProvider,\n * ];\n * ```\n */\nexport function conditionalProvider<P extends { children: ReactNode }>(\n Provider: ComponentType<P>,\n condition: boolean,\n props?: Omit<P, 'children'>\n): ProviderConfig | null {\n if (!condition) return null;\n if (props) {\n return [Provider as ComponentType<Record<string, unknown> & { children: ReactNode }>, props];\n }\n return Provider as SimpleProvider;\n}\n\n/**\n * Filter out null/undefined providers from a provider array.\n *\n * @param providers - Array of providers that may contain nulls\n * @returns Filtered array of valid providers\n *\n * @example\n * ```tsx\n * const providers = filterProviders([\n * ThemeProvider,\n * conditionalProvider(DevToolsProvider, isDev),\n * conditionalProvider(MockProvider, isMocking),\n * AuthProvider,\n * ]);\n * ```\n */\nexport function filterProviders(providers: (ProviderConfig | null | undefined)[]): ProviderConfig[] {\n return providers.filter((p): p is ProviderConfig => p != null);\n}\n","'use client';\n\n/**\n * useSetState Hook\n *\n * State hook that works like React.Component's setState,\n * allowing partial state updates.\n *\n * @module @omnitron-dev/prism/core/hooks/use-set-state\n */\n\nimport { useCallback, useState } from 'react';\n\n/**\n * State updater function type.\n * Accepts partial state or a function that returns partial state.\n */\nexport type SetState<T extends Record<string, unknown>> = (patch: Partial<T> | ((prevState: T) => Partial<T>)) => void;\n\n/**\n * Return type for useSetState.\n */\nexport interface UseSetStateReturn<T extends Record<string, unknown>> {\n /** Current state */\n state: T;\n /** Update state with partial values */\n setState: SetState<T>;\n /** Reset state to initial value */\n resetState: () => void;\n}\n\n/**\n * useSetState - State hook with partial update support.\n * Works like React class component's setState method.\n *\n * @example\n * ```tsx\n * interface FormState {\n * name: string;\n * email: string;\n * phone: string;\n * }\n *\n * function Form() {\n * const { state, setState, resetState } = useSetState<FormState>({\n * name: '',\n * email: '',\n * phone: '',\n * });\n *\n * return (\n * <>\n * <TextField\n * value={state.name}\n * onChange={(e) => setState({ name: e.target.value })}\n * />\n * <TextField\n * value={state.email}\n * onChange={(e) => setState({ email: e.target.value })}\n * />\n * <Button onClick={resetState}>Reset</Button>\n * </>\n * );\n * }\n * ```\n *\n * @param initialState - Initial state object\n * @returns State, setState, and resetState\n */\nexport function useSetState<T extends Record<string, unknown>>(initialState: T | (() => T)): UseSetStateReturn<T> {\n const [state, setInternalState] = useState<T>(initialState);\n\n const setState = useCallback<SetState<T>>((patch) => {\n setInternalState((prevState) => {\n const newPartial = typeof patch === 'function' ? patch(prevState) : patch;\n return { ...prevState, ...newPartial };\n });\n }, []);\n\n const resetState = useCallback(() => {\n setInternalState(typeof initialState === 'function' ? initialState() : initialState);\n }, [initialState]);\n\n return {\n state,\n setState,\n resetState,\n };\n}\n","'use client';\n\n/**\n * useMultiSelect Hook\n *\n * Multi-selection state management with keyboard support.\n *\n * @module @omnitron-dev/prism/core/hooks/use-multi-select\n */\n\nimport { useCallback, useMemo, useState } from 'react';\n\n/**\n * Options for useMultiSelect.\n */\nexport interface UseMultiSelectOptions<T> {\n /** Initial selected items */\n initial?: T[];\n /** Maximum selection count */\n maxSelections?: number;\n /** Callback when selection changes */\n onChange?: (selected: T[]) => void;\n}\n\n/**\n * Return type for useMultiSelect.\n */\nexport interface UseMultiSelectReturn<T> {\n /** Currently selected items */\n selected: T[];\n /** Number of selected items */\n count: number;\n /** Whether nothing is selected */\n isEmpty: boolean;\n /** Check if item is selected */\n isSelected: (item: T) => boolean;\n /** Toggle item selection */\n toggle: (item: T) => void;\n /** Select an item */\n select: (item: T) => void;\n /** Deselect an item */\n deselect: (item: T) => void;\n /** Select multiple items */\n selectMany: (items: T[]) => void;\n /** Deselect multiple items */\n deselectMany: (items: T[]) => void;\n /** Clear all selections */\n clear: () => void;\n /** Replace all selections */\n setSelected: (items: T[]) => void;\n /** Select all items from a list */\n selectAll: (allItems: T[]) => void;\n /** Check if all items are selected */\n isAllSelected: (allItems: T[]) => boolean;\n /** Check if some items are selected (for indeterminate state) */\n isPartiallySelected: (allItems: T[]) => boolean;\n}\n\n/**\n * useMultiSelect - Multi-selection state management.\n *\n * @example\n * ```tsx\n * function UserList() {\n * const users = ['Alice', 'Bob', 'Charlie'];\n * const selection = useMultiSelect<string>();\n *\n * return (\n * <>\n * <Checkbox\n * checked={selection.isAllSelected(users)}\n * indeterminate={selection.isPartiallySelected(users)}\n * onChange={() => {\n * if (selection.isAllSelected(users)) {\n * selection.clear();\n * } else {\n * selection.selectAll(users);\n * }\n * }}\n * />\n * {users.map((user) => (\n * <Checkbox\n * key={user}\n * checked={selection.isSelected(user)}\n * onChange={() => selection.toggle(user)}\n * />\n * ))}\n * <Button disabled={selection.isEmpty}>\n * Delete ({selection.count})\n * </Button>\n * </>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With objects and custom max\n * interface Item {\n * id: string;\n * name: string;\n * }\n *\n * function ItemPicker() {\n * const items: Item[] = [...];\n * const selection = useMultiSelect<string>({\n * maxSelections: 5,\n * onChange: (selected) => console.log('Selected:', selected),\n * });\n *\n * return items.map((item) => (\n * <Chip\n * key={item.id}\n * selected={selection.isSelected(item.id)}\n * onClick={() => selection.toggle(item.id)}\n * >\n * {item.name}\n * </Chip>\n * ));\n * }\n * ```\n *\n * @param options - Hook options\n * @returns Selection state and controls\n */\nexport function useMultiSelect<T>(options: UseMultiSelectOptions<T> = {}): UseMultiSelectReturn<T> {\n const { initial = [], maxSelections, onChange } = options;\n\n const [selected, setInternalSelected] = useState<T[]>(initial);\n\n const selectedSet = useMemo(() => new Set(selected), [selected]);\n\n const setSelected = useCallback(\n (items: T[]) => {\n const limited = maxSelections ? items.slice(0, maxSelections) : items;\n setInternalSelected(limited);\n onChange?.(limited);\n },\n [maxSelections, onChange]\n );\n\n const isSelected = useCallback((item: T) => selectedSet.has(item), [selectedSet]);\n\n const select = useCallback(\n (item: T) => {\n if (selectedSet.has(item)) return;\n if (maxSelections && selected.length >= maxSelections) return;\n\n const newSelected = [...selected, item];\n setInternalSelected(newSelected);\n onChange?.(newSelected);\n },\n [selected, selectedSet, maxSelections, onChange]\n );\n\n const deselect = useCallback(\n (item: T) => {\n if (!selectedSet.has(item)) return;\n\n const newSelected = selected.filter((s) => s !== item);\n setInternalSelected(newSelected);\n onChange?.(newSelected);\n },\n [selected, selectedSet, onChange]\n );\n\n const toggle = useCallback(\n (item: T) => {\n if (selectedSet.has(item)) {\n deselect(item);\n } else {\n select(item);\n }\n },\n [selectedSet, select, deselect]\n );\n\n const selectMany = useCallback(\n (items: T[]) => {\n const toAdd = items.filter((item) => !selectedSet.has(item));\n if (toAdd.length === 0) return;\n\n let newSelected = [...selected, ...toAdd];\n if (maxSelections) {\n newSelected = newSelected.slice(0, maxSelections);\n }\n\n setInternalSelected(newSelected);\n onChange?.(newSelected);\n },\n [selected, selectedSet, maxSelections, onChange]\n );\n\n const deselectMany = useCallback(\n (items: T[]) => {\n const toRemove = new Set(items);\n const newSelected = selected.filter((s) => !toRemove.has(s));\n\n if (newSelected.length === selected.length) return;\n\n setInternalSelected(newSelected);\n onChange?.(newSelected);\n },\n [selected, onChange]\n );\n\n const clear = useCallback(() => {\n if (selected.length === 0) return;\n setInternalSelected([]);\n onChange?.([]);\n }, [selected.length, onChange]);\n\n const selectAll = useCallback(\n (allItems: T[]) => {\n const limited = maxSelections ? allItems.slice(0, maxSelections) : allItems;\n setInternalSelected(limited);\n onChange?.(limited);\n },\n [maxSelections, onChange]\n );\n\n const isAllSelected = useCallback(\n (allItems: T[]) => {\n if (allItems.length === 0) return false;\n return allItems.every((item) => selectedSet.has(item));\n },\n [selectedSet]\n );\n\n const isPartiallySelected = useCallback(\n (allItems: T[]) => {\n if (allItems.length === 0) return false;\n const selectedCount = allItems.filter((item) => selectedSet.has(item)).length;\n return selectedCount > 0 && selectedCount < allItems.length;\n },\n [selectedSet]\n );\n\n return {\n selected,\n count: selected.length,\n isEmpty: selected.length === 0,\n isSelected,\n toggle,\n select,\n deselect,\n selectMany,\n deselectMany,\n clear,\n setSelected,\n selectAll,\n isAllSelected,\n isPartiallySelected,\n };\n}\n","'use client';\n\n/**\n * useLocalStorage Hook\n *\n * A hook for persisting state to localStorage.\n *\n * @module @omnitron-dev/prism/core/hooks/use-local-storage\n */\n\nimport { useState, useEffect, useCallback, useMemo } from 'react';\n\n/**\n * Check if localStorage is available.\n */\nfunction isLocalStorageAvailable(): boolean {\n try {\n const testKey = '__prism_test__';\n localStorage.setItem(testKey, testKey);\n localStorage.removeItem(testKey);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Serialize value to JSON string.\n */\nfunction serialize<T>(value: T): string {\n return JSON.stringify(value);\n}\n\n/**\n * Deserialize JSON string to value.\n */\nfunction deserialize<T>(value: string | null, fallback: T): T {\n if (value === null) return fallback;\n\n try {\n return JSON.parse(value) as T;\n } catch {\n return fallback;\n }\n}\n\n/**\n * Return type for useLocalStorage hook.\n */\nexport type UseLocalStorageReturn<T> = [\n /** Current value */\n T,\n /** Set value (accepts value or updater function) */\n (value: T | ((prev: T) => T)) => void,\n /** Remove value from storage */\n () => void,\n];\n\n/**\n * Hook for persisting state to localStorage.\n *\n * @param key - Storage key\n * @param initialValue - Initial value (used if no stored value exists)\n * @returns Tuple of [value, setValue, removeValue]\n *\n * @example\n * ```tsx\n * function Settings() {\n * const [theme, setTheme] = useLocalStorage('theme', 'light');\n *\n * return (\n * <Select\n * value={theme}\n * onChange={(e) => setTheme(e.target.value)}\n * >\n * <MenuItem value=\"light\">Light</MenuItem>\n * <MenuItem value=\"dark\">Dark</MenuItem>\n * </Select>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * function Counter() {\n * const [count, setCount] = useLocalStorage('counter', 0);\n *\n * return (\n * <>\n * <span>{count}</span>\n * <Button onClick={() => setCount((prev) => prev + 1)}>\n * Increment\n * </Button>\n * </>\n * );\n * }\n * ```\n */\nexport function useLocalStorage<T>(key: string, initialValue: T): UseLocalStorageReturn<T> {\n const storageAvailable = useMemo(() => isLocalStorageAvailable(), []);\n\n // Get initial state from localStorage or use initialValue\n const [storedValue, setStoredValue] = useState<T>(() => {\n if (!storageAvailable) return initialValue;\n\n try {\n const item = localStorage.getItem(key);\n return deserialize(item, initialValue);\n } catch (error) {\n console.warn(`Error reading localStorage key \"${key}\":`, error);\n return initialValue;\n }\n });\n\n // Update localStorage when state changes\n const setValue = useCallback(\n (value: T | ((prev: T) => T)) => {\n setStoredValue((prev) => {\n const newValue = value instanceof Function ? value(prev) : value;\n\n if (storageAvailable) {\n try {\n localStorage.setItem(key, serialize(newValue));\n } catch (error) {\n console.warn(`Error setting localStorage key \"${key}\":`, error);\n }\n }\n\n return newValue;\n });\n },\n [key, storageAvailable]\n );\n\n // Remove value from storage\n const removeValue = useCallback(() => {\n setStoredValue(initialValue);\n\n if (storageAvailable) {\n try {\n localStorage.removeItem(key);\n } catch (error) {\n console.warn(`Error removing localStorage key \"${key}\":`, error);\n }\n }\n }, [key, initialValue, storageAvailable]);\n\n // Sync with other tabs/windows\n useEffect(() => {\n if (!storageAvailable) {\n return undefined;\n }\n\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === key && event.newValue !== null) {\n setStoredValue(deserialize(event.newValue, initialValue));\n }\n };\n\n window.addEventListener('storage', handleStorageChange);\n\n return () => {\n window.removeEventListener('storage', handleStorageChange);\n };\n }, [key, initialValue, storageAvailable]);\n\n return [storedValue, setValue, removeValue];\n}\n\n/**\n * Hook for reading localStorage value (read-only).\n *\n * @param key - Storage key\n * @param fallback - Fallback value if key doesn't exist\n * @returns Current stored value\n */\nexport function useReadLocalStorage<T>(key: string, fallback: T): T {\n const [value, setValue] = useState<T>(() => {\n if (!isLocalStorageAvailable()) return fallback;\n\n try {\n const item = localStorage.getItem(key);\n return deserialize(item, fallback);\n } catch {\n return fallback;\n }\n });\n\n useEffect(() => {\n // SSR guard\n if (typeof window === 'undefined') return undefined;\n\n const handleStorageChange = (event: StorageEvent) => {\n if (event.key === key) {\n setValue(deserialize(event.newValue, fallback));\n }\n };\n\n window.addEventListener('storage', handleStorageChange);\n\n return () => {\n window.removeEventListener('storage', handleStorageChange);\n };\n }, [key, fallback]);\n\n return value;\n}\n","'use client';\n\n/**\n * useCopyToClipboard Hook\n *\n * Copy text to clipboard with success/error state tracking.\n *\n * @module @omnitron-dev/prism/core/hooks/use-copy-to-clipboard\n */\n\nimport { useCallback, useState, useRef, useEffect, useMemo } from 'react';\n\n/**\n * Copy state types.\n */\nexport type CopyState = 'idle' | 'success' | 'error';\n\n/**\n * Return type for useCopyToClipboard.\n */\nexport interface UseCopyToClipboardReturn {\n /** Current copy state */\n state: CopyState;\n /** Copied text (null if not copied) */\n copiedText: string | null;\n /** Copy text to clipboard */\n copy: (text: string) => Promise<boolean>;\n /** Reset state to idle */\n reset: () => void;\n}\n\n/**\n * Options for useCopyToClipboard.\n */\nexport interface UseCopyToClipboardOptions {\n /** Reset to idle after this many ms (default: 2000) */\n resetTimeout?: number;\n /** Callback on successful copy */\n onSuccess?: (text: string) => void;\n /** Callback on copy error */\n onError?: (error: Error) => void;\n}\n\n/**\n * useCopyToClipboard - Copy text to clipboard with state tracking.\n *\n * @example\n * ```tsx\n * function CopyButton({ text }: { text: string }) {\n * const { state, copy } = useCopyToClipboard();\n *\n * return (\n * <Button onClick={() => copy(text)}>\n * {state === 'success' ? 'Copied!' : 'Copy'}\n * </Button>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * // With callback\n * function ShareLink({ url }: { url: string }) {\n * const { state, copy } = useCopyToClipboard({\n * onSuccess: () => enqueueSnackbar('Link copied!'),\n * onError: (err) => enqueueSnackbar(`Failed to copy: ${err.message}`, { variant: 'error' }),\n * });\n *\n * return (\n * <IconButton onClick={() => copy(url)}>\n * {state === 'success' ? <CheckIcon /> : <CopyIcon />}\n * </IconButton>\n * );\n * }\n * ```\n *\n * @param options - Hook options\n * @returns Copy function and state\n */\nexport function useCopyToClipboard(options: UseCopyToClipboardOptions = {}): UseCopyToClipboardReturn {\n const { resetTimeout = 2000, onSuccess, onError } = options;\n\n const [state, setState] = useState<CopyState>('idle');\n const [copiedText, setCopiedText] = useState<string | null>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // Cleanup timeout on unmount\n useEffect(\n () => () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n },\n []\n );\n\n const reset = useCallback(() => {\n // Clear any pending timeout when manually resetting\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n setState('idle');\n setCopiedText(null);\n }, []);\n\n const copy = useCallback(\n async (text: string): Promise<boolean> => {\n // Clear any existing timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n\n // Check if clipboard API is available\n if (!navigator?.clipboard) {\n const error = new Error('Clipboard API not available');\n setState('error');\n onError?.(error);\n return false;\n }\n\n try {\n await navigator.clipboard.writeText(text);\n setCopiedText(text);\n setState('success');\n onSuccess?.(text);\n\n // Auto-reset after timeout\n if (resetTimeout > 0) {\n timeoutRef.current = setTimeout(reset, resetTimeout);\n }\n\n return true;\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Failed to copy');\n setState('error');\n onError?.(error);\n\n // Auto-reset after timeout\n if (resetTimeout > 0) {\n timeoutRef.current = setTimeout(reset, resetTimeout);\n }\n\n return false;\n }\n },\n [resetTimeout, reset, onSuccess, onError]\n );\n\n // Memoize return object to prevent unnecessary re-renders\n return useMemo(\n () => ({\n state,\n copiedText,\n copy,\n reset,\n }),\n [state, copiedText, copy, reset]\n );\n}\n","'use client';\n\n/**\n * useDebounce Hook\n *\n * A hook for debouncing values.\n *\n * @module @omnitron-dev/prism/core/hooks/use-debounce\n */\n\nimport { useState, useEffect, useRef, useCallback } from 'react';\n\n/**\n * Hook for debouncing a value.\n *\n * @param value - Value to debounce\n * @param delay - Debounce delay in milliseconds (default: 500)\n * @returns Debounced value\n *\n * @example\n * ```tsx\n * function SearchInput() {\n * const [query, setQuery] = useState('');\n * const debouncedQuery = useDebounce(query, 300);\n *\n * useEffect(() => {\n * if (debouncedQuery) {\n * search(debouncedQuery);\n * }\n * }, [debouncedQuery]);\n *\n * return (\n * <TextField\n * value={query}\n * onChange={(e) => setQuery(e.target.value)}\n * placeholder=\"Search...\"\n * />\n * );\n * }\n * ```\n */\nexport function useDebounce<T>(value: T, delay = 500): T {\n const [debouncedValue, setDebouncedValue] = useState<T>(value);\n\n useEffect(() => {\n const timer = setTimeout(() => {\n setDebouncedValue(value);\n }, delay);\n\n return () => {\n clearTimeout(timer);\n };\n }, [value, delay]);\n\n return debouncedValue;\n}\n\n/**\n * Hook for debouncing a callback function.\n *\n * @param callback - Function to debounce\n * @param delay - Debounce delay in milliseconds (default: 500)\n * @returns Debounced callback and cancel function\n *\n * @example\n * ```tsx\n * function AutoSave() {\n * const [content, setContent] = useState('');\n *\n * const { debouncedCallback: save, cancel } = useDebounceCallback(\n * async (text: string) => {\n * await api.saveDocument(text);\n * },\n * 1000\n * );\n *\n * const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n * setContent(e.target.value);\n * save(e.target.value);\n * };\n *\n * return <textarea value={content} onChange={handleChange} />;\n * }\n * ```\n */\nexport function useDebounceCallback<T extends (...args: never[]) => unknown>(\n callback: T,\n delay = 500\n): {\n debouncedCallback: (...args: Parameters<T>) => void;\n cancel: () => void;\n flush: () => void;\n} {\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const callbackRef = useRef<T>(callback);\n const argsRef = useRef<Parameters<T> | null>(null);\n\n // Update callback ref on each render\n callbackRef.current = callback;\n\n const cancel = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n argsRef.current = null;\n }, []);\n\n const flush = useCallback(() => {\n if (timeoutRef.current && argsRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n callbackRef.current(...(argsRef.current as Parameters<T>));\n argsRef.current = null;\n }\n }, []);\n\n const debouncedCallback = useCallback(\n (...args: Parameters<T>) => {\n argsRef.current = args;\n\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n\n timeoutRef.current = setTimeout(() => {\n callbackRef.current(...args);\n timeoutRef.current = null;\n argsRef.current = null;\n }, delay);\n },\n [delay]\n );\n\n // Cleanup on unmount\n useEffect(\n () => () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n }\n },\n []\n );\n\n return { debouncedCallback, cancel, flush };\n}\n","'use client';\n\n/**\n * useCountdown Hook\n *\n * Countdown timer with start, pause, and reset controls.\n *\n * @module @omnitron-dev/prism/core/hooks/use-countdown\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\n/**\n * Countdown state.\n */\nexport interface CountdownState {\n /** Remaining time in seconds */\n seconds: number;\n /** Whether countdown is running */\n isRunning: boolean;\n /** Whether countdown has finished */\n isFinished: boolean;\n}\n\n/**\n * Countdown controls.\n */\nexport interface CountdownControls {\n /** Start or resume the countdown */\n start: () => void;\n /** Pause the countdown */\n pause: () => void;\n /** Reset to initial duration */\n reset: () => void;\n /** Set a new duration and reset */\n setDuration: (seconds: number) => void;\n}\n\n/**\n * Return type for useCountdown.\n */\nexport interface UseCountdownReturn extends CountdownState, CountdownControls {\n /** Formatted time string (MM:SS or HH:MM:SS) */\n formatted: string;\n /** Time parts for custom formatting */\n parts: {\n hours: number;\n minutes: number;\n seconds: number;\n };\n}\n\n/**\n * Options for useCountdown.\n */\nexport interface UseCountdownOptions {\n /** Initial duration in seconds */\n duration: number;\n /** Auto-start countdown (default: false) */\n autoStart?: boolean;\n /** Callback when countdown finishes */\n onComplete?: () => void;\n /** Callback on each tick */\n onTick?: (remaining: number) => void;\n /** Tick interval in ms (default: 1000) */\n interval?: number;\n}\n\n/**\n * Format seconds into time parts.\n */\nfunction getTimeParts(totalSeconds: number): { hours: number; minutes: number; seconds: number } {\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n return { hours, minutes, seconds };\n}\n\n/**\n * Format seconds into a time string.\n */\nfunction formatTime(totalSeconds: number): string {\n const { hours, minutes, seconds } = getTimeParts(totalSeconds);\n const pad = (n: number) => n.toString().padStart(2, '0');\n\n if (hours > 0) {\n return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}`;\n }\n return `${pad(minutes)}:${pad(seconds)}`;\n}\n\n/**\n * useCountdown - Countdown timer hook.\n *\n * @example\n * ```tsx\n * function OTPTimer() {\n * const { formatted, isFinished, reset } = useCountdown({\n * duration: 60,\n * autoStart: true,\n * onComplete: () => console.log('Timer finished!'),\n * });\n *\n * return (\n * <div>\n * {isFinished ? (\n * <Button onClick={reset}>Resend OTP</Button>\n * ) : (\n * <Typography>Resend in {formatted}</Typography>\n * )}\n * </div>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * function QuizTimer() {\n * const countdown = useCountdown({\n * duration: 300, // 5 minutes\n * onTick: (remaining) => {\n * if (remaining === 60) {\n * showWarning('1 minute remaining!');\n * }\n * },\n * onComplete: () => submitQuiz(),\n * });\n *\n * return (\n * <Box>\n * <Typography variant=\"h4\">{countdown.formatted}</Typography>\n * <Button onClick={countdown.start}>Start</Button>\n * <Button onClick={countdown.pause}>Pause</Button>\n * <Button onClick={countdown.reset}>Reset</Button>\n * </Box>\n * );\n * }\n * ```\n *\n * @param options - Countdown options\n * @returns Countdown state and controls\n */\nexport function useCountdown(options: UseCountdownOptions): UseCountdownReturn {\n const { duration, autoStart = false, onComplete, onTick, interval = 1000 } = options;\n\n const [seconds, setSeconds] = useState(duration);\n const [isRunning, setIsRunning] = useState(autoStart);\n const intervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n const onCompleteRef = useRef(onComplete);\n const onTickRef = useRef(onTick);\n\n // Update refs to avoid stale closures\n useEffect(() => {\n onCompleteRef.current = onComplete;\n onTickRef.current = onTick;\n }, [onComplete, onTick]);\n\n // Cleanup interval on unmount\n useEffect(\n () => () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n }\n },\n []\n );\n\n // Run countdown\n useEffect(() => {\n if (!isRunning) {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n return undefined;\n }\n\n intervalRef.current = setInterval(() => {\n setSeconds((prev) => {\n const next = prev - 1;\n onTickRef.current?.(next);\n\n if (next <= 0) {\n setIsRunning(false);\n onCompleteRef.current?.();\n return 0;\n }\n\n return next;\n });\n }, interval);\n\n return () => {\n if (intervalRef.current) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n };\n }, [isRunning, interval]);\n\n const start = useCallback(() => {\n if (seconds > 0) {\n setIsRunning(true);\n }\n }, [seconds]);\n\n const pause = useCallback(() => {\n setIsRunning(false);\n }, []);\n\n const reset = useCallback(() => {\n setIsRunning(false);\n setSeconds(duration);\n }, [duration]);\n\n const setDuration = useCallback((newDuration: number) => {\n setIsRunning(false);\n setSeconds(newDuration);\n }, []);\n\n return {\n seconds,\n isRunning,\n isFinished: seconds <= 0,\n formatted: formatTime(seconds),\n parts: getTimeParts(seconds),\n start,\n pause,\n reset,\n setDuration,\n };\n}\n","'use client';\n\n/**\n * useBreakpoints Hook\n *\n * A hook for responsive breakpoint detection.\n *\n * @module @omnitron-dev/prism/core/hooks/use-breakpoints\n */\n\nimport { useMemo } from 'react';\nimport { useTheme } from '@mui/material/styles';\nimport useMediaQuery from '@mui/material/useMediaQuery';\nimport type { Breakpoint } from '@mui/material/styles';\n\n/**\n * Breakpoint values in pixels.\n */\nexport interface BreakpointValues {\n xs: number;\n sm: number;\n md: number;\n lg: number;\n xl: number;\n}\n\n/**\n * Breakpoint state.\n */\nexport interface BreakpointState {\n /** Current breakpoint name */\n current: Breakpoint;\n /** Is extra-small screen (< sm) */\n isXs: boolean;\n /** Is small screen (>= sm, < md) */\n isSm: boolean;\n /** Is medium screen (>= md, < lg) */\n isMd: boolean;\n /** Is large screen (>= lg, < xl) */\n isLg: boolean;\n /** Is extra-large screen (>= xl) */\n isXl: boolean;\n /** Is mobile (< md) */\n isMobile: boolean;\n /** Is tablet (>= md, < lg) */\n isTablet: boolean;\n /** Is desktop (>= lg) */\n isDesktop: boolean;\n}\n\n/**\n * Return type for useBreakpoints hook.\n */\nexport interface UseBreakpointsReturn extends BreakpointState {\n /** Check if viewport is >= breakpoint */\n up: (breakpoint: Breakpoint) => boolean;\n /** Check if viewport is < breakpoint */\n down: (breakpoint: Breakpoint) => boolean;\n /** Check if viewport is exactly at breakpoint range */\n only: (breakpoint: Breakpoint) => boolean;\n /** Check if viewport is between two breakpoints */\n between: (start: Breakpoint, end: Breakpoint) => boolean;\n /** Breakpoint values in pixels */\n values: BreakpointValues;\n}\n\n/**\n * Hook for responsive breakpoint detection.\n *\n * @returns Breakpoint state and helper functions\n *\n * @example\n * ```tsx\n * function ResponsiveLayout() {\n * const { isMobile, isDesktop, up, current } = useBreakpoints();\n *\n * return (\n * <Box>\n * {isMobile && <MobileNav />}\n * {isDesktop && <DesktopSidebar />}\n * <Typography>Current: {current}</Typography>\n * {up('md') && <AdvancedFeatures />}\n * </Box>\n * );\n * }\n * ```\n *\n * @example\n * ```tsx\n * function DataGrid() {\n * const { between, only } = useBreakpoints();\n *\n * const columns = useMemo(() => {\n * if (only('xs')) return 1;\n * if (between('sm', 'md')) return 2;\n * return 3;\n * }, [only, between]);\n *\n * return <Grid columns={columns}>...</Grid>;\n * }\n * ```\n */\nexport function useBreakpoints(): UseBreakpointsReturn {\n const theme = useTheme();\n\n // Media queries for each breakpoint\n const isXsUp = useMediaQuery(theme.breakpoints.up('xs'));\n const isSmUp = useMediaQuery(theme.breakpoints.up('sm'));\n const isMdUp = useMediaQuery(theme.breakpoints.up('md'));\n const isLgUp = useMediaQuery(theme.breakpoints.up('lg'));\n const isXlUp = useMediaQuery(theme.breakpoints.up('xl'));\n\n // Derive current breakpoint and states\n const { current, isXs, isSm, isMd, isLg, isXl } = useMemo(() => {\n let currentBreakpoint: Breakpoint = 'xs';\n if (isXlUp) currentBreakpoint = 'xl';\n else if (isLgUp) currentBreakpoint = 'lg';\n else if (isMdUp) currentBreakpoint = 'md';\n else if (isSmUp) currentBreakpoint = 'sm';\n\n return {\n current: currentBreakpoint,\n isXs: !isSmUp,\n isSm: isSmUp && !isMdUp,\n isMd: isMdUp && !isLgUp,\n isLg: isLgUp && !isXlUp,\n isXl: isXlUp,\n };\n }, [isXsUp, isSmUp, isMdUp, isLgUp, isXlUp]);\n\n // Semantic breakpoints\n const isMobile = !isMdUp;\n const isTablet = isMdUp && !isLgUp;\n const isDesktop = isLgUp;\n\n // Helper functions\n const up = useMemo(\n () => (breakpoint: Breakpoint) => {\n switch (breakpoint) {\n case 'xs':\n return isXsUp;\n case 'sm':\n return isSmUp;\n case 'md':\n return isMdUp;\n case 'lg':\n return isLgUp;\n case 'xl':\n return isXlUp;\n default:\n return false;\n }\n },\n [isXsUp, isSmUp, isMdUp, isLgUp, isXlUp]\n );\n\n const down = useMemo(\n () => (breakpoint: Breakpoint) => {\n switch (breakpoint) {\n case 'xs':\n return false; // Nothing is below xs\n case 'sm':\n return !isSmUp;\n case 'md':\n return !isMdUp;\n case 'lg':\n return !isLgUp;\n case 'xl':\n return !isXlUp;\n default:\n return false;\n }\n },\n [isSmUp, isMdUp, isLgUp, isXlUp]\n );\n\n const only = useMemo(\n () => (breakpoint: Breakpoint) => {\n switch (breakpoint) {\n case 'xs':\n return isXs;\n case 'sm':\n return isSm;\n case 'md':\n return isMd;\n case 'lg':\n return isLg;\n case 'xl':\n return isXl;\n default:\n return false;\n }\n },\n [isXs, isSm, isMd, isLg, isXl]\n );\n\n const between = useMemo(\n () => (start: Breakpoint, end: Breakpoint) => {\n const breakpointOrder: Breakpoint[] = ['xs', 'sm', 'md', 'lg', 'xl'];\n const startIndex = breakpointOrder.indexOf(start);\n const endIndex = breakpointOrder.indexOf(end);\n const currentIndex = breakpointOrder.indexOf(current);\n\n return currentIndex >= startIndex && currentIndex <= endIndex;\n },\n [current]\n );\n\n // Breakpoint values\n const values = useMemo<BreakpointValues>(\n () => ({\n xs: theme.breakpoints.values.xs,\n sm: theme.breakpoints.values.sm,\n md: theme.breakpoints.values.md,\n lg: theme.breakpoints.values.lg,\n xl: theme.breakpoints.values.xl,\n }),\n [theme.breakpoints.values]\n );\n\n return {\n current,\n isXs,\n isSm,\n isMd,\n isLg,\n isXl,\n isMobile,\n isTablet,\n isDesktop,\n up,\n down,\n only,\n between,\n values,\n };\n}\n","'use client';\n\n/**\n * useIsClient Hook\n *\n * Detects client-side rendering vs server-side rendering.\n * Returns false during SSR, true after hydration.\n *\n * @module @omnitron-dev/prism/core/hooks\n */\n\nimport { useState, useEffect } from 'react';\n\n/**\n * Return type for useIsClient hook.\n */\nexport type UseIsClientReturn = boolean;\n\n/**\n * Hook to detect client-side rendering.\n *\n * @returns {boolean} True if running on client, false during SSR\n *\n * @example\n * ```tsx\n * function ClientOnlyComponent() {\n * const isClient = useIsClient();\n *\n * if (!isClient) {\n * return <Skeleton />;\n * }\n *\n * return <BrowserOnlyFeature />;\n * }\n * ```\n */\nexport function useIsClient(): UseIsClientReturn {\n const [isClient, setIsClient] = useState(false);\n\n useEffect(() => {\n setIsClient(true);\n }, []);\n\n return isClient;\n}\n","'use client';\n\n/**\n * useMounted Hook\n *\n * Tracks component mount state for async operations.\n *\n * @module @omnitron-dev/prism/core/hooks\n */\n\nimport { useEffect, useRef, useCallback } from 'react';\n\n/**\n * Return type for useMounted hook.\n */\nexport interface UseMountedReturn {\n /** Check if component is currently mounted */\n isMounted: () => boolean;\n}\n\n/**\n * Hook to check if a component is currently mounted.\n * Useful for preventing state updates on unmounted components.\n *\n * @returns {UseMountedReturn} Mount state checker\n *\n * @example\n * ```tsx\n * function AsyncComponent() {\n * const [data, setData] = useState(null);\n * const { isMounted } = useMounted();\n *\n * useEffect(() => {\n * fetchData().then((result) => {\n * if (isMounted()) {\n * setData(result);\n * }\n * });\n * }, [isMounted]);\n *\n * return <div>{data}</div>;\n * }\n * ```\n */\nexport function useMounted(): UseMountedReturn {\n const mountedRef = useRef(false);\n\n useEffect(() => {\n mountedRef.current = true;\n\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n const isMounted = useCallback(() => mountedRef.current, []);\n\n return { isMounted };\n}\n","'use client';\n\n/**\n * usePrevious Hook\n *\n * Tracks the previous value of a state or prop.\n *\n * @module @omnitron-dev/prism/core/hooks\n */\n\nimport { useRef, useEffect } from 'react';\n\n/**\n * Hook to track the previous value.\n *\n * @template T - Type of the value\n * @param {T} value - Current value to track\n * @returns {T | undefined} Previous value (undefined on first render)\n *\n * @example\n * ```tsx\n * function Counter() {\n * const [count, setCount] = useState(0);\n * const prevCount = usePrevious(count);\n *\n * return (\n * <div>\n * Current: {count}, Previous: {prevCount ?? 'N/A'}\n * </div>\n * );\n * }\n * ```\n */\nexport function usePrevious<T>(value: T): T | undefined {\n const ref = useRef<T | undefined>(undefined);\n\n useEffect(() => {\n ref.current = value;\n }, [value]);\n\n return ref.current;\n}\n","'use client';\n\n/**\n * useEventListener Hook\n *\n * Attaches event listeners with automatic cleanup.\n *\n * @module @omnitron-dev/prism/core/hooks\n */\n\nimport { useEffect, useRef } from 'react';\nimport type { RefObject } from 'react';\n\n/**\n * Supported event maps for different targets.\n */\ntype WindowEventMap = globalThis.WindowEventMap;\ntype HTMLElementEventMap = globalThis.HTMLElementEventMap;\ntype DocumentEventMap = globalThis.DocumentEventMap;\n\n/**\n * Hook to attach event listeners with automatic cleanup.\n *\n * @template K - Event type key\n * @param {K} eventName - Name of the event\n * @param {function} handler - Event handler\n * @param {RefObject<HTMLElement>} [element] - Target element (defaults to window)\n * @param {AddEventListenerOptions} [options] - Event listener options\n *\n * @example\n * ```tsx\n * // Window event\n * function ScrollTracker() {\n * useEventListener('scroll', () => console.log('Scrolled!'));\n * return null;\n * }\n *\n * // Element event\n * function ClickTracker() {\n * const ref = useRef<HTMLDivElement>(null);\n * useEventListener('click', (e) => console.log('Clicked!', e), ref);\n * return <div ref={ref}>Click me</div>;\n * }\n * ```\n */\nexport function useEventListener<K extends keyof WindowEventMap>(\n eventName: K,\n handler: (event: WindowEventMap[K]) => void,\n element?: undefined,\n options?: AddEventListenerOptions\n): void;\n\nexport function useEventListener<K extends keyof HTMLElementEventMap>(\n eventName: K,\n handler: (event: HTMLElementEventMap[K]) => void,\n element: RefObject<HTMLElement | null>,\n options?: AddEventListenerOptions\n): void;\n\nexport function useEventListener<K extends keyof DocumentEventMap>(\n eventName: K,\n handler: (event: DocumentEventMap[K]) => void,\n element: RefObject<Document>,\n options?: AddEventListenerOptions\n): void;\n\nexport function useEventListener(\n eventName: string,\n handler: (event: Event) => void,\n element?: RefObject<HTMLElement | Document | null>,\n options?: AddEventListenerOptions\n): void {\n const savedHandler = useRef(handler);\n\n useEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n useEffect(() => {\n const targetElement = element?.current ?? window;\n\n if (!targetElement?.addEventListener) {\n return undefined;\n }\n\n const eventListener = (event: Event) => savedHandler.current(event);\n\n targetElement.addEventListener(eventName, eventListener, options);\n\n return () => {\n targetElement.removeEventListener(eventName, eventListener, options);\n };\n }, [eventName, element, options]);\n}\n","'use client';\n\n/**\n * useClickOutside Hook\n *\n * Detects clicks outside of a specified element.\n *\n * @module @omnitron-dev/prism/core/hooks\n */\n\nimport { useEffect, useRef } from 'react';\nimport type { RefObject } from 'react';\n\n/**\n * Hook to detect clicks outside of an element.\n *\n * @template T - Element type (defaults to HTMLElement)\n * @param {function} handler - Callback when clicked outside\n * @param {RefObject<T>} [providedRef] - Optional external ref\n * @returns {RefObject<T>} Ref to attach to the element\n *\n * @example\n * ```tsx\n * function Dropdown() {\n * const [isOpen, setIsOpen] = useState(false);\n * const ref = useClickOutside<HTMLDivElement>(() => setIsOpen(false));\n *\n * return (\n * <div ref={ref}>\n * <button onClick={() => setIsOpen(true)}>Open</button>\n * {isOpen && <DropdownMenu />}\n * </div>\n * );\n * }\n * ```\n */\nexport function useClickOutside<T extends HTMLElement = HTMLElement>(\n handler: (event: MouseEvent | TouchEvent) => void,\n providedRef?: RefObject<T | null>\n): RefObject<T | null> {\n const internalRef = useRef<T | null>(null);\n const ref = providedRef ?? internalRef;\n\n // Use ref to always call latest handler without re-attaching listeners\n const handlerRef = useRef(handler);\n handlerRef.current = handler;\n\n useEffect(() => {\n const listener = (event: MouseEvent | TouchEvent) => {\n const element = ref.current;\n\n // Do nothing if clicking ref's element or its descendants\n if (!element || element.contains(event.target as Node)) {\n return;\n }\n\n handlerRef.current(event);\n };\n\n document.addEventListener('mousedown', listener);\n document.addEventListener('touchstart', listener);\n\n return () => {\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n };\n }, [ref]);\n\n return ref;\n}\n","'use client';\n\n/**\n * useInterval Hook\n *\n * Declarative interval hook with automatic cleanup.\n *\n * @module @omnitron-dev/prism/core/hooks\n */\n\nimport { useEffect, useRef } from 'react';\n\n/**\n * Hook to run a callback at a specified interval.\n *\n * @param {function} callback - Function to call on each interval\n * @param {number | null} delay - Interval delay in ms (null to pause)\n *\n * @example\n * ```tsx\n * function Timer() {\n * const [seconds, setSeconds] = useState(0);\n * const [isRunning, setIsRunning] = useState(true);\n *\n * useInterval(\n * () => setSeconds((s) => s + 1),\n * isRunning ? 1000 : null\n * );\n *\n * return (\n * <div>\n * <p>Seconds: {seconds}</p>\n * <button onClick={() => setIsRunning(!isRunning)}>\n * {isRunning ? 'Pause' : 'Resume'}\n * </button>\n * </div>\n * );\n * }\n * ```\n */\nexport function useInterval(callback: () => void, delay: number | null): void {\n const savedCallback = useRef(callback);\n\n // Remember the latest callback\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n // Set up the interval\n useEffect(() => {\n if (delay === null) {\n return undefined;\n }\n\n const tick = () => savedCallback.current();\n const id = setInterval(tick, delay);\n\n return () => clearInterval(id);\n }, [delay]);\n}\n","'use client';\n\n/**\n * useTimeout Hook\n *\n * Declarative timeout hook with automatic cleanup.\n *\n * @module @omnitron-dev/prism/core/hooks\n */\n\nimport { useEffect, useRef, useCallback, useState, useMemo } from 'react';\n\n/**\n * Return type for useTimeout hook.\n */\nexport interface UseTimeoutReturn {\n /** Reset the timeout */\n reset: () => void;\n /** Clear the timeout */\n clear: () => void;\n /** Whether the timeout is active */\n isActive: boolean;\n}\n\n/**\n * Hook to run a callback after a specified delay.\n *\n * @param {function} callback - Function to call after delay\n * @param {number} delay - Delay in milliseconds\n * @returns {UseTimeoutReturn} Timeout controls\n *\n * @example\n * ```tsx\n * function AutoSave() {\n * const [content, setContent] = useState('');\n * const { reset } = useTimeout(() => {\n * saveContent(content);\n * }, 3000);\n *\n * const handleChange = (value: string) => {\n * setContent(value);\n * reset(); // Reset timer on each change\n * };\n *\n * return <textarea value={content} onChange={(e) => handleChange(e.target.value)} />;\n * }\n * ```\n */\nexport function useTimeout(callback: () => void, delay: number): UseTimeoutReturn {\n const savedCallback = useRef(callback);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [isActive, setIsActive] = useState(true);\n\n // Remember the latest callback\n useEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n\n const clear = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n setIsActive(false);\n }\n }, []);\n\n const reset = useCallback(() => {\n clear();\n timeoutRef.current = setTimeout(() => {\n savedCallback.current();\n setIsActive(false);\n }, delay);\n setIsActive(true);\n }, [clear, delay]);\n\n // Set up the timeout\n useEffect(() => {\n reset();\n return clear;\n }, [reset, clear]);\n\n // Memoize return object to prevent unnecessary re-renders in consumers\n return useMemo(() => ({ reset, clear, isActive }), [reset, clear, isActive]);\n}\n"]}