Files
tfm_ainventory/docs/superpowers/plans/2026-04-15-mobile-stat-cards-implementation.md
Daniel Bedeleanu 409afb29f8 plan: mobile stat cards responsive implementation - 6 tasks
- Task 1: Create reusable StatCard component
- Task 2: Update Inventory page stat cards
- Task 3: Update Logs page stat cards
- Task 4: Update Admin page stat cards
- Task 5: Test on mobile viewports
- Task 6: Final verification & handover

Ready for execution via subagent-driven or inline approach
2026-04-15 11:14:24 +03:00

503 lines
14 KiB
Markdown

# Mobile Stat Cards Responsive Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Implement two-column flexbox layout for stat cards across Inventory, Logs, and Admin pages to fix content overflow on mobile iPhone screens.
**Architecture:** Create a reusable `StatCard` component with responsive Tailwind classes (`flex justify-between`, responsive font sizing, label truncation). Replace inline stat displays on three pages with this component.
**Tech Stack:** React, Next.js 15, Tailwind CSS, Lucide Icons
---
## File Structure
**Files to Create:**
- `frontend/components/StatCard.tsx` — Reusable stat card component
**Files to Modify:**
- `frontend/app/inventory/page.tsx` — Replace stat displays with StatCard component
- `frontend/app/logs/page.tsx` — Replace stat displays with StatCard component
- `frontend/app/admin/page.tsx` — Replace stat displays with StatCard component
---
## Task 1: Create Reusable StatCard Component
**Files:**
- Create: `frontend/components/StatCard.tsx`
- [ ] **Step 1: Create the StatCard component file**
Create `frontend/components/StatCard.tsx`:
```tsx
import React from 'react';
import { LucideIcon } from 'lucide-react';
interface StatCardProps {
label: string;
value: number;
icon?: LucideIcon;
}
export default function StatCard({ label, value, icon: Icon }: StatCardProps) {
return (
<div className="flex justify-between items-center gap-2 p-4 bg-slate-900 rounded-lg">
{/* Icon + Label Container */}
<div className="flex items-center gap-2 min-w-0">
{Icon && <Icon className="w-5 h-5 text-primary flex-shrink-0" />}
<span className="text-sm md:text-base text-slate-400 truncate">
{label}
</span>
</div>
{/* Number (Right) */}
<span className="text-lg md:text-xl font-black text-white whitespace-nowrap">
{value}
</span>
</div>
);
}
```
**Key Implementation Details:**
- `flex justify-between items-center` — Label left, number right, vertically centered
- `gap-2` — 8px spacing between label and number
- `p-4` — 16px padding on mobile
- `bg-slate-900 rounded-lg` — Dark background, rounded corners
- `min-w-0` — Allows label container to shrink (enables truncate)
- `text-sm md:text-base` — Label: 14px mobile, 16px desktop+
- `truncate` — Label ellipsis if too long
- `text-lg md:text-xl` — Number: 18px mobile, 20px desktop+
- `whitespace-nowrap` — Number never wraps
- `flex-shrink-0` on icon — Icon doesn't shrink
- [ ] **Step 2: Commit the component**
```bash
git add frontend/components/StatCard.tsx
git commit -m "feat: create reusable StatCard component with responsive layout
- Two-column flexbox layout (label left, number right)
- Responsive font sizing (sm/md breakpoints)
- Label truncation for overflow handling
- Optional icon support via Lucide
- Ready for use across Inventory, Logs, Admin pages"
```
---
## Task 2: Update Inventory Page Stat Cards
**Files:**
- Modify: `frontend/app/inventory/page.tsx`
- [ ] **Step 1: Read the current inventory page to find stat card implementations**
Look for sections displaying:
- "Categories" with count
- "Item Types" with count
- "Total Boxes" with count
Expected current pattern (inline flex layout):
```tsx
<div className="flex items-center gap-2">
<Layers className="text-primary" />
<div>
<p className="text-xs text-slate-500">Categories</p>
<p className="text-lg font-black">{categoriesCount}</p>
</div>
</div>
```
- [ ] **Step 2: Import StatCard component at top of file**
Add to imports:
```tsx
import StatCard from '@/components/StatCard';
```
(Adjust import path based on actual file location)
- [ ] **Step 3: Replace Categories stat display with StatCard**
Find the Categories display section and replace with:
```tsx
<StatCard
label="Categories"
value={categoriesCount}
icon={Layers}
/>
```
Ensure `Layers` icon is imported from lucide-react (should already be if used previously).
- [ ] **Step 4: Replace Item Types stat display with StatCard**
Find the Item Types display section and replace with:
```tsx
<StatCard
label="Item Types"
value={itemTypesCount}
icon={Package}
/>
```
Ensure `Package` icon is imported from lucide-react (standard Lucide icon for item types).
- [ ] **Step 5: Replace Total Boxes stat display with StatCard**
Find the Total Boxes display section and replace with:
```tsx
<StatCard
label="Total Boxes"
value={totalBoxesCount}
icon={Box}
/>
```
Ensure `Box` icon is imported from lucide-react.
- [ ] **Step 6: Verify all three stat cards are now using StatCard component**
Check that the Inventory page displays three stat cards in a consistent layout.
- [ ] **Step 7: Commit the changes**
```bash
git add frontend/app/inventory/page.tsx
git commit -m "fix: refactor Inventory page stat cards to use StatCard component
- Replace Categories, Item Types, Total Boxes with StatCard
- Fixes mobile content overflow with two-column flexbox layout
- Responsive font sizing for mobile/desktop
- Label truncation for long text"
```
---
## Task 3: Update Logs Page Stat Cards
**Files:**
- Modify: `frontend/app/logs/page.tsx`
- [ ] **Step 1: Read the current logs page to find stat card implementations**
Look for "Total Events" or similar stat display with a count.
- [ ] **Step 2: Import StatCard component**
Add to imports:
```tsx
import StatCard from '@/components/StatCard';
```
- [ ] **Step 3: Replace Total Events stat display with StatCard**
Find the Total Events display section and replace with:
```tsx
<StatCard
label="Total Events"
value={totalEventsCount}
icon={LogSquare}
/>
```
Ensure `LogSquare` icon is imported from lucide-react (or use `FileText`, `ListChecks`, or other appropriate icon if LogSquare doesn't exist).
- [ ] **Step 4: Verify the stat card displays correctly**
Check that the Logs page displays the Total Events stat in the new layout.
- [ ] **Step 5: Commit the changes**
```bash
git add frontend/app/logs/page.tsx
git commit -m "fix: refactor Logs page stat cards to use StatCard component
- Replace Total Events display with StatCard
- Fixes mobile content overflow with responsive layout
- Consistent styling with Inventory page"
```
---
## Task 4: Update Admin Page Stat Cards
**Files:**
- Modify: `frontend/app/admin/page.tsx`
- [ ] **Step 1: Read the current admin page to find stat card implementations**
Look for any label + number stat displays (e.g., "Users", "Sessions", "Audit Logs", etc.).
- [ ] **Step 2: Import StatCard component**
Add to imports:
```tsx
import StatCard from '@/components/StatCard';
```
- [ ] **Step 3: Replace all stat displays with StatCard**
For each stat display on the Admin page, replace with:
```tsx
<StatCard
label="[Stat Label]"
value={[Count Variable]}
icon={[AppropriateIcon]}
/>
```
Example (if there's a "Users" stat):
```tsx
<StatCard
label="Users"
value={usersCount}
icon={Users}
/>
```
Map appropriate Lucide icons to each stat:
- Users → `Users`
- Sessions → `Zap` or `Activity`
- Audit Logs → `LogSquare` or `FileText`
- Admins → `Shield`
- Active Sessions → `Activity`
- [ ] **Step 4: Verify all admin stat cards are updated**
Check that the Admin page displays all stats with consistent StatCard styling.
- [ ] **Step 5: Commit the changes**
```bash
git add frontend/app/admin/page.tsx
git commit -m "fix: refactor Admin page stat cards to use StatCard component
- Replace all stat displays with StatCard
- Fixes mobile content overflow with responsive layout
- Consistent styling across all admin stats"
```
---
## Task 5: Test on Mobile Viewport
**Files:**
- Test: All three pages (Inventory, Logs, Admin)
- [ ] **Step 1: Start the development server**
```bash
./start_server.sh
```
Expected: Frontend runs on `http://localhost:8907`
- [ ] **Step 2: Open browser DevTools and set mobile viewport**
1. Open DevTools (F12 or Cmd+Shift+I)
2. Toggle Device Toolbar (Cmd+Shift+M or Ctrl+Shift+M)
3. Set to iPhone SE (375px) or iPhone 12 (390px)
- [ ] **Step 3: Test Inventory page on mobile**
Navigate to Inventory page.
Verify:
- ✓ "Categories 2" — Label on left, number on right, no overflow
- ✓ "Item Types 6" — Label on left, number on right, no overflow
- ✓ "Total Boxes 2" — Label on left, number on right, no overflow
- ✓ All text is visible (not cut off)
- ✓ Cards are properly padded
- [ ] **Step 4: Test Logs page on mobile**
Navigate to Logs page.
Verify:
- ✓ "Total Events [number]" — Label and number both visible, no overflow
- ✓ Text formatting is correct
- [ ] **Step 5: Test Admin page on mobile**
Navigate to Admin page.
Verify:
- ✓ All stat cards display correctly without overflow
- ✓ Labels and numbers are properly aligned
- [ ] **Step 6: Test on different mobile widths**
Resize browser to test at:
- 320px (iPhone SE smallest)
- 375px (iPhone SE)
- 390px (iPhone 12)
- 430px (iPhone 14 Pro Max)
Verify no overflow occurs and layout remains stable.
- [ ] **Step 7: Test on tablet and desktop**
Resize to:
- 768px (tablet) — verify `md:` breakpoint applies
- 1024px (desktop) — verify `lg:` breakpoint applies
- [ ] **Step 8: Test with long labels**
(If possible, temporarily update a label to test truncation)
Example: `<StatCard label="Total Events in System Very Long Name" value={42} />`
Verify: Label shows ellipsis ("Total Events in System...") and doesn't overflow.
- [ ] **Step 9: No test failures**
Run any existing tests to ensure no regressions:
```bash
npm run test
```
Expected: All tests pass (or maintain same pass rate as before)
- [ ] **Step 10: Commit test verification notes (optional)**
```bash
git add .
git commit -m "test: verify stat card responsive layout on mobile viewports
- iPhone SE (375px): No overflow ✓
- iPhone 12 (390px): No overflow ✓
- iPhone 14 Pro Max (430px): No overflow ✓
- Tablet (768px): Desktop styling ✓
- Desktop (1024px): Large text ✓
- Long label truncation: Ellipsis works ✓"
```
---
## Task 6: Final Verification & Documentation Update
**Files:**
- Review: All modified pages
- Update: `dev_docs/SESSION_STATE.md` (handover)
- [ ] **Step 1: Verify all commits are in place**
```bash
git log --oneline -6
```
Expected output includes:
- `feat: create reusable StatCard component...`
- `fix: refactor Inventory page stat cards...`
- `fix: refactor Logs page stat cards...`
- `fix: refactor Admin page stat cards...`
- (optional) `test: verify stat card responsive layout...`
- [ ] **Step 2: Check for any remaining inline stat displays**
Search the codebase for any remaining old-style stat displays:
```bash
grep -r "text-xs text-slate-500" frontend/app --include="*.tsx" | grep -i "categor\|item\|box\|event\|user\|session"
```
If found, replace with StatCard component.
- [ ] **Step 3: Update SESSION_STATE.md handover**
Add to `dev_docs/SESSION_STATE.md`:
```markdown
### Mobile Stat Cards Responsive Fix (Completed)
**Issue:** Stat card content overflowed outside card boundaries on iPhone mobile screens (< 640px).
**Solution:** Created reusable `StatCard` component with two-column flexbox layout:
- Label (left, flexible, truncates if long)
- Number (right, fixed, never wraps)
- Responsive font sizes: `text-sm md:text-base` (label), `text-lg md:text-xl` (number)
**Pages Fixed:**
- ✓ Inventory page (Categories, Item Types, Total Boxes)
- ✓ Logs page (Total Events)
- ✓ Admin page (all stat displays)
**Verification:**
- ✓ iPhone SE (375px): No overflow
- ✓ iPhone 12 (390px): No overflow
- ✓ Tablet/Desktop: Responsive scaling works
- ✓ Long labels: Truncate with ellipsis
- ✓ All tests pass
**Files Changed:**
- Created: `frontend/components/StatCard.tsx`
- Modified: `frontend/app/inventory/page.tsx`
- Modified: `frontend/app/logs/page.tsx`
- Modified: `frontend/app/admin/page.tsx`
**Next Steps:** Deploy to remote server and verify on real iPhone device if possible.
```
- [ ] **Step 4: Commit the handover update**
```bash
git add dev_docs/SESSION_STATE.md
git commit -m "docs: update session state - mobile stat cards responsive fix complete
- StatCard component created and integrated
- All three pages (Inventory, Logs, Admin) updated
- Mobile testing verified (375px-430px widths)
- Responsive breakpoints working correctly"
```
- [ ] **Step 5: Verify no uncommitted changes**
```bash
git status
```
Expected: `working tree clean`
- [ ] **Step 6: Review the spec coverage one final time**
Check `docs/superpowers/specs/2026-04-15-mobile-stat-cards-responsive-design.md`:
**Spec Requirements vs. Implementation:**
- ✓ Two-column flexbox layout implemented
- ✓ Label left, number right implemented
- ✓ Responsive font sizing (sm/md/lg) implemented
- ✓ Label truncation for long text implemented
- ✓ Inventory page stat cards fixed
- ✓ Logs page stat cards fixed
- ✓ Admin page stat cards fixed
- ✓ Mobile testing completed
- ✓ No regressions on desktop/tablet
All spec requirements are covered.
---
## Summary
**6 Tasks, ~45-60 minutes total:**
1. Create StatCard component (5 min)
2. Update Inventory page (10 min)
3. Update Logs page (10 min)
4. Update Admin page (10 min)
5. Test on mobile (15 min)
6. Final verification & docs (5 min)
**Commits Created:** 5-6 commits with clear, descriptive messages
**Testing:** Manual mobile viewport testing across iPhone SE, 12, 14 Pro Max widths
**Outcome:** All stat cards on Inventory, Logs, and Admin pages now display with responsive two-column layout. No content overflow on mobile. Consistent styling across all pages.
---