Enhance split view tab management and styling adjustments

This commit is contained in:
mr. M
2025-03-01 23:01:29 +01:00
parent 86390bde02
commit fae2187394
6 changed files with 76 additions and 18 deletions

View File

@@ -28,7 +28,12 @@ tab-group[split-view-group] {
--tab-min-height: 28px; --tab-min-height: 28px;
} }
container-type: inline-size;
container-name: browser-tab;
flex: 1 !important; flex: 1 !important;
padding-inline: 2px !important;
overflow: clip;
&:not(:last-child)::after { &:not(:last-child)::after {
content: ''; content: '';
@@ -75,10 +80,18 @@ tab-group[split-view-group] {
background-color: var(--zen-toolbar-element-bg); background-color: var(--zen-toolbar-element-bg);
} }
& .tab-close-button { & .tab-close-button,
& .tab-reset-button {
margin-inline-end: -3px !important;
display: none !important; display: none !important;
} }
@container browser-tab (min-width: 70px) {
:root[zen-sidebar-expanded='true'] &:hover > .tabbrowser-tab:not([pinned]) .tab-close-button {
display: block !important;
}
}
@media (prefers-reduced-motion: no-preference) { @media (prefers-reduced-motion: no-preference) {
#tabbrowser-tabs[movingtab] & { #tabbrowser-tabs[movingtab] & {
transition: var(--tab-dragover-transition); transition: var(--tab-dragover-transition);

View File

@@ -600,7 +600,7 @@
&:is(:hover, [visuallyselected]) .tab-close-button { &:is(:hover, [visuallyselected]) .tab-close-button {
display: block; display: block;
--tab-inline-padding: 0; /* Avoid weird padding */ --tab-inline-padding: 0; /* Avoid weird padding */
margin-inline-end: 0 !important; margin-inline-end: 0;
} }
.tab-throbber, .tab-throbber,
@@ -888,7 +888,6 @@
.reset-icon, .reset-icon,
.tab-reset-pin-button { .tab-reset-pin-button {
appearance: none; appearance: none;
} }
@media not (forced-colors) { @media not (forced-colors) {

View File

@@ -8,20 +8,49 @@
document.addEventListener('TabGrouped', this.#onTabGrouped.bind(this)); document.addEventListener('TabGrouped', this.#onTabGrouped.bind(this));
document.addEventListener('TabUngrouped', this.#onTabUngrouped.bind(this)); document.addEventListener('TabUngrouped', this.#onTabUngrouped.bind(this));
document.addEventListener('TabGroupRemoved', this.#onTabGroupRemoved.bind(this)); document.addEventListener('TabGroupRemoved', this.#onTabGroupRemoved.bind(this));
document.addEventListener('TabGroupCreate', this.#onTabGroupCreate.bind(this));
} }
#onTabGrouped(event) { #onTabGrouped(event) {
const tab = event.target; const tab = event.target;
const group = tab.group; const group = tab.group;
group.pinned = tab.pinned; group.pinned = tab.pinned;
if (group.hasAttribute('split-view-group') && group.hasAttribute('zen-pinned-changed')) {
// zen-pinned-changed remove it and set it to had-zen-pinned-changed to keep
// track of the original pinned state
group.removeAttribute('zen-pinned-changed');
group.setAttribute('had-zen-pinned-changed', true);
}
} }
#onTabUngrouped(event) {} #onTabUngrouped(event) {
const tab = event.target;
const group = event.detail;
if (group.hasAttribute('split-view-group') && tab.hasAttribute('had-zen-pinned-changed')) {
tab.setAttribute('zen-pinned-changed', true);
tab.removeAttribute('had-zen-pinned-changed');
}
}
#onTabGroupCreate(event) {
const group = event.target;
const tabs = group.tabs;
if (!group.pinned) {
return;
}
for (const tab of tabs) {
if (tab.hasAttribute('zen-pinned-changed')) {
tab.removeAttribute('zen-pinned-changed');
tab.setAttribute('had-zen-pinned-changed', true);
}
}
}
#onTabGroupRemoved(event) {} #onTabGroupRemoved(event) {}
expandGroupTabs(group) { expandGroupTabs(group) {
for (const tab of group.tabs) { for (const tab of group.tabs.reverse()) {
gBrowser.ungroupTab(tab); gBrowser.ungroupTab(tab);
} }
} }
@@ -31,15 +60,20 @@
if (!group) { if (!group) {
return false; return false;
} }
if (group.hasAttribute('split-view-group')) { if (group.hasAttribute('split-view-group') && !this._piningFolder) {
for (const tab of group.tabs) { this._piningFolder = true;
tab.setAttribute('pinned', 'true'); for (const otherTab of group.tabs) {
if (tab === otherTab) {
continue;
} }
gBrowser.pinTab(otherTab);
}
this._piningFolder = false;
gBrowser.verticalPinnedTabsContainer.insertBefore(group, gBrowser.verticalPinnedTabsContainer.lastChild); gBrowser.verticalPinnedTabsContainer.insertBefore(group, gBrowser.verticalPinnedTabsContainer.lastChild);
gBrowser.tabContainer._invalidateCachedTabs(); gBrowser.tabContainer._invalidateCachedTabs();
return true; return true;
} }
return false; return this._piningFolder;
} }
handleTabUnpin(tab) { handleTabUnpin(tab) {
@@ -47,15 +81,20 @@
if (!group) { if (!group) {
return false; return false;
} }
if (group.hasAttribute('split-view-group')) { if (group.hasAttribute('split-view-group') && !this._piningFolder) {
for (const tab of group.tabs) { this._piningFolder = true;
tab.removeAttribute('pinned'); for (const otherTab of group.tabs) {
if (tab === otherTab) {
continue;
} }
gBrowser.unpinTab(otherTab);
}
this._piningFolder = false;
ZenWorkspaces.activeWorkspaceStrip.prepend(group); ZenWorkspaces.activeWorkspaceStrip.prepend(group);
gBrowser.tabContainer._invalidateCachedTabs(); gBrowser.tabContainer._invalidateCachedTabs();
return true; return true;
} }
return false; return this._piningFolder;
} }
} }

