--- phase: 11-visual-design-responsive-layout-cleanup plan: 3 type: execute wave: 2 depends_on: [11-02] requirements: [RESP-01, RESP-02, RESP-03, RESP-05] files_modified: - frontend/src/App.vue - frontend/src/layouts/AdminLayout.vue - frontend/src/components/layout/AppSidebar.vue - frontend/src/components/admin/AdminSidebar.vue - frontend/src/components/storage/StorageBrowser.vue - frontend/src/__tests__/keyboard.test.js - frontend/src/components/storage/__tests__/StorageBrowser.skeleton.test.js autonomous: true --- # Plan 11-03 — Responsive Shells & Storage Rows ## Objective Make both user and admin layouts usable below `lg`, and make storage rows fit smaller viewports without losing core actions. ## Tasks 1. Use layout-local drawer refs, not a new Pinia store: - `App.vue` owns user drawer state. - `AdminLayout.vue` owns admin drawer state. - Watch route changes in each layout root and close the drawer after navigation. - Do not put drawer state in `AppSidebar.vue` or `AdminSidebar.vue`. 2. Add a mobile-only header with a hamburger button for the user layout. 3. Hide `AppSidebar` below `lg`; open it in a slide-in overlay drawer with backdrop tap, route-change close, and `translate-x-0` / `-translate-x-full` transition. 4. Apply the same responsive shell behavior to `AdminLayout` and `AdminSidebar`. 5. Update `StorageBrowser` row/grid classes so: - Size column hides below `md` - Modified column hides below `sm` - icon, name, and actions remain visible - grid templates do not reserve hidden column widths on mobile 6. Ensure inline icon action buttons have at least `36px` touch targets below `md`. 7. Add or update tests for drawer open/close, route-change close, admin drawer behavior, responsive column classes, and touch target classes. 8. Verify with browser screenshots or Playwright at 375px, 768px, 1024px, and desktop width. ## Acceptance Criteria - User sidebar is hidden below 1024px and accessible through a hamburger drawer. - Admin sidebar has matching mobile behavior. - Drawer closes on backdrop tap and navigation tap. - Storage rows satisfy RESP-02 without horizontal overflow at 375px. - Icon actions satisfy RESP-03. - Drawer state is owned only by `App.vue` and `AdminLayout.vue`. - Frontend tests and build pass.