diff --git a/app/src/App.tsx b/app/src/App.tsx index 539b971..7be82f9 100644 --- a/app/src/App.tsx +++ b/app/src/App.tsx @@ -1,9 +1,11 @@ import { useMemo } from 'react'; import { useAppState } from './state/appState'; +import { useMediaQuery } from './hooks/useMediaQuery'; import { SpecializationRanking } from './components/SpecializationRanking'; import { ModeToggle } from './components/ModeToggle'; import { CourseSelection } from './components/CourseSelection'; -import { ResultsDashboard } from './components/ResultsDashboard'; +import { CreditLegend } from './components/CreditLegend'; +import { ModeComparison, MutualExclusionWarnings } from './components/Notifications'; import { optimize } from './solver/optimizer'; function App() { @@ -18,8 +20,11 @@ function App() { setMode, pinCourse, unpinCourse, + clearAll, } = useAppState(); + const breakpoint = useMediaQuery(); + // Compute alternative mode result for comparison const altMode = state.mode === 'maximize-count' ? 'priority-order' : 'maximize-count'; const altResult = useMemo( @@ -27,36 +32,51 @@ function App() { [selectedCourseIds, state.ranking, openSetIds, altMode], ); + const isMobile = breakpoint === 'mobile'; + + const containerStyle: React.CSSProperties = { + maxWidth: '1200px', + margin: '0 auto', + padding: isMobile ? '12px' : '20px', + fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif', + }; + + const panelStyle: React.CSSProperties = isMobile + ? { display: 'flex', flexDirection: 'column', gap: '20px' } + : { display: 'grid', gridTemplateColumns: '340px 1fr', gap: '24px', alignItems: 'start' }; + return ( -