--- phase: 11-visual-design-responsive-layout-cleanup plan: 7 subsystem: frontend tags: [gap-closure, mobile, responsive, storage-browser, uat] requirements: [RESP-02, RESP-03, VISUAL-03] depends_on: [11-UAT] --- # Plan 11-07 - Mobile Storage Toolbar and Action Visibility Gap Closure ## Goal Close the Phase 11 UAT gaps for small mobile widths: row actions must be visible without hover, and the StorageBrowser toolbar must fit below 550px by collapsing search, sort, and new-folder controls into compact icon controls. ## Source Gaps From `11-UAT.md`: 1. Row actions are hover-only, making touchscreen use unsafe and invisible. 2. Search, sort, and new-folder controls overflow to the right below roughly 550px. 3. Mobile file-browser navigation should use icon controls for search/sort/new-folder instead of requiring sideways scrolling. ## Implementation Tasks ### Task 1 - Make row actions visible without hover Files: - `frontend/src/components/storage/StorageBrowser.vue` - `frontend/src/components/storage/__tests__/StorageBrowser.skeleton.test.js` Steps: 1. Replace both row action container class stacks that currently include `opacity-0 group-hover:opacity-100 transition-opacity`. 2. Keep actions visible by default. Prefer subdued default icon color plus hover/active background over hiding. 3. Preserve `min-w-[36px] min-h-[36px]` below `md`. 4. Add tests asserting folder and file action containers/buttons are present and visible without a hover state. Acceptance: - At 375px, folder/file row actions are visible immediately. - Delete controls are discoverable; the user does not have to guess where destructive actions live. - Existing click-after-drag guard and folder picker behavior remain unchanged. ### Task 2 - Add compact mobile toolbar controls Files: - `frontend/src/components/storage/StorageBrowser.vue` - `frontend/src/components/ui/AppIcon.vue` if a missing sort/filter icon is needed - `frontend/src/components/storage/__tests__/StorageBrowser.skeleton.test.js` Steps: 1. Split the sticky header into a responsive layout: - Breadcrumb area can wrap/truncate safely. - Desktop/tablet controls keep existing full SearchBar, SortControls, and "New folder" text button at `sm` and above. - Below `sm`, show icon buttons for search, sort, and new folder. 2. Search icon behavior: - Toggles a full-width mobile search input row below the header controls. - Search row must fit the viewport, use `w-full`, and preserve Escape-to-clear behavior through the existing search event. 3. Sort icon behavior: - Opens a compact menu or panel with Name/Date/Size options. - The active option and order must remain visible to screen readers and keyboard users. - The panel must fit within viewport width and close after selection. 4. New-folder icon behavior: - Emits the existing `new-folder` event. - Has `aria-label="New folder"` and a tooltip/title. 5. Avoid creating a new file browser or parallel grid; keep `StorageBrowser.vue` as the single browser surface. Acceptance: - At 375px and below 550px, no horizontal scroll is needed to access search, sort, or new-folder. - Mobile controls are icon-sized, keyboard focusable, and labelled. - Existing desktop layout remains visually equivalent. ### Task 3 - Add responsive regression tests Files: - `frontend/src/components/storage/__tests__/StorageBrowser.skeleton.test.js` - Optional: `frontend/src/components/ui/__tests__/AppIcon.test.js` if a new icon is added. Tests: 1. Mobile toolbar renders icon controls with accessible labels. 2. Full desktop controls are hidden below `sm`; compact controls are hidden at `sm` and above. 3. Search icon toggles a full-width mobile search row. 4. Sort icon opens mobile sort options and emits the existing `sort-change` shape. 5. New-folder icon emits the existing `new-folder` event. 6. Row action containers do not contain `opacity-0` or `group-hover:opacity-100`. Acceptance: - `cd frontend && npm run test -- --run src/components/storage/__tests__/StorageBrowser.skeleton.test.js` passes. - `cd frontend && npm run test -- --run` passes. - `cd frontend && npm run build` passes. ## Verification Manual UAT after implementation: 1. Set viewport to 375px. 2. Confirm row action buttons are visible without hover. 3. Confirm search/sort/new-folder are icon controls and can be used without horizontal scrolling. 4. Confirm list rows still show icon/name/actions only, with size hidden below `md` and modified hidden below `sm`. ## Non-Goals - No redesign of the whole file browser. - No new component parallel to `StorageBrowser.vue`. - No backend or API changes. - No changes to document/folder permissions or destructive action semantics.