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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user