diff --git a/app/src/App.tsx b/app/src/App.tsx index b4b993fdf..31bb56172 100644 --- a/app/src/App.tsx +++ b/app/src/App.tsx @@ -8,6 +8,7 @@ import BottomTabBar from './components/BottomTabBar'; import ServiceBlockingGate from './components/daemon/ServiceBlockingGate'; import ErrorFallbackScreen from './components/ErrorFallbackScreen'; import LocalAIDownloadSnackbar from './components/LocalAIDownloadSnackbar'; +import MeshGradient from './components/MeshGradient'; import OnboardingOverlay from './components/OnboardingOverlay'; import CoreStateProvider from './providers/CoreStateProvider'; import SocketProvider from './providers/SocketProvider'; @@ -29,11 +30,14 @@ function App() { -
-
- +
+ +
+
+ +
+
-
diff --git a/app/src/components/MeshGradient.tsx b/app/src/components/MeshGradient.tsx new file mode 100644 index 000000000..db380c278 --- /dev/null +++ b/app/src/components/MeshGradient.tsx @@ -0,0 +1,45 @@ +import { useEffect, useRef } from 'react'; + +import { Gradient } from '../lib/meshGradient'; + +/** + * Animated WebGL mesh gradient background (Stripe-style). + * Renders behind the dotted-canvas overlay so dots remain visible on top. + */ +export default function MeshGradient() { + const canvasRef = useRef(null); + + useEffect(() => { + const canvas = canvasRef.current; + const gradient = new Gradient(); + gradient.initGradient('#mesh-gradient'); + + return () => { + gradient.disconnect(); + gradient.pause(); + if (canvas) { + const gl = canvas.getContext('webgl') || canvas.getContext('webgl2'); + if (gl) { + gl.getExtension('WEBGL_lose_context')?.loseContext(); + } + } + }; + }, []); + + return ( + + ); +} diff --git a/app/src/components/OnboardingOverlay.tsx b/app/src/components/OnboardingOverlay.tsx index e2ab9f937..3c0ce9343 100644 --- a/app/src/components/OnboardingOverlay.tsx +++ b/app/src/components/OnboardingOverlay.tsx @@ -53,7 +53,7 @@ const OnboardingOverlay = () => { if (!shouldShow) return null; return createPortal( -
+
, document.body diff --git a/app/src/components/settings/SettingsHome.tsx b/app/src/components/settings/SettingsHome.tsx index f1f5c38a2..f4f0dcc15 100644 --- a/app/src/components/settings/SettingsHome.tsx +++ b/app/src/components/settings/SettingsHome.tsx @@ -180,10 +180,10 @@ const SettingsHome = () => { ]; return ( -
+
-
+
{/* Grouped Settings */} {groupedMenuItems.map((item, index) => ( {
-

- This will sign you out and permanently delete local app data including: • App - settings and conversations • Email data from Gmail • Chat history from Telegram • - Cached files from Notion • All other skills data -
-
- This action cannot be undone and may take a few moments to complete. -

+
+

This will sign you out and permanently delete local app data including:

+
    +
  • App settings and conversations
  • +
  • All skills data
  • +
  • Workspace data
  • +
  • All other local data
  • +
+

This action cannot be undone.

+
{error && (
diff --git a/app/src/components/settings/SettingsSectionPage.tsx b/app/src/components/settings/SettingsSectionPage.tsx index af90c1709..5830f2a65 100644 --- a/app/src/components/settings/SettingsSectionPage.tsx +++ b/app/src/components/settings/SettingsSectionPage.tsx @@ -22,26 +22,24 @@ const SettingsSectionPage = ({ title, description, items }: SettingsSectionPageP const { navigateBack, navigateToSettings } = useSettingsNavigation(); return ( -
+
-
-
- {description &&

{description}

} +
+ {description &&

{description}

} -
- {items.map((item, index) => ( - navigateToSettings(item.route)} - isFirst={index === 0} - isLast={index === items.length - 1} - /> - ))} -
+
+ {items.map((item, index) => ( + navigateToSettings(item.route)} + isFirst={index === 0} + isLast={index === items.length - 1} + /> + ))}
diff --git a/app/src/components/settings/components/SettingsBackButton.tsx b/app/src/components/settings/components/SettingsBackButton.tsx index 80f6289e3..5a424b09e 100644 --- a/app/src/components/settings/components/SettingsBackButton.tsx +++ b/app/src/components/settings/components/SettingsBackButton.tsx @@ -10,15 +10,19 @@ const SettingsBackButton = ({ className = '', }: SettingsBackButtonProps) => { return ( -
+
); diff --git a/app/src/components/settings/components/SettingsHeader.tsx b/app/src/components/settings/components/SettingsHeader.tsx index a272ed2e8..513eb2013 100644 --- a/app/src/components/settings/components/SettingsHeader.tsx +++ b/app/src/components/settings/components/SettingsHeader.tsx @@ -12,16 +12,16 @@ const SettingsHeader = ({ onBack, }: SettingsHeaderProps) => { return ( -
+
{/* Back button */} {showBackButton && onBack && (
); diff --git a/app/src/components/settings/components/SettingsPanelLayout.tsx b/app/src/components/settings/components/SettingsPanelLayout.tsx index 5e52a4833..c406d1ae2 100644 --- a/app/src/components/settings/components/SettingsPanelLayout.tsx +++ b/app/src/components/settings/components/SettingsPanelLayout.tsx @@ -16,9 +16,9 @@ const SettingsPanelLayout = ({ className = '', }: SettingsPanelLayoutProps) => { return ( -
+
-
{children}
+
{children}
); }; diff --git a/app/src/components/settings/hooks/useSettingsNavigation.ts b/app/src/components/settings/hooks/useSettingsNavigation.ts index 96831c700..ac742399d 100644 --- a/app/src/components/settings/hooks/useSettingsNavigation.ts +++ b/app/src/components/settings/hooks/useSettingsNavigation.ts @@ -23,7 +23,6 @@ export type SettingsRoute = | 'skills' | 'ai' | 'local-model' - | 'tauri-commands' | 'memory-debug' | 'recovery-phrase' | 'webhooks-debug' @@ -81,7 +80,6 @@ export const useSettingsNavigation = (): SettingsNavigationHook => { if (path.includes('/settings/skills')) return 'skills'; if (path.includes('/settings/ai')) return 'ai'; if (path.includes('/settings/local-model')) return 'local-model'; - if (path.includes('/settings/tauri-commands')) return 'tauri-commands'; if (path.includes('/settings/memory-debug')) return 'memory-debug'; if (path.includes('/settings/webhooks-debug')) return 'webhooks-debug'; if (path.includes('/settings/recovery-phrase')) return 'recovery-phrase'; diff --git a/app/src/components/settings/panels/AIPanel.tsx b/app/src/components/settings/panels/AIPanel.tsx index 3501d0ac1..7712dd998 100644 --- a/app/src/components/settings/panels/AIPanel.tsx +++ b/app/src/components/settings/panels/AIPanel.tsx @@ -74,12 +74,12 @@ const AIPanel = () => { }; return ( -
+
-
+
-

AI System Overview

+

AI System Overview

Prompt and markdown orchestration is handled in Rust runtime.

@@ -110,7 +110,7 @@ const AIPanel = () => {
-

Local Model Runtime

+

Local Model Runtime

-

Capability Assets

+

Capability Assets

Quantization preference: {assets?.quantization ?? 'q4'} @@ -883,7 +883,7 @@ const LocalModelPanel = () => {
-

Test Summarization

+

Test Summarization