Skip to content

Upgrade Hex1b and improve dashboard terminal navigation and metadata - #20255

Merged
James Newton-King (JamesNK) merged 60 commits into
mainfrom
mitchdenny-aspire-terminal-scrollbars
Oct 1, 2026
Merged

James Newton-King (JamesNK) merged 60 commits into
mainfrom
mitchdenny-aspire-terminal-scrollbars

Conversation

@mitchdenny

@mitchdenny Mitch Denny (mitchdenny) commented Sep 19, 2026 •

Copy link
Copy Markdown
Member

Description

Upgrade the Aspire Dashboard terminal integration to Hex1b 0.171.0 across NuGet, npm, tool/MCP pins, and vendored web assets. The deployed assets are one bundled client-and-workers JavaScript file, one font, and two licenses. Hex1b's built-in canvas overlay scrollbar shows retained command marks over terminal content without a native gutter. The 0.171 producer retains up to 200 command marks even if older backing text remains in scrollback; older marks are evicted first. The palette-derived scrollbar track is explicitly configured to preserve its appearance when using 0.171.

The terminal header shows workload title, working directory, and progress. The full title/directory can be copied, with screen-reader announcements for copy success/failure. Long paths compact without losing a UNC server/share authority. Percentages appear in tooltips; the icon slot shows a progress ring while active and a resource/terminal icon otherwise. Dock tabs retain their creation-time titles and support drag/drop and keyboard reordering, horizontal scrolling, navigation controls, an insertion line, and an overflow fade. The terminal frame has a 1px border and 12px content padding (chromeless dock/window views keep their borderless, unpadded presentation). The footer has compact Fluent font/sizing controls and visible, associated Size and Palette labels; its controls wrap at narrow widths rather than clipping the palette selector.

Palette behavior: The terminal footer has an explicit Dark / Light palette selector. The browser-stored terminal palette defaults to Dark and is independent of the Dashboard theme. Changing Dashboard theme in Settings changes the surrounding chrome, not the selected terminal palette. Changing the terminal palette recolors content and markers without reconnecting. A former dashboard preference migrates to Dark; forced-colors mode uses system scrollbar colors.

Screen.Recording.2026-09-21.at.10.19.01.am.mov

User-facing usage

./dotnet.sh build src/Aspire.Managed
alias aspire="$PWD/run-aspire.sh"
aspire run --project playground/Terminals

Open the terminal-features resource's Terminal view. Drag the scrollbar thumb or select a command mark to navigate history; click the title/directory to copy its full value. Use the Palette dropdown in the footer to switch Dark/Light. The Settings theme controls Dashboard chrome separately.

Validation

  • Current 0.171.0: All three NuGet packages were available from approved dotnet-public (GET 200); the npm package was published. Restore with only approved package feeds succeeded with zero errors (52 pre-existing package-audit warnings). The four-file browser acquisition verified against the published npm package. Dashboard JavaScript tests passed 197/197; focused NuGet configuration 3/3, Hosting terminal 82/82, TerminalHost 51/51, and Dashboard terminal/dock component 115/115 tests passed. Dashboard and Playwright dependency builds passed without warnings.
  • Styling follow-up: Regenerated the Dashboard XLF files, built the Dashboard integration host without warnings, and passed focused terminal component tests 40/40 and JavaScript regression tests 126/126. Edge/WebGL2 exercised the resource and detached-window footers at 1200px and 420px in both Dashboard themes: font changes, size selection, fit, and popup interaction passed. The narrow footer no longer clips its controls. Fluent's dropdown shadow control enforces a 160px minimum width, so these controls retain that width and wrap at narrow widths instead of becoming smaller.
  • Current real-browser check: Edge/macOS with WebGL2 and WebGPU connected to a real 0.171.0 HMP/HWT producer. Both backends passed overlay/no gutter, wheel, thumb drag, marker details/tooltip/click navigation, reconnect with retained marks, read-only output/selection, input after read-only, both same-origin workers, font loading, and disposal. The browser captured light/dark and forced-color screenshots; the separate palette/resource harness passed theme transitions, palette input and link worker before its final unrelated dock step timed out waiting for the outdated Toggle terminal button selector. That full palette/dock harness was therefore not validated to completion. The focused JS palette renderer test verifies dark/light track colors and forced/more-contrast opacity. The full repository suite, non-Edge browsers, packaged Dashboard under PathBase, and internal pipeline were not run.
  • Historical 0.170.0 (not the pinned package): Earlier test counts and theme-following browser results were for a different build and do not validate 0.171.0. TerminalTitle.test.mjs and TerminalDock.test.mjs run in regular CI through Infrastructure.Tests.

