The system components — one anatomy, one home, rendered everywhere it applies.
THE listing — tree icons, search, per-column sort, selection with bulk verbs; folders interleave by name.
The strip on every content seat — tree toggle, the trail as a preference, verbs as arguments.
Where a thing lives, chosen from the tree — display titles, indent as nesting, never a typed path.
The UI section is the admin's vocabulary — the controls the skin has claimed, and the Bootstrap markup a call site writes. This section is one altitude up: the system components, the composed pieces the admin is actually built from. A listing, a toolbar, a location picker — each exists exactly once, as a named React component with a single home, and every surface that needs that anatomy renders the component rather than a copy of it.
A system component is born the moment the same anatomy appears on a second surface. Before that it is just a surface's own markup; after that, a copy is a fork waiting to drift. The content toolbar is the cautionary tale: it was hand-written on five surfaces, and hiding the breadcrumbs had to be threaded through every copy by hand — each pass missing one. Extraction is not tidying, it is how a preference (a hidden trail, a docked toolbar, a folder's display title) gets to mean the same thing everywhere.
The contract cuts both ways:
| Component | Claims | Home |
|---|---|---|
| Data table | Every listing — container contents, media, inventories, registries. | src/components/CmsDataTable.tsx |
| Content toolbar | The strip on every content seat — where you are, what you can do here. | src/components/CmsContentToolbar.tsx |
| Location select | Every "where does this live?" — a parent chosen from the tree, never typed. | src/components/CmsLocationSelect.tsx |
More join as they are codified. The bar for an entry here is the bar for the component itself: one anatomy, one home, and at least two surfaces rendering it.