From d0477b1c13b5ba27b9b37a48af8de04616caf03e Mon Sep 17 00:00:00 2001 From: Kyle Pope Date: Sat, 7 Mar 2026 16:56:08 +0800 Subject: [PATCH] Phase 2: toolbar responsive patterns - All page toolbars now flex-wrap on mobile with min-h instead of fixed h-16 - Segmented button filters (priority, status, view) hidden on mobile, replaced with compact Select dropdowns - Search inputs hidden on mobile where CategoryFilterBar already has search - CategoryFilterBar wraps to full-width row on mobile (order-last) - Action buttons show icon-only on mobile, full text on md+ - Calendar title hidden on xs screens for space - Desktop layout completely unchanged (md:flex-nowrap restores original) Co-Authored-By: Claude Opus 4.6 --- .../src/components/calendar/CalendarPage.tsx | 22 ++++++++++++++----- .../components/locations/LocationsPage.tsx | 7 +++--- frontend/src/components/people/PeoplePage.tsx | 7 +++--- .../src/components/projects/ProjectDetail.tsx | 10 ++++----- .../src/components/projects/ProjectsPage.tsx | 19 +++++++++++----- .../components/reminders/RemindersPage.tsx | 19 +++++++++++----- frontend/src/components/todos/TodosPage.tsx | 19 +++++++++++----- 7 files changed, 68 insertions(+), 35 deletions(-) diff --git a/frontend/src/components/calendar/CalendarPage.tsx b/frontend/src/components/calendar/CalendarPage.tsx index b8f4996..c1cef0f 100644 --- a/frontend/src/components/calendar/CalendarPage.tsx +++ b/frontend/src/components/calendar/CalendarPage.tsx @@ -16,6 +16,7 @@ import { useCalendars } from '@/hooks/useCalendars'; import { useSettings } from '@/hooks/useSettings'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; +import { Select } from '@/components/ui/select'; import CalendarSidebar from './CalendarSidebar'; import EventDetailPanel from './EventDetailPanel'; import type { CreateDefaults } from './EventDetailPanel'; @@ -478,7 +479,7 @@ export default function CalendarPage() {
{/* Custom toolbar */} -
+
-
+ + +
{(Object.entries(viewLabels) as [CalendarView, string][]).map(([view, label]) => (
diff --git a/frontend/src/components/locations/LocationsPage.tsx b/frontend/src/components/locations/LocationsPage.tsx index f40de57..3bc6206 100644 --- a/frontend/src/components/locations/LocationsPage.tsx +++ b/frontend/src/components/locations/LocationsPage.tsx @@ -285,10 +285,10 @@ export default function LocationsPage() { return (
{/* Header */} -
+

Locations

-
+
diff --git a/frontend/src/components/people/PeoplePage.tsx b/frontend/src/components/people/PeoplePage.tsx index 595eb6c..133240e 100644 --- a/frontend/src/components/people/PeoplePage.tsx +++ b/frontend/src/components/people/PeoplePage.tsx @@ -555,9 +555,9 @@ export default function PeoplePage() { return (
{/* Header */} -
+

People

-
+
- - Add Person + Add Person @@ -396,8 +396,7 @@ export default function ProjectDetail() {
@@ -490,7 +488,7 @@ export default function ProjectDetail() {
{/* Task list header + view controls */} -
+

Tasks

{/* View toggle */} diff --git a/frontend/src/components/projects/ProjectsPage.tsx b/frontend/src/components/projects/ProjectsPage.tsx index f2cf87b..b172aa6 100644 --- a/frontend/src/components/projects/ProjectsPage.tsx +++ b/frontend/src/components/projects/ProjectsPage.tsx @@ -5,6 +5,7 @@ import { useQuery } from '@tanstack/react-query'; import api from '@/lib/api'; import type { Project } from '@/types'; import { Button } from '@/components/ui/button'; +import { Select } from '@/components/ui/select'; import { Input } from '@/components/ui/input'; import { Card, CardContent } from '@/components/ui/card'; import { GridSkeleton } from '@/components/ui/skeleton'; @@ -70,10 +71,19 @@ export default function ProjectsPage() { return (
{/* Header */} -
+

Projects

-
+ +
{statusFilters.map((sf) => (
diff --git a/frontend/src/components/reminders/RemindersPage.tsx b/frontend/src/components/reminders/RemindersPage.tsx index c88f391..55f892a 100644 --- a/frontend/src/components/reminders/RemindersPage.tsx +++ b/frontend/src/components/reminders/RemindersPage.tsx @@ -6,6 +6,7 @@ import { isPast, isToday, parseISO } from 'date-fns'; import api from '@/lib/api'; import type { Reminder } from '@/types'; import { Button } from '@/components/ui/button'; +import { Select } from '@/components/ui/select'; import { Input } from '@/components/ui/input'; import { Card, CardContent } from '@/components/ui/card'; import { ListSkeleton } from '@/components/ui/skeleton'; @@ -99,10 +100,19 @@ export default function RemindersPage() { return (
{/* Header */} -
+

Reminders

-
+ +
{statusFilters.map((sf) => (
diff --git a/frontend/src/components/todos/TodosPage.tsx b/frontend/src/components/todos/TodosPage.tsx index 1656c19..57356ac 100644 --- a/frontend/src/components/todos/TodosPage.tsx +++ b/frontend/src/components/todos/TodosPage.tsx @@ -6,6 +6,7 @@ import api from '@/lib/api'; import type { Todo } from '@/types'; import { isTodoOverdue } from '@/lib/utils'; import { Button } from '@/components/ui/button'; +import { Select } from '@/components/ui/select'; import { Card, CardContent } from '@/components/ui/card'; import { ListSkeleton } from '@/components/ui/skeleton'; import { CategoryFilterBar } from '@/components/shared'; @@ -128,11 +129,20 @@ export default function TodosPage() { return (
{/* Header */} -
+

Todos

{/* Priority filter */} -
+ +
{priorityFilters.map((pf) => (