Skip to content

editor: restore connected tab border and divider customizations - #338796

Open
Cherry Wang (chryw) wants to merge 24 commits into
mainfrom
dev/cherwan/agents/connected-tabs-border-bug-fix-audit
Open

Cherry Wang (chryw) wants to merge 24 commits into
mainfrom
dev/cherwan/agents/connected-tabs-border-bug-fix-audit

Conversation

@chryw

@chryw Cherry Wang (chryw) commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

Connected editor tabs still suppressed legacy border customizations after #337986. This restores those colors while preserving the height, wrapping, and corner geometry introduced by #339028.

Fixes #325250.

Changes

  • Restore active top/bottom, hover, selected, modified, and unfocused border customizations. Explicit selected-top colors remain the fallback when the active-top color is absent, without exposing the default theme accent.
  • Add tab.divider, inheriting tab.border unless customized separately. Legacy keeps its existing separators; Pill shows dedicated dividers at every adjacency; Connected shows them only between inactive neighbors. High Contrast retains theme-owned boundaries without redundant dividers.
  • Keep the connected cap, curved shoulders, and body separator continuous in default/custom colors and High Contrast. Reserve wrapped action space before assigning row markers so compact tabs do not lose their left boundary.
  • Preserve Modern action-background customization on ordinary, upper wrapped, and separate pinned tabs. Color fixtures use isolated customized themes and production-generated CSS, including derived colors.

Visual evidence

Current production fixtures in Dark: yellow is tab.border, white is tab.divider, cyan is the active-top accent, and red is the active-bottom accent. Top to bottom: Legacy, Pill, Connected. The linked issue contains the original missing-customization state.

Current Legacy, Pill, and Connected fixtures with matched custom colors

Compact wrapped tabs in Dark High Contrast, without color overrides. Before/after detail shows the active left boundary and shoulder restored by correcting row classification; the updated tab height is unchanged.

Compact wrapped HC tab before and after restoring its left contour

The Screenshots & Tests check supplies the broader component-fixture theme report.

Testing

  1. Enable Modern UI and select Connected tabs. Assign distinct colors to tab.border, tab.divider, tab.activeBorder, and tab.activeBorderTop. Verify the active contour and accents, with dividers only between inactive neighbors.
  2. Switch to Pill, then disable Modern UI for Legacy. Verify rounded Pill outlines and independent dividers; Legacy must not gain a second separator.
  3. Wrap enough tabs to select a bottom-row tab with neighbors on both sides. Switch between default and compact tab height. Verify both shoulders meet the body border, row markers remain correct, and Close/Unpin controls stay aligned.
  4. Repeat in Dark and Light High Contrast with no overrides. Verify continuous theme-owned outlines and no dedicated dividers.
  5. Customize modernEditorTab.hoverActionBackground differently from modernEditorTab.hoverBackground. Hover ordinary, upper wrapped, and separate pinned tabs in focused and unfocused groups.
  6. With Dark+, customize only tab.selectedBorderTop and multi-select tabs. Verify the active tab retains the selected-color fallback. In a theme with an active-top color, confirm that fallback does not override it.
  7. Customize only tab.border and verify tab.divider inherits it. Check modified, multi-selected, action-left, clipped, and unfocused states, then clear all overrides and verify the default appearance.

Validation

Production tab/color regression tests, existing tab fixture behavior checks, render/remount checks, ESLint, stylelint, and staged hygiene pass. Component Explorer validation includes full-folder views and matched physical-pixel shoulder checks.

The latest UI validation used production Component Explorer fixtures rather than a fresh native OSS run. Full local client type checking is blocked by three existing Foundry transcription errors in unchanged code.

Cherry Wang (chryw) and others added 14 commits September 29, 2026 08:11
Keep pill tabs on fill-owned borders while allowing connected tabs to use the standard full-width theme border indicators. Add component fixtures and computed-style coverage for active, unfocused, and selected border colors.

Fixes #325250.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Give explicit tab.border customizations precedence over the connected tab header border default, and cover the connected side stroke in unit, fixture, and Playwright assertions.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Paint active top border customizations on the rounded connected cap instead of layering a straight indicator over it. Preserve the transparent default top-row border and keep selected and modified indicator ownership unchanged.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add matched legacy, pill, and connected fixtures plus first/middle continuity fixtures. Reuse the production legacy-to-modern color collector in the fixture harness and preserve connected structural borders and unfocused colors during active multi-selection.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add a customizable tab.divider element between tabs while reserving tab.border for tab boundaries. Modern pill and connected styles show short dividers only between inactive tabs; legacy keeps dividers at every shared boundary.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Default tab.divider to tab.border while preserving an explicit divider customization as an independent override.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Show dedicated dividers at every pill boundary while keeping connected dividers inactive-only. Keep tab.border as the rounded pill outline and inset active top/bottom accents so mixed colors do not protrude through the corners.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Make the divider transparent in continuity fixtures so the shared tab and editor boundary is tested without an inherited divider repainting it.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Use a longer inactive tab run so divider ownership remains visually obvious across legacy, pill, and connected styles.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep inactive connected tabs unoutlined so their dedicated dividers own shared boundaries. Preserve the active left edge and inset selected top accents before their corners.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Expose first-in-row state directly instead of deriving it from sibling selectors, and add Dark and Light High Contrast fixtures and assertions for connected tab boundaries.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Let the outer editor frame own the left edge when the first connected tab is active, while retaining the tab boundary when no outer frame is present.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep legacy tab separators single-owned, make modern divider policies explicit, align the connected active bottom accent, and inherit high-contrast divider accents from the active group frame.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Keep dedicated dividers out of High Contrast, retain complete theme-owned tab outlines, and render customized wrapped-tab accents inside rounded pill corners. Align the tab geometry tests with production row and grid ownership.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings September 29, 2026 22:35

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

