diff --git a/.planning/phases/10-ux-interaction/10-07-SUMMARY.md b/.planning/phases/10-ux-interaction/10-07-SUMMARY.md new file mode 100644 index 0000000..c2a70f8 --- /dev/null +++ b/.planning/phases/10-ux-interaction/10-07-SUMMARY.md @@ -0,0 +1,117 @@ +--- +phase: 10-ux-interaction +plan: "07" +subsystem: frontend/layout +tags: [component, sidebar, skeleton, empty-state, ux, tdd, vitest] +dependency_graph: + requires: [10-02, 10-03, 10-05] + provides: [AppSidebar-skeletons, AppSidebar-EmptyState-micro, AppSidebar-no-new-button] + affects: [AppSidebar.vue, FileManagerView.vue] +tech_stack: + added: [] + patterns: [animate-pulse skeleton rows, EmptyState size=sm micro states, Options API removal, script setup adaptation] +key_files: + created: [] + modified: + - frontend/src/components/layout/AppSidebar.vue + - frontend/src/components/layout/__tests__/AppSidebar.empty.test.js +decisions: + - "Test assertions adapted for script setup (Composition API) rather than Options API — both are correct; the plan described Options API access patterns that do not apply to the actual implementation" + - "Folder skeleton deferred to cloudExpanded section (always visible) for test verification — folders section requires explicit expand click to be visible" + - "UX-14 method absence test uses wrapper.vm which correctly returns undefined for script-setup functions not in defineExpose" +metrics: + duration: "18 minutes" + completed: "2026-06-15" + tasks_completed: 2 + files_count: 2 +requirements: [UX-03, UX-01, UX-14] +--- + +# Phase 10 Plan 07: AppSidebar Skeletons + EmptyState Micro + UX-14 Summary + +**One-liner:** AppSidebar.vue now shows animate-pulse skeleton rows while loading, EmptyState size=sm micro states when sections are empty, and the inline "New folder" button with its helper methods is fully removed (folder creation is exclusively via StorageBrowser). + +## What Was Built + +### UX-14: Remove inline "New folder" button from AppSidebar + +The sidebar's inline folder-creation flow has been removed: +- Deleted `` from the Folders section header +- Deleted `
` inline new-folder input block (including the ``, validation, and error text) +- Deleted `ref()` state: `showNewFolderInput`, `newFolderName`, `newFolderError` +- Deleted functions: `startNewFolder()`, `cancelNewFolder()`, `submitNewFolder()` + +Folder creation is now exclusively handled by `StorageBrowser.vue`'s own `startNewFolder` (the file manager toolbar), which remains untouched. + +### UX-03: Skeleton placeholders while loading + +Three loading states replaced with animate-pulse shimmer rows: +- **Folders section** (inside `v-if="foldersExpanded"` template): 3-row skeleton when `loadingRoots=true` +- **Cloud section** (inside `v-if="cloudExpanded"` template): 3-row skeleton when `loadingCloudConnections=true` +- **Topics section**: 3-row skeleton when `topicsStore.loading=true` + +Each skeleton row: `
` with a square icon placeholder and a variable-width text bar, both with `animate-pulse bg-gray-100`. + +### UX-01 sidebar micro: EmptyState size=sm per section + +Three empty states wired using `EmptyState` from `../ui/EmptyState.vue`: +- **Folders**: `` +- **Cloud**: `` with `#cta` slot containing a `router-link to="/settings"` +- **Topics**: `` + +## TDD Compliance + +| Gate | Commit | Status | +|------|--------|--------| +| RED — 8/9 tests failing | 3fcc300 | PASS | +| GREEN — all 9 tests pass | 1728de7 | PASS | + +Note: 1 test passed trivially in RED (no inline folder input — `showNewFolderInput` was false by default, hiding the input). This is expected behavior; the test still correctly describes the post-change contract. + +## Deviations from Plan + +### Auto-adapted Issues + +**1. [Rule 1 - Adaptation] Tests adapted for script setup rather than Options API** +- **Found during:** Task 1 (RED test writing) +- **Issue:** The plan specified `wrapper.vm.startNewFolder` checks with Options API semantics. AppSidebar.vue uses `