This document catalogs UI/UX improvements identified across the Bill Tracker codebase, organized by priority and impact.
---
## CRITICAL
No critical issues found. Core functionality is solid.
---
## HIGH
### 1. Mobile Layout Overflow in Sidebar Navigation
**Where:** `client/components/layout/Sidebar.jsx` — Mobile menu overlay
**Why it matters:** On small screens, the mobile navigation menu doesn't adapt to content width, causing horizontal scroll or content cutoff. This is a blocking accessibility issue for mobile users.
**Priority:** HIGH — Mobile breakage affects a significant portion of users
---
### 2. Settings Page — No Loading Skeleton for Main Content Area
**Where:** `client/pages/SettingsPage.jsx`
**Why it matters:** The entire page shows a full-page loader (`Loading…`) during initial data fetch, resulting in a blank white screen for 200–500ms. This feels slower than needed.
**Why it matters:** When users navigate to `/bills`, `/categories`, or `/summary`, the main "Tracker" dropdown remains unhighlighted. This creates ambiguity about current location.
**Why it matters:** Several complex cards (Backup, Email, Users) lack explicit error boundaries. If an API call fails mid-render or throws, the entire admin panel goes blank with no recovery path.
### 6. Settings Page — Field Labels Not Keyboard-Accessible
**Where:** `client/pages/SettingsPage.jsx`
**Why it matters:** While `label` elements exist, they're not explicitly tied to inputs via `htmlFor`. Some components (e.g., theme cards) use buttons without labels, making screen reader navigation difficult.
**Why it matters:** The email input field accepts any string, including invalid formats like `test@localhost` or `not-an-email`. Validation only happens server-side, leading to delayed error feedback.
- Show inline error if invalid: `^[\w.-]+@[\w.-]+\.\w+$`
- Debounce validation to avoid spamming errors during typing
---
### 8. BillModal — Date Input Uses Unusual "Due Day of Month" Pattern
**Where:** `client/components/BillModal.jsx`
**Why it matters:** The "Due day of month" input expects a number (1-31) instead of a standard date picker or calendar selection. This is confusing for:
- Consider using `react-datepicker` or similar for full date selection
- Alternatively, add a helper tooltip: "Enter day number only (e.g., 15 for the 15th)"
- Add a validation example: "Due on the 15th → enter 15"
---
## LOW
### 9. Global Layout — Header Backdrop Filter Not Fallback for Older Browsers
**Where:** `client/components/layout/Sidebar.jsx` — `header` element
**Why it matters:** The `backdrop-blur-xl` class relies on CSS `backdrop-filter`, which is unsupported in older browsers (e.g., Safari <14,someAndroidWebViewversions).Thisresultsinasolidbackgroundinsteadofglassmorphism.
**Why it matters:** Modern apps often include a "remember me" option to reduce login friction on trusted devices. Without it, users must re-authenticate on every session.
**Why it matters:** The theme toggle button doesn't indicate which theme is currently active. Users must click to discover the current state or remember manually.
- Add subtle text label: "Light" / "Dark" next to the icon
- Or use a tooltip: `aria-label="Current theme: Dark"`
- Or change icon (sun/moon) based on theme (already done ✅)
---
### 12. Calendar Page — Empty State Not Customizable
**Where:** `client/pages/CalendarPage.jsx`
**Why it matters:** When there are no bills, the calendar shows a generic "No bills found" message. This doesn't guide users toward creating their first bill.
**Why it matters:** The `table-surface` utility (used in Settings and Profile pages) applies `mb-4` and internal padding, but the spacing isn't uniform across all pages. Some sections have excessive vertical space, others feel cramped.