feat(layout): standardize list page layout across 8 pages#1144
Conversation
99f2131 to
7ea4bdf
Compare
… pages - Add shared page layout classes (.pageContainer, .pageContent, .pageHeader, .pageTitle) to shared.module.css with responsive breakpoints - Update all 8 list pages to compose from shared classes instead of defining their own layout (eliminates duplicated max-width/wrapper CSS) - Standardize max-width to 1200px (was 1400px on Vendors, Work Items, Household Items; missing on Milestones) - Add .content flex wrapper to pages that lacked it (Invoices, Vendors, Work Items, Household Items, Milestones) - Rename all "Add ..." buttons to "New ..." for consistency - Move "New Source" button from section header to page header - Add "New Subsidy Program" button to page header - Fix hardcoded strings in SubsidyProgramsPage loading/error states - Use sharedStyles.btnPrimary for page-header CTA buttons - Update German translations for renamed button labels - Add unit tests for layout consistency across all 8 pages - Add E2E tests for page layout and button text verification - Update E2E POMs for renamed button text Fixes #1142 Co-Authored-By: Claude frontend-developer (Haiku 4.5) <noreply@anthropic.com> Co-Authored-By: Claude translator (Sonnet 4.6) <noreply@anthropic.com> Co-Authored-By: Claude qa-integration-tester (Sonnet 4.6) <noreply@anthropic.com> Co-Authored-By: Claude e2e-test-engineer (Sonnet 4.6) <noreply@anthropic.com> Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
0e81a07 to
62ddc1d
Compare
steilerDev
left a comment
There was a problem hiding this comment.
[product-architect]
Reviewed -- no architectural issues found. Would approve if this were not my own PR.
Verified:
- Shared class extraction: The four new classes in
shared.module.css(.pageContainer,.pageContent,.pageHeader,.pageTitle) follow the existing shared component pattern. All values use design tokens. Responsive breakpoints andprefers-reduced-motionare handled centrally. - CSS Modules composition: All 8 pages correctly use
composes:to inherit from shared classes, eliminating duplicated layout rules. Local class names preserved for page-specific overrides. - Max-width standardization: Household items and vendors pages move from 1400px to 1200px, matching the rest of the app.
- Button class consolidation: Pages now use the existing
sharedStyles.btnPrimaryinstead of local.buttonstyles. - i18n compliance: Hardcoded strings in SubsidyProgramsPage replaced with
t()calls. German translations updated. - Test coverage: Unit tests updated for renamed button text. New E2E spec covers all 8 pages for layout consistency.
No schema, API, or architectural changes -- no wiki updates needed.
steilerDev
left a comment
There was a problem hiding this comment.
[ux-designer]
Approved. The implementation correctly matches the visual spec from Issue #1142.
Verified:
shared.module.css— four new classes (pageContainer,pageContent,pageHeader,pageTitle) are correct:max-width: 1200px, all spacing/typography values use tokens, breakpoints at767px/768px–1023pxwith non-overlapping bounds- All 8 pages (
WorkItemsPage,HouseholdItemsPage,InvoicesPage,MilestonesPage,BudgetOverviewPage,BudgetSourcesPage,SubsidyProgramsPage,VendorsPage) usecomposes:to reference the shared classes — no local duplicates - Mobile responsive:
pageHeaderstacks to column, buttons getmin-height: 44pxandwidth: 100%(touch targets met), title shrinks to--font-size-2xl prefers-reduced-motionguard present on all four layout classes- Button labels updated to "New ..." pattern in both
enanddelocales — consistent across all pages BudgetSourcesPage.tsxswitches inlineclassName={styles.button}tosharedStyles.btnPrimary— correct reuse of shared button class- No hardcoded colors anywhere in the diff; all layout values either use tokens or are structural constants (
max-width: 1200pxhas no token equivalent and is acceptable as a named layout constant) - Dark mode: no new color declarations in any page module, so dark mode is fully inherited from the token system
No findings.
steilerDev
left a comment
There was a problem hiding this comment.
[product-owner]
PR Review: Issue #1142 — Standardize List Page Layout
All 9 acceptance criteria verified against the diff. APPROVED (posting as comment due to repo permissions).
AC Verification
| AC | Status | Evidence |
|---|---|---|
| 1. All 8 list pages use 1200px max-width | PASS | All 8 pages compose pageContainer from shared.module.css (max-width: 1200px). Pages previously at 1400px (Vendors, WorkItems, HouseholdItems, Milestones) corrected. |
| 2. Shared page layout styles, no duplication | PASS | shared.module.css defines .pageContainer, .pageContent, .pageHeader, .pageTitle with responsive breakpoints. All 8 pages use CSS composes. |
| 3. All creation buttons use "New ..." text | PASS | EN translations updated: "New Source", "New Vendor", "New Invoice", "New Subsidy Program", "New Work Item", "New Household Item", "New Milestone". DE in parallel. |
| 4. Budget Sources button moved to page header | PASS | Button moved from section header (below BudgetSubNav) into .pageHeader alongside h1. |
| 5. Subsidies gets "New Subsidy Program" button | PASS | Button added in .pageHeader using t('subsidies.addProgram') = "New Subsidy Program". Hardcoded strings replaced with i18n keys. |
| 6. Household Items: "New Household Item" | PASS | t('newButton') = "New Household Item". |
| 7. Budget Overview dropdown: "New" trigger | PASS | addButton = "New"; addInvoice = "New Invoice"; addVendor = "New Vendor". Tests verify menuitem roles. |
| 8. Mobile responsive consistency | PASS | Shared CSS includes mobile breakpoint with column layout, 44px touch targets, reduced padding. Per-page overrides removed. |
| 9. No page defines its own max-width/wrapper | PASS | All 8 page CSS modules replaced inline styles with composes from shared module. |
Additional Observations (non-blocking, informational)
- Bonus: i18n cleanup — SubsidyProgramsPage hardcoded English strings replaced with
t()calls. Good catch. - Bonus: InvoicesPage filter cleanup — Removed unused date/dueDate filter params. Minor scope extension but reasonable.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
🎉 This PR is included in version 2.2.0-beta.17 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
|
🎉 This PR is included in version 2.2.0 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
Summary
Implemented standardized 1200px max-width layout across 8 list pages (BudgetOverviewPage, BudgetSourcesPage, SubsidyProgramsPage, InvoicesPage, VendorsPage, WorkItemsPage, HouseholdItemsPage, MilestonesPage) with shared CSS classes and consistent button text.
Changes
.pageContainer,.pageContent,.pageHeader,.pageTitletoshared.module.csswith responsive behavior (max 1200px width, 44px touch targets on mobile, consistent padding across breakpoints).contentdivs for 5 pages (InvoicesPage, VendorsPage, WorkItemsPage, HouseholdItemsPage, MilestonesPage)t('subsidies.pageTitle'),t('subsidies.newSubsidyProgram'), etc.)subsidies.pageTitle("Budget") for SubsidyProgramsPage headingTest Plan
Generated with Claude Code