View File

@@ -781,6 +781,7 @@
return; return;
} }
tab.removeAttribute('zen-pinned-changed'); tab.removeAttribute('zen-pinned-changed');
tab.removeAttribute('had-zen-pinned-changed');
tab.style.removeProperty('--zen-original-tab-icon'); tab.style.removeProperty('--zen-original-tab-icon');
} }
@@ -788,7 +789,11 @@
if (tab.hasAttribute('zen-pinned-changed')) { if (tab.hasAttribute('zen-pinned-changed')) {
return; return;
} }
if (tab.group?.hasAttribute('split-view-group')) {
tab.setAttribute('had-zen-pinned-changed', 'true');
} else {
tab.setAttribute('zen-pinned-changed', 'true'); tab.setAttribute('zen-pinned-changed', 'true');
}
tab.style.setProperty('--zen-original-tab-icon', `url(${pin.iconUrl})`); tab.style.setProperty('--zen-original-tab-icon', `url(${pin.iconUrl})`);
} }

View File

@@ -709,7 +709,9 @@ class ZenViewSplitter extends ZenDOMOperatedFeature {
*/ */
splitTabs(tabs, gridType) { splitTabs(tabs, gridType) {
const firstisPinned = tabs[0].pinned; const firstisPinned = tabs[0].pinned;
tabs = tabs.filter((t) => t.pinned === firstisPinned && !t.hidden && !t.hasAttribute('zen-empty-tab')); tabs = tabs.filter(
(t) => t.pinned === firstisPinned && !t.hidden && !t.hasAttribute('zen-empty-tab') && !t.hasAttribute('zen-essential')
);
if (tabs.length < 2 || tabs.length > this.MAX_TABS) { if (tabs.length < 2 || tabs.length > this.MAX_TABS) {
return; return;
} }

View File

@@ -1493,9 +1493,10 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
this._inChangingWorkspace = true; this._inChangingWorkspace = true;
try { try {
await this._performWorkspaceChange(window, ...args); await this._performWorkspaceChange(window, ...args);
} finally { } catch (e) {
this._inChangingWorkspace = false; console.error('ZenWorkspaces: Error changing workspace', e);
} }
this._inChangingWorkspace = false;
} }
_cancelSwipeAnimation() { _cancelSwipeAnimation() {
@@ -1630,7 +1631,6 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
const elementWorkspaceIndex = workspaces.workspaces.findIndex((w) => w.uuid === elementWorkspaceId); const elementWorkspaceIndex = workspaces.workspaces.findIndex((w) => w.uuid === elementWorkspaceId);
const offset = -(newWorkspaceIndex - elementWorkspaceIndex) * 100; const offset = -(newWorkspaceIndex - elementWorkspaceIndex) * 100;
const newTransform = `translateX(${offset}%)`; const newTransform = `translateX(${offset}%)`;
const isCurrent = offset === 0;
if (shouldAnimate) { if (shouldAnimate) {
element.removeAttribute('hidden'); element.removeAttribute('hidden');
animations.push( animations.push(