Cleanup: delete dead top-level pages + update docs (Slice 11)

Delete the old top-level page files whose content was migrated into
service-page tabs in slices 5-9:
- pages/Media.tsx, Applications.tsx (-> MediaTab)
- pages/FileBrowser.tsx, FileBrowser.impl.tsx (-> FilesTab)
- pages/Actions.tsx (-> ActionsTab)
- pages/Users.tsx, UsersPage.impl.tsx (replaced by Authentik tabs)
- components/BackupsPage.tsx (-> JobsTab)
- components/ObservabilityPage.tsx (split into Alerts/Links/Metrics tabs)
- hooks/useUsers.ts (orphaned after Users page deletion)
- the corresponding page test files (Media, FileBrowser, Applications,
  Actions, UsersPage) that tested the deleted pages directly.

The service-tab components are the live implementations; ServicePage
renders them. No live code references the deleted files.

Docs: append an Information Architecture section to REQUIREMENTS.md
documenting the services-as-hub model (nav shape, service-page tabs,
service type registry, Users->Authentik, Observability split, legacy
route 404s, empty state). Add a CHANGELOG entry under [Unreleased].

92 frontend tests pass (was 112; -20 deleted page tests); 271 backend
tests pass; lint/build green.

Refs openspec/changes/services-as-hub-ia/ (tasks slice 11).
This commit is contained in:
Developer
2026-06-26 20:11:02 +00:00
parent ec57eff59a
commit a8dfbd5dc6
45 changed files with 3441 additions and 4711 deletions
+46
View File
@@ -0,0 +1,46 @@
# Follow-up 2 — Touch-target pass on default-size buttons
## Task
Apply `.mobile-touch-target` to default-size `<Button>` elements (32px tall, below the 44px WCAG 2.5.5 minimum) across `frontend/src/pages/` and `frontend/src/components/`.
## Files changed (9 files, +34/-32)
| File | Buttons touched |
|------|----------------|
| `frontend/src/pages/Dashboard.tsx` | 2 (Edit dashboard, Add shortcut) |
| `frontend/src/pages/ServicePage.tsx` | 4 (Delete service mobile, Save desktop, Delete desktop, Update connection) |
| `frontend/src/pages/Settings.tsx` | 10 (Validate SSH, Save SSH key, Generate key, Clear, Delete key, Reset DB, Edit machine, Delete machine ×2, Delete in sheet) |
| `frontend/src/pages/Media.tsx` | 3 (Build index, Stop build, Force stop build) |
| `frontend/src/pages/ServicesPage.tsx` | 2 (Add service type, Add service) |
| `frontend/src/pages/Actions.tsx` | 4 (Delete, Save action, Edit, Run) |
| `frontend/src/pages/FileBrowser.impl.tsx` | 3 (Open path, Refresh, Run job) |
| `frontend/src/components/DialogFooter.tsx` | 2 (Cancel, Confirm — shared by all ConfirmDialogs) |
| `frontend/src/components/WidgetConfigDialog.tsx` | 2 (Back/reset, Save widget) |
**Total: 32 default-size buttons upgraded to 44px minimum below md.**
## Deliberately skipped
- **Shared `ui/` primitives** (button.tsx, dialog.tsx close button, sheet.tsx close button, sheet-form.tsx footer): rule 3 — these are either the component definition itself or already handled/overridden by their consuming pages.
- **Desktop Sidebar buttons**: rule 4 — `Sidebar` renders `null` on mobile.
- **Buttons already carrying `mobile-touch-target`** from earlier slices.
## Validation
```
cd frontend && npm run lint → 0 errors (2 pre-existing warnings in UsersPage.impl.tsx, unrelated)
cd frontend && npm run build → ✓ built (tsc -b + vite)
cd frontend && npm run test → 28 files / 122 tests passed
```
No new tests — the `.mobile-touch-target` class applies via `@media(max-width: 767px)` which jsdom does not honor, making it untestable in Vitest without mocking computed styles. The change is a no-op at md+.
## Notes for parent
- A regex-based Python script was initially attempted but **broke multi-line Button declarations** by matching `>` inside `=>` arrow functions. The script was reverted and all edits were redone with targeted edits + a corrected script that tracks brace depth. The Settings.tsx Validate-SSH button needed a manual fix after the corrected script still misplaced the className inside a `disabled={...}` block.
- Unrelated formatter-only changes in test files (mobile-card.test.tsx, ServicePage.test.tsx) were discarded to keep the diff focused.
## skill_resolution
`none` — no project/user SKILL.md paths were injected; no `.atl/skill-registry.md` found.