/admin/themes) switches the public storefront between ready-made design packages under themes/<id>/.
Built-in packages
Prefer capabilities over hardcoding theme ids in custom code. Streamlix / StreamTube must not regress the Streamly path.
Apply vs Preview
Hard rule: live storefront look changes only when an operator clicks Apply (or edits Brand & Experience). Install/export never auto-apply.
Isolation rules
- One route tree — do not fork
/movies,/title, etc. per theme. - Skins via
templateEntry→StorefrontThemeProvider/getStorefrontSkin. - CSS chrome scoped with
html[data-storefront-theme="…"](Streamlix square/flat rules). - Page content width follows theme
pageShell.
Zip install / export (roadmap in UI)
APIs exist (/api/operator/themes/install, export, delete), but gallery upload/export/uninstall controls are hidden (SHOW_THEME_PACKAGE_IO_UI = false). Treat third-party zip IO as roadmap in the UI.
Uploaded zips contain theme.json + config.json only — they cannot ship new React templates; they skin a built-in templateEntry. Built-in ids cannot be overwritten on install. SEO keys are stripped on install/apply.
Deep dives: Themes & Skins, Brand Presets, Themes Package System.