Skip to content

fix(portal): white-label document branding + separate favicon + brand-color theming#39

Merged
keithfawcett merged 1 commit into
mainfrom
fix/white-label-document-branding
Jul 9, 2026
Merged

fix(portal): white-label document branding + separate favicon + brand-color theming#39
keithfawcett merged 1 commit into
mainfrom
fix/white-label-document-branding

Conversation

@keithfawcett

@keithfawcett keithfawcett commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

Three tightly-coupled branding changes (all plumbed through the same BrandDocument/branding-payload path):

1. Document branding (the customer bug). index.html hardcodes the tab title, og:title, and platform favicon — the one place branding never applied, and exactly what survives cache clears ('I changed the name and logo but it still appears'). BrandDocument now sets title, favicon, and og:title from the public branding payload.

2. Separate favicon. Logos are lockups; favicons are square marks. New Tenant.faviconUrl + /uploads/favicon + a second uploader in Settings → Brand info. Tab icon preference: favicon → logo → brand-colored monogram (never the platform mark). PNG/JPEG/WebP only — no SVG (script vector) or ICO.

3. Brand-color theming (spec §5.4). Tenant.brandColor existed but was never applied. All accent tokens in theme.ts are now CSS custom properties (teal fallback); BrandDocument derives + injects --op-accent* (hover shade, WCAG-luminance ink, alpha tints) so buttons, links, and active nav re-tint app-wide. All ${theme.accent}NN hex-concats swept to explicit accentA* tokens — string-concat tints break against var() values.

Also: usePublicBrand caches by /t/<slug>/ prefix (stale-branding-on-SPA-navigation fix) and exposes brandColor/faviconUrl.

Suites green: api 192/192, portal 12/12 (migration applied).

🤖 Generated with Claude Code

index.html ships hardcoded 'OpenPartner' + the platform favicon: the one
pair of brand marks no in-app setting, cache clear, or incognito window
can change. First real-world report came from a white-label admin who
'changed the name and logo but it still appears' — in the browser tab.

BrandDocument (mounted once in App) sets document.title, swaps the
favicon, and rewrites og:title from the public branding payload:
white-label → brand name + brand logo (or a brand-colored SVG monogram —
never the platform mark); branded non-white-label → 'Brand · OpenPartner';
platform surfaces keep the shipped defaults. usePublicBrand now keys its
cache by the /t/<slug>/ prefix so SPA navigation between platform and
tenant surfaces can't serve stale branding, and exposes brandColor.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@keithfawcett keithfawcett merged commit af780e2 into main Jul 9, 2026
9 checks passed
@keithfawcett keithfawcett deleted the fix/white-label-document-branding branch July 9, 2026 07:32
@keithfawcett keithfawcett changed the title fix(portal): brand the HTML document (tab title + favicon) for white-label fix(portal): white-label document branding + separate favicon + brand-color theming Jul 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant