# Phase 11 Research Refresh — Visual Design, Responsive Layout & Cleanup **Researched:** 2026-06-16 **Inputs:** Phase 11 context, roadmap, requirements, pitfall notes, live frontend code. ## Executive Summary The six-plan Phase 11 sequence is structurally sound: measure first, lazy-load routes, fix responsive shells, normalize forms/modals, do the visual consistency pass, then delete dead code and measure again. The second review found several places where the plans needed sharper implementation constraints, especially because `11-CONTEXT.md` contains locked decisions that were not fully reflected in the first review. ## Current Code Findings ### Performance - `frontend/package.json` already includes `rollup-plugin-visualizer@^7.0.1`. - `frontend/vite.config.js` currently has only `vue()` in `plugins`; analyzer wiring still needs to be added behind an opt-in flag. - `frontend/src/router/index.js` still synchronously imports: - `FileManagerView` - `TopicsView` - `DocumentView` - `SettingsView` - `CloudFolderView` - `CloudStorageView` - Auth routes, admin layout, admin child views, and `SharedView` are already lazy-loaded. - Recommendation: keep `FileManagerView` synchronous only for `/` as the critical first authenticated surface. Lazy-load `TopicsView`, `DocumentView`, `SettingsView`, `CloudStorageView`, and `CloudFolderView`. Reuse the synchronous `FileManagerView` for `/folders/:folderId` unless the bundle baseline proves it should be split later. ### Responsive Shells - `App.vue` renders a desktop-only `flex h-screen overflow-hidden` shell with permanent `AppSidebar`. - `AdminLayout.vue` mirrors that desktop-only shell with permanent `AdminSidebar`. - `AppSidebar.vue` and `AdminSidebar.vue` are presentational enough to stay drawer-agnostic. - Recommendation: use layout-local refs in `App.vue` and `AdminLayout.vue`, not a new Pinia store. Nav link close behavior can be handled by watching route changes in each layout root; no child component needs global drawer state. ### Storage Rows - `StorageBrowser.vue` already hides Size below `md` and Modified below `sm` via `hidden md:block` and `hidden sm:block`. - The grid template remains fixed at `grid-cols-[2rem_1fr_6rem_8rem_6rem]`, so responsive column sizing still needs explicit adjustment to avoid empty tracks and mobile overflow. - Existing row action buttons use `p-1.5`, which may not guarantee 36x36 touch targets below `md`. ### Forms - `@tailwindcss/forms` is already installed and active in `frontend/tailwind.config.js`. - Many controls still carry repeated full border/focus class stacks. Plan 11-04 should normalize those without introducing a new component library. ### Modals Mobile overflow risk is concrete: - `ShareModal.vue`: fixed overlay, centered panel, `rounded-2xl`, no `max-h` or `overflow-y-auto`. - `CloudCredentialModal.vue`: fixed overlay, centered panel, `max-w-md p-6`, no `max-h` or `overflow-y-auto`; form can become tall with advanced Nextcloud fields. - `FolderDeleteModal.vue`: smaller but should still receive the shared mobile-safe panel pattern. - `DocumentPreviewModal.vue`: full-screen preview is structurally different; it should preserve full-screen behavior and ensure header/content do not overflow on narrow screens. Recommended modal shell pattern: overlay uses `p-4 sm:p-6`; panel uses `max-h-[calc(100vh-2rem)] overflow-y-auto` below `sm`, with desktop styling preserved. ### Visual Consistency - Current frontend heavily uses `focus:ring-2` but rarely `focus-visible:`. - `rounded-xl` and `rounded-2xl` appear on several ordinary panels/modals even though AGENTS.md prefers cards at 8px radius unless the design system requires otherwise. - There are data-driven inline styles that should remain: - topic color swatches - quota/progress bar widths - Teleport dropdown coordinates - tree indentation - There are skeleton width styles such as `:style="{ width: (50 + n * 15) + 'px' }"` that are decorative and can be converted to static Tailwind widths during the visual pass. Recommended convention: - Page title: `text-2xl font-semibold` - Section title: `text-lg font-semibold` - Panel/table heading: `text-sm font-semibold` - Body: `text-sm` - Caption/metadata: `text-xs` - Focus ring: `focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-indigo-500 focus-visible:ring-offset-1` ### Dead Code Signals - `HomeView.vue` and `FolderView.vue` remain absent, satisfying AGENTS.md. - Legacy admin-tab test names still exist under `frontend/src/components/admin/__tests__/`: - `AdminAiConfigTab.test.js` - `AdminQuotasTab.test.js` - `AdminUsersTab.test.js` - These tests may still cover current components via renamed imports or may be stale; Plan 11-06 should explicitly classify them. - `AccountView.vue` exists but `/account` redirects to `/settings`. It may be dead unless imported outside the router. Plan 11-06 should confirm before deleting. ## Review Verdict The plan set remains valid after review, but it should be refined with: - a documented layout-local drawer-state decision - exact route lazy-loading scope - exact modal overflow targets - a locked focus-ring and typography convention - explicit dead-code suspects for Plan 11-06