diff --git a/app/core/middleware.py b/app/core/middleware.py index 07b31d1..a00d0ad 100644 --- a/app/core/middleware.py +++ b/app/core/middleware.py @@ -37,9 +37,9 @@ class SecurityHeadersMiddleware(BaseHTTPMiddleware): response.headers["Content-Security-Policy"] = ( "default-src 'self'; " "script-src 'self'; " - "style-src 'self' 'unsafe-inline'; " + "style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; " "img-src 'self' data: blob:; " - "font-src 'self'; " + "font-src 'self' https://fonts.gstatic.com; " "connect-src 'self' wss: ws:; " "frame-ancestors 'none'; " "base-uri 'self'; " diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index dac982d..cf3ce82 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -7,8 +7,7 @@ import { useThemeStore } from '@/store/themeStore'; import { ErrorBoundary } from '@/components/common/ErrorBoundary'; import { useToast } from '@/components/ui/Toast'; import { useOnlineStatus } from '@/hooks/useOnlineStatus'; -import { CommandPalette } from '@/components/search/CommandPalette'; -import { useCommandPalette } from '@/hooks/useCommandPalette'; + function QueryClientWrapper({ children }: { children: React.ReactNode }) { const toast = useToast(); @@ -81,7 +80,6 @@ export default function App() { - ); } diff --git a/frontend/src/components/layout/StartLayout.tsx b/frontend/src/components/layout/StartLayout.tsx index 99132ad..740a291 100644 --- a/frontend/src/components/layout/StartLayout.tsx +++ b/frontend/src/components/layout/StartLayout.tsx @@ -9,6 +9,7 @@ import { ToastContainer } from '@/components/ui/Toast'; import { PluginRegistry } from '@/components/plugins/PluginRegistry'; import { ErrorBoundary } from '@/components/common/ErrorBoundary'; import { Outlet } from 'react-router-dom'; +import { CommandPalette } from '@/components/search/CommandPalette'; export function StartLayout() { return ( @@ -22,6 +23,7 @@ export function StartLayout() { + ); diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index fa1ace0..4194d2b 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -1,62 +1,10 @@ import { defineConfig } from 'vite'; import react from '@vitejs/plugin-react'; -import { VitePWA } from 'vite-plugin-pwa'; import { resolve } from 'path'; export default defineConfig({ plugins: [ react(), - VitePWA({ - registerType: 'autoUpdate', - includeAssets: ['favicon.svg', 'icon-192.svg', 'icon-512.svg', 'print.css'], - manifest: { - name: 'LeoCRM', - short_name: 'LeoCRM', - description: 'Self-hosted CRM system for small sales teams', - theme_color: '#3b82f6', - background_color: '#0f172a', - display: 'standalone', - start_url: '/', - icons: [ - { - src: '/icon-192.svg', - sizes: '192x192', - type: 'image/svg+xml', - purpose: 'any maskable', - }, - { - src: '/icon-512.svg', - sizes: '512x512', - type: 'image/svg+xml', - purpose: 'any maskable', - }, - ], - }, - workboxConfig: { - globPatterns: ['**/*.{js,css,html,svg,png,ico,woff2}'], - maximumFileSizeToCacheInBytes: 5 * 1024 * 1024, - runtimeCaching: [ - { - urlPattern: /^https:\/\/fonts\.googleapis\.com\/.*/i, - handler: 'CacheFirst', - options: { - cacheName: 'google-fonts-cache', - expiration: { - maxEntries: 10, - maxAgeSeconds: 60 * 60 * 24 * 365, - }, - }, - }, - { - urlPattern: /\/_app\/api\//i, - handler: 'NetworkOnly', - }, - ], - }, - devOptions: { - enabled: false, - }, - }), ], resolve: { alias: {