Repository navigation
Conversation
…ssibility Every other authenticated page (events, vendors, checklist, guest list, budget) uses a <main> element for its content wrapper. The dashboard was the only page still using a <div>, preventing screen readers from navigating to main content via the landmark shortcut on the most-visited page. Co-Authored-By: AgenticDiego <noreply@carvallo.io>
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
This branch had an error being deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Daily Product Improvement
Summary
The dashboard page content wrapper was using a
<div>instead of a<main>element, making it the only authenticated page missing the primary landmark. Screen readers rely on<main>to let users skip directly to page content. This was fixed by replacing<div>with<main>— same classes, no visual or functional change, full semantic correctness.Recommendations Reviewed
1. Dashboard — Missing
<main>landmarksrc/app/(authenicated)/dashboard/page.tsx<div>instead of<main>, unlike every other authenticated page (events, vendors, checklist, guest list, budget all use<main>correctly)<div>with<main>to add the primary landmark2. Checklist loading page — Missing topbar skeleton
src/app/(authenicated)/checklist/loading.tsx<main>wrapper, so the header region flashes empty during load. Dashboard, events, and vendors loading pages all include topbar skeletons.<main>wrapper to match the established pattern3. Settings page — Flat heading hierarchy
src/app/(authenicated)/settings/page.tsx<h2>("Wedding Details") and all<h3>subsections ("Plugins", "Organization Members", "Connected Apps") share the samefont-serif text-xlclass, creating a visually flat page that's hard to scantext-baseortext-lgto establish clear visual hierarchy4. EttaChat — Hardcoded color tokens
src/components/etta/EttaChat.tsxlines 133–136text-emerald-400,bg-emerald-400, andtext-red-400bypass the design token system for the AI status indicatortext-success,bg-success, andtext-destructiverespectively5. Guest list filter dropdowns — Custom DIV-based implementation
src/components/guest-list/guest-search-filter.tsx<div>popovers withuseOuterClickrather than Radix Popover. No keyboard navigation (arrow keys, Escape), norole="listbox"orrole="option"semantics.6. guests-view.tsx — Hardcoded amber colors
src/components/guest-list/guests-view.tsxline 714border-amber-500/40 bg-amber-500/10 text-amber-700used for "Unsaved changes" badge — hardcoded and does not respect dark mode or design tokens (DESIGN.md prohibits hardcoded color values)text-warningif defined7. God components — Decomposition needed
src/components/guest-list/guests-view.tsx(999 lines),src/components/vendor/vendor-detail-panel.tsx(936 lines)useGuestsView,useVendorDetail) plus split render into sub-components by concernSelected Improvement
Replace
<div>with<main>in the dashboard page content wrapper — a single semantic HTML change restoring the primary landmark on the most-visited page.Why This Was Selected
The dashboard is the entry point of the app and the page users see most. It was the only authenticated page missing a
<main>landmark — every other page already uses it correctly. Without<main>, screen reader users cannot use the "jump to main content" shortcut, making the dashboard uniquely inaccessible versus the rest of the app. The fix is one tag swap with zero functional or visual impact, and it closes a clear gap in consistency.Changes Made
<div className='min-h-0 flex-1 overflow-y-auto px-4 py-5 lg:px-6 lg:py-6'>with<main ...>(identical classes) indashboard/page.tsxFiles Changed
src/app/(authenicated)/dashboard/page.tsxVerification
<main>: events, vendors, checklist, guest list, budgetdashboard/loading.tsx) uses the same pattern correctly — no changes needed thereFuture Recommendations
Checklist loading page — Missing topbar skeleton
<main>wrapper tochecklist/loading.tsxto match events/vendors/dashboard loading patternSettings page — Flat heading hierarchy
text-baseortext-lgfor proper visual hierarchyEttaChat — Hardcoded color tokens
text-emerald-400,bg-emerald-400,text-red-400with design token equivalents (text-success,bg-success,text-destructive)Guest list filter dropdowns — Radix Popover migration
guest-search-filter.tsxwith Radix Popover + accessible keyboard patternsGod component decomposition
guests-view.tsx(999 lines) andvendor-detail-panel.tsx(936 lines) into custom hooks + focused sub-componentsGitHub Issues Created or Proposed
Two issues are recommended for tracking:
[Guest List] Replace custom filter dropdowns with accessible Radix Popover components
role="listbox"/role="option"semantics and full keyboard support[Guest List / Vendors] Decompose god components into hooks + focused sub-components
guests-view.tsx(999 lines) andvendor-detail-panel.tsx(936 lines) are each too large to maintain or test in isolationuseGuestsViewanduseVendorDetailhooks; split render into sub-components by concernGenerated by Claude Code