Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
f08bdc8
init: basic layout for tab strip
thenhnn Sep 14, 2025
d45c0ac
feat: basic tabs layout
thenhnn Sep 14, 2025
ff62d86
feat: actually working tab strip, but without dnd
thenhnn Sep 15, 2025
04322ec
fix: show tab bubble to left when vertical tabs are enabled
thenhnn Sep 15, 2025
d1b794c
fix: working DND!
thenhnn Sep 17, 2025
d5136b4
fix: split patches
thenhnn Sep 21, 2025
2fb82b1
fix: tab groups
thenhnn Sep 21, 2025
f404919
fix: tab groups
thenhnn Sep 22, 2025
3ab7123
fix: offset contents container so dialogs are positioned properly
thenhnn Sep 24, 2025
ddb2b19
fix: change corner radius of split view tabs
thenhnn Sep 25, 2025
3a62375
fix: make macOS traffic lights position properly
thenhnn Sep 26, 2025
7858bf0
fix: make fullscreen work properly
thenhnn Sep 27, 2025
f68e1de
fix: remove debug log
thenhnn Sep 27, 2025
f04be15
patches: refresh
thenhnn Oct 2, 2025
dbb643e
fix compilation
thenhnn Oct 3, 2025
097f5a8
fix: make split tabs look better, add top padding for tabs
thenhnn Oct 5, 2025
8143626
fix: open tabs to the right when vertical tabs are enabled
thenhnn Oct 5, 2025
e3686fa
refresh
thenhnn Oct 7, 2025
7fb91ca
helium/ui/vertical-tabs: add a proper feature flag
wukko Oct 9, 2025
2412c44
merge: helium 0.5.5 from upstream
wukko Oct 9, 2025
348235e
helium/ui/layout-constants: refactor to eliminate duplication
wukko Oct 9, 2025
8d93ee5
helium/ui/vertical-tabs: fix tab "ripping out", reposition toolbar
wukko Oct 9, 2025
d79cb74
helium/ui/vertical-tabs: fix vertical tabs' top offset
wukko Oct 9, 2025
21e689c
helium/ui/vertical-tabs: fix screwed up formatting
wukko Oct 9, 2025
24397dd
helium/ui/vertical-tabs: fix visuals, add new tab button
wukko Oct 9, 2025
3ab6709
fix conflict
thenhnn Oct 18, 2025
5f37e8d
patches: refresh vertical-tabs/feature-flag.patch
thenhnn Oct 18, 2025
3254689
feat: add unpin button (doesn't allow to unpin buttons yet)
thenhnn Oct 19, 2025
1dd1654
fix: offset title so it doesnt overlap with unpin button
thenhnn Oct 19, 2025
e4578b8
fix: background on linux
thenhnn Oct 19, 2025
d21ff1e
helium/ui/vertical-tabs: split ui.patch into smaller patches
wukko Oct 21, 2025
8858ac7
helium/ui/vertical-tabs: unpin button func, fix stuck "unpinning" state
wukko Oct 21, 2025
a25ddb5
helium/ui/vertical-tabs: add tab search button
wukko Oct 21, 2025
49bc80e
helium/ui/vertical-tabs: add new tabs to the start of the tab strip
wukko Oct 21, 2025
8c7c0d9
helium/ui/vertical-tabs/tab-strip: add missing tab_strip_region_view.h
wukko Oct 21, 2025
1d2f9ef
helium/ui/vertical-tabs: smoother open/close animations
wukko Oct 21, 2025
19e1815
helium/ui/vertical-tabs: initial fix for toolbar click events
wukko Oct 23, 2025
ceea26c
helium/ui/vertical-tabs/tab-search: refresh
wukko Oct 23, 2025
2cb22bc
helium/ui/vertical-tabs: new tab groups ui
wukko Oct 25, 2025
68122d5
helium/ui/vertical-tabs/tab-groups: fix color indicator alignment
wukko Oct 25, 2025
226d3c2
helium/ui/vertical-tabs/ui: fix multiple tab dragging
wukko Oct 25, 2025
95069dc
helium/ui/vertical-tabs/tab-strip: disable horizontal scrollbar
wukko Oct 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 41 additions & 16 deletions patches/helium/ui/layout-constants.patch
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
--- a/chrome/browser/ui/layout_constants.cc
+++ b/chrome/browser/ui/layout_constants.cc
@@ -29,7 +29,7 @@ int GetLayoutConstant(LayoutConstant con
@@ -22,6 +22,8 @@
int GetLayoutConstant(LayoutConstant constant) {
const bool touch_ui = ui::TouchUiController::Get()->touch_ui();
switch (constant) {
+ case TOP_BAR_VERTICAL_PADDING:
+ return 3;
case APP_MENU_PROFILE_ROW_AVATAR_ICON_SIZE:
return 24;
case APP_MENU_MAXIMUM_CHARACTER_LENGTH:
@@ -29,7 +31,7 @@ int GetLayoutConstant(LayoutConstant con
case BOOKMARK_BAR_HEIGHT: {
// The fixed margin ensures the bookmark buttons appear centered relative
// to the white space above and below.
- const int bookmark_bar_attached_vertical_margin = 6;
+ const int bookmark_bar_attached_vertical_margin = 3;
+ const int bookmark_bar_attached_vertical_margin = GetLayoutConstant(TOP_BAR_VERTICAL_PADDING);
return GetLayoutConstant(BOOKMARK_BAR_BUTTON_HEIGHT) +
bookmark_bar_attached_vertical_margin;
}
@@ -52,7 +52,7 @@ int GetLayoutConstant(LayoutConstant con
@@ -52,7 +54,7 @@ int GetLayoutConstant(LayoutConstant con
case LOCATION_BAR_CHILD_INTERIOR_PADDING:
return 3;
case LOCATION_BAR_CHILD_CORNER_RADIUS:
Expand All @@ -18,7 +27,7 @@
case LOCATION_BAR_CHIP_ICON_SIZE:
return 16;
case LOCATION_BAR_CHIP_PADDING:
@@ -60,7 +60,7 @@ int GetLayoutConstant(LayoutConstant con
@@ -60,7 +62,7 @@ int GetLayoutConstant(LayoutConstant con
case LOCATION_BAR_ELEMENT_PADDING:
return touch_ui ? 3 : 2;
case LOCATION_BAR_PAGE_INFO_ICON_VERTICAL_PADDING:
Expand All @@ -27,7 +36,7 @@
case LOCATION_BAR_LEADING_DECORATION_EDGE_PADDING:
// TODO(manukh): See comment in `LocationBarView::Layout()`. We have too
// many feature permutations that would affect this and other layout
@@ -69,11 +69,11 @@ int GetLayoutConstant(LayoutConstant con
@@ -69,11 +71,11 @@ int GetLayoutConstant(LayoutConstant con
// here once we decide on a permutation.
NOTREACHED();
case LOCATION_BAR_TRAILING_DECORATION_EDGE_PADDING:
Expand All @@ -41,7 +50,7 @@
case LOCATION_BAR_ICON_SIZE:
return touch_ui ? 20 : 16;
case LOCATION_BAR_LEADING_ICON_SIZE:
@@ -93,12 +93,12 @@ int GetLayoutConstant(LayoutConstant con
@@ -93,12 +95,12 @@ int GetLayoutConstant(LayoutConstant con
case TAB_CLOSE_BUTTON_SIZE:
return touch_ui ? 24 : 16;
case TAB_HEIGHT:
Expand All @@ -52,11 +61,11 @@
GetLayoutConstant(TAB_STRIP_PADDING);
case TAB_STRIP_PADDING:
- return 6;
+ return 3;
+ return GetLayoutConstant(TOP_BAR_VERTICAL_PADDING);
case TAB_SEPARATOR_HEIGHT:
return touch_ui ? 24 : 20;
case TAB_PRE_TITLE_PADDING:
@@ -106,28 +106,23 @@ int GetLayoutConstant(LayoutConstant con
@@ -106,28 +108,23 @@ int GetLayoutConstant(LayoutConstant con
case TAB_STACK_DISTANCE:
return touch_ui ? 4 : 6;
case TABSTRIP_TOOLBAR_OVERLAP:
Expand All @@ -76,23 +85,23 @@
return touch_ui ? 20 : 16;
case TOOLBAR_DIVIDER_SPACING:
- return 9;
+ return 6;
+ return GetLayoutConstant(TOP_BAR_VERTICAL_PADDING) * 2;
case TOOLBAR_DIVIDER_WIDTH:
- return 2;
+ return 1;
case TOOLBAR_ELEMENT_PADDING:
- return touch_ui ? 0 : 4;
+ return touch_ui ? 0 : 3;
+ return touch_ui ? 0 : GetLayoutConstant(TOP_BAR_VERTICAL_PADDING);
case TOOLBAR_ICON_DEFAULT_MARGIN:
- return touch_ui ? 0 : 2;
+ return touch_ui ? 0 : 3;
+ return touch_ui ? 0 : GetLayoutConstant(TOP_BAR_VERTICAL_PADDING);
case TOOLBAR_STANDARD_SPACING:
- return touch_ui ? 12 : 9;
+ return touch_ui ? 12 : 6;
+ return touch_ui ? 12 : GetLayoutConstant(TOP_BAR_VERTICAL_PADDING) * 2;
case PAGE_INFO_ICON_SIZE:
return 20;
case DOWNLOAD_ICON_SIZE:
@@ -167,7 +162,7 @@ gfx::Insets GetLayoutInsets(LayoutInset
@@ -167,7 +164,7 @@ gfx::Insets GetLayoutInsets(LayoutInset
}

case TOOLBAR_BUTTON:
Expand All @@ -101,17 +110,33 @@

case BROWSER_APP_MENU_CHIP_PADDING:
if (touch_ui) {
@@ -183,11 +178,11 @@ gfx::Insets GetLayoutInsets(LayoutInset
@@ -183,11 +180,15 @@ gfx::Insets GetLayoutInsets(LayoutInset
if (touch_ui) {
return GetLayoutInsets(TOOLBAR_BUTTON);
} else {
- return gfx::Insets::TLBR(7, 10, 7, 4);
+ return gfx::Insets::TLBR(4, 5, 4, 4);
}

case TOOLBAR_INTERIOR_MARGIN:
- case TOOLBAR_INTERIOR_MARGIN:
- return touch_ui ? gfx::Insets::VH(4, 0) : gfx::Insets::VH(6, 5);
+ return touch_ui ? gfx::Insets() : gfx::Insets::TLBR(0, 6, 3, 6);
+ case TOOLBAR_INTERIOR_MARGIN: {
+ const int vert = GetLayoutConstant(TOP_BAR_VERTICAL_PADDING);
+ const int horiz = vert * 2;
+ return touch_ui ? gfx::Insets() :
+ gfx::Insets::TLBR(0, horiz, vert, horiz);
+ }

case WEBUI_TAB_STRIP_TOOLBAR_INTERIOR_MARGIN:
return gfx::Insets::VH(4, 0);
--- a/chrome/browser/ui/layout_constants.h
+++ b/chrome/browser/ui/layout_constants.h
@@ -10,6 +10,8 @@
#include "ui/gfx/geometry/size.h"

enum LayoutConstant {
+ // The vertical padding of the tab strip and the toolbar.
+ TOP_BAR_VERTICAL_PADDING,
// The size of the avatar icon in the profile row of the app menu.
APP_MENU_PROFILE_ROW_AVATAR_ICON_SIZE,

Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -4279,8 +4279,6 @@ static_library("ui") {
"views/tabs/browser_tab_strip_controller.h",
"views/tabs/color_picker_view.cc",
"views/tabs/color_picker_view.h",
- "views/tabs/compound_tab_container.cc",
- "views/tabs/compound_tab_container.h",
"views/tabs/dragging/drag_session_data.cc",
"views/tabs/dragging/drag_session_data.h",
"views/tabs/dragging/dragging_tabs_session.cc",
--- a/chrome/browser/ui/views/tabs/tab_strip.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -59,7 +59,6 @@
#include "chrome/browser/ui/view_ids.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/tabs/browser_tab_strip_controller.h"
-#include "chrome/browser/ui/views/tabs/compound_tab_container.h"
#include "chrome/browser/ui/views/tabs/dragging/tab_drag_controller.h"
#include "chrome/browser/ui/views/tabs/tab.h"
#include "chrome/browser/ui/views/tabs/tab_container_impl.h"
@@ -135,10 +134,6 @@ std::unique_ptr<TabContainer> MakeTabCon
TabStrip* tab_strip,
TabHoverCardController* hover_card_controller,
TabDragContext* drag_context) {
- if (base::FeatureList::IsEnabled(tabs::kSplitTabStrip)) {
- return std::make_unique<CompoundTabContainer>(
- *tab_strip, hover_card_controller, drag_context, *tab_strip, tab_strip);
- }
return std::make_unique<TabContainerImpl>(
*tab_strip, hover_card_controller, drag_context, *tab_strip, tab_strip);
}
56 changes: 56 additions & 0 deletions patches/helium/ui/vertical-tabs/feature-flag.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
--- a/chrome/browser/ui/tabs/features.cc
+++ b/chrome/browser/ui/tabs/features.cc
@@ -57,6 +57,10 @@ BASE_FEATURE(kTabSelectionByPointer,
"TabSelectionByPointer",
base::FEATURE_DISABLED_BY_DEFAULT);

+BASE_FEATURE(kHeliumVerticalTabs,
+ "HeliumVerticalTabs",
+ base::FEATURE_DISABLED_BY_DEFAULT);
+
bool CanShowTabSearchPositionSetting() {
// Alternate tab search locations cannot be repositioned.
if (features::HasTabSearchToolbarButton()) {
@@ -79,4 +83,8 @@ bool AreVerticalTabsEnabled() {
return base::FeatureList::IsEnabled(kVerticalTabs);
}

+bool AreHeliumVerticalTabsEnabled() {
+ return base::FeatureList::IsEnabled(kHeliumVerticalTabs);
+}
+
} // namespace tabs
--- a/chrome/browser/ui/tabs/features.h
+++ b/chrome/browser/ui/tabs/features.h
@@ -38,6 +38,9 @@ extern bool CanShowTabSearchPositionSett
extern bool AreTabGroupShortcutsEnabled();
extern bool AreVerticalTabsEnabled();

+BASE_DECLARE_FEATURE(kHeliumVerticalTabs);
+extern bool AreHeliumVerticalTabsEnabled();
+
} // namespace tabs

#endif // CHROME_BROWSER_UI_TABS_FEATURES_H_
--- a/chrome/browser/helium_flag_choices.h
+++ b/chrome/browser/helium_flag_choices.h
@@ -31,6 +31,8 @@ namespace helium {
constexpr const char kAudioContextJitterCommandLine[] = "fingerprinting-audio-context-jitter";
constexpr const char kMiddleClickAutoscrollCommandLine[] = "middle-click-autoscroll";

+ constexpr const char kHeliumVerticalTabsCommandLine[] = "helium-vertical-tabs";
+
} // namespace helium

#endif /* CHROME_BROWSER_HELIUM_FLAG_CHOICES_H_ */
--- a/chrome/browser/helium_flag_entries.h
+++ b/chrome/browser/helium_flag_entries.h
@@ -28,4 +28,8 @@
"Middle Click Autoscroll",
"Enables autoscroll on middle click. Helium flag, Chromium feature.",
kOsDesktop, FEATURE_VALUE_TYPE(blink::features::kHeliumMiddleClickAutoscroll)},
+ {helium::kHeliumVerticalTabsCommandLine,
+ "Enable Helium Vertical Tabs",
+ "Enables experimental vertical tabs layout in Helium. Will be unstable and buggy, WIP. Helium flag.",
+ kOsDesktop, FEATURE_VALUE_TYPE(tabs::kHeliumVerticalTabs)},
#endif /* CHROME_BROWSER_HELIUM_FLAG_ENTRIES_H_ */
Loading