- 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
14 KiB
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 componentfrontend/app/logs/page.tsx— Replace stat displays with StatCard componentfrontend/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:
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-0on icon — Icon doesn't shrink -
Step 2: Commit the component
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):
<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:
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:
<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:
<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:
<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
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:
import StatCard from '@/components/StatCard';
- Step 3: Replace Total Events stat display with StatCard
Find the Total Events display section and replace with:
<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
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:
import StatCard from '@/components/StatCard';
- Step 3: Replace all stat displays with StatCard
For each stat display on the Admin page, replace with:
<StatCard
label="[Stat Label]"
value={[Count Variable]}
icon={[AppropriateIcon]}
/>
Example (if there's a "Users" stat):
<StatCard
label="Users"
value={usersCount}
icon={Users}
/>
Map appropriate Lucide icons to each stat:
-
Users →
Users -
Sessions →
ZaporActivity -
Audit Logs →
LogSquareorFileText -
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
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
./start_server.sh
Expected: Frontend runs on http://localhost:8907
- Step 2: Open browser DevTools and set mobile viewport
- Open DevTools (F12 or Cmd+Shift+I)
- Toggle Device Toolbar (Cmd+Shift+M or Ctrl+Shift+M)
- 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:
npm run test
Expected: All tests pass (or maintain same pass rate as before)
- Step 10: Commit test verification notes (optional)
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
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:
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:
### 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
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
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:
- Create StatCard component (5 min)
- Update Inventory page (10 min)
- Update Logs page (10 min)
- Update Admin page (10 min)
- Test on mobile (15 min)
- 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.