feat(wardrobe): silo the catalog kinds by tab (gh-#393) - #473
Merged
Conversation
The Wardrobe grows from the font-packs-only listing into every kind installed off the Community Catalog: Personas | Themes | Fonts | Shows, one URL-driven tab each (?tab=), every tab present even when empty per Dean's ruling on the issue. Fonts keep their original WardrobeClient cards (faces, licence, uninstall); the other kinds render a shared read-only InstalledEntriesList — name, optional secondary line, and the kind's own provenance verb (Hired / Imported) — admitting only genuinely-imported rows (importedFrom != null), never authored ones. The tab strip itself is extracted to components/ui/tab-strip.tsx: CatalogTabs and BoothLogTabs were byte-identical modulo tab defs and now wrap the one shared TabStrip, so gh-#372's shelf tabs can reuse it too instead of minting a fourth copy.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #393.
🎯 What
The Wardrobe grows from the font-packs-only listing into everything installed off the Community Catalog, siloed by kind: Personas | Themes | Fonts | Shows — one URL-driven tab each (
?tab=, the CatalogTabs idiom), and every tab renders even when empty (per the issue: an empty kind gets its own empty state, never a hidden tab).🧵 How
components/ui/tab-strip.tsx— new sharedTabStrip:CatalogTabsandBoothLogTabswere byte-identical modulo tab defs (each even says so in its docstring); both now wrap the one implementation, and the Wardrobe (and feat: Tabs for different catalog kinds #372's shelf tabs next) reuse it instead of minting a fourth copy. The gh-Theme catalog detail: no installed-state or provenance (parity with the font-pack polish) #375Chipextraction precedent, applied to tabs.WardrobeClientcards, untouched (faces, licence line, uninstall).font-pack-wardrobe.spec.tsxpasses unchanged.InstalledEntriesList: name, optional secondary line (show tagline), and the kind's own provenance verb (Hired for personas per F90.7/T105, Imported for themes/shows). Only genuinely-imported rows (importedFrom != null) — the same two-provenance-class rule the catalog page's fetchers follow; authored personas/shows stay on their own pages. Deliberately action-free: retire/remove/delete flows live on each kind's own page.Station:Themechoices on the existingGET /api/settingsread (the documented no-/api/themesposture), which also serves the catalog-enabled signal for the empty-state CTA swap. A failed source shows a load error on its own tab only — the strip stays navigable.🧭 Choice worth flagging
Default tab (
/wardrobebare) is now Personas — shelf kind order. If muscle memory says fonts-first, it's a one-line flip inWardrobeTabs.🧪 Tests
New
wardrobe-tabs.spec.tsx(resolver, strip, listing, empty-state CTA swap). Full admin-ui: 100 suites / 971 tests ✅ ·tsc --noEmit✅ ·next build✅