Configured hover borders can render as two adjacent strokes on inactive Connected tabs.

Review effort: Balanced
Findings: 1 Medium severity

Open (1)
What changed in this PR

Restores legacy tab border customizations in Modern UI and introduces independently configurable tab dividers.

Changes:

  • Adds tab.divider and separates divider/boundary paint ownership.
  • Restores Connected and Pill border accents across themes and wrapped tabs.
  • Expands unit and component-fixture coverage.
File Description
test/​componentFixtures/​playwright/​tests/​editorTabBar.spec.ts Tests border ownership and continuity.
src/​vs/​workbench/​test/​browser/​parts/​editor/​multiEditorTabsControl.test.ts Tests row-boundary classes.
src/​vs/​workbench/​test/​browser/​componentFixtures/​editor/​editorTabBar.fixture.ts Adds themed border fixtures.
src/​vs/​workbench/​services/​themes/​browser/​modernTabColorCustomizations.ts Emits legacy border customization variables.
src/​vs/​workbench/​contrib/​modernUI/​test/​browser/​modernUI.contribution.test.ts Tests theming and border behavior.
src/​vs/​workbench/​contrib/​modernUI/​browser/​media/​tabs.css Implements Pill boundaries, accents, and dividers.
src/​vs/​workbench/​contrib/​modernUI/​browser/​media/​connectedEditorTabs.css Implements Connected border ownership.
src/​vs/​workbench/​common/​theme.ts Registers tab.divider.
src/​vs/​workbench/​browser/​parts/​editor/​multiEditorTabsControl.ts Adds divider elements and row markers.
src/​vs/​workbench/​browser/​parts/​editor/​media/​multieditortabscontrol.css Defines divider and indicator styling.
build/​lib/​stylelint/​vscode-known-variables.json Registers new CSS variables.

💡 Configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread src/vs/workbench/contrib/modernUI/browser/media/connectedEditorTabs.css Outdated
Keep editor-only Pill accent pseudo-elements off shared Sessions tabs, model production row-start ownership in the Sessions fixture, and restore the missing component-fixture theme type import.

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

github-actions Bot commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

Screenshot Changes

Base: 0fc14ed8 Current: 67d4f2b3

Changed (34)

sessions/grid/sessionsGrid/MultipleChats/Light
Before After
before after
sessions/editorHeader/editorHeader/ConnectedChangesCard/Light
Before After
before after
sessions/editorHeader/editorHeader/ConnectedSecondTabCard/Light
Before After
before after
sessions/editorHeader/editorHeader/FullHeader/Light
Before After
before after
sessions/editorHeader/editorHeader/CompactFullHeader/Light
Before After
before after
sessions/editorHeader/editorHeader/BreadcrumbsAndAction/Light
Before After
before after
sessions/editorHeader/editorHeader/BreadcrumbsAndSecondaryAction/Light
Before After
before after
sessions/editorHeader/editorHeader/BreadcrumbsOnly/Light
Before After
before after
sessions/editorHeader/editorHeader/PrimaryActionOnly/Light
Before After
before after
sessions/editorHeader/editorHeader/SecondaryActionOnly/Light
Before After
before after
sessions/editorHeader/editorHeader/LayoutActionsOnly/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/DiscoverPluginsLoadingMore/Light
Before After
before after
editor/tabs/Density/PinnedSeparateRow/Default/Light
Before After
before after
editor/tabs/Density/PinnedSeparateRow/Compact/Light
Before After
before after
editor/tabs/Density/SingleRow/Default/Light
Before After
before after
editor/tabs/Density/SingleRow/Compact/Light
Before After
before after
editor/tabs/Density/Wrapped/Default/Light
Before After
before after
editor/tabs/Density/Wrapped/Compact/Light
Before After
before after
editor/tabs/FileIcons/Disabled/Light
Before After
before after
editor/tabs/FileIcons/Minimal/Light
Before After
before after
editor/tabs/Layout/ActionsLeading/Light
Before After
before after
editor/tabs/Layout/CloseActionsHidden/Light
Before After
before after
editor/tabs/Layout/LongNamesFit/Light
Before After
before after
editor/tabs/Layout/LongNamesFixed/Light
Before After
before after
editor/tabs/Layout/LongNamesShrink/Light
Before After
before after
editor/tabs/Layout/ModifiedAndMultiSelected/Light
Before After
before after
editor/tabs/Layout/PinnedIconOnly/Light
Before After
before after
editor/tabs/Layout/SingleEditor/Light
Before After
before after
editor/tabs/Scrolling/Breadcrumbs/Light
Before After
before after
editor/tabs/Scrolling/ClippedActiveTab/Light
Before After
before after
editor/tabs/Scrolling/StickyPinnedTabs/Light
Before After
before after
editor/tabs/TabStyles/Connected/Light
Before After
before after
editor/tabs/TabStyles/Legacy/Light
Before After
before after
editor/tabs/TabStyles/Pill/Light
Before After
before after