Screenshots / Recordings

This PR includes UI changes. Please add screenshots or screen recordings so reviewers can evaluate the visual changes without running locally.

  • For before/after comparisons, place them side-by-side or label them clearly.
  • For interactive changes (animations, transitions, new flows), prefer a short screen recording (GIF or video).
  • If you cannot capture visuals now, note what scenario to test and mark this section as TODO.

TODO: Attach light/dark resource and detached-terminal screenshots and a short scrollbar/header recording. Local browser captures exist; reproduce with terminal-features above.

Security considerations

Workload-supplied titles, paths, and command-mark text are untrusted. They remain text rather than HTML or navigable links; copying preserves the original text. Both embedded workers load from the same-origin vendored module without Blob workers or eval. Existing terminal authentication, input authority, and read-only gates remain in place. NuGet packages restore from approved internal feeds; no public NuGet package source is configured.

Fixes # (issue)

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

Adopt the published Hex1b alpha with bundled workers, themed overlay scrollbars, retained command marks, and live terminal metadata. Simplify vendored assets and add a continuously cycling terminal feature sample.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6bb79b75-08ac-4fcb-a432-921948a3a205
@github-actions

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 -- 20255

Or

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

@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.

Copilot review overview

🟡 Changes recommended

The external NuGet source violates repository policy, and the new TerminalTitle JavaScript tests are not wired into regular CI.

Get a fresh assessment by requesting another Copilot review.

Review effort: Balanced
Findings: 1 High severity · 1 Medium severity

Open (2)
What changed in this PR

Upgrades Hex1b and expands Dashboard terminal navigation, metadata, retained-history support, and playground coverage.

Changes:

  • Replaces the vendored module tree with a four-file minified Hex1b bundle.
  • Adds shared terminal title, directory, progress, scrollbar, and marker UI.
  • Adds component, JavaScript, transport, and playground coverage.
File(s) Description
Directory.Packages.props Upgrades Hex1b packages.
NuGet.config Adds temporary NuGet.org mapping.
playground/​Terminals/​** Adds the terminal feature driver.
src/​Aspire.Dashboard/​package*.json Upgrades the web terminal and adds Terser.
src/​Aspire.Dashboard/​scripts/​*terminal-assets.mjs Produces and verifies minimized assets.
src/​Aspire.Dashboard/​wwwroot/​js/​README.md Documents vendoring and terminal behavior.
src/​Aspire.Dashboard/​wwwroot/​js/​app.js Logs clipboard failures without tooltips.
src/​Aspire.Dashboard/​wwwroot/​js/​hex1b-web-terminal/​** Replaces the legacy dist tree with the bundle, font, and licenses.
src/​Aspire.Dashboard/​Resources/​TerminalStrings* Adds localized terminal metadata strings.
src/​Aspire.Dashboard/​Components/​Controls/​TerminalTitle.* Adds shared metadata presentation and path compaction.
src/​Aspire.Dashboard/​Components/​Controls/​TerminalView.* Integrates metadata and overlay scrollbar behavior.
src/​Aspire.Dashboard/​Components/​Pages/​TerminalWindow.* Adds detached-window metadata header.
src/​Aspire.Dashboard/​Components/​Layout/​TerminalDock.* Shows active terminal metadata.
src/​Aspire.Dashboard/​Components/​Dialogs/​InteractionsTerminalDialog.* Adds interaction-terminal metadata header.
tests/​Aspire.Dashboard.Components.Tests/​** Adds component and JavaScript coverage.
tests/​Aspire.Dashboard.Tests/​** Adds browser and retained-history coverage.
tests/​Infrastructure.Tests/​NuGetConfigTests.cs Validates the temporary source exception.
Files not reviewed (2)
  • src/Aspire.Dashboard/Resources/TerminalStrings.Designer.cs: Generated file
  • src/Aspire.Dashboard/package-lock.json: Generated file

