@moondreamsdev/dreamer-ui 1.7.16 → 1.7.17-test.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/dist/{Toast-hraOWsUl.cjs → Toast-Ck5u3kQt.cjs} +2 -2
- package/dist/Toast-Ck5u3kQt.cjs.map +1 -0
- package/dist/{Toast-aRIuMq3v.js → Toast-GnTYRmnY.js} +17 -12
- package/dist/Toast-GnTYRmnY.js.map +1 -0
- package/dist/components.cjs.js +2 -2
- package/dist/components.esm.js +62 -62
- package/dist/providers.cjs.js +1 -1
- package/dist/providers.cjs.js.map +1 -1
- package/dist/providers.esm.js +5 -5
- package/dist/providers.esm.js.map +1 -1
- package/package.json +1 -1
- package/dist/Toast-aRIuMq3v.js.map +0 -1
- package/dist/Toast-hraOWsUl.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.esm.js","sources":["../src/providers/ActionModalProvider.tsx","../src/providers/ToastProvider.tsx","../src/providers/ThemeProvider.tsx","../src/providers/DreamerUIProvider.tsx"],"sourcesContent":["import { ReactNode, useCallback, useState } from 'react';\nimport { ActionModal } from '../components';\nimport { ActionModalContext } from '../hooks';\n\nexport interface ConfirmOptions {\n /** The title displayed in the confirmation modal header */\n title?: string;\n /** The main message content displayed in the modal body */\n message: ReactNode;\n /** Text for the confirm/accept button. Defaults to \"Confirm\" */\n confirmText?: string;\n /** Text for the cancel/dismiss button. Defaults to \"Cancel\" */\n cancelText?: string;\n /** Whether the action is destructive, affects button styling */\n destructive?: boolean;\n}\n\nexport interface AlertOptions {\n /** The title displayed in the alert modal header */\n title?: string;\n /** The main message content displayed in the modal body */\n message: ReactNode;\n /** Text for the confirm/dismiss button. Defaults to \"OK\" */\n confirmText?: string;\n /** Whether the alert represents a destructive action, affects button styling */\n destructive?: boolean;\n}\n\nexport interface ActionModalContextValue {\n /** Shows a confirmation modal and returns a promise that resolves to true if confirmed, false if cancelled */\n confirm: (options: ConfirmOptions) => Promise<boolean>;\n /** Shows an alert modal and returns a promise that resolves when dismissed */\n alert: (options: AlertOptions) => Promise<void>;\n}\n\ninterface ActionModalState {\n isOpen: boolean;\n type: 'alert' | 'confirm';\n title?: string;\n message: ReactNode;\n confirmText?: string;\n cancelText?: string;\n destructive?: boolean;\n resolve?: ((value: boolean) => void) | (() => void);\n}\n\nexport function ActionModalProvider({ children }: { children: ReactNode }) {\n const [modalState, setModalState] = useState<ActionModalState | null>(null);\n\n const confirm = useCallback((options: ConfirmOptions): Promise<boolean> => {\n return new Promise((resolve) => {\n setModalState({\n isOpen: true,\n type: 'confirm',\n title: options.title,\n message: options.message,\n confirmText: options.confirmText,\n cancelText: options.cancelText,\n destructive: options.destructive,\n resolve,\n });\n });\n }, []);\n\n const alert = useCallback((options: AlertOptions): Promise<void> => {\n return new Promise((resolve) => {\n setModalState({\n isOpen: true,\n type: 'alert',\n title: options.title,\n message: options.message,\n confirmText: options.confirmText,\n destructive: options.destructive,\n resolve,\n });\n });\n }, []);\n\n const handleClose = useCallback(() => {\n if (modalState?.resolve) {\n if (modalState.type === 'confirm') {\n (modalState.resolve as (value: boolean) => void)(false);\n } else {\n (modalState.resolve as () => void)();\n }\n }\n setModalState(null);\n }, [modalState]);\n\n const handleConfirm = useCallback(() => {\n if (modalState?.resolve) {\n if (modalState.type === 'confirm') {\n (modalState.resolve as (value: boolean) => void)(true);\n } else {\n (modalState.resolve as () => void)();\n }\n }\n setModalState(null);\n }, [modalState]);\n\n const contextValue: ActionModalContextValue = {\n confirm,\n alert,\n };\n\n return (\n <ActionModalContext.Provider value={contextValue}>\n {children}\n {modalState && modalState.type === 'alert' && (\n <ActionModal\n type='alert'\n isOpen={modalState.isOpen}\n onClose={handleClose}\n title={modalState.title}\n message={modalState.message}\n confirmText={modalState.confirmText}\n destructive={modalState.destructive}\n onConfirm={handleConfirm}\n className='bg-white dark:bg-gray-800 rounded-lg'\n />\n )}\n {modalState && modalState.type === 'confirm' && (\n <ActionModal\n type='confirm'\n isOpen={modalState.isOpen}\n onClose={handleClose}\n title={modalState.title}\n message={modalState.message}\n confirmText={modalState.confirmText}\n cancelText={modalState.cancelText}\n destructive={modalState.destructive}\n onConfirm={handleConfirm}\n className='bg-white dark:bg-gray-800 rounded-lg'\n />\n )}\n </ActionModalContext.Provider>\n );\n}\n","import { ReactNode, useCallback, useState } from 'react';\nimport { Toast, ToastData, ToastType } from '../components/toast';\nimport { AddToastOptions, ToastContextValue } from '../hooks/useToast';\nimport { ToastContext } from '../hooks/useToast';\nimport { join } from '../utils';\n\nexport interface ToastProviderProps {\n /** React children to be wrapped by the toast provider */\n children: ReactNode;\n /** Custom toast types with their own styling and icons */\n customTypes?: Record<string, { className: string; icon?: ReactNode }>;\n /** Custom toast component to replace the default Toast component */\n customComponent?: React.ComponentType<ToastData>;\n /** Position where toasts should appear on screen */\n position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center';\n /** Maximum number of toasts to display at once */\n maxToasts?: number;\n}\n\nconst positionClasses = {\n 'top-right': 'top-4 right-4',\n 'top-left': 'top-4 left-4',\n 'bottom-right': 'bottom-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'top-center': 'top-4 left-1/2 -translate-x-1/2',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n};\n\nexport function ToastProvider({\n children,\n customTypes,\n customComponent,\n position = 'top-right',\n maxToasts = 5,\n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<ToastData[]>([]);\n\n const addToast = useCallback(\n (options: AddToastOptions) => {\n const generatedId = `toast-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const id = options.id || generatedId;\n\n const newToast: ToastData = {\n id,\n title: options.title,\n description: options.description,\n type: (options.type as ToastType) || 'info',\n action: options.action,\n duration: options.duration ?? 5000,\n };\n\n setToasts((prevToasts) => {\n const updatedToasts = [newToast, ...prevToasts];\n // Keep only the most recent toasts if we exceed maxToasts\n return updatedToasts.slice(0, maxToasts);\n });\n\n return id;\n },\n [maxToasts]\n );\n\n const removeToast = useCallback((id: string) => {\n setToasts((prevToasts) => prevToasts.filter((toast) => toast.id !== id));\n }, []);\n\n const contextValue: ToastContextValue = {\n addToast,\n removeToast,\n toasts,\n };\n\n return (\n <ToastContext.Provider value={contextValue}>\n {children}\n\n <div\n className={join('fixed z-50 pointer-events-none max-w-sm w-full space-y-2', positionClasses[position])}\n role='region'\n aria-label='Notifications'\n >\n {toasts.map((toast) => (\n <div key={toast.id} className='pointer-events-auto'>\n <Toast {...toast} onRemove={removeToast} customTypes={customTypes} customComponent={customComponent} />\n </div>\n ))}\n </div>\n </ToastContext.Provider>\n );\n}\n","import { ReactNode, useCallback, useEffect, useState } from 'react';\nimport { Theme, ThemeContext, ThemeContextValue } from '../hooks/useTheme';\n\nexport interface ThemeProviderProps {\n /** React children to be wrapped by the theme provider */\n children: ReactNode;\n /** The default theme to use on first load. Defaults to 'system' */\n defaultTheme?: Theme;\n /** Local storage key used to persist the theme selection. Defaults to 'dreamer-ui-theme' */\n storageKey?: string;\n /** HTML attribute name to set on document root. Defaults to 'data-theme' */\n attribute?: string;\n /** Whether to respect system theme when theme is set to 'system'. Defaults to true */\n respectSystem?: boolean;\n}\n\nexport function ThemeProvider({\n children,\n defaultTheme = 'system',\n storageKey = 'dreamer-ui-theme',\n attribute = 'data-theme',\n respectSystem = true,\n}: ThemeProviderProps) {\n const [theme, setThemeState] = useState<Theme>(() => {\n if (typeof window === 'undefined') {\n return defaultTheme;\n }\n\n const stored = localStorage.getItem(storageKey);\n if (stored && ['light', 'dark', 'system'].includes(stored)) {\n return stored as Theme;\n }\n\n return defaultTheme;\n });\n\n const [resolvedTheme, setResolvedTheme] = useState<'light' | 'dark'>(() => {\n if (typeof window === 'undefined') {\n return 'light';\n }\n\n if (theme === 'system' && respectSystem) {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n\n return theme === 'dark' ? 'dark' : 'light';\n });\n\n const setTheme = useCallback(\n (newTheme: Theme) => {\n setThemeState(newTheme);\n if (typeof window !== 'undefined') {\n localStorage.setItem(storageKey, newTheme);\n }\n },\n [storageKey]\n );\n\n const toggleTheme = useCallback(() => {\n const newTheme = resolvedTheme === 'light' ? 'dark' : 'light';\n setTheme(newTheme);\n }, [resolvedTheme, setTheme]);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const updateResolvedTheme = () => {\n if (theme === 'system' && respectSystem) {\n const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n setResolvedTheme(systemTheme);\n } else {\n setResolvedTheme(theme === 'dark' ? 'dark' : 'light');\n }\n };\n\n updateResolvedTheme();\n\n if (theme === 'system' && respectSystem) {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n mediaQuery.addEventListener('change', updateResolvedTheme);\n return () => mediaQuery.removeEventListener('change', updateResolvedTheme);\n }\n }, [theme, respectSystem]);\n\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const root = document.documentElement;\n root.setAttribute(attribute, resolvedTheme);\n \n // Also set class for Tailwind dark mode\n if (resolvedTheme === 'dark') {\n root.classList.add('dark');\n } else {\n root.classList.remove('dark');\n }\n }, [resolvedTheme, attribute]);\n\n const contextValue: ThemeContextValue = {\n theme,\n setTheme,\n resolvedTheme,\n toggleTheme,\n };\n\n return <ThemeContext.Provider value={contextValue}>{children}</ThemeContext.Provider>;\n}","import { ReactNode } from 'react';\nimport { ActionModalProvider } from './ActionModalProvider';\nimport { ThemeProvider, ThemeProviderProps } from './ThemeProvider';\nimport { ToastProvider, ToastProviderProps } from './ToastProvider';\n\nexport interface DreamerUIProviderProps {\n\t/** React children to be wrapped by all DreamerUI providers */\n\tchildren: ReactNode;\n\t/** Configuration options for the ThemeProvider */\n\ttheme?: Omit<ThemeProviderProps, 'children'>;\n\t/** Configuration options for the ToastProvider */\n\ttoast?: Omit<ToastProviderProps, 'children'>;\n}\n\nexport function DreamerUIProvider({ children, theme = {}, toast = {} }: DreamerUIProviderProps) {\n\treturn (\n\t\t<ThemeProvider {...theme}>\n\t\t\t<ToastProvider {...toast}>\n\t\t\t\t<ActionModalProvider>{children}</ActionModalProvider>\n\t\t\t</ToastProvider>\n\t\t</ThemeProvider>\n\t);\n}\n"],"names":["ActionModalProvider","children","modalState","setModalState","useState","confirm","useCallback","options","resolve","alert","handleClose","handleConfirm","contextValue","jsxs","ActionModalContext","jsx","ActionModal","positionClasses","ToastProvider","customTypes","customComponent","position","maxToasts","toasts","setToasts","addToast","generatedId","id","newToast","prevToasts","removeToast","toast","ToastContext","join","Toast","ThemeProvider","defaultTheme","storageKey","attribute","respectSystem","theme","setThemeState","stored","resolvedTheme","setResolvedTheme","setTheme","newTheme","toggleTheme","useEffect","updateResolvedTheme","systemTheme","mediaQuery","root","ThemeContext","DreamerUIProvider"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"providers.esm.js","sources":["../src/providers/ActionModalProvider.tsx","../src/providers/ToastProvider.tsx","../src/providers/ThemeProvider.tsx","../src/providers/DreamerUIProvider.tsx"],"sourcesContent":["import { ReactNode, useCallback, useState } from 'react';\nimport { ActionModal } from '../components';\nimport { ActionModalContext } from '../hooks';\n\nexport interface ConfirmOptions {\n /** The title displayed in the confirmation modal header */\n title?: string;\n /** The main message content displayed in the modal body */\n message: ReactNode;\n /** Text for the confirm/accept button. Defaults to \"Confirm\" */\n confirmText?: string;\n /** Text for the cancel/dismiss button. Defaults to \"Cancel\" */\n cancelText?: string;\n /** Whether the action is destructive, affects button styling */\n destructive?: boolean;\n}\n\nexport interface AlertOptions {\n /** The title displayed in the alert modal header */\n title?: string;\n /** The main message content displayed in the modal body */\n message: ReactNode;\n /** Text for the confirm/dismiss button. Defaults to \"OK\" */\n confirmText?: string;\n /** Whether the alert represents a destructive action, affects button styling */\n destructive?: boolean;\n}\n\nexport interface ActionModalContextValue {\n /** Shows a confirmation modal and returns a promise that resolves to true if confirmed, false if cancelled */\n confirm: (options: ConfirmOptions) => Promise<boolean>;\n /** Shows an alert modal and returns a promise that resolves when dismissed */\n alert: (options: AlertOptions) => Promise<void>;\n}\n\ninterface ActionModalState {\n isOpen: boolean;\n type: 'alert' | 'confirm';\n title?: string;\n message: ReactNode;\n confirmText?: string;\n cancelText?: string;\n destructive?: boolean;\n resolve?: ((value: boolean) => void) | (() => void);\n}\n\nexport function ActionModalProvider({ children }: { children: ReactNode }) {\n const [modalState, setModalState] = useState<ActionModalState | null>(null);\n\n const confirm = useCallback((options: ConfirmOptions): Promise<boolean> => {\n return new Promise((resolve) => {\n setModalState({\n isOpen: true,\n type: 'confirm',\n title: options.title,\n message: options.message,\n confirmText: options.confirmText,\n cancelText: options.cancelText,\n destructive: options.destructive,\n resolve,\n });\n });\n }, []);\n\n const alert = useCallback((options: AlertOptions): Promise<void> => {\n return new Promise((resolve) => {\n setModalState({\n isOpen: true,\n type: 'alert',\n title: options.title,\n message: options.message,\n confirmText: options.confirmText,\n destructive: options.destructive,\n resolve,\n });\n });\n }, []);\n\n const handleClose = useCallback(() => {\n if (modalState?.resolve) {\n if (modalState.type === 'confirm') {\n (modalState.resolve as (value: boolean) => void)(false);\n } else {\n (modalState.resolve as () => void)();\n }\n }\n setModalState(null);\n }, [modalState]);\n\n const handleConfirm = useCallback(() => {\n if (modalState?.resolve) {\n if (modalState.type === 'confirm') {\n (modalState.resolve as (value: boolean) => void)(true);\n } else {\n (modalState.resolve as () => void)();\n }\n }\n setModalState(null);\n }, [modalState]);\n\n const contextValue: ActionModalContextValue = {\n confirm,\n alert,\n };\n\n return (\n <ActionModalContext.Provider value={contextValue}>\n {children}\n {modalState && modalState.type === 'alert' && (\n <ActionModal\n type='alert'\n isOpen={modalState.isOpen}\n onClose={handleClose}\n title={modalState.title}\n message={modalState.message}\n confirmText={modalState.confirmText}\n destructive={modalState.destructive}\n onConfirm={handleConfirm}\n className='bg-white dark:bg-gray-800 rounded-lg'\n />\n )}\n {modalState && modalState.type === 'confirm' && (\n <ActionModal\n type='confirm'\n isOpen={modalState.isOpen}\n onClose={handleClose}\n title={modalState.title}\n message={modalState.message}\n confirmText={modalState.confirmText}\n cancelText={modalState.cancelText}\n destructive={modalState.destructive}\n onConfirm={handleConfirm}\n className='bg-white dark:bg-gray-800 rounded-lg'\n />\n )}\n </ActionModalContext.Provider>\n );\n}\n","import { ReactNode, useCallback, useState } from 'react';\nimport { Toast, ToastData, ToastType } from '../components/toast';\nimport { AddToastOptions, ToastContextValue } from '../hooks/useToast';\nimport { ToastContext } from '../hooks/useToast';\nimport { join } from '../utils';\n\nexport interface ToastProviderProps {\n /** React children to be wrapped by the toast provider */\n children: ReactNode;\n /** Custom toast types with their own styling and icons */\n customTypes?: Record<string, { className: string; icon?: ReactNode }>;\n /** Custom toast component to replace the default Toast component */\n customComponent?: React.ComponentType<ToastData>;\n /** Position where toasts should appear on screen */\n position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center';\n /** Maximum number of toasts to display at once */\n maxToasts?: number;\n}\n\nconst positionClasses = {\n 'top-right': 'top-4 right-4',\n 'top-left': 'top-4 left-4',\n 'bottom-right': 'bottom-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'top-center': 'top-4 left-1/2 -translate-x-1/2',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n};\n\nexport function ToastProvider({\n children,\n customTypes,\n customComponent,\n position = 'top-right',\n maxToasts = 5,\n}: ToastProviderProps) {\n const [toasts, setToasts] = useState<ToastData[]>([]);\n\n const addToast = useCallback(\n (options: AddToastOptions) => {\n const generatedId = `toast-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;\n const id = options.id || generatedId;\n\n const newToast: ToastData = {\n id,\n title: options.title,\n description: options.description,\n type: (options.type as ToastType) || 'info',\n action: options.action,\n duration: options.duration ?? 5000,\n };\n\n setToasts((prevToasts) => {\n const updatedToasts = [newToast, ...prevToasts];\n // Keep only the most recent toasts if we exceed maxToasts\n return updatedToasts.slice(0, maxToasts);\n });\n\n return id;\n },\n [maxToasts]\n );\n\n const removeToast = useCallback((id: string) => {\n setToasts((prevToasts) => prevToasts.filter((toast) => toast.id !== id));\n }, []);\n\n const contextValue: ToastContextValue = {\n addToast,\n removeToast,\n toasts,\n };\n\n return (\n <ToastContext.Provider value={contextValue}>\n {children}\n\n <div\n className={join('fixed z-50 pointer-events-none max-w-sm w-full space-y-2', positionClasses[position])}\n role='region'\n aria-label='Notifications'\n >\n {toasts.map((toast) => (\n <div key={toast.id} className='pointer-events-auto'>\n <Toast {...toast} onRemove={removeToast} customTypes={customTypes} customComponent={customComponent} />\n </div>\n ))}\n </div>\n </ToastContext.Provider>\n );\n}\n","import { ReactNode, useCallback, useLayoutEffect, useState } from 'react';\nimport { Theme, ThemeContext, ThemeContextValue } from '../hooks/useTheme';\n\nexport interface ThemeProviderProps {\n /** React children to be wrapped by the theme provider */\n children: ReactNode;\n /** The default theme to use on first load. Defaults to 'system' */\n defaultTheme?: Theme;\n /** Local storage key used to persist the theme selection. Defaults to 'dreamer-ui-theme' */\n storageKey?: string;\n /** HTML attribute name to set on document root. Defaults to 'data-theme' */\n attribute?: string;\n /** Whether to respect system theme when theme is set to 'system'. Defaults to true */\n respectSystem?: boolean;\n}\n\nexport function ThemeProvider({\n children,\n defaultTheme = 'system',\n storageKey = 'dreamer-ui-theme',\n attribute = 'data-theme',\n respectSystem = true,\n}: ThemeProviderProps) {\n const [theme, setThemeState] = useState<Theme>(() => {\n if (typeof window === 'undefined') {\n return defaultTheme;\n }\n\n const stored = localStorage.getItem(storageKey);\n if (stored && ['light', 'dark', 'system'].includes(stored)) {\n return stored as Theme;\n }\n\n return defaultTheme;\n });\n\n const [resolvedTheme, setResolvedTheme] = useState<'light' | 'dark'>(() => {\n if (typeof window === 'undefined') {\n return 'light';\n }\n\n if (theme === 'system' && respectSystem) {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n }\n\n return theme === 'dark' ? 'dark' : 'light';\n });\n\n const setTheme = useCallback(\n (newTheme: Theme) => {\n setThemeState(newTheme);\n if (typeof window !== 'undefined') {\n localStorage.setItem(storageKey, newTheme);\n }\n },\n [storageKey]\n );\n\n const toggleTheme = useCallback(() => {\n const newTheme = resolvedTheme === 'light' ? 'dark' : 'light';\n setTheme(newTheme);\n }, [resolvedTheme, setTheme]);\n\n useLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n\n const updateResolvedTheme = () => {\n if (theme === 'system' && respectSystem) {\n const systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n setResolvedTheme(systemTheme);\n } else {\n setResolvedTheme(theme === 'dark' ? 'dark' : 'light');\n }\n };\n\n updateResolvedTheme();\n\n if (theme === 'system' && respectSystem) {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n mediaQuery.addEventListener('change', updateResolvedTheme);\n return () => mediaQuery.removeEventListener('change', updateResolvedTheme);\n }\n }, [theme, respectSystem]);\n\n useLayoutEffect(() => {\n if (typeof window === 'undefined') return;\n\n const root = document.documentElement;\n root.setAttribute(attribute, resolvedTheme);\n \n // Also set class for Tailwind dark mode\n if (resolvedTheme === 'dark') {\n root.classList.add('dark');\n } else {\n root.classList.remove('dark');\n }\n }, [resolvedTheme, attribute]);\n\n const contextValue: ThemeContextValue = {\n theme,\n setTheme,\n resolvedTheme,\n toggleTheme,\n };\n\n return <ThemeContext.Provider value={contextValue}>{children}</ThemeContext.Provider>;\n}","import { ReactNode } from 'react';\nimport { ActionModalProvider } from './ActionModalProvider';\nimport { ThemeProvider, ThemeProviderProps } from './ThemeProvider';\nimport { ToastProvider, ToastProviderProps } from './ToastProvider';\n\nexport interface DreamerUIProviderProps {\n\t/** React children to be wrapped by all DreamerUI providers */\n\tchildren: ReactNode;\n\t/** Configuration options for the ThemeProvider */\n\ttheme?: Omit<ThemeProviderProps, 'children'>;\n\t/** Configuration options for the ToastProvider */\n\ttoast?: Omit<ToastProviderProps, 'children'>;\n}\n\nexport function DreamerUIProvider({ children, theme = {}, toast = {} }: DreamerUIProviderProps) {\n\treturn (\n\t\t<ThemeProvider {...theme}>\n\t\t\t<ToastProvider {...toast}>\n\t\t\t\t<ActionModalProvider>{children}</ActionModalProvider>\n\t\t\t</ToastProvider>\n\t\t</ThemeProvider>\n\t);\n}\n"],"names":["ActionModalProvider","children","modalState","setModalState","useState","confirm","useCallback","options","resolve","alert","handleClose","handleConfirm","contextValue","jsxs","ActionModalContext","jsx","ActionModal","positionClasses","ToastProvider","customTypes","customComponent","position","maxToasts","toasts","setToasts","addToast","generatedId","id","newToast","prevToasts","removeToast","toast","ToastContext","join","Toast","ThemeProvider","defaultTheme","storageKey","attribute","respectSystem","theme","setThemeState","stored","resolvedTheme","setResolvedTheme","setTheme","newTheme","toggleTheme","useLayoutEffect","updateResolvedTheme","systemTheme","mediaQuery","root","ThemeContext","DreamerUIProvider"],"mappings":"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"}
|