diff --git a/app/src/App.tsx b/app/src/App.tsx index a964988b5..d314ef828 100644 --- a/app/src/App.tsx +++ b/app/src/App.tsx @@ -33,6 +33,7 @@ import { import ChatRuntimeProvider from './providers/ChatRuntimeProvider'; import CoreStateProvider, { useCoreState } from './providers/CoreStateProvider'; import SocketProvider from './providers/SocketProvider'; +import ThemeProvider from './providers/ThemeProvider'; import { trackPageView } from './services/analytics'; import { startCoreHealthMonitor, stopCoreHealthMonitor } from './services/coreHealthMonitor'; import { @@ -83,26 +84,28 @@ function App() { )}> } persistor={persistor}> - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/components/BootCheckGate/BootCheckGate.tsx b/app/src/components/BootCheckGate/BootCheckGate.tsx index b81b3cbcf..e531b6919 100644 --- a/app/src/components/BootCheckGate/BootCheckGate.tsx +++ b/app/src/components/BootCheckGate/BootCheckGate.tsx @@ -56,9 +56,11 @@ interface PanelProps { function Panel({ children }: PanelProps) { return ( -
+
-
+
{children}
@@ -212,16 +214,16 @@ function ModePicker({ onConfirm }: PickerProps) { return ( -

+

{isDesktop ? t('bootCheck.chooseCoreMode') : t('bootCheck.connectToCore')}

-

+

{isDesktop ? t('bootCheck.desktopDescription') : t('bootCheck.webDescription')}

{!isDesktop && (
{t('bootCheck.preferDesktop')}{' '}
{t('bootCheck.localRecommended')}
-
{t('bootCheck.localDescription')}
+
+ {t('bootCheck.localDescription')} +
)} @@ -260,18 +264,20 @@ function ModePicker({ onConfirm }: PickerProps) { aria-pressed={selected === 'cloud'} className={`rounded-xl border-2 p-5 text-left transition-colors focus:outline-none ${ selected === 'cloud' - ? '!border-primary-500 bg-primary-50 text-stone-900 shadow-sm' - : '!border-stone-200 bg-white text-stone-700 hover:!border-stone-300 hover:bg-stone-50' + ? '!border-primary-500 bg-primary-50 dark:bg-primary-500/15 text-stone-900 dark:text-neutral-100 shadow-sm' + : '!border-stone-200 dark:!border-neutral-700 bg-white dark:bg-neutral-900 text-stone-700 dark:text-neutral-200 hover:!border-stone-300 dark:hover:!border-neutral-600 hover:bg-stone-50 dark:hover:bg-neutral-800/60' }`}>
{t('bootCheck.cloudMode')}
-
{t('bootCheck.cloudDescription')}
+
+ {t('bootCheck.cloudDescription')} +
)} {selected === 'cloud' && (
-
-
@@ -316,7 +322,7 @@ function ModePicker({ onConfirm }: PickerProps) { type="button" onClick={handleTestConnection} disabled={testStatus.kind === 'testing'} - className="rounded-lg border border-stone-300 bg-white px-3 py-1.5 text-xs text-stone-700 hover:bg-stone-50 disabled:opacity-60"> + className="rounded-lg border border-stone-300 dark:border-neutral-700 bg-white dark:bg-neutral-900 px-3 py-1.5 text-xs text-stone-700 dark:text-neutral-200 hover:bg-stone-50 dark:hover:bg-neutral-800/60 disabled:opacity-60"> {testStatus.kind === 'testing' ? t('bootCheck.testing') : t('bootCheck.testConnection')} @@ -362,8 +368,10 @@ function CheckingScreen() { return (
-
-

{t('bootCheck.checkingCore')}

+
+

+ {t('bootCheck.checkingCore')} +

); @@ -398,8 +406,10 @@ function ResultScreen({ if (result.kind === 'unreachable') { return ( -

{t('bootCheck.cannotReach')}

-

+

+ {t('bootCheck.cannotReach')} +

+

{result.reason || t('bootCheck.cannotReachDesc')}

{actionError &&

{actionError}

} @@ -408,13 +418,13 @@ function ResultScreen({ type="button" onClick={onRetry} disabled={actionBusy} - className="rounded-lg border border-stone-300 bg-white px-4 py-2 text-sm text-stone-700 hover:bg-stone-50 disabled:opacity-60"> + className="rounded-lg border border-stone-300 dark:border-neutral-700 bg-white dark:bg-neutral-900 px-4 py-2 text-sm text-stone-700 dark:text-neutral-200 hover:bg-stone-50 dark:hover:bg-neutral-800/60 disabled:opacity-60"> {t('common.retry')}
@@ -457,8 +471,12 @@ function ResultScreen({ if (result.kind === 'outdatedLocal') { return ( -

{t('bootCheck.localNeedsRestart')}

-

{t('bootCheck.localNeedsRestartDesc')}

+

+ {t('bootCheck.localNeedsRestart')} +

+

+ {t('bootCheck.localNeedsRestartDesc')} +

{actionError &&

{actionError}

}
@@ -483,8 +501,12 @@ function ResultScreen({ if (result.kind === 'outdatedCloud') { return ( -

{t('bootCheck.cloudNeedsUpdate')}

-

{t('bootCheck.cloudNeedsUpdateDesc')}

+

+ {t('bootCheck.cloudNeedsUpdate')} +

+

+ {t('bootCheck.cloudNeedsUpdateDesc')} +

{actionError &&

{actionError}

}
@@ -509,8 +531,12 @@ function ResultScreen({ // noVersionMethod — treat like outdated, user picks which flavor of action return ( -

{t('bootCheck.versionCheckFailed')}

-

{t('bootCheck.versionCheckFailedDesc')}

+

+ {t('bootCheck.versionCheckFailed')} +

+

+ {t('bootCheck.versionCheckFailedDesc')} +

{actionError &&

{actionError}

}
diff --git a/app/src/components/BottomTabBar.tsx b/app/src/components/BottomTabBar.tsx index c41df7795..e9f50790e 100644 --- a/app/src/components/BottomTabBar.tsx +++ b/app/src/components/BottomTabBar.tsx @@ -197,7 +197,7 @@ const BottomTabBar = () => { onBlur={e => { if (!e.currentTarget.contains(e.relatedTarget as Node)) setRevealed(false); }}> -