Skip to content

Improve responsive dashboard overviews and hide empty resource panels - #21691

Merged
David Pine (IEvangelist) merged 6 commits into
mainfrom
ievangelist-hide-empty-resource-panels
Nov 4, 2026
Merged

David Pine (IEvangelist) merged 6 commits into
mainfrom
ievangelist-hide-empty-resource-panels

Conversation

@IEvangelist

@IEvangelist David Pine (IEvangelist) commented Nov 2, 2026 •

Copy link
Copy Markdown
Member

Description

Resource overviews currently spend space on empty panels and fixed-height cards, while narrow screens crowd alerts and navigation controls. This change makes the dashboard more useful across mobile, tablet, and desktop.

  • Add a localized Panels icon toggle: Hide empty panels is selected by default; Show all panels restores every panel. Visible cards repack without unmounting their content, preserving streaming updates, loading states, filters, pause controls, and terminal state.
  • Show all resource properties by default, with the core-properties filter still available explicitly.
  • Size overview rows to their tallest content-driven card rather than a fixed height; single-column cards shrink to their content. Scrollable content remains bounded and terminal panels retain a usable minimum viewport.
  • Compact responsive alerts, the mobile resource picker, and navigation; keep resource status visible in a footer outside the scrolling content and let application titles use the available width.
  • Use the same icon-toggle UX for Cards / Home / Graph on all screen sizes. Condense labels when needed without hiding the selector or unresolved-parameter notice.

The original feature and subsequent user-approved responsive improvements remain separate commits within this PR. No new dependencies.

Fixes # (issue)

User-facing usage

Open an individual resource's Overview and use Panels to switch between hiding empty panels and showing all panels. In the Properties card, all properties are shown initially; choose Show core properties to narrow the list. On All resources, use the Cards / Home / Graph icon buttons, including on mobile and when parameters need values.

Screenshots / Recordings

Before / after: responsive alerts and navigation contains four matched mobile/tablet comparisons, with the same two alerts, routes, and viewport sizes. Before is the isolated feature-plus-Properties build 63e14708c4, before responsive UX commits (not unmodified main); after is the combined build 6c62b9cc4a. Live sample state/timestamps vary.

Mobile, 390x844 Before responsive corrections After responsive corrections
Resource Overview: alerts, title, picker/navigation, content-sized cards and status footer Mobile Overview before Mobile Overview after
All resources: navigation, missing-parameter notice and layout selector Mobile All resources before Mobile All resources after

Full gallery: 22 combined-build screenshots covers sparse and populated resources in both panel modes, Cards / Home / Graph with an unresolved parameter, responsive alerts/navigation/status, and the Show all properties default. Captured from 6c62b9cc4a, including all approved responsive UX improvements. Images are GitHub attachments, not committed files. The subsequent review fix eb0de0e811 corrects docked-terminal packing and child-component scrolling limits.

Viewport Hide empty panels (default) Show all panels
Mobile, 390x844 Mobile Hide empty Mobile Show all
Tablet, 768x1024 Tablet Hide empty Tablet Show all
Desktop, 1440x900 Desktop Hide empty Desktop Show all
Properties: all five entries shown by default

Mobile resource showing all five properties by default

Validation

Focused component commands passed:

dotnet test --project tests\Aspire.Dashboard.Components.Tests\Aspire.Dashboard.Components.Tests.csproj --no-launch-profile -- --filter-class '*.ResourcesLayoutTests' --filter-class '*.ResourceOverviewEmptyPanelsTests' --filter-class '*.ResourceOverviewTerminalTests' --filter-class '*.ResourceOverviewPersistenceTests' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'
# Passed: 107 tests, before subsequent styling and Properties-default follow-ups.

dotnet test --project tests\Aspire.Dashboard.Components.Tests\Aspire.Dashboard.Components.Tests.csproj --no-launch-profile -- --filter-class '*.DashboardMessageBarTests' --filter-class '*.InteractionsProviderTests' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'
# Passed: 26 tests, before the final narrow-screen flex-shrink correction.

dotnet test --project tests\Aspire.Dashboard.Components.Tests\Aspire.Dashboard.Components.Tests.csproj --no-launch-profile -- --filter-class '*.ApplicationSummaryTests' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'
# Passed: 12 tests.

