Build reusable Deck UI toolkit and migration harness#18731
Merged
davidfowl merged 145 commits intoJul 13, 2026
Conversation
e4343b3
into
sebastienros/dashboard-deck-redesign
2 checks passed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
This draft builds the migration foundation for a future React and ASP.NET Core Native AOT dashboard. It is intentionally not a full dashboard replacement or cutover.
The existing Blazor dashboard remains intact and continues to be the default experience. The React dashboard runs beside it against the same AppHost, which lets us compare behavior and visuals while each migration step is still small enough to test and review. Nothing in this PR removes the existing UI or requires the final backend architecture to be chosen now.
The PR delivers three independently useful pieces:
The migration can therefore proceed incrementally: implement a contract, run both dashboards, compare their behavior and screenshots, and keep the old dashboard available until the replacement has earned a cutover.
How this differs from a full rewrite
A full rewrite would replace the current UI and backend as one coordinated change, making regressions difficult to distinguish from intentional redesign. This PR establishes boundaries that let those concerns move separately:
This is still substantial implementation work, but the architectural product of the PR is the toolkit and migration harness, not permission to switch off the old dashboard.
Fluent React and the Deck toolkit
The toolkit uses
@fluentui/react-componentsand@fluentui/react-icons. Fluent React v9 provides accessible control behavior, focus management, interaction semantics, and the base icon set. Deck adds the Aspire-specific design language and dashboard contracts that Fluent does not provide by itself.The toolkit lives in
src/Aspire.Deck/ui/src/toolkitand is exported through oneindex.tsbarrel. Dashboard pages import toolkit APIs rather than individual implementation files.DeckProvidersrc/componentsandsrc/pagessrc/apiThe toolkit currently includes:
Page,PageHeader,PageHeading,PageTitle,PageSubtitle,PageActions,PageToolbar, andPageBody.DataTable, structured filters,SearchBox,Badge,StateDot,Highlighter,EmptyState, andSecretValue.Button,IconButton,CommandMenu, argument inputs,ConfirmDialog,Drawer, assistant panels, andNotificationStack.Select,Checkbox,Tabs,Accordion, segmented view controls, andDivider.DeckProvider, dark/light themes, responsive shell behavior, and Fluent System Icons.The standalone toolkit playground exercises these controls without dashboard data or transport code. Playwright reviews its accessibility tree as YAML, verifies keyboard and interaction behavior, and captures the visual states.
Side-by-side migration harness
The parity inventory is derived from visible legacy-dashboard behavior and Stress playground scenarios. It currently enumerates 157 dashboard features across the shell, resources, parameters, commands, console logs, structured logs, traces, metrics, authentication, terminals, responsive behavior, settings, notifications, assistant workflows, icons, and canvases.
Every inventory entry records its legacy route and scenario, React implementation status, and React black-box coverage. The ledger currently reports:
This does not mean the migration is ready to ship. It means the known functional surface is enumerated and guarded, so future backend and UX changes have an explicit compatibility baseline. Visual review remains intentional: Playwright records desktop/mobile screenshots, video, traces, and accessibility snapshots, while the old and new dashboards can run against the same AppHost.
User-facing usage
Run the deterministic dashboard and toolkit playground:
cd src/Aspire.Deck/ui npm run devhttp://localhost:1430/http://localhost:1430/?view=toolkitRun React against a live Stress dashboard:
Open
http://127.0.0.1:1430/?backend=http. The existing dashboard remains available at its normal URL.Screenshots / Recordings
Existing and React dashboards
Toolkit and icon contract
Details and responsive layout
Playwright retains screenshots, videos, traces, and HTML reports under the ignored
src/Aspire.Deck/ui/test-results*andplaywright-report*directories.Validation
npm run build: passed.Security considerations
The live frontend contracts use the existing dashboard authorization policies. Resource and telemetry responses can contain sensitive properties, environment variables, or user data, so requests are same-origin authenticated and use
Cache-Control: no-store. The Vite proxy is development-only and enabled explicitly withASPIRE_DASHBOARD_URL. Security review is still required before treating the HTTP transport or a future Native AOT backend as production-ready.Fixes # (issue)
Checklist
<remarks />and<code />elements on your triple slash comments?