fix(responsive): mobile-first layout audit with 44px touch targets #119
No reviewers
Labels
No labels
domain:backend
domain:devops
domain:frontend
No milestone
No project
No assignees
1 participant
Due date
No due date set.
Dependencies
No dependencies set.
Reference
ldraney/pal-e-app!119
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "118-mobile-responsive"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Comprehensive mobile-responsive audit across all views. Enforces 44px minimum touch targets on mobile, prevents horizontal overflow, and ensures all interactive elements (nav, sidebar, board cards, modals, forms) work properly on narrow screens. Desktop layout is preserved -- enlarged mobile targets revert to compact sizing at the 600px breakpoint.
Changes
src/app.css-- Nav links, auth buttons, hamburger, search input, filter pills, form inputs, buttons all getmin-height: 2.75remon mobile; sidebar overlay goes full-height with 85vw max-width; content area getsoverflow-x: hidden+word-break; tree items sized for touch; headings getoverflow-wrap: break-word; board progress labels wrap; desktop breakpoint restores compact sizingsrc/lib/components/NoteLayout.svelte-- Title row wraps on mobile; edit button meets touch target; aligns flex-start instead of center for long titlessrc/lib/components/ProjectLayout.svelte-- Layout stacks vertically below 1024px; edit button meets touch target; h1 gets word-break; header row wrapssrc/lib/components/QuickJot.svelte-- Modal getswidth: calc(100% - 2rem)with margin and max-height scroll; toast spans full width on mobile, right-anchored on desktopsrc/routes/boards/[slug]/+page.svelte-- Delete button visible on touch devices (@media (hover: none)); add button 44px on mobile; filter pills sized for touch; modal gets margin/width fixsrc/routes/dashboard/+page.svelte-- Attention items wrap on narrow screens with flex-wrapsrc/routes/notes/[slug]/edit/+page.svelte-- Side-by-side form rows stack on mobile via.form-rowclass; tag suggestion buttons sized for touchsrc/routes/search/+page.svelte-- Result rows wrap on mobile; mode buttons get touch targets; search filter line wrapsTest Plan
npm run buildpasses clean (only pre-existing autofocus a11y warning)Review Checklist
@media (min-width: 600px)npm run buildpassesRelated Notes
None.
Related
Closes #118
PR #119 Review
DOMAIN REVIEW
Tech stack: SvelteKit / CSS (pure custom properties, no Tailwind). 8 files changed, 232 additions, 52 deletions. All changes are CSS-only -- no logic, no data flow, no API calls.
Mobile-first pattern: Consistent and correct. Base styles set 44px (
2.75rem) touch targets, then@media (min-width: 600px)restores compact desktop sizing withmin-height: auto. This follows WCAG 2.5.8 (Target Size minimum 44x44 CSS pixels) and matches the established breakpoint convention inapp.css.Sidebar overlay (
app.csslines ~293-305): Changed fromtop: 2.75rem; height: calc(100vh - 2.75rem)totop: 0; height: 100vhwithpadding: 3.5rem 0.75rem 0.75rem. Full-viewport overlay with top padding to clear the nav. The desktop breakpoint at line ~1113 correctly restoresposition: sticky; top: 2.75rem; height: calc(100vh - 2.75rem). Sound approach.Touch device delete button (
boards/[slug]/+page.svelte): Uses@media (hover: none)to show delete buttons at reduced opacity on touch devices since:hoveris unavailable. Correct use of hover media feature.:activepseudo-class provides tap feedback. Good pattern.Content overflow protection (
app.css.content):overflow-x: hidden+overflow-wrap: break-word+word-break: break-wordapplied to main content area. Headings, card titles, and note titles all get matchingoverflow-wrap/word-break. Thorough.Form stacking (
notes/[slug]/edit/+page.svelte): Replaced utility classflex gap-3with semantic.form-rowclass that stacks vertically on mobile, horizontal at 600px. Correct approach -- keeps utility classes out of layout-critical responsive patterns.Search results (
search/+page.svelte): Replaced inline utility classes with semantic.result-rowand.result-titleclasses. Addedshrink-0to metadata badges so they don't compress. Desktop restores single-line ellipsis. Clean refactor.ProjectLayout 1024px breakpoint: Uses
@media (min-width: 1024px)for the project sidebar visibility AND the new row-to-column layout. Consistent with the existing sidebar breakpoint in the same file (line ~267).BLOCKERS
None.
This is a CSS-only PR with no new functionality, no user input handling, no auth changes, and no data flow modifications. The BLOCKER criteria (test coverage for new functionality, unvalidated user input, secrets, DRY auth/security violations) do not apply.
NITS
DRY:
.edit-btnduplicated across two components.NoteLayout.svelte(line ~179) andProjectLayout.svelte(line ~293) both define identical.edit-btnstyles with the same mobile touch target pattern (padding, min-height, inline-flex, media query). Consider extracting toapp.cssas a global class or a shared component. Not blocking because it is not in an auth/security path, but divergence risk exists if one is updated without the other.DRY:
.modal-cardresponsive treatment is inconsistent.QuickJot.sveltegets the full treatment:width: calc(100% - 2rem),margin: 1rem,max-height: calc(100vh - 2rem),overflow-y: auto, and a desktop restore media query for padding.boards/[slug]/+page.sveltegetswidth: calc(100% - 2rem)andmargin: 1rembut omitsmax-height/overflow-yand the desktop restore. If the board modal can contain enough items to exceed viewport height on mobile, it will not scroll. Consider applying the same overflow treatment, or extracting.modal-cardresponsive rules toapp.css.Deprecated CSS property.
-webkit-overflow-scrolling: touch(sidebar overlay) is deprecated and has no effect in modern WebKit/Blink. Harmless but dead code.Redundant
.filter-pillresponsive rules.app.cssglobal scope andboards/[slug]/+page.sveltecomponent scope both define mobile touch targets and desktop restore for.filter-pill. Due to Svelte scoping, the component version wins for board page elements. The global version covers non-board usages (e.g., search pagefilter-pillspans). This works but is worth a comment so future maintainers understand the layering.tag-suggestmin-height is 2rem, not 2.75rem. All other interactive elements use2.75rem(44px) for WCAG compliance. Tag suggestion buttons in the edit page use2rem(32px). If these are considered tap targets, they should be 44px. If they are secondary/inline elements, 2rem is acceptable but inconsistent with the stated 44px audit goal.SOP COMPLIANCE
118-mobile-responsive)Closes #118)fix(responsive):)PROCESS OBSERVATIONS
VERDICT: APPROVED