dotnet test --project tests\Aspire.Dashboard.Components.Tests\Aspire.Dashboard.Components.Tests.csproj --no-launch-profile -- --filter-class '*.ResourceOverviewEmptyPanelsTests' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'
# Passed: 15 tests, including the Properties default, before review fixes.

dotnet test --project tests\Aspire.Dashboard.Components.Tests\Aspire.Dashboard.Components.Tests.csproj --no-launch-profile -- --filter-class '*.ResourceOverviewEmptyPanelsTests' --filter-class '*.ResourceOverviewTerminalTests' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'
# Passed: 19 tests with docked-terminal packing regression coverage.

dotnet test --project tests\Aspire.Dashboard.Components.Tests\Aspire.Dashboard.Components.Tests.csproj --no-launch-profile -- --filter-method '*.Terminal_DockTransitionsPackOnlyRenderedOverviewCards' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'
# Passed: 2 cases after strengthening restored-terminal span assertions.

The branch's dashboard rebuilt successfully with 0 warnings/errors and reached healthy state in its isolated CustomResources AppHost. Combined-build Edge/Playwright checks passed 20 resource/panel/viewport combinations and 12 summary-layout/viewport combinations, including 320px and 1024px widths. Checked keyboard interaction, selected states/tooltips, mounted content, row sizing, responsive header/footer placement, alert-action containment, drawer controls, persisted layout selection, no horizontal overflow, and no browser errors. The Properties default/filter transition was also verified against live data (5 properties -> explicit core filter 0 -> restore 5), preserving controls across panel modes.

After the review fixes, expanded real Properties (13 rows, 416px content) and Environment (25 rows, 800px content) were verified at 390px, 768px and 1440px: each child grid remains capped at 340px and scrolls internally. The existing preview was resumed and reached healthy state.

Live terminal input was not exercised in this sample; existing terminal component tests passed. git diff --check passed.

Checklist

  • Is this feature complete?
    • Yes. Ready to ship.
    • No. Follow-up changes expected.
  • Are you including unit tests for the changes and scenario tests if relevant?
    • Yes
    • No
  • Did you add public API?
    • Yes
      • If yes, did you have an API Review for it?
        • Yes
        • No
      • Did you add <remarks /> and <code /> elements on your triple slash comments?
        • Yes
        • No
    • No
  • Does the change make any security assumptions or guarantees?
    • Yes
      • If yes, have you done a threat model and had a security review?
        • Yes
        • No
    • No

Reuse the resource header action slot and card packing, retain loading and filtered panels, and preserve mounted component state.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Keep dismiss controls at the upper edge, avoid dismiss-only action rows, and wrap real actions only when needed.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Keep resource status in a mobile footer, compact the picker and header, and size grid rows to their tallest content while preserving scroll and terminal viewports.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Keep Cards, Home and Graph available as icon choices across viewports and condense labels around unresolved parameter notices.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Populate the Properties card by default while preserving the explicit core-only filter and its controls in hide-empty mode.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 21691

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 21691"

@aspire-repo-bot
aspire-repo-bot Bot requested a balanced review from Copilot November 2, 2026 16:59
@IEvangelist

Copy link
Copy Markdown
Member Author

Responsive dashboard screenshot gallery

Captured from this PR's final combined build at 6c62b9cc4a. These include all approved responsive UX changes, not the separate feature-only preview. Synthetic CustomResources sample data; screenshots contain no authentication tokens.

Mobile - 390x844

Resource Hide empty panels (default) Show all panels
Sparse Mobile sparse resource, Hide empty Mobile sparse resource, Show all
Populated Mobile populated resource, Hide empty Mobile populated resource, Show all
Cards Home Graph
Mobile Cards layout Mobile Home layout Mobile Graph layout

Tablet - 768x1024

Resource Hide empty panels (default) Show all panels
Sparse Tablet sparse resource, Hide empty Tablet sparse resource, Show all
Populated Tablet populated resource, Hide empty Tablet populated resource, Show all
Cards Home Graph
Tablet Cards layout Tablet Home layout Tablet Graph layout

Desktop - 1440x900

Resource Hide empty panels (default) Show all panels
Sparse Desktop sparse resource, Hide empty Desktop sparse resource, Show all
Populated Desktop populated resource, Hide empty Desktop populated resource, Show all
Cards Home Graph
Desktop Cards layout Desktop Home layout Desktop Graph layout

