One shell, many portals. The topbar, side panel, app grid, and login all reskin to the active
portal's name, logo, and accent — sourced from GET /api/v1/portal/context and
applied entirely through design-system token overrides (no raw hex). Approving these frames
approves the flows, components, and packages in the build inventory below, so implementation can't
quietly invent a different architecture. Built in the fuse-seam design system.
Topbar + side panel + app grid, reskinned by portal context. Shown for CorpABC and for the root FuzeFront default to prove it's the same shell.
Tenant-branded sign-in served on the portal host — logo, name, accent, custom copy — with auth served same-origin by the hidden platform.
Accent, logo, name applied to topbar, active nav, avatar, seam, app-icons.
Identical markup; only data-portal flips to root. Reskin is token-only.
Branded sign-in with custom copy, SSO, forgot-password; public context paints pre-auth.
Portal accent layered over both light and dark theme tokens — orthogonal layers.
Loading no-flash · error+retry · suspended · unknown-host fallback · cross-portal rejection.
Approving the frames approves this inventory. It mirrors manifest.json → build
exactly — flows, React components, the net-new design-system primitive, and the npm package.
portal-shell → PortalShell · /portal-login → PortalLoginFlow · /loginPortalBrandingProvider — boots & caches portal contextPortalThemeScope — applies accent as scoped token overridesBrandedTopBarBrandedSidePanelPortalAppGridPortalBrandLockup (logo + name, favicon swap)WhiteLabelLoginCardBrandingBoundary — loading / error / retryPortalUnavailableNotice — suspended / cross-portalBrandTokenScope — NET-NEW in @fuzefront/design-system: applies a
validated portal accent as scoped CSS-var overrides over base tokens, with WCAG-AA
contrast fallback + malformed-color rejection. Owned by frontend-engineer.Logo slot primitive (img/initials fallback, never a broken-image icon) —
add if not already present.@fuzefront/portal-branding-ui (new private UI package)@fuzefront/design-system (base tokens + primitives)ThemeContext (extended, not replaced)@fuzefront/portal-client (from contract-designer)GET /api/v1/portal/context → portal id, slug, branding, identity policy, auth entry (FF-EPIC-10-S2, public/pre-auth)@fuzefront/portal-client (authored by contract-designer — dependency, not built here)branding.name, branding.logo, branding.favicon, branding.accent, branding.tagline (portals.branding jsonb, FF-EPIC-09)403, unknown host → root fallback (UI) / 404 (API), cross-portal token → re-auth (FF-EPIC-10-S1/S3)fuzefront.platform.multi-tenant-portals (reused master switch, default OFF — FF-EPIC-09-S4)
No raw hex/spacing/type in any frame — all values are DS tokens (tokens.css is the
definition layer). The white-label seam is [data-portal] re-pointing
--accent-*; light/dark is [data-theme] re-pointing surfaces.