4 insignificant change(s) omitted (≤20 px, Δ≤2). See CI logs for details.

Added (7)

editor/tabs/Colors/ConnectedLegacyBorders/ActiveGroup/Light

current

editor/tabs/Colors/ConnectedLegacyBorders/InactiveGroup/Light

current

editor/tabs/Colors/SelectedBorderFallback/ActiveGroup/Light

current

editor/tabs/Colors/SelectedBorderFallback/InactiveGroup/Light

current

editor/tabs/Colors/DerivedColors/Light

current

editor/tabs/Density/WrappedBottomActive/Default/Light

current

editor/tabs/Density/WrappedBottomActive/Compact/Light

current

Use the boundary-aligned standard indicator for bottom-row Connected hover accents while upper wrapped pills keep their inset fill-owned border.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@chryw
Cherry Wang (chryw) marked this pull request as ready for review September 29, 2026 23:34
@vs-code-engineering

Copy link
Copy Markdown
Contributor

📬 CODENOTIFY

The following users are being notified based on files changed in this PR:

Benjamin Christopher Simmonds (@benibenj)

Matched files:

  • src/vs/workbench/browser/parts/editor/media/multieditortabscontrol.css
  • src/vs/workbench/browser/parts/editor/multiEditorTabsControl.ts

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

Wrapped hover borders remain missing or mispainted, and connected dividers conflict with pinned-tab separators.

Review effort: Balanced
Findings: 1 Medium severity

Open (1)
Resolved since last review (1)
Previously missed (2)

In code that hasn't changed since last review

Medium severity Suppress generic divider at pinned-to-normal boundary

src/​vs/​workbench/​contrib/​modernUI/​browser/​media/​connectedEditorTabs.css:75

At an inactive pinned-to-normal boundary this divider paints above the existing tab.lastPinnedBorder inset shadow (tabs.css:115-116) because .tab-divider has z-index 9. With distinct custom colors, the last-pinned separator is covered through its center and survives only as short fragments. Suppress the generic divider at that transition so the semantic pinned separator retains paint ownership.

Medium severity Add inset hover accent for active upper-row tabs

src/​vs/​workbench/​contrib/​modernUI/​browser/​media/​connectedEditorTabs.css:674

The inset replacement is gated on .tab-border-bottom, so active upper-row hover rendering is inconsistent: without tab.activeBorder, tab.hoverBorder remains a full-width straight indicator across the rounded corners; with tab.activeBorder, this rule hides the hover indicator and the pseudo-element keeps the active-border color instead. Handle hovered active upper-row tabs explicitly with an inset hover accent.

Cherry Wang (chryw) and others added 2 commits September 30, 2026 11:02
Render focused and unfocused hover-border customizations as a single inset accent on upper wrapped tabs, preserving their rounded pill geometry.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Honor explicit Modern editor action colors in Connected tabs while preserving seamless defaults. Guard the complete 46-token editor-tab audit across legacy, shared Modern, editor-specific Modern, and editor-group-header color families.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Cherry Wang (chryw) and others added 5 commits October 1, 2026 12:28
…nnected-tabs-border-bug-fix-audit

# Conflicts:
#	src/vs/workbench/contrib/modernUI/browser/media/connectedEditorTabs.css
#	src/vs/workbench/test/browser/componentFixtures/editor/editorTabBar.fixture.ts
Preserve the shared HC frame edge and load the production editor-frame styles in the migrated tab fixture harness.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Drop editor-group-header color imports that became unused when the color fixtures moved into the curated tabs harness.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Remove the redundant first-in-row marker introduced by this branch and use the row-boundary selectors owned by the merged tab structure overhaul.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Scope the editor frame to continuity fixtures, suppress uncustomized Connected active-top accents, and require exact cap/frame/body alignment without changing the tab layout geometry.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@chryw
Cherry Wang (chryw) marked this pull request as draft October 1, 2026 21:44
Restore continuous shoulder strokes with the updated tab geometry and reserve wrapped action space before row classification. Preserve selected-border and upper-row action-color fallbacks, and validate customizations with isolated production theme resolution.

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

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

🟢 Approval recommended

The restored customization behavior is comprehensively covered without identified correctness or accessibility regressions.

Review effort: Balanced
Findings: None

Resolved since last review (1)

@chryw
Cherry Wang (chryw) marked this pull request as ready for review October 1, 2026 22:55

This branch has not been deployed

No deployments
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.

Modern UI: tab.activeBorder color customization not respected

5 participants