Properties default

Hide empty remains selected while all five properties are shown by default. The explicit core-properties filter remains available.

Mobile resource showing all five properties by default

@github-actions

This comment has been minimized.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

CSS isolation prevents child panels from respecting the height and scrolling limits, while docked terminals remain in panel packing and leave unused row space.

2 open issues
1 file not reviewed
  • src/Aspire.Dashboard/Resources/Resources.Designer.cs: Generated file
What changed in this PR

This PR makes Aspire Dashboard resource overviews more compact and responsive while preserving mounted panel content and live updates.

Changes:

  • Hide empty panels by default, add a Panels toggle, and initially show all resource properties.
  • Replace fixed card heights with content-driven sizing and improve mobile headers, alerts, navigation, and status footers.
  • Use consistent Cards / Home / Graph toggles across viewports, with localization entries and component tests.
File Description
tests/​Aspire.Dashboard.Components.Tests/​Shared/​ResourceSetupHelpers.cs Allow service customization during test setup.
tests/​Aspire.Dashboard.Components.Tests/​Pages/​ResourceOverviewEmptyPanelsTests.cs Cover panel visibility, updates, filters, and state preservation.
tests/​Aspire.Dashboard.Components.Tests/​Layout/​ResourcesLayoutTests.cs Verify footer status placement and updates.
tests/​Aspire.Dashboard.Components.Tests/​Controls/​ApplicationSummaryTests.cs Cover layout toggles across viewports and missing-parameter states.
src/​Aspire.Dashboard/​Resources/​xlf/​Resources.zh-Hant.xlf Add panel-control localization entries.
src/​Aspire.Dashboard/​Resources/​xlf/​Resources.zh-Hans.xlf Add panel-control localization entries.
src/​Aspire.Dashboard/​Resources/​xlf/​Resources.tr.xlf Add panel-control localization entries.
src/​Aspire.Dashboard/​Resources/​xlf/​Resources.ru.xlf Add panel-control localization entries.
src/​Aspire.Dashboard/​Resources/​xlf/​Resources.pt-BR.xlf Add panel-control localization entries.
src/​Aspire.Dashboard/​Resources/​xlf/​Resources.pl.xlf Add panel-control localization entries.
src/​Aspire.Dashboard/​Resources/​xlf/​Resources.ko.xlf Add panel-control localization entries.
src/​Aspire.Dashboard/​Resources/​xlf/​Resources.ja.xlf Add panel-control localization entries.
src/​Aspire.Dashboard/​Resources/​xlf/​Resources.it.xlf Add panel-control localization entries.
src/​Aspire.Dashboard/​Resources/​xlf/​Resources.fr.xlf Add panel-control localization entries.
src/​Aspire.Dashboard/​Resources/​xlf/​Resources.es.xlf Add panel-control localization entries.
src/​Aspire.Dashboard/​Resources/​xlf/​Resources.de.xlf Add panel-control localization entries.
src/​Aspire.Dashboard/​Resources/​xlf/​Resources.cs.xlf Add panel-control localization entries.
src/​Aspire.Dashboard/​Resources/​Resources.resx Define Panels toggle labels.
src/​Aspire.Dashboard/​Resources/​Resources.Designer.cs Expose the new resource strings.
src/​Aspire.Dashboard/​Components/​Pages/​ResourceOverview.razor.css Add hidden-panel styling and content-driven card sizing.
src/​Aspire.Dashboard/​Components/​Pages/​ResourceOverview.razor.cs Manage panel choices and update sizing comments.
src/​Aspire.Dashboard/​Components/​Pages/​ResourceOverview.razor Add the panel selector and visibility-aware packing.
src/​Aspire.Dashboard/​Components/​Pages/​ResourceOverview.Details.cs Show all properties by default.
src/​Aspire.Dashboard/​Components/​Layout/​ResourcesLayout.razor.css Adapt headers, navigation, and footers for narrow screens.
src/​Aspire.Dashboard/​Components/​Layout/​ResourcesLayout.razor Reposition header controls and expose mobile status footers.
src/​Aspire.Dashboard/​Components/​Layout/​MainLayout.razor.css Allow wider application titles on mobile.
src/​Aspire.Dashboard/​Components/​CustomIcons/​AspireIcons.cs Add the Hide empty panels icon.
src/​Aspire.Dashboard/​Components/​Controls/​DashboardMessageBar.razor.css Compact responsive alerts and position dismiss controls.
src/​Aspire.Dashboard/​Components/​Controls/​ApplicationSummary.razor.css Condense layout labels when space is limited.
src/​Aspire.Dashboard/​Components/​Controls/​ApplicationSummary.razor.cs Remove obsolete mobile-menu helpers.
src/​Aspire.Dashboard/​Components/​Controls/​ApplicationSummary.razor Use layout icon toggles on every viewport.

