diff --git a/TODO.md b/TODO.md
index d649073..4637707 100644
--- a/TODO.md
+++ b/TODO.md
@@ -18,7 +18,7 @@
### Frontend Setup
- [x] Initialize React + Vite project
- [x] Configure Tailwind CSS
-- [ ] Set up React Router
+- [x] Set up React Router
- [ ] Create recipe list page
- [ ] Create recipe detail/edit page
- [ ] Implement cook mode UI
@@ -46,6 +46,14 @@
## ✅ Completed Tasks
### 2026-03-24
+- **React Router setup**
+ - Updated main.tsx to wrap App in BrowserRouter
+ - Configured routes in App.tsx with navigation header
+ - Created page components: RecipeListPage, RecipeDetailPage, CookModePage, NotFoundPage
+ - Added active link highlighting in navigation
+ - Defined routes: / (list), /recipe/new, /recipe/:id, /recipe/:id/cook, * (404)
+ - Verified build and dev server work correctly
+
- **Tailwind CSS configuration**
- Installed Tailwind CSS v4 with PostCSS and Autoprefixer
- Installed @tailwindcss/postcss plugin for v4 compatibility
diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx
index 7fb199f..e830ee4 100644
--- a/frontend/src/App.tsx
+++ b/frontend/src/App.tsx
@@ -1,24 +1,67 @@
+import { Routes, Route, Link, useLocation } from 'react-router-dom';
+import { RecipeListPage } from './pages/RecipeListPage';
+import { RecipeDetailPage } from './pages/RecipeDetailPage';
+import { CookModePage } from './pages/CookModePage';
+import { NotFoundPage } from './pages/NotFoundPage';
+
function App() {
+ const location = useLocation();
+
+ const isActive = (path: string) => {
+ if (path === '/' && location.pathname === '/') return true;
+ if (path !== '/' && location.pathname.startsWith(path)) return true;
+ return false;
+ };
+
+ const linkClass = (path: string) => {
+ const base = "px-3 py-2 rounded-md text-sm font-medium transition-colors";
+ return isActive(path)
+ ? `${base} bg-blue-100 text-blue-700`
+ : `${base} text-gray-700 hover:bg-gray-100`;
+ };
+
return (