Nine navigable frames covering the five flows of the new
developer portal: a standalone app at developers.fuzefront.com (not a
Module-Federation remote — it must be reachable pre-shell, at sign-in, on its own subdomain), structurally
modeled on fuzefront-website/frontend/ and sibling to it at repo root.
Plan of record: docs/planning/developers-portal.md §4.1 and §7.
Built in fuse-seam tokens only. Approving a flow approves its slice of the build inventory below, so the
implementation cannot quietly invent a different component or package layout.
home · route /What the portal is, quick links, the sign-in CTA — and, once signed in, the personalized recent-specs and sandbox-activity panels with their empty first-sign-in variants.
Hero, quick links (Playground shown locked, not hidden), the providesTo product directory,
and the sandbox-safety promise stated up front.
Quota strip, your recent specs, your sandbox activity — plus both panels' empty state for a developer's very first sign-in.
catalog · route /catalogBrowse product → service → spec, search and filter, with every state the harvest can produce.
TreeNav rail, search + product/tag/sandbox-mode filters, result cards carrying version, operation count,
harvest age and sandbox mode (mock vs sandbox).
Loading skeletons · empty (nothing harvested yet) · filtered-empty · error (harvest failed, degrading to a badged stale catalog) · 403 not-a-Developer.
spec-viewer · route /catalog/:product/:serviceOur aggregated overview wrapped around an OSS OpenAPI render (Stoplight Elements / Swagger UI — the plan's §3 spike decides which), themed with fuse-seam tokens.
Three panes — operations by tag, overview + selected operation (params, request/response schemas, examples, Try it), and copy-paste code samples.
Loading · spec-fetch failed (502) · invalid spec (validator output shown, Try-it disabled, source repo named) · 404 not found · stale-spec badge.
playground · route /playgroundThe "Try it" panel. This is where a wrong state is a security incident, so the fail-closed cases get a frame of their own.
Request builder (target selector, params, non-editable auth header, body), response panel, quota meter, and the permanent “this never touches production” notice.
Sending · request-invalid (blocked locally, no quota spent) · 429 quota exceeded · sandbox target unavailable with an explicit no-production-fallback statement · no-sandbox · 403 · proxy 5xx · and target 4xx rendered as data, not as a portal error.
my-access · route /accessWhat the developer holds, and — just as important — what the Developer role does
not grant.
/ · approved: false
devportal-frontend/src/pages/home/** · packages/devportal-ui/src/home/**
/catalog · approved: false
devportal-frontend/src/pages/catalog/** · packages/devportal-ui/src/catalog/**
/catalog/:product/:service · approved: false
devportal-frontend/src/pages/spec/** · packages/devportal-ui/src/spec-viewer/**
/playground · approved: false
devportal-frontend/src/pages/playground/** · packages/devportal-ui/src/playground/**
/access · approved: false
devportal-frontend/src/pages/access/** · packages/devportal-ui/src/access/**
@fuzefront/devportal-ui holds every component above; devportal-frontend/ is the thin
standalone Vite app (own Helm Deployment/Service/Ingress) that routes them.
@fuzefront/devportal-client is generated from the frozen
services/devportal-service/openapi.yaml. Both publish privately to GitHub Packages
(access: restricted).
frontend-engineer)These three are not in
@fuzefront/design-system today and are drawn here from tokens only, never one-offed into feature
code. Everything else composes existing primitives: ProgressMeter (→ QuotaMeter),
StatusCallout, EmptyState, Skeleton, StatusPill,
Badge, Button, SearchField, Select, Input,
CodeField (multiline → request body), DataTable, Tabs,
Breadcrumb, TopBar, Avatar.