Review effort: Balanced

@IEvangelist

Copy link
Copy Markdown
Member Author

Before / after: responsive alerts and navigation

These are real screenshots from two separately running builds, captured at matching viewport sizes and routes with the same unsecured-endpoint and feedback banners. No CSS replacement or simulated UI.

Before: 63e14708c4, the isolated empty-panels feature plus Show all properties default, before this PR's responsive UX commits. This is not a screenshot of unmodified main.

After: 6c62b9cc4a, the final combined PR build.

Resource state names, clock output, timestamps, and elapsed durations vary because the sample is live. Compare layout rather than those changing values.

Mobile - 390x844

The resource Overview comparison shows alerts with inline content and top-right dismiss controls, the full application title using available width, the compact resource picker/navigation, content-sized cards, and status moved to a persistent footer.

Before responsive corrections After responsive corrections
Mobile resource Overview before responsive corrections Mobile resource Overview after responsive corrections

The All resources comparison shows the Cards / Home / Graph dropdown replaced by the same icon-toggle pattern as Panels, with the unresolved-parameter notice retained.

Before responsive corrections After responsive corrections
Mobile All resources before responsive corrections Mobile All resources after responsive corrections

Tablet - 768x1024

Alert actions share the content row where space permits. The smaller picker/header and content-driven cards leave more room for useful resource information.

Before responsive corrections After responsive corrections
Tablet resource Overview before responsive corrections Tablet resource Overview after responsive corrections
Tablet All resources before responsive corrections Tablet All resources after responsive corrections

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

Tests selector

14 / 100 PR test projects · 2 PR jobs, from 31 changed files.

Selected PR test projects (14 / 100)

Aspire.Dashboard.Components.Tests, Aspire.Dashboard.Tests, Aspire.Hosting.Azure.Kubernetes.Tests, Aspire.Hosting.Azure.Tests, Aspire.Hosting.Blazor.Tests, Aspire.Hosting.Dotnet.Tests, Aspire.Hosting.DotnetTool.Tests, Aspire.Hosting.JavaScript.Tests, Aspire.Hosting.Radius.Tests, Aspire.Hosting.Testing.Tests, Aspire.Hosting.Tests, Aspire.Playground.Tests, Aspire.Templates.Tests, Infrastructure.Tests

Selected PR jobs (2)

extension-e2e, native-dashboard-validation


How these were chosen — grouped by what changed

⚠️ 11 of the 14 selected test projects come from a single change — src/Aspire.Dashboard/Components/Controls/ApplicationSummary.razor.

🔧 src/Aspire.Dashboard/Components/Controls/ApplicationSummary.razor (changed source)
→ 11 via the project graph: Aspire.Dashboard.Tests, Aspire.Hosting.Azure.Kubernetes.Tests (3 hops), Aspire.Hosting.Azure.Tests (2 hops), Aspire.Hosting.Blazor.Tests (2 hops), Aspire.Hosting.Dotnet.Tests (2 hops), Aspire.Hosting.DotnetTool.Tests (2 hops), Aspire.Hosting.JavaScript.Tests, Aspire.Hosting.Radius.Tests (2 hops), Aspire.Hosting.Testing.Tests, Aspire.Hosting.Tests, Aspire.Playground.Tests (2 hops)

📦 affected project Aspire.Dashboard
→ 1 test: Aspire.Templates.Tests

🔧 src/Aspire.Dashboard/Resources/Resources.resx (changed source)
→ 1 directly: Infrastructure.Tests

🧪 tests/Aspire.Dashboard.Components.Tests/Controls/ApplicationSummaryTests.cs (changed test)
→ 1 directly: Aspire.Dashboard.Components.Tests

