Skip to content

feat(mobile): mobile UX and accessibility polish#115

Merged
ChitkulLakshya merged 4 commits into
mainfrom
mobile
Apr 21, 2026
Merged

feat(mobile): mobile UX and accessibility polish#115
ChitkulLakshya merged 4 commits into
mainfrom
mobile

Conversation

@ChitkulLakshya
Copy link
Copy Markdown
Collaborator

Summary

  • deliver the mobile navigation, dashboard, activity, and settings responsiveness improvements from mobile
  • improve mobile UX behavior (drawer close on selection, bottom-nav updates, overflow fixes)
  • resolve mobile accessibility console warnings for dialog/sheet metadata

Test plan

  • Validate all dashboard tabs in mobile viewport
  • Verify settings tabs scroll horizontally on small screens
  • Verify activity summary/member expansion flows
  • Verify no dialog accessibility warnings in console

Route mobile users through a new src/mobile/pages structure and add a mobile-first home page while preserving existing desktop pages.

Made-with: Cursor
Render a real mobile activity log experience with live session/task data and replace the bottom Profile tab with Settings for better navigation consistency.

Made-with: Cursor
Improve mobile UX by adding a dedicated dashboard layout, closing drawer on navigation, refining activity summaries/member drilldown, and adding missing dialog metadata to remove accessibility warnings.

Made-with: Cursor
Copilot AI review requested due to automatic review settings April 21, 2026 08:11
@ChitkulLakshya ChitkulLakshya merged commit 349430c into main Apr 21, 2026
14 of 15 checks passed
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR focuses on improving the mobile experience across routing, layout/navigation behavior, and key dashboard/activity surfaces, while also addressing accessibility metadata warnings for dialogs/sheets.

Changes:

  • Add mobile-specific route entries/pages and introduce a dedicated mobile landing (IndexMobile).
  • Implement new mobile dashboard + activity log views and wire them into the mobile shell/navigation.
  • Polish responsiveness/visual backdrop (transparent panels + new dashboard-backdrop) and add accessible dialog/sheet headers/descriptions.

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
src/App.tsx Routes conditionally render mobile vs desktop pages using useIsMobile.
src/mobile/pages/IndexMobile.tsx New mobile-first landing page layout/content.
src/mobile/pages/LoginMobile.tsx Mobile route wrapper for Login page.
src/mobile/pages/SignupMobile.tsx Mobile route wrapper for Signup page.
src/mobile/pages/WelcomeToZyncMobile.tsx Mobile route wrapper for Welcome page.
src/mobile/pages/DashboardMobile.tsx Mobile route wrapper for Dashboard entry.
src/mobile/pages/NewProjectMobile.tsx Mobile route wrapper for New Project flow.
src/mobile/pages/ProjectDetailsMobile.tsx Mobile route wrapper for Project Details.
src/mobile/pages/PrivacyPolicyMobile.tsx Mobile route wrapper for Privacy Policy.
src/mobile/pages/PrivacyMobile.tsx Mobile route wrapper for Privacy page.
src/mobile/pages/TermsMobile.tsx Mobile route wrapper for Terms page.
src/mobile/pages/NotFoundMobile.tsx Mobile route wrapper for Not Found.
src/components/views/MobileView.tsx Wire in new mobile dashboard/activity views + mobile activity data fetching/timers.
src/components/views/mobile/MobileDashboardView.tsx New mobile dashboard summary (GitHub contributions + task/project counts).
src/components/views/mobile/MobileActivityLogView.tsx New mobile activity summary + leader team-member activity expansion UI.
src/components/layout/MobileLayout.tsx Bottom-nav updates, drawer closes on selection, sheet accessibility header/description.
src/components/views/SettingsView.tsx Make settings tabs horizontally scrollable on small screens.
src/components/views/DesktopView.tsx Transparent main shell + fixed backdrop layer for full-viewport gradient canvas.
src/components/views/DesignView.tsx Make design view background transparent to show backdrop.
src/index.css Add dashboard-backdrop gradient styles (dark + light).
src/components/views/ActivityLogView.tsx Centralize time formatting helpers and use them in summary UI.
src/components/ui/command.tsx Add sr-only dialog title/description to satisfy accessibility tooling.
src/components/ProfilePhotoCropper.tsx Add dialog description (sr-only) for accessibility metadata completeness.
src/lib/firebase.ts Remove DEV-only console info about missing reCAPTCHA App Check key.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines 12 to 16
FileText,
Video,
Settings,
LogOut,
Bell
} from "lucide-react";
Copy link

Copilot AI Apr 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

signOutAndClearState is still imported but no longer used after removing the Profile/sign-out UI. Please remove the unused import to avoid lint warnings and keep the file tidy.

Copilot uses AI. Check for mistakes.
Comment on lines +124 to 127
useEffect(() => {
const storedSession = localStorage.getItem("currentSession");
if (!storedSession) { return; }
try {
Copy link

Copilot AI Apr 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Mobile sessions are only restored from localStorage here; there’s no fallback to create/start a new session when currentSession is missing or stale. Since useActivityTracker explicitly relies on an existing currentSession (and DesktopView is the only place that starts one), mobile-only users may never record sessions and elapsedTime/activity views will stay at defaults. Consider reusing the DesktopView session-start logic (or extracting it into a shared helper) so MobileView ensures a valid session exists.

Copilot uses AI. Check for mistakes.
Comment on lines +91 to +99
const teamMemberStats = (() => {
if (!isLeader) {
return [];
}

const members = new Map<string, { uid: string; displayName: string; email?: string; photoURL?: string }>();
const teamList = [...(ownedTeams || []), ...fallbackOwnedFromMyTeams];

teamList.forEach((team: any) => {
Copy link

Copilot AI Apr 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

teamMemberStats is computed via an IIFE on every render (and it does multiple passes over teams/users/sessions). Expanding/collapsing a member will recompute all stats unnecessarily. Consider wrapping this computation in useMemo with appropriate deps (e.g., isLeader, ownedTeams, myTeams, users, teamSessions, currentUserId, elapsedSeconds) to avoid repeated work on mobile.

Copilot uses AI. Check for mistakes.
Comment on lines +337 to +344
<Button
size="icon"
variant="ghost"
className="h-7 w-7 text-destructive"
onClick={() => onDeleteLog(log._id)}
>
<Trash2 className="h-3.5 w-3.5" />
</Button>
Copy link

Copilot AI Apr 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The delete-log icon button doesn’t have an accessible name (no aria-label, title, or visible text), which makes it hard for screen readers and can trigger accessibility tooling warnings. Add an aria-label/title or an sr-only label inside the button.

Copilot uses AI. Check for mistakes.
Comment thread src/App.tsx
useUserSync();
useSyncData(); // Trigger local-first data fetch and Dexie sync on login/app load
const location = useLocation();
const isMobile = useIsMobile();
Copy link

Copilot AI Apr 21, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

useIsMobile() initially returns false (it’s undefined until the first effect runs), so these route-level isMobile ? <…Mobile/> : <…/> conditionals can briefly render the desktop route elements on mobile and then unmount/remount once isMobile updates. That can cause visible flicker and double lazy-loading. Consider making useIsMobile return a correct initial value (e.g., initialize from window.innerWidth when window exists) or gating route rendering until the breakpoint is known.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants