feat: Start animating folder closes, b=no-bug, c=common

This commit is contained in:
mr. m
2026-02-25 20:19:32 +01:00
parent bae234867e
commit 2c740b1abf
4 changed files with 36 additions and 21 deletions

2
.nvmrc
View File

@@ -1 +1 @@
20 22

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
index d7765e0adb37216d35f2125abf96025cbb150bab..27202066cef98d9826884806f71e70812457bd78 100644 index d7765e0adb37216d35f2125abf96025cbb150bab..4913c2e6cfb4f77bd8f2c0f33310c27475172132 100644
--- a/browser/components/tabbrowser/content/tabbrowser.js --- a/browser/components/tabbrowser/content/tabbrowser.js
+++ b/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js
@@ -405,6 +405,7 @@ @@ -405,6 +405,7 @@
@@ -605,7 +605,7 @@ index d7765e0adb37216d35f2125abf96025cbb150bab..27202066cef98d9826884806f71e7081
aTab._closeTimeAnimTimerId = null; aTab._closeTimeAnimTimerId = null;
- this._endRemoveTab(aTab); - this._endRemoveTab(aTab);
+ if (animate && !gReduceMotion && !(gZenUIManager.testingEnabled && !gZenUIManager.profilingEnabled)) { + if (animate && !gReduceMotion && !(gZenUIManager.testingEnabled && !gZenUIManager.profilingEnabled)) {
+ gZenVerticalTabsManager.animateTabClose(aTab, (animate && !gReduceMotion)).then(() => { + gZenVerticalTabsManager.animateItemClose(aTab, (animate && !gReduceMotion)).then(() => {
+ this._endRemoveTab(aTab); + this._endRemoveTab(aTab);
+ }); + });
+ } else { + } else {

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tabgroup.js b/browser/components/tabbrowser/content/tabgroup.js diff --git a/browser/components/tabbrowser/content/tabgroup.js b/browser/components/tabbrowser/content/tabgroup.js
index ebcc072abca51ba9936d0e6d97bbd329427c0231..62e8209bbc38fb209340279e5ed3e2cc2441c48c 100644 index ebcc072abca51ba9936d0e6d97bbd329427c0231..2b0980a745e2339d3220bb701092f4f621876985 100644
--- a/browser/components/tabbrowser/content/tabgroup.js --- a/browser/components/tabbrowser/content/tabgroup.js
+++ b/browser/components/tabbrowser/content/tabgroup.js +++ b/browser/components/tabbrowser/content/tabgroup.js
@@ -14,11 +14,11 @@ @@ -14,11 +14,11 @@
@@ -100,7 +100,17 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..62e8209bbc38fb209340279e5ed3e2cc
resetDefaultGroupName = () => { resetDefaultGroupName = () => {
this.#defaultGroupName = ""; this.#defaultGroupName = "";
@@ -211,7 +234,10 @@ @@ -166,7 +189,9 @@
this.dispatchEvent(
new CustomEvent("TabGroupRemoved", { bubbles: true })
);
+ gZenVerticalTabsManager.animateItemClose(this).then(() => {
this.remove();
+ });
Services.obs.notifyObservers(
this,
"browser-tabgroup-removed-from-dom"
@@ -211,7 +236,10 @@
} }
}); });
} }
@@ -112,7 +122,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..62e8209bbc38fb209340279e5ed3e2cc
} }
get color() { get color() {
@@ -305,6 +331,9 @@ @@ -305,6 +333,9 @@
} }
set collapsed(val) { set collapsed(val) {
@@ -122,7 +132,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..62e8209bbc38fb209340279e5ed3e2cc
if (!!val == this.collapsed) { if (!!val == this.collapsed) {
return; return;
} }
@@ -391,7 +420,6 @@ @@ -391,7 +422,6 @@
tabGroupName, tabGroupName,
}) })
.then(result => { .then(result => {
@@ -130,7 +140,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..62e8209bbc38fb209340279e5ed3e2cc
}); });
} }
@@ -466,13 +494,65 @@ @@ -466,13 +496,65 @@
* @returns {MozTabbrowserTab[]} * @returns {MozTabbrowserTab[]}
*/ */
get tabs() { get tabs() {
@@ -145,9 +155,8 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..62e8209bbc38fb209340279e5ed3e2cc
+ tabsCollect.push(item); + tabsCollect.push(item);
+ if (gBrowser.isTabGroup(item)) { + if (gBrowser.isTabGroup(item)) {
+ tabsCollect.push(...item.tabs); + tabsCollect.push(...item.tabs);
} + }
} + }
- return childrenArray.filter(node => node.matches("tab"));
+ return tabsCollect.filter(node => node.matches("tab")); + return tabsCollect.filter(node => node.matches("tab"));
+ } + }
+ +
@@ -173,8 +182,9 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..62e8209bbc38fb209340279e5ed3e2cc
+ result.push(labelContainer); + result.push(labelContainer);
+ } + }
+ result.push(...item.childGroupsAndTabs); + result.push(...item.childGroupsAndTabs);
+ } }
+ } }
- return childrenArray.filter(node => node.matches("tab"));
+ return result; + return result;
+ } + }
+ +
@@ -201,7 +211,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..62e8209bbc38fb209340279e5ed3e2cc
} }
/** /**
@@ -569,7 +649,6 @@ @@ -569,7 +651,6 @@
); );
} else { } else {
if (tabOrSplitView.pinned) { if (tabOrSplitView.pinned) {
@@ -209,7 +219,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..62e8209bbc38fb209340279e5ed3e2cc
} }
let tabToMove = let tabToMove =
this.ownerGlobal === tabOrSplitView.ownerGlobal this.ownerGlobal === tabOrSplitView.ownerGlobal
@@ -634,7 +713,7 @@ @@ -634,7 +715,7 @@
*/ */
on_click(event) { on_click(event) {
let isToggleElement = let isToggleElement =
@@ -218,7 +228,7 @@ index ebcc072abca51ba9936d0e6d97bbd329427c0231..62e8209bbc38fb209340279e5ed3e2cc
event.target === this.#overflowCountLabel; event.target === this.#overflowCountLabel;
if (isToggleElement && event.button === 0) { if (isToggleElement && event.button === 0) {
event.preventDefault(); event.preventDefault();
@@ -705,5 +784,6 @@ @@ -705,5 +786,6 @@
} }
} }

View File

@@ -929,15 +929,20 @@ window.gZenVerticalTabsManager = {
} }
}, },
animateTabClose(aTab) { animateItemClose(aItem) {
if (aTab.hasAttribute("zen-essential") || aTab.group?.hasAttribute("split-view-group")) { if (
aItem.hasAttribute("zen-essential") ||
aItem.group?.hasAttribute("split-view-group") ||
!gZenUIManager.motion ||
gReduceMotion
) {
return Promise.resolve(); return Promise.resolve();
} }
const height = aTab.getBoundingClientRect().height; const height = aItem.getBoundingClientRect().height;
const visibleItems = gBrowser.tabContainer.ariaFocusableItems; const visibleItems = gBrowser.tabContainer.ariaFocusableItems;
const isLastItem = visibleItems[visibleItems.length - 1] === aTab; const isLastItem = visibleItems[visibleItems.length - 1] === aItem;
return gZenUIManager.motion.animate( return gZenUIManager.motion.animate(
aTab, aItem,
{ {
opacity: [1, 0], opacity: [1, 0],
transform: ["scale(1)", "scale(0.95)"], transform: ["scale(1)", "scale(0.95)"],