🧪 tests/Aspire.Dashboard.Components.Tests/Layout/ResourcesLayoutTests.cs (changed test)
→ 1 directly: Aspire.Dashboard.Components.Tests

🧪 tests/Aspire.Dashboard.Components.Tests/Pages/ResourceOverviewEmptyPanelsTests.cs (changed test)
→ 1 directly: Aspire.Dashboard.Components.Tests

🧪 tests/Aspire.Dashboard.Components.Tests/Shared/ResourceSetupHelpers.cs (changed test)
→ 1 directly: Aspire.Dashboard.Components.Tests

Job reasons

Job Triggered by
extension-e2e • src/Aspire.Dashboard/Components/Controls/ApplicationSummary.razor, src/Aspire.Dashboard/Components/Controls/ApplicationSummary.razor.cs, src/Aspire.Dashboard/Components/Controls/ApplicationSummary.razor.css, src/Aspire.Dashboard/Components/Controls/DashboardMessageBar.razor.css, src/Aspire.Dashboard/Components/CustomIcons/AspireIcons.cs, src/Aspire.Dashboard/Components/Layout/MainLayout.razor.css, src/Aspire.Dashboard/Components/Layout/ResourcesLayout.razor, src/Aspire.Dashboard/Components/Layout/ResourcesLayout.razor.css, src/Aspire.Dashboard/Components/Pages/ResourceOverview.Details.cs, src/Aspire.Dashboard/Components/Pages/ResourceOverview.razor, src/Aspire.Dashboard/Components/Pages/ResourceOverview.razor.cs, src/Aspire.Dashboard/Components/Pages/ResourceOverview.razor.css, src/Aspire.Dashboard/Resources/Resources.Designer.cs, src/Aspire.Dashboard/Resources/Resources.resx, src/Aspire.Dashboard/Resources/xlf/Resources.cs.xlf, src/Aspire.Dashboard/Resources/xlf/Resources.de.xlf, src/Aspire.Dashboard/Resources/xlf/Resources.es.xlf, src/Aspire.Dashboard/Resources/xlf/Resources.fr.xlf, src/Aspire.Dashboard/Resources/xlf/Resources.it.xlf, src/Aspire.Dashboard/Resources/xlf/Resources.ja.xlf, src/Aspire.Dashboard/Resources/xlf/Resources.ko.xlf, src/Aspire.Dashboard/Resources/xlf/Resources.pl.xlf, src/Aspire.Dashboard/Resources/xlf/Resources.pt-BR.xlf, src/Aspire.Dashboard/Resources/xlf/Resources.ru.xlf, src/Aspire.Dashboard/Resources/xlf/Resources.tr.xlf, src/Aspire.Dashboard/Resources/xlf/Resources.zh-Hans.xlf, src/Aspire.Dashboard/Resources/xlf/Resources.zh-Hant.xlf
• affected project Aspire.Dashboard
native-dashboard-validation affected project Aspire.Dashboard

Selection computed for commit eb0de0e.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

No active review issues are reported for the resource overview changes.

No open issues 🎉

2 resolved since last review
1 file not reviewed
  • src/Aspire.Dashboard/Resources/Resources.Designer.cs: Generated file

Review effort: Balanced

@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

Retrying the failed CI jobs for this pull request from the CI run attempt. The rerun is being tracked in the rerun attempt.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM — no high-confidence issues found in the reviewed diff. The docked-terminal packing and child-component scrolling fixes address the earlier findings.

@IEvangelist
David Pine (IEvangelist) merged commit acfb228 into main Nov 4, 2026
315 of 318 checks passed
@microsoft-github-policy-service microsoft-github-policy-service Bot added this to the 17.0 milestone Nov 4, 2026
@aspire-repo-bot

Copy link
Copy Markdown
Contributor

Pull request created: #2044

Generated by PR Documentation Check · copilot · auto · 20.1 AIC · ⌖ 1.17 AIC · ⊞ 7.5K

@aspire-repo-bot

Copy link
Copy Markdown
Contributor

📝 Documentation has been drafted in microsoft/aspire.dev#2044 targeting release/17.0.

Updated dashboard/explore.mdx to document the Panels toggle (Hide empty panels / Show all panels), all-properties default with Show core properties, and Cards/Home/Graph icon selector. Signals: dashboard_user_facing_page_changed (ResourceOverview.razor), pr_body_has_user_facing_section, pr_body_has_cli_flag_mention.

