@shellui/core 0.0.11 → 0.0.12
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/README.md +0 -11
- package/dist/ContentView-CZG-ro_B.js +146 -0
- package/dist/ContentView-CZG-ro_B.js.map +1 -0
- package/dist/CookiePreferencesView-CIXBJWNt.js +213 -0
- package/dist/CookiePreferencesView-CIXBJWNt.js.map +1 -0
- package/dist/DefaultLayout-Bztmv2c_.js +406 -0
- package/dist/DefaultLayout-Bztmv2c_.js.map +1 -0
- package/dist/FullscreenLayout-DiX6dbkf.js +30 -0
- package/dist/FullscreenLayout-DiX6dbkf.js.map +1 -0
- package/dist/HomeView-C610YU6V.js +21 -0
- package/dist/HomeView-C610YU6V.js.map +1 -0
- package/dist/NotFoundView-D00gYlq-.js +52 -0
- package/dist/NotFoundView-D00gYlq-.js.map +1 -0
- package/dist/OverlayShell-CGjN4rTu.js +642 -0
- package/dist/OverlayShell-CGjN4rTu.js.map +1 -0
- package/dist/SettingsView-2QMtfS71.js +2207 -0
- package/dist/SettingsView-2QMtfS71.js.map +1 -0
- package/dist/ViewRoute-ChSPabOy.js +32 -0
- package/dist/ViewRoute-ChSPabOy.js.map +1 -0
- package/dist/WindowsLayout-DkSNQDSb.js +633 -0
- package/dist/WindowsLayout-DkSNQDSb.js.map +1 -0
- package/dist/app.d.ts +3 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/components/ContentView.d.ts +10 -0
- package/dist/components/ContentView.d.ts.map +1 -0
- package/dist/components/HomeView.d.ts +2 -0
- package/dist/components/HomeView.d.ts.map +1 -0
- package/dist/components/LoadingOverlay.d.ts +2 -0
- package/dist/components/LoadingOverlay.d.ts.map +1 -0
- package/dist/components/NotFoundView.d.ts +2 -0
- package/dist/components/NotFoundView.d.ts.map +1 -0
- package/dist/components/RouteErrorBoundary.d.ts +2 -0
- package/dist/components/RouteErrorBoundary.d.ts.map +1 -0
- package/dist/components/ViewRoute.d.ts +7 -0
- package/dist/components/ViewRoute.d.ts.map +1 -0
- package/dist/components/ui/alert-dialog.d.ts +32 -0
- package/dist/components/ui/alert-dialog.d.ts.map +1 -0
- package/dist/components/ui/breadcrumb.d.ts +20 -0
- package/dist/components/ui/breadcrumb.d.ts.map +1 -0
- package/dist/components/ui/button-group.d.ts +7 -0
- package/dist/components/ui/button-group.d.ts.map +1 -0
- package/dist/components/ui/button.d.ts +12 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/dialog.d.ts +24 -0
- package/dist/components/ui/dialog.d.ts.map +1 -0
- package/dist/components/ui/drawer.d.ts +38 -0
- package/dist/components/ui/drawer.d.ts.map +1 -0
- package/dist/components/ui/select.d.ts +5 -0
- package/dist/components/ui/select.d.ts.map +1 -0
- package/dist/components/ui/sidebar.d.ts +46 -0
- package/dist/components/ui/sidebar.d.ts.map +1 -0
- package/dist/components/ui/sonner.d.ts +6 -0
- package/dist/components/ui/sonner.d.ts.map +1 -0
- package/dist/components/ui/switch.d.ts +8 -0
- package/dist/components/ui/switch.d.ts.map +1 -0
- package/dist/constants/urls.d.ts +6 -0
- package/dist/constants/urls.d.ts.map +1 -0
- package/dist/constants/urls.js +8 -0
- package/dist/constants/urls.js.map +1 -0
- package/dist/features/alertDialog/DialogContext.d.ts +12 -0
- package/dist/features/alertDialog/DialogContext.d.ts.map +1 -0
- package/dist/features/config/ConfigProvider.d.ts +15 -0
- package/dist/features/config/ConfigProvider.d.ts.map +1 -0
- package/dist/features/config/types.d.ts +177 -0
- package/dist/features/config/types.d.ts.map +1 -0
- package/dist/features/config/useConfig.d.ts +8 -0
- package/dist/features/config/useConfig.d.ts.map +1 -0
- package/dist/features/cookieConsent/CookieConsentModal.d.ts +6 -0
- package/dist/features/cookieConsent/CookieConsentModal.d.ts.map +1 -0
- package/dist/features/cookieConsent/CookiePreferencesView.d.ts +2 -0
- package/dist/features/cookieConsent/CookiePreferencesView.d.ts.map +1 -0
- package/dist/features/cookieConsent/cookieConsent.d.ts +22 -0
- package/dist/features/cookieConsent/cookieConsent.d.ts.map +1 -0
- package/dist/features/cookieConsent/useCookieConsent.d.ts +15 -0
- package/dist/features/cookieConsent/useCookieConsent.d.ts.map +1 -0
- package/dist/features/drawer/DrawerContext.d.ts +24 -0
- package/dist/features/drawer/DrawerContext.d.ts.map +1 -0
- package/dist/features/layouts/AppLayout.d.ts +12 -0
- package/dist/features/layouts/AppLayout.d.ts.map +1 -0
- package/dist/features/layouts/DefaultLayout.d.ts +10 -0
- package/dist/features/layouts/DefaultLayout.d.ts.map +1 -0
- package/dist/features/layouts/FullscreenLayout.d.ts +9 -0
- package/dist/features/layouts/FullscreenLayout.d.ts.map +1 -0
- package/dist/features/layouts/LayoutProviders.d.ts +9 -0
- package/dist/features/layouts/LayoutProviders.d.ts.map +1 -0
- package/dist/features/layouts/OverlayShell.d.ts +10 -0
- package/dist/features/layouts/OverlayShell.d.ts.map +1 -0
- package/dist/features/layouts/WindowsLayout.d.ts +24 -0
- package/dist/features/layouts/WindowsLayout.d.ts.map +1 -0
- package/dist/features/layouts/utils.d.ts +16 -0
- package/dist/features/layouts/utils.d.ts.map +1 -0
- package/dist/features/modal/ModalContext.d.ts +20 -0
- package/dist/features/modal/ModalContext.d.ts.map +1 -0
- package/dist/features/sentry/initSentry.d.ts +14 -0
- package/dist/features/sentry/initSentry.d.ts.map +1 -0
- package/dist/features/settings/SettingsContext.d.ts +10 -0
- package/dist/features/settings/SettingsContext.d.ts.map +1 -0
- package/dist/features/settings/SettingsIcons.d.ts +22 -0
- package/dist/features/settings/SettingsIcons.d.ts.map +1 -0
- package/dist/features/settings/SettingsProvider.d.ts +5 -0
- package/dist/features/settings/SettingsProvider.d.ts.map +1 -0
- package/dist/features/settings/SettingsRoutes.d.ts +7 -0
- package/dist/features/settings/SettingsRoutes.d.ts.map +1 -0
- package/dist/features/settings/SettingsView.d.ts +2 -0
- package/dist/features/settings/SettingsView.d.ts.map +1 -0
- package/dist/features/settings/components/Advanced.d.ts +2 -0
- package/dist/features/settings/components/Advanced.d.ts.map +1 -0
- package/dist/features/settings/components/Appearance.d.ts +2 -0
- package/dist/features/settings/components/Appearance.d.ts.map +1 -0
- package/dist/features/settings/components/DataPrivacy.d.ts +2 -0
- package/dist/features/settings/components/DataPrivacy.d.ts.map +1 -0
- package/dist/features/settings/components/Develop.d.ts +2 -0
- package/dist/features/settings/components/Develop.d.ts.map +1 -0
- package/dist/features/settings/components/LanguageAndRegion.d.ts +2 -0
- package/dist/features/settings/components/LanguageAndRegion.d.ts.map +1 -0
- package/dist/features/settings/components/ServiceWorker.d.ts +2 -0
- package/dist/features/settings/components/ServiceWorker.d.ts.map +1 -0
- package/dist/features/settings/components/UpdateApp.d.ts +2 -0
- package/dist/features/settings/components/UpdateApp.d.ts.map +1 -0
- package/dist/features/settings/components/develop/DialogTestButtons.d.ts +2 -0
- package/dist/features/settings/components/develop/DialogTestButtons.d.ts.map +1 -0
- package/dist/features/settings/components/develop/DrawerTestButtons.d.ts +2 -0
- package/dist/features/settings/components/develop/DrawerTestButtons.d.ts.map +1 -0
- package/dist/features/settings/components/develop/ModalTestButtons.d.ts +2 -0
- package/dist/features/settings/components/develop/ModalTestButtons.d.ts.map +1 -0
- package/dist/features/settings/components/develop/ToastTestButtons.d.ts +2 -0
- package/dist/features/settings/components/develop/ToastTestButtons.d.ts.map +1 -0
- package/dist/features/settings/hooks/useSettings.d.ts +2 -0
- package/dist/features/settings/hooks/useSettings.d.ts.map +1 -0
- package/dist/features/sonner/SonnerContext.d.ts +29 -0
- package/dist/features/sonner/SonnerContext.d.ts.map +1 -0
- package/dist/features/theme/ThemeProvider.d.ts +11 -0
- package/dist/features/theme/ThemeProvider.d.ts.map +1 -0
- package/dist/features/theme/themes.d.ts +114 -0
- package/dist/features/theme/themes.d.ts.map +1 -0
- package/dist/features/theme/useTheme.d.ts +10 -0
- package/dist/features/theme/useTheme.d.ts.map +1 -0
- package/dist/i18n/I18nProvider.d.ts +9 -0
- package/dist/i18n/I18nProvider.d.ts.map +1 -0
- package/dist/i18n/config.d.ts +23 -0
- package/dist/i18n/config.d.ts.map +1 -0
- package/dist/i18n/translations/en/common.json.d.ts +19 -0
- package/dist/i18n/translations/en/cookieConsent.json.d.ts +53 -0
- package/dist/i18n/translations/en/settings.json.d.ts +358 -0
- package/dist/i18n/translations/fr/common.json.d.ts +19 -0
- package/dist/i18n/translations/fr/cookieConsent.json.d.ts +53 -0
- package/dist/i18n/translations/fr/settings.json.d.ts +358 -0
- package/dist/index-PsePV0Ng.js +2160 -0
- package/dist/index-PsePV0Ng.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/z-index.d.ts +29 -0
- package/dist/lib/z-index.d.ts.map +1 -0
- package/dist/router/router.d.ts +3 -0
- package/dist/router/router.d.ts.map +1 -0
- package/dist/router/routes.d.ts +4 -0
- package/dist/router/routes.d.ts.map +1 -0
- package/dist/sidebar-Cvm_uv4l.js +336 -0
- package/dist/sidebar-Cvm_uv4l.js.map +1 -0
- package/dist/style.css +1 -0
- package/dist/switch-BjkiJBIa.js +44 -0
- package/dist/switch-BjkiJBIa.js.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +16 -14
- package/src/index.ts +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SettingsView-2QMtfS71.js","sources":["../src/components/ui/breadcrumb.tsx","../src/features/settings/SettingsIcons.tsx","../src/components/ui/button-group.tsx","../src/features/settings/components/Appearance.tsx","../src/components/ui/select.tsx","../src/features/settings/components/LanguageAndRegion.tsx","../src/features/settings/components/UpdateApp.tsx","../src/features/settings/components/Advanced.tsx","../src/features/settings/components/develop/ToastTestButtons.tsx","../src/features/settings/components/develop/DialogTestButtons.tsx","../src/features/settings/components/develop/ModalTestButtons.tsx","../src/features/settings/components/develop/DrawerTestButtons.tsx","../src/features/settings/components/Develop.tsx","../src/features/settings/components/DataPrivacy.tsx","../src/features/settings/components/ServiceWorker.tsx","../src/features/settings/SettingsRoutes.tsx","../src/features/settings/SettingsView.tsx"],"sourcesContent":["import {\n forwardRef,\n type ComponentPropsWithoutRef,\n type ComponentProps,\n type ReactNode,\n} from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { cn } from '@/lib/utils';\n\nconst Breadcrumb = forwardRef<\n HTMLElement,\n ComponentPropsWithoutRef<'nav'> & {\n separator?: ReactNode;\n }\n>(({ ...props }, ref) => (\n <nav\n ref={ref}\n aria-label=\"breadcrumb\"\n {...props}\n />\n));\nBreadcrumb.displayName = 'Breadcrumb';\n\nconst BreadcrumbList = forwardRef<HTMLOListElement, ComponentPropsWithoutRef<'ol'>>(\n ({ className, ...props }, ref) => (\n <ol\n ref={ref}\n className={cn(\n 'flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5',\n className,\n )}\n {...props}\n />\n ),\n);\nBreadcrumbList.displayName = 'BreadcrumbList';\n\nconst BreadcrumbItem = forwardRef<HTMLLIElement, ComponentPropsWithoutRef<'li'>>(\n ({ className, ...props }, ref) => (\n <li\n ref={ref}\n className={cn('inline-flex items-center gap-1.5', className)}\n {...props}\n />\n ),\n);\nBreadcrumbItem.displayName = 'BreadcrumbItem';\n\nconst BreadcrumbLink = forwardRef<\n HTMLAnchorElement,\n ComponentPropsWithoutRef<'a'> & {\n asChild?: boolean;\n }\n>(({ asChild, className, ...props }, ref) => {\n const Comp = asChild ? Slot : 'a';\n\n return (\n <Comp\n ref={ref}\n className={cn('transition-colors hover:text-foreground', className)}\n {...props}\n />\n );\n});\nBreadcrumbLink.displayName = 'BreadcrumbLink';\n\nconst BreadcrumbPage = forwardRef<HTMLSpanElement, ComponentPropsWithoutRef<'span'>>(\n ({ className, ...props }, ref) => (\n <span\n ref={ref}\n role=\"link\"\n aria-disabled=\"true\"\n aria-current=\"page\"\n className={cn('font-normal text-foreground', className)}\n {...props}\n />\n ),\n);\nBreadcrumbPage.displayName = 'BreadcrumbPage';\n\nconst BreadcrumbSeparator = ({ children, className, ...props }: ComponentProps<'li'>) => (\n <li\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn('[&>svg]:size-3.5', className)}\n {...props}\n >\n {children ?? (\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 >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n )}\n </li>\n);\nBreadcrumbSeparator.displayName = 'BreadcrumbSeparator';\n\nconst BreadcrumbEllipsis = ({ className, ...props }: ComponentProps<'span'>) => (\n <span\n role=\"presentation\"\n aria-hidden=\"true\"\n className={cn('flex h-9 w-9 items-center justify-center', className)}\n {...props}\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 <circle\n cx=\"12\"\n cy=\"12\"\n r=\"1\"\n />\n <circle\n cx=\"19\"\n cy=\"12\"\n r=\"1\"\n />\n <circle\n cx=\"5\"\n cy=\"12\"\n r=\"1\"\n />\n </svg>\n <span className=\"sr-only\">More</span>\n </span>\n);\nBreadcrumbEllipsis.displayName = 'BreadcrumbEllipsis';\n\nexport {\n Breadcrumb,\n BreadcrumbList,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbPage,\n BreadcrumbSeparator,\n BreadcrumbEllipsis,\n};\n","// Simple icon components (since we don't have lucide-react)\nexport const MenuIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line\n x1=\"4\"\n x2=\"20\"\n y1=\"12\"\n y2=\"12\"\n />\n <line\n x1=\"4\"\n x2=\"20\"\n y1=\"6\"\n y2=\"6\"\n />\n <line\n x1=\"4\"\n x2=\"20\"\n y1=\"18\"\n y2=\"18\"\n />\n </svg>\n);\n\nexport const HomeIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n <polyline points=\"9 22 9 12 15 12 15 22\" />\n </svg>\n);\n\nexport const PaintbrushIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path\n fill=\"none\"\n d=\"m14.622 17.897l-10.68-2.913M18.376 2.622a1 1 0 1 1 3.002 3.002L17.36 9.643a.5.5 0 0 0 0 .707l.944.944a2.41 2.41 0 0 1 0 3.408l-.944.944a.5.5 0 0 1-.707 0L8.354 7.348a.5.5 0 0 1 0-.707l.944-.944a2.41 2.41 0 0 1 3.408 0l.944.944a.5.5 0 0 0 .707 0zM9 8c-1.804 2.71-3.97 3.46-6.583 3.948a.507.507 0 0 0-.302.819l7.32 8.883a1 1 0 0 0 1.185.204C12.735 20.405 16 16.792 16 15\"\n />\n </svg>\n);\n\nexport const MessageCircleIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M7.9 20A9 9 0 1 0 4 16.1L2 22Z\" />\n </svg>\n);\n\nexport const GlobeIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n />\n <line\n x1=\"2\"\n x2=\"22\"\n y1=\"12\"\n y2=\"12\"\n />\n <path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\" />\n </svg>\n);\n\nexport const KeyboardIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect\n width=\"20\"\n height=\"16\"\n x=\"2\"\n y=\"4\"\n rx=\"2\"\n />\n <path d=\"M6 8h.01\" />\n <path d=\"M10 8h.01\" />\n <path d=\"M14 8h.01\" />\n <path d=\"M18 8h.01\" />\n <path d=\"M8 12h.01\" />\n <path d=\"M12 12h.01\" />\n <path d=\"M16 12h.01\" />\n <path d=\"M7 16h10\" />\n </svg>\n);\n\nexport const CheckIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n);\n\nexport const VideoIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m16 13 5.223 3.482a.5.5 0 0 0 .777-.416V7.87a.5.5 0 0 0-.752-.432L16 10.5\" />\n <rect\n x=\"2\"\n y=\"6\"\n width=\"14\"\n height=\"12\"\n rx=\"2\"\n />\n </svg>\n);\n\nexport const LinkIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </svg>\n);\n\nexport const LockIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect\n width=\"18\"\n height=\"11\"\n x=\"3\"\n y=\"11\"\n rx=\"2\"\n ry=\"2\"\n />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n);\n\nexport const SettingsIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z\" />\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"3\"\n />\n </svg>\n);\n\nexport const CodeIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n </svg>\n);\n\nexport const ChevronRightIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n);\n\nexport const ChevronLeftIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n);\n\nexport const ShieldIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\" />\n </svg>\n);\n\nexport const HardDriveIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line\n x1=\"22\"\n y1=\"12\"\n x2=\"2\"\n y2=\"12\"\n />\n <path d=\"M5.45 5.11L2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\" />\n <line\n x1=\"6\"\n y1=\"16\"\n x2=\"6.01\"\n y2=\"16\"\n />\n <line\n x1=\"10\"\n y1=\"16\"\n x2=\"10.01\"\n y2=\"16\"\n />\n </svg>\n);\n\nexport const RefreshCwIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n </svg>\n);\n\n/** Double-arrow refresh / sync icon (two curved arrows in a circle). */\nexport const RefreshDoubleIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 12a9 9 0 0 0-9-9a9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5m-5 4a9 9 0 0 0 9 9a9.75 9.75 0 0 0 6.74-2.74L21 16\" />\n <path d=\"M16 16h5v5\" />\n </svg>\n);\n\nexport const ServerIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect\n width=\"20\"\n height=\"8\"\n x=\"2\"\n y=\"2\"\n rx=\"2\"\n ry=\"2\"\n />\n <rect\n width=\"20\"\n height=\"8\"\n x=\"2\"\n y=\"14\"\n rx=\"2\"\n ry=\"2\"\n />\n <line\n x1=\"6\"\n y1=\"6\"\n x2=\"6.01\"\n y2=\"6\"\n />\n <line\n x1=\"6\"\n y1=\"18\"\n x2=\"6.01\"\n y2=\"18\"\n />\n <line\n x1=\"10\"\n y1=\"6\"\n x2=\"10.01\"\n y2=\"6\"\n />\n <line\n x1=\"10\"\n y1=\"18\"\n x2=\"10.01\"\n y2=\"18\"\n />\n </svg>\n);\n\nexport const PackageIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m7.5 4.27 9 5.15\" />\n <path d=\"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z\" />\n <path d=\"m3.3 7 8.7 5 8.7-5\" />\n <path d=\"M12 22V12\" />\n </svg>\n);\n","import {\n forwardRef,\n Children,\n isValidElement,\n cloneElement,\n type HTMLAttributes,\n type ReactNode,\n type ReactElement,\n} from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface ButtonGroupProps extends HTMLAttributes<HTMLDivElement> {\n children: ReactNode;\n}\n\nconst ButtonGroup = forwardRef<HTMLDivElement, ButtonGroupProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={cn('inline-flex rounded-md', className)}\n role=\"group\"\n {...props}\n >\n {Children.map(children, (child, index) => {\n if (isValidElement(child)) {\n const isFirst = index === 0;\n const isLast = index === Children.count(children) - 1;\n\n return cloneElement(child as ReactElement<Record<string, unknown>>, {\n className: cn(\n // Remove rounded corners from all buttons\n 'rounded-none',\n // First button: rounded left only (uses theme radius)\n isFirst && 'rounded-l-md',\n // Last button: rounded right only (uses theme radius)\n isLast && 'rounded-r-md',\n // Remove left border from all except first, using theme border color\n !isFirst && 'border-l-0 -ml-px',\n (child as ReactElement<{ className?: string }>).props.className,\n ),\n });\n }\n return child;\n })}\n </div>\n );\n },\n);\nButtonGroup.displayName = 'ButtonGroup';\n\nexport { ButtonGroup };\n","import { useTranslation } from 'react-i18next';\nimport { useSettings } from '../hooks/useSettings';\nimport { useConfig } from '@/features/config/useConfig';\nimport { Button } from '@/components/ui/button';\nimport { ButtonGroup } from '@/components/ui/button-group';\nimport { cn } from '@/lib/utils';\nimport { useEffect, useState } from 'react';\nimport { getAllThemes, registerTheme, type ThemeDefinition } from '@/features/theme/themes';\n\nconst SunIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"4\"\n />\n <path d=\"M12 2v2\" />\n <path d=\"M12 20v2\" />\n <path d=\"m4.93 4.93 1.41 1.41\" />\n <path d=\"m17.66 17.66 1.41 1.41\" />\n <path d=\"M2 12h2\" />\n <path d=\"M20 12h2\" />\n <path d=\"m6.34 17.66-1.41 1.41\" />\n <path d=\"m19.07 4.93-1.41 1.41\" />\n </svg>\n);\n\nconst MoonIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\" />\n </svg>\n);\n\nconst MonitorIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect\n width=\"20\"\n height=\"14\"\n x=\"2\"\n y=\"3\"\n rx=\"2\"\n />\n <line\n x1=\"8\"\n x2=\"16\"\n y1=\"21\"\n y2=\"21\"\n />\n <line\n x1=\"12\"\n x2=\"12\"\n y1=\"17\"\n y2=\"21\"\n />\n </svg>\n);\n\n// Theme color preview component\nconst ThemePreview = ({\n theme,\n isSelected,\n isDark,\n}: {\n theme: ThemeDefinition;\n isSelected: boolean;\n isDark: boolean;\n}) => {\n const colors = isDark ? theme.colors.dark : theme.colors.light;\n\n return (\n <div\n className={cn(\n 'relative overflow-hidden rounded-lg border-2 transition-all',\n isSelected ? 'border-primary shadow-lg' : 'border-border',\n )}\n style={{ backgroundColor: colors.background }}\n >\n <div className=\"p-3 space-y-2\">\n {/* Primary color */}\n <div\n className=\"h-8 rounded-md\"\n style={{ backgroundColor: colors.primary }}\n />\n {/* Secondary colors */}\n <div className=\"flex gap-1\">\n <div\n className=\"h-6 flex-1 rounded\"\n style={{ backgroundColor: colors.background }}\n />\n <div\n className=\"h-6 flex-1 rounded\"\n style={{ backgroundColor: colors.secondary }}\n />\n <div\n className=\"h-6 flex-1 rounded\"\n style={{ backgroundColor: colors.accent }}\n />\n </div>\n {/* Accent colors */}\n <div className=\"flex gap-1\">\n <div\n className=\"h-4 flex-1 rounded\"\n style={{ backgroundColor: colors.muted }}\n />\n <div\n className=\"h-4 flex-1 rounded\"\n style={{ backgroundColor: colors.border }}\n />\n </div>\n </div>\n {/* Theme name overlay */}\n <div\n className=\"absolute bottom-0 left-0 right-0 bg-background/90 backdrop-blur-sm px-2 py-1\"\n style={{ backgroundColor: colors.background }}\n >\n <p\n className=\"text-xs font-medium text-center\"\n style={\n theme.fontFamily\n ? {\n fontFamily: theme.fontFamily,\n letterSpacing: theme.letterSpacing || 'normal',\n textShadow: theme.textShadow || 'none',\n }\n : {}\n }\n >\n {theme.displayName}\n </p>\n </div>\n </div>\n );\n};\n\nexport const Appearance = () => {\n const { t } = useTranslation('settings');\n const { settings, updateSetting } = useSettings();\n const { config } = useConfig();\n const currentTheme = settings.appearance?.theme || 'system';\n const currentThemeName = settings.appearance?.themeName || 'default';\n\n const [availableThemes, setAvailableThemes] = useState<ThemeDefinition[]>([]);\n\n // Register custom themes from config and get all themes\n useEffect(() => {\n if (config?.themes) {\n config.themes.forEach((themeDef: ThemeDefinition) => {\n registerTheme(themeDef);\n });\n }\n setAvailableThemes(getAllThemes());\n }, [config]);\n\n // Determine if we're in dark mode for preview\n const [isDarkForPreview, setIsDarkForPreview] = useState(() => {\n if (typeof window === 'undefined') return false;\n return (\n currentTheme === 'dark' ||\n (currentTheme === 'system' && window.matchMedia('(prefers-color-scheme: dark)').matches)\n );\n });\n\n // Update preview mode when theme changes\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const updatePreview = () => {\n setIsDarkForPreview(\n currentTheme === 'dark' ||\n (currentTheme === 'system' && window.matchMedia('(prefers-color-scheme: dark)').matches),\n );\n };\n\n updatePreview();\n\n if (currentTheme === 'system') {\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handleChange = () => updatePreview();\n\n if (mediaQuery.addEventListener) {\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n } else if (mediaQuery.addListener) {\n mediaQuery.addListener(handleChange);\n return () => mediaQuery.removeListener(handleChange);\n }\n }\n }, [currentTheme]);\n\n const modeThemes = [\n { value: 'light' as const, label: t('appearance.themes.light'), icon: SunIcon },\n { value: 'dark' as const, label: t('appearance.themes.dark'), icon: MoonIcon },\n { value: 'system' as const, label: t('appearance.themes.system'), icon: MonitorIcon },\n ];\n\n return (\n <div className=\"space-y-6\">\n {/* Theme Mode Selection (Light/Dark/System) */}\n <div className=\"space-y-2\">\n <div className=\"space-y-0.5\">\n <label\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('appearance.mode')}\n </label>\n <p className=\"text-sm text-muted-foreground\">{t('appearance.modeDescription')}</p>\n </div>\n <div className=\"mt-2\">\n <ButtonGroup>\n {modeThemes.map((theme) => {\n const Icon = theme.icon;\n const isSelected = currentTheme === theme.value;\n return (\n <Button\n key={theme.value}\n variant={isSelected ? 'default' : 'outline'}\n onClick={() => {\n updateSetting('appearance', { theme: theme.value });\n }}\n className={cn(\n 'h-10 px-4 transition-all flex items-center gap-2 cursor-pointer',\n isSelected && ['font-semibold'],\n !isSelected && ['bg-background hover:bg-accent/50', 'text-muted-foreground'],\n )}\n aria-label={theme.label}\n title={theme.label}\n >\n <Icon />\n <span className=\"text-sm font-medium\">{theme.label}</span>\n </Button>\n );\n })}\n </ButtonGroup>\n </div>\n </div>\n\n {/* Theme Selection (Color Scheme) */}\n <div className=\"space-y-2\">\n <div className=\"space-y-0.5\">\n <label\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('appearance.colorTheme')}\n </label>\n <p className=\"text-sm text-muted-foreground\">{t('appearance.colorThemeDescription')}</p>\n </div>\n <div className=\"mt-2 grid grid-cols-2 md:grid-cols-3 gap-4\">\n {availableThemes.map((theme) => {\n const isSelected = currentThemeName === theme.name;\n return (\n <button\n key={theme.name}\n onClick={() => {\n updateSetting('appearance', { themeName: theme.name });\n }}\n className={cn(\n 'text-left transition-all cursor-pointer',\n isSelected && 'ring-2 ring-primary ring-offset-2 rounded-lg',\n )}\n aria-label={theme.displayName}\n >\n <ThemePreview\n theme={theme}\n isSelected={isSelected}\n isDark={isDarkForPreview}\n />\n </button>\n );\n })}\n </div>\n </div>\n </div>\n );\n};\n","import { forwardRef, type SelectHTMLAttributes } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type SelectProps = SelectHTMLAttributes<HTMLSelectElement>;\n\nconst Select = forwardRef<HTMLSelectElement, SelectProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <select\n className={cn(\n 'select-field flex h-10 w-full rounded-md border border-input bg-background pl-3 pr-10 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 cursor-pointer disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n ref={ref}\n {...props}\n >\n {children}\n </select>\n );\n },\n);\nSelect.displayName = 'Select';\n\nexport { Select };\n","import { useTranslation } from 'react-i18next';\nimport { useSettings } from '../hooks/useSettings';\nimport { useConfig } from '@/features/config/useConfig';\nimport { getSupportedLanguages } from '@/i18n/config';\nimport { Button } from '@/components/ui/button';\nimport { ButtonGroup } from '@/components/ui/button-group';\nimport { Select } from '@/components/ui/select';\nimport { cn } from '@/lib/utils';\nimport { useState, useEffect } from 'react';\n\nconst GlobeIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n />\n <line\n x1=\"2\"\n x2=\"22\"\n y1=\"12\"\n y2=\"12\"\n />\n <path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\" />\n </svg>\n);\n\nconst ClockIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n);\n\n// Timezones organized by region\nconst TIMEZONE_GROUPS = [\n {\n label: 'UTC',\n timezones: [{ value: 'UTC', label: 'UTC (Coordinated Universal Time)' }],\n },\n {\n label: 'North America',\n timezones: [\n { value: 'America/New_York', label: 'Eastern Time (US & Canada)' },\n { value: 'America/Chicago', label: 'Central Time (US & Canada)' },\n { value: 'America/Denver', label: 'Mountain Time (US & Canada)' },\n { value: 'America/Los_Angeles', label: 'Pacific Time (US & Canada)' },\n { value: 'America/Toronto', label: 'Toronto' },\n { value: 'America/Vancouver', label: 'Vancouver' },\n { value: 'America/Mexico_City', label: 'Mexico City' },\n ],\n },\n {\n label: 'South America',\n timezones: [\n { value: 'America/Sao_Paulo', label: 'São Paulo' },\n { value: 'America/Buenos_Aires', label: 'Buenos Aires' },\n ],\n },\n {\n label: 'Europe',\n timezones: [\n { value: 'Europe/London', label: 'London' },\n { value: 'Europe/Paris', label: 'Paris' },\n { value: 'Europe/Berlin', label: 'Berlin' },\n { value: 'Europe/Rome', label: 'Rome' },\n { value: 'Europe/Madrid', label: 'Madrid' },\n { value: 'Europe/Amsterdam', label: 'Amsterdam' },\n { value: 'Europe/Stockholm', label: 'Stockholm' },\n { value: 'Europe/Zurich', label: 'Zurich' },\n ],\n },\n {\n label: 'Asia',\n timezones: [\n { value: 'Asia/Tokyo', label: 'Tokyo' },\n { value: 'Asia/Shanghai', label: 'Shanghai' },\n { value: 'Asia/Hong_Kong', label: 'Hong Kong' },\n { value: 'Asia/Singapore', label: 'Singapore' },\n { value: 'Asia/Dubai', label: 'Dubai' },\n { value: 'Asia/Kolkata', label: 'Mumbai, New Delhi' },\n { value: 'Asia/Bangkok', label: 'Bangkok' },\n ],\n },\n {\n label: 'Australia & Pacific',\n timezones: [\n { value: 'Australia/Sydney', label: 'Sydney' },\n { value: 'Australia/Melbourne', label: 'Melbourne' },\n { value: 'Pacific/Auckland', label: 'Auckland' },\n ],\n },\n];\n\n// Format date based on timezone and language\nconst formatDate = (date: Date, timezone: string, lang: string): string => {\n try {\n return new Intl.DateTimeFormat(lang, {\n timeZone: timezone,\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n }).format(date);\n } catch {\n return date.toLocaleDateString(lang);\n }\n};\n\n// Format time based on timezone and language\nconst formatTime = (date: Date, timezone: string, lang: string): string => {\n try {\n return new Intl.DateTimeFormat(lang, {\n timeZone: timezone,\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false,\n }).format(date);\n } catch {\n return date.toLocaleTimeString(lang);\n }\n};\n\n// Get browser's current timezone\nconst getBrowserTimezone = (): string => {\n if (typeof Intl !== 'undefined') {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n }\n return 'UTC';\n};\n\n// Get human-readable timezone name\nconst getTimezoneDisplayName = (timezone: string, lang = 'en'): string => {\n try {\n // Try to get a friendly name from Intl\n const formatter = new Intl.DateTimeFormat(lang, {\n timeZone: timezone,\n timeZoneName: 'long',\n });\n const parts = formatter.formatToParts(new Date());\n const timeZoneName = parts.find((part) => part.type === 'timeZoneName')?.value;\n\n if (timeZoneName) {\n return timeZoneName;\n }\n\n // Fallback: try to get city name from timezone string\n const cityName = timezone.split('/').pop()?.replace(/_/g, ' ') || timezone;\n return cityName;\n } catch {\n // Final fallback: use the timezone code\n return timezone;\n }\n};\n\nexport const LanguageAndRegion = () => {\n const { t } = useTranslation('settings');\n const { settings, updateSetting } = useSettings();\n const { config } = useConfig();\n const currentLanguage = settings.language?.code || 'en';\n const browserTimezone = getBrowserTimezone();\n const currentTimezone = settings.region?.timezone || browserTimezone;\n const isUsingBrowserTimezone = currentTimezone === browserTimezone;\n\n // Get supported languages based on config\n const supportedLanguages = getSupportedLanguages(config?.language);\n\n const handleResetRegion = () => {\n updateSetting('region', { timezone: browserTimezone });\n };\n\n // State for current date/time\n const [currentDateTime, setCurrentDateTime] = useState<{ date: string; time: string }>(() => {\n const now = new Date();\n return {\n date: formatDate(now, currentTimezone, currentLanguage),\n time: formatTime(now, currentTimezone, currentLanguage),\n };\n });\n\n // Update date/time every second and when timezone/language changes\n useEffect(() => {\n const updateDateTime = () => {\n const now = new Date();\n setCurrentDateTime({\n date: formatDate(now, currentTimezone, currentLanguage),\n time: formatTime(now, currentTimezone, currentLanguage),\n });\n };\n\n // Update immediately when timezone or language changes\n updateDateTime();\n\n // Then update every second\n const interval = setInterval(updateDateTime, 1000);\n\n return () => clearInterval(interval);\n }, [currentTimezone, currentLanguage]);\n\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <label\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('languageAndRegion.language')}\n </label>\n <div className=\"mt-2\">\n <ButtonGroup>\n {supportedLanguages.map((lang) => {\n const isSelected = currentLanguage === lang.code;\n return (\n <Button\n key={lang.code}\n variant={isSelected ? 'default' : 'outline'}\n onClick={() => {\n updateSetting('language', { code: lang.code });\n }}\n className={cn(\n 'h-10 px-4 transition-all flex items-center gap-2',\n isSelected && ['shadow-md', 'font-semibold'],\n !isSelected && ['bg-background hover:bg-accent/50', 'text-muted-foreground'],\n )}\n aria-label={lang.nativeName}\n title={lang.nativeName}\n >\n <GlobeIcon />\n <span className=\"text-sm font-medium\">{lang.nativeName}</span>\n </Button>\n );\n })}\n </ButtonGroup>\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <label\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('languageAndRegion.region')}\n </label>\n {!isUsingBrowserTimezone && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleResetRegion}\n className=\"h-8 text-xs\"\n >\n {t('languageAndRegion.resetToBrowser')}\n </Button>\n )}\n </div>\n <div className=\"mt-2 space-y-3\">\n <Select\n value={currentTimezone}\n onChange={(e) => {\n updateSetting('region', { timezone: e.target.value });\n }}\n className=\"w-full\"\n >\n {TIMEZONE_GROUPS.map((group) => (\n <optgroup\n key={group.label}\n label={group.label}\n >\n {group.timezones.map((tz) => {\n const isBrowserTimezone = tz.value === browserTimezone;\n return (\n <option\n key={tz.value}\n value={tz.value}\n >\n {tz.label}\n {isBrowserTimezone ? ` (${t('languageAndRegion.defaultBrowser')})` : ''}\n </option>\n );\n })}\n </optgroup>\n ))}\n </Select>\n <div className=\"flex items-center gap-2 px-3 py-2 rounded-md bg-muted/60 border border-border/50\">\n <ClockIcon />\n <div className=\"flex items-baseline gap-2\">\n <span className=\"text-lg font-semibold tabular-nums\">{currentDateTime.time}</span>\n <span className=\"text-xs text-muted-foreground\">{currentDateTime.date}</span>\n </div>\n </div>\n <div className=\"text-xs text-muted-foreground flex items-center gap-1\">\n <span>{t('languageAndRegion.timezoneLabel')}:</span>\n <span className=\"font-medium\">\n {getTimezoneDisplayName(currentTimezone, currentLanguage)}\n </span>\n {isUsingBrowserTimezone && (\n <span className=\"ml-1\">({t('languageAndRegion.defaultBrowser')})</span>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { useConfig } from '@/features/config/useConfig';\nimport { useSettings } from '../hooks/useSettings';\nimport { Button } from '@/components/ui/button';\nimport {\n isTauri,\n getServiceWorkerStatus,\n addStatusListener,\n checkForServiceWorkerUpdate,\n updateServiceWorker,\n} from '@/service-worker/register';\nimport { shellui, getLogger } from '@shellui/sdk';\nimport { CheckIcon } from '../SettingsIcons';\nimport { useState, useEffect } from 'react';\n\nconst logger = getLogger('shellcore');\n\nexport const UpdateApp = () => {\n const { t } = useTranslation('settings');\n const { config } = useConfig();\n const { settings } = useSettings();\n const [updateAvailable, setUpdateAvailable] = useState(false);\n const [checking, setChecking] = useState(false);\n const [showUpToDateInButton, setShowUpToDateInButton] = useState(false);\n const [checkError, setCheckError] = useState(false);\n\n const serviceWorkerEnabled = settings?.serviceWorker?.enabled ?? true;\n\n useEffect(() => {\n if (isTauri()) return;\n const load = async () => {\n const status = await getServiceWorkerStatus();\n setUpdateAvailable(status.updateAvailable);\n };\n load();\n const unsubscribe = addStatusListener((status) => {\n setUpdateAvailable(status.updateAvailable);\n // If an update becomes available, hide the \"You are up to date\" message and clear any errors\n if (status.updateAvailable) {\n setShowUpToDateInButton(false);\n setCheckError(false);\n }\n });\n return unsubscribe;\n }, []);\n\n const handleCheckForUpdate = async () => {\n if (isTauri()) return;\n setShowUpToDateInButton(false);\n setCheckError(false);\n setChecking(true);\n try {\n // Check current status before triggering update check\n const initialStatus = await getServiceWorkerStatus();\n\n // If update is already available, don't show \"You are up to date\"\n if (initialStatus.updateAvailable) {\n return;\n }\n\n // Trigger update check\n await checkForServiceWorkerUpdate();\n\n // Wait a bit for the update check to complete and status to update\n // The status listener will update updateAvailable if an update is found\n await new Promise((resolve) => setTimeout(resolve, 1000));\n\n // Check status again after update check\n // Use the state value which may have been updated by the status listener\n // If updateAvailable is true, don't show \"You are up to date\"\n if (!updateAvailable) {\n // Double-check with API to be sure\n const finalStatus = await getServiceWorkerStatus();\n if (!finalStatus.updateAvailable) {\n setShowUpToDateInButton(true);\n window.setTimeout(() => setShowUpToDateInButton(false), 3000);\n }\n }\n } catch (error) {\n // Error occurred during update check - show error message in button\n setCheckError(true);\n logger.error('Failed to check for service worker update:', { error });\n } finally {\n setChecking(false);\n }\n };\n\n const version = config?.version ?? t('updateApp.versionUnknown');\n\n if (isTauri()) {\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-2\">\n <div className=\"space-y-0.5\">\n <label\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('updateApp.currentVersion')}\n </label>\n <p className=\"text-sm text-muted-foreground\">{version}</p>\n </div>\n <div className=\"rounded-lg border border-border bg-muted/30 p-4\">\n <p className=\"text-sm text-muted-foreground\">{t('updateApp.tauriComingSoon')}</p>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-6\">\n <div className=\"space-y-4\">\n <div className=\"space-y-0.5\">\n <label\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('updateApp.currentVersion')}\n </label>\n <p className=\"text-sm text-muted-foreground\">{version}</p>\n </div>\n {!serviceWorkerEnabled ? (\n <div className=\"space-y-3\">\n <p className=\"text-sm text-muted-foreground\">{t('updateApp.swDisabledMessage')}</p>\n <Button\n variant=\"outline\"\n onClick={() => {\n const sent = shellui.sendMessageToParent({\n type: 'SHELLUI_REFRESH_PAGE',\n payload: {},\n });\n if (!sent) window.location.reload();\n }}\n className=\"w-full sm:w-auto\"\n >\n {t('updateApp.refreshApp')}\n </Button>\n </div>\n ) : (\n <>\n <div className=\"space-y-2\">\n <label\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('updateApp.status')}\n </label>\n <div className=\"flex items-center gap-2 text-sm mt-2\">\n {updateAvailable ? (\n <span className=\"text-blue-600 dark:text-blue-400\">\n ● {t('updateApp.statusUpdateAvailable')}\n </span>\n ) : (\n <span className=\"text-green-600 dark:text-green-400\">\n ● {t('updateApp.statusUpToDate')}\n </span>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-2 flex-wrap\">\n {updateAvailable && (\n <Button\n variant=\"default\"\n onClick={async () => {\n await updateServiceWorker();\n }}\n className=\"w-full sm:w-auto\"\n >\n {t('updateApp.installNow')}\n </Button>\n )}\n <Button\n variant=\"outline\"\n onClick={handleCheckForUpdate}\n disabled={checking || updateAvailable}\n className=\"w-full sm:w-auto\"\n >\n {checking ? (\n <>\n <span\n className=\"inline-block h-4 w-4 shrink-0 animate-spin rounded-full border-2 border-current border-t-transparent mr-2\"\n aria-hidden\n />\n {t('updateApp.checking')}\n </>\n ) : checkError ? (\n <span className=\"inline-flex items-center gap-2 text-red-600 dark:text-red-400\">\n {t('updateApp.checkError')}\n </span>\n ) : showUpToDateInButton && !updateAvailable ? (\n <span className=\"inline-flex items-center gap-2 text-green-600 dark:text-green-400\">\n <CheckIcon />\n {t('updateApp.youAreUpToDate')}\n </span>\n ) : (\n t('updateApp.checkForUpdate')\n )}\n </Button>\n </div>\n </>\n )}\n </div>\n </div>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { Switch } from '@/components/ui/switch';\nimport { useConfig } from '@/features/config/useConfig';\nimport { closeSentry, initSentry } from '@/features/sentry/initSentry';\nimport { useSettings } from '../hooks/useSettings';\nimport { Button } from '@/components/ui/button';\nimport { shellui } from '@shellui/sdk';\n\nexport const Advanced = () => {\n const { t } = useTranslation('settings');\n const { config } = useConfig();\n const { settings, updateSetting, resetAllData } = useSettings();\n const errorReportingConfigured = Boolean(config?.sentry?.dsn);\n\n const handleErrorReportingChange = (checked: boolean) => {\n updateSetting('errorReporting', { enabled: checked });\n if (checked) {\n initSentry();\n } else {\n closeSentry();\n }\n };\n\n const handleResetClick = () => {\n shellui.dialog({\n title: t('advanced.dangerZone.reset.toast.title'),\n description: t('advanced.dangerZone.reset.toast.description'),\n mode: 'delete',\n size: 'sm',\n okLabel: t('advanced.dangerZone.reset.toast.confirm'),\n cancelLabel: t('advanced.dangerZone.reset.toast.cancel'),\n onOk: () => {\n resetAllData();\n shellui.toast({\n title: t('advanced.dangerZone.reset.toast.success.title'),\n description: t('advanced.dangerZone.reset.toast.success.description'),\n type: 'success',\n });\n shellui.navigate('/');\n },\n onCancel: () => {\n // User cancelled, no action needed\n },\n });\n };\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-0.5\">\n <span\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('advanced.errorReporting.label')}\n </span>\n <p className=\"text-sm text-muted-foreground\">\n {errorReportingConfigured\n ? t('advanced.errorReporting.statusConfigured')\n : t('advanced.errorReporting.statusNotConfigured')}\n </p>\n </div>\n {errorReportingConfigured && (\n <Switch\n id=\"error-reporting\"\n checked={settings.errorReporting.enabled}\n onCheckedChange={handleErrorReportingChange}\n />\n )}\n </div>\n\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-0.5\">\n <label\n htmlFor=\"developer-features\"\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('advanced.developerFeatures.label')}\n </label>\n <p className=\"text-sm text-muted-foreground\">\n {t('advanced.developerFeatures.description')}\n </p>\n </div>\n <Switch\n id=\"developer-features\"\n checked={settings.developerFeatures.enabled}\n onCheckedChange={(checked) => updateSetting('developerFeatures', { enabled: checked })}\n />\n </div>\n\n <div className=\"border-t pt-6 mt-6\">\n <div className=\"space-y-4\">\n <div className=\"space-y-0.5\">\n <h3\n className=\"text-sm font-semibold leading-none text-destructive\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('advanced.dangerZone.title')}\n </h3>\n <p className=\"text-sm text-muted-foreground\">{t('advanced.dangerZone.description')}</p>\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"space-y-0.5\">\n <label\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('advanced.dangerZone.reset.title')}\n </label>\n <p className=\"text-sm text-muted-foreground\">\n {t('advanced.dangerZone.reset.warning')}\n </p>\n </div>\n <Button\n variant=\"destructive\"\n onClick={handleResetClick}\n className=\"w-full sm:w-auto\"\n >\n {t('advanced.dangerZone.reset.button')}\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { Button } from '@/components/ui/button';\nimport { shellui } from '@shellui/sdk';\n\nexport const ToastTestButtons = () => {\n const { t } = useTranslation('settings');\n\n return (\n <div>\n <h4\n className=\"text-sm font-medium mb-2\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('develop.testing.toastNotifications.title')}\n </h4>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n onClick={() => {\n shellui.toast({\n title: t('develop.testing.toastNotifications.messages.success.title'),\n description: t('develop.testing.toastNotifications.messages.success.description'),\n type: 'success',\n });\n }}\n variant=\"outline\"\n >\n {t('develop.testing.toastNotifications.buttons.success')}\n </Button>\n <Button\n onClick={() => {\n shellui.toast({\n title: t('develop.testing.toastNotifications.messages.error.title'),\n description: t('develop.testing.toastNotifications.messages.error.description'),\n type: 'error',\n });\n }}\n variant=\"outline\"\n >\n {t('develop.testing.toastNotifications.buttons.error')}\n </Button>\n <Button\n onClick={() => {\n shellui.toast({\n title: t('develop.testing.toastNotifications.messages.warning.title'),\n description: t('develop.testing.toastNotifications.messages.warning.description'),\n type: 'warning',\n });\n }}\n variant=\"outline\"\n >\n {t('develop.testing.toastNotifications.buttons.warning')}\n </Button>\n <Button\n onClick={() => {\n shellui.toast({\n title: t('develop.testing.toastNotifications.messages.info.title'),\n description: t('develop.testing.toastNotifications.messages.info.description'),\n type: 'info',\n });\n }}\n variant=\"outline\"\n >\n {t('develop.testing.toastNotifications.buttons.info')}\n </Button>\n <Button\n onClick={() => {\n shellui.toast({\n title: t('develop.testing.toastNotifications.messages.default.title'),\n description: t('develop.testing.toastNotifications.messages.default.description'),\n type: 'default',\n });\n }}\n variant=\"outline\"\n >\n {t('develop.testing.toastNotifications.buttons.default')}\n </Button>\n <Button\n onClick={() => {\n const toastId = shellui.toast({\n title: t('develop.testing.toastNotifications.messages.processing.title'),\n description: t('develop.testing.toastNotifications.messages.processing.description'),\n type: 'loading',\n });\n\n // Simulate async operation and update toast\n if (typeof toastId === 'string') {\n setTimeout(() => {\n shellui.toast({\n id: toastId,\n type: 'success',\n title: t('develop.testing.toastNotifications.messages.uploadComplete.title'),\n description: t(\n 'develop.testing.toastNotifications.messages.uploadComplete.description',\n ),\n });\n }, 2000);\n }\n }}\n variant=\"outline\"\n >\n {t('develop.testing.toastNotifications.buttons.loadingSuccess')}\n </Button>\n <Button\n onClick={() => {\n shellui.toast({\n title: t('develop.testing.toastNotifications.messages.withAction.title'),\n description: t('develop.testing.toastNotifications.messages.withAction.description'),\n type: 'success',\n action: {\n label: t('develop.testing.toastNotifications.messages.actionLabels.undo'),\n onClick: () => {\n shellui.toast({\n title: t('develop.testing.toastNotifications.messages.undone.title'),\n description: t(\n 'develop.testing.toastNotifications.messages.undone.description',\n ),\n type: 'info',\n });\n },\n },\n });\n }}\n variant=\"outline\"\n >\n {t('develop.testing.toastNotifications.buttons.withAction')}\n </Button>\n <Button\n onClick={() => {\n shellui.toast({\n title: t('develop.testing.toastNotifications.messages.withAction.title'),\n description: t('develop.testing.toastNotifications.messages.withAction.description'),\n type: 'success',\n action: {\n label: t('develop.testing.toastNotifications.messages.actionLabels.undo'),\n onClick: () => {\n shellui.toast({\n title: t('develop.testing.toastNotifications.messages.undone.title'),\n description: t(\n 'develop.testing.toastNotifications.messages.undone.description',\n ),\n type: 'info',\n });\n },\n },\n cancel: {\n label: t('develop.testing.toastNotifications.messages.actionLabels.cancel'),\n onClick: () => {\n shellui.toast({\n title: t('develop.testing.toastNotifications.messages.cancelled.title'),\n description: t(\n 'develop.testing.toastNotifications.messages.cancelled.description',\n ),\n type: 'info',\n });\n },\n },\n });\n }}\n variant=\"outline\"\n >\n {t('develop.testing.toastNotifications.buttons.withActionAndCancel')}\n </Button>\n <Button\n onClick={() => {\n shellui.toast({\n title: t('develop.testing.toastNotifications.messages.persistent.title'),\n description: t('develop.testing.toastNotifications.messages.persistent.description'),\n type: 'info',\n duration: 10000,\n });\n }}\n variant=\"outline\"\n >\n {t('develop.testing.toastNotifications.buttons.longDuration')}\n </Button>\n </div>\n </div>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { Button } from '@/components/ui/button';\nimport { shellui } from '@shellui/sdk';\n\nexport const DialogTestButtons = () => {\n const { t } = useTranslation('settings');\n\n return (\n <div>\n <h4\n className=\"text-sm font-medium mb-2\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('develop.testing.dialogTesting.title')}\n </h4>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n onClick={() => {\n shellui.dialog({\n title: t('develop.testing.dialogTesting.dialogs.ok.title'),\n description: t('develop.testing.dialogTesting.dialogs.ok.description'),\n mode: 'ok',\n onOk: () => {\n shellui.toast({\n title: t('develop.testing.dialogTesting.toasts.okClicked'),\n type: 'success',\n });\n },\n });\n }}\n variant=\"outline\"\n >\n {t('develop.testing.dialogTesting.buttons.okDialog')}\n </Button>\n <Button\n onClick={() => {\n shellui.dialog({\n title: t('develop.testing.dialogTesting.dialogs.okCancel.title'),\n description: t('develop.testing.dialogTesting.dialogs.okCancel.description'),\n mode: 'okCancel',\n size: 'sm',\n onOk: () => {\n shellui.toast({\n title: t('develop.testing.dialogTesting.toasts.okClicked'),\n type: 'success',\n });\n },\n onCancel: () => {\n shellui.toast({\n title: t('develop.testing.dialogTesting.toasts.cancelClicked'),\n type: 'info',\n });\n },\n });\n }}\n variant=\"outline\"\n >\n {t('develop.testing.dialogTesting.buttons.okCancelDialog')}\n </Button>\n <Button\n onClick={() => {\n shellui.dialog({\n title: t('develop.testing.dialogTesting.dialogs.delete.title'),\n description: t('develop.testing.dialogTesting.dialogs.delete.description'),\n mode: 'delete',\n okLabel: t('develop.testing.dialogTesting.dialogs.delete.okLabel'),\n cancelLabel: t('develop.testing.dialogTesting.dialogs.delete.cancelLabel'),\n size: 'sm',\n onOk: () => {\n shellui.toast({\n title: t('develop.testing.dialogTesting.toasts.itemDeleted'),\n type: 'success',\n });\n },\n onCancel: () => {\n shellui.toast({\n title: t('develop.testing.dialogTesting.toasts.deletionCancelled'),\n type: 'info',\n });\n },\n });\n }}\n variant=\"outline\"\n >\n {t('develop.testing.dialogTesting.buttons.deleteDialog')}\n </Button>\n <Button\n onClick={() => {\n shellui.dialog({\n title: t('develop.testing.dialogTesting.dialogs.confirm.title'),\n description: t('develop.testing.dialogTesting.dialogs.confirm.description'),\n mode: 'confirm',\n okLabel: t('develop.testing.dialogTesting.dialogs.confirm.okLabel'),\n cancelLabel: t('develop.testing.dialogTesting.dialogs.confirm.cancelLabel'),\n size: 'sm',\n onOk: () => {\n shellui.toast({\n title: t('develop.testing.dialogTesting.toasts.actionConfirmed'),\n type: 'success',\n });\n },\n onCancel: () => {\n shellui.toast({\n title: t('develop.testing.dialogTesting.toasts.actionCancelled'),\n type: 'info',\n });\n },\n });\n }}\n variant=\"outline\"\n >\n {t('develop.testing.dialogTesting.buttons.confirmDialog')}\n </Button>\n <Button\n onClick={() => {\n shellui.dialog({\n title: t('develop.testing.dialogTesting.dialogs.onlyCancel.title'),\n description: t('develop.testing.dialogTesting.dialogs.onlyCancel.description'),\n mode: 'onlyCancel',\n cancelLabel: t('develop.testing.dialogTesting.dialogs.onlyCancel.cancelLabel'),\n size: 'sm',\n onCancel: () => {\n shellui.toast({\n title: t('develop.testing.dialogTesting.toasts.dialogClosed'),\n type: 'info',\n });\n },\n });\n }}\n variant=\"outline\"\n >\n {t('develop.testing.dialogTesting.buttons.onlyCancelDialog')}\n </Button>\n </div>\n </div>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { Button } from '@/components/ui/button';\nimport { shellui } from '@shellui/sdk';\nimport urls from '@/constants/urls';\n\nexport const ModalTestButtons = () => {\n const { t } = useTranslation('settings');\n\n return (\n <div>\n <h4\n className=\"text-sm font-medium mb-2\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('develop.testing.modalTesting.title')}\n </h4>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n onClick={() => shellui.openModal(urls.settings)}\n variant=\"outline\"\n >\n {t('develop.testing.modalTesting.buttons.openModal')}\n </Button>\n </div>\n <p className=\"text-xs text-muted-foreground mt-2\">\n {t('develop.testing.modalTesting.description')}\n </p>\n </div>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { Button } from '@/components/ui/button';\nimport { shellui, type OpenDrawerOptions } from '@shellui/sdk';\nimport urls from '@/constants/urls';\n\nexport const DrawerTestButtons = () => {\n const { t } = useTranslation('settings');\n\n const openDrawer = (options: OpenDrawerOptions) => {\n shellui.openDrawer({ url: urls.settings, ...options });\n };\n\n return (\n <div>\n <h4\n className=\"text-sm font-medium mb-2\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('develop.testing.drawerTesting.title')}\n </h4>\n <div className=\"flex flex-wrap gap-2\">\n <Button\n onClick={() => openDrawer({ position: 'right' })}\n variant=\"outline\"\n >\n {t('develop.testing.drawerTesting.buttons.drawerRight')}\n </Button>\n <Button\n onClick={() => openDrawer({ position: 'left' })}\n variant=\"outline\"\n >\n {t('develop.testing.drawerTesting.buttons.drawerLeft')}\n </Button>\n <Button\n onClick={() => openDrawer({ position: 'top' })}\n variant=\"outline\"\n >\n {t('develop.testing.drawerTesting.buttons.drawerTop')}\n </Button>\n <Button\n onClick={() => openDrawer({ position: 'bottom' })}\n variant=\"outline\"\n >\n {t('develop.testing.drawerTesting.buttons.drawerBottom')}\n </Button>\n <Button\n onClick={() => openDrawer({ position: 'right', size: '400px' })}\n variant=\"outline\"\n >\n {t('develop.testing.drawerTesting.buttons.drawerRightNarrow')}\n </Button>\n <Button\n onClick={() => openDrawer({ position: 'bottom', size: '60vh' })}\n variant=\"outline\"\n >\n {t('develop.testing.drawerTesting.buttons.drawerBottomHalf')}\n </Button>\n <Button\n onClick={() => shellui.closeDrawer()}\n variant=\"outline\"\n >\n {t('develop.testing.drawerTesting.buttons.closeDrawer')}\n </Button>\n </div>\n </div>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { shellui } from '@shellui/sdk';\nimport { useSettings } from '../hooks/useSettings';\nimport { useConfig } from '../../config/useConfig';\nimport { flattenNavigationItems, resolveLocalizedString } from '../../layouts/utils';\nimport { Switch } from '@/components/ui/switch';\nimport { Select } from '@/components/ui/select';\nimport { Button } from '@/components/ui/button';\nimport { ToastTestButtons } from './develop/ToastTestButtons';\nimport { DialogTestButtons } from './develop/DialogTestButtons';\nimport { ModalTestButtons } from './develop/ModalTestButtons';\nimport { DrawerTestButtons } from './develop/DrawerTestButtons';\nimport type { LayoutType } from '../../config/types';\n\nexport const Develop = () => {\n const { t } = useTranslation('settings');\n const { settings, updateSetting } = useSettings();\n const { config } = useConfig();\n const currentLanguage = settings.language?.code || 'en';\n const effectiveLayout: LayoutType = settings.layout ?? config?.layout ?? 'sidebar';\n const navItems = config?.navigation?.length\n ? flattenNavigationItems(config?.navigation ?? []).filter(\n (item, index, self) => index === self.findIndex((i) => i.path === item.path),\n )\n : [];\n\n return (\n <div className=\"space-y-6\">\n <div>\n <h3\n className=\"text-lg font-semibold mb-2\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('develop.logging.title')}\n </h3>\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-0.5\">\n <label\n htmlFor=\"log-shellsdk\"\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('develop.logging.shellsdk.label')}\n </label>\n <p className=\"text-sm text-muted-foreground\">\n {t('develop.logging.shellsdk.description')}\n </p>\n </div>\n <Switch\n id=\"log-shellsdk\"\n checked={settings.logging?.namespaces?.shellsdk || false}\n onCheckedChange={(checked) =>\n updateSetting('logging', {\n namespaces: {\n ...settings.logging?.namespaces,\n shellsdk: checked,\n },\n })\n }\n />\n </div>\n\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-0.5\">\n <label\n htmlFor=\"log-shellcore\"\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('develop.logging.shellcore.label')}\n </label>\n <p className=\"text-sm text-muted-foreground\">\n {t('develop.logging.shellcore.description')}\n </p>\n </div>\n <Switch\n id=\"log-shellcore\"\n checked={settings.logging?.namespaces?.shellcore || false}\n onCheckedChange={(checked) =>\n updateSetting('logging', {\n namespaces: {\n ...settings.logging?.namespaces,\n shellcore: checked,\n },\n })\n }\n />\n </div>\n </div>\n </div>\n\n <div>\n <h3\n className=\"text-lg font-semibold mb-2\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('develop.navigation.title')}\n </h3>\n {navItems.length ? (\n <div className=\"space-y-2\">\n <label\n htmlFor=\"develop-nav-select\"\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('develop.navigation.selectLabel')}\n </label>\n <div className=\"mt-2\">\n <Select\n id=\"develop-nav-select\"\n defaultValue=\"\"\n onChange={(e) => {\n const path = e.target.value;\n if (path) {\n shellui.navigate(path.startsWith('/') ? path : `/${path}`);\n }\n }}\n >\n <option value=\"\">{t('develop.navigation.placeholder')}</option>\n {navItems.map((item) => (\n <option\n key={item.path}\n value={`/${item.path}`}\n >\n {resolveLocalizedString(item.label, currentLanguage) || item.path}\n </option>\n ))}\n </Select>\n </div>\n </div>\n ) : (\n <p className=\"text-sm text-muted-foreground\">{t('develop.navigation.empty')}</p>\n )}\n </div>\n\n <div>\n <h3\n className=\"text-lg font-semibold mb-2\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('develop.layout.title')}\n </h3>\n <div className=\"flex flex-wrap gap-2\">\n {(['sidebar', 'windows'] as const).map((layoutMode) => (\n <Button\n key={layoutMode}\n variant={effectiveLayout === layoutMode ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => updateSetting('layout', layoutMode as LayoutType)}\n >\n {t(`develop.layout.${layoutMode}`)}\n </Button>\n ))}\n </div>\n </div>\n\n <div>\n <h3\n className=\"text-lg font-semibold mb-2\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('develop.testing.title')}\n </h3>\n <div className=\"space-y-4\">\n <ToastTestButtons />\n <DialogTestButtons />\n <ModalTestButtons />\n <DrawerTestButtons />\n </div>\n </div>\n </div>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { useSettings } from '../hooks/useSettings';\nimport { useConfig } from '@/features/config/useConfig';\nimport { Button } from '@/components/ui/button';\nimport { shellui } from '@shellui/sdk';\nimport urls from '@/constants/urls';\nimport { cn } from '@/lib/utils';\n\nexport const DataPrivacy = () => {\n const { t } = useTranslation('settings');\n const { config } = useConfig();\n const { settings, updateSetting } = useSettings();\n\n const cookies = config?.cookieConsent?.cookies ?? [];\n const hasCookieConsent = cookies.length > 0;\n const hasConsented = Boolean(settings?.cookieConsent?.consentedCookieHosts?.length);\n\n // Determine consent status\n const acceptedHosts = settings?.cookieConsent?.acceptedHosts ?? [];\n const allHosts = cookies.map((c) => c.host);\n const strictNecessaryHosts = cookies\n .filter((c) => c.category === 'strict_necessary')\n .map((c) => c.host);\n\n const acceptedAll =\n hasConsented &&\n acceptedHosts.length === allHosts.length &&\n allHosts.every((h) => acceptedHosts.includes(h));\n // \"Rejected all\" means only strictly necessary cookies are accepted\n const rejectedAll =\n hasConsented &&\n acceptedHosts.length === strictNecessaryHosts.length &&\n strictNecessaryHosts.every((h) => acceptedHosts.includes(h)) &&\n !acceptedHosts.some((h) => !strictNecessaryHosts.includes(h));\n const isCustom = hasConsented && !acceptedAll && !rejectedAll;\n\n const handleResetCookieConsent = () => {\n updateSetting('cookieConsent', {\n acceptedHosts: [],\n consentedCookieHosts: [],\n });\n };\n\n return (\n <div className=\"space-y-6\">\n {!hasCookieConsent ? (\n <div className=\"rounded-lg border bg-card p-4 space-y-3\">\n <div className=\"space-y-1\">\n <h3\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('dataPrivacy.noCookiesConfigured.title')}\n </h3>\n <p className=\"text-sm text-muted-foreground\">\n {t('dataPrivacy.noCookiesConfigured.description')}\n </p>\n </div>\n <div className=\"flex items-start gap-2 text-sm\">\n <span className=\"text-green-600 dark:text-green-400 mt-0.5\">✓</span>\n <span className=\"text-muted-foreground\">\n {t('dataPrivacy.noCookiesConfigured.info')}\n </span>\n </div>\n </div>\n ) : (\n <div className=\"space-y-2\">\n <label\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('dataPrivacy.cookieConsent.title')}\n </label>\n <div className=\"mt-2 space-y-3\">\n <p className=\"text-sm text-muted-foreground\">\n {!hasConsented\n ? t('dataPrivacy.cookieConsent.descriptionNotConsented')\n : acceptedAll\n ? t('dataPrivacy.cookieConsent.statusAcceptedAll')\n : rejectedAll\n ? t('dataPrivacy.cookieConsent.statusRejectedAll')\n : t('dataPrivacy.cookieConsent.statusCustom')}\n </p>\n {hasConsented && (\n <div className=\"flex items-center gap-2 text-sm mt-2\">\n <span\n className={cn(\n 'px-2 py-1 rounded-md text-xs font-medium transition-colors',\n acceptedAll\n ? 'bg-primary/10 text-primary border border-primary/20'\n : 'text-muted-foreground',\n )}\n >\n {t('dataPrivacy.cookieConsent.labelAcceptedAll')}\n </span>\n <span className=\"text-muted-foreground/30\">|</span>\n <span\n className={cn(\n 'px-2 py-1 rounded-md text-xs font-medium transition-colors',\n isCustom\n ? 'bg-muted text-muted-foreground border border-border'\n : 'text-muted-foreground',\n )}\n >\n {t('dataPrivacy.cookieConsent.labelCustom')}\n </span>\n <span className=\"text-muted-foreground/30\">|</span>\n <span\n className={cn(\n 'px-2 py-1 rounded-md text-xs font-medium transition-colors',\n rejectedAll\n ? 'bg-muted text-muted-foreground border border-border'\n : 'text-muted-foreground',\n )}\n >\n {t('dataPrivacy.cookieConsent.labelRejectedAll')}\n </span>\n </div>\n )}\n <div className=\"flex flex-wrap gap-2\">\n <Button\n variant=\"outline\"\n onClick={() => shellui.openDrawer({ url: urls.cookiePreferences, size: '420px' })}\n className=\"w-full sm:w-auto\"\n >\n {t('dataPrivacy.cookieConsent.manageButton')}\n </Button>\n <Button\n variant=\"ghost\"\n onClick={handleResetCookieConsent}\n disabled={!hasConsented}\n className=\"w-full sm:w-auto\"\n >\n {t('dataPrivacy.cookieConsent.button')}\n </Button>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n","import { useTranslation } from 'react-i18next';\nimport { useSettings } from '../hooks/useSettings';\nimport { Button } from '@/components/ui/button';\nimport { Switch } from '@/components/ui/switch';\nimport {\n isServiceWorkerRegistered,\n updateServiceWorker,\n getServiceWorkerStatus,\n addStatusListener,\n serviceWorkerFileExists,\n} from '@/service-worker/register';\nimport { shellui } from '@shellui/sdk';\nimport { useState, useEffect } from 'react';\n\nexport const ServiceWorker = () => {\n const { t } = useTranslation('settings');\n const { settings, updateSetting } = useSettings();\n const [isRegistered, setIsRegistered] = useState(false);\n const [updateAvailable, setUpdateAvailable] = useState(false);\n const [isLoading, setIsLoading] = useState(true);\n const [swFileExists, setSwFileExists] = useState(true); // Track if service worker file exists\n\n const serviceWorkerEnabled = settings?.serviceWorker?.enabled ?? true;\n\n useEffect(() => {\n // Don't check service worker status if disabled\n if (!serviceWorkerEnabled) {\n // Immediately clear all state and hide error messages\n setIsRegistered(false);\n setUpdateAvailable(false);\n setIsLoading(false);\n setSwFileExists(true); // Set to true to prevent error messages from showing\n return;\n }\n\n // Initial check with loading state\n const initialCheck = async () => {\n // Double-check service worker is still enabled before proceeding\n const stillEnabled = settings?.serviceWorker?.enabled ?? true;\n if (!stillEnabled) {\n setIsLoading(false);\n return;\n }\n\n setIsLoading(true);\n\n // First check if service worker file exists\n const exists = await serviceWorkerFileExists();\n\n // Check again if service worker was disabled during the async operation\n const currentEnabled = settings?.serviceWorker?.enabled ?? true;\n if (!currentEnabled) {\n setIsLoading(false);\n return;\n }\n\n setSwFileExists(exists);\n\n if (exists) {\n // Check service worker status only if file exists\n const status = await getServiceWorkerStatus();\n\n // Final check before updating state\n const finalCheck = settings?.serviceWorker?.enabled ?? true;\n if (finalCheck) {\n setIsRegistered(status.registered);\n setUpdateAvailable(status.updateAvailable);\n }\n } else {\n // File doesn't exist, so service worker can't be registered\n // Only update if service worker is still enabled\n const finalCheck = settings?.serviceWorker?.enabled ?? true;\n if (finalCheck) {\n setIsRegistered(false);\n setUpdateAvailable(false);\n }\n }\n\n setIsLoading(false);\n };\n\n // Background refresh without affecting loading state\n const refreshStatus = async () => {\n // Skip if service worker was disabled (check current setting value)\n const currentEnabled = settings?.serviceWorker?.enabled ?? true;\n if (!currentEnabled) {\n return;\n }\n\n // Check if file exists first\n const exists = await serviceWorkerFileExists();\n\n // Check again if service worker was disabled during the async operation\n const currentEnabledAfter = settings?.serviceWorker?.enabled ?? true;\n if (!currentEnabledAfter) {\n return;\n }\n\n setSwFileExists(exists);\n\n if (exists) {\n // Check service worker status only if file exists\n const status = await getServiceWorkerStatus();\n\n // Final check before updating state\n const finalCheck = settings?.serviceWorker?.enabled ?? true;\n if (finalCheck) {\n setIsRegistered(status.registered);\n setUpdateAvailable(status.updateAvailable);\n }\n } else {\n // File doesn't exist, so service worker can't be registered\n // Only update if service worker is still enabled\n const finalCheck = settings?.serviceWorker?.enabled ?? true;\n if (finalCheck) {\n setIsRegistered(false);\n setUpdateAvailable(false);\n }\n }\n };\n\n // Initial check immediately\n initialCheck();\n\n // Listen for status changes\n const unsubscribe = addStatusListener((status) => {\n // Only update if service worker is still enabled (check current setting value)\n const currentEnabled = settings?.serviceWorker?.enabled ?? true;\n if (currentEnabled) {\n setIsRegistered(status.registered);\n setUpdateAvailable(status.updateAvailable);\n setIsLoading(false);\n }\n });\n\n // Also check periodically as fallback (background refresh) - less frequent to avoid excessive fetches\n const interval = setInterval(refreshStatus, 30000); // Check every 30 seconds instead of 5\n\n return () => {\n unsubscribe();\n clearInterval(interval);\n };\n }, [serviceWorkerEnabled]);\n\n const handleToggleServiceWorker = async (enabled: boolean) => {\n // Immediately clear all state before updating setting to prevent error flashes\n if (!enabled) {\n setIsRegistered(false);\n setUpdateAvailable(false);\n setSwFileExists(true); // Set to true to hide error messages immediately\n setIsLoading(false);\n }\n\n updateSetting('serviceWorker', { enabled });\n\n if (!enabled) {\n // Already cleared above, just return\n return;\n }\n\n // Give it a moment to register/unregister\n setTimeout(async () => {\n // Double-check service worker is still enabled before updating state\n const currentEnabled = settings?.serviceWorker?.enabled ?? true;\n if (enabled && currentEnabled) {\n const registered = await isServiceWorkerRegistered();\n setIsRegistered(registered);\n }\n }, 1000);\n };\n\n const handleUpdateNow = async () => {\n try {\n await updateServiceWorker();\n // Don't show toast here - updateServiceWorker() will handle the reload\n // and the update process already provides feedback through the UI\n } catch (_error) {\n shellui.toast({\n title: t('caching.updateError.title'),\n description: t('caching.updateError.description'),\n type: 'error',\n });\n }\n };\n\n const handleResetToLatest = async () => {\n try {\n // Clear all caches and reload\n if ('caches' in window) {\n const cacheNames = await caches.keys();\n await Promise.all(cacheNames.map((name) => caches.delete(name)));\n }\n\n shellui.toast({\n title: t('caching.resetSuccess.title'),\n description: t('caching.resetSuccess.description'),\n type: 'success',\n });\n\n // Reload the app using shellUI refresh message (refreshes entire app, not just iframe)\n setTimeout(() => {\n const sent = shellui.sendMessageToParent({\n type: 'SHELLUI_REFRESH_PAGE',\n payload: {},\n });\n if (!sent) {\n // Fallback to window.location.reload if message can't be sent\n window.location.reload();\n }\n }, 1000);\n } catch (_error) {\n shellui.toast({\n title: t('caching.resetError.title'),\n description: t('caching.resetError.description'),\n type: 'error',\n });\n }\n };\n\n return (\n <div className=\"space-y-6\">\n {isLoading ? (\n <div className=\"text-sm text-muted-foreground\">{t('caching.loading')}</div>\n ) : null}\n\n {!isLoading && (\n <div className=\"space-y-6\">\n {/* Enable/Disable service worker */}\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"space-y-0.5\">\n <label\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('caching.enabled.title')}\n </label>\n <p className=\"text-sm text-muted-foreground\">\n {serviceWorkerEnabled\n ? t('caching.enabled.descriptionEnabled')\n : t('caching.enabled.descriptionDisabled')}\n </p>\n </div>\n <Switch\n checked={serviceWorkerEnabled}\n onCheckedChange={handleToggleServiceWorker}\n />\n </div>\n </div>\n\n {/* Status – always visible; shows Disabled when off */}\n <div className=\"space-y-2\">\n <label\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('caching.status.title')}\n </label>\n <div className=\"flex items-center gap-2 text-sm mt-2\">\n {!serviceWorkerEnabled ? (\n <span className=\"text-muted-foreground\">○ {t('caching.status.disabled')}</span>\n ) : !swFileExists ? (\n <span className=\"text-red-600 dark:text-red-400\">\n ✗ {t('caching.status.fileNotFound')}\n </span>\n ) : (\n <>\n <span\n className={\n isRegistered\n ? 'text-green-600 dark:text-green-400'\n : 'text-orange-600 dark:text-orange-400'\n }\n >\n {isRegistered ? '●' : '○'}{' '}\n {isRegistered ? t('caching.status.registered') : t('caching.status.notRunning')}\n </span>\n {updateAvailable && (\n <>\n <span className=\"text-muted-foreground/50\">|</span>\n <span className=\"text-blue-600 dark:text-blue-400\">\n ● {t('caching.status.updateAvailable')}\n </span>\n </>\n )}\n </>\n )}\n </div>\n </div>\n\n {serviceWorkerEnabled && (\n <>\n {/* Error Message when file missing */}\n {!swFileExists && (\n <div className=\"rounded-lg border border-red-200 dark:border-red-800 bg-red-50 dark:bg-red-950/30 p-4 space-y-3\">\n <div className=\"space-y-1\">\n <h3\n className=\"text-sm font-medium leading-none text-red-600 dark:text-red-400\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('caching.status.fileNotFound')}\n </h3>\n <p className=\"text-sm text-red-700 dark:text-red-300\">\n {t('caching.status.fileNotFoundDescription')}\n </p>\n </div>\n </div>\n )}\n\n {/* Update Available */}\n {updateAvailable && (\n <div className=\"space-y-2\">\n <div className=\"space-y-0.5\">\n <label\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('caching.update.title')}\n </label>\n <p className=\"text-sm text-muted-foreground\">\n {t('caching.update.description')}\n </p>\n </div>\n <div className=\"mt-2\">\n <Button\n variant=\"outline\"\n onClick={handleUpdateNow}\n className=\"w-full sm:w-auto\"\n >\n {t('caching.update.button')}\n </Button>\n </div>\n </div>\n )}\n\n {/* Reset Cache */}\n <div className=\"space-y-2\">\n <div className=\"space-y-0.5\">\n <label\n className=\"text-sm font-medium leading-none\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {t('caching.reset.title')}\n </label>\n <p className=\"text-sm text-muted-foreground\">{t('caching.reset.description')}</p>\n </div>\n <div className=\"mt-2\">\n <Button\n variant=\"outline\"\n onClick={handleResetToLatest}\n className=\"w-full sm:w-auto\"\n >\n {t('caching.reset.button')}\n </Button>\n </div>\n </div>\n </>\n )}\n </div>\n )}\n </div>\n );\n};\n","import {\n PaintbrushIcon,\n GlobeIcon,\n SettingsIcon,\n CodeIcon,\n ShieldIcon,\n PackageIcon,\n RefreshDoubleIcon,\n} from './SettingsIcons';\nimport { Appearance } from './components/Appearance';\nimport { LanguageAndRegion } from './components/LanguageAndRegion';\nimport { UpdateApp } from './components/UpdateApp';\nimport { Advanced } from './components/Advanced';\nimport { Develop } from './components/Develop';\nimport { DataPrivacy } from './components/DataPrivacy';\nimport { ServiceWorker } from './components/ServiceWorker';\nimport { isTauri } from '../../service-worker/register';\n\nexport const createSettingsRoutes = (t: (key: string) => string) => [\n {\n name: t('routes.appearance'),\n icon: PaintbrushIcon,\n path: 'appearance',\n element: <Appearance />,\n },\n {\n name: t('routes.languageAndRegion'),\n icon: GlobeIcon,\n path: 'language-and-region',\n element: <LanguageAndRegion />,\n },\n {\n name: t('routes.updateApp'),\n icon: RefreshDoubleIcon,\n path: 'update-app',\n element: <UpdateApp />,\n },\n {\n name: t('routes.advanced'),\n icon: SettingsIcon,\n path: 'advanced',\n element: <Advanced />,\n },\n {\n name: t('routes.dataPrivacy'),\n icon: ShieldIcon,\n path: 'data-privacy',\n element: <DataPrivacy />,\n },\n {\n name: t('routes.develop'),\n icon: CodeIcon,\n path: 'developpers',\n element: <Develop />,\n },\n ...(isTauri()\n ? []\n : [\n {\n name: t('routes.serviceWorker'),\n icon: PackageIcon,\n path: 'service-worker',\n element: <ServiceWorker />,\n },\n ]),\n];\n","import { useState, useEffect, useMemo, useCallback } from 'react';\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from '@/components/ui/breadcrumb';\nimport {\n Sidebar,\n SidebarContent,\n SidebarGroup,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarMenu,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarProvider,\n} from '@/components/ui/sidebar';\nimport { Route, Routes, useLocation, useNavigate, Navigate } from 'react-router';\nimport { useTranslation } from 'react-i18next';\nimport urls from '@/constants/urls';\nimport { createSettingsRoutes } from './SettingsRoutes';\nimport { useSettings } from './hooks/useSettings';\nimport { useConfig } from '../config/useConfig';\nimport { isTauri } from '@/service-worker/register';\nimport { Button } from '@/components/ui/button';\nimport { ChevronRightIcon, ChevronLeftIcon } from './SettingsIcons';\n\nexport const SettingsView = () => {\n const location = useLocation();\n const navigate = useNavigate();\n const { settings } = useSettings();\n const { config } = useConfig();\n const { t } = useTranslation('settings');\n // Re-check isTauri after mount and after a short delay so we catch late-injected __TAURI__ in dev\n const [isTauriEnv, setIsTauriEnv] = useState(() => isTauri());\n\n useEffect(() => {\n setIsTauriEnv(isTauri());\n const tid = window.setTimeout(() => setIsTauriEnv(isTauri()), 200);\n return () => window.clearTimeout(tid);\n }, []);\n\n useEffect(() => {\n if (config?.title) {\n const settingsLabel = t('settings', { ns: 'common' });\n document.title = `${settingsLabel} | ${config.title}`;\n }\n }, [config?.title, t]);\n\n // Create routes with translations (service-worker route is already omitted in Tauri by createSettingsRoutes)\n const settingsRoutes = useMemo(() => createSettingsRoutes(t), [t]);\n\n // In Tauri, hide service worker route; use reactive isTauriEnv so we catch late injection (e.g. dev)\n const routesWithoutTauriSw = useMemo(() => {\n if (isTauriEnv) {\n return settingsRoutes.filter((route) => route.path !== 'service-worker');\n }\n return settingsRoutes;\n }, [settingsRoutes, isTauriEnv]);\n\n // Filter routes based on developer features setting\n const filteredRoutes = useMemo(() => {\n if (settings.developerFeatures.enabled) {\n return routesWithoutTauriSw;\n }\n return routesWithoutTauriSw.filter(\n (route) => route.path !== 'developpers' && route.path !== 'service-worker',\n );\n }, [settings.developerFeatures.enabled, routesWithoutTauriSw]);\n\n // Group routes by category\n const groupedRoutes = useMemo(() => {\n const developerOnlyPaths = ['developpers', 'service-worker'];\n const groups = [\n {\n title: t('categories.preferences'),\n routes: filteredRoutes.filter((route) =>\n ['appearance', 'language-and-region', 'data-privacy'].includes(route.path),\n ),\n },\n {\n title: t('categories.system'),\n routes: filteredRoutes.filter((route) => ['update-app', 'advanced'].includes(route.path)),\n },\n {\n title: t('categories.developer'),\n routes: filteredRoutes.filter((route) => developerOnlyPaths.includes(route.path)),\n },\n ];\n return groups.filter((group) => group.routes.length > 0);\n }, [filteredRoutes, t]);\n\n // Find matching nav item by checking if URL contains or ends with the item path\n const getSelectedItemFromUrl = useCallback(() => {\n const pathname = location.pathname;\n\n // Find matching nav item by checking if pathname contains the item path\n // This works regardless of the URL structure/prefix\n const matchedItem = filteredRoutes.find((item) => {\n // Normalize paths for comparison (remove leading/trailing slashes)\n const normalizedPathname = pathname.replace(/^\\/+|\\/+$/g, '');\n const normalizedItemPath = item.path.replace(/^\\/+|\\/+$/g, '');\n\n // Check if pathname ends with the item path, or contains it as a path segment\n return (\n normalizedPathname === normalizedItemPath ||\n normalizedPathname.endsWith(`/${normalizedItemPath}`) ||\n normalizedPathname.includes(`/${normalizedItemPath}/`)\n );\n });\n\n return matchedItem;\n }, [location.pathname, filteredRoutes]);\n\n const selectedItem = useMemo(() => getSelectedItemFromUrl(), [getSelectedItemFromUrl]);\n\n // Check if we're at the settings root (no specific route selected)\n const isSettingsRoot = useMemo(() => {\n const pathname = location.pathname;\n // Normalize the settings URL (remove leading/trailing slashes)\n const normalizedSettingsPath = urls.settings.replace(/^\\/+|\\/+$/g, '');\n // Normalize the current pathname (remove leading/trailing slashes)\n const normalizedPathname = pathname.replace(/^\\/+|\\/+$/g, '');\n\n // Check if we're exactly at the settings root\n // This handles both \"/__settings\" and \"/__settings/\" cases\n if (normalizedPathname === normalizedSettingsPath) {\n return true;\n }\n\n // If pathname starts with settings path followed by a slash, we're at a subpage\n // e.g., \"__settings/appearance\" means we're NOT at root\n const settingsPathWithSlash = `${normalizedSettingsPath}/`;\n if (normalizedPathname.startsWith(settingsPathWithSlash)) {\n return false;\n }\n\n // Pathname doesn't match settings path structure - not in settings\n return false;\n }, [location.pathname, filteredRoutes]);\n\n // Navigate back to settings root\n const handleBackToSettings = useCallback(() => {\n // Navigate to settings root, replacing current history entry\n navigate(urls.settings, { replace: true });\n }, [navigate]);\n\n return (\n <SidebarProvider>\n <div className=\"flex h-full w-full overflow-hidden items-start\">\n {/* Desktop Sidebar */}\n <Sidebar className=\"hidden md:flex\">\n <SidebarContent>\n {groupedRoutes.map((group) => (\n <SidebarGroup key={group.title}>\n <SidebarGroupLabel>{group.title}</SidebarGroupLabel>\n <SidebarGroupContent>\n <SidebarMenu>\n {group.routes.map((item) => (\n <SidebarMenuItem key={item.name}>\n <SidebarMenuButton\n asChild\n isActive={item.name === selectedItem?.name}\n >\n <button\n onClick={() => navigate(`${urls.settings}/${item.path}`)}\n className=\"cursor-pointer\"\n >\n <item.icon />\n <span>{item.name}</span>\n </button>\n </SidebarMenuButton>\n </SidebarMenuItem>\n ))}\n </SidebarMenu>\n </SidebarGroupContent>\n </SidebarGroup>\n ))}\n </SidebarContent>\n </Sidebar>\n\n {/* Mobile List View */}\n <div className=\"md:hidden flex h-full w-full flex-col overflow-hidden\">\n {isSettingsRoot ? (\n // Show list of settings pages\n <div className=\"flex flex-1 flex-col overflow-y-auto bg-background\">\n <header className=\"flex h-16 shrink-0 items-center justify-center px-4 border-b\">\n <h1 className=\"text-lg font-semibold\">{t('title')}</h1>\n </header>\n <div className=\"flex flex-1 flex-col p-4 gap-6\">\n {groupedRoutes.map((group) => (\n <div\n key={group.title}\n className=\"flex flex-col gap-2\"\n >\n <h2\n className=\"text-xs font-semibold text-foreground/60 uppercase tracking-wider px-2\"\n style={{ fontFamily: 'var(--heading-font-family, inherit)' }}\n >\n {group.title}\n </h2>\n <div className=\"flex flex-col bg-card rounded-lg overflow-hidden border border-border\">\n {group.routes.map((item, itemIndex) => {\n const Icon = item.icon;\n const isLast = itemIndex === group.routes.length - 1;\n return (\n <div\n key={item.name}\n className=\"relative\"\n >\n {!isLast && (\n <div className=\"absolute left-0 right-0 bottom-0 h-[1px] bg-border\" />\n )}\n <button\n onClick={() => navigate(`${urls.settings}/${item.path}`)}\n className=\"w-full flex items-center justify-between px-4 py-3 bg-transparent hover:bg-sidebar-accent hover:text-sidebar-accent-foreground active:bg-sidebar-accent active:text-sidebar-accent-foreground transition-colors cursor-pointer rounded-none\"\n >\n <div className=\"flex items-center gap-2 flex-1 min-w-0\">\n <div className=\"flex-shrink-0 text-foreground/70\">\n <Icon />\n </div>\n <span className=\"text-sm font-normal text-foreground\">\n {item.name}\n </span>\n </div>\n <div className=\"flex-shrink-0 ml-2 text-foreground/40\">\n <ChevronRightIcon />\n </div>\n </button>\n </div>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n </div>\n ) : (\n // Show selected settings page with back button\n <div className=\"flex h-full flex-1 flex-col overflow-hidden\">\n <header className=\"flex h-16 shrink-0 items-center gap-2 px-4 border-b\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleBackToSettings}\n className=\"mr-2\"\n >\n <ChevronLeftIcon />\n </Button>\n <h1 className=\"text-lg font-semibold\">{selectedItem?.name}</h1>\n </header>\n <div className=\"flex flex-1 flex-col gap-4 overflow-y-auto p-4 pt-4\">\n <Routes>\n <Route\n index\n element={\n filteredRoutes.length > 0 ? (\n <Navigate\n to={`${urls.settings}/${filteredRoutes[0].path}`}\n replace\n />\n ) : null\n }\n />\n {filteredRoutes.map((item) => (\n <Route\n key={item.path}\n path={item.path}\n element={item.element}\n />\n ))}\n </Routes>\n </div>\n </div>\n )}\n </div>\n\n {/* Desktop Main Content */}\n <main className=\"hidden md:flex h-full flex-1 flex-col overflow-hidden\">\n {selectedItem && (\n <header className=\"flex h-16 shrink-0 items-center gap-2 transition-[width,height] ease-linear\">\n <div className=\"flex items-center gap-2 px-4\">\n <Breadcrumb>\n <BreadcrumbList>\n <BreadcrumbItem>{t('title')}</BreadcrumbItem>\n <BreadcrumbSeparator />\n <BreadcrumbItem>\n <BreadcrumbPage>{selectedItem.name}</BreadcrumbPage>\n </BreadcrumbItem>\n </BreadcrumbList>\n </Breadcrumb>\n </div>\n </header>\n )}\n <div className=\"flex flex-1 flex-col gap-4 overflow-y-auto p-4 pt-0\">\n <Routes>\n <Route\n index\n element={\n <div className=\"flex flex-1 flex-col items-center justify-center p-8 text-center\">\n <div className=\"max-w-md\">\n <h2 className=\"text-lg font-semibold mb-2\">{t('title')}</h2>\n <p className=\"text-sm text-muted-foreground\">\n {t('selectCategory', {\n defaultValue: 'Select a category from the sidebar to get started.',\n })}\n </p>\n </div>\n </div>\n }\n />\n {filteredRoutes.map((item) => (\n <Route\n key={item.path}\n path={item.path}\n element={item.element}\n />\n ))}\n </Routes>\n </div>\n </main>\n </div>\n </SidebarProvider>\n );\n};\n"],"names":["Breadcrumb","forwardRef","props","ref","jsx","BreadcrumbList","className","cn","BreadcrumbItem","BreadcrumbLink","asChild","Slot","BreadcrumbPage","BreadcrumbSeparator","children","PaintbrushIcon","GlobeIcon","jsxs","CheckIcon","SettingsIcon","CodeIcon","ChevronRightIcon","ChevronLeftIcon","ShieldIcon","RefreshDoubleIcon","PackageIcon","ButtonGroup","Children","child","index","isValidElement","isFirst","isLast","cloneElement","SunIcon","MoonIcon","MonitorIcon","ThemePreview","theme","isSelected","isDark","colors","Appearance","useTranslation","settings","updateSetting","useSettings","config","useConfig","currentTheme","currentThemeName","availableThemes","setAvailableThemes","useState","useEffect","themeDef","registerTheme","getAllThemes","isDarkForPreview","setIsDarkForPreview","updatePreview","mediaQuery","handleChange","modeThemes","Icon","Button","Select","ClockIcon","TIMEZONE_GROUPS","formatDate","date","timezone","lang","formatTime","getBrowserTimezone","getTimezoneDisplayName","timeZoneName","part","LanguageAndRegion","currentLanguage","browserTimezone","currentTimezone","isUsingBrowserTimezone","supportedLanguages","getSupportedLanguages","handleResetRegion","currentDateTime","setCurrentDateTime","now","updateDateTime","interval","e","group","tz","isBrowserTimezone","logger","getLogger","UpdateApp","updateAvailable","setUpdateAvailable","checking","setChecking","showUpToDateInButton","setShowUpToDateInButton","checkError","setCheckError","serviceWorkerEnabled","isTauri","status","getServiceWorkerStatus","addStatusListener","handleCheckForUpdate","checkForServiceWorkerUpdate","resolve","error","version","Fragment","updateServiceWorker","shellui","Advanced","resetAllData","errorReportingConfigured","handleErrorReportingChange","checked","initSentry","closeSentry","handleResetClick","Switch","ToastTestButtons","toastId","DialogTestButtons","ModalTestButtons","urls","DrawerTestButtons","openDrawer","options","Develop","effectiveLayout","navItems","flattenNavigationItems","item","self","i","path","resolveLocalizedString","layoutMode","DataPrivacy","cookies","hasCookieConsent","hasConsented","acceptedHosts","allHosts","c","strictNecessaryHosts","acceptedAll","h","rejectedAll","isCustom","handleResetCookieConsent","ServiceWorker","isRegistered","setIsRegistered","isLoading","setIsLoading","swFileExists","setSwFileExists","initialCheck","exists","serviceWorkerFileExists","refreshStatus","unsubscribe","handleToggleServiceWorker","enabled","currentEnabled","registered","isServiceWorkerRegistered","handleUpdateNow","handleResetToLatest","cacheNames","name","createSettingsRoutes","SettingsView","location","useLocation","navigate","useNavigate","t","isTauriEnv","setIsTauriEnv","tid","settingsLabel","settingsRoutes","useMemo","routesWithoutTauriSw","route","filteredRoutes","groupedRoutes","developerOnlyPaths","getSelectedItemFromUrl","useCallback","pathname","normalizedPathname","normalizedItemPath","selectedItem","isSettingsRoot","normalizedSettingsPath","settingsPathWithSlash","handleBackToSettings","SidebarProvider","Sidebar","SidebarContent","SidebarGroup","SidebarGroupLabel","SidebarGroupContent","SidebarMenu","SidebarMenuItem","SidebarMenuButton","itemIndex","Routes","Route","Navigate"],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as l } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo as h } from "react";
|
|
3
|
+
import { useLocation as p, Navigate as u } from "react-router";
|
|
4
|
+
import { C as c } from "./ContentView-CZG-ro_B.js";
|
|
5
|
+
const b = ({ navigation: e }) => {
|
|
6
|
+
const r = p().pathname, t = h(() => e.find((s) => {
|
|
7
|
+
const i = `/${s.path}`;
|
|
8
|
+
return r === i || r.startsWith(`${i}/`);
|
|
9
|
+
}), [e, r]);
|
|
10
|
+
if (!t)
|
|
11
|
+
return /* @__PURE__ */ l(
|
|
12
|
+
u,
|
|
13
|
+
{
|
|
14
|
+
to: "/",
|
|
15
|
+
replace: !0
|
|
16
|
+
}
|
|
17
|
+
);
|
|
18
|
+
const o = `/${t.path}`, n = r.length > o.length ? r.slice(o.length + 1) : "";
|
|
19
|
+
let a = t.url;
|
|
20
|
+
return n && (a = `${t.url.endsWith("/") ? t.url : `${t.url}/`}${n}`), /* @__PURE__ */ l(
|
|
21
|
+
c,
|
|
22
|
+
{
|
|
23
|
+
url: a,
|
|
24
|
+
pathPrefix: t.path,
|
|
25
|
+
navItem: t
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
export {
|
|
30
|
+
b as ViewRoute
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=ViewRoute-ChSPabOy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ViewRoute-ChSPabOy.js","sources":["../src/components/ViewRoute.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Navigate, useLocation } from 'react-router';\nimport { ContentView } from './ContentView';\nimport type { NavigationItem } from '../features/config/types';\n\ninterface ViewRouteProps {\n navigation: NavigationItem[];\n}\n\nexport const ViewRoute = ({ navigation }: ViewRouteProps) => {\n const location = useLocation();\n const pathname = location.pathname;\n\n const navItem = useMemo(() => {\n return navigation.find((item) => {\n const pathPrefix = `/${item.path}`;\n return pathname === pathPrefix || pathname.startsWith(`${pathPrefix}/`);\n });\n }, [navigation, pathname]);\n\n if (!navItem) {\n return (\n <Navigate\n to=\"/\"\n replace\n />\n );\n }\n // Calculate the relative path from the navItem.path\n // e.g. if item.path is \"docs\" and pathname is \"/docs/intro\", subPath is \"intro\"\n const pathPrefix = `/${navItem.path}`;\n const subPath = pathname.length > pathPrefix.length ? pathname.slice(pathPrefix.length + 1) : '';\n\n // Construct the final URL for the iframe\n let finalUrl = navItem.url;\n if (subPath) {\n const baseUrl = navItem.url.endsWith('/') ? navItem.url : `${navItem.url}/`;\n finalUrl = `${baseUrl}${subPath}`;\n }\n return (\n <ContentView\n url={finalUrl}\n pathPrefix={navItem.path}\n navItem={navItem}\n />\n );\n};\n"],"names":["ViewRoute","navigation","pathname","useLocation","navItem","useMemo","item","pathPrefix","jsx","Navigate","subPath","finalUrl","ContentView"],"mappings":";;;;AASO,MAAMA,IAAY,CAAC,EAAE,YAAAC,QAAiC;AAE3D,QAAMC,IADWC,EAAA,EACS,UAEpBC,IAAUC,EAAQ,MACfJ,EAAW,KAAK,CAACK,MAAS;AAC/B,UAAMC,IAAa,IAAID,EAAK,IAAI;AAChC,WAAOJ,MAAaK,KAAcL,EAAS,WAAW,GAAGK,CAAU,GAAG;AAAA,EACxE,CAAC,GACA,CAACN,GAAYC,CAAQ,CAAC;AAEzB,MAAI,CAACE;AACH,WACE,gBAAAI;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,IAAG;AAAA,QACH,SAAO;AAAA,MAAA;AAAA,IAAA;AAMb,QAAMF,IAAa,IAAIH,EAAQ,IAAI,IAC7BM,IAAUR,EAAS,SAASK,EAAW,SAASL,EAAS,MAAMK,EAAW,SAAS,CAAC,IAAI;AAG9F,MAAII,IAAWP,EAAQ;AACvB,SAAIM,MAEFC,IAAW,GADKP,EAAQ,IAAI,SAAS,GAAG,IAAIA,EAAQ,MAAM,GAAGA,EAAQ,GAAG,GACnD,GAAGM,CAAO,KAG/B,gBAAAF;AAAA,IAACI;AAAA,IAAA;AAAA,MACC,KAAKD;AAAA,MACL,YAAYP,EAAQ;AAAA,MACpB,SAAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|