Comment thread NuGet.config Outdated
Comment thread src/Aspire.Dashboard/Components/Controls/TerminalTitle.razor.js
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6bb79b75-08ac-4fcb-a432-921948a3a205
@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.

Copilot review overview

🟡 Changes recommended

The external NuGet.org source violates internal feed policy, and the new TerminalTitle JavaScript tests are not wired into PR CI.

Get a fresh assessment by requesting another Copilot review.

Review effort: Balanced
Findings: 1 High severity · 1 Medium severity

Open (2)
Files not reviewed (2)
  • src/Aspire.Dashboard/Resources/TerminalStrings.Designer.cs: Generated file
  • src/Aspire.Dashboard/package-lock.json: Generated file

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6bb79b75-08ac-4fcb-a432-921948a3a205
@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.

Copilot review overview

🔵 Needs a closer look

UNC paths are compacted incorrectly, and the unresolved external-feed and CI-routing findings remain blocking.

Review effort: Balanced
Findings: 1 High severity · 1 Medium severity

Open (2)
Files not reviewed (2)
  • src/Aspire.Dashboard/Resources/TerminalStrings.Designer.cs: Generated file
  • src/Aspire.Dashboard/package-lock.json: Generated file
Previously missed (1)

In code that hasn't changed since last review

Medium severity Preserve UNC server and share when compacting paths

src/​Aspire.Dashboard/​Components/​Controls/​TerminalTitle.razor.js:17

UNC roots include both the server and share, but this regex captures only the leading \\. For example, compacting \\server\share\projects\app to 24 characters currently returns \\server\…\projects\app, dropping the share and making the displayed location misleading. Parse \\server\share as part of root before omitting middle segments, and add this case to the path expectations.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6bb79b75-08ac-4fcb-a432-921948a3a205
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6bb79b75-08ac-4fcb-a432-921948a3a205

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.

Copilot review overview

🔵 Needs a closer look

The unapproved nuget.org restore source violates internal-feed policy, and the new TerminalTitle JavaScript tests are not wired into CI.

Review effort: Balanced
Findings: 1 High severity · 1 Medium severity

Open (2)
Files not reviewed (2)
  • src/Aspire.Dashboard/Resources/TerminalStrings.Designer.cs: Generated file
  • src/Aspire.Dashboard/package-lock.json: Generated file

@github-actions

This comment has been minimized.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 6bb79b75-08ac-4fcb-a432-921948a3a205
@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.

Copilot review overview

🔵 Needs a closer look

The external NuGet feed violates repository policy, and the new JavaScript test and source are not fully wired into CI.

Review effort: Balanced
Findings: 1 High severity · 1 Medium severity

Open (2)
Files not reviewed (2)
  • src/Aspire.Dashboard/Resources/TerminalStrings.Designer.cs: Generated file
  • src/Aspire.Dashboard/package-lock.json: Generated file
Previously missed (1)

In code that hasn't changed since last review

Medium severity Wire TerminalTitle JavaScript test into CI

tests/​Aspire.Dashboard.Components.Tests/​JavaScript/​TerminalTitle.test.mjs:9

This new JavaScript test is not executed by repository CI. DashboardTerminalScriptTests explicitly invokes only TerminalView.test.mjs, KeyboardShortcuts.test.mjs, and TerminalWindow.test.mjs, and no workflow invokes the package's broad npm test script. Add a [RequiresTools(["node"])] Infrastructure test that runs TerminalTitle.test.mjs; otherwise the path-compaction and observer regressions covered here can pass CI unnoticed.

@github-actions

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.

@github-actions

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.

@github-actions

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.

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.