Note

This draft PR needs human review before merging.

Maddy Montaquila (maddymontaquila) pushed a commit that referenced this pull request Nov 4, 2026
## Description

The resource sidebar already provides resource browsing and actions.
Remove the duplicate **Cards** overview layout for all resources,
resource groups and multi-resource selections, leaving **Summary** and
**Graph**.

Relates to #21708 (UX-24).

### User-facing usage

- Open Overview with all resources selected to see Summary. Select a
group or multiple resources to scope the existing health, activity,
insights, recent errors and failed traces widgets to that selection.
- Choose Summary or Graph using the existing responsive icon controls,
or in Settings. Summary uses the DataBarVertical icon, distinct from the
unchanged Overview and Metrics navigation icons.
- Open an individual resource to retain its existing detail panels.
Parameter editors and the missing-parameter entry point remain
available.
- Existing saved `Cards` and older `Resources` choices are explicitly
rewritten to `Summary`. Missing or invalid choices fall back to Summary;
existing Summary/Graph choices and numeric values remain compatible.

### Scope and integration

Based on freshly fetched upstream main
`e626df45aea0be8ce47fe190f7cfbba350503489`, including merged #21691. Its
all-screen responsive icon controls and single-resource panel
improvements are preserved.

The only default/preference overlap included is inseparable from
removing Cards: first-use/default resolution, removed-choice
compatibility and the disabled-Graph display fallback must point to a
remaining layout. This does **not** include UX06's separate
saved-default/active-layout policy, session-storage/reload logic,
Settings label changes or a changed Graph restoration policy. Settings
retains its existing immediate behavior, and a disabled saved Graph
choice remains stored as before.

Remove the Cards renderer and directly orphaned actions, styles,
resources and unreachable table renderer. Preserve Summary widgets,
single-resource Details, resource list density, sidebar
search/selection, graph controls and parameter workflows. No widget
customization or unrelated redesign.

### Screenshots / Recordings

Actual Chromium captures from this branch's build with synthetic
resources and telemetry. All 36 captures (six states at each size/theme)
were inspected; the representative images below show the retained
responsive controls, scoped Summary, Details and Graph. No horizontal
overflow in the overview header/control checks; mobile/tablet content
remains vertically scrollable. Console and page errors: **0** across the
six capture contexts.

