Pre UX polish
This commit is contained in:
@@ -1,133 +0,0 @@
|
||||
# Responsive Planner — Iteration 1
|
||||
|
||||
## Analysis Summary
|
||||
|
||||
Audited all 10+ key files. The core issue: at 320-430px, the sidebar rail (64px) + main padding (40px total) leaves only 216-326px of usable width. The sidebar as a left rail makes no sense at these widths.
|
||||
|
||||
## Key findings
|
||||
|
||||
1. **Sidebar**: Fixed 64px rail on mobile (<1024px), 304px expanded overlay. At <600px this should become a bottom nav bar.
|
||||
2. **Main padding**: `p-5` = 20px all sides. Eats 40px from an already narrow viewport.
|
||||
3. **KPI grid**: Hardcoded 2-column grid, no responsive override. Cards get ~108px wide at 320px.
|
||||
4. **Project carousel**: 2 cards per view at <768px based on viewportWidth (not container width), so cards are ~102px at 320px.
|
||||
5. **Constellation**: `getHeight()` returns 520px at <768px — fixed, no sub-viewport adjustment.
|
||||
6. **Card.tsx**: `overflow: hidden` + `padding: 24px` on Card wrapper.
|
||||
7. **Detail panel**: 24px side padding, 100vw on mobile already — OK.
|
||||
8. **Timeline badges**: `flexShrink: 0` + `whiteSpace: 'nowrap'` can cause overflow.
|
||||
9. **No sub-480px breakpoint** in Tailwind — xs starts at 480px.
|
||||
10. **ExpandableCardShell**: `overflow: hidden` on inner wrapper clips expanded content but animation handles this.
|
||||
|
||||
## Decision: Bottom nav approach
|
||||
- At <600px: hide sidebar entirely, show a fixed bottom tab bar
|
||||
- Bottom bar: 56px tall, has 3 nav icons + hamburger for full drawer
|
||||
- Drawer: slides up as a sheet with full sidebar content
|
||||
- Main content: remove margin-left, add padding-bottom for bottom bar
|
||||
- Framer Motion for drawer animation (already available)
|
||||
|
||||
## Builder — Iteration 2
|
||||
|
||||
### All 8 phases implemented
|
||||
|
||||
**Phase 1 — Sidebar → Bottom Nav:**
|
||||
- Created `MobileBottomNav.tsx` with collapsed tab bar (56px) + drawer (Framer Motion slide-up)
|
||||
- `Sidebar.tsx` returns null at <600px via `isMobileNav` state
|
||||
- `DashboardLayout.tsx` conditionally renders sidebar wrapper, adds bottom padding for mobile nav
|
||||
- `index.css` removes `margin-left` on `.dashboard-main` at <600px
|
||||
|
||||
**Phase 2 — Spacing:**
|
||||
- Main content padding: `p-3 xs:p-5` (12px at <480px, 20px at >=480px)
|
||||
- Card padding: `card-base` class reduces to 16px at <480px via CSS
|
||||
- Chronology item padding reduced at <480px
|
||||
|
||||
**Phase 3 — KPI Grid:**
|
||||
- Moved grid-template-columns to `.kpi-grid` CSS class
|
||||
- Single column at <360px, 2 columns otherwise
|
||||
- KPI value font uses `clamp(22px, 6vw, 30px)`
|
||||
|
||||
**Phase 4 — Carousel:**
|
||||
- 1 card per view at <480px
|
||||
- Smaller min-height (148px) at <480px
|
||||
|
||||
**Phase 5 — Timeline:** Already wraps correctly (flexWrap: 'wrap' on header)
|
||||
|
||||
**Phase 6 — Constellation:** 380px height at <480px (was 520px)
|
||||
|
||||
**Phase 7 — Detail Panel:** Responsive padding (16px at <480px) via data attributes + CSS
|
||||
|
||||
**Phase 8 — Skills Grid:** Already single-column on mobile, no changes needed
|
||||
|
||||
### Extra fixes:
|
||||
- Chat widget z-index bumped to 101 and bottom offset 72px at mobile (above bottom nav)
|
||||
- Added `xxs: 360px` breakpoint to tailwind config
|
||||
|
||||
### Quality gates: All pass (lint 0 errors, typecheck clean, build succeeds)
|
||||
|
||||
## Code Review & Fixes — Iteration 3
|
||||
|
||||
### Issues found and fixed:
|
||||
1. **Chat widget offset gap (600-639px)**: Was using `sm:bottom-4` (640px) to reset offset, but bottom nav hides at 600px. Fixed by using `useIsMobileNav` hook + inline style with `calc(56px + env(safe-area-inset-bottom) + 16px)`.
|
||||
2. **Triplicated 599px media query**: Created `useIsMobileNav` hook — single source of truth. Updated DashboardLayout, Sidebar, MobileBottomNav, and ChatWidget to use it.
|
||||
3. **Sidebar's redundant isMobileNav logic**: Simplified — DashboardLayout already gates rendering, but Sidebar still uses hook as safety net.
|
||||
4. **Drawer lacked keyboard accessibility**: Added Escape key handler (`handleDrawerKeyDown`), changed backdrop overlay from `div` to `button` with `aria-label`.
|
||||
5. **Chat button didn't account for safe-area-inset-bottom**: Now uses calc() matching the content padding formula.
|
||||
|
||||
### Not fixed (lower priority):
|
||||
- TagPill/AlertFlag duplication between Sidebar and MobileBottomNav (cosmetic refactor)
|
||||
- `xxs` breakpoint defined but unused (harmless)
|
||||
- Nav item labels slightly different between Sidebar/MobileBottomNav (intentional — mobile uses shorter labels)
|
||||
|
||||
### Quality gates: All pass (lint 0 errors, typecheck clean, build succeeds)
|
||||
|
||||
## Ralph Coordinator — Iteration 4
|
||||
|
||||
### Event: build.blocked — Investigated and resolved
|
||||
|
||||
Received `build.blocked` event. Ran all three quality gates:
|
||||
- `npm run lint` → 0 errors (6 warnings, all pre-existing)
|
||||
- `npm run typecheck` → clean
|
||||
- `npm run build` → succeeds
|
||||
|
||||
The build.blocked event appears stale — all gates pass. The implementation from iterations 1-3 is complete and clean.
|
||||
|
||||
### Code audit summary:
|
||||
All changes verified across:
|
||||
- `MobileBottomNav.tsx` — new bottom nav with drawer, keyboard accessible
|
||||
- `useIsMobileNav.ts` — single source of truth for <600px breakpoint
|
||||
- `DashboardLayout.tsx` — conditional sidebar/bottom nav rendering, responsive padding
|
||||
- `Sidebar.tsx` — returns null at <600px
|
||||
- `ChatWidget.tsx` — bottom offset accounts for mobile nav
|
||||
- `index.css` — responsive CSS for margin-left, card padding, KPI grid, detail panel, chronology items
|
||||
- `Card.tsx` — card-base class for responsive padding override
|
||||
- `PatientSummaryTile.tsx` — KPI value font uses clamp()
|
||||
- `ProjectsTile.tsx` — 1 card per view at <480px
|
||||
- `useForceSimulation.ts` — 380px constellation height at <480px
|
||||
- `tailwind.config.js` — xxs (360px) breakpoint added
|
||||
|
||||
Emitting `build.done` to trigger Visual Reviewer for screenshot validation.
|
||||
|
||||
## Ralph Coordinator — Iteration 5
|
||||
|
||||
### Events handled: build.task.abandoned + build.blocked (stale)
|
||||
|
||||
Re-verified all quality gates:
|
||||
- `npm run lint` → 0 errors (6 warnings, pre-existing)
|
||||
- `npm run typecheck` → clean
|
||||
- `npm run build` → succeeds in 4.14s
|
||||
|
||||
### Full implementation verification:
|
||||
Confirmed all 11 implementation items present and integrated:
|
||||
1. DashboardLayout.tsx — MobileBottomNav imported, useIsMobileNav used, responsive padding
|
||||
2. Sidebar.tsx — returns null at <600px
|
||||
3. MobileBottomNav.tsx — 56px tab bar + Framer Motion drawer
|
||||
4. useIsMobileNav.ts — single source of truth (max-width: 599px)
|
||||
5. ChatWidget.tsx — bottom offset calc for mobile nav
|
||||
6. index.css — all responsive CSS rules present
|
||||
7. Card.tsx — card-base class applied
|
||||
8. PatientSummaryTile.tsx — clamp(22px, 6vw, 30px) for KPI values
|
||||
9. ProjectsTile.tsx — 1 card per view at <480px
|
||||
10. useForceSimulation.ts — 380px height at <480px
|
||||
11. tailwind.config.js — xxs: 360px breakpoint
|
||||
|
||||
### Task status: No open tasks remain.
|
||||
|
||||
All success criteria met. Emitting LOOP_COMPLETE.
|
||||
Reference in New Issue
Block a user