mirror of
https://github.com/SoPat712/allstarr.git
synced 2026-10-08 06:05:02 -04:00
3.6 KiB
3.6 KiB
Allstarr WebUI Design System
Product stance
Allstarr is a music control room. Every route must quickly answer:
- What is happening?
- Which library, user, source, and account are involved?
- Is it healthy and complete?
- What can I safely do next?
Visual system
Use Google Material 3 as the interaction and visual grammar, adapted to Allstarr rather than copied component by component.
- Role-based
--md-sys-color-*tokens own light and dark themes. - Allstarr blue is the only general action accent. Provider marks and music artwork provide the wider palette.
- Tonal surfaces communicate grouping. General panels do not use decorative glass, glow, gradients, or heavy shadows.
- Use one system sans family, restrained type sizes, sentence case, and short operational copy.
- Shapes follow Material roles: 8px fields, 12px compact containers, 16px panels, 24–28px dialogs, and full pills only for buttons, badges, and navigation indicators.
- Theme defaults to the operating-system preference and offers explicit System, Light, and Dark choices.
Shared components
- Keep the existing Svelte, Bits UI, Tailwind, shadcn-style primitives, and Lucide stack. Do not add Material Web and duplicate the control layer.
- Routes compose shared Button, Checkbox, Select, Dialog, Menu, Tabs, Badge, Progress, Skeleton, Tooltip, and table patterns. They do not restyle raw controls.
- Provider identity uses the existing provider mark and artwork components.
- Creative canvas effects require a GPL-compatible implementation or license. Canvas UI is not vendored because its Commons Clause adds distribution restrictions that conflict with this repository's GPL terms.
Information architecture
- Home: current playback and listeners first; source route, scrobble delivery, health, and work follow.
- Library: playlists, mappings, cached files, and kept files share one task vocabulary and aligned tables.
- Intelligence: Overview → History → Import → Discover → Automation. Import is a top-level task, not a setting hidden inside history.
- Integrations: Services owns provider configuration and diagnostics. Extensions owns package lifecycle. Accounts and Routing explain their scope in plain language.
- Activity: outcome, actor, target, duration, and time are primary; technical payloads are progressive detail.
- Settings: deployment and operator controls only. User-scoped controls stay near the data they affect.
Interaction rules
- One clear primary action per task area.
- Dense lists and tables are preferred when comparison matters; spacious guidance is used for onboarding and empty states.
- Modals protect destructive or interrupting work only. Routine configuration stays inline or in a route-level detail pane.
- Administrative Jellyfin controls appear only when the authenticated backend permission explicitly allows them. The UI never infers authorization.
- Loading uses skeletons; empty states explain the next action; errors name both the problem and recovery.
Motion
- Use 150–250ms Material-style state transitions for selection, reveal, progress, and completion.
- No decorative page-load choreography, looping control animation, or movement that reorders content under the pointer.
- Respect reduced motion. Expensive media effects are lazy, bounded, paused off-screen, and disposable on unmount.
Quality bar
- Core tasks work at 320px, keyboard-only, reduced-motion, light, and dark themes.
- Status is never color-only.
- Tables share gutters, row heights, alignment, and action placement.
- Shared-system changes should delete route-specific CSS over time and keep the current JS/CSS budgets green.