Copilot review overview

🔵 Needs a closer look

Clipboard completion after the reset timer expires can leave the new screen-reader status permanently stale.

Review effort: Balanced
Findings: 1 High severity · 1 Medium severity

Open (2)
Files not reviewed (2)
  • src/Aspire.Dashboard/Resources/TerminalStrings.Designer.cs: Generated file
  • src/Aspire.Dashboard/package-lock.json: Generated file

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

Copilot-Session: 6bb79b75-08ac-4fcb-a432-921948a3a205
@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.

Copilot review overview

🔵 Needs a closer look

The working-directory display becomes blank whenever its optional JavaScript path observer fails.

Review effort: Balanced
Findings: 1 High severity · 1 Medium severity

Open (2)
Files not reviewed (2)
  • src/Aspire.Dashboard/Resources/TerminalStrings.Designer.cs: Generated file
  • src/Aspire.Dashboard/package-lock.json: Generated file
Previously missed (1)

In code that hasn't changed since last review

Medium severity Render full path fallback when directory measurement fails

src/​Aspire.Dashboard/​Components/​Controls/​TerminalTitle.razor:42

If path-measurement initialization fails, the working directory becomes visually blank: the only full text is hidden by .terminal-directory-measure, while this display span starts empty and is populated only by observePath. The new error handling deliberately keeps the component usable after a JS/canvas/observer failure, so render the full path here as the fallback and let the observer replace it with the compacted value when available.

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

Copilot-Session: 6bb79b75-08ac-4fcb-a432-921948a3a205
@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.

Copilot review overview

🔵 Needs a closer look

The broad browser-runtime, accessibility, dependency, and Windows socket-security changes warrant final human review, particularly with the full browser harness, internal pipeline, and security review still incomplete.

Review effort: Balanced
Findings: 1 High severity

Open (1)
Resolved since last review (1)
Files not reviewed (2)
  • src/Aspire.Dashboard/Resources/TerminalStrings.Designer.cs: Generated file
  • src/Aspire.Dashboard/package-lock.json: Generated file

@github-actions

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.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@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.

Copilot review overview

🔵 Needs a closer look

It combines a security-sensitive terminal dependency upgrade with extensive browser, transport, and Windows ACL changes, while full browser, PathBase, security, and pipeline validation remains incomplete.

Review effort: Balanced
Findings: 1 High severity

Open (1)
Files not reviewed (2)
  • src/Aspire.Dashboard/Resources/TerminalStrings.Designer.cs: Generated file
  • src/Aspire.Dashboard/package-lock.json: Generated file

@github-actions

github-actions Bot commented Oct 1, 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.

@github-actions

github-actions Bot commented Oct 1, 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.

@github-actions

github-actions Bot commented Oct 1, 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.

Use accent icons and consistent header spacing, rename the shared icon container, and update dependent tests. Make bundle header validation newline-independent and correct terminal capability documentation.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@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.

Copilot review overview

🔵 Needs a closer look

It combines a large dependency/runtime replacement with browser interaction, accessibility, and Windows security changes, while several platform and packaged-dashboard validations remain outstanding.

Review effort: Balanced
Findings: 1 High severity

Open (1)
Files not reviewed (2)
  • src/Aspire.Dashboard/Resources/TerminalStrings.Designer.cs: Generated file
  • src/Aspire.Dashboard/package-lock.json: Generated file

@github-actions

github-actions Bot commented Oct 1, 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.

@JamesNK

Copy link
Copy Markdown
Member

SQL Server REPL failure and missing diagnostics

Observed in the playground/Terminals app on Windows: running the SQL Server REPL command opens a sqlcmd (sqlserver) dock tab, but the reported error is “Terminal view is not connected”.

