diff --git a/frontend/src/components/admin/AdminPortal.tsx b/frontend/src/components/admin/AdminPortal.tsx index 09934fb..2f8e5ad 100644 --- a/frontend/src/components/admin/AdminPortal.tsx +++ b/frontend/src/components/admin/AdminPortal.tsx @@ -35,6 +35,7 @@ export default function AdminPortal() { key={path} to={path} title={label} + aria-label={label} className={cn( 'flex items-center justify-center gap-1.5 px-2.5 md:px-4 h-full text-sm font-medium transition-colors duration-150 border-b-2 -mb-px whitespace-nowrap', isActive diff --git a/frontend/src/components/locations/LocationsPage.tsx b/frontend/src/components/locations/LocationsPage.tsx index 0c9cfae..e0f643c 100644 --- a/frontend/src/components/locations/LocationsPage.tsx +++ b/frontend/src/components/locations/LocationsPage.tsx @@ -1,4 +1,5 @@ import { useState, useMemo, useRef, useEffect } from 'react'; +import { useMediaQuery } from '@/hooks/useMediaQuery'; import { Plus, MapPin, Phone, Mail, Tag, AlignLeft } from 'lucide-react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { toast } from 'sonner'; @@ -19,6 +20,7 @@ import LocationForm from './LocationForm'; export default function LocationsPage() { const queryClient = useQueryClient(); + const isDesktop = useMediaQuery('(min-width: 1024px)'); const [selectedLocationId, setSelectedLocationId] = useState(null); const [showForm, setShowForm] = useState(false); @@ -373,20 +375,20 @@ export default function LocationsPage() { {/* Detail panel (desktop) */} -
- {renderPanel()} -
+ {panelOpen && isDesktop && ( +
+ {renderPanel()} +
+ )} {/* Mobile detail panel overlay */} - {panelOpen && selectedLocation && ( + {panelOpen && selectedLocation && !isDesktop && (
setSelectedLocationId(null)} >
(null); + const isDesktop = useMediaQuery('(min-width: 1024px)'); const [selectedPersonId, setSelectedPersonId] = useState(null); const [showForm, setShowForm] = useState(false); @@ -762,20 +764,20 @@ export default function PeoplePage() {
{/* Detail panel (desktop) */} -
- {renderPanel()} -
+ {panelOpen && isDesktop && ( +
+ {renderPanel()} +
+ )}
{/* Mobile detail panel overlay */} - {panelOpen && selectedPerson && ( + {panelOpen && selectedPerson && !isDesktop && (
setSelectedPersonId(null)} >
{ if (!selectedTaskId) return null; // Search top-level and subtasks @@ -628,29 +631,29 @@ export default function ProjectDetail() {
- {/* Right panel: task detail (hidden on small screens) */} -
-
- openTaskForm(null, parentId)} - onClose={() => setSelectedTaskId(null)} - onSelectTask={setSelectedTaskId} - /> + {/* Right panel: task detail (desktop only) */} + {selectedTaskId && isDesktop && ( +
+
+ openTaskForm(null, parentId)} + onClose={() => setSelectedTaskId(null)} + onSelectTask={setSelectedTaskId} + /> +
-
+ )}
{/* Mobile: show detail panel as overlay when task selected on small screens */} - {selectedTaskId && selectedTask && ( -
+ {selectedTaskId && selectedTask && !isDesktop && ( +
Task Details diff --git a/frontend/src/components/reminders/RemindersPage.tsx b/frontend/src/components/reminders/RemindersPage.tsx index 781d80f..328f1ca 100644 --- a/frontend/src/components/reminders/RemindersPage.tsx +++ b/frontend/src/components/reminders/RemindersPage.tsx @@ -1,4 +1,5 @@ import { useState, useMemo, useEffect } from 'react'; +import { useMediaQuery } from '@/hooks/useMediaQuery'; import { useLocation } from 'react-router-dom'; import { Plus, Bell, BellOff, AlertCircle, Search } from 'lucide-react'; import { useQuery } from '@tanstack/react-query'; @@ -24,6 +25,8 @@ type StatusFilter = (typeof statusFilters)[number]['value']; export default function RemindersPage() { const location = useLocation(); + const isDesktop = useMediaQuery('(min-width: 1024px)'); + // Panel state const [selectedReminderId, setSelectedReminderId] = useState(null); const [panelMode, setPanelMode] = useState<'closed' | 'view' | 'create'>('closed'); @@ -216,24 +219,24 @@ export default function RemindersPage() {
{/* Detail panel (desktop) */} -
- -
+ {panelOpen && isDesktop && ( +
+ +
+ )}
{/* Mobile detail panel overlay */} - {panelOpen && ( + {panelOpen && !isDesktop && (
(null); const [panelMode, setPanelMode] = useState<'closed' | 'view' | 'create'>('closed'); @@ -251,24 +254,24 @@ export default function TodosPage() {
{/* Detail panel (desktop) */} -
- -
+ {panelOpen && isDesktop && ( +
+ +
+ )}
{/* Mobile detail panel overlay */} - {panelOpen && ( + {panelOpen && !isDesktop && (