diff --git a/src/App.tsx b/src/App.tsx index 971cadc..0b14cf5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -144,6 +144,8 @@ const MedPlanAssistant = () => { onAccept={handleAcceptDisclaimer} currentLanguage={currentLanguage} onLanguageChange={changeLanguage} + currentTheme={uiSettings.theme || 'system'} + onThemeChange={(theme: 'light' | 'dark' | 'system') => updateUiSetting('theme', theme)} t={t} /> @@ -166,162 +168,162 @@ const MedPlanAssistant = () => {
-
-

{t('appTitle')}

+
+

{t('appTitle')}

+
+
+ updateUiSetting('theme', theme)} + t={t} + /> + +
-
- updateUiSetting('theme', theme)} +

{t('appSubtitle')}

+
+ +
+ + {/* Both Columns - Chart */} +
+
+
+ + + + + +

{t('chartViewDamphTooltip')}

+
+
+ + + + + +

{t('chartViewLdxTooltip')}

+
+
+ + + + + +

{t('chartViewBothTooltip')}

+
+
+
+ updateUiSetting('stickyChart', !uiSettings.stickyChart)} + icon={uiSettings.stickyChart ? : } + tooltip={uiSettings.stickyChart ? t('unpinChart') : t('pinChart')} + variant={uiSettings.stickyChart ? 'default' : 'outline'} + size="sm" + className="shrink-0" + /> +
+ + -
-
-

{t('appSubtitle')}

- -
- - {/* Both Columns - Chart */} -
-
-
- - - - - -

{t('chartViewDamphTooltip')}

-
-
- - - - - -

{t('chartViewLdxTooltip')}

-
-
- - - - - -

{t('chartViewBothTooltip')}

-
-
-
- updateUiSetting('stickyChart', !uiSettings.stickyChart)} - icon={uiSettings.stickyChart ? : } - tooltip={uiSettings.stickyChart ? t('unpinChart') : t('pinChart')} - variant={uiSettings.stickyChart ? 'default' : 'outline'} - size="sm" - className="shrink-0" + {/* Left Column - Controls */} +
+
- -
- - {/* Left Column - Controls */} -
- -
- - {/* Right Column - Settings */} -
- updateNestedState('pkParams', key, value)} - onUpdateTherapeuticRange={(key: any, value: any) => updateNestedState('therapeuticRange', key, value)} - onUpdateUiSetting={updateUiSetting} - onReset={handleReset} - onImportDays={(importedDays: any) => updateState('days', importedDays)} - onOpenDataManagement={() => setShowDataManagement(true)} - t={t} - /> -
- -
- - +
diff --git a/src/components/day-schedule.tsx b/src/components/day-schedule.tsx index 49234b7..cb5fe9c 100644 --- a/src/components/day-schedule.tsx +++ b/src/components/day-schedule.tsx @@ -152,7 +152,7 @@ const DaySchedule: React.FC = ({ > 0 ? 'bg-blue-50' : 'bg-orange-50'}`} + className={`text-xs ${doseCountDiff > 0 ? 'bg-blue-100 dark:bg-blue-900/40 dark:text-blue-200' : 'bg-orange-100 dark:bg-orange-900/40 dark:text-orange-200'}`} > {doseCountDiff > 0 ? : } {day.doses.length} {day.doses.length === 1 ? t('dose') : t('doses')} @@ -179,7 +179,7 @@ const DaySchedule: React.FC = ({ > 0 ? 'bg-blue-50' : 'bg-orange-50'}`} + className={`text-xs ${totalMgDiff > 0 ? 'bg-blue-100 dark:bg-blue-900/40 dark:text-blue-200' : 'bg-orange-100 dark:bg-orange-900/40 dark:text-orange-200'}`} > {totalMgDiff > 0 ? : } {day.doses.reduce((sum, dose) => sum + (parseFloat(dose.ldx) || 0), 0).toFixed(1)} mg diff --git a/src/components/disclaimer-modal.tsx b/src/components/disclaimer-modal.tsx index 01fa92a..2c9d618 100644 --- a/src/components/disclaimer-modal.tsx +++ b/src/components/disclaimer-modal.tsx @@ -13,6 +13,7 @@ import React, { useState } from 'react'; import { Button } from './ui/button'; import { Card, CardContent, CardHeader, CardTitle } from './ui/card'; import LanguageSelector from './language-selector'; +import ThemeSelector from './theme-selector'; import { PROJECT_REPOSITORY_URL } from '../constants/defaults'; interface DisclaimerModalProps { @@ -20,6 +21,8 @@ interface DisclaimerModalProps { onAccept: () => void; currentLanguage: string; onLanguageChange: (lang: string) => void; + currentTheme?: 'light' | 'dark' | 'system'; + onThemeChange?: (theme: 'light' | 'dark' | 'system') => void; t: (key: string) => string; } @@ -28,6 +31,8 @@ const DisclaimerModal: React.FC = ({ onAccept, currentLanguage, onLanguageChange, + currentTheme = 'system', + onThemeChange, t }) => { const [sourcesExpanded, setSourcesExpanded] = useState(false); @@ -44,15 +49,24 @@ const DisclaimerModal: React.FC = ({ {t('disclaimerModalTitle')} -

+

{t('disclaimerModalSubtitle')}

- +
+ {onThemeChange && ( + + )} + +
diff --git a/src/components/simulation-chart.tsx b/src/components/simulation-chart.tsx index 62f656c..5476785 100644 --- a/src/components/simulation-chart.tsx +++ b/src/components/simulation-chart.tsx @@ -327,12 +327,12 @@ const chartDomain = React.useMemo(() => { {labelInfo.display} - + {labelInfo.full} @@ -481,9 +481,9 @@ const chartDomain = React.useMemo(() => { } return ( -
-

{t('time')}: {timeLabel}

-
    +
    +

    {t('time')}: {timeLabel}

    +
      {payload.map((entry: any, index: number) => { const labelInfo = seriesLabels[entry.dataKey] || { display: entry.name, full: entry.name }; const isTemplate = entry.dataKey?.toString().includes('template'); @@ -493,12 +493,12 @@ const chartDomain = React.useMemo(() => { return (
    • - {labelInfo.display} - : - {value} {t('unitNgml')} + {labelInfo.display} + : + {value} {t('unitNgml')}
    • ); })}