+ Two root causes, one file. Apply both changes together.
+
+ CHANGE A — Admin sidebar bleed (Gap 3):
+ Insert a v-else-if branch in the template between the auth branch and the user-layout div. The new branch condition is `route.matched.some(r => r.meta.requiresAdmin)`. When true it renders only `` — no AppSidebar, no main wrapper. The complete corrected template root (inside the component root, excluding ToastContainer and OsDragOverlay which stay unchanged):
+
+ 1. ``
+ 2. ``
+ 3. `` ... AppSidebar + main + router-view (no ref attribute) ... `
`
+
+ Note: the router-view in branch 3 must NOT carry `ref="routeViewRef"` — refs on router-view resolve to the RouterView proxy (same root cause as Gap 4). Remove the ref attribute.
+
+ CHANGE B — Keyboard instance resolution (Gap 4, also fixes tests 12 and 13):
+ The `routeViewRef` ref and its usage must be replaced with a direct instance lookup:
+ 1. Add `useRouter` to the `vue-router` import: `import { useRoute, useRouter } from 'vue-router'`
+ 2. Add `const router = useRouter()` after `const route = useRoute()`
+ 3. Add helper: `function getFileManagerInstance() { return router.currentRoute.value.matched.find(r => r.instances?.default)?.instances?.default ?? null }`
+ 4. Remove `const routeViewRef = ref(null)` — no longer used
+ 5. Remove `ref` from the `ref` import if it is now unused (check — ref was only used for routeViewRef)
+ 6. Replace all `routeViewRef.value?.X?.()` calls in onKeydown with `getFileManagerInstance()?.X?.()`
+ 7. Replace `routeViewRef.value?.handleOsDrop?.(files)` in onOsFilesDropped with `getFileManagerInstance()?.handleOsDrop?.(files)`
+
+ After both changes, `ref` from vue should be removed from the import line if nothing else uses it (check first — if ToastContainer or OsDragOverlay use a local ref, keep it; otherwise remove to avoid lint warnings).
+
+