From 90ff25003d9390c2d0c90060576abfcd13a78f01 Mon Sep 17 00:00:00 2001 From: chihlasm Date: Fri, 6 Feb 2026 01:58:39 -0500 Subject: [PATCH] feat: add mobile responsiveness, design consistency, and micro-interactions - Add mobile hamburger menu with slide-out nav drawer (AppLayout) - Make modals responsive: full-width on mobile, slide-up animation - Scratchpad becomes full-screen overlay on mobile with backdrop - Folder sidebar hidden on mobile, opens as slide-over drawer - Tree editor shows "Desktop Required" gate on mobile - Stack action buttons vertically on mobile (sessions, detail pages) - Increase touch targets throughout (buttons, close icons) - Add CSS animations: fade-in, slide-in-left, scale-in, btn-press - Add card hover lift effect and consistent border highlights - Standardize page padding (px-4 py-6 sm:px-6 sm:py-8) - Responsive headings (text-2xl sm:text-3xl) - CustomStepModal goes full-screen on mobile - Tighten auth page spacing on mobile Co-Authored-By: Claude Opus 4.6 --- frontend/src/components/common/Modal.tsx | 18 +-- frontend/src/components/layout/AppLayout.tsx | 135 +++++++++++++++++- .../src/components/library/FolderSidebar.tsx | 33 ++++- .../components/session/ScratchpadSidebar.tsx | 16 ++- .../step-library/CustomStepModal.tsx | 6 +- frontend/src/index.css | 51 +++++++ frontend/src/pages/LoginPage.tsx | 12 +- frontend/src/pages/RegisterPage.tsx | 12 +- frontend/src/pages/SessionDetailPage.tsx | 128 +++++++++-------- frontend/src/pages/SessionHistoryPage.tsx | 14 +- frontend/src/pages/SettingsPage.tsx | 14 +- frontend/src/pages/TreeEditorPage.tsx | 40 ++++-- frontend/src/pages/TreeLibraryPage.tsx | 36 +++-- frontend/src/pages/TreeNavigationPage.tsx | 9 +- 14 files changed, 395 insertions(+), 129 deletions(-) diff --git a/frontend/src/components/common/Modal.tsx b/frontend/src/components/common/Modal.tsx index 46408139..03d7dd9a 100644 --- a/frontend/src/components/common/Modal.tsx +++ b/frontend/src/components/common/Modal.tsx @@ -39,13 +39,13 @@ export function Modal({ isOpen, onClose, title, children, footer, size = 'md' }: const sizeClasses = { sm: 'max-w-sm', md: 'max-w-md', - lg: 'max-w-lg', - xl: 'max-w-4xl', + lg: 'max-w-full sm:max-w-lg', + xl: 'max-w-full sm:max-w-4xl', } return (
{/* Header - Fixed at top */} -
+
+ @@ -39,7 +77,7 @@ export function AppLayout() { key={item.path} to={item.path} className={cn( - 'rounded-md px-3 py-2 text-sm font-medium transition-colors', + 'relative rounded-md px-3 py-2 text-sm font-medium transition-colors', location.pathname.startsWith(item.path) ? 'bg-accent text-accent-foreground' : 'text-muted-foreground hover:bg-accent hover:text-accent-foreground' @@ -73,7 +111,7 @@ export function AppLayout() {
+ {/* Mobile Nav Drawer */} + {mobileMenuOpen && ( +
+ {/* Backdrop */} +
setMobileMenuOpen(false)} + aria-hidden="true" + /> + + {/* Drawer */} + +
+ )} + {/* Main Content */} -
+
diff --git a/frontend/src/components/library/FolderSidebar.tsx b/frontend/src/components/library/FolderSidebar.tsx index 41397f04..9e58b2ef 100644 --- a/frontend/src/components/library/FolderSidebar.tsx +++ b/frontend/src/components/library/FolderSidebar.tsx @@ -1,5 +1,5 @@ import { useState, useEffect, useCallback } from 'react' -import { Folder, ChevronDown, ChevronRight, Plus, MoreVertical, Pencil, Trash2, FolderPlus } from 'lucide-react' +import { Folder, ChevronDown, ChevronRight, Plus, MoreVertical, Pencil, Trash2, FolderPlus, X } from 'lucide-react' import { foldersApi } from '@/api' import type { FolderListItem, FolderTreeItem } from '@/types' import { cn } from '@/lib/utils' @@ -9,6 +9,8 @@ interface FolderSidebarProps { onFolderSelect: (folderId: string | null) => void onCreateFolder: (parentId?: string | null) => void onEditFolder: (folder: FolderListItem) => void + mobileOpen?: boolean + onMobileClose?: () => void } // Build tree structure from flat folder list @@ -233,6 +235,8 @@ export function FolderSidebar({ onFolderSelect, onCreateFolder, onEditFolder, + mobileOpen = false, + onMobileClose, }: FolderSidebarProps) { const [folders, setFolders] = useState([]) const [folderTree, setFolderTree] = useState([]) @@ -349,8 +353,33 @@ export function FolderSidebar({ return ( <> -
+ {/* Mobile backdrop */} + {mobileOpen && ( +