mirror of
https://github.com/zen-browser/desktop.git
synced 2025-10-06 09:56:36 +00:00
Enhance split view tab management and styling adjustments
This commit is contained in:
@@ -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);
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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})`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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(
|
||||||
|
Reference in New Issue
Block a user