Evidence gathered from the running app

  • The sqlserver resource was Running / Healthy.
  • The SQL Server dock view's diagnostic snapshot reported connected: false, ended: true, and no screen text available to the viewer. This does not establish whether the producer emitted output before the view attached.
  • The shared browser console also contained repeated warnings: Dashboard terminal connection failed. Timed out waiting for the terminal's first frame. These messages do not identify the terminal/view, so they cannot conclusively be attributed to the SQL Server REPL rather than another terminal on the page.
  • Searches of the dashboard's console logs found no matching Failed to attach terminal or Terminal view failed entries.
  • The exact disconnected message originates from a guard in the Hex1b web-terminal client. It is not, by itself, a SQL Server authentication or connectivity error.

Where to find diagnostics

  • Browser DevTools → Console: terminal connection failures, WebSocket close codes, first-frame timeouts, and input errors.
  • Dashboard → Console logs → aspire-dashboard: category Aspire.Dashboard.Terminal.TerminalWebSocketProxy.
  • AppHost output: terminal lifecycle messages under Aspire.Hosting.ApplicationModel.TerminalService, including Starting terminal … (sqlcmd (sqlserver)) and unexpected workload exceptions.

Logging gap / follow-up

RunTerminalAsync logs unexpected exceptions and cancellation, but does not log a process exit code when the workload simply completes. The current diagnostics therefore do not establish why the REPL session ended.

Useful follow-up would be to correlate browser warnings with the terminal/view ID and surface launch/completion diagnostics (including exit status when available). Diagnostic output must not expose credentials or environment-variable values. The failure's root cause remains unconfirmed; no fix is claimed by this investigation.

@JamesNK

Copy link
Copy Markdown
Member

Tracking the SQL Server REPL failure and diagnostic logging gap in #20645, assigned to Mitch Denny (@mitchdenny) for investigation in the 17.0 milestone. The issue includes the observed terminal state, relevant logs, reproduction scenario, and the unconfirmed-root-cause caveat.

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

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Reviewed the latest terminal dock styling changes. Scoped CSS generation passed. The SQL Server REPL failure and diagnostic investigation are tracked separately in #20645.

@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown
Contributor

Tests selector

Selects the full PR test matrix + all PR-gated jobs (ALL) — run-all fallback: '.mcp.json' is neither Layer-1-owned nor matched by a Layer 2 rule


Selection computed for commit d333d52.

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.

Copilot review overview

🔵 Needs a closer look

It combines a security-sensitive dependency upgrade, vendored executable assets, Windows ACL changes, and extensive interactive UI behavior without full pipeline or cross-browser validation.

Review effort: Balanced
Findings: None

Resolved since last review (1)
Files not reviewed (2)
  • src/Aspire.Dashboard/Resources/TerminalStrings.Designer.cs: Generated file
  • src/Aspire.Dashboard/package-lock.json: Generated file

@github-actions

github-actions Bot commented Oct 1, 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.

@aspire-repo-bot

Copy link
Copy Markdown
Contributor

Pull request created: #1801

Generated by PR Documentation Check · copilot · auto · 95 AIC · ⌖ 18.3 AIC · ⊞ 20.3K

@aspire-repo-bot

Copy link
Copy Markdown
Contributor

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

Updated src/frontend/src/content/docs/dashboard/terminals.mdx to document the Hex1b 0.171.0 dashboard terminal upgrade (PR #20255). Triggered signals and evidence: dashboard_user_facing_page_changed (ConsoleLogs.razor, TerminalWindow.razor[.cs] modified), new_public_type (new public partial class TerminalTitle : IAsyncDisposable), pr_body_has_cli_flag_mention/pr_body_has_user_facing_section (PR body's "User-facing usage" section demoing aspire run --project playground/Terminals and the terminal-features resource). Added two new sections: "Navigate scrollback and copy terminal metadata" (overlay scrollbar with up-to-200 retained command marks, click-to-jump, tooltips, copyable title/working-directory with UNC-safe compaction) and "Choose a terminal color palette" (Dark/Light footer selector, independent of dashboard theme, migration from the old theme-following preference, forced-colors behavior). Also extended the keyboard-navigation table and dock description with Alt+Shift+Left/Right tab reordering, drag-to-reorder, scroll buttons/overflow fade, and fixed creation-time tab titles.

Note

This draft PR needs human review before merging.

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.

3 participants