feat(branding): per-app banner + per-brand default theme via brand.json #104
No reviewers
Labels
No labels
app:activities
app:chat
app:events
app:forum
app:libra
app:market
app:restaurant
app:tasks
app:wallet
app:webapp
bug
enhancement
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
aiolabs/webapp!104
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feat/brand-banner-and-default-theme"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Two independent brand-kit extensions (one commit each), both white-label-only — the
default/brand is unchanged, so existing deployments render identically.1. Optional per-app banner (
8f2c401)A brand may ship a wide banner (logo + wordmark in one image) that replaces the logo + app-name pair in a standalone's header. Events is the first consumer.
resolveAppBanner(app?)mirrors the existing@brand-app-logochain — per-standalone override (branding/<dep>/icons/<app>/banner.{svg,png}) → brand-global (branding/<dep>/banner.{svg,png}) — but is optional: returnsnullinstead of throwing, so brands without a banner keep logo + name.brandAppBannerAliasEntry()always registers@brand-app-banner(falling back to the logo) so the static import resolves; rendering is gated by theVITE_APP_BANNERbuild flag.EventsPage.vuerenders the banner when the flag is set, else logo + name.2. Per-brand default theme + palette (
d4d088f)Lets a deployer set the in-app color scheme a fresh visitor sees (e.g. cfaun → darkmatter light) without forking. Two optional
brand.jsonfields —theme(light|dark|system) andpalette(one ofPALETTES) — distinct fromthemeColor(PWA chrome only).vite-branding.tssurfaces them asVITE_BRAND_THEME/VITE_BRAND_PALETTEat module load, so the default applies app-wide (hub + every standalone) with no per-config wiring.localStoragechoice still wins and persists.catppuccin= bare-:rootinvariant (nowBASE_PALETTE) from the configurable default — without this a non-catppuccin brand default would strip thedata-themeattribute and silently render catppuccin.Notes
brand.jsonschema, banner resolution chain, and an outline-SVG-text-to-paths caveat (browsers lack designer fonts) are documented inbranding/README.md.branding/oyez/kit: events standalone renders the per-app "Oyez!" banner and loads darkmatter-light by default.🤖 Generated with Claude Code
A brand may ship a wide banner (logo + wordmark in one image) that replaces the brand-kit logo + app-name pair in a standalone's header. Events is the first consumer. Banners are optional and resolve at build time, mirroring the existing @brand-app-logo chain: - resolveAppBanner(app?) checks per-standalone override first (branding/<dep>/icons/<app>/banner.{svg,png}) then the brand's primary banner (branding/<dep>/banner.{svg,png}); returns null when absent instead of throwing, so brands without a banner keep logo + name. - brandAppBannerAliasEntry() always registers the @brand-app-banner alias (falling back to the logo) so the static import resolves; whether it renders is gated by the VITE_APP_BANNER build flag. - EventsPage renders the banner when the flag is set, else logo + name. Deployers override per-standalone without touching the component. SVG banners must have their text outlined to paths (browsers lack designer fonts) — documented in branding/README.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>