slskd: /soulseek search + downloads on the Workspace/Panel framework

Two panels (search + transfers) via WorkspaceView, coordinating over the
soulseek:refresh channel. Adds the page-title rule and documents the
route conventions in CLAUDE.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-29 17:21:29 +00:00
co-authored by Claude Opus 4.8
parent c023082975
commit 2a509646e7
15 changed files with 577 additions and 4 deletions
+15
View File
@@ -183,6 +183,21 @@ type parameter and let inference flow from it.
Commit messages: simple lowercase, no prefixes.
## Frontend route conventions (apply to EVERY new dashboard route)
Worked examples: `/soulseek`, `/music`, `/chat`.
- **Workspace/Panel framework, always — never a standalone single screen.** The screen renders
`<WorkspaceView workspace={ws} locked />` where
`ws = useDashboardState<LayoutNode>('screens/<name>', defaultLayout)`, guarded by a `normalizeLayout`
that pins `appType`s to an allow-list. Panels are windowed apps under
`src/workspaces/officerdev/src/apps/<Feature>/`, each exporting `appRegistryMetas`
(`{ key, name, icon, component, availableOnPanel: false }`) and registered in `AppRegistry.tsx`.
Panels coordinate via `usePanelChannel`.
- **Page title by route.** Add a rule to `RULES` in `src/apps/officer-web/state/usePageTitle.ts`
(`{ match: (p) => p.startsWith('/<name>'), title: '<Name>' }`, most-specific first);
`usePageTitleSync` does the rest.
## Further Reading
- `CONVENTIONS.md` — component organisation, state management, React patterns, with rationale