| Viewport | Light Summary | Dark Summary |
| --- | --- | --- |
| 390 x 844 | ![Mobile light
Summary](https://github.com/user-attachments/assets/e9455c20-e131-41bd-aac0-7a8a50d5bfaf)
| ![Mobile dark
Summary](https://github.com/user-attachments/assets/a255ccab-ab3b-4ea7-a1e8-00f77c2ae194)
|
| 768 x 1024 | ![Tablet light
Summary](https://github.com/user-attachments/assets/980c744f-e8c5-43fe-b761-27dbb20c77ef)
| ![Tablet dark
Summary](https://github.com/user-attachments/assets/2dfcb066-b500-4074-b069-0965373522f6)
|
| 1440 x 900 | ![Desktop light
Summary](https://github.com/user-attachments/assets/23d16560-a8a0-44f3-89f0-2bd5b9df94de)
| ![Desktop dark
Summary](https://github.com/user-attachments/assets/c2c5fce7-7526-4add-aa4d-900fd64772ea)
|

<details>
<summary>Settings: Summary and Graph only, at all three sizes in both
themes</summary>

| Viewport | Light Settings | Dark Settings |
| --- | --- | --- |
| 390 x 844 | ![Mobile light
Settings](https://github.com/user-attachments/assets/6a89a76f-eca2-4bac-9677-a5a8f0f81a37)
| ![Mobile dark
Settings](https://github.com/user-attachments/assets/ce49ca43-ea06-4c21-917d-08f1bb0d0708)
|
| 768 x 1024 | ![Tablet light
Settings](https://github.com/user-attachments/assets/cde96148-8710-4fd1-a328-fd482b1a339b)
| ![Tablet dark
Settings](https://github.com/user-attachments/assets/bd6394e3-2fb9-47e7-84d5-ce42d0c4f1d2)
|
| 1440 x 900 | ![Desktop light
Settings](https://github.com/user-attachments/assets/ae40ac1f-0cff-4eba-ae95-9b76631f27c0)
| ![Desktop dark
Settings](https://github.com/user-attachments/assets/7802e431-1538-42ac-a62c-424bb0c9d0a1)
|

</details>

<details>
<summary>Multi-selection, resource group, preserved single-resource
Details and Graph</summary>

| Scenario | Capture |
| --- | --- |
| Two selected resources: two logs/traces and only their
errors/endpoints | ![Selected
Summary](https://github.com/user-attachments/assets/e017c8a5-94aa-4c76-bbbb-35e4a0207cf1)
|
| Project group: the same scoped Summary with group selection retained |
![Group
Summary](https://github.com/user-attachments/assets/6155665a-ac6b-4af4-a1b9-efc2b532df67)
|
| Single-resource detail panels remain, including in mobile dark mode |
![Single resource
Details](https://github.com/user-attachments/assets/8b9f87cb-5a2d-445b-879d-cf81551d0c39)
|
| Graph still shows the selected resources | ![Selected
Graph](https://github.com/user-attachments/assets/21671523-7e5d-4730-adad-c8dbca581bcc)
|

</details>

### Validation

Windows validation; quarantined tests excluded. Only the explicitly
selected Playwright outerloop scenarios were opted into.

| Check | Result |
| --- | --- |
| Fresh-main ApplicationSummary/Settings component baseline | 18 passed
|
| Final focused component union: summary, preferences, Settings,
single-resource panels, layout and actions | **166 passed** |
| Initial combined Playwright run | 7 passed |
| Final Playwright run, after adding Graph deep-link and stronger
group-transition checks | **All 6 new viewport/theme cases passed**; 1
existing tab-navigation case failed |
| Pristine-main control of the existing failing navigation case | **Same
failure reproduced** on unmodified `e626df45`: Overview click remained
on `/consolelogs` instead of `/resources` |
| Dashboard build | Passed, 0 errors |
| UpdateXlf | Passed, 26 generated locale files updated |
| Scoped formatting and `git diff --check` | Passed |
| Synthetic browser checks | Cards migration/reload; selected telemetry
3 -> 2; sidebar search independent of telemetry scope; group selection;
Details/Back; Summary/Graph keyboard activation and accessible names;
Graph deep link; disabled-Graph Summary fallback; missing-parameter
batch entry and inline editor |
| Temporary host/browser cleanup | Closed; host exited 0 and its
listener was gone |

**Existing limitations, not hidden by reruns:** the pre-existing
`AllResourcesRow_ClearsSelectionAndListsResourcesInOverview` navigation
timing failure also reproduces without this change; no unrelated
navigation fix is included. The pinned SDK package emits baseline
warning NU1903 for `Microsoft.DotNet.ILCompiler` 11.0.0-rc.2.26504.105,
identically on pristine main and this branch. SDK/dependencies are
unchanged. Cross-platform CI remains to run.

<details>
<summary>Exact validation commands and results</summary>

Restore: passed.

```powershell
.\restore.cmd
```

Fresh-main component baseline: 18 passed.

```powershell
dotnet test --project tests\Aspire.Dashboard.Components.Tests\Aspire.Dashboard.Components.Tests.csproj --no-launch-profile '-p:ArtifactsDir=D:\GitHub\copilot-worktrees\aspire\ievangelist-super-garbanzo\artifacts\cards-pr\' -- --filter-class '*.ApplicationSummaryTests' --filter-class '*.SettingsDialogTests' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'
```

Final component union: 166 passed.

```powershell
dotnet test --project tests\Aspire.Dashboard.Components.Tests\Aspire.Dashboard.Components.Tests.csproj --no-launch-profile '-p:ArtifactsDir=D:\GitHub\copilot-worktrees\aspire\ievangelist-super-garbanzo\artifacts\cards-pr\' -- --filter-class '*.ApplicationSummaryTests' --filter-class '*.SettingsDialogTests' --filter-class '*.DashboardViewPreferencesTests' --filter-class '*.ResourceOverviewEmptyPanelsTests' --filter-class '*.ResourceOverviewTests' --filter-class '*.ResourcesLayoutTests' --filter-class '*.ResourceActionsTests' --filter-not-trait 'quarantined=true' --filter-not-trait 'outerloop=true'
```

Playwright: initial 7/7 passed; final six new cases passed and one
existing navigation case failed as described above.

```powershell
$env:PLAYWRIGHT_BROWSERS_PATH='D:\GitHub\copilot-worktrees\aspire\ievangelist-super-garbanzo\artifacts\cards-pr\bin\playwright-deps'
dotnet test --project tests\Aspire.Dashboard.Playwright.Tests\Aspire.Dashboard.Playwright.Tests.csproj --no-launch-profile '-p:ArtifactsDir=D:\GitHub\copilot-worktrees\aspire\ievangelist-super-garbanzo\artifacts\cards-pr\' -- --filter-method '*.RemovedCards_UsesSummaryAndPreservesScopeDetailsAndKeyboard' --filter-method '*.AllResourcesRow_ClearsSelectionAndListsResourcesInOverview' --filter-not-trait 'quarantined=true'
```

Pristine-main control, with the focused changes temporarily stashed:
failed with the identical `/consolelogs` to `/resources` assertion.

```powershell
dotnet test --project tests\Aspire.Dashboard.Playwright.Tests\Aspire.Dashboard.Playwright.Tests.csproj --no-launch-profile '-p:ArtifactsDir=D:\GitHub\copilot-worktrees\aspire\ievangelist-super-garbanzo\artifacts\cards-pr-baseline-browser\' -- --filter-method '*.AllResourcesRow_ClearsSelectionAndListsResourcesInOverview' --filter-not-trait 'quarantined=true'
```

Build and localization: both passed.

```powershell
dotnet build src\Aspire.Dashboard\Aspire.Dashboard.csproj --no-restore '-p:ArtifactsDir=D:\GitHub\copilot-worktrees\aspire\ievangelist-super-garbanzo\artifacts\cards-pr\'
dotnet build src\Aspire.Dashboard\Aspire.Dashboard.csproj /t:UpdateXlf --no-restore '-p:ArtifactsDir=D:\GitHub\copilot-worktrees\aspire\ievangelist-super-garbanzo\artifacts\cards-pr\'
```

Formatting on the changed files, run before committing: all passed. An
initial charset finding in ApplicationSummary.razor.cs was corrected
with the formatter.

```powershell
$env:ArtifactsDir='D:\GitHub\copilot-worktrees\aspire\ievangelist-super-garbanzo\artifacts\cards-pr-format\'
$appFiles=@(git diff --name-only -- src | Where-Object { $_ -match '\.(cs|razor)$' })
dotnet format whitespace src\Aspire.Dashboard\Aspire.Dashboard.csproj --no-restore --verify-no-changes --include $appFiles
$testFiles=@(git diff --name-only -- tests\Aspire.Dashboard.Components.Tests | Where-Object { $_ -match '\.cs$' }) + 'tests\Aspire.Dashboard.Components.Tests\Model\DashboardViewPreferencesTests.cs'
dotnet format whitespace tests\Aspire.Dashboard.Components.Tests\Aspire.Dashboard.Components.Tests.csproj --no-restore --verify-no-changes --include $testFiles
dotnet format whitespace tests\Aspire.Dashboard.Playwright.Tests\Aspire.Dashboard.Playwright.Tests.csproj --no-restore --verify-no-changes --include tests\Aspire.Dashboard.Playwright.Tests\Integration\Playwright\OverviewLayoutTests.cs tests\Aspire.Dashboard.Playwright.Tests\Integration\Playwright\ResourcePaneInteractionTests.cs
git diff --check
```

</details>

## Checklist

- Is this feature complete?
  - [x] Yes. Ready to ship.
  - [ ] No. Follow-up changes expected.
- Are you including unit tests for the changes and scenario tests if
relevant?
  - [x] Yes
  - [ ] No
- Did you add public API?
  - [ ] Yes
    - If yes, did you have an API Review for it?
      - [ ] Yes
      - [ ] No
- Did you add `<remarks />` and `<code />` elements on your triple slash
comments?
      - [ ] Yes
      - [ ] No
  - [x] No
- Does the change make any security assumptions or guarantees?
  - [ ] Yes
    - If yes, have you done a threat model and had a security review?
      - [ ] Yes
      - [ ] No
  - [x] No

---------

Co-authored-by: David Pine <7679720+IEvangelist@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants