@shellui/core 0.0.14 → 0.0.15
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/package.json +11 -25
- package/src/components/ui/dialog.tsx +3 -1
- package/src/components/ui/sidebar.tsx +14 -2
- package/src/features/config/ConfigProvider.ts +1 -1
- package/src/features/config/useConfig.ts +7 -2
- package/src/features/layouts/DefaultLayout.tsx +6 -1
- package/src/index.ts +2 -2
- package/src/service-worker/register.ts +2 -1
- package/dist/ContentView-CZG-ro_B.js +0 -146
- package/dist/ContentView-CZG-ro_B.js.map +0 -1
- package/dist/CookiePreferencesView-Bb3hFqw1.js +0 -213
- package/dist/CookiePreferencesView-Bb3hFqw1.js.map +0 -1
- package/dist/DefaultLayout-D3IpgS4j.js +0 -406
- package/dist/DefaultLayout-D3IpgS4j.js.map +0 -1
- package/dist/FullscreenLayout-Do9vAfl8.js +0 -30
- package/dist/FullscreenLayout-Do9vAfl8.js.map +0 -1
- package/dist/HomeView-DwckTuxz.js +0 -21
- package/dist/HomeView-DwckTuxz.js.map +0 -1
- package/dist/NotFoundView-DD7azhz-.js +0 -52
- package/dist/NotFoundView-DD7azhz-.js.map +0 -1
- package/dist/OverlayShell-kDY56DaN.js +0 -642
- package/dist/OverlayShell-kDY56DaN.js.map +0 -1
- package/dist/SettingsView-Bt4I-KDT.js +0 -2207
- package/dist/SettingsView-Bt4I-KDT.js.map +0 -1
- package/dist/ViewRoute-ChSPabOy.js +0 -32
- package/dist/ViewRoute-ChSPabOy.js.map +0 -1
- package/dist/WindowsLayout-CEqkRKyk.js +0 -633
- package/dist/WindowsLayout-CEqkRKyk.js.map +0 -1
- package/dist/app.d.ts +0 -3
- package/dist/app.d.ts.map +0 -1
- package/dist/components/ContentView.d.ts +0 -10
- package/dist/components/ContentView.d.ts.map +0 -1
- package/dist/components/HomeView.d.ts +0 -2
- package/dist/components/HomeView.d.ts.map +0 -1
- package/dist/components/LoadingOverlay.d.ts +0 -2
- package/dist/components/LoadingOverlay.d.ts.map +0 -1
- package/dist/components/NotFoundView.d.ts +0 -2
- package/dist/components/NotFoundView.d.ts.map +0 -1
- package/dist/components/RouteErrorBoundary.d.ts +0 -2
- package/dist/components/RouteErrorBoundary.d.ts.map +0 -1
- package/dist/components/ViewRoute.d.ts +0 -7
- package/dist/components/ViewRoute.d.ts.map +0 -1
- package/dist/components/ui/alert-dialog.d.ts +0 -32
- package/dist/components/ui/alert-dialog.d.ts.map +0 -1
- package/dist/components/ui/breadcrumb.d.ts +0 -20
- package/dist/components/ui/breadcrumb.d.ts.map +0 -1
- package/dist/components/ui/button-group.d.ts +0 -7
- package/dist/components/ui/button-group.d.ts.map +0 -1
- package/dist/components/ui/button.d.ts +0 -12
- package/dist/components/ui/button.d.ts.map +0 -1
- package/dist/components/ui/dialog.d.ts +0 -24
- package/dist/components/ui/dialog.d.ts.map +0 -1
- package/dist/components/ui/drawer.d.ts +0 -38
- package/dist/components/ui/drawer.d.ts.map +0 -1
- package/dist/components/ui/select.d.ts +0 -5
- package/dist/components/ui/select.d.ts.map +0 -1
- package/dist/components/ui/sidebar.d.ts +0 -46
- package/dist/components/ui/sidebar.d.ts.map +0 -1
- package/dist/components/ui/sonner.d.ts +0 -6
- package/dist/components/ui/sonner.d.ts.map +0 -1
- package/dist/components/ui/switch.d.ts +0 -8
- package/dist/components/ui/switch.d.ts.map +0 -1
- package/dist/constants/urls.d.ts +0 -6
- package/dist/constants/urls.d.ts.map +0 -1
- package/dist/constants/urls.js +0 -8
- package/dist/constants/urls.js.map +0 -1
- package/dist/features/alertDialog/DialogContext.d.ts +0 -12
- package/dist/features/alertDialog/DialogContext.d.ts.map +0 -1
- package/dist/features/config/ConfigProvider.d.ts +0 -15
- package/dist/features/config/ConfigProvider.d.ts.map +0 -1
- package/dist/features/config/types.d.ts +0 -177
- package/dist/features/config/types.d.ts.map +0 -1
- package/dist/features/config/useConfig.d.ts +0 -8
- package/dist/features/config/useConfig.d.ts.map +0 -1
- package/dist/features/cookieConsent/CookieConsentModal.d.ts +0 -6
- package/dist/features/cookieConsent/CookieConsentModal.d.ts.map +0 -1
- package/dist/features/cookieConsent/CookiePreferencesView.d.ts +0 -2
- package/dist/features/cookieConsent/CookiePreferencesView.d.ts.map +0 -1
- package/dist/features/cookieConsent/cookieConsent.d.ts +0 -22
- package/dist/features/cookieConsent/cookieConsent.d.ts.map +0 -1
- package/dist/features/cookieConsent/useCookieConsent.d.ts +0 -15
- package/dist/features/cookieConsent/useCookieConsent.d.ts.map +0 -1
- package/dist/features/drawer/DrawerContext.d.ts +0 -24
- package/dist/features/drawer/DrawerContext.d.ts.map +0 -1
- package/dist/features/layouts/AppLayout.d.ts +0 -12
- package/dist/features/layouts/AppLayout.d.ts.map +0 -1
- package/dist/features/layouts/DefaultLayout.d.ts +0 -10
- package/dist/features/layouts/DefaultLayout.d.ts.map +0 -1
- package/dist/features/layouts/FullscreenLayout.d.ts +0 -9
- package/dist/features/layouts/FullscreenLayout.d.ts.map +0 -1
- package/dist/features/layouts/LayoutProviders.d.ts +0 -9
- package/dist/features/layouts/LayoutProviders.d.ts.map +0 -1
- package/dist/features/layouts/OverlayShell.d.ts +0 -10
- package/dist/features/layouts/OverlayShell.d.ts.map +0 -1
- package/dist/features/layouts/WindowsLayout.d.ts +0 -24
- package/dist/features/layouts/WindowsLayout.d.ts.map +0 -1
- package/dist/features/layouts/utils.d.ts +0 -16
- package/dist/features/layouts/utils.d.ts.map +0 -1
- package/dist/features/modal/ModalContext.d.ts +0 -20
- package/dist/features/modal/ModalContext.d.ts.map +0 -1
- package/dist/features/sentry/initSentry.d.ts +0 -14
- package/dist/features/sentry/initSentry.d.ts.map +0 -1
- package/dist/features/settings/SettingsContext.d.ts +0 -10
- package/dist/features/settings/SettingsContext.d.ts.map +0 -1
- package/dist/features/settings/SettingsIcons.d.ts +0 -22
- package/dist/features/settings/SettingsIcons.d.ts.map +0 -1
- package/dist/features/settings/SettingsProvider.d.ts +0 -5
- package/dist/features/settings/SettingsProvider.d.ts.map +0 -1
- package/dist/features/settings/SettingsRoutes.d.ts +0 -7
- package/dist/features/settings/SettingsRoutes.d.ts.map +0 -1
- package/dist/features/settings/SettingsView.d.ts +0 -2
- package/dist/features/settings/SettingsView.d.ts.map +0 -1
- package/dist/features/settings/components/Advanced.d.ts +0 -2
- package/dist/features/settings/components/Advanced.d.ts.map +0 -1
- package/dist/features/settings/components/Appearance.d.ts +0 -2
- package/dist/features/settings/components/Appearance.d.ts.map +0 -1
- package/dist/features/settings/components/DataPrivacy.d.ts +0 -2
- package/dist/features/settings/components/DataPrivacy.d.ts.map +0 -1
- package/dist/features/settings/components/Develop.d.ts +0 -2
- package/dist/features/settings/components/Develop.d.ts.map +0 -1
- package/dist/features/settings/components/LanguageAndRegion.d.ts +0 -2
- package/dist/features/settings/components/LanguageAndRegion.d.ts.map +0 -1
- package/dist/features/settings/components/ServiceWorker.d.ts +0 -2
- package/dist/features/settings/components/ServiceWorker.d.ts.map +0 -1
- package/dist/features/settings/components/UpdateApp.d.ts +0 -2
- package/dist/features/settings/components/UpdateApp.d.ts.map +0 -1
- package/dist/features/settings/components/develop/DialogTestButtons.d.ts +0 -2
- package/dist/features/settings/components/develop/DialogTestButtons.d.ts.map +0 -1
- package/dist/features/settings/components/develop/DrawerTestButtons.d.ts +0 -2
- package/dist/features/settings/components/develop/DrawerTestButtons.d.ts.map +0 -1
- package/dist/features/settings/components/develop/ModalTestButtons.d.ts +0 -2
- package/dist/features/settings/components/develop/ModalTestButtons.d.ts.map +0 -1
- package/dist/features/settings/components/develop/ToastTestButtons.d.ts +0 -2
- package/dist/features/settings/components/develop/ToastTestButtons.d.ts.map +0 -1
- package/dist/features/settings/hooks/useSettings.d.ts +0 -2
- package/dist/features/settings/hooks/useSettings.d.ts.map +0 -1
- package/dist/features/sonner/SonnerContext.d.ts +0 -29
- package/dist/features/sonner/SonnerContext.d.ts.map +0 -1
- package/dist/features/theme/ThemeProvider.d.ts +0 -11
- package/dist/features/theme/ThemeProvider.d.ts.map +0 -1
- package/dist/features/theme/themes.d.ts +0 -114
- package/dist/features/theme/themes.d.ts.map +0 -1
- package/dist/features/theme/useTheme.d.ts +0 -10
- package/dist/features/theme/useTheme.d.ts.map +0 -1
- package/dist/i18n/I18nProvider.d.ts +0 -9
- package/dist/i18n/I18nProvider.d.ts.map +0 -1
- package/dist/i18n/config.d.ts +0 -23
- package/dist/i18n/config.d.ts.map +0 -1
- package/dist/i18n/translations/en/common.json.d.ts +0 -19
- package/dist/i18n/translations/en/cookieConsent.json.d.ts +0 -53
- package/dist/i18n/translations/en/settings.json.d.ts +0 -358
- package/dist/i18n/translations/fr/common.json.d.ts +0 -19
- package/dist/i18n/translations/fr/cookieConsent.json.d.ts +0 -53
- package/dist/i18n/translations/fr/settings.json.d.ts +0 -358
- package/dist/index-CfvdAI_Y.js +0 -2168
- package/dist/index-CfvdAI_Y.js.map +0 -1
- package/dist/index.d.ts +0 -7
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -12
- package/dist/index.js.map +0 -1
- package/dist/lib/utils.d.ts +0 -3
- package/dist/lib/utils.d.ts.map +0 -1
- package/dist/lib/z-index.d.ts +0 -29
- package/dist/lib/z-index.d.ts.map +0 -1
- package/dist/router/router.d.ts +0 -3
- package/dist/router/router.d.ts.map +0 -1
- package/dist/router/routes.d.ts +0 -4
- package/dist/router/routes.d.ts.map +0 -1
- package/dist/sidebar-Dt-gibIZ.js +0 -336
- package/dist/sidebar-Dt-gibIZ.js.map +0 -1
- package/dist/style.css +0 -1
- package/dist/switch-CuKXfl3x.js +0 -44
- package/dist/switch-CuKXfl3x.js.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OverlayShell-kDY56DaN.js","sources":["../src/features/modal/ModalContext.tsx","../src/features/drawer/DrawerContext.tsx","../src/features/sonner/SonnerContext.tsx","../src/features/layouts/LayoutProviders.tsx","../src/components/ui/dialog.tsx","../src/components/ui/drawer.tsx","../src/components/ui/sonner.tsx","../src/features/layouts/OverlayShell.tsx"],"sourcesContent":["import { shellui, type ShellUIMessage } from '@shellui/sdk';\nimport { createContext, useContext, useState, useEffect, useCallback, type ReactNode } from 'react';\n\n/**\n * Validates and normalizes a URL to ensure it's from the same domain or localhost\n * @param url - The URL or path to validate\n * @returns The normalized absolute URL or null if invalid\n */\nexport const validateAndNormalizeUrl = (url: string | undefined | null): string | null => {\n if (!url || typeof url !== 'string') {\n return null;\n }\n\n try {\n // If it's already an absolute URL, check if it's same origin or localhost\n if (url.startsWith('http://') || url.startsWith('https://')) {\n const urlObj = new URL(url);\n const currentOrigin = typeof window !== 'undefined' ? window.location.origin : '';\n\n // Allow same origin\n if (urlObj.origin === currentOrigin) {\n return url;\n }\n\n // Allow localhost URLs (for development)\n if (urlObj.hostname === 'localhost' || urlObj.hostname === '127.0.0.1') {\n return url;\n }\n\n return null; // Different origin, reject for security\n }\n\n // If it's a relative URL, make it absolute using current origin\n if (url.startsWith('/') || url.startsWith('./') || !url.startsWith('//')) {\n const currentOrigin = typeof window !== 'undefined' ? window.location.origin : '';\n // Ensure relative paths start with /\n const normalizedPath = url.startsWith('/') ? url : `/${url}`;\n return `${currentOrigin}${normalizedPath}`;\n }\n\n // Reject protocol-relative URLs (//example.com) for security\n return null;\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Invalid URL:', url, error);\n return null;\n }\n};\n\ninterface ModalContextValue {\n isOpen: boolean;\n modalUrl: string | null;\n openModal: (url?: string) => void;\n closeModal: () => void;\n}\n\nconst ModalContext = createContext<ModalContextValue | undefined>(undefined);\n\nexport const useModal = () => {\n const context = useContext(ModalContext);\n if (!context) {\n throw new Error('useModal must be used within a ModalProvider');\n }\n return context;\n};\n\ninterface ModalProviderProps {\n children: ReactNode;\n}\n\nexport const ModalProvider = ({ children }: ModalProviderProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const [modalUrl, setModalUrl] = useState<string | null>(null);\n\n const openModal = useCallback((url?: string) => {\n const validatedUrl = url ? validateAndNormalizeUrl(url) : null;\n setModalUrl(validatedUrl);\n setIsOpen(true);\n }, []);\n\n const closeModal = useCallback(() => {\n setIsOpen(false);\n // Clear URL after a short delay to allow animation to complete\n setTimeout(() => setModalUrl(null), 200);\n }, []);\n\n // Listen for postMessage events from nested iframes\n useEffect(() => {\n const cleanupOpenModal = shellui.addMessageListener(\n 'SHELLUI_OPEN_MODAL',\n (data: ShellUIMessage) => {\n const payload = data.payload as { url?: string };\n openModal(payload.url);\n },\n );\n\n const cleanupCloseModal = shellui.addMessageListener('SHELLUI_CLOSE_MODAL', () => {\n closeModal();\n });\n\n return () => {\n cleanupOpenModal();\n cleanupCloseModal();\n };\n }, [openModal, closeModal]);\n\n return (\n <ModalContext.Provider value={{ isOpen, modalUrl, openModal, closeModal }}>\n {children}\n </ModalContext.Provider>\n );\n};\n","import { shellui, type ShellUIMessage } from '@shellui/sdk';\nimport { createContext, useContext, useState, useEffect, useCallback, type ReactNode } from 'react';\nimport type { DrawerDirection } from '@/components/ui/drawer';\nimport { useModal } from '../modal/ModalContext';\n\n/**\n * Validates and normalizes a URL for the drawer iframe.\n * Allows same-origin, localhost, and external http(s) URLs (e.g. from nav config).\n */\nconst validateAndNormalizeUrl = (url: string | undefined | null): string | null => {\n if (!url || typeof url !== 'string') {\n return null;\n }\n\n try {\n if (url.startsWith('http://') || url.startsWith('https://')) {\n new URL(url); // validate\n return url;\n }\n\n if (url.startsWith('/') || url.startsWith('./') || !url.startsWith('//')) {\n const currentOrigin = typeof window !== 'undefined' ? window.location.origin : '';\n const normalizedPath = url.startsWith('/') ? url : `/${url}`;\n return `${currentOrigin}${normalizedPath}`;\n }\n\n return null;\n } catch {\n return null;\n }\n};\n\nexport const DEFAULT_DRAWER_POSITION: DrawerDirection = 'right';\n\ninterface OpenDrawerOptions {\n url?: string;\n position?: DrawerDirection;\n /** CSS length: height for top/bottom (e.g. \"80vh\", \"400px\"), width for left/right (e.g. \"50vw\", \"320px\") */\n size?: string;\n}\n\ninterface DrawerContextValue {\n isOpen: boolean;\n drawerUrl: string | null;\n position: DrawerDirection;\n size: string | null;\n openDrawer: (options?: OpenDrawerOptions) => void;\n closeDrawer: () => void;\n}\n\nconst DrawerContext = createContext<DrawerContextValue | undefined>(undefined);\n\nexport const useDrawer = () => {\n const context = useContext(DrawerContext);\n if (!context) {\n throw new Error('useDrawer must be used within a DrawerProvider');\n }\n return context;\n};\n\ninterface DrawerProviderProps {\n children: ReactNode;\n}\n\nexport const DrawerProvider = ({ children }: DrawerProviderProps) => {\n const { closeModal } = useModal();\n const [isOpen, setIsOpen] = useState(false);\n const [drawerUrl, setDrawerUrl] = useState<string | null>(null);\n const [position, setPosition] = useState<DrawerDirection>(DEFAULT_DRAWER_POSITION);\n const [size, setSize] = useState<string | null>(null);\n\n const openDrawer = useCallback(\n (options?: OpenDrawerOptions) => {\n closeModal();\n const url = options?.url;\n const validatedUrl = url ? validateAndNormalizeUrl(url) : null;\n setDrawerUrl(validatedUrl);\n setPosition(options?.position ?? DEFAULT_DRAWER_POSITION);\n setSize(options?.size ?? null);\n setIsOpen(true);\n },\n [closeModal],\n );\n\n const closeDrawer = useCallback(() => {\n setIsOpen(false);\n // Do not reset drawerUrl/position here — Vaul's close animation uses the current\n // direction. Resetting position (e.g. to 'right') mid-animation would make\n // non-right drawers jump. State is set on next openDrawer().\n }, []);\n\n useEffect(() => {\n const cleanupOpen = shellui.addMessageListener(\n 'SHELLUI_OPEN_DRAWER',\n (data: ShellUIMessage) => {\n const payload = data.payload as { url?: string; position?: DrawerDirection; size?: string };\n openDrawer({ url: payload.url, position: payload.position, size: payload.size });\n },\n );\n\n const cleanupClose = shellui.addMessageListener('SHELLUI_CLOSE_DRAWER', () => {\n closeDrawer();\n });\n\n return () => {\n cleanupOpen();\n cleanupClose();\n };\n }, [openDrawer, closeDrawer]);\n\n return (\n <DrawerContext.Provider value={{ isOpen, drawerUrl, position, size, openDrawer, closeDrawer }}>\n {children}\n </DrawerContext.Provider>\n );\n};\n","import { shellui, type ShellUIMessage } from '@shellui/sdk';\nimport { createContext, useContext, useCallback, useEffect, type ReactNode } from 'react';\nimport { toast as sonnerToast } from 'sonner';\n\ninterface ToastOptions {\n id?: string;\n title?: string;\n description?: string;\n type?: 'default' | 'success' | 'error' | 'warning' | 'info' | 'loading';\n duration?: number;\n position?:\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n action?: {\n label: string;\n onClick: () => void;\n };\n cancel?: {\n label: string;\n onClick: () => void;\n };\n onDismiss?: () => void;\n onAutoClose?: () => void;\n}\n\ninterface SonnerContextValue {\n toast: (options: ToastOptions) => void;\n}\n\nconst SonnerContext = createContext<SonnerContextValue | undefined>(undefined);\n\nexport function useSonner() {\n const context = useContext(SonnerContext);\n if (!context) {\n throw new Error('useSonner must be used within a SonnerProvider');\n }\n return context;\n}\n\ninterface SonnerProviderProps {\n children: ReactNode;\n}\n\nexport const SonnerProvider = ({ children }: SonnerProviderProps) => {\n const toast = useCallback((options: ToastOptions) => {\n const {\n id,\n title,\n description,\n type = 'default',\n duration,\n position,\n action,\n cancel,\n onDismiss,\n onAutoClose,\n } = options;\n\n const toastOptions: Parameters<typeof sonnerToast>[1] = {\n id,\n duration,\n position,\n action: action\n ? {\n label: action.label,\n onClick: action.onClick,\n }\n : undefined,\n cancel: cancel\n ? {\n label: cancel.label,\n onClick: cancel.onClick,\n }\n : undefined,\n onDismiss: onDismiss,\n onAutoClose: onAutoClose,\n };\n\n // If ID is provided, this is an update operation\n if (id) {\n switch (type) {\n case 'success':\n sonnerToast.success(title || 'Success', {\n id,\n description,\n ...toastOptions,\n });\n break;\n case 'error':\n sonnerToast.error(title || 'Error', {\n id,\n description,\n ...toastOptions,\n });\n break;\n case 'warning':\n sonnerToast.warning(title || 'Warning', {\n id,\n description,\n ...toastOptions,\n });\n break;\n case 'info':\n sonnerToast.info(title || 'Info', {\n id,\n description,\n ...toastOptions,\n });\n break;\n case 'loading':\n sonnerToast.loading(title || 'Loading...', {\n id,\n description,\n ...toastOptions,\n });\n break;\n default:\n sonnerToast(title || 'Notification', {\n id,\n description,\n ...toastOptions,\n });\n break;\n }\n return;\n }\n\n // Create new toast\n switch (type) {\n case 'success':\n sonnerToast.success(title || 'Success', {\n description,\n ...toastOptions,\n });\n break;\n case 'error':\n sonnerToast.error(title || 'Error', {\n description,\n ...toastOptions,\n });\n break;\n case 'warning':\n sonnerToast.warning(title || 'Warning', {\n description,\n ...toastOptions,\n });\n break;\n case 'info':\n sonnerToast.info(title || 'Info', {\n description,\n ...toastOptions,\n });\n break;\n case 'loading':\n sonnerToast.loading(title || 'Loading...', {\n description,\n ...toastOptions,\n });\n break;\n default:\n sonnerToast(title || 'Notification', {\n description,\n ...toastOptions,\n });\n break;\n }\n }, []);\n\n // Listen for postMessage events from nested iframes\n useEffect(() => {\n const cleanupToast = shellui.addMessageListener('SHELLUI_TOAST', (data: ShellUIMessage) => {\n const payload = data.payload as ToastOptions;\n toast({\n ...payload,\n onDismiss: () => {\n shellui.sendMessage({\n type: 'SHELLUI_TOAST_CLEAR',\n payload: { id: payload.id },\n to: data.from,\n });\n },\n onAutoClose: () => {\n shellui.sendMessage({\n type: 'SHELLUI_TOAST_CLEAR',\n payload: { id: payload.id },\n to: data.from,\n });\n },\n action:\n payload.action &&\n (() => {\n let actionSent = false;\n return {\n label: payload.action?.label ?? undefined,\n onClick: () => {\n if (actionSent) return;\n actionSent = true;\n shellui.sendMessage({\n type: 'SHELLUI_TOAST_ACTION',\n payload: { id: payload.id },\n to: data.from,\n });\n },\n };\n })(),\n cancel:\n payload.cancel &&\n (() => {\n let cancelSent = false;\n return {\n label: payload.cancel?.label ?? undefined,\n onClick: () => {\n if (cancelSent) return;\n cancelSent = true;\n shellui.sendMessage({\n type: 'SHELLUI_TOAST_CANCEL',\n payload: { id: payload.id },\n to: data.from,\n });\n },\n };\n })(),\n });\n });\n\n const cleanupToastUpdate = shellui.addMessageListener(\n 'SHELLUI_TOAST_UPDATE',\n (data: ShellUIMessage) => {\n const payload = data.payload as ToastOptions;\n // CRITICAL: When updating a toast, we MUST re-register action handlers\n // The callbackRegistry still has the callbacks, but the toast button needs onClick handlers\n // that trigger the callbackRegistry via SHELLUI_TOAST_ACTION messages\n toast({\n ...payload,\n // Re-register action handlers so the button works after update\n // These handlers send messages that trigger the callbackRegistry\n action:\n payload.action &&\n (() => {\n let actionSent = false;\n return {\n label: payload.action?.label ?? undefined,\n onClick: () => {\n if (actionSent) return;\n actionSent = true;\n shellui.sendMessage({\n type: 'SHELLUI_TOAST_ACTION',\n payload: { id: payload.id },\n to: data.from,\n });\n },\n };\n })(),\n cancel:\n payload.cancel &&\n (() => {\n let cancelSent = false;\n return {\n label: payload.cancel?.label ?? undefined,\n onClick: () => {\n if (cancelSent) return;\n cancelSent = true;\n shellui.sendMessage({\n type: 'SHELLUI_TOAST_CANCEL',\n payload: { id: payload.id },\n to: data.from,\n });\n },\n };\n })(),\n });\n },\n );\n\n return () => {\n cleanupToast();\n cleanupToastUpdate();\n };\n }, [toast]);\n\n return <SonnerContext.Provider value={{ toast }}>{children}</SonnerContext.Provider>;\n};\n","import type { ReactNode } from 'react';\nimport { ModalProvider } from '../modal/ModalContext';\nimport { DrawerProvider } from '../drawer/DrawerContext';\nimport { SonnerProvider } from '../sonner/SonnerContext';\n\ninterface LayoutProvidersProps {\n children: ReactNode;\n}\n\n/** Wraps layout content with Modal, Drawer and Sonner providers.\n * Note: DialogProvider is now at the app level in app.tsx */\nexport function LayoutProviders({ children }: LayoutProvidersProps) {\n return (\n <ModalProvider>\n <DrawerProvider>\n <SonnerProvider>{children}</SonnerProvider>\n </DrawerProvider>\n </ModalProvider>\n );\n}\n","import {\n forwardRef,\n useCallback,\n Children,\n type ElementRef,\n type ComponentPropsWithoutRef,\n type ComponentProps,\n type HTMLAttributes,\n} from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\nimport { cn } from '@/lib/utils';\nimport { Z_INDEX } from '@/lib/z-index';\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = forwardRef<\n ElementRef<typeof DialogPrimitive.Overlay>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n data-dialog-overlay\n className={cn('fixed inset-0 bg-[hsl(var(--background)/0.8)] backdrop-blur-[1px]', className)}\n style={{ zIndex: Z_INDEX.MODAL_OVERLAY }}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\ninterface DialogContentProps extends ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n /** When true, the default close (X) button is not rendered. Escape and overlay still close. */\n hideCloseButton?: boolean;\n}\n\nconst DialogContent = forwardRef<ElementRef<typeof DialogPrimitive.Content>, DialogContentProps>(\n ({ className, children, onPointerDownOutside, hideCloseButton, ...props }, ref) => {\n const hasContent = Children.count(children) > 2;\n\n const handlePointerDownOutside = useCallback(\n (\n event: Parameters<NonNullable<ComponentProps<typeof DialogPrimitive.Content>['onPointerDownOutside']>>[0],\n ) => {\n const target = event?.target as Element | null;\n if (target?.closest?.('[data-sonner-toaster]')) {\n event.preventDefault();\n }\n onPointerDownOutside?.(event);\n },\n [onPointerDownOutside],\n );\n\n return (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n data-dialog-content\n data-has-content={hasContent}\n className={cn(\n 'fixed left-[50%] top-[50%] grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-6 border bg-background px-6 pt-0 pb-0 shadow-lg sm:rounded-lg',\n 'data-[has-content=false]:gap-0 data-[has-content=false]:[&>[data-dialog-header]]:border-b-0 data-[has-content=false]:[&>[data-dialog-header]]:pb-0',\n className,\n )}\n style={{ backgroundColor: 'hsl(var(--background))', zIndex: Z_INDEX.MODAL_CONTENT }}\n onPointerDownOutside={handlePointerDownOutside}\n {...props}\n >\n {children}\n {!hideCloseButton && (\n <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground cursor-pointer\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"h-4 w-4\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n },\n);\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => (\n <div\n data-dialog-header\n className={cn(\n '-mx-6 flex flex-col space-y-2.5 border-b border-border/60 px-6 pt-5 pb-4 text-left',\n className,\n )}\n {...props}\n />\n);\nDialogHeader.displayName = 'DialogHeader';\n\nconst DialogFooter = ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n '-mx-6 mt-4 flex flex-col-reverse gap-2 rounded-b-lg border-t border-border bg-sidebar-background px-6 py-2 text-sidebar-foreground sm:flex-row sm:justify-end sm:space-x-2 [&_button]:h-8 [&_button]:px-3 [&_button]:text-xs',\n className,\n )}\n {...props}\n />\n);\nDialogFooter.displayName = 'DialogFooter';\n\nconst DialogTitle = forwardRef<\n ElementRef<typeof DialogPrimitive.Title>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = forwardRef<\n ElementRef<typeof DialogPrimitive.Description>,\n ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogClose,\n DialogTrigger,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n};\n","'use client';\n\nimport {\n forwardRef,\n type ComponentProps,\n type ComponentPropsWithoutRef,\n type ComponentRef,\n type ReactNode,\n type CSSProperties,\n type HTMLAttributes,\n} from 'react';\nimport { Drawer as VaulDrawer } from 'vaul';\nimport { cn } from '@/lib/utils';\nimport { Z_INDEX } from '@/lib/z-index';\n\nexport type DrawerDirection = 'top' | 'bottom' | 'left' | 'right';\n\nconst Drawer = ({\n open,\n onOpenChange,\n direction = 'right',\n ...props\n}: ComponentProps<typeof VaulDrawer.Root> & {\n direction?: DrawerDirection;\n}) => (\n <VaulDrawer.Root\n open={open}\n onOpenChange={onOpenChange}\n direction={direction}\n {...props}\n />\n);\nDrawer.displayName = 'Drawer';\n\nconst DrawerTrigger = VaulDrawer.Trigger;\nDrawerTrigger.displayName = 'DrawerTrigger';\n\nconst DrawerPortal = VaulDrawer.Portal;\n(DrawerPortal as unknown as { displayName: string }).displayName = 'DrawerPortal';\n\nconst DrawerOverlay = forwardRef<\n ComponentRef<typeof VaulDrawer.Overlay>,\n ComponentPropsWithoutRef<typeof VaulDrawer.Overlay>\n>(({ className, ...props }, ref) => (\n <VaulDrawer.Overlay\n ref={ref}\n data-drawer-overlay\n className={cn('fixed inset-0 bg-[hsl(var(--background)/0.8)] backdrop-blur-[1px]', className)}\n style={{ zIndex: Z_INDEX.DRAWER_OVERLAY }}\n {...props}\n />\n));\nDrawerOverlay.displayName = VaulDrawer.Overlay.displayName;\n\n/** Base layout classes per direction — max dimension is applied via style so size prop can override. */\nconst drawerContentByDirection: Record<DrawerDirection, string> = {\n bottom: 'fixed inset-x-0 bottom-0 mt-24 flex h-auto flex-col border border-border bg-background',\n top: 'fixed inset-x-0 top-0 mb-24 flex h-auto flex-col border border-border bg-background',\n left: 'fixed inset-y-0 left-0 mr-24 flex h-full w-auto flex-col border border-border bg-background',\n right:\n 'fixed inset-y-0 right-0 ml-24 flex h-full w-auto flex-col border border-border bg-background',\n};\n\ninterface DrawerContentProps extends Omit<\n ComponentPropsWithoutRef<typeof VaulDrawer.Content>,\n 'direction'\n> {\n direction?: DrawerDirection;\n /** CSS length: height for top/bottom (e.g. \"80vh\", \"400px\"), width for left/right (e.g. \"50vw\", \"320px\") */\n size?: string | null;\n className?: string;\n children?: ReactNode;\n style?: CSSProperties;\n}\n\nconst DrawerContent = forwardRef<ComponentRef<typeof VaulDrawer.Content>, DrawerContentProps>(\n ({ className, direction = 'right', size, children, style, ...props }, ref) => {\n const pos: DrawerDirection = direction;\n const isVertical = pos === 'top' || pos === 'bottom';\n // Set dimension via inline style; use both width/height and max so Vaul/defaults don't override.\n const effectiveSize = size?.trim() || (isVertical ? '80vh' : '80vw');\n const sizeStyle = isVertical\n ? { height: effectiveSize, maxHeight: effectiveSize }\n : { width: effectiveSize, maxWidth: effectiveSize };\n return (\n <DrawerPortal>\n <DrawerOverlay />\n <VaulDrawer.Content\n ref={ref}\n data-drawer-content\n className={cn('outline-none', drawerContentByDirection[pos], className)}\n style={{\n backgroundColor: 'hsl(var(--background))',\n zIndex: Z_INDEX.DRAWER_CONTENT,\n ...sizeStyle,\n ...style,\n }}\n {...props}\n >\n {children}\n <VaulDrawer.Close\n className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground cursor-pointer\"\n aria-label=\"Close\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"h-4 w-4\"\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n <span className=\"sr-only\">Close</span>\n </VaulDrawer.Close>\n </VaulDrawer.Content>\n </DrawerPortal>\n );\n },\n);\nDrawerContent.displayName = 'DrawerContent';\n\nconst DrawerClose = VaulDrawer.Close;\nDrawerClose.displayName = 'DrawerClose';\n\nconst DrawerHeader = ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => (\n <div\n data-drawer-header\n className={cn(\n 'flex flex-col space-y-2 border-b border-border/60 px-6 pt-5 pb-4 text-left',\n className,\n )}\n {...props}\n />\n);\nDrawerHeader.displayName = 'DrawerHeader';\n\nconst DrawerFooter = ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n 'mt-auto flex flex-col-reverse gap-2 border-t border-border px-6 py-4 sm:flex-row sm:justify-end',\n className,\n )}\n {...props}\n />\n);\nDrawerFooter.displayName = 'DrawerFooter';\n\nconst DrawerTitle = forwardRef<\n ComponentRef<typeof VaulDrawer.Title>,\n ComponentPropsWithoutRef<typeof VaulDrawer.Title>\n>(({ className, ...props }, ref) => (\n <VaulDrawer.Title\n ref={ref}\n className={cn('text-lg font-semibold leading-none tracking-tight', className)}\n {...props}\n />\n));\nDrawerTitle.displayName = VaulDrawer.Title.displayName;\n\nconst DrawerDescription = forwardRef<\n ComponentRef<typeof VaulDrawer.Description>,\n ComponentPropsWithoutRef<typeof VaulDrawer.Description>\n>(({ className, ...props }, ref) => (\n <VaulDrawer.Description\n ref={ref}\n className={cn('text-sm text-muted-foreground', className)}\n {...props}\n />\n));\nDrawerDescription.displayName = VaulDrawer.Description.displayName;\n\nconst DrawerHandle = ({ className, ...props }: HTMLAttributes<HTMLDivElement>) => (\n <div\n data-drawer-handle\n className={cn('mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted', className)}\n {...props}\n />\n);\nDrawerHandle.displayName = 'DrawerHandle';\n\nexport {\n Drawer,\n DrawerTrigger,\n DrawerPortal,\n DrawerOverlay,\n DrawerContent,\n DrawerClose,\n DrawerHeader,\n DrawerFooter,\n DrawerTitle,\n DrawerDescription,\n DrawerHandle,\n};\n","import type { ComponentProps } from 'react';\nimport { useSettings } from '@/features/settings/hooks/useSettings';\nimport { Toaster as Sonner } from 'sonner';\nimport { Z_INDEX } from '@/lib/z-index';\n\ntype ToasterProps = ComponentProps<typeof Sonner>;\n\nconst Toaster = ({ ...props }: ToasterProps) => {\n const { settings } = useSettings();\n\n return (\n <Sonner\n position=\"top-center\"\n theme={settings.appearance.theme as 'light' | 'dark' | 'system'}\n className=\"toaster group\"\n style={{\n zIndex: Z_INDEX.TOAST,\n // Re-enable pointer events so toasts stay clickable when a Radix modal is open\n // (Radix sets body.style.pointerEvents = 'none' and only the dialog content gets 'auto')\n pointerEvents: 'auto',\n }}\n toastOptions={{\n classNames: {\n toast:\n 'group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg',\n description: 'group-[.toast]:text-muted-foreground',\n actionButton: 'group-[.toast]:bg-primary group-[.toast]:text-primary-foreground',\n cancelButton: 'group-[.toast]:bg-muted group-[.toast]:text-muted-foreground',\n },\n }}\n {...props}\n />\n );\n};\n\nexport { Toaster };\n","import { useEffect, type ReactNode } from 'react';\nimport { useNavigate } from 'react-router';\nimport { useTranslation } from 'react-i18next';\nimport { shellui } from '@shellui/sdk';\nimport type { NavigationItem } from '../config/types';\nimport { Dialog, DialogContent, DialogTitle, DialogDescription } from '@/components/ui/dialog';\nimport { Drawer, DrawerContent } from '@/components/ui/drawer';\nimport { Toaster } from '@/components/ui/sonner';\nimport { ContentView } from '@/components/ContentView';\nimport { useModal } from '../modal/ModalContext';\nimport { useDrawer } from '../drawer/DrawerContext';\nimport { resolveLocalizedString } from './utils';\n\ninterface OverlayShellProps {\n navigationItems: NavigationItem[];\n children: ReactNode;\n}\n\n/** Renders modal, drawer and toaster overlays and handles SHELLUI_OPEN_MODAL / SHELLUI_NAVIGATE. */\nexport function OverlayShell({ navigationItems, children }: OverlayShellProps) {\n const navigate = useNavigate();\n const { isOpen, modalUrl, closeModal } = useModal();\n const {\n isOpen: isDrawerOpen,\n drawerUrl,\n position: drawerPosition,\n size: drawerSize,\n closeDrawer,\n } = useDrawer();\n const { t, i18n } = useTranslation('common');\n const currentLanguage = i18n.language || 'en';\n\n useEffect(() => {\n const cleanup = shellui.addMessageListener('SHELLUI_OPEN_MODAL', () => {\n closeDrawer();\n });\n return () => cleanup();\n }, [closeDrawer]);\n\n useEffect(() => {\n const cleanup = shellui.addMessageListener('SHELLUI_NAVIGATE', (data) => {\n const payload = data.payload as { url?: string };\n const rawUrl = payload?.url;\n if (typeof rawUrl !== 'string' || !rawUrl.trim()) return;\n\n let pathname: string;\n if (rawUrl.startsWith('http://') || rawUrl.startsWith('https://')) {\n try {\n pathname = new URL(rawUrl).pathname;\n } catch {\n pathname = rawUrl.startsWith('/') ? rawUrl : `/${rawUrl}`;\n }\n } else {\n pathname = rawUrl.startsWith('/') ? rawUrl : `/${rawUrl}`;\n }\n\n closeModal();\n closeDrawer();\n\n const isHomepage = pathname === '/' || pathname === '';\n const isAllowed =\n isHomepage ||\n navigationItems.some(\n (item) => pathname === `/${item.path}` || pathname.startsWith(`/${item.path}/`),\n );\n if (isAllowed) {\n navigate(pathname || '/');\n } else {\n shellui.toast({\n type: 'error',\n title: t('navigationError') ?? 'Navigation error',\n description:\n t('navigationNotAllowed') ?? 'This URL is not configured in the app navigation.',\n });\n }\n });\n return () => cleanup();\n }, [navigate, closeModal, closeDrawer, navigationItems, t]);\n\n return (\n <>\n {children}\n <Dialog\n open={isOpen}\n onOpenChange={closeModal}\n >\n <DialogContent className=\"max-w-4xl w-full h-[80vh] max-h-[680px] flex flex-col p-0 overflow-hidden\">\n {modalUrl ? (\n <>\n <DialogTitle className=\"sr-only\">\n {resolveLocalizedString(\n navigationItems.find((item) => item.url === modalUrl)?.label,\n currentLanguage,\n )}\n </DialogTitle>\n <DialogDescription className=\"sr-only\">\n {t('modalContent') ?? 'Modal content'}\n </DialogDescription>\n <div\n className=\"flex-1\"\n style={{ minHeight: 0 }}\n >\n <ContentView\n url={modalUrl}\n pathPrefix=\"settings\"\n ignoreMessages={true}\n navItem={navigationItems.find((item) => item.url === modalUrl) as NavigationItem}\n />\n </div>\n </>\n ) : (\n <>\n <DialogTitle className=\"sr-only\">Error: Modal URL is undefined</DialogTitle>\n <DialogDescription className=\"sr-only\">\n The openModal function was called without a valid URL parameter.\n </DialogDescription>\n <div className=\"flex-1 p-4\">\n <div className=\"rounded-lg border border-destructive/50 bg-destructive/10 p-4\">\n <h3 className=\"font-semibold text-destructive mb-2\">\n Error: Modal URL is undefined\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n The <code className=\"text-xs bg-background px-1 py-0.5 rounded\">openModal</code>{' '}\n function was called without a valid URL parameter. Please ensure you provide a\n URL when opening the modal.\n </p>\n </div>\n </div>\n </>\n )}\n </DialogContent>\n </Dialog>\n <Drawer\n open={isDrawerOpen}\n onOpenChange={(open) => !open && closeDrawer()}\n direction={drawerPosition}\n >\n <DrawerContent\n direction={drawerPosition}\n size={drawerSize}\n className=\"p-0 overflow-hidden flex flex-col\"\n >\n {drawerUrl ? (\n <div className=\"flex-1 min-h-0 flex flex-col\">\n <ContentView\n url={drawerUrl}\n pathPrefix=\"settings\"\n ignoreMessages={true}\n navItem={navigationItems.find((item) => item.url === drawerUrl) as NavigationItem}\n />\n </div>\n ) : (\n <div className=\"flex-1 p-4\">\n <div className=\"rounded-lg border border-destructive/50 bg-destructive/10 p-4\">\n <h3 className=\"font-semibold text-destructive mb-2\">\n Error: Drawer URL is undefined\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n The <code className=\"text-xs bg-background px-1 py-0.5 rounded\">openDrawer</code>{' '}\n function was called without a valid URL parameter. Please ensure you provide a URL\n when opening the drawer.\n </p>\n </div>\n </div>\n )}\n </DrawerContent>\n </Drawer>\n <Toaster />\n </>\n );\n}\n"],"names":["validateAndNormalizeUrl","url","urlObj","currentOrigin","normalizedPath","error","ModalContext","createContext","useModal","context","useContext","ModalProvider","children","isOpen","setIsOpen","useState","modalUrl","setModalUrl","openModal","useCallback","validatedUrl","closeModal","useEffect","cleanupOpenModal","shellui","data","payload","cleanupCloseModal","jsx","DEFAULT_DRAWER_POSITION","DrawerContext","useDrawer","DrawerProvider","drawerUrl","setDrawerUrl","position","setPosition","size","setSize","openDrawer","options","closeDrawer","cleanupOpen","cleanupClose","SonnerContext","SonnerProvider","toast","id","title","description","type","duration","action","cancel","onDismiss","onAutoClose","toastOptions","sonnerToast","cleanupToast","actionSent","cancelSent","cleanupToastUpdate","LayoutProviders","Dialog","DialogPrimitive","DialogPortal","DialogOverlay","forwardRef","className","props","ref","cn","Z_INDEX","DialogContent","onPointerDownOutside","hideCloseButton","hasContent","Children","handlePointerDownOutside","event","jsxs","DialogTitle","DialogDescription","Drawer","open","onOpenChange","direction","VaulDrawer","DrawerTrigger","DrawerPortal","DrawerOverlay","drawerContentByDirection","DrawerContent","style","pos","isVertical","effectiveSize","sizeStyle","DrawerClose","DrawerTitle","DrawerDescription","Toaster","settings","useSettings","Sonner","OverlayShell","navigationItems","navigate","useNavigate","isDrawerOpen","drawerPosition","drawerSize","t","i18n","useTranslation","currentLanguage","cleanup","rawUrl","pathname","item","Fragment","resolveLocalizedString","ContentView"],"mappings":"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"}
|