Let the user arrange the UI — component registry, saved layouts, an editor #95

Open
opened 2026-08-18 20:37:44 +00:00 by yonlu · 0 comments
Owner

Let the user arrange the UI: a registry of components that can be placed into slots (main, sidebars, top and bottom bars), a saved layout, and an editor for it. The original framing was MusicBee-style customisation.

Salvaged from phase 4 of docs/dev/roadmap.md, which is deleted. This is one of three things in that document that were genuinely never built.

This is a vision item, not scheduled work, and the shape below is what the roadmap proposed rather than a design that has been argued.

What it proposed

A ComponentRegistry keyed by id, each entry declaring a default slot, the slots it is allowed in, and its own default config — with existing components (track-list, now-playing, …) registered into it. A layout configuration on top, and an editor UI to arrange it.

Each registered component would also declare a settings schema that appears in Settings, which is the part that ages best: it is the same idea as config-section per feature, one layer more general.

What has changed since it was written, and why it needs re-arguing

The shell is no longer one layout. There is a desktop shell, a phone shell below 600px where the sidebar is replaced by <bottom-nav>, and a <now-playing-view> that composes the real transport components rather than reimplementing them. A slot model has to account for a layout that already changes shape by viewport, and "the user put the transport in the left sidebar" interacts with that badly.

Several smaller pieces of the same intent have also shipped independently and reduce what is left: configurable track-list columns, #25 (choose which sidebar tabs are shown), #47 (prebuilt themes), #49 (album art scale), #48 (top bar rework). It is worth asking whether the remaining value is a full layout editor or a handful more targeted toggles — the targeted ones are what users have actually asked for.

The constraint anything here inherits

Primary views are cached, not unmountedindex.ts keeps them in the DOM and toggles a class, which is what preserves scrollTop. So a component moved between slots is not a fresh mount, and viewActivated / viewDeactivated (utils/view-lifecycle.ts) is the seam any relocation has to go through.

Done when

There is a decision on scope. Either a registry and editor exist, or this is closed in favour of the specific toggles that replace it.

Let the user arrange the UI: a registry of components that can be placed into slots (main, sidebars, top and bottom bars), a saved layout, and an editor for it. The original framing was MusicBee-style customisation. Salvaged from phase 4 of `docs/dev/roadmap.md`, which is deleted. This is one of three things in that document that were genuinely never built. **This is a vision item, not scheduled work**, and the shape below is what the roadmap proposed rather than a design that has been argued. ## What it proposed A `ComponentRegistry` keyed by id, each entry declaring a default slot, the slots it is allowed in, and its own default config — with existing components (`track-list`, `now-playing`, …) registered into it. A layout configuration on top, and an editor UI to arrange it. Each registered component would also declare a settings schema that appears in Settings, which is the part that ages best: it is the same idea as `config-section` per feature, one layer more general. ## What has changed since it was written, and why it needs re-arguing The shell is no longer one layout. There is a desktop shell, a **phone shell below 600px** where the sidebar is replaced by `<bottom-nav>`, and a `<now-playing-view>` that composes the real transport components rather than reimplementing them. A slot model has to account for a layout that already changes shape by viewport, and "the user put the transport in the left sidebar" interacts with that badly. Several smaller pieces of the same intent have also shipped independently and reduce what is left: configurable track-list columns, #25 (choose which sidebar tabs are shown), #47 (prebuilt themes), #49 (album art scale), #48 (top bar rework). It is worth asking whether the remaining value is a full layout editor or a handful more targeted toggles — the targeted ones are what users have actually asked for. ## The constraint anything here inherits Primary views are **cached, not unmounted** — `index.ts` keeps them in the DOM and toggles a class, which is what preserves `scrollTop`. So a component moved between slots is not a fresh mount, and `viewActivated` / `viewDeactivated` (`utils/view-lifecycle.ts`) is the seam any relocation has to go through. ## Done when There is a decision on scope. Either a registry and editor exist, or this is closed in favour of the specific toggles that replace it.
yonlu added the Platform/DesktopKind/Feature
Priority
Low
4
Area/DesignArea/Shell-Nav
labels 2026-08-18 20:37:44 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: yonlu/yellowjacket#95