From 91f5e104d2be45287fd2499f5fd895e7c0efab68 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Thu, 28 Aug 2025 01:10:40 +0200 Subject: [PATCH 01/55] fix: Move 'unpack folder' next to 'delete folder', b=no-bug, c=no-component --- src/browser/base/content/zen-panels/popups.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/browser/base/content/zen-panels/popups.inc b/src/browser/base/content/zen-panels/popups.inc index 7f23e2704..a84187bf1 100644 --- a/src/browser/base/content/zen-panels/popups.inc +++ b/src/browser/base/content/zen-panels/popups.inc @@ -38,7 +38,6 @@ - @@ -46,5 +45,6 @@ + From 1f727652275df76784fc9171887fb799a4debac8 Mon Sep 17 00:00:00 2001 From: octaviusz <50177704+octaviusz@users.noreply.github.com> Date: Thu, 28 Aug 2025 02:20:11 +0300 Subject: [PATCH 02/55] fix: Some fixes for folders, p=#10038 --- .../tabbrowser/content/tabbrowser-js.patch | 29 +++++++++++-------- src/zen/folders/ZenFolders.mjs | 28 ++++++++++++++++-- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch index 081b9eefc..7dd0176dc 100644 --- a/src/browser/components/tabbrowser/content/tabbrowser-js.patch +++ b/src/browser/components/tabbrowser/content/tabbrowser-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js -index d80a66a01002e78a9c65545d08fe786328ddf124..4adabe030bfb322db1a9c95f71eb1adc58e2af77 100644 +index d80a66a01002e78a9c65545d08fe786328ddf124..e644946134c7e5a4b3232f674880eab596d5fa15 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js @@ -422,15 +422,60 @@ @@ -391,10 +391,10 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..4adabe030bfb322db1a9c95f71eb1adc + gZenWorkspaces._initialTab._shouldRemove = true; + } + } -+ } + } + else { + gZenWorkspaces._tabToRemoveForEmpty = this.selectedTab; - } ++ } + this._hasAlreadyInitializedZenSessionStore = true; if (tabs.length > 1 || !tabs[0].selected) { @@ -651,7 +651,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..4adabe030bfb322db1a9c95f71eb1adc if (neighbor && this.isTab(element) && tabIndex > element._tPos) { neighbor.after(element); } else { -@@ -6136,22 +6274,23 @@ +@@ -6136,23 +6274,28 @@ #moveTabNextTo(element, targetElement, moveBefore = false, metricsContext) { if (this.isTabGroupLabel(targetElement)) { targetElement = targetElement.group; @@ -679,9 +679,14 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..4adabe030bfb322db1a9c95f71eb1adc - targetElement = this.tabs[this.pinnedTabCount - 1]; + targetElement = this.tabsWithoutGlance[this.pinnedTabCount - 1]; moveBefore = false; ++ if (!this.visibleTabs.includes(targetElement)) { ++ targetElement = gZenWorkspaces.pinnedTabsContainer.querySelector('.pinned-tabs-container-separator') ++ moveBefore = true; ++ } } else if (!element.pinned && targetElement && targetElement.pinned) { // If the caller asks to move an unpinned element next to a pinned -@@ -6165,14 +6304,34 @@ + // tab, move the unpinned element to be the first unpinned element +@@ -6165,14 +6308,34 @@ // move the tab group right before the first unpinned tab. // 4. Moving a tab group and the first unpinned tab is grouped: // move the tab group right before the first unpinned tab's tab group. @@ -717,7 +722,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..4adabe030bfb322db1a9c95f71eb1adc element.pinned ? this.tabContainer.pinnedTabsContainer : this.tabContainer; -@@ -6181,7 +6340,7 @@ +@@ -6181,7 +6344,7 @@ element, () => { if (moveBefore) { @@ -726,7 +731,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..4adabe030bfb322db1a9c95f71eb1adc } else if (targetElement) { targetElement.after(element); } else { -@@ -6227,10 +6386,10 @@ +@@ -6227,10 +6390,10 @@ * @param {TabMetricsContext} [metricsContext] */ moveTabToGroup(aTab, aGroup, metricsContext) { @@ -739,7 +744,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..4adabe030bfb322db1a9c95f71eb1adc return; } if (aTab.group && aTab.group.id === aGroup.id) { -@@ -6324,6 +6483,10 @@ +@@ -6324,6 +6487,10 @@ moveActionCallback(); @@ -750,7 +755,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..4adabe030bfb322db1a9c95f71eb1adc // Clear tabs cache after moving nodes because the order of tabs may have // changed. this.tabContainer._invalidateCachedTabs(); -@@ -7221,7 +7384,7 @@ +@@ -7221,7 +7388,7 @@ // preventDefault(). It will still raise the window if appropriate. break; } @@ -759,7 +764,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..4adabe030bfb322db1a9c95f71eb1adc window.focus(); aEvent.preventDefault(); break; -@@ -8166,6 +8329,7 @@ +@@ -8166,6 +8333,7 @@ aWebProgress.isTopLevel ) { this.mTab.setAttribute("busy", "true"); @@ -767,7 +772,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..4adabe030bfb322db1a9c95f71eb1adc gBrowser._tabAttrModified(this.mTab, ["busy"]); this.mTab._notselectedsinceload = !this.mTab.selected; } -@@ -9157,7 +9321,7 @@ var TabContextMenu = { +@@ -9157,7 +9325,7 @@ var TabContextMenu = { ); contextUnpinSelectedTabs.hidden = !this.contextTab.pinned || !this.multiselected; @@ -776,7 +781,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..4adabe030bfb322db1a9c95f71eb1adc // Build Ask Chat items TabContextMenu.GenAI.buildTabMenu( document.getElementById("context_askChat"), -@@ -9476,6 +9640,7 @@ var TabContextMenu = { +@@ -9476,6 +9644,7 @@ var TabContextMenu = { ) ); } else { diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs index f37f5fa77..395d7730b 100644 --- a/src/zen/folders/ZenFolders.mjs +++ b/src/zen/folders/ZenFolders.mjs @@ -231,7 +231,7 @@ } if (group.collapsed && !this._sessionRestoring) { - group.collapsed = false; + group.collapsed = group.hasAttribute('has-active'); } } @@ -618,7 +618,31 @@ let activeGroup = folders.get(group?.id); // If group has active tabs, we need to update the indentation if (activeGroup) { - this.on_TabGroupCollapse({ target: activeGroup }); + const activeGroupStart = activeGroup.querySelector('.zen-tab-group-start'); + const selectedTabs = activeGroup.activeTabs; + if (selectedTabs.length > 0) { + const selectedItem = selectedTabs[0]; + const isSplitView = selectedItem.group?.hasAttribute('split-view-group'); + const selectedContainer = isSplitView ? selectedItem.group : selectedItem; + + const heightUntilSelected = + window.windowUtils.getBoundsWithoutFlushing(selectedContainer).top - + window.windowUtils.getBoundsWithoutFlushing(activeGroupStart).bottom; + + const adjustedHeight = isSplitView + ? heightUntilSelected - 2 + : heightUntilSelected; + + animations.push( + gZenUIManager.motion.animate( + activeGroupStart, + { + marginTop: -(adjustedHeight + 4 * (selectedTabs.length === 0 ? 1 : 0)), + }, + { duration: 0, ease: 'linear' } + ) + ); + } this.setFolderIndentation([tab], activeGroup, /* for collapse = */ true); } else { // Since the folder is now expanded, we should remove active attribute From 429f74a7c7ca32eecfd815b6fde1d96b134bb429 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Thu, 28 Aug 2025 01:27:22 +0200 Subject: [PATCH 03/55] feat: Set the style directly instead of using motion, b=no-bug, c=folders --- src/zen/folders/ZenFolders.mjs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs index 395d7730b..2e02fcb5a 100644 --- a/src/zen/folders/ZenFolders.mjs +++ b/src/zen/folders/ZenFolders.mjs @@ -632,16 +632,8 @@ const adjustedHeight = isSplitView ? heightUntilSelected - 2 : heightUntilSelected; - - animations.push( - gZenUIManager.motion.animate( - activeGroupStart, - { - marginTop: -(adjustedHeight + 4 * (selectedTabs.length === 0 ? 1 : 0)), - }, - { duration: 0, ease: 'linear' } - ) - ); + activeGroupStart.style.marginTop = + -(adjustedHeight + 4 * (selectedTabs.length === 0 ? 1 : 0)) + 'px'; } this.setFolderIndentation([tab], activeGroup, /* for collapse = */ true); } else { From 005cdf53bdfff044bb2776ba633a7658e8e83b60 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Thu, 28 Aug 2025 11:57:34 +0200 Subject: [PATCH 04/55] fix: Dont restore pinned tabs for deferred session stores, b=no-bug, c=no-component --- .../sessionstore/SessionStore-sys-mjs.patch | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/browser/components/sessionstore/SessionStore-sys-mjs.patch b/src/browser/components/sessionstore/SessionStore-sys-mjs.patch index 364ec6ace..e1686a69f 100644 --- a/src/browser/components/sessionstore/SessionStore-sys-mjs.patch +++ b/src/browser/components/sessionstore/SessionStore-sys-mjs.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs -index e954a8df26ed84731b08b151f90a758206946582..5b8013c71c6b50579668d16a5f7d5a82b5d43e4d 100644 +index e954a8df26ed84731b08b151f90a758206946582..64ab1cce10324d574b49fe861975188c292756c3 100644 --- a/browser/components/sessionstore/SessionStore.sys.mjs +++ b/browser/components/sessionstore/SessionStore.sys.mjs @@ -2135,7 +2135,6 @@ var SessionStoreInternal = { @@ -143,3 +143,12 @@ index e954a8df26ed84731b08b151f90a758206946582..5b8013c71c6b50579668d16a5f7d5a82 if (tabData.pinned) { tabbrowser.pinTab(tab); +@@ -7266,7 +7289,7 @@ var SessionStoreInternal = { + + let groupsToSave = new Map(); + for (let tIndex = 0; tIndex < window.tabs.length; ) { +- if (window.tabs[tIndex].pinned) { ++ if (window.tabs[tIndex].pinned && false) { + // Adjust window.selected + if (tIndex + 1 < window.selected) { + window.selected -= 1; From 5e790efdceee4b14c44bb6efb7414270deaa3d4f Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Thu, 28 Aug 2025 12:41:43 +0200 Subject: [PATCH 05/55] fix: Fixed settings page not starting up, b=no-bug, c=no-component --- .../preferences/main-inc-xhtml.patch | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/browser/components/preferences/main-inc-xhtml.patch b/src/browser/components/preferences/main-inc-xhtml.patch index b4318e171..c3c8af6ce 100644 --- a/src/browser/components/preferences/main-inc-xhtml.patch +++ b/src/browser/components/preferences/main-inc-xhtml.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/preferences/main.inc.xhtml b/browser/components/preferences/main.inc.xhtml -index f9129fb171362e81369056923bf25acbb87d2ad8..924bcd2cd66a5dfcf9c45aac0c63cd0257c21a2c 100644 +index 66ce978d9b022285dea67fdb75b3c005adb05d9b..db61587570ca18403a82ea6796a756d403cc207e 100644 --- a/browser/components/preferences/main.inc.xhtml +++ b/browser/components/preferences/main.inc.xhtml @@ -29,6 +29,9 @@ @@ -12,23 +12,17 @@ index f9129fb171362e81369056923bf25acbb87d2ad8..924bcd2cd66a5dfcf9c45aac0c63cd02 #ifdef XP_WIN diff --git a/src/zen/folders/zen-folders.css b/src/zen/folders/zen-folders.css index c55a40856..d777ce29a 100644 --- a/src/zen/folders/zen-folders.css +++ b/src/zen/folders/zen-folders.css @@ -392,6 +392,7 @@ zen-folder { background-color: transparent; border: none !important; outline: none !important; + flex: 1; } #zen-folder-tabs-list { From 73c5bc61fcbf3fd0a1dad2e1f396825184271c1c Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sat, 30 Aug 2025 14:08:04 +0200 Subject: [PATCH 23/55] fix: Fixed creating too many unused new tab in task manager, b=closes #10145, c=folders --- src/zen/folders/ZenFolders.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs index ba78651f0..5d34419d6 100644 --- a/src/zen/folders/ZenFolders.mjs +++ b/src/zen/folders/ZenFolders.mjs @@ -817,6 +817,7 @@ pinned: true, triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal(), _forZenEmptyTab: true, + createLazyBrowser: true, }); tabs = [emptyTab, ...filteredTabs]; From 0a8ebf9950be6e221d94dc39335e913c91cc53ad Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sat, 30 Aug 2025 14:12:42 +0200 Subject: [PATCH 24/55] fix: Fixed menu color turning gray, b=closes #10110, c=common --- src/zen/common/styles/zen-theme.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zen/common/styles/zen-theme.css b/src/zen/common/styles/zen-theme.css index 806ec8c33..db66aed47 100644 --- a/src/zen/common/styles/zen-theme.css +++ b/src/zen/common/styles/zen-theme.css @@ -44,7 +44,7 @@ var(--zen-colors-tertiary) 99% ); - --zen-dialog-background: light-dark(rgb(219, 219, 219), rgb(31, 31, 31)); + --zen-dialog-background: light-dark(rgb(244, 244, 244), rgb(31, 31, 31)); --zen-urlbar-background: color-mix(in srgb, var(--zen-primary-color) 3%, #f4f4f4 97%); --zen-secondary-btn-color: var(--zen-colors-primary-foreground); From bd4f5cee31f6a91d5f736ded54359cb6cabc1816 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sat, 30 Aug 2025 14:15:26 +0200 Subject: [PATCH 25/55] fix: Fixed CTRL + arrow does not move cursor when renaming workspace, b=closes #10115, c=tabs --- .../tabbrowser/content/tabs-js.patch | 108 ++++++++++-------- 1 file changed, 59 insertions(+), 49 deletions(-) diff --git a/src/browser/components/tabbrowser/content/tabs-js.patch b/src/browser/components/tabbrowser/content/tabs-js.patch index d5a7d8e94..d733376ba 100644 --- a/src/browser/components/tabbrowser/content/tabs-js.patch +++ b/src/browser/components/tabbrowser/content/tabs-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js -index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c3b65f80b 100644 +index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3f397fc45 100644 --- a/browser/components/tabbrowser/content/tabs.js +++ b/browser/components/tabbrowser/content/tabs.js @@ -332,7 +332,7 @@ @@ -19,7 +19,17 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c } else if ( event.originalTarget.closest("scrollbox") && !Services.prefs.getBoolPref( -@@ -686,7 +685,7 @@ +@@ -449,6 +448,9 @@ + } + + on_keydown(event) { ++ if (document.documentElement.getAttribute('zen-renaming-tab') === 'true') { ++ return; ++ } + let { altKey, shiftKey } = event; + let [accel, nonAccel] = + AppConstants.platform == "macosx" +@@ -686,7 +688,7 @@ if (this.#isContainerVerticalPinnedGrid(tab)) { // In expanded vertical mode, the max number of pinned tabs per row is dynamic // Set this before adjusting dragged tab's position @@ -28,7 +38,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c let tabsPerRow = 0; let position = RTL_UI ? window.windowUtils.getBoundsWithoutFlushing( -@@ -851,7 +850,7 @@ +@@ -851,7 +853,7 @@ let dropEffect = this.getDropEffectForTabDrag(event); let isMovingInTabStrip = !fromTabList && dropEffect == "move"; let collapseTabGroupDuringDrag = @@ -37,7 +47,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c tab._dragData = { offsetX: this.verticalMode -@@ -861,7 +860,7 @@ +@@ -861,7 +863,7 @@ ? event.screenY - window.screenY - tabOffset : event.screenY - window.screenY, scrollPos: @@ -46,7 +56,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c ? this.pinnedTabsContainer.scrollPosition : this.arrowScrollbox.scrollPosition, screenX: event.screenX, -@@ -886,6 +885,7 @@ +@@ -886,6 +888,7 @@ if (tab.multiselected) { this.#moveTogetherSelectedTabs(tab); } else if (collapseTabGroupDuringDrag) { @@ -54,7 +64,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c tab.group.collapsed = true; } } -@@ -932,6 +932,10 @@ +@@ -932,6 +935,10 @@ } let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0); @@ -65,7 +75,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c if ( (dropEffect == "move" || dropEffect == "copy") && document == draggedTab.ownerDocument && -@@ -1059,7 +1063,9 @@ +@@ -1059,7 +1066,9 @@ isTabGroupLabel(draggedTab) && draggedTab._dragData?.expandGroupOnDrop ) { @@ -76,7 +86,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c } } -@@ -1095,6 +1101,18 @@ +@@ -1095,6 +1104,18 @@ this._tabDropIndicator.hidden = true; event.stopPropagation(); @@ -95,7 +105,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c if (draggedTab && dropEffect == "copy") { let duplicatedDraggedTab; let duplicatedTabs = []; -@@ -1119,8 +1137,9 @@ +@@ -1119,8 +1140,9 @@ let translateOffsetY = oldTranslateY % tabHeight; let newTranslateX = oldTranslateX - translateOffsetX; let newTranslateY = oldTranslateY - translateOffsetY; @@ -107,7 +117,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c if (this.#isContainerVerticalPinnedGrid(draggedTab)) { // Update both translate axis for pinned vertical expanded tabs -@@ -1136,8 +1155,8 @@ +@@ -1136,8 +1158,8 @@ } } else { let tabs = this.ariaFocusableItems.slice( @@ -118,7 +128,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c ); let size = this.verticalMode ? "height" : "width"; let screenAxis = this.verticalMode ? "screenY" : "screenX"; -@@ -1178,11 +1197,9 @@ +@@ -1178,11 +1200,9 @@ } let shouldPin = @@ -132,7 +142,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c let shouldTranslate = !gReduceMotion && !shouldCreateGroupOnDrop && -@@ -1195,6 +1212,7 @@ +@@ -1195,6 +1215,7 @@ (oldTranslateY && oldTranslateY != newTranslateY); } else if (this.verticalMode) { shouldTranslate &&= oldTranslateY && oldTranslateY != newTranslateY; @@ -140,7 +150,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c } else { shouldTranslate &&= oldTranslateX && oldTranslateX != newTranslateX; } -@@ -1376,6 +1394,7 @@ +@@ -1376,6 +1397,7 @@ let nextItem = this.ariaFocusableItems[newIndex]; let tabGroup = isTab(nextItem) && nextItem.group; @@ -148,7 +158,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c gBrowser.loadTabs(urls, { inBackground, replace, -@@ -1408,6 +1427,17 @@ +@@ -1408,6 +1430,17 @@ this.finishMoveTogetherSelectedTabs(draggedTab); this.finishAnimateTabMove(); @@ -166,7 +176,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c this.#expandGroupOnDrop(draggedTab); this.#resetTabsAfterDrop(draggedTab.ownerDocument); -@@ -1577,7 +1607,6 @@ +@@ -1577,7 +1610,6 @@ this.toggleAttribute("overflow", true); this._updateCloseButtons(); @@ -174,7 +184,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c document .getElementById("tab-preview-panel") -@@ -1635,7 +1664,7 @@ +@@ -1635,7 +1667,7 @@ } get newTabButton() { @@ -183,7 +193,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c } get verticalMode() { -@@ -1651,6 +1680,7 @@ +@@ -1651,6 +1683,7 @@ } get overflowing() { @@ -191,7 +201,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c return this.hasAttribute("overflow"); } -@@ -1659,26 +1689,54 @@ +@@ -1659,26 +1692,54 @@ if (this.#allTabs) { return this.#allTabs; } @@ -253,7 +263,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c } /** -@@ -1745,32 +1803,27 @@ +@@ -1745,32 +1806,27 @@ let elementIndex = 0; @@ -295,7 +305,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c return this.#focusableItems; } -@@ -1778,6 +1831,7 @@ +@@ -1778,6 +1834,7 @@ _invalidateCachedTabs() { this.#allTabs = null; this._invalidateCachedVisibleTabs(); @@ -303,7 +313,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c } _invalidateCachedVisibleTabs() { -@@ -1793,8 +1847,8 @@ +@@ -1793,8 +1850,8 @@ #isContainerVerticalPinnedGrid(tab) { return ( this.verticalMode && @@ -314,7 +324,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c !this.expandOnHover ); } -@@ -1810,7 +1864,7 @@ +@@ -1810,7 +1867,7 @@ if (node == null) { // We have a container for non-tab elements at the end of the scrollbox. @@ -323,7 +333,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c } node.before(tab); -@@ -1905,7 +1959,7 @@ +@@ -1905,7 +1962,7 @@ // There are separate "new tab" buttons for horizontal tabs toolbar, vertical tabs and // for when the tab strip is overflowed (which is shared by vertical and horizontal tabs); // Attach the long click popup to all of them. @@ -332,7 +342,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c const newTab2 = this.newTabButton; const newTabVertical = document.getElementById( "vertical-tabs-newtab-button" -@@ -2000,10 +2054,12 @@ +@@ -2000,10 +2057,12 @@ _handleTabSelect(aInstant) { let selectedTab = this.selectedItem; @@ -345,7 +355,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c selectedTab._notselectedsinceload = false; } -@@ -2140,6 +2196,16 @@ +@@ -2140,6 +2199,16 @@ when the tab is first selected to be dragged. */ #updateTabStylesOnDrag(tab) { @@ -362,7 +372,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c let isPinned = tab.pinned; let numPinned = gBrowser.pinnedTabCount; let allTabs = this.ariaFocusableItems; -@@ -2398,7 +2464,7 @@ +@@ -2398,7 +2467,7 @@ return; } @@ -371,7 +381,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c let directionX = screenX > dragData.animLastScreenX; let directionY = screenY > dragData.animLastScreenY; -@@ -2407,6 +2473,8 @@ +@@ -2407,6 +2476,8 @@ let { width: tabWidth, height: tabHeight } = draggedTab.getBoundingClientRect(); @@ -380,7 +390,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c let shiftSizeX = tabWidth * movingTabs.length; let shiftSizeY = tabHeight; dragData.tabWidth = tabWidth; -@@ -2443,8 +2511,8 @@ +@@ -2443,8 +2514,8 @@ let lastBoundX = lastTabInRow.screenX + lastTabInRow.getBoundingClientRect().width - @@ -391,7 +401,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c translateX = Math.min(Math.max(translateX, firstBoundX), lastBoundX); translateY = Math.min(Math.max(translateY, firstBoundY), lastBoundY); -@@ -2560,7 +2628,7 @@ +@@ -2560,7 +2631,7 @@ } dragData.animDropElementIndex = newIndex; @@ -400,7 +410,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c dragData.dropBefore = newIndex < tabs.length; // Shift background tabs to leave a gap where the dragged tab -@@ -2593,13 +2661,18 @@ +@@ -2593,13 +2664,18 @@ this.#clearDragOverCreateGroupTimer(); @@ -423,7 +433,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c if (this.#rtlMode) { tabs.reverse(); -@@ -2610,7 +2683,7 @@ +@@ -2610,7 +2686,7 @@ let screenAxis = this.verticalMode ? "screenY" : "screenX"; let size = this.verticalMode ? "height" : "width"; let translateAxis = this.verticalMode ? "translateY" : "translateX"; @@ -432,7 +442,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c let translateX = event.screenX - dragData.screenX; let translateY = event.screenY - dragData.screenY; -@@ -2620,10 +2693,16 @@ +@@ -2620,10 +2696,16 @@ dragData.translateY = translateY; // Move the dragged tab based on the mouse position. @@ -451,7 +461,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c let endEdge = ele => ele[screenAxis] + bounds(ele)[size]; let lastMovingTabScreen = endEdge(lastMovingTab); let firstMovingTabScreen = firstMovingTab[screenAxis]; -@@ -2632,6 +2711,7 @@ +@@ -2632,6 +2714,7 @@ // Constrain the range over which the moving tabs can move between the first and last tab let firstBound = firstTab[screenAxis] - firstMovingTabScreen; let lastBound = endEdge(lastTab) - lastMovingTabScreen; @@ -459,7 +469,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c // Center the tab under the cursor if the tab is not under the cursor while dragging if ( -@@ -2649,6 +2729,9 @@ +@@ -2649,6 +2732,9 @@ // Shift the `.tab-group-label-container` to shift the label element. item = item.parentElement; } @@ -469,7 +479,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c item.style.transform = `${translateAxis}(${translate}px)`; } -@@ -2786,6 +2869,9 @@ +@@ -2786,6 +2872,9 @@ break; } let element = tabs[mid]; @@ -479,7 +489,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c let elementForSize = isTabGroupLabel(element) ? element.parentElement : element; -@@ -2805,6 +2891,8 @@ +@@ -2805,6 +2894,8 @@ }; let dropElement = getOverlappedElement(); @@ -488,7 +498,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c let newDropElementIndex; if (dropElement) { -@@ -2869,7 +2957,10 @@ +@@ -2869,7 +2960,10 @@ let shouldCreateGroupOnDrop; let dropBefore; if (dropElement) { @@ -500,7 +510,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c ? dropElement.parentElement : dropElement; -@@ -2889,7 +2980,7 @@ +@@ -2889,7 +2983,7 @@ ? Services.prefs.getIntPref( "browser.tabs.dragDrop.moveOverThresholdPercent" ) / 100 @@ -509,7 +519,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c moveOverThreshold = Math.min(1, Math.max(0, moveOverThreshold)); let shouldMoveOver = overlapPercent > moveOverThreshold; if (logicalForward && shouldMoveOver) { -@@ -2921,44 +3012,21 @@ +@@ -2921,44 +3015,21 @@ // If dragging a group over another group, don't make it look like it is // possible to drop the dragged group inside the other group. @@ -559,7 +569,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c // When dragging tab(s) over an ungrouped tab, signal to the user // that dropping the tab(s) will create a new tab group. shouldCreateGroupOnDrop = -@@ -2968,12 +3036,6 @@ +@@ -2968,12 +3039,6 @@ overlapPercent > dragOverGroupingThreshold; if (shouldCreateGroupOnDrop) { @@ -572,7 +582,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c } else { this.removeAttribute("movingtab-createGroup"); document -@@ -3000,19 +3062,14 @@ +@@ -3000,19 +3065,14 @@ dropElement = dropElementGroup; colorCode = undefined; } else if (isTabGroupLabel(dropElement)) { @@ -600,7 +610,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c } this.#setDragOverGroupColor(colorCode); this.toggleAttribute("movingtab-ungroup", !colorCode); -@@ -3030,19 +3087,28 @@ +@@ -3030,19 +3090,28 @@ dragData.dropElement = dropElement; dragData.dropBefore = dropBefore; dragData.animDropElementIndex = newDropElementIndex; @@ -631,7 +641,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c } item.style.transform = transform; } -@@ -3095,12 +3161,14 @@ +@@ -3095,12 +3164,14 @@ ); } @@ -648,7 +658,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c for (let item of this.ariaFocusableItems) { if (isTabGroupLabel(item)) { -@@ -3108,6 +3176,18 @@ +@@ -3108,6 +3179,18 @@ item = item.parentElement; } item.style.transform = ""; @@ -667,7 +677,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c item.removeAttribute("dragover-createGroup"); } this.removeAttribute("movingtab-createGroup"); -@@ -3129,16 +3209,15 @@ +@@ -3129,16 +3212,15 @@ tab.style.left = ""; tab.style.top = ""; tab.style.maxWidth = ""; @@ -686,7 +696,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c } let periphery = draggedTabDocument.getElementById( "tabbrowser-arrowscrollbox-periphery" -@@ -3211,7 +3290,7 @@ +@@ -3211,7 +3293,7 @@ let postTransitionCleanup = () => { movingTab._moveTogetherSelectedTabsData.animate = false; }; @@ -695,7 +705,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c postTransitionCleanup(); } else { let onTransitionEnd = transitionendEvent => { -@@ -3384,7 +3463,7 @@ +@@ -3384,7 +3466,7 @@ } _notifyBackgroundTab(aTab) { @@ -704,7 +714,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c return; } -@@ -3493,7 +3572,10 @@ +@@ -3493,7 +3575,10 @@ #getDragTarget(event, { ignoreSides = false } = {}) { let { target } = event; while (target) { @@ -716,7 +726,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..016d58789918235cc3a41f33ee402c2c break; } target = target.parentNode; -@@ -3510,6 +3592,9 @@ +@@ -3510,6 +3595,9 @@ return null; } } From 07381c9a7aa67aa884efab81aecae27b0b3d14c0 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sat, 30 Aug 2025 14:33:21 +0200 Subject: [PATCH 26/55] feat: Added pref for context menu refresh, b=no-bug, c=common, tabs --- prefs/view.yaml | 3 +++ src/zen/common/ZenUIManager.mjs | 3 +++ src/zen/tabs/ZenPinnedTabManager.mjs | 4 ++++ surfer.json | 2 +- 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/prefs/view.yaml b/prefs/view.yaml index e1dbee9d8..340769ea6 100644 --- a/prefs/view.yaml +++ b/prefs/view.yaml @@ -51,3 +51,6 @@ - name: zen.view.drag-and-drop.drop-inside-lower-threshold value: 30 + +- name: zen.view.context-menu.refresh + value: false diff --git a/src/zen/common/ZenUIManager.mjs b/src/zen/common/ZenUIManager.mjs index 73daab077..2c89216d7 100644 --- a/src/zen/common/ZenUIManager.mjs +++ b/src/zen/common/ZenUIManager.mjs @@ -78,6 +78,9 @@ var gZenUIManager = { }, _debloatContextMenus() { + if (!Services.prefs.getBoolPref('zen.view.context-menu.refresh', false)) { + return; + } const contextMenusToClean = [ // Remove the 'new tab below' context menu. // reason: It doesn't properly work with zen and it's philosophy of not having diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs index 83b16e045..dd4e92747 100644 --- a/src/zen/tabs/ZenPinnedTabManager.mjs +++ b/src/zen/tabs/ZenPinnedTabManager.mjs @@ -805,6 +805,10 @@ if (selectedTab.group?.hasAttribute('split-view-group')) { tabsToUnload = selectedTab.group.tabs; } + const allAreUnloaded = tabsToUnload.every((tab) => tab.hasAttribute('pending')); + if (allAreUnloaded) { + return await this._onCloseTabShortcut(event, selectedTab, { behavior: 'close' }); + } await gBrowser.explicitUnloadTabs(tabsToUnload); selectedTab.removeAttribute('discarded'); } diff --git a/surfer.json b/surfer.json index bb552b237..6a4101fce 100644 --- a/surfer.json +++ b/surfer.json @@ -19,7 +19,7 @@ "brandShortName": "Zen", "brandFullName": "Zen Browser", "release": { - "displayVersion": "1.15.2b", + "displayVersion": "1.15.3b", "github": { "repo": "zen-browser/desktop" }, From f9452241a3153a71c3e06e0057cb33808d139664 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sat, 30 Aug 2025 14:33:36 +0200 Subject: [PATCH 27/55] New Crowdin updates, p=#10101 --- .../ca/browser/browser/zen-vertical-tabs.ftl | 2 +- locales/cs/browser/browser/zen-folders.ftl | 4 +- .../cs/browser/browser/zen-vertical-tabs.ftl | 2 +- .../de/browser/browser/zen-vertical-tabs.ftl | 2 +- .../browser/browser/zen-vertical-tabs.ftl | 2 +- .../browser/preferences/zen-preferences.ftl | 74 +++++++++---------- locales/et/browser/browser/zen-folders.ftl | 22 +++--- locales/et/browser/browser/zen-general.ftl | 40 +++++----- .../et/browser/browser/zen-vertical-tabs.ftl | 16 ++-- locales/et/browser/browser/zen-welcome.ftl | 38 +++++----- locales/et/browser/browser/zen-workspaces.ftl | 42 +++++------ .../fr/browser/browser/zen-vertical-tabs.ftl | 2 +- .../browser/browser/zen-vertical-tabs.ftl | 2 +- .../hu/browser/browser/zen-vertical-tabs.ftl | 2 +- .../id/browser/browser/zen-vertical-tabs.ftl | 2 +- locales/lt/browser/browser/zen-folders.ftl | 4 +- .../lt/browser/browser/zen-vertical-tabs.ftl | 2 +- 17 files changed, 129 insertions(+), 129 deletions(-) diff --git a/locales/ca/browser/browser/zen-vertical-tabs.ftl b/locales/ca/browser/browser/zen-vertical-tabs.ftl index 7eb0e66d0..788cf2cd0 100644 --- a/locales/ca/browser/browser/zen-vertical-tabs.ftl +++ b/locales/ca/browser/browser/zen-vertical-tabs.ftl @@ -15,7 +15,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = Amaga les dues .accesskey = H zen-toolbar-context-new-folder = - .label = New Folder + .label = Carpeta nova .accesskey = N sidebar-zen-expand = .label = Expandeix la barra lateral diff --git a/locales/cs/browser/browser/zen-folders.ftl b/locales/cs/browser/browser/zen-folders.ftl index 0e4968005..fff1aa18c 100644 --- a/locales/cs/browser/browser/zen-folders.ftl +++ b/locales/cs/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Změnit ikonu zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Uspat všechny panely v této složce zen-folders-unload-folder = - .label = Unload All Tabs + .label = Uspat všechny panely zen-folders-search-no-results = Žádný panel neodpovídá tomuto hledání 🤔 diff --git a/locales/cs/browser/browser/zen-vertical-tabs.ftl b/locales/cs/browser/browser/zen-vertical-tabs.ftl index d67174c66..11cf7a77e 100644 --- a/locales/cs/browser/browser/zen-vertical-tabs.ftl +++ b/locales/cs/browser/browser/zen-vertical-tabs.ftl @@ -15,7 +15,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = Skrýt obojí .accesskey = H zen-toolbar-context-new-folder = - .label = New Folder + .label = Nová složka .accesskey = N sidebar-zen-expand = .label = Zvětšit boční panel diff --git a/locales/de/browser/browser/zen-vertical-tabs.ftl b/locales/de/browser/browser/zen-vertical-tabs.ftl index e567107cb..73519fce6 100644 --- a/locales/de/browser/browser/zen-vertical-tabs.ftl +++ b/locales/de/browser/browser/zen-vertical-tabs.ftl @@ -15,7 +15,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = Beide ausblenden .accesskey = H zen-toolbar-context-new-folder = - .label = New Folder + .label = Neuer Ordner .accesskey = N sidebar-zen-expand = .label = Seitenleiste erweitern diff --git a/locales/es-ES/browser/browser/zen-vertical-tabs.ftl b/locales/es-ES/browser/browser/zen-vertical-tabs.ftl index 5283399cb..9eda5b098 100644 --- a/locales/es-ES/browser/browser/zen-vertical-tabs.ftl +++ b/locales/es-ES/browser/browser/zen-vertical-tabs.ftl @@ -15,7 +15,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = Ocultar ambas .accesskey = H zen-toolbar-context-new-folder = - .label = New Folder + .label = Nueva carpeta .accesskey = N sidebar-zen-expand = .label = Expandir barra lateral diff --git a/locales/et/browser/browser/preferences/zen-preferences.ftl b/locales/et/browser/browser/preferences/zen-preferences.ftl index 550d1cd7e..ece42a043 100644 --- a/locales/et/browser/browser/preferences/zen-preferences.ftl +++ b/locales/et/browser/browser/preferences/zen-preferences.ftl @@ -47,7 +47,7 @@ zen-look-and-feel-compact-toolbar-themed = zen-look-and-feel-compact-sidebar-themed = .label = Kasuta kompaktsel külgribal teema poolt küljendatud tausta zen-workspace-continue-where-left-off = - .label = Continue where you left off + .label = Jätka sealt, kus eelmine kord pooleli jäi pane-zen-pinned-tab-manager-title = Püsikaardid zen-pinned-tab-manager-header = Püsikaartide üldised sätted zen-pinned-tab-manager-description = Halda püsikaartide täiendavat käitumist @@ -94,29 +94,29 @@ zen-vertical-tabs-expand-tabs-header = Kuidas kaarte laiendatakse zen-vertical-tabs-expand-tabs-description = Vali kuidas laiendatakse kaarte külgribal zen-theme-marketplace-header = Zen Mods zen-theme-disable-all-enabled = - .title = Keela kõik muudatused + .title = Keela kõik mods-id zen-theme-disable-all-disabled = .title = Luba kõik muudatused -zen-theme-marketplace-description = Otsi ja paigalda muudatusi veebipoest. +zen-theme-marketplace-description = Otsi ja paigalda mods-e veebipoest. zen-theme-marketplace-remove-button = - .label = Eemalda muudatus + .label = Eemalda mod zen-theme-marketplace-check-for-updates-button = .label = Kontrolli uuendusi zen-theme-marketplace-import-button = - .label = Import mods + .label = Impordi Mods-id zen-theme-marketplace-export-button = - .label = Export Mods -zen-theme-marketplace-import-success = Mods imported successfully -zen-theme-marketplace-import-failure = There was an error importing the mods -zen-theme-marketplace-export-success = Mods exported successfully -zen-theme-marketplace-export-failure = There was an error exporting the mods -zen-theme-marketplace-updates-success = Muudatused on edukalt uuendatud -zen-theme-marketplace-updates-failure = Couldn't find any updates! + .label = Ekspordi Mods-id +zen-theme-marketplace-import-success = Mods-id on edukalt imporditud +zen-theme-marketplace-import-failure = Mods-ide importimisel tekkis viga +zen-theme-marketplace-export-success = Mods-id on edukalt eksporditud +zen-theme-marketplace-export-failure = Mods-ide eksportimisel tekkis viga +zen-theme-marketplace-updates-success = Mods-id on edukalt uuendatud +zen-theme-marketplace-updates-failure = Uuendusi ei leitud! zen-theme-marketplace-toggle-enabled-button = - .title = Keela muudatus + .title = Keela mod zen-theme-marketplace-toggle-disabled-button = - .title = Luba muudatus -zen-theme-marketplace-remove-confirmation = Oled sa kindel, et soovid eemaldada selle muudatuse? + .title = Luba mod +zen-theme-marketplace-remove-confirmation = Oled sa kindel, et soovid eemaldada selle mod-i? zen-theme-marketplace-close-modal = Sulge zen-theme-marketplace-theme-header-title = .title = CSS selektor: { $name } @@ -126,7 +126,7 @@ zen-theme-marketplace-input-default-placeholder = .placeholder = Sisesta midagi... pane-zen-marketplace-title = Zen Mods zen-themes-auto-update = - .label = Automatically update installed mods on startup + .label = Uuenda paigaldatud mods-e brauseri avamisel automaatselt zen-settings-workspaces-force-container-tabs-to-workspace = .label = Konteineri kaartide avamisel lülitu tööruumi kuhu konteiner on vaikimisi määratud zen-theme-marketplace-link = Külasta veebipoodi @@ -171,7 +171,7 @@ zenCKSOption-group-zen-compact-mode = Kompaktne režiim zenCKSOption-group-zen-workspace = Tööruumid zenCKSOption-group-zen-other = Muud Zeni funktsioonid zenCKSOption-group-zen-split-view = Jaotatud vaade -zenCKSOption-group-devTools = Developer Tools +zenCKSOption-group-devTools = Arendaja tööriistad zen-key-quick-restart = Kiirtaaskävitus zen-window-new-shortcut = Uus aken zen-tab-new-shortcut = Uus kaart @@ -185,7 +185,7 @@ zen-text-action-redo-shortcut = Tee uuesti zen-text-action-cut-shortcut = Lõika zen-text-action-copy-shortcut = Kopeeri zen-text-action-copy-url-shortcut = Kopeeri praegune URL -zen-text-action-copy-url-markdown-shortcut = Copy current URL as Markdown +zen-text-action-copy-url-markdown-shortcut = Kopeeri praegune URL Markdown-i märgendina zen-text-action-paste-shortcut = Aseta zen-text-action-select-all-shortcut = Vali kõik zen-text-action-delete-shortcut = Kustuta @@ -220,9 +220,9 @@ zen-nav-fwd-shortcut-alt = Navigeeri edasi (alternatiivne) zen-history-show-all-shortcut = Näita kogu ajalugu zen-key-enter-full-screen = Täisekraanirežiim zen-key-exit-full-screen = Välju täisekraanirežiimist -zen-ai-chatbot-sidebar-shortcut = Toggle AI Chatbot Sidebar -zen-key-inspector-mac = Toggle Inspector (Mac) -zen-toggle-sidebar-shortcut = Toggle Firefox Sidebar +zen-ai-chatbot-sidebar-shortcut = Lülita AI vestlusroboti külgriba sisse/välja +zen-key-inspector-mac = Lülita inspekteerija sisse/välja (Mac) +zen-toggle-sidebar-shortcut = Lülita Firefoxi külgriba sisse/välja zen-reader-mode-toggle-shortcut-other = Lülita lugejarežiim sisse/välja zen-picture-in-picture-toggle-shortcut = Lülita pilt-pildis sisse/välja zen-nav-reload-shortcut-2 = Laadi leht uuesti @@ -239,9 +239,9 @@ zen-key-stop = Peata laadimine zen-full-zoom-reduce-shortcut = Vähenda zen-full-zoom-enlarge-shortcut = Suurenda zen-full-zoom-reset-shortcut = Lähtesta suurendamine -zen-full-zoom-reset-shortcut-alt = Reset Zoom (Alt) -zen-full-zoom-enlarge-shortcut-alt = Zoom In (Alt) -zen-full-zoom-enlarge-shortcut-alt2 = Zoom In (Alt 2) +zen-full-zoom-reset-shortcut-alt = Lähtesta suurendamine (Alternatiivne) +zen-full-zoom-enlarge-shortcut-alt = Suurenda (Alternatiivne) +zen-full-zoom-enlarge-shortcut-alt2 = Suurenda (Alternatiivne 2) zen-bidi-switch-direction-shortcut = Muuda teksti suunda zen-private-browsing-shortcut = Ava privaatne aken zen-screenshot-shortcut = Tee ekraanipilt @@ -288,16 +288,16 @@ zen-key-goto-history = Ava ajalugu zen-key-go-home = Avaleht zen-bookmark-show-sidebar-shortcut = Kuva järjehoidjate külgriba zen-bookmark-show-toolbar-shortcut = Kuva järjehoidjariba -zen-devtools-toggle-shortcut = Toggle DevTools -zen-devtools-toggle-browser-toolbox-shortcut = Toggle Browser Toolbox -zen-devtools-toggle-browser-console-shortcut = Toggle Browser Console -zen-devtools-toggle-responsive-design-mode-shortcut = Toggle Responsive Design Mode -zen-devtools-toggle-inspector-shortcut = Toggle Inspector -zen-devtools-toggle-web-console-shortcut = Toggle Web Console -zen-devtools-toggle-js-debugger-shortcut = Toggle JavaScript Debugger -zen-devtools-toggle-net-monitor-shortcut = Toggle Network Monitor -zen-devtools-toggle-style-editor-shortcut = Toggle Style Editor -zen-devtools-toggle-performance-shortcut = Toggle Performance -zen-devtools-toggle-storage-shortcut = Toggle Storage -zen-devtools-toggle-dom-shortcut = Toggle DOM -zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility +zen-devtools-toggle-shortcut = Lülita arendaja tööriistad sisse/välja +zen-devtools-toggle-browser-toolbox-shortcut = Lülita brauseri tööriistakast sisse/välja +zen-devtools-toggle-browser-console-shortcut = Lülita brauseri konsool sisse/välja +zen-devtools-toggle-responsive-design-mode-shortcut = Lülita reageeriva disaini režiim sisse/välja +zen-devtools-toggle-inspector-shortcut = Lülita inspekteerija sisse/välja +zen-devtools-toggle-web-console-shortcut = Lülita veebikonsool sisse/välja +zen-devtools-toggle-js-debugger-shortcut = Lülita JavaScripti siluja sisse/välja +zen-devtools-toggle-net-monitor-shortcut = Lülita võrgu jälgija sisse/välja +zen-devtools-toggle-style-editor-shortcut = Lülita stiilide redaktor sisse/välja +zen-devtools-toggle-performance-shortcut = Lülita jõudluse sektsioon sisse/välja +zen-devtools-toggle-storage-shortcut = Lülita mälu sektsioon sisse/välja +zen-devtools-toggle-dom-shortcut = Lülita DOM sisse/välja +zen-devtools-toggle-accessibility-shortcut = Lülita ligipääsetavuse sektsioon sisse/välja diff --git a/locales/et/browser/browser/zen-folders.ftl b/locales/et/browser/browser/zen-folders.ftl index c9fc4dc8a..26e0bb905 100644 --- a/locales/et/browser/browser/zen-folders.ftl +++ b/locales/et/browser/browser/zen-folders.ftl @@ -1,21 +1,21 @@ zen-folders-search-placeholder = - .placeholder = Search { $folder-name }... + .placeholder = Otsi kaustast { $folder-name }... zen-folders-panel-rename-folder = - .label = Rename Folder + .label = Nimeta kaust ümber zen-folders-panel-unpack-folder = - .label = Unpack Folder + .label = Paki kaust lahti zen-folders-new-subfolder = - .label = New Subfolder + .label = Uus alamkaust zen-folders-panel-delete-folder = - .label = Delete Folder + .label = Kustuta kaust zen-folders-panel-convert-folder-to-space = - .label = Convert folder to Space + .label = Teisenda kaust tööruumiks zen-folders-panel-change-folder-space = - .label = Change Space... + .label = Liiguta tööruumi... zen-folders-panel-change-icon-folder = - .label = Change Icon + .label = Muuda ikooni zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Eemalda mälust selle kausta kaardid zen-folders-unload-folder = - .label = Unload All Tabs -zen-folders-search-no-results = No tabs matching that search 🤔 + .label = Eemalda mälust kõik kaardid +zen-folders-search-no-results = Otsingule ei vasta ühtegi kaarti 🤔 diff --git a/locales/et/browser/browser/zen-general.ftl b/locales/et/browser/browser/zen-general.ftl index 9b824e30e..8d3ef4efa 100644 --- a/locales/et/browser/browser/zen-general.ftl +++ b/locales/et/browser/browser/zen-general.ftl @@ -2,49 +2,49 @@ zen-panel-ui-current-profile-text = praegune profiil unified-extensions-description = Laiendusi kasutatakse täiendava funktsionaalsuse lisamiseks { -brand-short-name }i. tab-context-zen-reset-pinned-tab = .label = Lähtesta püsikaart - .accesskey = R + .accesskey = p tab-context-zen-add-essential = - .label = Add to Essentials ({ $num } / 12 slots filled) - .accesskey = E + .label = Märgi oluliseks ({ $num } / 12 täidetud) + .accesskey = o tab-context-zen-remove-essential = .label = Eemalda olulistest - .accesskey = R + .accesskey = o tab-context-zen-replace-pinned-url-with-current = .label = Asenda püsikaardi URL praegusega - .accesskey = C -zen-themes-corrupted = Sinu { -brand-short-name } muudatuste fail on vigane. See on nüüd lähtestatud vaikimisi teemaks. + .accesskey = p +zen-themes-corrupted = Sinu { -brand-short-name } mods-ide fail on vigane. See on nüüd lähtestatud vaikimisi teemaks. zen-shortcuts-corrupted = Sinu { -brand-short-name } otseteede fail on vigane. See on nüüd lähtestatud vaikimisi otseteedeks. # note: Do not translate the "
" tags in the following string zen-new-urlbar-notification = - The new URL bar has been enabled, removing the need for new tab pages.

- Try opening a new tab to see the new URL bar in action! -zen-disable = Disable + Uus asukohariba on sisse lülitatud, mistõttu pole enam uue kaardi lehte tarvis.

+ Proovi avada uut kaarti, et näha uut asukohariba! +zen-disable = Lülita välja pictureinpicture-minimize-btn = - .aria-label = Minimize - .tooltip = Minimize + .aria-label = Minimeeri + .tooltip = Minimeeri zen-panel-ui-gradient-generator-custom-color = Kohandatud värv zen-panel-ui-gradient-generator-saved-message = Värviüleminek on edukalt salvestatud! zen-copy-current-url-confirmation = URL kopeeriti lõikelauale. zen-general-cancel-label = - .label = Cancel + .label = Tühista zen-general-confirm = .label = Kinnita zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL. -zen-tabs-renamed = Tab has been successfully renamed! -zen-background-tab-opened-toast = New background tab opened! -zen-workspace-renamed-toast = Workspace has been successfully renamed! +zen-tabs-renamed = Kaart on edukalt ümber nimetatud! +zen-background-tab-opened-toast = Taustal avati uus kaart! +zen-workspace-renamed-toast = Tööruum on edukalt ümber nimetatud! zen-library-sidebar-workspaces = - .label = Spaces + .label = Tööruumid zen-library-sidebar-mods = - .label = Mods + .label = Mods-id # note: Do not translate the "
" tags in the following string zen-learn-more-text = Rohkem teavet zen-close-label = Sulge zen-singletoolbar-urlbar-placeholder-with-name = - .placeholder = Search... + .placeholder = Otsi... zen-icons-picker-emoji = - .label = Emojis + .label = Emojid zen-icons-picker-svg = - .label = Icons + .label = Ikoonid diff --git a/locales/et/browser/browser/zen-vertical-tabs.ftl b/locales/et/browser/browser/zen-vertical-tabs.ftl index 70f847b81..d17ca9f44 100644 --- a/locales/et/browser/browser/zen-vertical-tabs.ftl +++ b/locales/et/browser/browser/zen-vertical-tabs.ftl @@ -15,22 +15,22 @@ zen-toolbar-context-compact-mode-hide-both = .label = Peida mõlemad .accesskey = P zen-toolbar-context-new-folder = - .label = New Folder - .accesskey = N + .label = Uus kaust + .accesskey = U sidebar-zen-expand = .label = Laienda külgriba sidebar-zen-create-new = - .label = Create New... + .label = Loo uus... tabbrowser-unload-tab-button = .tooltiptext = { $tabCount -> - [one] Unload and switch to tab - *[other] Unload { $tabCount } tabs and switch to the first + [one] Eemalda mälust ning vaheta kaarti + *[other] Eemalda mälust { $tabCount } kaarti ning vaheta esimesele kaardile } tabbrowser-reset-pin-button = .tooltiptext = { $tabCount -> - [one] Reset and pin tab - *[other] Reset and pin { $tabCount } tabs + [one] Lähtesta ja tee püsikaardiks + *[other] Lähtesta ja tee püsikaardiks { $tabCount } kaarti } -tab-reset-pin-label = Back to pinned url +tab-reset-pin-label = Tagasi püsikaardi URL-ile diff --git a/locales/et/browser/browser/zen-welcome.ftl b/locales/et/browser/browser/zen-welcome.ftl index c0415aa62..c8f092249 100644 --- a/locales/et/browser/browser/zen-welcome.ftl +++ b/locales/et/browser/browser/zen-welcome.ftl @@ -4,24 +4,24 @@ zen-welcome-title-line1 = Tere tulemast zen-welcome-title-line2 = rahulikumasse internetti -zen-welcome-import-title = A Fresh Start, Same Bookmarks -zen-welcome-import-description-1 = Your bookmarks, history, and passwords are like a trail of breadcrumbs through the internet—don’t leave them behind! +zen-welcome-import-title = Värske algus, samad järjehoidjad +zen-welcome-import-description-1 = Sinu järjehoidjad, ajalugu ja paroolid on nagu seni läbitud rada internetis—ära jäta seda maha! zen-welcome-import-description-2 = Easily bring them over from another browser and pick up right where you left off.. -zen-welcome-import-button = Import now -zen-welcome-set-default-browser = Set { -brand-short-name } as your default browser -zen-welcome-dont-set-default-browser = DON’T set { -brand-short-name } as your default browser -zen-welcome-initial-essentials-title = Your Key Tabs, Always Within Reach -zen-welcome-initial-essentials-description-1 = Keep your most important tabs easily accessible and always at hand, no matter how many you open. -zen-welcome-initial-essentials-description-2 = Essential tabs are always visible, no matter what workspace you are in. -zen-welcome-workspace-colors-title = Your Workspaces, Your Colors -zen-welcome-workspace-colors-description = Personalize your browser by giving each workspace its own unique color identity. +zen-welcome-import-button = Impordi nüüd +zen-welcome-set-default-browser = Määra { -brand-short-name } oma vaikebrauseriks +zen-welcome-dont-set-default-browser = ÄRA määra { -brand-short-name } oma vaikebrauseriks +zen-welcome-initial-essentials-title = Sinu põhilised kaardid, alati käeulatuses +zen-welcome-initial-essentials-description-1 = Hoia oma kõige olulisemad kaardid hõlpsalt juurdepääsetavad ning käeulatuses, hoolimata sellest, kui mitu neid avad. +zen-welcome-initial-essentials-description-2 = Olulised kaardid on alati nähtavad sõltumata sellest, millises tööruumis hetkel oled. +zen-welcome-workspace-colors-title = Sinu tööruumid, sinu värvid +zen-welcome-workspace-colors-description = Isikupärasta oma brauser, andes igale tööruumile omapärase värvitooni. zen-welcome-start-browsing-title = - All set?
- Let’s get rolling! -zen-welcome-start-browsing-description-1 = You’re all set up and ready to go. Click the button below to start browsing with { -brand-short-name }. -zen-welcome-start-browsing = Dive in! -zen-welcome-default-search-title = Your Default Search Engine -zen-welcome-default-search-description = Choose your default search engine. You can always change it later! -zen-welcome-skip-button = Skip -zen-welcome-next-action = Next -zen-welcome-finished = Your Zen has been set up correctly! + Valmis?
+ Alustame! +zen-welcome-start-browsing-description-1 = Kõik on valmis. { -brand-short-name }iga sirvimise alustamiseks klõpsake alloleval nupul. +zen-welcome-start-browsing = Hakkame pihta! +zen-welcome-default-search-title = Sinu vaikimisi otsingumootor +zen-welcome-default-search-description = Vali oma vaikimisi otsingumootor. Saad seda alati hiljem muuta! +zen-welcome-skip-button = Jäta vahele +zen-welcome-next-action = Edasi +zen-welcome-finished = Zen on edukalt seadistatud! diff --git a/locales/et/browser/browser/zen-workspaces.ftl b/locales/et/browser/browser/zen-workspaces.ftl index 1d6d6a6fd..37b728511 100644 --- a/locales/et/browser/browser/zen-workspaces.ftl +++ b/locales/et/browser/browser/zen-workspaces.ftl @@ -1,21 +1,21 @@ zen-panel-ui-workspaces-text = Tööruumid zen-panel-ui-workspaces-create = - .label = Create Space + .label = Uus tööruum zen-panel-ui-folder-create = - .label = Create Folder + .label = Uus kaust zen-workspaces-panel-context-delete = .label = Kustuta tööruum .accesskey = K zen-workspaces-panel-change-name = - .label = Change Name + .label = Nimeta ümber zen-workspaces-panel-change-icon = - .label = Change Icon + .label = Muuda ikooni zen-workspaces-panel-context-default-profile = - .label = Set Profile -zen-workspaces-how-to-reorder-title = How to reorder spaces -zen-workspaces-how-to-reorder-desc = Drag the space icons at the bottom of the sidebar to reorder them + .label = Määra profiil +zen-workspaces-how-to-reorder-title = Kuidas vahetada tööruumide järjestust +zen-workspaces-how-to-reorder-desc = Lohista tööruumide ikoone külgriba alumises servas, et nende järjestust muuta zen-workspaces-change-theme = - .label = Edit Theme + .label = Muuda teemat zen-workspaces-panel-context-open = .label = Ava tööruum .accesskey = A @@ -29,23 +29,23 @@ zen-bookmark-edit-panel-workspace-selector = .value = Tööruumid .accesskey = T zen-panel-ui-gradient-generator-algo-complementary = - .label = Complementary + .label = Täiendvärvid zen-panel-ui-gradient-generator-algo-splitComplementary = - .label = Split + .label = Täiendvärvide kolmik zen-panel-ui-gradient-generator-algo-analogous = - .label = Analogous + .label = Lähedased värvid zen-panel-ui-gradient-generator-algo-triadic = - .label = Triadic + .label = Kolmkõla zen-panel-ui-gradient-generator-algo-floating = - .label = Floating -zen-panel-ui-gradient-click-to-add = Click to add a color + .label = Hõljuv +zen-panel-ui-gradient-click-to-add = Klõpsa värvi lisamiseks zen-workspace-creation-name = - .placeholder = Space Name + .placeholder = Tööruumi nimi zen-workspaces-panel-context-reorder = - .label = Reorder Spaces -zen-workspace-creation-profile = Profile - .tooltiptext = Profiles are used to separate cookies and site data between spaces. -zen-workspace-creation-header = Create a Space -zen-workspace-creation-label = Spaces are used to organize your tabs and sessions. + .label = Muuda tööruumide järjestust +zen-workspace-creation-profile = Profiil + .tooltiptext = Profiile kasutatakse küpsiste ning saidi andmete eraldamiseks tööruumide vahel. +zen-workspace-creation-header = Loo uus tööruum +zen-workspace-creation-label = Tööruume kasutatakse kaartide ja sessioonide organiseerimiseks. zen-workspaces-delete-workspace-title = Delete Workspace? -zen-workspaces-delete-workspace-body = Are you sure you want to delete { $name }? This action cannot be undone. +zen-workspaces-delete-workspace-body = Kas oled kindel, et soovid kustutada tööruumi { $name }? Seda tegevust ei saa tagasi võtta. diff --git a/locales/fr/browser/browser/zen-vertical-tabs.ftl b/locales/fr/browser/browser/zen-vertical-tabs.ftl index 6690acba8..73e82b59b 100644 --- a/locales/fr/browser/browser/zen-vertical-tabs.ftl +++ b/locales/fr/browser/browser/zen-vertical-tabs.ftl @@ -15,7 +15,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = Masquer les deux .accesskey = H zen-toolbar-context-new-folder = - .label = New Folder + .label = Nouveau dossier .accesskey = N sidebar-zen-expand = .label = Étendre la barre latérale diff --git a/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl b/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl index bb4bd5f9f..d8d7f578c 100644 --- a/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl +++ b/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl @@ -15,7 +15,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = Folaigh an dá cheann .accesskey = H zen-toolbar-context-new-folder = - .label = New Folder + .label = Fillteán Nua .accesskey = N sidebar-zen-expand = .label = Barra Taoibh a Leathnú diff --git a/locales/hu/browser/browser/zen-vertical-tabs.ftl b/locales/hu/browser/browser/zen-vertical-tabs.ftl index bb9df7ee3..f6c38a34f 100644 --- a/locales/hu/browser/browser/zen-vertical-tabs.ftl +++ b/locales/hu/browser/browser/zen-vertical-tabs.ftl @@ -15,7 +15,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = Mindkettő elrejtése .accesskey = H zen-toolbar-context-new-folder = - .label = New Folder + .label = Új mappa .accesskey = N sidebar-zen-expand = .label = Oldalsáv kibontása diff --git a/locales/id/browser/browser/zen-vertical-tabs.ftl b/locales/id/browser/browser/zen-vertical-tabs.ftl index 2c4b0af8a..cb6626afd 100644 --- a/locales/id/browser/browser/zen-vertical-tabs.ftl +++ b/locales/id/browser/browser/zen-vertical-tabs.ftl @@ -15,7 +15,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = Sembunyikan keduanya .accesskey = H zen-toolbar-context-new-folder = - .label = New Folder + .label = Folder Baru .accesskey = N sidebar-zen-expand = .label = Perluas Bilah Sisi diff --git a/locales/lt/browser/browser/zen-folders.ftl b/locales/lt/browser/browser/zen-folders.ftl index 1f91fbfd8..f8fb12be3 100644 --- a/locales/lt/browser/browser/zen-folders.ftl +++ b/locales/lt/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Keisti piktogramą zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Iškelti visas korteles šiame aplanke zen-folders-unload-folder = - .label = Unload All Tabs + .label = Iškelti visas korteles zen-folders-search-no-results = Nėra kortelių, atitinkančių šią paiešką. 🤔 diff --git a/locales/lt/browser/browser/zen-vertical-tabs.ftl b/locales/lt/browser/browser/zen-vertical-tabs.ftl index 73c9deccd..9276eea15 100644 --- a/locales/lt/browser/browser/zen-vertical-tabs.ftl +++ b/locales/lt/browser/browser/zen-vertical-tabs.ftl @@ -15,7 +15,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = Slėpti abi .accesskey = H zen-toolbar-context-new-folder = - .label = New Folder + .label = Naujas aplankas .accesskey = N sidebar-zen-expand = .label = Išskleisti šoninę juostą From eedc5b73074c3035d1c5f3e8517ca7680661a955 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sat, 30 Aug 2025 15:00:20 +0200 Subject: [PATCH 28/55] fix: Fixed moving tabs to different workspaces, b=no-bug, c=common, folders, split-view, workspaces --- .../tabbrowser/content/tabbrowser-js.patch | 155 ++++++++++-------- src/zen/common/ZenUIManager.mjs | 2 +- src/zen/folders/ZenFolders.mjs | 1 + src/zen/split-view/ZenViewSplitter.mjs | 6 +- src/zen/workspaces/ZenWorkspaces.mjs | 14 +- 5 files changed, 101 insertions(+), 77 deletions(-) diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch index 2bb325f71..fa3d24c5e 100644 --- a/src/browser/components/tabbrowser/content/tabbrowser-js.patch +++ b/src/browser/components/tabbrowser/content/tabbrowser-js.patch @@ -1,11 +1,15 @@ diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js -index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6fe685e62 100644 +index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4beed4c5079b 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js -@@ -422,15 +422,60 @@ +@@ -422,15 +422,64 @@ return this.tabContainer.visibleTabs; } ++ zenHandleTabMove(...args) { ++ return this.#handleTabMove(...args); ++ } ++ + get _numVisiblePinTabsWithoutCollapsed() { + let i = 0; + for (let item of this.tabContainer.ariaFocusableItems) { @@ -65,7 +69,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 set selectedTab(val) { if ( gSharedTabWarning.willShowSharedTabWarning(val) || -@@ -578,6 +623,7 @@ +@@ -578,6 +627,7 @@ this.tabpanels.appendChild(panel); let tab = this.tabs[0]; @@ -73,7 +77,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 tab.linkedPanel = uniqueId; this._selectedTab = tab; this._selectedBrowser = browser; -@@ -863,9 +909,13 @@ +@@ -863,9 +913,13 @@ } this.showTab(aTab); @@ -88,7 +92,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 aTab.setAttribute("pinned", "true"); this._updateTabBarForPinnedTabs(); -@@ -878,11 +928,15 @@ +@@ -878,11 +932,15 @@ } this.#handleTabMove(aTab, () => { @@ -105,7 +109,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 }); aTab.style.marginInlineStart = ""; -@@ -1060,6 +1114,8 @@ +@@ -1060,6 +1118,8 @@ let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"]; @@ -114,7 +118,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 if ( aIconURL && !aLoadingPrincipal && -@@ -1070,6 +1126,9 @@ +@@ -1070,6 +1130,9 @@ ); return; } @@ -124,7 +128,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 let browser = this.getBrowserForTab(aTab); browser.mIconURL = aIconURL; -@@ -1319,6 +1378,7 @@ +@@ -1319,6 +1382,7 @@ if (!this._previewMode) { newTab.recordTimeFromUnloadToReload(); newTab.updateLastAccessed(); @@ -132,7 +136,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 oldTab.updateLastAccessed(); // if this is the foreground window, update the last-seen timestamps. if (this.ownerGlobal == BrowserWindowTracker.getTopWindow()) { -@@ -1471,6 +1531,9 @@ +@@ -1471,6 +1535,9 @@ } let activeEl = document.activeElement; @@ -142,7 +146,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 // If focus is on the old tab, move it to the new tab. if (activeEl == oldTab) { newTab.focus(); -@@ -1794,7 +1857,8 @@ +@@ -1794,7 +1861,8 @@ } _setTabLabel(aTab, aLabel, { beforeTabOpen, isContentTitle, isURL } = {}) { @@ -152,7 +156,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 return false; } -@@ -1902,7 +1966,7 @@ +@@ -1902,7 +1970,7 @@ newIndex = this.selectedTab._tPos + 1; } @@ -161,7 +165,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 if (this.isTabGroupLabel(targetTab)) { throw new Error( "Replacing a tab group label with a tab is not supported" -@@ -2166,6 +2230,7 @@ +@@ -2166,6 +2234,7 @@ uriIsAboutBlank, userContextId, skipLoad, @@ -169,7 +173,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 } = {}) { let b = document.createXULElement("browser"); // Use the JSM global to create the permanentKey, so that if the -@@ -2239,8 +2304,7 @@ +@@ -2239,8 +2308,7 @@ // we use a different attribute name for this? b.setAttribute("name", name); } @@ -179,7 +183,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 b.setAttribute("transparent", "true"); } -@@ -2405,7 +2469,7 @@ +@@ -2405,7 +2473,7 @@ let panel = this.getPanel(browser); let uniqueId = this._generateUniquePanelID(); @@ -188,7 +192,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 aTab.linkedPanel = uniqueId; // Inject the into the DOM if necessary. -@@ -2464,8 +2528,8 @@ +@@ -2464,8 +2532,8 @@ // If we transitioned from one browser to two browsers, we need to set // hasSiblings=false on both the existing browser and the new browser. if (this.tabs.length == 2) { @@ -199,7 +203,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 } else { aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1; } -@@ -2629,7 +2693,6 @@ +@@ -2629,7 +2697,6 @@ this.selectedTab = this.addTrustedTab(BROWSER_NEW_TAB_URL, { tabIndex: tab._tPos + 1, userContextId: tab.userContextId, @@ -207,7 +211,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 focusUrlBar: true, }); resolve(this.selectedBrowser); -@@ -2709,6 +2772,8 @@ +@@ -2709,6 +2776,8 @@ schemelessInput, hasValidUserGestureActivation = false, textDirectiveUserActivation = false, @@ -216,7 +220,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 } = {} ) { // all callers of addTab that pass a params object need to pass -@@ -2719,6 +2784,12 @@ +@@ -2719,6 +2788,12 @@ ); } @@ -229,7 +233,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 if (!UserInteraction.running("browser.tabs.opening", window)) { UserInteraction.start("browser.tabs.opening", "initting", window); } -@@ -2782,6 +2853,19 @@ +@@ -2782,6 +2857,19 @@ noInitialLabel, skipBackgroundNotify, }); @@ -249,7 +253,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 if (insertTab) { // Insert the tab into the tab container in the correct position. this.#insertTabAtIndex(t, { -@@ -2790,6 +2874,7 @@ +@@ -2790,6 +2878,7 @@ ownerTab, openerTab, pinned, @@ -257,7 +261,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 bulkOrderedOpen, tabGroup: tabGroup ?? openerTab?.group, }); -@@ -2808,6 +2893,7 @@ +@@ -2808,6 +2897,7 @@ openWindowInfo, skipLoad, triggeringRemoteType, @@ -265,7 +269,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 })); if (focusUrlBar) { -@@ -2928,6 +3014,12 @@ +@@ -2928,6 +3018,12 @@ } } @@ -278,7 +282,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 // Additionally send pinned tab events if (pinned) { this.#notifyPinnedStatus(t); -@@ -3016,10 +3108,10 @@ +@@ -3016,10 +3112,10 @@ isAdoptingGroup = false, isUserTriggered = false, telemetryUserCreateSource = "unknown", @@ -290,7 +294,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 } if (!color) { -@@ -3040,9 +3132,14 @@ +@@ -3040,9 +3136,14 @@ label, isAdoptingGroup ); @@ -307,7 +311,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 ); group.addTabs(tabs); -@@ -3163,7 +3260,7 @@ +@@ -3163,7 +3264,7 @@ } this.#handleTabMove(tab, () => @@ -316,7 +320,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 ); } -@@ -3365,6 +3462,7 @@ +@@ -3365,6 +3466,7 @@ openWindowInfo, skipLoad, triggeringRemoteType, @@ -324,7 +328,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 } ) { // If we don't have a preferred remote type (or it is `NOT_REMOTE`), and -@@ -3434,6 +3532,7 @@ +@@ -3434,6 +3536,7 @@ openWindowInfo, name, skipLoad, @@ -332,7 +336,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 }); } -@@ -3621,7 +3720,7 @@ +@@ -3621,7 +3724,7 @@ // Add a new tab if needed. if (!tab) { let createLazyBrowser = @@ -341,7 +345,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 let url = "about:blank"; if (tabData.entries?.length) { -@@ -3658,8 +3757,10 @@ +@@ -3658,8 +3761,10 @@ insertTab: false, skipLoad: true, preferredRemoteType, @@ -353,7 +357,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 if (select) { tabToSelect = tab; } -@@ -3671,7 +3772,8 @@ +@@ -3671,7 +3776,8 @@ this.pinTab(tab); // Then ensure all the tab open/pinning information is sent. this._fireTabOpen(tab, {}); @@ -363,7 +367,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 let { groupId } = tabData; const tabGroup = tabGroupWorkingData.get(groupId); // if a tab refers to a tab group we don't know, skip any group -@@ -3685,7 +3787,10 @@ +@@ -3685,7 +3791,10 @@ tabGroup.stateData.id, tabGroup.stateData.color, tabGroup.stateData.collapsed, @@ -375,7 +379,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 ); tabsFragment.appendChild(tabGroup.node); } -@@ -3730,9 +3835,23 @@ +@@ -3730,9 +3839,23 @@ // to remove the old selected tab. if (tabToSelect) { let leftoverTab = this.selectedTab; @@ -391,15 +395,15 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 + gZenWorkspaces._initialTab._shouldRemove = true; + } + } - } ++ } + else { + gZenWorkspaces._tabToRemoveForEmpty = this.selectedTab; -+ } + } + this._hasAlreadyInitializedZenSessionStore = true; if (tabs.length > 1 || !tabs[0].selected) { this._updateTabsAfterInsert(); -@@ -3927,7 +4046,7 @@ +@@ -3927,7 +4050,7 @@ // Ensure we have an index if one was not provided. if (typeof elementIndex != "number" && typeof tabIndex != "number") { // Move the new tab after another tab if needed, to the end otherwise. @@ -408,7 +412,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 if ( !bulkOrderedOpen && ((openerTab && -@@ -3939,7 +4058,7 @@ +@@ -3939,7 +4062,7 @@ let lastRelatedTab = openerTab && this._lastRelatedTabMap.get(openerTab); let previousTab = lastRelatedTab || openerTab || this.selectedTab; @@ -417,7 +421,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 tabGroup = previousTab.group; } if ( -@@ -3950,7 +4069,7 @@ +@@ -3950,7 +4073,7 @@ ) { elementIndex = Infinity; } else if (previousTab.visible) { @@ -426,7 +430,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 } else if (previousTab == FirefoxViewHandler.tab) { elementIndex = 0; } -@@ -3978,14 +4097,14 @@ +@@ -3978,14 +4101,14 @@ } // Ensure index is within bounds. if (tab.pinned) { @@ -445,7 +449,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 if (pinned && !itemAfter?.pinned) { itemAfter = null; -@@ -3996,7 +4115,7 @@ +@@ -3996,7 +4119,7 @@ this.tabContainer._invalidateCachedTabs(); @@ -454,7 +458,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 if (this.isTab(itemAfter) && itemAfter.group == tabGroup) { // Place at the front of, or between tabs in, the same tab group this.tabContainer.insertBefore(tab, itemAfter); -@@ -4032,6 +4151,7 @@ +@@ -4032,6 +4155,7 @@ if (pinned) { this._updateTabBarForPinnedTabs(); } @@ -462,7 +466,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 TabBarVisibility.update(); } -@@ -4321,6 +4441,9 @@ +@@ -4321,6 +4445,9 @@ return; } @@ -472,7 +476,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 this.removeTabs(selectedTabs, { isUserTriggered, telemetrySource }); } -@@ -4582,6 +4705,7 @@ +@@ -4582,6 +4709,7 @@ telemetrySource, } = {} ) { @@ -480,7 +484,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 // When 'closeWindowWithLastTab' pref is enabled, closing all tabs // can be considered equivalent to closing the window. if ( -@@ -4671,6 +4795,7 @@ +@@ -4671,6 +4799,7 @@ if (lastToClose) { this.removeTab(lastToClose, aParams); } @@ -488,7 +492,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 } catch (e) { console.error(e); } -@@ -4709,6 +4834,12 @@ +@@ -4709,6 +4838,12 @@ aTab._closeTimeNoAnimTimerId = Glean.browserTabclose.timeNoAnim.start(); } @@ -501,7 +505,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 // Handle requests for synchronously removing an already // asynchronously closing tab. if (!animate && aTab.closing) { -@@ -4723,6 +4854,9 @@ +@@ -4723,6 +4858,9 @@ // state). let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width; let isLastTab = this.#isLastTabInWindow(aTab); @@ -511,7 +515,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 if ( !this._beginRemoveTab(aTab, { closeWindowFastpath: true, -@@ -4905,7 +5039,7 @@ +@@ -4905,7 +5043,7 @@ closeWindowWithLastTab != null ? closeWindowWithLastTab : !window.toolbar.visible || @@ -520,7 +524,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 if (closeWindow) { // We've already called beforeunload on all the relevant tabs if we get here, -@@ -4929,6 +5063,7 @@ +@@ -4929,6 +5067,7 @@ newTab = true; } @@ -528,7 +532,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 aTab._endRemoveArgs = [closeWindow, newTab]; // swapBrowsersAndCloseOther will take care of closing the window without animation. -@@ -4969,13 +5104,7 @@ +@@ -4969,13 +5108,7 @@ aTab._mouseleave(); if (newTab) { @@ -543,7 +547,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 } else { TabBarVisibility.update(); } -@@ -5108,6 +5237,7 @@ +@@ -5108,6 +5241,7 @@ this.tabs[i]._tPos = i; } @@ -551,7 +555,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 if (!this._windowIsClosing) { // update tab close buttons state this.tabContainer._updateCloseButtons(); -@@ -5320,6 +5450,7 @@ +@@ -5320,6 +5454,7 @@ } let excludeTabs = new Set(aExcludeTabs); @@ -559,7 +563,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 // If this tab has a successor, it should be selectable, since // hiding or closing a tab removes that tab as a successor. -@@ -5332,13 +5463,13 @@ +@@ -5332,13 +5467,13 @@ !excludeTabs.has(aTab.owner) && Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose") ) { @@ -575,7 +579,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 ); let tab = this.tabContainer.findNextTab(aTab, { -@@ -5354,7 +5485,7 @@ +@@ -5354,7 +5489,7 @@ } if (tab) { @@ -584,7 +588,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 } // If no qualifying visible tab was found, see if there is a tab in -@@ -5375,7 +5506,7 @@ +@@ -5375,7 +5510,7 @@ }); } @@ -593,7 +597,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 } _blurTab(aTab) { -@@ -5777,10 +5908,10 @@ +@@ -5777,10 +5912,10 @@ SessionStore.deleteCustomTabValue(aTab, "hiddenBy"); } @@ -606,7 +610,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 aTab.selected || aTab.closing || // Tabs that are sharing the screen, microphone or camera cannot be hidden. -@@ -5839,6 +5970,7 @@ +@@ -5839,6 +5974,7 @@ * @param {MozTabbrowserTab|MozTabbrowserTabGroup|MozTabbrowserTabGroup.labelElement} aTab */ replaceTabWithWindow(aTab, aOptions) { @@ -614,7 +618,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 if (this.tabs.length == 1) { return null; } -@@ -5972,7 +6104,7 @@ +@@ -5972,7 +6108,7 @@ * `true` if element is a `` */ isTabGroup(element) { @@ -623,7 +627,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 } /** -@@ -6048,8 +6180,8 @@ +@@ -6048,8 +6184,8 @@ } // Don't allow mixing pinned and unpinned tabs. @@ -634,7 +638,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 } else { tabIndex = Math.max(tabIndex, this.pinnedTabCount); } -@@ -6075,10 +6207,16 @@ +@@ -6075,10 +6211,16 @@ this.#handleTabMove( element, () => { @@ -653,7 +657,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 if (neighbor && this.isTab(element) && tabIndex > element._tPos) { neighbor.after(element); } else { -@@ -6136,23 +6274,28 @@ +@@ -6136,23 +6278,28 @@ #moveTabNextTo(element, targetElement, moveBefore = false, metricsContext) { if (this.isTabGroupLabel(targetElement)) { targetElement = targetElement.group; @@ -688,7 +692,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 } else if (!element.pinned && targetElement && targetElement.pinned) { // If the caller asks to move an unpinned element next to a pinned // tab, move the unpinned element to be the first unpinned element -@@ -6165,14 +6308,34 @@ +@@ -6165,14 +6312,34 @@ // move the tab group right before the first unpinned tab. // 4. Moving a tab group and the first unpinned tab is grouped: // move the tab group right before the first unpinned tab's tab group. @@ -724,7 +728,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 element.pinned ? this.tabContainer.pinnedTabsContainer : this.tabContainer; -@@ -6181,7 +6344,7 @@ +@@ -6181,7 +6348,7 @@ element, () => { if (moveBefore) { @@ -733,7 +737,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 } else if (targetElement) { targetElement.after(element); } else { -@@ -6227,10 +6390,10 @@ +@@ -6227,10 +6394,10 @@ * @param {TabMetricsContext} [metricsContext] */ moveTabToGroup(aTab, aGroup, metricsContext) { @@ -746,7 +750,24 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 return; } if (aTab.group && aTab.group.id === aGroup.id) { -@@ -6324,6 +6487,10 @@ +@@ -6261,6 +6428,7 @@ + + let state = { + tabIndex: tab._tPos, ++ workspaceId: tab.getAttribute("zen-workspace-id") + }; + if (tab.visible) { + state.elementIndex = tab.elementIndex; +@@ -6287,7 +6455,7 @@ + let changedTabGroup = + previousTabState.tabGroupId != currentTabState.tabGroupId; + +- if (changedPosition || changedTabGroup) { ++ if (changedPosition || changedTabGroup || (previousTabState.workspaceId != currentTabState.workspaceId)) { + tab.dispatchEvent( + new CustomEvent("TabMove", { + bubbles: true, +@@ -6324,6 +6492,10 @@ moveActionCallback(); @@ -757,7 +778,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 // Clear tabs cache after moving nodes because the order of tabs may have // changed. this.tabContainer._invalidateCachedTabs(); -@@ -7221,7 +7388,7 @@ +@@ -7221,7 +7393,7 @@ // preventDefault(). It will still raise the window if appropriate. break; } @@ -766,7 +787,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 window.focus(); aEvent.preventDefault(); break; -@@ -8166,6 +8333,7 @@ +@@ -8166,6 +8338,7 @@ aWebProgress.isTopLevel ) { this.mTab.setAttribute("busy", "true"); @@ -774,7 +795,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 gBrowser._tabAttrModified(this.mTab, ["busy"]); this.mTab._notselectedsinceload = !this.mTab.selected; } -@@ -9157,7 +9325,7 @@ var TabContextMenu = { +@@ -9157,7 +9330,7 @@ var TabContextMenu = { ); contextUnpinSelectedTabs.hidden = !this.contextTab.pinned || !this.multiselected; @@ -783,7 +804,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..c5c079ac5218f051407b27c6edbd4ba6 // Build Ask Chat items TabContextMenu.GenAI.buildTabMenu( document.getElementById("context_askChat"), -@@ -9476,6 +9644,7 @@ var TabContextMenu = { +@@ -9476,6 +9649,7 @@ var TabContextMenu = { ) ); } else { diff --git a/src/zen/common/ZenUIManager.mjs b/src/zen/common/ZenUIManager.mjs index 2c89216d7..0c9008a3c 100644 --- a/src/zen/common/ZenUIManager.mjs +++ b/src/zen/common/ZenUIManager.mjs @@ -132,7 +132,7 @@ var gZenUIManager = { }, updateTabsToolbar() { - const kUrlbarHeight = 336; + const kUrlbarHeight = 388; gURLBar.textbox.style.setProperty( '--zen-urlbar-top', `${window.innerHeight / 2 - Math.max(kUrlbarHeight, gURLBar.textbox.getBoundingClientRect().height) / 2}px` diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs index 5d34419d6..2d123a518 100644 --- a/src/zen/folders/ZenFolders.mjs +++ b/src/zen/folders/ZenFolders.mjs @@ -466,6 +466,7 @@ ) ); }); + 1; animations.push(...this.updateFolderIcon(group)); const startMargin = -(heightUntilSelected + 4 * (selectedItems.length === 0 ? 1 : 0)); diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs index 0ddb73747..49464588e 100644 --- a/src/zen/split-view/ZenViewSplitter.mjs +++ b/src/zen/split-view/ZenViewSplitter.mjs @@ -898,7 +898,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { document.getElementById('context_zenSplitTabs').setAttribute('data-l10n-args', tabCountInfo); document .getElementById('context_zenSplitTabs') - .setAttribute('disabled', !this.contextCanSplitTabs()); + .setAttribute('hidden', !this.contextCanSplitTabs()); }); } @@ -907,14 +907,12 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { */ insertSplitViewTabContextMenu() { const element = window.MozXULElement.parseXULToFragment(` - - `); - document.getElementById('context_closeDuplicateTabs').after(element); + document.getElementById('context_duplicateTab').before(element); } /** diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index c4ac55826..7d83bfe0a 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -1483,18 +1483,22 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { continue; } - tab.setAttribute('zen-workspace-id', workspaceID); if (tab.hasAttribute('zen-essential')) { continue; } if (container && !justChangeId) { if (tab.group?.hasAttribute('split-view-group')) { - this.moveTabsToWorkspace(tab.group.tabs, workspaceID, true); - container.insertBefore(tab.group, container.lastChild); + gBrowser.zenHandleTabMove(tab.group, () => { + this.moveTabsToWorkspace(tab.group.tabs, workspaceID, true); + container.insertBefore(tab.group, container.lastChild); + }); continue; } - container.insertBefore(tab, container.lastChild); + gBrowser.zenHandleTabMove(tab, () => { + tab.setAttribute('zen-workspace-id', workspaceID); + container.insertBefore(tab, container.lastChild); + }); } // also change glance tab if it's the same tab const glanceTab = tab.querySelector('.tabbrowser-tab[zen-glance-tab]'); @@ -2626,7 +2630,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { menu.appendChild(menuPopup); - document.getElementById('context_closeDuplicateTabs').after(menu); + document.getElementById('context_moveTabOptions').after(menu); } async changeTabWorkspace(workspaceID) { From 9e4cd6e68b2bb54a851b757381144a3d438f299d Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Sat, 30 Aug 2025 15:04:13 +0200 Subject: [PATCH 29/55] fix: Hide the search popup when swiping workspaces, b=no-bug, c=workspaces --- src/zen/workspaces/ZenWorkspaces.mjs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index c4ac55826..b06aa234b 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -708,6 +708,8 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { _handleSwipeStart(event) { if (!this.workspaceEnabled) return; + gZenFolders.cancelPopupTimer(); + document.documentElement.setAttribute('swipe-gesture', 'true'); document.addEventListener('popupshown', this.popupOpenHandler, { once: true }); @@ -1575,6 +1577,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { } const workspaces = await this._workspaces(); + gZenFolders.cancelPopupTimer(); // Refresh tab cache for (const otherWorkspace of workspaces.workspaces) { From 982ef2d35580d6fd40052d8c642f6e181faa4b97 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sat, 30 Aug 2025 17:14:41 +0200 Subject: [PATCH 30/55] chore: Clean up and properly align star icon, b=no-bug, c=common, folders --- src/browser/themes/shared/zen-icons/common/selectable/star.svg | 2 +- src/zen/folders/ZenFolders.mjs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/browser/themes/shared/zen-icons/common/selectable/star.svg b/src/browser/themes/shared/zen-icons/common/selectable/star.svg index 41d6a0fec..02436a88b 100644 --- a/src/browser/themes/shared/zen-icons/common/selectable/star.svg +++ b/src/browser/themes/shared/zen-icons/common/selectable/star.svg @@ -2,6 +2,6 @@ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. - + diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs index 2d123a518..5d34419d6 100644 --- a/src/zen/folders/ZenFolders.mjs +++ b/src/zen/folders/ZenFolders.mjs @@ -466,7 +466,6 @@ ) ); }); - 1; animations.push(...this.updateFolderIcon(group)); const startMargin = -(heightUntilSelected + 4 * (selectedItems.length === 0 ? 1 : 0)); From 7886758127cac80663807e9c4a384daf85735381 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sat, 30 Aug 2025 21:29:32 +0200 Subject: [PATCH 31/55] fix: Fixed startup freezes on some devices, b=closes #10157, c=workspaces --- src/zen/workspaces/ZenWorkspaces.mjs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index 6422d5628..99bd1a1f4 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -1631,7 +1631,10 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { } #fixTabPositions() { - this.tabContainer._invalidateCachedTabs(); + // See issue https://github.com/zen-browser/desktop/issues/10157 + if (this.tabContainer) { + this.tabContainer._invalidateCachedTabs(); + } // Fix tabs _tPos values relative to the actual order const tabs = gBrowser.tabs; const usedGroups = new Set(); From 3a03984db1521a6db3879081d4edec4e36a53407 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sat, 30 Aug 2025 21:38:26 +0200 Subject: [PATCH 32/55] fix: Fixed compact mode twitching when hovering the urlbar, b=closes #9790, c=compact-mode --- src/zen/compact-mode/ZenCompactMode.mjs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/zen/compact-mode/ZenCompactMode.mjs b/src/zen/compact-mode/ZenCompactMode.mjs index 700109159..00fc3a3d1 100644 --- a/src/zen/compact-mode/ZenCompactMode.mjs +++ b/src/zen/compact-mode/ZenCompactMode.mjs @@ -585,7 +585,6 @@ var gZenCompactModeManager = { gZenVerticalTabsManager._hasSetSingleToolbar) || this._hasHoveredUrlbar ) { - delete this._hasHoveredUrlbar; return; } @@ -642,6 +641,16 @@ var gZenCompactModeManager = { } }, this.HOVER_HACK_DELAY); }); + + gURLBar.textbox.addEventListener('mouseleave', () => { + setTimeout(() => { + setTimeout(() => { + requestAnimationFrame(() => { + delete this._hasHoveredUrlbar; + }); + }, 0); + }, 0); + }); }, _getCrossedEdge(posX, posY, element = document.documentElement, maxDistance = 10) { From 7bd39acfdc206c03f8919674a31664cc90e8d3dd Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sun, 31 Aug 2025 00:15:16 +0200 Subject: [PATCH 33/55] feat: Fixed drag and droping active folders, b=no-bug, c=folders, tabs --- locales/en-US/browser/browser/zen-folders.ftl | 2 +- .../tabbrowser/content/tabgroup-js.patch | 15 ++- .../tabbrowser/content/tabs-js.patch | 103 ++++++++---------- src/zen/folders/ZenFolders.mjs | 1 + 4 files changed, 55 insertions(+), 66 deletions(-) diff --git a/locales/en-US/browser/browser/zen-folders.ftl b/locales/en-US/browser/browser/zen-folders.ftl index 3e6d3c467..6cd7d72cf 100644 --- a/locales/en-US/browser/browser/zen-folders.ftl +++ b/locales/en-US/browser/browser/zen-folders.ftl @@ -24,7 +24,7 @@ zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs diff --git a/src/browser/components/tabbrowser/content/tabgroup-js.patch b/src/browser/components/tabbrowser/content/tabgroup-js.patch index 3cd5e281b..99fb979dd 100644 --- a/src/browser/components/tabbrowser/content/tabgroup-js.patch +++ b/src/browser/components/tabbrowser/content/tabgroup-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/tabbrowser/content/tabgroup.js b/browser/components/tabbrowser/content/tabgroup.js -index caea196b22b4689f55780a528661d87b52f4e728..729848f1d3856bc4a5225e1a83cc10ef22819ca1 100644 +index caea196b22b4689f55780a528661d87b52f4e728..725a2dfb10216df3e63d7980e2f1c99bf10038d7 100644 --- a/browser/components/tabbrowser/content/tabgroup.js +++ b/browser/components/tabbrowser/content/tabgroup.js @@ -13,10 +13,12 @@ @@ -166,16 +166,15 @@ index caea196b22b4689f55780a528661d87b52f4e728..729848f1d3856bc4a5225e1a83cc10ef } /** -@@ -373,7 +443,7 @@ - */ +@@ -374,7 +444,6 @@ addTabs(tabs, metricsContext) { for (let tab of tabs) { -- if (tab.pinned) { -+ if (tab.pinned !== this.pinned) { - tab.ownerGlobal.gBrowser.unpinTab(tab); + if (tab.pinned) { +- tab.ownerGlobal.gBrowser.unpinTab(tab); } let tabToMove = -@@ -437,7 +507,7 @@ + this.ownerGlobal === tab.ownerGlobal +@@ -437,7 +506,7 @@ */ on_click(event) { let isToggleElement = @@ -184,7 +183,7 @@ index caea196b22b4689f55780a528661d87b52f4e728..729848f1d3856bc4a5225e1a83cc10ef event.target === this.#overflowCountLabel; if (isToggleElement && event.button === 0) { event.preventDefault(); -@@ -470,5 +540,6 @@ +@@ -470,5 +539,6 @@ } } diff --git a/src/browser/components/tabbrowser/content/tabs-js.patch b/src/browser/components/tabbrowser/content/tabs-js.patch index d733376ba..20b2434ff 100644 --- a/src/browser/components/tabbrowser/content/tabs-js.patch +++ b/src/browser/components/tabbrowser/content/tabs-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js -index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3f397fc45 100644 +index e2b27db6c13278defea3bcc7606a8da54e7d001c..3033f5c98c94cf4b048432dfee72e20f4d8e37b6 100644 --- a/browser/components/tabbrowser/content/tabs.js +++ b/browser/components/tabbrowser/content/tabs.js @@ -332,7 +332,7 @@ @@ -56,14 +56,14 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 ? this.pinnedTabsContainer.scrollPosition : this.arrowScrollbox.scrollPosition, screenX: event.screenX, -@@ -886,6 +888,7 @@ - if (tab.multiselected) { +@@ -887,6 +889,7 @@ this.#moveTogetherSelectedTabs(tab); } else if (collapseTabGroupDuringDrag) { -+ gZenFolders.collapseVisibleTab(tab.group); tab.group.collapsed = true; ++ gZenFolders.collapseVisibleTab(tab.group); } } + @@ -932,6 +935,10 @@ } @@ -75,18 +75,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 if ( (dropEffect == "move" || dropEffect == "copy") && document == draggedTab.ownerDocument && -@@ -1059,7 +1066,9 @@ - isTabGroupLabel(draggedTab) && - draggedTab._dragData?.expandGroupOnDrop - ) { -- draggedTab.group.collapsed = false; -+ const isActive = draggedTab.group.hasAttribute("has-active"); -+ draggedTab.group.collapsed = isActive; -+ if (isActive) gZenFolders.expandVisibleTab(draggedTab.group); - } - } - -@@ -1095,6 +1104,18 @@ +@@ -1095,6 +1102,18 @@ this._tabDropIndicator.hidden = true; event.stopPropagation(); @@ -105,7 +94,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 if (draggedTab && dropEffect == "copy") { let duplicatedDraggedTab; let duplicatedTabs = []; -@@ -1119,8 +1140,9 @@ +@@ -1119,8 +1138,9 @@ let translateOffsetY = oldTranslateY % tabHeight; let newTranslateX = oldTranslateX - translateOffsetX; let newTranslateY = oldTranslateY - translateOffsetY; @@ -117,7 +106,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 if (this.#isContainerVerticalPinnedGrid(draggedTab)) { // Update both translate axis for pinned vertical expanded tabs -@@ -1136,8 +1158,8 @@ +@@ -1136,8 +1156,8 @@ } } else { let tabs = this.ariaFocusableItems.slice( @@ -128,7 +117,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 ); let size = this.verticalMode ? "height" : "width"; let screenAxis = this.verticalMode ? "screenY" : "screenX"; -@@ -1178,11 +1200,9 @@ +@@ -1178,11 +1198,9 @@ } let shouldPin = @@ -142,7 +131,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 let shouldTranslate = !gReduceMotion && !shouldCreateGroupOnDrop && -@@ -1195,6 +1215,7 @@ +@@ -1195,6 +1213,7 @@ (oldTranslateY && oldTranslateY != newTranslateY); } else if (this.verticalMode) { shouldTranslate &&= oldTranslateY && oldTranslateY != newTranslateY; @@ -150,7 +139,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 } else { shouldTranslate &&= oldTranslateX && oldTranslateX != newTranslateX; } -@@ -1376,6 +1397,7 @@ +@@ -1376,6 +1395,7 @@ let nextItem = this.ariaFocusableItems[newIndex]; let tabGroup = isTab(nextItem) && nextItem.group; @@ -158,7 +147,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 gBrowser.loadTabs(urls, { inBackground, replace, -@@ -1408,6 +1430,17 @@ +@@ -1408,6 +1428,17 @@ this.finishMoveTogetherSelectedTabs(draggedTab); this.finishAnimateTabMove(); @@ -176,7 +165,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 this.#expandGroupOnDrop(draggedTab); this.#resetTabsAfterDrop(draggedTab.ownerDocument); -@@ -1577,7 +1610,6 @@ +@@ -1577,7 +1608,6 @@ this.toggleAttribute("overflow", true); this._updateCloseButtons(); @@ -184,7 +173,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 document .getElementById("tab-preview-panel") -@@ -1635,7 +1667,7 @@ +@@ -1635,7 +1665,7 @@ } get newTabButton() { @@ -193,7 +182,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 } get verticalMode() { -@@ -1651,6 +1683,7 @@ +@@ -1651,6 +1681,7 @@ } get overflowing() { @@ -201,7 +190,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 return this.hasAttribute("overflow"); } -@@ -1659,26 +1692,54 @@ +@@ -1659,26 +1690,54 @@ if (this.#allTabs) { return this.#allTabs; } @@ -263,7 +252,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 } /** -@@ -1745,32 +1806,27 @@ +@@ -1745,32 +1804,27 @@ let elementIndex = 0; @@ -305,7 +294,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 return this.#focusableItems; } -@@ -1778,6 +1834,7 @@ +@@ -1778,6 +1832,7 @@ _invalidateCachedTabs() { this.#allTabs = null; this._invalidateCachedVisibleTabs(); @@ -313,7 +302,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 } _invalidateCachedVisibleTabs() { -@@ -1793,8 +1850,8 @@ +@@ -1793,8 +1848,8 @@ #isContainerVerticalPinnedGrid(tab) { return ( this.verticalMode && @@ -324,7 +313,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 !this.expandOnHover ); } -@@ -1810,7 +1867,7 @@ +@@ -1810,7 +1865,7 @@ if (node == null) { // We have a container for non-tab elements at the end of the scrollbox. @@ -333,7 +322,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 } node.before(tab); -@@ -1905,7 +1962,7 @@ +@@ -1905,7 +1960,7 @@ // There are separate "new tab" buttons for horizontal tabs toolbar, vertical tabs and // for when the tab strip is overflowed (which is shared by vertical and horizontal tabs); // Attach the long click popup to all of them. @@ -342,7 +331,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 const newTab2 = this.newTabButton; const newTabVertical = document.getElementById( "vertical-tabs-newtab-button" -@@ -2000,10 +2057,12 @@ +@@ -2000,10 +2055,12 @@ _handleTabSelect(aInstant) { let selectedTab = this.selectedItem; @@ -355,7 +344,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 selectedTab._notselectedsinceload = false; } -@@ -2140,6 +2199,16 @@ +@@ -2140,6 +2197,16 @@ when the tab is first selected to be dragged. */ #updateTabStylesOnDrag(tab) { @@ -372,7 +361,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 let isPinned = tab.pinned; let numPinned = gBrowser.pinnedTabCount; let allTabs = this.ariaFocusableItems; -@@ -2398,7 +2467,7 @@ +@@ -2398,7 +2465,7 @@ return; } @@ -381,7 +370,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 let directionX = screenX > dragData.animLastScreenX; let directionY = screenY > dragData.animLastScreenY; -@@ -2407,6 +2476,8 @@ +@@ -2407,6 +2474,8 @@ let { width: tabWidth, height: tabHeight } = draggedTab.getBoundingClientRect(); @@ -390,7 +379,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 let shiftSizeX = tabWidth * movingTabs.length; let shiftSizeY = tabHeight; dragData.tabWidth = tabWidth; -@@ -2443,8 +2514,8 @@ +@@ -2443,8 +2512,8 @@ let lastBoundX = lastTabInRow.screenX + lastTabInRow.getBoundingClientRect().width - @@ -401,7 +390,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 translateX = Math.min(Math.max(translateX, firstBoundX), lastBoundX); translateY = Math.min(Math.max(translateY, firstBoundY), lastBoundY); -@@ -2560,7 +2631,7 @@ +@@ -2560,7 +2629,7 @@ } dragData.animDropElementIndex = newIndex; @@ -410,7 +399,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 dragData.dropBefore = newIndex < tabs.length; // Shift background tabs to leave a gap where the dragged tab -@@ -2593,13 +2664,18 @@ +@@ -2593,13 +2662,18 @@ this.#clearDragOverCreateGroupTimer(); @@ -433,7 +422,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 if (this.#rtlMode) { tabs.reverse(); -@@ -2610,7 +2686,7 @@ +@@ -2610,7 +2684,7 @@ let screenAxis = this.verticalMode ? "screenY" : "screenX"; let size = this.verticalMode ? "height" : "width"; let translateAxis = this.verticalMode ? "translateY" : "translateX"; @@ -442,7 +431,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 let translateX = event.screenX - dragData.screenX; let translateY = event.screenY - dragData.screenY; -@@ -2620,10 +2696,16 @@ +@@ -2620,10 +2694,16 @@ dragData.translateY = translateY; // Move the dragged tab based on the mouse position. @@ -461,7 +450,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 let endEdge = ele => ele[screenAxis] + bounds(ele)[size]; let lastMovingTabScreen = endEdge(lastMovingTab); let firstMovingTabScreen = firstMovingTab[screenAxis]; -@@ -2632,6 +2714,7 @@ +@@ -2632,6 +2712,7 @@ // Constrain the range over which the moving tabs can move between the first and last tab let firstBound = firstTab[screenAxis] - firstMovingTabScreen; let lastBound = endEdge(lastTab) - lastMovingTabScreen; @@ -469,7 +458,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 // Center the tab under the cursor if the tab is not under the cursor while dragging if ( -@@ -2649,6 +2732,9 @@ +@@ -2649,6 +2730,9 @@ // Shift the `.tab-group-label-container` to shift the label element. item = item.parentElement; } @@ -479,7 +468,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 item.style.transform = `${translateAxis}(${translate}px)`; } -@@ -2786,6 +2872,9 @@ +@@ -2786,6 +2870,9 @@ break; } let element = tabs[mid]; @@ -489,7 +478,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 let elementForSize = isTabGroupLabel(element) ? element.parentElement : element; -@@ -2805,6 +2894,8 @@ +@@ -2805,6 +2892,8 @@ }; let dropElement = getOverlappedElement(); @@ -498,7 +487,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 let newDropElementIndex; if (dropElement) { -@@ -2869,7 +2960,10 @@ +@@ -2869,7 +2958,10 @@ let shouldCreateGroupOnDrop; let dropBefore; if (dropElement) { @@ -510,7 +499,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 ? dropElement.parentElement : dropElement; -@@ -2889,7 +2983,7 @@ +@@ -2889,7 +2981,7 @@ ? Services.prefs.getIntPref( "browser.tabs.dragDrop.moveOverThresholdPercent" ) / 100 @@ -519,7 +508,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 moveOverThreshold = Math.min(1, Math.max(0, moveOverThreshold)); let shouldMoveOver = overlapPercent > moveOverThreshold; if (logicalForward && shouldMoveOver) { -@@ -2921,44 +3015,21 @@ +@@ -2921,44 +3013,21 @@ // If dragging a group over another group, don't make it look like it is // possible to drop the dragged group inside the other group. @@ -569,7 +558,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 // When dragging tab(s) over an ungrouped tab, signal to the user // that dropping the tab(s) will create a new tab group. shouldCreateGroupOnDrop = -@@ -2968,12 +3039,6 @@ +@@ -2968,12 +3037,6 @@ overlapPercent > dragOverGroupingThreshold; if (shouldCreateGroupOnDrop) { @@ -582,7 +571,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 } else { this.removeAttribute("movingtab-createGroup"); document -@@ -3000,19 +3065,14 @@ +@@ -3000,19 +3063,14 @@ dropElement = dropElementGroup; colorCode = undefined; } else if (isTabGroupLabel(dropElement)) { @@ -610,7 +599,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 } this.#setDragOverGroupColor(colorCode); this.toggleAttribute("movingtab-ungroup", !colorCode); -@@ -3030,19 +3090,28 @@ +@@ -3030,19 +3088,28 @@ dragData.dropElement = dropElement; dragData.dropBefore = dropBefore; dragData.animDropElementIndex = newDropElementIndex; @@ -641,7 +630,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 } item.style.transform = transform; } -@@ -3095,12 +3164,14 @@ +@@ -3095,12 +3162,14 @@ ); } @@ -658,7 +647,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 for (let item of this.ariaFocusableItems) { if (isTabGroupLabel(item)) { -@@ -3108,6 +3179,18 @@ +@@ -3108,6 +3177,18 @@ item = item.parentElement; } item.style.transform = ""; @@ -677,7 +666,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 item.removeAttribute("dragover-createGroup"); } this.removeAttribute("movingtab-createGroup"); -@@ -3129,16 +3212,15 @@ +@@ -3129,16 +3210,15 @@ tab.style.left = ""; tab.style.top = ""; tab.style.maxWidth = ""; @@ -696,7 +685,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 } let periphery = draggedTabDocument.getElementById( "tabbrowser-arrowscrollbox-periphery" -@@ -3211,7 +3293,7 @@ +@@ -3211,7 +3291,7 @@ let postTransitionCleanup = () => { movingTab._moveTogetherSelectedTabsData.animate = false; }; @@ -705,7 +694,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 postTransitionCleanup(); } else { let onTransitionEnd = transitionendEvent => { -@@ -3384,7 +3466,7 @@ +@@ -3384,7 +3464,7 @@ } _notifyBackgroundTab(aTab) { @@ -714,7 +703,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 return; } -@@ -3493,7 +3575,10 @@ +@@ -3493,7 +3573,10 @@ #getDragTarget(event, { ignoreSides = false } = {}) { let { target } = event; while (target) { @@ -726,7 +715,7 @@ index e2b27db6c13278defea3bcc7606a8da54e7d001c..db0c8da40e626354895421190ca5d6e3 break; } target = target.parentNode; -@@ -3510,6 +3595,9 @@ +@@ -3510,6 +3593,9 @@ return null; } } diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs index 5d34419d6..9b1d0fd9f 100644 --- a/src/zen/folders/ZenFolders.mjs +++ b/src/zen/folders/ZenFolders.mjs @@ -820,6 +820,7 @@ createLazyBrowser: true, }); + gBrowser.pinTab(emptyTab); tabs = [emptyTab, ...filteredTabs]; const folder = this._createFolderNode(options); From a4b8e2134f5d463c96630dd5e08bb37026e86127 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sun, 31 Aug 2025 00:49:36 +0200 Subject: [PATCH 34/55] fix: Fixed compact mode not restoring correctly at startup, b=bug #8606, c=compact-mode --- prefs/compact-mode.yaml | 3 ++ src/zen/compact-mode/ZenCompactMode.mjs | 41 ++++++++++++++++--------- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/prefs/compact-mode.yaml b/prefs/compact-mode.yaml index 2470ffcd6..130ecd62b 100644 --- a/prefs/compact-mode.yaml +++ b/prefs/compact-mode.yaml @@ -32,6 +32,9 @@ - name: zen.view.compact.show-background-tab-toast value: true +- name: zen.view.compact.debug + value: false + # Do not edit manually - name: zen.view.compact.should-enable-at-startup hidden: true diff --git a/src/zen/compact-mode/ZenCompactMode.mjs b/src/zen/compact-mode/ZenCompactMode.mjs index 00fc3a3d1..f638f6c28 100644 --- a/src/zen/compact-mode/ZenCompactMode.mjs +++ b/src/zen/compact-mode/ZenCompactMode.mjs @@ -39,16 +39,22 @@ var gZenCompactModeManager = { preInit() { // Remove it before initializing so we can properly calculate the width // of the sidebar at startup and avoid overflowing items not being hidden + let xulStoreValue = Services.xulStore.getValue( + AppConstants.BROWSER_CHROME_URL, + 'zen-main-app-wrapper', + 'zen-compact-mode' + ); + if (xulStoreValue === '-moz-missing\n' || !xulStoreValue) { + xulStoreValue = false; + } this._wasInCompactMode = - Services.xulStore.getValue( - AppConstants.BROWSER_CHROME_URL, - 'zen-main-app-wrapper', - 'zen-compact-mode' - ) || Services.prefs.getBoolPref('zen.view.compact.should-enable-at-startup', false); + xulStoreValue || + Services.prefs.getBoolPref('zen.view.compact.should-enable-at-startup', false); lazyCompactMode.mainAppWrapper.removeAttribute('zen-compact-mode'); + this._canDebugLog = Services.prefs.getBoolPref('zen.view.compact.debug', false); + this.addContextMenu(); - this._resolvePreInit(); }, init() { @@ -88,25 +94,30 @@ var gZenCompactModeManager = { }); } - this._preInitPromise.then(() => { + SessionStore.promiseAllWindowsRestored.then(() => { this.preference = this._wasInCompactMode; - delete this._resolvePreInit; - delete this._preInitPromise; }); }, + log(...args) { + if (this._canDebugLog) { + console.log('[Zen Compact Mode]', ...args); + } + }, + get preference() { - return lazyCompactMode.mainAppWrapper.getAttribute('zen-compact-mode') === 'true'; + return document.documentElement.getAttribute('zen-compact-mode') === 'true'; }, get shouldBeCompact() { - return !document.documentElement.getAttribute('chromehidden').includes('toolbar'); + return !document.documentElement.getAttribute('chromehidden')?.includes('toolbar'); }, set preference(value) { if (!this.shouldBeCompact) { value = false; } + this.log('Setting compact mode preference to', value); if ( this.preference === value || document.documentElement.hasAttribute('zen-compact-animating') @@ -225,6 +236,7 @@ var gZenCompactModeManager = { }, async _updateEvent() { + const isUrlbarFocused = gURLBar.focused; // IF we are animating IN, call the callbacks first so we can calculate the width // once the window buttons are shown this.updateContextMenu(); @@ -241,6 +253,9 @@ var gZenCompactModeManager = { this._evenListeners.forEach((callback) => callback()); } gZenUIManager.updateTabsToolbar(); + if (isUrlbarFocused) { + gURLBar.focus(); + } }, // NOTE: Dont actually use event, it's just so we make sure @@ -717,10 +732,6 @@ var gZenCompactModeManager = { }, }; -gZenCompactModeManager._preInitPromise = new Promise((resolve) => { - gZenCompactModeManager._resolvePreInit = resolve; -}); - document.addEventListener( 'MozBeforeInitialXULLayout', () => { From 30639e67dfe287dedda0d4a96b63a95d2ed3da7d Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sun, 31 Aug 2025 00:49:58 +0200 Subject: [PATCH 35/55] New Crowdin updates, p=#10159 --- locales/ar/browser/browser/zen-folders.ftl | 2 +- locales/ca/browser/browser/zen-folders.ftl | 2 +- locales/cs/browser/browser/zen-folders.ftl | 2 +- locales/cy/browser/browser/zen-folders.ftl | 2 +- locales/da/browser/browser/zen-folders.ftl | 2 +- locales/de/browser/browser/zen-folders.ftl | 2 +- locales/el/browser/browser/zen-folders.ftl | 2 +- locales/en-GB/browser/browser/zen-folders.ftl | 2 +- locales/es-ES/browser/browser/zen-folders.ftl | 2 +- locales/et/browser/browser/zen-folders.ftl | 2 +- locales/fa/browser/browser/zen-folders.ftl | 2 +- locales/fi/browser/browser/zen-folders.ftl | 2 +- locales/fr/browser/browser/zen-folders.ftl | 2 +- locales/ga-IE/browser/browser/zen-folders.ftl | 2 +- locales/he/browser/browser/zen-folders.ftl | 2 +- locales/hu/browser/browser/zen-folders.ftl | 2 +- locales/id/browser/browser/zen-folders.ftl | 2 +- locales/is/browser/browser/zen-folders.ftl | 2 +- locales/it/browser/browser/zen-folders.ftl | 2 +- locales/ja/browser/browser/zen-folders.ftl | 2 +- locales/ko/browser/browser/zen-folders.ftl | 2 +- locales/lt/browser/browser/zen-folders.ftl | 2 +- locales/nl/browser/browser/zen-folders.ftl | 2 +- locales/nn-NO/browser/browser/zen-folders.ftl | 2 +- locales/pl/browser/browser/zen-folders.ftl | 2 +- locales/pt-BR/browser/browser/zen-folders.ftl | 2 +- locales/pt-PT/browser/browser/zen-folders.ftl | 2 +- locales/ru/browser/browser/zen-folders.ftl | 2 +- locales/sv-SE/browser/browser/zen-folders.ftl | 2 +- locales/th/browser/browser/zen-folders.ftl | 2 +- locales/tr/browser/browser/zen-folders.ftl | 2 +- locales/uk/browser/browser/zen-folders.ftl | 2 +- locales/vi/browser/browser/zen-folders.ftl | 2 +- locales/zh-CN/browser/browser/zen-folders.ftl | 2 +- locales/zh-TW/browser/browser/zen-folders.ftl | 2 +- 35 files changed, 35 insertions(+), 35 deletions(-) diff --git a/locales/ar/browser/browser/zen-folders.ftl b/locales/ar/browser/browser/zen-folders.ftl index c9fc4dc8a..409703d2a 100644 --- a/locales/ar/browser/browser/zen-folders.ftl +++ b/locales/ar/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = No tabs matching that search 🤔 diff --git a/locales/ca/browser/browser/zen-folders.ftl b/locales/ca/browser/browser/zen-folders.ftl index 76f4bfff3..188b2c960 100644 --- a/locales/ca/browser/browser/zen-folders.ftl +++ b/locales/ca/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Canvia la icona zen-folders-unload-all-tooltip = - .tooltiptext = Descarrega totes les pestanyes d'aquesta carpeta + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Descarrega totes les pestanyes zen-folders-search-no-results = No hi ha pestanyes que coincideixin amb aquesta cerca 🤔 diff --git a/locales/cs/browser/browser/zen-folders.ftl b/locales/cs/browser/browser/zen-folders.ftl index fff1aa18c..d8a804c94 100644 --- a/locales/cs/browser/browser/zen-folders.ftl +++ b/locales/cs/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Změnit ikonu zen-folders-unload-all-tooltip = - .tooltiptext = Uspat všechny panely v této složce + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Uspat všechny panely zen-folders-search-no-results = Žádný panel neodpovídá tomuto hledání 🤔 diff --git a/locales/cy/browser/browser/zen-folders.ftl b/locales/cy/browser/browser/zen-folders.ftl index c9fc4dc8a..409703d2a 100644 --- a/locales/cy/browser/browser/zen-folders.ftl +++ b/locales/cy/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = No tabs matching that search 🤔 diff --git a/locales/da/browser/browser/zen-folders.ftl b/locales/da/browser/browser/zen-folders.ftl index 42bd518c4..54d0cc583 100644 --- a/locales/da/browser/browser/zen-folders.ftl +++ b/locales/da/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Skift ikon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = Ingen faner matcher den søgning 🤔 diff --git a/locales/de/browser/browser/zen-folders.ftl b/locales/de/browser/browser/zen-folders.ftl index eb4239558..1f13e990f 100644 --- a/locales/de/browser/browser/zen-folders.ftl +++ b/locales/de/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Symbol ändern zen-folders-unload-all-tooltip = - .tooltiptext = Alle Tabs in diesem Ordner entladen + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Alle Tabs entladen zen-folders-search-no-results = Keine passenden Tabs gefunden 🤔 diff --git a/locales/el/browser/browser/zen-folders.ftl b/locales/el/browser/browser/zen-folders.ftl index c9fc4dc8a..409703d2a 100644 --- a/locales/el/browser/browser/zen-folders.ftl +++ b/locales/el/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = No tabs matching that search 🤔 diff --git a/locales/en-GB/browser/browser/zen-folders.ftl b/locales/en-GB/browser/browser/zen-folders.ftl index c9fc4dc8a..409703d2a 100644 --- a/locales/en-GB/browser/browser/zen-folders.ftl +++ b/locales/en-GB/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = No tabs matching that search 🤔 diff --git a/locales/es-ES/browser/browser/zen-folders.ftl b/locales/es-ES/browser/browser/zen-folders.ftl index e9c4cf792..1d5a5d242 100644 --- a/locales/es-ES/browser/browser/zen-folders.ftl +++ b/locales/es-ES/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Cambiar icono zen-folders-unload-all-tooltip = - .tooltiptext = Suspender todas las pestañas de esta carpeta + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Suspender todas las pestañas zen-folders-search-no-results = Ninguna pestaña coincide con esa búsqueda 🤔 diff --git a/locales/et/browser/browser/zen-folders.ftl b/locales/et/browser/browser/zen-folders.ftl index 26e0bb905..f17acd90a 100644 --- a/locales/et/browser/browser/zen-folders.ftl +++ b/locales/et/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Muuda ikooni zen-folders-unload-all-tooltip = - .tooltiptext = Eemalda mälust selle kausta kaardid + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Eemalda mälust kõik kaardid zen-folders-search-no-results = Otsingule ei vasta ühtegi kaarti 🤔 diff --git a/locales/fa/browser/browser/zen-folders.ftl b/locales/fa/browser/browser/zen-folders.ftl index c9fc4dc8a..409703d2a 100644 --- a/locales/fa/browser/browser/zen-folders.ftl +++ b/locales/fa/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = No tabs matching that search 🤔 diff --git a/locales/fi/browser/browser/zen-folders.ftl b/locales/fi/browser/browser/zen-folders.ftl index c9fc4dc8a..409703d2a 100644 --- a/locales/fi/browser/browser/zen-folders.ftl +++ b/locales/fi/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = No tabs matching that search 🤔 diff --git a/locales/fr/browser/browser/zen-folders.ftl b/locales/fr/browser/browser/zen-folders.ftl index eac58719e..ba452f000 100644 --- a/locales/fr/browser/browser/zen-folders.ftl +++ b/locales/fr/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Changer d'icône zen-folders-unload-all-tooltip = - .tooltiptext = Décharger tous les onglets de ce dossier + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Décharger tous les onglets zen-folders-search-no-results = Aucun onglet ne correspond à cette recherche 🤔 diff --git a/locales/ga-IE/browser/browser/zen-folders.ftl b/locales/ga-IE/browser/browser/zen-folders.ftl index 7dadcca93..70c55301b 100644 --- a/locales/ga-IE/browser/browser/zen-folders.ftl +++ b/locales/ga-IE/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Athraigh Deilbhín zen-folders-unload-all-tooltip = - .tooltiptext = Díluchtaigh gach cluaisín sa bhfillteán seo + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Díluchtaigh Gach Cluaisín zen-folders-search-no-results = Níl aon chluaisíní ann a mheaitseálann an cuardach sin 🤔 diff --git a/locales/he/browser/browser/zen-folders.ftl b/locales/he/browser/browser/zen-folders.ftl index 51b64b9b9..83dfd55e6 100644 --- a/locales/he/browser/browser/zen-folders.ftl +++ b/locales/he/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = שינוי סמל zen-folders-unload-all-tooltip = - .tooltiptext = פינוי כל הכרטיסייות בתיקייה הזו + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = פינוי כל הכרטיסייות zen-folders-search-no-results = אין כרטיסיות שתואמות לחיפוש 🤔 diff --git a/locales/hu/browser/browser/zen-folders.ftl b/locales/hu/browser/browser/zen-folders.ftl index 6feda3973..ebf10cb31 100644 --- a/locales/hu/browser/browser/zen-folders.ftl +++ b/locales/hu/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Ikon módosítása zen-folders-unload-all-tooltip = - .tooltiptext = Minden mappában lévő lap ürítése + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Minden lap ürítése zen-folders-search-no-results = Nincsenek a keresésnek megfelelő lapok 🤔 diff --git a/locales/id/browser/browser/zen-folders.ftl b/locales/id/browser/browser/zen-folders.ftl index ea3314153..313225a4f 100644 --- a/locales/id/browser/browser/zen-folders.ftl +++ b/locales/id/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Ubah Ikon zen-folders-unload-all-tooltip = - .tooltiptext = Lepaskan semua tab di folder ini + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Lepaskan Semua Tab zen-folders-search-no-results = Tidak ada tab yang cocok 🤔 diff --git a/locales/is/browser/browser/zen-folders.ftl b/locales/is/browser/browser/zen-folders.ftl index c9fc4dc8a..409703d2a 100644 --- a/locales/is/browser/browser/zen-folders.ftl +++ b/locales/is/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = No tabs matching that search 🤔 diff --git a/locales/it/browser/browser/zen-folders.ftl b/locales/it/browser/browser/zen-folders.ftl index 0dec27cd8..722934b28 100644 --- a/locales/it/browser/browser/zen-folders.ftl +++ b/locales/it/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Cambia Icona zen-folders-unload-all-tooltip = - .tooltiptext = Scarica tutte le schede in questa cartella + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Scarica tutte le Schede zen-folders-search-no-results = Nessuna scheda corrispondente alla ricerca 🤔 diff --git a/locales/ja/browser/browser/zen-folders.ftl b/locales/ja/browser/browser/zen-folders.ftl index c9fc4dc8a..409703d2a 100644 --- a/locales/ja/browser/browser/zen-folders.ftl +++ b/locales/ja/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = No tabs matching that search 🤔 diff --git a/locales/ko/browser/browser/zen-folders.ftl b/locales/ko/browser/browser/zen-folders.ftl index b991e9dfe..b90bc9ae1 100644 --- a/locales/ko/browser/browser/zen-folders.ftl +++ b/locales/ko/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = 아이콘 변경 zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = 검색어에 맞는 탭이 없습니다 🤔 diff --git a/locales/lt/browser/browser/zen-folders.ftl b/locales/lt/browser/browser/zen-folders.ftl index f8fb12be3..84556ec44 100644 --- a/locales/lt/browser/browser/zen-folders.ftl +++ b/locales/lt/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Keisti piktogramą zen-folders-unload-all-tooltip = - .tooltiptext = Iškelti visas korteles šiame aplanke + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Iškelti visas korteles zen-folders-search-no-results = Nėra kortelių, atitinkančių šią paiešką. 🤔 diff --git a/locales/nl/browser/browser/zen-folders.ftl b/locales/nl/browser/browser/zen-folders.ftl index 5a92bc667..fb91efce2 100644 --- a/locales/nl/browser/browser/zen-folders.ftl +++ b/locales/nl/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = No tabs matching that search 🤔 diff --git a/locales/nn-NO/browser/browser/zen-folders.ftl b/locales/nn-NO/browser/browser/zen-folders.ftl index c9fc4dc8a..409703d2a 100644 --- a/locales/nn-NO/browser/browser/zen-folders.ftl +++ b/locales/nn-NO/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = No tabs matching that search 🤔 diff --git a/locales/pl/browser/browser/zen-folders.ftl b/locales/pl/browser/browser/zen-folders.ftl index 0876369f6..7bc2588f6 100644 --- a/locales/pl/browser/browser/zen-folders.ftl +++ b/locales/pl/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = No tabs matching that search 🤔 diff --git a/locales/pt-BR/browser/browser/zen-folders.ftl b/locales/pt-BR/browser/browser/zen-folders.ftl index 44a575277..241a98d35 100644 --- a/locales/pt-BR/browser/browser/zen-folders.ftl +++ b/locales/pt-BR/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Alterar Ícone zen-folders-unload-all-tooltip = - .tooltiptext = Descarregar todas as abas nesta pasta + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Descarregar todas as abas zen-folders-search-no-results = Nenhuma guia corresponde a essa pesquisa 🤔 diff --git a/locales/pt-PT/browser/browser/zen-folders.ftl b/locales/pt-PT/browser/browser/zen-folders.ftl index fb3624b06..5e5d3d080 100644 --- a/locales/pt-PT/browser/browser/zen-folders.ftl +++ b/locales/pt-PT/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Alterar Ícone zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = Não existem separadores que correspondam a essa pesquisa 🤔 diff --git a/locales/ru/browser/browser/zen-folders.ftl b/locales/ru/browser/browser/zen-folders.ftl index de1f74ce1..e3976b196 100644 --- a/locales/ru/browser/browser/zen-folders.ftl +++ b/locales/ru/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = No tabs matching that search 🤔 diff --git a/locales/sv-SE/browser/browser/zen-folders.ftl b/locales/sv-SE/browser/browser/zen-folders.ftl index c9fc4dc8a..409703d2a 100644 --- a/locales/sv-SE/browser/browser/zen-folders.ftl +++ b/locales/sv-SE/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = No tabs matching that search 🤔 diff --git a/locales/th/browser/browser/zen-folders.ftl b/locales/th/browser/browser/zen-folders.ftl index c9fc4dc8a..409703d2a 100644 --- a/locales/th/browser/browser/zen-folders.ftl +++ b/locales/th/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = No tabs matching that search 🤔 diff --git a/locales/tr/browser/browser/zen-folders.ftl b/locales/tr/browser/browser/zen-folders.ftl index c9fc4dc8a..409703d2a 100644 --- a/locales/tr/browser/browser/zen-folders.ftl +++ b/locales/tr/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = No tabs matching that search 🤔 diff --git a/locales/uk/browser/browser/zen-folders.ftl b/locales/uk/browser/browser/zen-folders.ftl index 6d1b84aa7..73abab096 100644 --- a/locales/uk/browser/browser/zen-folders.ftl +++ b/locales/uk/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Змінити значок zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = Немає вкладок, які відповідають критеріям пошуку 🤔 diff --git a/locales/vi/browser/browser/zen-folders.ftl b/locales/vi/browser/browser/zen-folders.ftl index 888dc531d..021bcbf26 100644 --- a/locales/vi/browser/browser/zen-folders.ftl +++ b/locales/vi/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Đổi biểu tượng thư mục thẻ zen-folders-unload-all-tooltip = - .tooltiptext = Tải lại tất cả các thẻ trong thư mục + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Tải lại tất cả các thẻ zen-folders-search-no-results = Không có thẻ nào trùng với tìm kiếm 🤔 diff --git a/locales/zh-CN/browser/browser/zen-folders.ftl b/locales/zh-CN/browser/browser/zen-folders.ftl index ad142bc6c..3c19d8a30 100644 --- a/locales/zh-CN/browser/browser/zen-folders.ftl +++ b/locales/zh-CN/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = No tabs matching that search 🤔 diff --git a/locales/zh-TW/browser/browser/zen-folders.ftl b/locales/zh-TW/browser/browser/zen-folders.ftl index c9fc4dc8a..409703d2a 100644 --- a/locales/zh-TW/browser/browser/zen-folders.ftl +++ b/locales/zh-TW/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Change Icon zen-folders-unload-all-tooltip = - .tooltiptext = Unload all tabs in this folder + .tooltiptext = Unload active in this folder zen-folders-unload-folder = .label = Unload All Tabs zen-folders-search-no-results = No tabs matching that search 🤔 From 6a68a28f7674433674522d266abf777ab7976aab Mon Sep 17 00:00:00 2001 From: reizumi Date: Sun, 31 Aug 2025 17:45:28 +0800 Subject: [PATCH 36/55] fix: replace essential icons with SVGs in onboarding, p=#10165 * fix: replace essential icons with SVGs in onboarding * fix: add white border to notion's icon --- .../base/content/zen-assets.jar.inc.mn | 20 ++-- src/zen/images/favicons/calendar.ico | Bin 4414 -> 0 bytes src/zen/images/favicons/calendar.svg | 10 ++ src/zen/images/favicons/discord.ico | Bin 3774 -> 0 bytes src/zen/images/favicons/discord.svg | 4 + src/zen/images/favicons/figma.ico | Bin 34494 -> 0 bytes src/zen/images/favicons/figma.svg | 7 ++ src/zen/images/favicons/github.ico | Bin 41662 -> 0 bytes src/zen/images/favicons/github.svg | 1 + src/zen/images/favicons/notion.ico | Bin 32038 -> 0 bytes src/zen/images/favicons/notion.svg | 4 + src/zen/images/favicons/obsidian.ico | Bin 31332 -> 0 bytes src/zen/images/favicons/obsidian.svg | 5 + src/zen/images/favicons/reddit.ico | Bin 2238 -> 0 bytes src/zen/images/favicons/reddit.svg | 112 ++++++++++++++++++ src/zen/images/favicons/slack.ico | Bin 4286 -> 0 bytes src/zen/images/favicons/slack.svg | 6 + src/zen/images/favicons/trello.ico | Bin 108167 -> 0 bytes src/zen/images/favicons/trello.svg | 11 ++ src/zen/images/favicons/x.ico | Bin 2238 -> 0 bytes src/zen/images/favicons/x.svg | 4 + src/zen/welcome/ZenWelcome.mjs | 22 ++-- src/zen/welcome/zen-welcome.css | 12 +- 23 files changed, 191 insertions(+), 27 deletions(-) delete mode 100644 src/zen/images/favicons/calendar.ico create mode 100644 src/zen/images/favicons/calendar.svg delete mode 100644 src/zen/images/favicons/discord.ico create mode 100644 src/zen/images/favicons/discord.svg delete mode 100644 src/zen/images/favicons/figma.ico create mode 100644 src/zen/images/favicons/figma.svg delete mode 100644 src/zen/images/favicons/github.ico create mode 100644 src/zen/images/favicons/github.svg delete mode 100644 src/zen/images/favicons/notion.ico create mode 100644 src/zen/images/favicons/notion.svg delete mode 100644 src/zen/images/favicons/obsidian.ico create mode 100644 src/zen/images/favicons/obsidian.svg delete mode 100644 src/zen/images/favicons/reddit.ico create mode 100644 src/zen/images/favicons/reddit.svg delete mode 100644 src/zen/images/favicons/slack.ico create mode 100644 src/zen/images/favicons/slack.svg delete mode 100644 src/zen/images/favicons/trello.ico create mode 100644 src/zen/images/favicons/trello.svg delete mode 100644 src/zen/images/favicons/x.ico create mode 100644 src/zen/images/favicons/x.svg diff --git a/src/browser/base/content/zen-assets.jar.inc.mn b/src/browser/base/content/zen-assets.jar.inc.mn index 4c341e4e1..aaf4bced9 100644 --- a/src/browser/base/content/zen-assets.jar.inc.mn +++ b/src/browser/base/content/zen-assets.jar.inc.mn @@ -96,13 +96,13 @@ content/browser/zen-vendor/motion.min.mjs (../../zen/vendor/motion.min.mjs) # FavIcons for startup - content/browser/zen-images/favicons/calendar.ico (../../zen/images/favicons/calendar.ico) - content/browser/zen-images/favicons/discord.ico (../../zen/images/favicons/discord.ico) - content/browser/zen-images/favicons/figma.ico (../../zen/images/favicons/figma.ico) - content/browser/zen-images/favicons/github.ico (../../zen/images/favicons/github.ico) - content/browser/zen-images/favicons/notion.ico (../../zen/images/favicons/notion.ico) - content/browser/zen-images/favicons/obsidian.ico (../../zen/images/favicons/obsidian.ico) - content/browser/zen-images/favicons/slack.ico (../../zen/images/favicons/slack.ico) - content/browser/zen-images/favicons/reddit.ico (../../zen/images/favicons/reddit.ico) - content/browser/zen-images/favicons/x.ico (../../zen/images/favicons/x.ico) - content/browser/zen-images/favicons/trello.ico (../../zen/images/favicons/trello.ico) + content/browser/zen-images/favicons/calendar.svg (../../zen/images/favicons/calendar.svg) + content/browser/zen-images/favicons/discord.svg (../../zen/images/favicons/discord.svg) + content/browser/zen-images/favicons/figma.svg (../../zen/images/favicons/figma.svg) + content/browser/zen-images/favicons/github.svg (../../zen/images/favicons/github.svg) + content/browser/zen-images/favicons/notion.svg (../../zen/images/favicons/notion.svg) + content/browser/zen-images/favicons/obsidian.svg (../../zen/images/favicons/obsidian.svg) + content/browser/zen-images/favicons/slack.svg (../../zen/images/favicons/slack.svg) + content/browser/zen-images/favicons/reddit.svg (../../zen/images/favicons/reddit.svg) + content/browser/zen-images/favicons/x.svg (../../zen/images/favicons/x.svg) + content/browser/zen-images/favicons/trello.svg (../../zen/images/favicons/trello.svg) diff --git a/src/zen/images/favicons/calendar.ico b/src/zen/images/favicons/calendar.ico deleted file mode 100644 index 7b1720e2c8c670d2f06a54a4a154eba65d5aea68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4414 zcmZQzU}RuqP*4ET3Je;83=Con3=A3!3=9ek3=9qo5OD@55awoJ0AVPX!L&itz@kCo zzD0w?e`FlI!sI_Sv6<7$2AG}5w0VR0dt`fIY--vKGRxHY)qiYmfZ2ymgY-}ngX{-k zbT^>e3*%GMZjf0ZyI~mF4KVxAX^JKar~laS ze<}l(J-`2B!`SQwiBZ{ltagLk1F{PnCS?E5H;?{*xp@?f|9t&ONI6yQf3~vj|D|+E z6bur>=MIoxv0-d}2Z`bG(BlR9aC;w2OZX4sUoBJzi-Fj<^kK6bBnGkz8^&f1D7-=b zzFMIE9~AyDH6ZqlDl@PfKx$y($TY|^XF4&oPcPUdSn`# z-5@cLUDzFUbEO8YTv#Uu^CHyNw?9U#~Jl34c(!yVdLhw*U2>SuiJ|&>+8J z!`S=|5<}4p<-q(13ImWEK=A>>AT~%0lmbvl}FaVE|MBWDm$bkX<16ygRn?KZu4(5!NLGrK7gq~r?J@$5(C+V4WsKv=7Yi> z=7zhy!6l-EFc z5?7gvtPf-tHjK?~kQlOFYOt}{4H5&{g$+}~PGmDcc45QV>;{P;>!k)8o82HWkX`h^ zpfUp+ria}iJFwXe5(CN61B2|shUsB9$PR3FgT%hHI^74!(;9>9!h-jIZ*z$M-0Jjx T0PNp?K0^XDM1b5KA8~8|@7UM+ diff --git a/src/zen/images/favicons/calendar.svg b/src/zen/images/favicons/calendar.svg new file mode 100644 index 000000000..fd4edd73a --- /dev/null +++ b/src/zen/images/favicons/calendar.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/zen/images/favicons/discord.ico b/src/zen/images/favicons/discord.ico deleted file mode 100644 index deb85436d83f636982720cdd6007cd491660257b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3774 zcmZQzU}RuqFfaho91JV?7#PGD7#K7d7#Iu~7#I>5AmR)lzzHItm=P?&;8Wnv@F_K% z;Zte^7=KJbuwh~_`v3p`44>iy89qjMGJKymo#AUo9mCI^TNr*{ILq+w%NK?}5AQR4 zE>4G9FiMSvz-R~zxe#FCU}ffH;^JcBWM<`HA>@2^PA(L{$&N<{3oD9RD2El7CG1cI z7!+1J7}+q?!3Eerg&nHHIN*|4862pp8F0DFGRCow_<2$674 z;|UpLGuWVhCc^O$Z4fW8KsXSRhnEM!fRJcha7-g50v=vIVSXeHJp96Z$Of>2Tm&(R zi;IhgS3roHTZk9LG_k;=7OEbu5`_U*&jAY^ znE5Em;2gMmR%Vbbpb&wXFD$|(08uBvB?9vbTsx#8+T zB>~t59)5_FATJjegbj)~UP$BE1i9q8Vq84re57cTQK7J@mke?44{DN@vnPC3q;(~erVj?OD@(RRwPFQ#%9E7SA z!~-WmhT#KtgZ~E>93S9xjf9 z0V%H-7)UG+8AvT}8IU6xhg-O~5al^aB;ZmHb37A)2 o46_$T<8mj=AL#yr`5P7vuyFYg@&qWnVBrP}M_9PR!WkOw0LS33IRF3v diff --git a/src/zen/images/favicons/discord.svg b/src/zen/images/favicons/discord.svg new file mode 100644 index 000000000..5b5e3df23 --- /dev/null +++ b/src/zen/images/favicons/discord.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/zen/images/favicons/figma.ico b/src/zen/images/favicons/figma.ico deleted file mode 100644 index 108a33de2656fdbbd34b9411880271cad13e5fa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34494 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 diff --git a/src/zen/images/favicons/figma.svg b/src/zen/images/favicons/figma.svg new file mode 100644 index 000000000..ed566dcc1 --- /dev/null +++ b/src/zen/images/favicons/figma.svg @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/src/zen/images/favicons/github.ico b/src/zen/images/favicons/github.ico deleted file mode 100644 index 497be7368a436033cf9f18baddf2ce529e1ef0ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41662 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 YOh};s<%3-W%0)0fI{lvklITF<0R3h=k^lez diff --git a/src/zen/images/favicons/github.svg b/src/zen/images/favicons/github.svg new file mode 100644 index 000000000..9b39d72a5 --- /dev/null +++ b/src/zen/images/favicons/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/zen/images/favicons/notion.ico b/src/zen/images/favicons/notion.ico deleted file mode 100644 index b179b1fcf185d0230199835cd9fd5d7c9b71ffa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32038 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 diff --git a/src/zen/images/favicons/notion.svg b/src/zen/images/favicons/notion.svg new file mode 100644 index 000000000..1da179e0b --- /dev/null +++ b/src/zen/images/favicons/notion.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/zen/images/favicons/obsidian.ico b/src/zen/images/favicons/obsidian.ico deleted file mode 100644 index 8aad7e4619e74ee78fee5b73a622a978f8b6a3c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31332 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 + + + + \ No newline at end of file diff --git a/src/zen/images/favicons/reddit.ico b/src/zen/images/favicons/reddit.ico deleted file mode 100644 index 7b1a4b433ebe901186a2c62a3dcea6d46fd55ced..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2238 zcmZQzU}RuqP*4ET91JTs7#PGD7#K7d7#I{77#JKFAmR)lzyczmm=P?&;8Wnvz~K6y zfx+!Rga)xe*aeLbmH+?$9|ME^e+CAN{|w*0yk>a!`Vqt5zuy@i-#*0(U#iPp% zObiSRR;fQ3e*E~xux7^>hO?)SF$nwpV>ov4H$%n5-wfBU-(l#V`wgT5y|)3OV@^hA>u!Sj5sTUN8W!1A+r?>$_|$q(o$0xoC2B{7^L4b*hSuBsIKXN zdSa9s4S~@RpeO{`Ik-^(2O}pF8b^NNS3TYDx-#%uxU-6;)Lg z6_w-{5D*a&23f(vzy{LJEh`|v&(E(c3I@vj{QUd^vS0}|E|7K^etv#&K|ujoNl8gb zSph*oL4JOI8IS=?AmjNY_{9Zfg@xsLz(8JDSXNM+UjpO;PDXBSUPS?MK|viA6*aIl zkD`i-j-a5pfFdt9HzNl(ub2qGprE)0x0o12UW{8zL!3vDUqpXuzECupE6C`{=X@ZxJ zPfA!zOIQk=MnEFm+}v#7_yGqsh~QOM=H=!UlT&~s0B#lr25|g>&0JK{=2DQ2JnC0H-gw0&aCp0UjP6IX-S~Ncv)crcam( zUKx-drMS6a=@VT6pNzCLC~82KgHtF2JE|4De0;pzNcn?-fdSQ#+}zv{r$MxXNOl(F ze2knwL9!ss#>K+O!OhLV$jOY9zZ)2s|2Hr&{6E0JQ2&5|LH+{+1OEdC26hlWz`(%V qz`(!=!XOh!!5}>#3^D^`76^mP{=vW?|Br#8{yzi5|NjS={{sM8wUvwj diff --git a/src/zen/images/favicons/reddit.svg b/src/zen/images/favicons/reddit.svg new file mode 100644 index 000000000..fcb08b5e6 --- /dev/null +++ b/src/zen/images/favicons/reddit.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/zen/images/favicons/slack.ico b/src/zen/images/favicons/slack.ico deleted file mode 100644 index 3279160cf85efa6acb54ba5a61873d0a81c968fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4286 zcmZQzU}RuqP*4ET3Jfa*7#PGD7#K7d7#I{77#JKFAmR)lAOIpr$I!7tdEj^ z@F_~}!G&n~hv89j4;f)5>2H3^q`&!Hj^3s>H}y8Xd8@bi%^dwLZ{%U}l+aOf51FFm z9^8$Rd+;9#|BaD8F$?WIv_mgY?HKJ!Fbecn}&b|1dvB@u?h042Frd-+1$XHvP@-BJ?-E z>BNh-ylv6n^4`;A`zLVu5v%x6GfM8kEu{4IBU=7pIw|%WZT={wx9QCd9O)387trMX z>1}>{Tz~63=_vV!Ymw{*=kI8_hyP*}AE|=eK*;~bn?Et>Z+?3j&3tTjVi9}W1}#&; z_M*DuVGPLrXt{@dsN#rnFjegtyWy5MV&vKV=D+^tH>aZH9$dm|zWjqUu>JB6L$S)s zJ-h^xH`(!l9hBe5bHm$}(ee+YqvRg^!>|Kt|EkdcOwn==&Y;PEiIIPx53(PG4Ys_C z(%barCy8$OWw7h#u)hrHc@g9pQ6|SwI5`DlHx0#Xt{^0qvRg^jh26SD@yT^ z5l9>v8*F*!r@!g#Q)1kpzxmA#lbs)xjJCZ6=K+{GF-lLk<5eE+IaJSM&oTCc<|!wpSeJ4(eam44s4%Jn2UcnVJ?9Se>r9;{_T_<3%Xty zzxjYUTf=rEJ{TWHH|#LvsoQBF0m8Mr48$6?nKQ%WJ{~n={B+DL>cdg9Zy%1D{U?M! z9yR;;>9~a_Oh1V3-eb*Jw?jXpZoA%(+HHFO>bB{xYu#_g4Uz-l+U)ZEE;y|Gk!c~o=(V4Eb`w!oiMipnGM2q+w`+*x9R$aiU50U>{ zw_V@s!!fh#Sj;CJ4#&)Ig3NB-Y06oxw|2YU z_PTBQpr$&*w^MeEpHEm=emrWC_3@}h4o-Z`JnQ3eOL(~lGPhxyAwmCx)PZorHgnP1 z?fPMLJM>Y^0LhVyiHU!5%|_Pu@u<1g$7AM&ACH+;!|%qy_j4HEl#!k(>eyPh;OO@qrEWOm&Sg9zj}B!~U!xLGL3 zE-V<_{%F{4z)`zR?>n-+Q1;)(?M5o(*omy?<8ced4@b=|q1pfY^Jztx>Eki8nIDds-T8RTZ0E=0=I&pPS;E@^bvq0g>v!l!*KN}~ zRJUF4THSX2_WJGm62#d3zp?TEe?|~y`2U{)h8h3=XJG#SpW*-ic7_9t%nS_-Aj`m* zk%57cv4MfH`2fSi=MUHqus?5RU~X(+U<6@?1_lPOVvvRd4eSh$!G;`Q`2W8FW;VnB M|BN8q_#b390K-H#i~s-t diff --git a/src/zen/images/favicons/slack.svg b/src/zen/images/favicons/slack.svg new file mode 100644 index 000000000..2cdecb2a9 --- /dev/null +++ b/src/zen/images/favicons/slack.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/zen/images/favicons/trello.ico b/src/zen/images/favicons/trello.ico deleted file mode 100644 index c8bb9d9be36a44b7c4cbc39c8c818cc13870eaed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108167 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 diff --git a/src/zen/images/favicons/trello.svg b/src/zen/images/favicons/trello.svg new file mode 100644 index 000000000..4411e5026 --- /dev/null +++ b/src/zen/images/favicons/trello.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/zen/images/favicons/x.ico b/src/zen/images/favicons/x.ico deleted file mode 100644 index 67f3740155b019bf6d4a22dfac1ac7e6e05cf0c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2238 zcmZQzU}RuqP*4ET91JTs7#PGD7#K7d7#I{77#JKFAmR)lzyczmm=P=i=KTNvpW*)f z`wRjC0t^ZY3JmYxzh@{YC}41KaA0U?XkggCe?P@FE&B(?EGK3vOAWJ~m z%v_ADVAGkfm=03I!U_rouoWOK1_t{IYz2lCNB|sWEFddDJWLD@Gft2PFy$DaVaCRY z8kY!_yo}ro47{vd{1`zCR>RB%@){Q_3o{p18+bsXJRrR+;0Oe3LJ;6E1IIi{WWyA| zq6Lx&cp1?{kOvfS2$!*e+zQjnz`(!`vR42p(!p^FSHR4~%E7_Gikzf)kb{96l$;q+ NBb^JC3pZ<|F#tm$AL{@B diff --git a/src/zen/images/favicons/x.svg b/src/zen/images/favicons/x.svg new file mode 100644 index 000000000..966787626 --- /dev/null +++ b/src/zen/images/favicons/x.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/zen/welcome/ZenWelcome.mjs b/src/zen/welcome/ZenWelcome.mjs index a950cc617..08a9458a5 100644 --- a/src/zen/welcome/ZenWelcome.mjs +++ b/src/zen/welcome/ZenWelcome.mjs @@ -92,12 +92,12 @@ [ 'https://reddit.com/r/zen_browser', 'Zen on Reddit', - 'chrome://browser/content/zen-images/favicons/reddit.ico', + 'chrome://browser/content/zen-images/favicons/reddit.svg', ], [ 'https://x.com/zen_browser', 'Zen on Twitter', - 'chrome://browser/content/zen-images/favicons/x.ico', + 'chrome://browser/content/zen-images/favicons/x.svg', ], ]; @@ -549,47 +549,47 @@ - + - + - + - + - + - + - + - + - + diff --git a/src/zen/welcome/zen-welcome.css b/src/zen/welcome/zen-welcome.css index aa970fa6f..6d6df0151 100644 --- a/src/zen/welcome/zen-welcome.css +++ b/src/zen/welcome/zen-welcome.css @@ -252,15 +252,15 @@ & .extra-tab { width: 100%; - height: 3rem; - border-radius: 0.8rem; + height: 4rem; + border-radius: var(--border-radius-large); margin-top: 0.5rem; background: var(--zen-toolbar-element-bg); grid-column: span 3; } & .tabbrowser-tab { - --tab-min-height: 5rem !important; + --tab-min-height: 6rem !important; min-width: 5rem !important; transition: transform 0.1s; position: relative; @@ -268,14 +268,14 @@ &::after { position: absolute; content: ''; - width: 1.6rem; - height: 1.6rem; + width: 2rem; + height: 2rem; top: 50%; left: 50%; transform: translate(-50%, -50%); background: var(--zen-essential-tab-icon); background-position: center; - background-size: cover; + background-size: contain; background-repeat: no-repeat; } From 6a05a798242a483434a275906edb7683ee4a6c7e Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sun, 31 Aug 2025 12:06:05 +0200 Subject: [PATCH 37/55] fix: Fixed private mode browsing not starting up, b=no-bug, c=common, folders --- prefs/theme.yaml | 3 +++ .../common/styles/zen-single-components.css | 22 ++++++++++--------- src/zen/folders/ZenFolders.mjs | 4 +++- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/prefs/theme.yaml b/prefs/theme.yaml index 0c1c7bcb1..7d912f41b 100644 --- a/prefs/theme.yaml +++ b/prefs/theme.yaml @@ -32,6 +32,9 @@ - name: zen.theme.hide-tab-throbber value: true +- name: zen.theme.styled-status-panel + value: false + # ==== Mark: border radius ==== # macOS border radius diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css index e7f7ae672..8218e2ebf 100644 --- a/src/zen/common/styles/zen-single-components.css +++ b/src/zen/common/styles/zen-single-components.css @@ -231,16 +231,18 @@ body > #confetti { /* Status panel */ -#statuspanel { - padding: 4px 3px; +@media (-moz-pref('zen.theme.styled-status-panel')) { + #statuspanel { + padding: 4px 3px; - & > #statuspanel-label { - border-radius: 16px !important; - border: 1px solid rgba(225, 225, 225, 0.15) !important; - padding: 5px 9px 6px 9px !important; - font-weight: 600 !important; - background: color-mix(in srgb, var(--zen-primary-color), black 80%) !important; - color: #f3f3f3 !important; - font-size: smaller !important; + & > #statuspanel-label { + border-radius: 16px !important; + border: 1px solid rgba(225, 225, 225, 0.15) !important; + padding: 4px 8px 5px 8px !important; + font-weight: 600 !important; + background: color-mix(in srgb, var(--zen-primary-color), black 80%) !important; + color: #f3f3f3 !important; + font-size: small !important; + } } } diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs index 9b1d0fd9f..ee83a4fad 100644 --- a/src/zen/folders/ZenFolders.mjs +++ b/src/zen/folders/ZenFolders.mjs @@ -337,7 +337,9 @@ clearTimeout(this.#mouseTimer); this.#mouseTimer = null; } - this.#popup.hidePopup(); + if (this.#popup) { + this.#popup.hidePopup(); + } } async on_TabGroupCollapse(event) { From 9baed1ab901a0febaf5857597818daf2cb54be0e Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sun, 31 Aug 2025 12:15:55 +0200 Subject: [PATCH 38/55] feat: Small changes to the welcome page, b=no-bug, c=welcome --- src/zen/welcome/zen-welcome.css | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/zen/welcome/zen-welcome.css b/src/zen/welcome/zen-welcome.css index 6d6df0151..b7385e561 100644 --- a/src/zen/welcome/zen-welcome.css +++ b/src/zen/welcome/zen-welcome.css @@ -243,7 +243,7 @@ #zen-welcome-initial-essentials-browser-sidebar-essentials { display: grid; grid-template-columns: repeat(3, 1fr); - gap: 0.4rem 1.2rem; + gap: 1rem; visibility: visible; & * { @@ -268,8 +268,8 @@ &::after { position: absolute; content: ''; - width: 2rem; - height: 2rem; + width: 1.8rem; + height: 1.8rem; top: 50%; left: 50%; transform: translate(-50%, -50%); @@ -277,6 +277,7 @@ background-position: center; background-size: contain; background-repeat: no-repeat; + border-radius: 4px; } --border-radius-medium: 1rem; @@ -285,6 +286,10 @@ transform: scale(1.06); } + & .tab-background { + margin: 0 !important; + } + & .tab-background::after { filter: blur(30px) brightness(1.2); } From ba48b736e0b5f7a6a5bc324a951060b8b274cf94 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sun, 31 Aug 2025 14:20:17 +0200 Subject: [PATCH 39/55] feat: Only close the tab when wheel clicking the tab, b=no-bug, c=tabs --- src/zen/tabs/ZenPinnedTabManager.mjs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs index dd4e92747..7d718f0d6 100644 --- a/src/zen/tabs/ZenPinnedTabManager.mjs +++ b/src/zen/tabs/ZenPinnedTabManager.mjs @@ -603,7 +603,7 @@ async _onTabClick(e) { const tab = e.target?.closest('tab'); if (e.button === 1 && tab) { - await this._onCloseTabShortcut(e, tab); + await this._onCloseTabShortcut(e, tab, { closeIfPending: true }); } } @@ -750,7 +750,11 @@ async _onCloseTabShortcut( event, selectedTab = gBrowser.selectedTab, - { behavior = lazy.zenPinnedTabCloseShortcutBehavior, noClose = false } = {} + { + behavior = lazy.zenPinnedTabCloseShortcutBehavior, + noClose = false, + closeIfPending = false, + } = {} ) { if (!selectedTab?.pinned) { return; @@ -806,7 +810,7 @@ tabsToUnload = selectedTab.group.tabs; } const allAreUnloaded = tabsToUnload.every((tab) => tab.hasAttribute('pending')); - if (allAreUnloaded) { + if (allAreUnloaded && closeIfPending) { return await this._onCloseTabShortcut(event, selectedTab, { behavior: 'close' }); } await gBrowser.explicitUnloadTabs(tabsToUnload); From ae66e66aa8f2fc0c39aa6d8bef6fa01f5c9197e5 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sun, 31 Aug 2025 14:26:25 +0200 Subject: [PATCH 40/55] feat: Disable mozilla sponsors, b=no-bug, c=no-component --- prefs/disablemozilla.yaml | 3 +++ .../themes/shared/preferences/zen-preferences.css | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/prefs/disablemozilla.yaml b/prefs/disablemozilla.yaml index afd610149..048b75e18 100644 --- a/prefs/disablemozilla.yaml +++ b/prefs/disablemozilla.yaml @@ -34,3 +34,6 @@ - name: termsofuse.bypassNotification value: true + +- name: browser.newtabpage.activity-stream.showSponsoredCheckboxes + value: false diff --git a/src/browser/themes/shared/preferences/zen-preferences.css b/src/browser/themes/shared/preferences/zen-preferences.css index bef65dbfe..1cf0a14ae 100644 --- a/src/browser/themes/shared/preferences/zen-preferences.css +++ b/src/browser/themes/shared/preferences/zen-preferences.css @@ -582,7 +582,9 @@ groupbox h2 { #dataCollectionGroup, #websiteAdvertisingCategory, #websiteAdvertisingGroup, -#helpButton { +#helpButton, +#support-firefox, +.mission-message { display: none !important; } @@ -596,3 +598,9 @@ groupbox h2 { display: none; } } + +@media -moz-pref('zen.urlbar.replace-newtab') { + #category-home { + display: none !important; + } +} From 52a399f0ed508eacf9137fd67766b09e5e28d487 Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Sun, 31 Aug 2025 17:33:05 +0200 Subject: [PATCH 41/55] feat: Accent color will now use the system accent color, b=no-bug, c=common, workspaces --- prefs/theme.yaml | 2 +- src/browser/themes/shared/zen-icons/icons.css | 3 ++- src/zen/common/styles/zen-browser-ui.css | 8 +++++++- src/zen/common/zenThemeModifier.js | 5 ++++- src/zen/workspaces/ZenGradientGenerator.mjs | 11 ++++++++++- 5 files changed, 24 insertions(+), 5 deletions(-) diff --git a/prefs/theme.yaml b/prefs/theme.yaml index 7d912f41b..e171cfc91 100644 --- a/prefs/theme.yaml +++ b/prefs/theme.yaml @@ -3,7 +3,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. - name: zen.theme.accent-color - value: '#ffb787' + value: 'system' - name: zen.theme.content-element-separation value: 8 diff --git a/src/browser/themes/shared/zen-icons/icons.css b/src/browser/themes/shared/zen-icons/icons.css index 9330f7e6a..09f950ecc 100644 --- a/src/browser/themes/shared/zen-icons/icons.css +++ b/src/browser/themes/shared/zen-icons/icons.css @@ -35,7 +35,8 @@ #stop-button, .close-icon, .zen-glance-sidebar-close, -.zen-theme-picker-custom-list-item-remove { +.zen-theme-picker-custom-list-item-remove, +#appMenu-quit-button2 { list-style-image: url('close.svg') !important; } diff --git a/src/zen/common/styles/zen-browser-ui.css b/src/zen/common/styles/zen-browser-ui.css index 81e61815b..91de03373 100644 --- a/src/zen/common/styles/zen-browser-ui.css +++ b/src/zen/common/styles/zen-browser-ui.css @@ -46,9 +46,15 @@ pointer-events: none; isolation: isolate; - background: var(--zen-themed-toolbar-bg-transparent); + /* + * Important: We set the color to `AccentColor` so we can + * Compute the stylings and get the native accent color. + * Please, do not remove this. + */ + color: AccentColor; + &::after, &::before { content: ''; diff --git a/src/zen/common/zenThemeModifier.js b/src/zen/common/zenThemeModifier.js index 4f8017dc8..41ecc691f 100644 --- a/src/zen/common/zenThemeModifier.js +++ b/src/zen/common/zenThemeModifier.js @@ -97,7 +97,10 @@ var ZenThemeModifier = { * Update the accent color. */ updateAccentColor() { - const accentColor = Services.prefs.getStringPref('zen.theme.accent-color'); + let accentColor = Services.prefs.getStringPref('zen.theme.accent-color'); + if (accentColor.startsWith('system:')) { + accentColor = accentColor.replace('system:', '').trim(); + } document.documentElement.style.setProperty('--zen-primary-color', accentColor); }, }; diff --git a/src/zen/workspaces/ZenGradientGenerator.mjs b/src/zen/workspaces/ZenGradientGenerator.mjs index 6219d8564..6db40a6d4 100644 --- a/src/zen/workspaces/ZenGradientGenerator.mjs +++ b/src/zen/workspaces/ZenGradientGenerator.mjs @@ -1501,7 +1501,16 @@ getNativeAccentColor() { const accentColor = Services.prefs.getStringPref('zen.theme.accent-color'); - const rgb = this.hexToRgb(accentColor); + let rgb; + if (accentColor.startsWith('system')) { + const rawRgb = window.getComputedStyle(document.getElementById('zen-browser-background'))[ + 'color' + ]; + Services.prefs.setStringPref('zen.theme.accent-color', `system:${rawRgb}`); + rgb = rawRgb.match(/\d+/g).map(Number); + } else { + rgb = this.hexToRgb(accentColor); + } if (this.isDarkMode) { // If the theme is dark, we want to use a lighter color return this.blendColors(rgb, [0, 0, 0], 40); From 0f4b48bd4a4497323874a9aca31135f7158b4d9f Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Sun, 31 Aug 2025 22:33:00 +0200 Subject: [PATCH 42/55] fix: Fixed small issues with colors, b=no-bug, c=common, compact-mode, workspaces --- src/zen/common/styles/zen-urlbar.css | 6 +++++- src/zen/compact-mode/zen-compact-mode.css | 2 +- src/zen/workspaces/ZenWorkspaces.mjs | 8 +++++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/zen/common/styles/zen-urlbar.css b/src/zen/common/styles/zen-urlbar.css index 9fe98be16..e6d28f692 100644 --- a/src/zen/common/styles/zen-urlbar.css +++ b/src/zen/common/styles/zen-urlbar.css @@ -628,7 +628,11 @@ button.popup-notification-dropmarker { } &[selected] { - background-color: color-mix(in srgb, var(--zen-primary-color) 50%, transparent 50%) !important; + background-color: color-mix( + in srgb, + var(--zen-primary-color) 50%, + light-dark(transparent, rgba(255, 255, 255, 0.3)) 50% + ) !important; & *, & .urlbarView-title-separator::before { diff --git a/src/zen/compact-mode/zen-compact-mode.css b/src/zen/compact-mode/zen-compact-mode.css index 52f3a7f6a..e93bdb65b 100644 --- a/src/zen/compact-mode/zen-compact-mode.css +++ b/src/zen/compact-mode/zen-compact-mode.css @@ -148,7 +148,7 @@ right: 0; bottom: 0; background: var(--zen-dialog-background); - outline: 1px solid var(--zen-colors-border-contrast); + outline: 1px solid var(--zen-colors-border); outline-offset: -1px; box-shadow: var(--zen-big-shadow); pointer-events: none; diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index 99bd1a1f4..d22aee53b 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -1475,7 +1475,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { return this.moveTabsToWorkspace([tab], workspaceID); } - moveTabsToWorkspace(tabs, workspaceID, justChangeId = false) { + moveTabsToWorkspace(tabs, workspaceID) { for (let tab of tabs) { const workspaceContainer = this.workspaceElement(workspaceID); const container = tab.pinned @@ -1489,10 +1489,12 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { continue; } - if (container && !justChangeId) { + if (container) { if (tab.group?.hasAttribute('split-view-group')) { gBrowser.zenHandleTabMove(tab.group, () => { - this.moveTabsToWorkspace(tab.group.tabs, workspaceID, true); + for (const tab of tab.group.tabs) { + tab.setAttribute('zen-workspace-id', workspaceID); + } container.insertBefore(tab.group, container.lastChild); }); continue; From 8aaa7b7322489c0afd2fbc94abd8bf7d7d7a1d43 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Sun, 31 Aug 2025 22:35:30 +0200 Subject: [PATCH 43/55] fix: Fixed favicon not saving on close, b=no-bug, c=tabs --- src/zen/tabs/ZenPinnedTabManager.mjs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs index 7d718f0d6..bb2421b65 100644 --- a/src/zen/tabs/ZenPinnedTabManager.mjs +++ b/src/zen/tabs/ZenPinnedTabManager.mjs @@ -882,7 +882,7 @@ existingEntry.title = pin.title; state.entries = [existingEntry]; } - state.image = pin.iconUrl || null; + state.image = pin.iconUrl || state.image; state.index = 0; SessionStore.setTabState(tab, state); From 3e125fdb91f5860587fe2bb50c81d4a2720f0a4c Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Mon, 1 Sep 2025 00:51:48 +0200 Subject: [PATCH 44/55] feat: Properly update items on group move, b=no-bug, c=tabs --- src/zen/tabs/ZenPinnedTabManager.mjs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs index bb2421b65..26c00c2e5 100644 --- a/src/zen/tabs/ZenPinnedTabManager.mjs +++ b/src/zen/tabs/ZenPinnedTabManager.mjs @@ -533,11 +533,13 @@ if (!pinId) { return; } - for (const tab of group.tabs) { + for (const tab of group.allItemsRecursive) { if (tab.pinned && tab.getAttribute('zen-pin-id') === pinId) { const pin = this._pinsCache.find((p) => p.uuid === pinId); if (pin) { pin.position = tab._pPos; + pin.parentUuid = tab.group?.getAttribute('zen-pin-id') || null; + pin.workspaceUuid = group.getAttribute('zen-workspace-id'); await this.savePin(pin, false); } break; @@ -547,6 +549,7 @@ if (groupPin) { groupPin.position = newIndex; groupPin.parentUuid = group.group?.getAttribute('zen-pin-id'); + groupPin.workspaceUuid = group.getAttribute('zen-workspace-id'); await this.savePin(groupPin); } } From 41adb92790b6fb6a816de3127121175d9fbc5c3c Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Mon, 1 Sep 2025 00:52:54 +0200 Subject: [PATCH 45/55] New Crowdin updates (#10174) * New translations zen-vertical-tabs.ftl (Catalan) * New translations zen-vertical-tabs.ftl (Danish) * New translations zen-vertical-tabs.ftl (Korean) * New translations zen-vertical-tabs.ftl (Ukrainian) * New translations zen-folders.ftl (French) * New translations zen-folders.ftl (Spanish) * New translations zen-folders.ftl (Catalan) * New translations zen-folders.ftl (Danish) * New translations zen-folders.ftl (German) * New translations zen-folders.ftl (Hungarian) * New translations zen-folders.ftl (Korean) * New translations zen-folders.ftl (Ukrainian) * New translations zen-folders.ftl (Estonian) --- locales/ca/browser/browser/zen-folders.ftl | 4 ++-- locales/ca/browser/browser/zen-vertical-tabs.ftl | 2 +- locales/da/browser/browser/zen-folders.ftl | 4 ++-- locales/da/browser/browser/zen-vertical-tabs.ftl | 2 +- locales/de/browser/browser/zen-folders.ftl | 2 +- locales/es-ES/browser/browser/zen-folders.ftl | 2 +- locales/et/browser/browser/zen-folders.ftl | 2 +- locales/fr/browser/browser/zen-folders.ftl | 2 +- locales/hu/browser/browser/zen-folders.ftl | 4 ++-- locales/ko/browser/browser/zen-folders.ftl | 8 ++++---- locales/ko/browser/browser/zen-vertical-tabs.ftl | 2 +- locales/uk/browser/browser/zen-folders.ftl | 4 ++-- locales/uk/browser/browser/zen-vertical-tabs.ftl | 2 +- 13 files changed, 20 insertions(+), 20 deletions(-) diff --git a/locales/ca/browser/browser/zen-folders.ftl b/locales/ca/browser/browser/zen-folders.ftl index 188b2c960..7b1ee7cb7 100644 --- a/locales/ca/browser/browser/zen-folders.ftl +++ b/locales/ca/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Canvia la icona zen-folders-unload-all-tooltip = - .tooltiptext = Unload active in this folder + .tooltiptext = Hiberna les pestanyes actives d'aquesta carpeta zen-folders-unload-folder = - .label = Descarrega totes les pestanyes + .label = Hiberna totes les pestanyes zen-folders-search-no-results = No hi ha pestanyes que coincideixin amb aquesta cerca 🤔 diff --git a/locales/ca/browser/browser/zen-vertical-tabs.ftl b/locales/ca/browser/browser/zen-vertical-tabs.ftl index 788cf2cd0..e81e1922f 100644 --- a/locales/ca/browser/browser/zen-vertical-tabs.ftl +++ b/locales/ca/browser/browser/zen-vertical-tabs.ftl @@ -24,7 +24,7 @@ sidebar-zen-create-new = tabbrowser-unload-tab-button = .tooltiptext = { $tabCount -> - [one] Hiberna i canvia la pestanya + [one] Hiberna i canvia a la pestanya *[other] Hiberna { $tabCount } pestanyes i canvia a la primera } tabbrowser-reset-pin-button = diff --git a/locales/da/browser/browser/zen-folders.ftl b/locales/da/browser/browser/zen-folders.ftl index 54d0cc583..f763aa4d2 100644 --- a/locales/da/browser/browser/zen-folders.ftl +++ b/locales/da/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Skift ikon zen-folders-unload-all-tooltip = - .tooltiptext = Unload active in this folder + .tooltiptext = Stop indlæsning af aktive i denne mappe zen-folders-unload-folder = - .label = Unload All Tabs + .label = Stop indlæsning af alle faner zen-folders-search-no-results = Ingen faner matcher den søgning 🤔 diff --git a/locales/da/browser/browser/zen-vertical-tabs.ftl b/locales/da/browser/browser/zen-vertical-tabs.ftl index 3d9eb740e..18682f18b 100644 --- a/locales/da/browser/browser/zen-vertical-tabs.ftl +++ b/locales/da/browser/browser/zen-vertical-tabs.ftl @@ -15,7 +15,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = Skjul begge .accesskey = H zen-toolbar-context-new-folder = - .label = New Folder + .label = Ny mappe .accesskey = N sidebar-zen-expand = .label = Udvid Sidepanel diff --git a/locales/de/browser/browser/zen-folders.ftl b/locales/de/browser/browser/zen-folders.ftl index 1f13e990f..676d9290b 100644 --- a/locales/de/browser/browser/zen-folders.ftl +++ b/locales/de/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Symbol ändern zen-folders-unload-all-tooltip = - .tooltiptext = Unload active in this folder + .tooltiptext = Aktive Tabs in diesem Ordner entladen zen-folders-unload-folder = .label = Alle Tabs entladen zen-folders-search-no-results = Keine passenden Tabs gefunden 🤔 diff --git a/locales/es-ES/browser/browser/zen-folders.ftl b/locales/es-ES/browser/browser/zen-folders.ftl index 1d5a5d242..c2637b0ce 100644 --- a/locales/es-ES/browser/browser/zen-folders.ftl +++ b/locales/es-ES/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Cambiar icono zen-folders-unload-all-tooltip = - .tooltiptext = Unload active in this folder + .tooltiptext = Suspensión activa en esta carpeta zen-folders-unload-folder = .label = Suspender todas las pestañas zen-folders-search-no-results = Ninguna pestaña coincide con esa búsqueda 🤔 diff --git a/locales/et/browser/browser/zen-folders.ftl b/locales/et/browser/browser/zen-folders.ftl index f17acd90a..2aa775f07 100644 --- a/locales/et/browser/browser/zen-folders.ftl +++ b/locales/et/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Muuda ikooni zen-folders-unload-all-tooltip = - .tooltiptext = Unload active in this folder + .tooltiptext = Eemalda mälust selle kausta aktiivsed kaardid zen-folders-unload-folder = .label = Eemalda mälust kõik kaardid zen-folders-search-no-results = Otsingule ei vasta ühtegi kaarti 🤔 diff --git a/locales/fr/browser/browser/zen-folders.ftl b/locales/fr/browser/browser/zen-folders.ftl index ba452f000..be4069dfc 100644 --- a/locales/fr/browser/browser/zen-folders.ftl +++ b/locales/fr/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Changer d'icône zen-folders-unload-all-tooltip = - .tooltiptext = Unload active in this folder + .tooltiptext = Décharger les onglets actifs de ce dossier zen-folders-unload-folder = .label = Décharger tous les onglets zen-folders-search-no-results = Aucun onglet ne correspond à cette recherche 🤔 diff --git a/locales/hu/browser/browser/zen-folders.ftl b/locales/hu/browser/browser/zen-folders.ftl index ebf10cb31..eb0bf047a 100644 --- a/locales/hu/browser/browser/zen-folders.ftl +++ b/locales/hu/browser/browser/zen-folders.ftl @@ -9,13 +9,13 @@ zen-folders-new-subfolder = zen-folders-panel-delete-folder = .label = Mappa törlése zen-folders-panel-convert-folder-to-space = - .label = Mappa konvertálása munkakörnyezeté + .label = Mappa konvertálása környezetté zen-folders-panel-change-folder-space = .label = Környezet váltása... zen-folders-panel-change-icon-folder = .label = Ikon módosítása zen-folders-unload-all-tooltip = - .tooltiptext = Unload active in this folder + .tooltiptext = Aktív lapok ürítése ebben a mappában zen-folders-unload-folder = .label = Minden lap ürítése zen-folders-search-no-results = Nincsenek a keresésnek megfelelő lapok 🤔 diff --git a/locales/ko/browser/browser/zen-folders.ftl b/locales/ko/browser/browser/zen-folders.ftl index b90bc9ae1..0f834eeba 100644 --- a/locales/ko/browser/browser/zen-folders.ftl +++ b/locales/ko/browser/browser/zen-folders.ftl @@ -3,9 +3,9 @@ zen-folders-search-placeholder = zen-folders-panel-rename-folder = .label = 폴더 이름 변경 zen-folders-panel-unpack-folder = - .label = Unpack Folder + .label = 폴더 해제 zen-folders-new-subfolder = - .label = New Subfolder + .label = 새 서브폴더 zen-folders-panel-delete-folder = .label = 폴더 삭제 zen-folders-panel-convert-folder-to-space = @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = 아이콘 변경 zen-folders-unload-all-tooltip = - .tooltiptext = Unload active in this folder + .tooltiptext = 이 폴더의 활성화 탭 언로드 zen-folders-unload-folder = - .label = Unload All Tabs + .label = 모든 탭 언로드 zen-folders-search-no-results = 검색어에 맞는 탭이 없습니다 🤔 diff --git a/locales/ko/browser/browser/zen-vertical-tabs.ftl b/locales/ko/browser/browser/zen-vertical-tabs.ftl index e41ac9159..846b79e92 100644 --- a/locales/ko/browser/browser/zen-vertical-tabs.ftl +++ b/locales/ko/browser/browser/zen-vertical-tabs.ftl @@ -15,7 +15,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = 둘 다 숨기기 .accesskey = H zen-toolbar-context-new-folder = - .label = New Folder + .label = 새 폴더 .accesskey = N sidebar-zen-expand = .label = 사이드바 확장 diff --git a/locales/uk/browser/browser/zen-folders.ftl b/locales/uk/browser/browser/zen-folders.ftl index 73abab096..f3d524415 100644 --- a/locales/uk/browser/browser/zen-folders.ftl +++ b/locales/uk/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Змінити значок zen-folders-unload-all-tooltip = - .tooltiptext = Unload active in this folder + .tooltiptext = Вивантажити активне у цю теку zen-folders-unload-folder = - .label = Unload All Tabs + .label = Вивантажити всі вкладки zen-folders-search-no-results = Немає вкладок, які відповідають критеріям пошуку 🤔 diff --git a/locales/uk/browser/browser/zen-vertical-tabs.ftl b/locales/uk/browser/browser/zen-vertical-tabs.ftl index 78ed29648..1dffa9ad7 100644 --- a/locales/uk/browser/browser/zen-vertical-tabs.ftl +++ b/locales/uk/browser/browser/zen-vertical-tabs.ftl @@ -15,7 +15,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = Приховувати обидві .accesskey = Н zen-toolbar-context-new-folder = - .label = New Folder + .label = Нова тека .accesskey = N sidebar-zen-expand = .label = Розгорнути бічну панель From 5e942de8bce2e004788a7c333724c5269e039c54 Mon Sep 17 00:00:00 2001 From: mr-cheffy <91018726+mr-cheffy@users.noreply.github.com> Date: Mon, 1 Sep 2025 02:45:03 +0000 Subject: [PATCH 46/55] docs: Update monthly issue metrics, b=(no bug), c={docs} --- .../2025_2025-08-01..2025-08-31.md | 300 ++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 docs/issue-metrics/2025_2025-08-01..2025-08-31.md diff --git a/docs/issue-metrics/2025_2025-08-01..2025-08-31.md b/docs/issue-metrics/2025_2025-08-01..2025-08-31.md new file mode 100644 index 000000000..424a426ec --- /dev/null +++ b/docs/issue-metrics/2025_2025-08-01..2025-08-31.md @@ -0,0 +1,300 @@ +# Issue Metrics + +| Metric | Average | Median | 90th percentile | +| --- | --- | --- | ---: | +| Time to first response | 1 day, 7:39:18 | 5:45:29 | 3 days, 0:42:51 | +| Time to close | 23:47:00 | 10:26:06 | 1 day, 23:43:47 | + +| Metric | Count | +| --- | ---: | +| Number of items that remain open | 145 | +| Number of items closed | 137 | +| Total number of items created | 282 | + +| Title | URL | Time to first response | Time to close | +| --- | --- | --- | --- | +| Tab hover preview has incorrect origin | https://github.com/zen-browser/desktop/issues/10173 | None | None | +| Pinned tabs reset to pinned URL at startup even with related setting unchecked | https://github.com/zen-browser/desktop/issues/10172 | None | None | +| fix: Traditional Chinese as a target language for page translation | https://github.com/zen-browser/desktop/issues/10169 | None | None | +| tab groups do not group tabs anymore | https://github.com/zen-browser/desktop/issues/10167 | 2:40:11 | 12:01:38 | +| Tab Groups stuck in an expanded default state and labels are centered | https://github.com/zen-browser/desktop/issues/10166 | 3:30:58 | 3:30:58 | +| lose all tabs when private window is open and you close the browser | https://github.com/zen-browser/desktop/issues/10163 | 5:54:05 | 5:54:05 | +| Bluescreen into couldnt load XPCOM ERROR | https://github.com/zen-browser/desktop/issues/10161 | None | None | +| Compact Mode non-persistent between session when “Hide toolbar” is enabled (Collapsed toolbar layout) | https://github.com/zen-browser/desktop/issues/10160 | None | None | +| `about:debugging` wrong connected browser warning | https://github.com/zen-browser/desktop/issues/10158 | None | None | +| Window not starting up in 1.15.2b | https://github.com/zen-browser/desktop/issues/10157 | None | 0:07:54 | +| Sidebar bugging when switching spaces too quickly / too much | https://github.com/zen-browser/desktop/issues/10156 | None | None | +| Active Tab detaches when collapsing tab folder | https://github.com/zen-browser/desktop/issues/10154 | None | None | +| Folder icon disappears in semi-open state | https://github.com/zen-browser/desktop/issues/10153 | 0:53:47 | 1:08:24 | +| Pins and Essentials and Spaces | https://github.com/zen-browser/desktop/issues/10152 | 2:13:28 | 2:13:28 | +| Essential Tabs Disappear When Switching Spaces | https://github.com/zen-browser/desktop/issues/10151 | 0:31:07 | None | +| Sidebar content disappears when turning off Compact Mode | https://github.com/zen-browser/desktop/issues/10150 | 1:27:49 | 1:56:45 | +| Split view tab inside folder unloads after browser restart | https://github.com/zen-browser/desktop/issues/10149 | None | None | +| Zen create too many unused new tab in task manager | https://github.com/zen-browser/desktop/issues/10145 | None | 3:06:48 | +| workspace icons doesnt chage | https://github.com/zen-browser/desktop/issues/10140 | 4:53:04 | None | +| Glitching Tool bar in compact mode during collapsed toolbar | https://github.com/zen-browser/desktop/issues/10138 | 5:19:26 | None | +| zen doesn't remember discord sessions | https://github.com/zen-browser/desktop/issues/10136 | None | None | +| New Tab Problem | https://github.com/zen-browser/desktop/issues/10134 | 6:20:10 | 6:20:10 | +| Browsing history reset itself unexpectedly | https://github.com/zen-browser/desktop/issues/10133 | 6:29:41 | None | +| Youtube not fully signed-in | https://github.com/zen-browser/desktop/issues/10130 | 12:08:24 | None | +| Recently closed folder is re-opened as tab group | https://github.com/zen-browser/desktop/issues/10129 | None | None | +| Essentials ordering reverts itself each time browser is relaunched | https://github.com/zen-browser/desktop/issues/10127 | 13:58:08 | None | +| Garbled text on MacOS | https://github.com/zen-browser/desktop/issues/10126 | 15:57:07 | None | +| Black broder around right/middle click | https://github.com/zen-browser/desktop/issues/10125 | 15:59:15 | None | +| Groups Not Collapsing After 1.15.2b Update | https://github.com/zen-browser/desktop/issues/10124 | 10:41:50 | 17:39:32 | +| Unable to load webextension (onetab) and webpage (https://www.youtube.com/@carlsagan42) properly. Developers tools (F12) is also broken. | https://github.com/zen-browser/desktop/issues/10123 | 17:53:26 | None | +| I can't change folder names | https://github.com/zen-browser/desktop/issues/10122 | 2:02:10 | 7:08:18 | +| Zen is not getting updated on Linux systems | https://github.com/zen-browser/desktop/issues/10119 | 1 day, 22:15:27 | None | +| All tabs within folders load automatically upon launch of browser | https://github.com/zen-browser/desktop/issues/10118 | 0:19:31 | 0:48:15 | +| Open New Tab Below replaced by New Folder | https://github.com/zen-browser/desktop/issues/10117 | None | 0:09:29 | +| CTRL + arrow does not move cursor when renaming workspace, folder or tab | https://github.com/zen-browser/desktop/issues/10115 | None | 20:44:04 | +| Long press on the "New Tab" page, the text on the multi-account container page displays abnormally in vertical format | https://github.com/zen-browser/desktop/issues/10114 | 0:59:49 | 0:59:49 | +| Issue with tradingview.com and its fullscreen chart feature | https://github.com/zen-browser/desktop/issues/10113 | 1:18:05 | 1:18:04 | +| Menu color turn gray after 1.15b | https://github.com/zen-browser/desktop/issues/10110 | None | 23:24:28 | +| Missing website backgrounds making some sites unreadable | https://github.com/zen-browser/desktop/issues/10109 | 0:14:46 | 1:28:57 | +| Crunchyroll play back failing | https://github.com/zen-browser/desktop/issues/10107 | 0:35:36 | 2:09:35 | +| Leaking/Exposing IP Address via WebRTC | https://github.com/zen-browser/desktop/issues/10106 | 1:28:42 | 2:23:03 | +| Zen Browser Does Not Uninstall Cleanly on Windows | https://github.com/zen-browser/desktop/issues/10105 | 2:31:49 | 2:31:49 | +| Do not disappear tab after close folder | https://github.com/zen-browser/desktop/issues/10104 | 1:22:59 | 2:43:23 | +| Cannot rename a folder. | https://github.com/zen-browser/desktop/issues/10103 | 0:14:12 | 2:52:44 | +| The application has failed to start because its side-by-side configuration is incorrect. Please see the application event log or use the command-line sxstrace.exe tool for more detail. | https://github.com/zen-browser/desktop/issues/10102 | 3:03:40 | None | +| Workspace to folder conversion | https://github.com/zen-browser/desktop/issues/10099 | 1:07:12 | 4:21:56 | +| Workspace changing isnt working sometimes unless i restart | https://github.com/zen-browser/desktop/issues/10098 | 20:20:44 | None | +| Profile remains locked after closing Zen (stale lock symlink to 127.0.0.1:x) | https://github.com/zen-browser/desktop/issues/10097 | None | None | +| Copy and Pasting from gemini.google.com | https://github.com/zen-browser/desktop/issues/10096 | None | None | +| Picture in Picture closes when opening a side by side tab | https://github.com/zen-browser/desktop/issues/10094 | 2 days, 9:21:19 | None | +| Keep receiving this error when trying to close Zen Browser on Mac | https://github.com/zen-browser/desktop/issues/10093 | 3:01:29 | None | +| Cannot rename folders | https://github.com/zen-browser/desktop/issues/10092 | 0:10:50 | 2:18:47 | +| Zen Crashing after update | https://github.com/zen-browser/desktop/issues/10091 | 1:33:17 | None | +| Tabs inside folders disappear when closing and reopening Zen | https://github.com/zen-browser/desktop/issues/10089 | 5:35:09 | None | +| Can't rename the folders | https://github.com/zen-browser/desktop/issues/10088 | 0:10:31 | 5:56:22 | +| Extensions don't open without loading a web page in a tab. | https://github.com/zen-browser/desktop/issues/10086 | None | None | +| Cant Rename Folders | https://github.com/zen-browser/desktop/issues/10083 | 0:13:53 | 0:15:30 | +| Tab Bar cant be resized smaller in width when on the right. On the left side it works normally. | https://github.com/zen-browser/desktop/issues/10082 | 11:09:07 | 11:09:07 | +| Unable to split view more than 4 tabs like before. | https://github.com/zen-browser/desktop/issues/10080 | 9:26:04 | 9:26:04 | +| Tab Folders jumping to the top of a space after reopening browser. | https://github.com/zen-browser/desktop/issues/10078 | None | None | +| Groups/Folders do not collapse | https://github.com/zen-browser/desktop/issues/10077 | 2:08:46 | 10:30:40 | +| Zen window going blank after new update | https://github.com/zen-browser/desktop/issues/10076 | 3:16:17 | 1 day, 23:00:52 | +| Bookmark titles/names no longer appear in Omnibar search results, only URL is shown twice. | https://github.com/zen-browser/desktop/issues/10075 | 12:09:01 | None | +| Browser are not capable of opening a full screen video on X (twitter) | https://github.com/zen-browser/desktop/issues/10074 | 0:09:19 | None | +| "delete Folder' Not Working | https://github.com/zen-browser/desktop/issues/10070 | 0:17:54 | 0:18:22 | +| Compact Mode turns off after quitting the Browser | https://github.com/zen-browser/desktop/issues/10069 | None | 1:08:15 | +| Can't delete folders with collapsed toolbar | https://github.com/zen-browser/desktop/issues/10068 | 4:28:56 | 4:28:56 | +| Picture-in-Picture Window "Migrates" When Opened | https://github.com/zen-browser/desktop/issues/10066 | 2:11:10 | None | +| Weird black bar apearing with Transparent Zen | https://github.com/zen-browser/desktop/issues/10065 | 2:24:08 | 2:24:08 | +| Unable to resize sidebar on compact mode | https://github.com/zen-browser/desktop/issues/10064 | 2:26:23 | 2:26:23 | +| When switching between a split tabs and another normal tab, the image is cut off on the left | https://github.com/zen-browser/desktop/issues/10062 | None | None | +| Incorrect theme colors in Glance mod after 1.15 update | https://github.com/zen-browser/desktop/issues/10060 | 0:38:54 | 10:26:17 | +| Crash in navigating to diffent page | https://github.com/zen-browser/desktop/issues/10059 | 1:05:23 | None | +| Cannot add tab to Essentials even when there are slots available | https://github.com/zen-browser/desktop/issues/10058 | 4:48:50 | 5:57:03 | +| Zen Browser launches in a completely invisible window | https://github.com/zen-browser/desktop/issues/10057 | None | None | +| Tabs randomly move between groups/folders when opening or relocating | https://github.com/zen-browser/desktop/issues/10056 | None | None | +| The new tab button is missing | https://github.com/zen-browser/desktop/issues/10054 | 0:03:10 | 0:03:10 | +| You can't rename folders | https://github.com/zen-browser/desktop/issues/10052 | 0:01:23 | 20:23:45 | +| Essential and pinned tab favicons aren't being cached, turn to default after browser restart | https://github.com/zen-browser/desktop/issues/10049 | 0:53:00 | 8:32:49 | +| Google Meet shows "Browser not supported" message | https://github.com/zen-browser/desktop/issues/10047 | 1:50:35 | 1:50:35 | +| MongoDB sign in page stuck after clicking login | https://github.com/zen-browser/desktop/issues/10046 | 4:18:15 | 4:18:15 | +| Pinned tabs from various spaces scrambled in consecutive windows | https://github.com/zen-browser/desktop/issues/10044 | None | None | +| New Folders always get pinned (and you can't unpin) | https://github.com/zen-browser/desktop/issues/10043 | 2:34:16 | 5:41:56 | +| Theme no working | https://github.com/zen-browser/desktop/issues/10042 | 0:51:20 | 10:33:11 | +| Can't close the historic tab | https://github.com/zen-browser/desktop/issues/10041 | 8:39:11 | 11:52:29 | +| VISUAL going to the rightmost workspace causes other icons to shift left | https://github.com/zen-browser/desktop/issues/10040 | 11:55:55 | 18:33:56 | +| Session restore almost completely disfunctional | https://github.com/zen-browser/desktop/issues/10039 | None | None | +| Trading chart not rendering properly on insilico terminal | https://github.com/zen-browser/desktop/issues/10037 | 12:48:25 | 12:48:25 | +| space name and text overallaping | https://github.com/zen-browser/desktop/issues/10036 | 13:11:14 | 19:25:14 | +| Branding: Feedback link in Help menu points to Mozilla site. | https://github.com/zen-browser/desktop/issues/10035 | None | None | +| Cannot use any of the right click options of any tab folders in compact mode | https://github.com/zen-browser/desktop/issues/10033 | None | 13:50:42 | +| Deleting folders do not work while sidebar is not expanded | https://github.com/zen-browser/desktop/issues/10032 | 0:06:20 | 13:55:12 | +| Active tabs in collapsed folders will stay in their same place after switching from Expanded Sidebar to Compacted Sidebar | https://github.com/zen-browser/desktop/issues/10031 | 1 day, 10:19:29 | 1 day, 10:19:29 | +| Tab Groups broken in v1.15b | https://github.com/zen-browser/desktop/issues/10030 | 11:33:51 | 11:51:45 | +| New Folder option not visible in private mode | https://github.com/zen-browser/desktop/issues/10029 | 15:02:27 | 15:02:27 | +| Folder context menu don't work when the sidebar is collapsed | https://github.com/zen-browser/desktop/issues/10028 | None | 15:20:22 | +| Browser crashes after downloading | https://github.com/zen-browser/desktop/issues/10027 | 22:43:29 | 1 day, 22:00:29 | +| Folder icons and names are misaligned | https://github.com/zen-browser/desktop/issues/10025 | 16:29:52 | 16:29:52 | +| Bookmark dialog opens in compact sidebar instead of floating URL bar | https://github.com/zen-browser/desktop/issues/10024 | None | None | +| Sidebar freeze when trying to switch spaces | https://github.com/zen-browser/desktop/issues/10023 | 0:04:28 | None | +| When opening a link in a new tab while inside of a collapsed Folder, the current tab disappears | https://github.com/zen-browser/desktop/issues/10022 | None | 18:17:43 | +| Can't compile: fatal: your current branch 'zen_browser' does not have any commits yet | https://github.com/zen-browser/desktop/issues/10020 | None | None | +| Workspace name and icons clasing and Overflow Menu aint working normally | https://github.com/zen-browser/desktop/issues/10018 | 1 day, 2:43:25 | None | +| Contextual menu item text should be “New Folder” not “New folder” | https://github.com/zen-browser/desktop/issues/10016 | 0:22:14 | 20:49:40 | +| Top Bar (in single bar mode) not expanding when tabs are on the right | https://github.com/zen-browser/desktop/issues/10013 | None | None | +| Close Folder and witch active Tab behaviour | https://github.com/zen-browser/desktop/issues/10012 | 1:34:22 | 1 day, 17:57:01 | +| Folders hard to drag first Items in | https://github.com/zen-browser/desktop/issues/10011 | None | None | +| YouTube videos not working — H.264 / AAC not detected on Arch Linux | https://github.com/zen-browser/desktop/issues/10010 | None | None | +| Cant download the update v1.15b | https://github.com/zen-browser/desktop/issues/10009 | 0:21:58 | 4:19:00 | +| When two windows are open, the tabs in the workspace do not sync between the two windows | https://github.com/zen-browser/desktop/issues/10008 | None | 0:00:57 | +| When two windows are open, the tabs in the workspace do not sync between the two windows | https://github.com/zen-browser/desktop/issues/10007 | 8:42:07 | 13:52:58 | +| Tabs unload only for Zammad helpdesk page | https://github.com/zen-browser/desktop/issues/10003 | None | None | +| Tab unloads only for Zammad helpdesk | https://github.com/zen-browser/desktop/issues/10002 | 0:20:37 | 0:20:37 | +| Tabs dont open when pinned | https://github.com/zen-browser/desktop/issues/9999 | None | 8:06:36 | +| "New Tab" tab bar button renders Chinese text vertically in container menu | https://github.com/zen-browser/desktop/issues/9997 | None | None | +| Can't Delete, Edit or Select different profile | https://github.com/zen-browser/desktop/issues/9996 | 5 days, 22:21:43 | None | +| Redirect Links from Apps to Browser Not Working (VSCode, GitHub Auth, etc.) | https://github.com/zen-browser/desktop/issues/9993 | None | 2 days, 2:16:42 | +| Fullscreening a video in Glance causes tab sidebar moving slightly left-ier afterwards - Twilight 1.15t (Firefox 142.0) (2025-08-24) | https://github.com/zen-browser/desktop/issues/9992 | None | None | +| Sidebar urlbar is almost unuseable with site permission and zoom icons taking up 80% of the bar | https://github.com/zen-browser/desktop/issues/9990 | 5:10:46 | 5:10:46 | +| Zen doesn't show its browser UI on the page chrome://browser/content/browser.xhtml | https://github.com/zen-browser/desktop/issues/9989 | None | 6:09:52 | +| New tab panel doesn't show tab titles | https://github.com/zen-browser/desktop/issues/9987 | 0:31:03 | 10:37:46 | +| Cursor hover style switching to default shortly after hover | https://github.com/zen-browser/desktop/issues/9984 | None | None | +| Clicking on a tab reset button hides the other tabs | https://github.com/zen-browser/desktop/issues/9981 | None | 0:01:40 | +| Text Corrupting | https://github.com/zen-browser/desktop/issues/9980 | None | None | +| Splet View windows do not restore their layout after browser restart | https://github.com/zen-browser/desktop/issues/9978 | None | None | +| Changing AccelKey Overrides Custom Shortcuts | https://github.com/zen-browser/desktop/issues/9974 | None | None | +| Button title missing for sidebar collapse | https://github.com/zen-browser/desktop/issues/9973 | None | None | +| Missing "tab rename" in the contextual menu | https://github.com/zen-browser/desktop/issues/9972 | 15:03:21 | None | +| URL bar loses focus if new tab is opened while editing | https://github.com/zen-browser/desktop/issues/9971 | None | None | +| Workspaces and Compact Mode | https://github.com/zen-browser/desktop/issues/9970 | None | None | +| Sound does not work | https://github.com/zen-browser/desktop/issues/9969 | None | None | +| Pre-loading all tabs on startup | https://github.com/zen-browser/desktop/issues/9967 | 3:05:00 | 1 day, 3:23:24 | +| Duplicate 'Stop Loading' Keyboard Shortcut fields | https://github.com/zen-browser/desktop/issues/9965 | None | None | +| Freedom Blocklist not working | https://github.com/zen-browser/desktop/issues/9964 | 11:27:00 | 11:27:00 | +| Prevent tab unload context menu entry missing on tabs | https://github.com/zen-browser/desktop/issues/9963 | None | None | +| Glance buttons (expand, exit, split screen) missing when using Zen Papercut mod | https://github.com/zen-browser/desktop/issues/9962 | 3 days, 6:00:07 | 3 days, 6:00:07 | +| Sidebar Appears Unexpectedly | https://github.com/zen-browser/desktop/issues/9961 | 0:39:14 | 5 days, 0:15:27 | +| Contrast completely broken in multiple places depending on theme color and dark/light mode | https://github.com/zen-browser/desktop/issues/9955 | 6 days, 3:55:23 | None | +| Split views not visible in sidebar when selected from folder pop-up | https://github.com/zen-browser/desktop/issues/9954 | None | None | +| Folder 3 dot state stuck after split view move | https://github.com/zen-browser/desktop/issues/9953 | None | None | +| Context menu for editing tab groups is gone in Zen Twilight | https://github.com/zen-browser/desktop/issues/9951 | 6:53:05 | 11:45:07 | +| 简洁模式启动后自己关闭 | https://github.com/zen-browser/desktop/issues/9949 | 2:20:53 | 10:20:19 | +| Tab bar and top bar are stuck, can't toggle/hide them off and minimize, close button gets clamped together in minimized window | https://github.com/zen-browser/desktop/issues/9946 | None | 1:39:32 | +| Opening links in pinned tabs creates a new pinned tab | https://github.com/zen-browser/desktop/issues/9945 | 10:45:38 | None | +| History panel not colapsing | https://github.com/zen-browser/desktop/issues/9943 | 9:12:13 | None | +| Clicking card in jira doesn't always open the card modal. | https://github.com/zen-browser/desktop/issues/9942 | None | None | +| Zen uses Windows accent color even with relevant settings set to false | https://github.com/zen-browser/desktop/issues/9940 | 17:50:40 | 1 day, 2:24:18 | +| Compact Mode keeps getting disabled randomly | https://github.com/zen-browser/desktop/issues/9939 | 1 day, 3:36:05 | None | +| [macOS] "Ask before quitting with cmd+Q" dialog box shows Firefox instead of Zen and more mentions of Firefox instead of Zen | https://github.com/zen-browser/desktop/issues/9938 | 2 days, 21:11:20 | 10 days, 6:52:44 | +| Zen Browser consistantly crashes on page | https://github.com/zen-browser/desktop/issues/9937 | 6:13:51 | None | +| Essential Tabs do not survive a restart and fail to propagate across all windows | https://github.com/zen-browser/desktop/issues/9935 | 1:43:35 | None | +| Middle click to open a link in a new tab does not preserve the previous tab's container | https://github.com/zen-browser/desktop/issues/9934 | None | 11:02:13 | +| Twighlight folders | https://github.com/zen-browser/desktop/issues/9933 | 6:40:06 | None | +| Opening new tab always shows pop-up menu rather than opening configured new tab | https://github.com/zen-browser/desktop/issues/9932 | 0:10:50 | 7 days, 11:53:34 | +| Homepage blank when first opening Zen Browser | https://github.com/zen-browser/desktop/issues/9928 | 16:41:10 | None | +| Tabs freezing, sidebar not collapsing in VS 1.14.9b | https://github.com/zen-browser/desktop/issues/9927 | 2 days, 2:43:49 | None | +| Windows control butons can be seen for a while when using compact mode | https://github.com/zen-browser/desktop/issues/9922 | None | 12:39:19 | +| Distill plugin opens persistant tabs in the Space part of the sidebar | https://github.com/zen-browser/desktop/issues/9919 | 13 days, 13:36:07 | None | +| Keyboard shortcuts like Ctrl+Shift+NumberRowKey depend on the active keyboard layout | https://github.com/zen-browser/desktop/issues/9918 | None | None | +| SPOTIFY DOESN'T WORK ON WINDOWS | https://github.com/zen-browser/desktop/issues/9917 | 0:04:16 | 5:53:18 | +| "Connection Secure >" menu won't open when Padlock is clicked inside an expanded Address Bar | https://github.com/zen-browser/desktop/issues/9913 | None | 2 days, 0:48:09 | +| Inconsistent behavior when removing essentials via drag and drop | https://github.com/zen-browser/desktop/issues/9912 | None | None | +| Essentials can't be rearranged via drag and drop | https://github.com/zen-browser/desktop/issues/9911 | 2:39:54 | 2:39:54 | +| Reset Pinned Tab doesn't work | https://github.com/zen-browser/desktop/issues/9910 | 12:56:31 | 9 days, 3:42:31 | +| when I use the Collapsed toolbar,The close button on the sidebar shows an abnormal display | https://github.com/zen-browser/desktop/issues/9905 | None | None | +| When Nerd Fonts isstelled Zen will always use them | https://github.com/zen-browser/desktop/issues/9904 | None | None | +| macOS: Zen shortcuts like Cmd+S are intercepted by websites | https://github.com/zen-browser/desktop/issues/9903 | None | None | +| Customize Toolbar issues with Extension Icons (Temporary Containers) | https://github.com/zen-browser/desktop/issues/9901 | None | None | +| Startup hang when using an invalid workspace name | https://github.com/zen-browser/desktop/issues/9900 | None | 0:58:35 | +| Spotify Web Player doesn't play songs: 'Spotify can't play this right now' error | https://github.com/zen-browser/desktop/issues/9896 | 0:18:09 | 0:57:45 | +| Header editor extensions do not work (WebRequest API for onBeforeSendHeaders) | https://github.com/zen-browser/desktop/issues/9895 | None | None | +| Essentials - "remove from Essentials" vs "Close Tab" | https://github.com/zen-browser/desktop/issues/9894 | 7:25:09 | None | +| VAAPI not working on Linux | https://github.com/zen-browser/desktop/issues/9893 | None | None | +| Browser launches up completely blank, no interface, buttons to close or minimize the tab, nothing. | https://github.com/zen-browser/desktop/issues/9890 | 3:45:59 | None | +| Annoying white margin around window contents | https://github.com/zen-browser/desktop/issues/9888 | 4 days, 12:34:56 | None | +| Zen is being recognized as using Internet Explorer 11 | https://github.com/zen-browser/desktop/issues/9887 | 10:15:03 | 10:15:03 | +| Folder unloading bug breaks whole folder tree | https://github.com/zen-browser/desktop/issues/9885 | None | 0:45:09 | +| Bug: Leftover in Default Apps | https://github.com/zen-browser/desktop/issues/9879 | 10 days, 15:06:30 | None | +| Weird rectangle behind side bar in compact mode | https://github.com/zen-browser/desktop/issues/9877 | None | None | +| On startup all previous tabs remain open | https://github.com/zen-browser/desktop/issues/9875 | 11:41:28 | None | +| Spotify skips 5 songs then plays first 5 seconds of one and frezzes. | https://github.com/zen-browser/desktop/issues/9874 | 1:56:21 | 1:56:21 | +| macOS traffic lights are grey while Zen is focused | https://github.com/zen-browser/desktop/issues/9871 | 1:49:43 | 1:49:43 | +| Background audio stops after tab switch: Spotify stalls at a specific timestamp; reload fails; only closing/reopening the tab helps | https://github.com/zen-browser/desktop/issues/9869 | 3:21:56 | 10:26:59 | +| Stripe Payment Element iFrame Performance Issues | https://github.com/zen-browser/desktop/issues/9868 | None | None | +| [1.15t]: Changing the folder icon while in collapsed mode bug | https://github.com/zen-browser/desktop/issues/9866 | None | 1 day, 7:03:54 | +| CTRL + TAB open essential tabs on start up | https://github.com/zen-browser/desktop/issues/9864 | None | None | +| Bluetooth headset device prb | https://github.com/zen-browser/desktop/issues/9863 | 1 day, 22:54:56 | None | +| Notion Crashes in Zen Browser | https://github.com/zen-browser/desktop/issues/9862 | None | None | +| Can't install mods | https://github.com/zen-browser/desktop/issues/9861 | 0:35:44 | None | +| Broken automatic updates and update checker | https://github.com/zen-browser/desktop/issues/9860 | 7 days, 22:56:36 | None | +| "Backward Workspace" and "Forward Workspace" shortcuts conflict with unchangeable tab-cycling shortcut | https://github.com/zen-browser/desktop/issues/9859 | 3:55:25 | 3:55:25 | +| Essentials favicons overlap from multiple workspaces | https://github.com/zen-browser/desktop/issues/9858 | 0:09:18 | None | +| Tap with 2 fingers on mac trackpad issue | https://github.com/zen-browser/desktop/issues/9856 | None | None | +| Compose key closes floating search input | https://github.com/zen-browser/desktop/issues/9855 | None | None | +| Critical Bug - Blackscreen on boot Intel Mac | https://github.com/zen-browser/desktop/issues/9853 | None | None | +| switching to left/upper tab is not working with shortcuts, but working if the tabs are pinned. via APIs may be couse i am uging surfing keys extension but reported here just in case. | https://github.com/zen-browser/desktop/issues/9852 | None | None | +| iCloud Passwords extension on macOS | https://github.com/zen-browser/desktop/issues/9850 | 15:37:13 | 15:37:20 | +| rpi.local:9090 don´t open | https://github.com/zen-browser/desktop/issues/9844 | 2:30:34 | 2 days, 4:55:12 | +| Laggy Scrolling Across All Sites On 120 Hz Retina Display of Macbook Pro (M3 Pro) | https://github.com/zen-browser/desktop/issues/9842 | 3:16:14 | None | +| Folders Bug on multiple windows | https://github.com/zen-browser/desktop/issues/9840 | 2 days, 19:32:00 | None | +| Twilight Updater Bug ("Update ready to install" popup will not go away, even after restarting twilight multiple times) | https://github.com/zen-browser/desktop/issues/9837 | 14 days, 15:03:33 | None | +| Windows UAC is prompted after every Zen update | https://github.com/zen-browser/desktop/issues/9836 | 3 days, 13:49:23 | None | +| Upon reopening a Zen Browser session with multiple windows, workspaces are not selected properly | https://github.com/zen-browser/desktop/issues/9835 | 6 days, 9:06:16 | None | +| When compact mode is enabled, bookmark tabs in the top toolbar fail to display fully on new pages.‌ | https://github.com/zen-browser/desktop/issues/9834 | 3 days, 9:24:00 | None | +| Dark Theme Selected, But Light Theme Appears in Some Areas | https://github.com/zen-browser/desktop/issues/9833 | 1 day, 9:15:06 | 1 day, 20:10:57 | +| Essential tabs is missing icon when browser history is disabled | https://github.com/zen-browser/desktop/issues/9832 | None | 1 day, 0:58:09 | +| [Folders] Broken reordering functionality | https://github.com/zen-browser/desktop/issues/9830 | 1 day, 2:52:11 | 1 day, 7:27:51 | +| Essential opens some new links in a new essential tab | https://github.com/zen-browser/desktop/issues/9829 | None | 0:02:42 | +| Ctrl-shift-t should restore tab folders after deletion | https://github.com/zen-browser/desktop/issues/9828 | 4 days, 14:56:02 | None | +| UrlBar suggestions of renamed tabs are broken | https://github.com/zen-browser/desktop/issues/9825 | 1 day, 14:45:17 | 1 day, 14:45:17 | +| UrlBar persists input if closed with hitting the Escape key | https://github.com/zen-browser/desktop/issues/9824 | 1 day, 17:21:19 | 1 day, 17:21:19 | +| Bookmark tab doesn't show in single toolbar mode | https://github.com/zen-browser/desktop/issues/9823 | 2 days, 2:41:34 | 2 days, 3:29:57 | +| Mouse Hover Shortcut Key Display Lacks Synchronization with User Settings | https://github.com/zen-browser/desktop/issues/9822 | None | None | +| The context menu to delete history from the URL bar suggestions needs two clicks to open | https://github.com/zen-browser/desktop/issues/9820 | None | None | +| The tab bar shows and hide quickly when leaving the search | https://github.com/zen-browser/desktop/issues/9819 | 0:25:47 | 2 days, 8:39:47 | +| Zen Browser freezes when using ChatGPT-5 Browser (especially with code-related responses) | https://github.com/zen-browser/desktop/issues/9816 | 8:28:17 | None | +| Zen hangs on contextual menu (right clicking, opening sub menus etc) on Linux | https://github.com/zen-browser/desktop/issues/9815 | None | None | +| Bookmarks, URL Bar, and Tabs Invisible Text After Update | https://github.com/zen-browser/desktop/issues/9813 | 7:26:37 | None | +| Folder tabs aren't in folders after relaunch | https://github.com/zen-browser/desktop/issues/9812 | 15:43:15 | 1 day, 19:13:37 | +| Location bar unfocused when the last character is deleted | https://github.com/zen-browser/desktop/issues/9810 | 0:18:17 | None | +| Essentials Bug | https://github.com/zen-browser/desktop/issues/9808 | 1:41:03 | None | +| Downloads button having poor visibility after downloading a file in some gradients. | https://github.com/zen-browser/desktop/issues/9807 | 1:44:14 | 1:44:14 | +| Laggy scrolling after not quiting the browser for a while | https://github.com/zen-browser/desktop/issues/9806 | 2 days, 10:50:57 | None | +| Unnecessary haptic feedback on MacOS when pinning new tab (Twilight) | https://github.com/zen-browser/desktop/issues/9805 | 6:15:46 | 6:15:46 | +| New folder renaming text too far to the right | https://github.com/zen-browser/desktop/issues/9804 | 6:17:45 | 6:17:45 | +| [Twilight] Broken haptic feedback on macOS when dragging tabs | https://github.com/zen-browser/desktop/issues/9803 | None | 1:14:26 | +| Video player not working on crunchyroll | https://github.com/zen-browser/desktop/issues/9802 | 1:16:40 | 1:16:40 | +| Switch to tab opens new tab instead of switching | https://github.com/zen-browser/desktop/issues/9801 | 12:20:40 | 12:27:21 | +| Reordering split panels via drag-and-drop does not update ordering in tab list, messes with keyboard navigation ordering. | https://github.com/zen-browser/desktop/issues/9800 | None | 1 day, 2:11:06 | +| tab bar in fullscreen mode | https://github.com/zen-browser/desktop/issues/9799 | None | 18:51:36 | +| Taskbar not showing | https://github.com/zen-browser/desktop/issues/9798 | 10:56:45 | None | +| Security key pin dialog lacks support for paste action | https://github.com/zen-browser/desktop/issues/9796 | 21:28:51 | 1 day, 6:48:45 | +| Last popup opening when submiting forms (i.e pressing enter) | https://github.com/zen-browser/desktop/issues/9795 | 21:44:10 | 1 day, 5:01:56 | +| New password updates don't work | https://github.com/zen-browser/desktop/issues/9794 | 2:53:04 | None | +| Sidebar quickly opening and closing when in compact mode | https://github.com/zen-browser/desktop/issues/9793 | 2:51:23 | None | +| Fail to import password from Brave | https://github.com/zen-browser/desktop/issues/9792 | None | 21:51:13 | +| Favicons not showing | https://github.com/zen-browser/desktop/issues/9791 | 14:44:19 | 4 days, 20:11:15 | +| The sidebar unexpectedly appears as the mouse cursor moves away from the URL bar in compact mode | https://github.com/zen-browser/desktop/issues/9790 | 11:11:16 | 23 days, 3:02:43 | +| Tab doesn't close after search (find on page) | https://github.com/zen-browser/desktop/issues/9789 | None | None | +| Weird Margin when on Fullscreen watching videos when sidebar opened | https://github.com/zen-browser/desktop/issues/9788 | None | None | +| Squashed webpages on smaller windows in hyprland | https://github.com/zen-browser/desktop/issues/9786 | 1:09:51 | None | +| Failed to check for updates | https://github.com/zen-browser/desktop/issues/9785 | 1:15:30 | None | +| Video thumbnails not fully load (YouTube) | https://github.com/zen-browser/desktop/issues/9783 | 0:07:00 | None | +| Version Compatibility Issue | https://github.com/zen-browser/desktop/issues/9782 | 1:12:07 | None | +| Setting Backward / Forward Workspace shortcuts to cmd+opt+right arrow / cmd+opt+left arrow doesn't work | https://github.com/zen-browser/desktop/issues/9779 | 3:51:07 | None | +| The close tab button fails to work when trying to close multiple tabs that are using Glance | https://github.com/zen-browser/desktop/issues/9778 | 2 days, 16:14:18 | None | +| Switching between Spaces not working | https://github.com/zen-browser/desktop/issues/9776 | 0:14:43 | 0:14:43 | +| Sidebar is much darker than the workspace's chosen theme color when in compact mode | https://github.com/zen-browser/desktop/issues/9773 | 0:03:24 | None | +| Exit menu not appearing as it should be! | https://github.com/zen-browser/desktop/issues/9771 | 1:55:10 | 1:55:10 | +| Zorin OS (sub disturbution of ubuntu): automatically unlodaded tabs' icons appear as if they are loaded. | https://github.com/zen-browser/desktop/issues/9770 | 5:45:29 | 2 days, 12:00:33 | +| No requests are shown in Network tabs in the DevTools | https://github.com/zen-browser/desktop/issues/9765 | None | 13:35:18 | +| The Youtube UI is missing | https://github.com/zen-browser/desktop/issues/9764 | 13:42:10 | None | +| Scrolling on Touch Pad not working | https://github.com/zen-browser/desktop/issues/9763 | None | 1 day, 1:06:22 | +| Problem with the translation icon | https://github.com/zen-browser/desktop/issues/9761 | None | None | +| Sidebar appearing again in ubuntu 24.04 even i already hid it | https://github.com/zen-browser/desktop/issues/9758 | None | 4:46:11 | +| Ferefox View is not working | https://github.com/zen-browser/desktop/issues/9757 | None | None | +| Google Docs (Hebrew): Selected text is not deselected after typing, leading to infinite replacement loop. | https://github.com/zen-browser/desktop/issues/9756 | None | None | +| Container tabs can't be added to essentials | https://github.com/zen-browser/desktop/issues/9753 | 10:17:57 | 17:44:03 | +| transparent custom color issue | https://github.com/zen-browser/desktop/issues/9752 | 26 days, 4:17:37 | None | +| night tb extension problem | https://github.com/zen-browser/desktop/issues/9751 | None | 2:37:24 | +| night tab extension not working | https://github.com/zen-browser/desktop/issues/9750 | 0:45:32 | None | +| Media Component showing wrong timing. | https://github.com/zen-browser/desktop/issues/9748 | 1 day, 21:23:48 | None | +| Option+Cmd+E shortcut is assigned twice in standard settings | https://github.com/zen-browser/desktop/issues/9746 | 2 days, 1:35:44 | None | +| Microphone not detected on Google Meet using Zen Browser under Wayland | https://github.com/zen-browser/desktop/issues/9745 | None | None | +| Apple Passwords extension works in firefox but not in zen | https://github.com/zen-browser/desktop/issues/9743 | None | 4:24:39 | +| [Flatpak] Maximize and Minimize button not appearing | https://github.com/zen-browser/desktop/issues/9740 | 16:43:18 | None | +| Zen Browser does not stay in Dark theme | https://github.com/zen-browser/desktop/issues/9739 | 3:02:20 | 10:26:06 | +| Sidebar Hover keeps breaking Sidebar | https://github.com/zen-browser/desktop/issues/9738 | 18:14:03 | 18:14:03 | +| WebGL not working because glxtest cannot determine the primary gpu | https://github.com/zen-browser/desktop/issues/9735 | None | 2 days, 2:10:27 | +| Critical profile and data wipe - my data is inaccessible but viewable via AppData | https://github.com/zen-browser/desktop/issues/9733 | None | None | +| Workspace bookmarks are showing across different workspaces | https://github.com/zen-browser/desktop/issues/9732 | None | None | +| Side bar takes priority over top bar in compact mode, impossible to close window in compact mode with no tabs open | https://github.com/zen-browser/desktop/issues/9730 | None | None | +| Incorrect theme context color provider in dark mode for the bottom search bar | https://github.com/zen-browser/desktop/issues/9729 | 17:05:40 | 23:37:32 | +| URLs open in wrong space | https://github.com/zen-browser/desktop/issues/9728 | 4 days, 4:26:42 | None | +| "ZenCP Isolated Web Content" process pegs all cores after media playback on MacOS | https://github.com/zen-browser/desktop/issues/9727 | 5 days, 2:14:27 | None | +| How to disable url in sidebar. | https://github.com/zen-browser/desktop/issues/9726 | None | 0:03:33 | +| Switch to tab clones tab instead of switching. | https://github.com/zen-browser/desktop/issues/9724 | 0:21:55 | 0:42:52 | +| Not supported HTML5 | https://github.com/zen-browser/desktop/issues/9723 | 3:28:34 | 3:28:34 | +| Zen browsers loses tabs every time it is restarted | https://github.com/zen-browser/desktop/issues/9718 | 15 days, 7:57:29 | 0:03:16 | +| Can't change to different workspaces after a while | https://github.com/zen-browser/desktop/issues/9717 | 5 days, 11:32:11 | None | +| Moving bookmarks in the bookmark bar is not reliable | https://github.com/zen-browser/desktop/issues/9715 | 24 days, 1:43:39 | None | +| Ctrl+Shift+T not restoring the most recent tab | https://github.com/zen-browser/desktop/issues/9714 | None | 14:28:46 | + +_This report was generated with the [Issue Metrics Action](https://github.com/github/issue-metrics)_ +Search query used to find these items: `repo:zen-browser/desktop is:issue created:2025-08-01..2025-08-31` From 3d472de5ac287b6993448818f5abec4af6c10f34 Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Mon, 1 Sep 2025 13:06:04 +0200 Subject: [PATCH 47/55] feat: Improved the way we hanle owned tabs inside folders, b=no-bug, c=folders --- .../tabbrowser/content/tabbrowser-js.patch | 83 ++++++++++--------- src/zen/folders/ZenFolders.mjs | 9 -- 2 files changed, 45 insertions(+), 47 deletions(-) diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch index fa3d24c5e..1cd8bed2a 100644 --- a/src/browser/components/tabbrowser/content/tabbrowser-js.patch +++ b/src/browser/components/tabbrowser/content/tabbrowser-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js -index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4beed4c5079b 100644 +index d80a66a01002e78a9c65545d08fe786328ddf124..46b1e3075165e1e9e783db84861b0fea99420448 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js @@ -422,15 +422,64 @@ @@ -395,15 +395,22 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee + gZenWorkspaces._initialTab._shouldRemove = true; + } + } -+ } + } + else { + gZenWorkspaces._tabToRemoveForEmpty = this.selectedTab; - } ++ } + this._hasAlreadyInitializedZenSessionStore = true; if (tabs.length > 1 || !tabs[0].selected) { this._updateTabsAfterInsert(); -@@ -3927,7 +4050,7 @@ +@@ -3923,11 +4046,14 @@ + if (ownerTab) { + tab.owner = ownerTab; + } ++ if (!tab.pinned && tabGroup?.isZenFolder && !Services.prefs.getBoolPref('zen.folders.owned-tabs-in-folder')) { ++ tabGroup = null; ++ } + // Ensure we have an index if one was not provided. if (typeof elementIndex != "number" && typeof tabIndex != "number") { // Move the new tab after another tab if needed, to the end otherwise. @@ -412,7 +419,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee if ( !bulkOrderedOpen && ((openerTab && -@@ -3939,7 +4062,7 @@ +@@ -3939,7 +4065,7 @@ let lastRelatedTab = openerTab && this._lastRelatedTabMap.get(openerTab); let previousTab = lastRelatedTab || openerTab || this.selectedTab; @@ -421,7 +428,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee tabGroup = previousTab.group; } if ( -@@ -3950,7 +4073,7 @@ +@@ -3950,7 +4076,7 @@ ) { elementIndex = Infinity; } else if (previousTab.visible) { @@ -430,7 +437,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee } else if (previousTab == FirefoxViewHandler.tab) { elementIndex = 0; } -@@ -3978,14 +4101,14 @@ +@@ -3978,14 +4104,14 @@ } // Ensure index is within bounds. if (tab.pinned) { @@ -449,7 +456,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee if (pinned && !itemAfter?.pinned) { itemAfter = null; -@@ -3996,7 +4119,7 @@ +@@ -3996,7 +4122,7 @@ this.tabContainer._invalidateCachedTabs(); @@ -458,7 +465,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee if (this.isTab(itemAfter) && itemAfter.group == tabGroup) { // Place at the front of, or between tabs in, the same tab group this.tabContainer.insertBefore(tab, itemAfter); -@@ -4032,6 +4155,7 @@ +@@ -4032,6 +4158,7 @@ if (pinned) { this._updateTabBarForPinnedTabs(); } @@ -466,7 +473,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee TabBarVisibility.update(); } -@@ -4321,6 +4445,9 @@ +@@ -4321,6 +4448,9 @@ return; } @@ -476,7 +483,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee this.removeTabs(selectedTabs, { isUserTriggered, telemetrySource }); } -@@ -4582,6 +4709,7 @@ +@@ -4582,6 +4712,7 @@ telemetrySource, } = {} ) { @@ -484,7 +491,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee // When 'closeWindowWithLastTab' pref is enabled, closing all tabs // can be considered equivalent to closing the window. if ( -@@ -4671,6 +4799,7 @@ +@@ -4671,6 +4802,7 @@ if (lastToClose) { this.removeTab(lastToClose, aParams); } @@ -492,7 +499,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee } catch (e) { console.error(e); } -@@ -4709,6 +4838,12 @@ +@@ -4709,6 +4841,12 @@ aTab._closeTimeNoAnimTimerId = Glean.browserTabclose.timeNoAnim.start(); } @@ -505,7 +512,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee // Handle requests for synchronously removing an already // asynchronously closing tab. if (!animate && aTab.closing) { -@@ -4723,6 +4858,9 @@ +@@ -4723,6 +4861,9 @@ // state). let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width; let isLastTab = this.#isLastTabInWindow(aTab); @@ -515,7 +522,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee if ( !this._beginRemoveTab(aTab, { closeWindowFastpath: true, -@@ -4905,7 +5043,7 @@ +@@ -4905,7 +5046,7 @@ closeWindowWithLastTab != null ? closeWindowWithLastTab : !window.toolbar.visible || @@ -524,7 +531,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee if (closeWindow) { // We've already called beforeunload on all the relevant tabs if we get here, -@@ -4929,6 +5067,7 @@ +@@ -4929,6 +5070,7 @@ newTab = true; } @@ -532,7 +539,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee aTab._endRemoveArgs = [closeWindow, newTab]; // swapBrowsersAndCloseOther will take care of closing the window without animation. -@@ -4969,13 +5108,7 @@ +@@ -4969,13 +5111,7 @@ aTab._mouseleave(); if (newTab) { @@ -547,7 +554,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee } else { TabBarVisibility.update(); } -@@ -5108,6 +5241,7 @@ +@@ -5108,6 +5244,7 @@ this.tabs[i]._tPos = i; } @@ -555,7 +562,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee if (!this._windowIsClosing) { // update tab close buttons state this.tabContainer._updateCloseButtons(); -@@ -5320,6 +5454,7 @@ +@@ -5320,6 +5457,7 @@ } let excludeTabs = new Set(aExcludeTabs); @@ -563,7 +570,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee // If this tab has a successor, it should be selectable, since // hiding or closing a tab removes that tab as a successor. -@@ -5332,13 +5467,13 @@ +@@ -5332,13 +5470,13 @@ !excludeTabs.has(aTab.owner) && Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose") ) { @@ -579,7 +586,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee ); let tab = this.tabContainer.findNextTab(aTab, { -@@ -5354,7 +5489,7 @@ +@@ -5354,7 +5492,7 @@ } if (tab) { @@ -588,7 +595,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee } // If no qualifying visible tab was found, see if there is a tab in -@@ -5375,7 +5510,7 @@ +@@ -5375,7 +5513,7 @@ }); } @@ -597,7 +604,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee } _blurTab(aTab) { -@@ -5777,10 +5912,10 @@ +@@ -5777,10 +5915,10 @@ SessionStore.deleteCustomTabValue(aTab, "hiddenBy"); } @@ -610,7 +617,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee aTab.selected || aTab.closing || // Tabs that are sharing the screen, microphone or camera cannot be hidden. -@@ -5839,6 +5974,7 @@ +@@ -5839,6 +5977,7 @@ * @param {MozTabbrowserTab|MozTabbrowserTabGroup|MozTabbrowserTabGroup.labelElement} aTab */ replaceTabWithWindow(aTab, aOptions) { @@ -618,7 +625,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee if (this.tabs.length == 1) { return null; } -@@ -5972,7 +6108,7 @@ +@@ -5972,7 +6111,7 @@ * `true` if element is a `` */ isTabGroup(element) { @@ -627,7 +634,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee } /** -@@ -6048,8 +6184,8 @@ +@@ -6048,8 +6187,8 @@ } // Don't allow mixing pinned and unpinned tabs. @@ -638,7 +645,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee } else { tabIndex = Math.max(tabIndex, this.pinnedTabCount); } -@@ -6075,10 +6211,16 @@ +@@ -6075,10 +6214,16 @@ this.#handleTabMove( element, () => { @@ -657,7 +664,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee if (neighbor && this.isTab(element) && tabIndex > element._tPos) { neighbor.after(element); } else { -@@ -6136,23 +6278,28 @@ +@@ -6136,23 +6281,28 @@ #moveTabNextTo(element, targetElement, moveBefore = false, metricsContext) { if (this.isTabGroupLabel(targetElement)) { targetElement = targetElement.group; @@ -692,7 +699,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee } else if (!element.pinned && targetElement && targetElement.pinned) { // If the caller asks to move an unpinned element next to a pinned // tab, move the unpinned element to be the first unpinned element -@@ -6165,14 +6312,34 @@ +@@ -6165,14 +6315,34 @@ // move the tab group right before the first unpinned tab. // 4. Moving a tab group and the first unpinned tab is grouped: // move the tab group right before the first unpinned tab's tab group. @@ -728,7 +735,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee element.pinned ? this.tabContainer.pinnedTabsContainer : this.tabContainer; -@@ -6181,7 +6348,7 @@ +@@ -6181,7 +6351,7 @@ element, () => { if (moveBefore) { @@ -737,7 +744,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee } else if (targetElement) { targetElement.after(element); } else { -@@ -6227,10 +6394,10 @@ +@@ -6227,10 +6397,10 @@ * @param {TabMetricsContext} [metricsContext] */ moveTabToGroup(aTab, aGroup, metricsContext) { @@ -750,7 +757,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee return; } if (aTab.group && aTab.group.id === aGroup.id) { -@@ -6261,6 +6428,7 @@ +@@ -6261,6 +6431,7 @@ let state = { tabIndex: tab._tPos, @@ -758,7 +765,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee }; if (tab.visible) { state.elementIndex = tab.elementIndex; -@@ -6287,7 +6455,7 @@ +@@ -6287,7 +6458,7 @@ let changedTabGroup = previousTabState.tabGroupId != currentTabState.tabGroupId; @@ -767,7 +774,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee tab.dispatchEvent( new CustomEvent("TabMove", { bubbles: true, -@@ -6324,6 +6492,10 @@ +@@ -6324,6 +6495,10 @@ moveActionCallback(); @@ -778,7 +785,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee // Clear tabs cache after moving nodes because the order of tabs may have // changed. this.tabContainer._invalidateCachedTabs(); -@@ -7221,7 +7393,7 @@ +@@ -7221,7 +7396,7 @@ // preventDefault(). It will still raise the window if appropriate. break; } @@ -787,7 +794,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee window.focus(); aEvent.preventDefault(); break; -@@ -8166,6 +8338,7 @@ +@@ -8166,6 +8341,7 @@ aWebProgress.isTopLevel ) { this.mTab.setAttribute("busy", "true"); @@ -795,7 +802,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee gBrowser._tabAttrModified(this.mTab, ["busy"]); this.mTab._notselectedsinceload = !this.mTab.selected; } -@@ -9157,7 +9330,7 @@ var TabContextMenu = { +@@ -9157,7 +9333,7 @@ var TabContextMenu = { ); contextUnpinSelectedTabs.hidden = !this.contextTab.pinned || !this.multiselected; @@ -804,7 +811,7 @@ index d80a66a01002e78a9c65545d08fe786328ddf124..a3f903c0245a9ac89def72c6ed1f4bee // Build Ask Chat items TabContextMenu.GenAI.buildTabMenu( document.getElementById("context_askChat"), -@@ -9476,6 +9649,7 @@ var TabContextMenu = { +@@ -9476,6 +9652,7 @@ var TabContextMenu = { ) ); } else { diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs index ee83a4fad..1981e5626 100644 --- a/src/zen/folders/ZenFolders.mjs +++ b/src/zen/folders/ZenFolders.mjs @@ -269,21 +269,12 @@ if (Services.prefs.getBoolPref('zen.folders.owned-tabs-in-folder')) { gBrowser.pinTab(tab); group.addTabs([tab]); - } else { - tab._ignoreUngrouped = true; - // Otherwise, we must move it to the first tab since it was added in an unpinned state - gZenWorkspaces._emptyTab.after(tab); - gBrowser.tabContainer._invalidateCachedTabs(); } } on_TabUngrouped(event) { const tab = event.detail; const group = event.target; - if (tab._ignoreUngrouped) { - delete tab._ignoreUngrouped; - return; - } tab.removeAttribute('folder-active'); if (group.hasAttribute('split-view-group') && tab.hasAttribute('had-zen-pinned-changed')) { tab.setAttribute('zen-pinned-changed', true); From 4420d0df8c9d9f19f3034dddee116f11a2ab272a Mon Sep 17 00:00:00 2001 From: "mr. m" Date: Mon, 1 Sep 2025 13:14:54 +0200 Subject: [PATCH 48/55] feat: Properly disable folders on private mode, b=no-bug, c=workspaces --- src/zen/workspaces/ZenWorkspaces.mjs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index d22aee53b..a0e72249d 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -2626,7 +2626,15 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { _initializeWorkspaceTabContextMenus() { if (this.privateWindowOrDisabled) { - document.getElementById('cmd_zenOpenWorkspaceCreation').setAttribute('disabled', true); + const commandsToDisable = [ + 'cmd_zenOpenFolderCreation', + 'cmd_zenOpenWorkspaceCreation', + 'zen-context-menu-new-folder', + 'zen-context-menu-new-folder-toolbar', + ]; + commandsToDisable.forEach((cmd) => { + document.getElementById(cmd).setAttribute('disabled', true); + }); return; } const menu = document.createXULElement('menu'); From 236b5dc5c7a5860c336290b5a91d3f8c00c95549 Mon Sep 17 00:00:00 2001 From: reizumi Date: Tue, 2 Sep 2025 00:09:35 +0800 Subject: [PATCH 49/55] fix: use default zen accent color and revert changes related to accent color (#10187) * fix: use AccentColor variable and revert changes related to accent color * fix: revert default accent color to zen accent color --- prefs/theme.yaml | 2 +- src/zen/common/styles/zen-browser-ui.css | 7 ------- src/zen/common/zenThemeModifier.js | 5 +---- src/zen/workspaces/ZenGradientGenerator.mjs | 11 +---------- 4 files changed, 3 insertions(+), 22 deletions(-) diff --git a/prefs/theme.yaml b/prefs/theme.yaml index e171cfc91..7d912f41b 100644 --- a/prefs/theme.yaml +++ b/prefs/theme.yaml @@ -3,7 +3,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. - name: zen.theme.accent-color - value: 'system' + value: '#ffb787' - name: zen.theme.content-element-separation value: 8 diff --git a/src/zen/common/styles/zen-browser-ui.css b/src/zen/common/styles/zen-browser-ui.css index 91de03373..b80014bce 100644 --- a/src/zen/common/styles/zen-browser-ui.css +++ b/src/zen/common/styles/zen-browser-ui.css @@ -48,13 +48,6 @@ isolation: isolate; background: var(--zen-themed-toolbar-bg-transparent); - /* - * Important: We set the color to `AccentColor` so we can - * Compute the stylings and get the native accent color. - * Please, do not remove this. - */ - color: AccentColor; - &::after, &::before { content: ''; diff --git a/src/zen/common/zenThemeModifier.js b/src/zen/common/zenThemeModifier.js index 41ecc691f..4f8017dc8 100644 --- a/src/zen/common/zenThemeModifier.js +++ b/src/zen/common/zenThemeModifier.js @@ -97,10 +97,7 @@ var ZenThemeModifier = { * Update the accent color. */ updateAccentColor() { - let accentColor = Services.prefs.getStringPref('zen.theme.accent-color'); - if (accentColor.startsWith('system:')) { - accentColor = accentColor.replace('system:', '').trim(); - } + const accentColor = Services.prefs.getStringPref('zen.theme.accent-color'); document.documentElement.style.setProperty('--zen-primary-color', accentColor); }, }; diff --git a/src/zen/workspaces/ZenGradientGenerator.mjs b/src/zen/workspaces/ZenGradientGenerator.mjs index 6db40a6d4..6219d8564 100644 --- a/src/zen/workspaces/ZenGradientGenerator.mjs +++ b/src/zen/workspaces/ZenGradientGenerator.mjs @@ -1501,16 +1501,7 @@ getNativeAccentColor() { const accentColor = Services.prefs.getStringPref('zen.theme.accent-color'); - let rgb; - if (accentColor.startsWith('system')) { - const rawRgb = window.getComputedStyle(document.getElementById('zen-browser-background'))[ - 'color' - ]; - Services.prefs.setStringPref('zen.theme.accent-color', `system:${rawRgb}`); - rgb = rawRgb.match(/\d+/g).map(Number); - } else { - rgb = this.hexToRgb(accentColor); - } + const rgb = this.hexToRgb(accentColor); if (this.isDarkMode) { // If the theme is dark, we want to use a lighter color return this.blendColors(rgb, [0, 0, 0], 40); From 3301ee5572bbe5d3dfaf9e91d637db124b12351b Mon Sep 17 00:00:00 2001 From: reizumi Date: Tue, 2 Sep 2025 05:51:59 +0800 Subject: [PATCH 50/55] fix: wrong security indicator in about pages (#10190) --- src/browser/themes/shared/zen-icons/icons.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/browser/themes/shared/zen-icons/icons.css b/src/browser/themes/shared/zen-icons/icons.css index 09f950ecc..9a6ac4d34 100644 --- a/src/browser/themes/shared/zen-icons/icons.css +++ b/src/browser/themes/shared/zen-icons/icons.css @@ -344,6 +344,7 @@ } #identity-popup[connection='chrome'] .identity-popup-security-connection { + list-style-image: url('chrome://branding/content/icon48.png') !important; filter: grayscale(1); } From 458f502184c65ad59ba818143b77ceb2dae97710 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Tue, 2 Sep 2025 01:17:08 +0200 Subject: [PATCH 51/55] New Crowdin updates, p=#10194 * New translations zen-folders.ftl (Irish) * New translations zen-folders.ftl (Portuguese, Brazilian) --- locales/ga-IE/browser/browser/zen-folders.ftl | 2 +- locales/pt-BR/browser/browser/zen-folders.ftl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/locales/ga-IE/browser/browser/zen-folders.ftl b/locales/ga-IE/browser/browser/zen-folders.ftl index 70c55301b..14e7b5b3f 100644 --- a/locales/ga-IE/browser/browser/zen-folders.ftl +++ b/locales/ga-IE/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Athraigh Deilbhín zen-folders-unload-all-tooltip = - .tooltiptext = Unload active in this folder + .tooltiptext = Díluchtaigh gníomhach sa fhillteán seo zen-folders-unload-folder = .label = Díluchtaigh Gach Cluaisín zen-folders-search-no-results = Níl aon chluaisíní ann a mheaitseálann an cuardach sin 🤔 diff --git a/locales/pt-BR/browser/browser/zen-folders.ftl b/locales/pt-BR/browser/browser/zen-folders.ftl index 241a98d35..d1210c748 100644 --- a/locales/pt-BR/browser/browser/zen-folders.ftl +++ b/locales/pt-BR/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Alterar Ícone zen-folders-unload-all-tooltip = - .tooltiptext = Unload active in this folder + .tooltiptext = Descarregar abas ativas nesta pasta zen-folders-unload-folder = .label = Descarregar todas as abas zen-folders-search-no-results = Nenhuma guia corresponde a essa pesquisa 🤔 From 57635ff586883ccebba1578d5e824ac1f886968c Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Tue, 2 Sep 2025 01:39:57 +0200 Subject: [PATCH 52/55] feat: Added migration for old accent colors and fixed private mode, b=no-bug, c=common, workspaces --- src/zen/common/ZenUIMigration.mjs | 8 +++++++- src/zen/workspaces/ZenWorkspaces.mjs | 5 ++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/zen/common/ZenUIMigration.mjs b/src/zen/common/ZenUIMigration.mjs index 514fe7e2c..18c3f6ca5 100644 --- a/src/zen/common/ZenUIMigration.mjs +++ b/src/zen/common/ZenUIMigration.mjs @@ -6,7 +6,7 @@ const { AppConstants } = ChromeUtils.importESModule('resource://gre/modules/AppC class nsZenUIMigration { PREF_NAME = 'zen.ui.migration.version'; - MIGRATION_VERSION = 2; + MIGRATION_VERSION = 3; init(isNewProfile) { if (!isNewProfile) { @@ -71,6 +71,12 @@ class nsZenUIMigration { Services.prefs.setIntPref('zen.theme.gradient-legacy-version', 0); } } + + _migrateV3() { + if (Services.prefs.getStringPref('zen.theme.accent-color', '').startsWith('system')) { + Services.prefs.setStringPref('zen.theme.accent-color', '#ffb787'); + } + } } export var gZenUIMigration = new nsZenUIMigration(); diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs index a0e72249d..cf7def40a 100644 --- a/src/zen/workspaces/ZenWorkspaces.mjs +++ b/src/zen/workspaces/ZenWorkspaces.mjs @@ -2633,7 +2633,10 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature { 'zen-context-menu-new-folder-toolbar', ]; commandsToDisable.forEach((cmd) => { - document.getElementById(cmd).setAttribute('disabled', true); + const element = document.getElementById(cmd); + if (element) { + element.setAttribute('disabled', true); + } }); return; } From 54abd673f1281469ef2c194c9e717929b3381e60 Mon Sep 17 00:00:00 2001 From: reizumi Date: Tue, 2 Sep 2025 17:34:25 +0800 Subject: [PATCH 53/55] fix: hide manage themes option in customize toolbar, p=#10201 * fix: hide firefox themes option in customize toolbar * Update zen-single-components.css Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com> --------- Signed-off-by: mr. m <91018726+mr-cheffy@users.noreply.github.com> Co-authored-by: mr. m <91018726+mr-cheffy@users.noreply.github.com> --- src/zen/common/styles/zen-single-components.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css index 8218e2ebf..43c7ff56d 100644 --- a/src/zen/common/styles/zen-single-components.css +++ b/src/zen/common/styles/zen-single-components.css @@ -23,6 +23,12 @@ display: none !important; } +@media -moz-pref('zen.theme.disable-lightweight') { + #customization-lwtheme-link { + display: none !important; + } +} + .private-browsing-indicator-with-label { display: none !important; } From 8c28dc9e891f0c564edb73650649287b0033bc8e Mon Sep 17 00:00:00 2001 From: "Mr. M" Date: Tue, 2 Sep 2025 12:16:52 +0200 Subject: [PATCH 54/55] feat: Dont close essentials when they are unloaded, b=no-bug, c=folders, tabs --- src/zen/folders/ZenFolders.mjs | 2 +- src/zen/folders/zen-folders.css | 4 ++++ src/zen/tabs/ZenPinnedTabManager.mjs | 8 +++++--- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs index 1981e5626..a7882aa31 100644 --- a/src/zen/folders/ZenFolders.mjs +++ b/src/zen/folders/ZenFolders.mjs @@ -1054,7 +1054,7 @@ // We don't need to do anything if the URL is invalid. e.g. about:blank } let tabLabel = tab.label || ''; - let iconURL = gBrowser.getIcon(tab) || PlacesUtils.favicons.defaultFavicon; + let iconURL = gBrowser.getIcon(tab) || PlacesUtils.favicons.defaultFavicon.spec; icon.src = iconURL; diff --git a/src/zen/folders/zen-folders.css b/src/zen/folders/zen-folders.css index d777ce29a..016f1b7d5 100644 --- a/src/zen/folders/zen-folders.css +++ b/src/zen/folders/zen-folders.css @@ -393,6 +393,8 @@ zen-folder { border: none !important; outline: none !important; flex: 1; + text-overflow: ellipsis; + white-space: nowrap; } #zen-folder-tabs-list { @@ -416,6 +418,8 @@ zen-folder { flex-shrink: 0; margin-inline-end: 10px; margin-inline-start: 4px; + fill: currentColor; + -moz-context-properties: fill; } .folders-tabs-list-item-labels { diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs index 26c00c2e5..4b9d20fb8 100644 --- a/src/zen/tabs/ZenPinnedTabManager.mjs +++ b/src/zen/tabs/ZenPinnedTabManager.mjs @@ -812,7 +812,9 @@ if (selectedTab.group?.hasAttribute('split-view-group')) { tabsToUnload = selectedTab.group.tabs; } - const allAreUnloaded = tabsToUnload.every((tab) => tab.hasAttribute('pending')); + const allAreUnloaded = tabsToUnload.every( + (tab) => tab.hasAttribute('pending') && !tab.hasAttribute('zen-essential') + ); if (allAreUnloaded && closeIfPending) { return await this._onCloseTabShortcut(event, selectedTab, { behavior: 'close' }); } @@ -897,7 +899,7 @@ const faviconData = await PlacesUtils.favicons.getFaviconForPage(pageUrl); if (!faviconData) { // empty favicon - return 'data:image/png;base64,'; + return null; } return faviconData.dataURI; } catch (ex) { @@ -1205,7 +1207,7 @@ } else { tab.setAttribute('zen-pinned-changed', 'true'); } - tab.style.setProperty('--zen-original-tab-icon', `url(${pin.iconUrl.spec})`); + tab.style.setProperty('--zen-original-tab-icon', `url(${pin.iconUrl?.spec})`); } removeTabContainersDragoverClass(hideIndicator = true) { From 182c8a4ff7350026ea8fcb09987b7fc081d41724 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Wed, 3 Sep 2025 01:09:35 +0200 Subject: [PATCH 55/55] chore: New Crowdin updates, p=#10213 --- locales/cs/browser/browser/zen-folders.ftl | 2 +- .../browser/preferences/zen-preferences.ftl | 2 +- locales/zh-CN/browser/browser/zen-folders.ftl | 16 ++++++++-------- locales/zh-CN/browser/browser/zen-general.ftl | 4 ++-- .../zh-CN/browser/browser/zen-vertical-tabs.ftl | 2 +- locales/zh-CN/browser/browser/zen-workspaces.ftl | 4 ++-- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/locales/cs/browser/browser/zen-folders.ftl b/locales/cs/browser/browser/zen-folders.ftl index d8a804c94..8e2aa8471 100644 --- a/locales/cs/browser/browser/zen-folders.ftl +++ b/locales/cs/browser/browser/zen-folders.ftl @@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space = zen-folders-panel-change-icon-folder = .label = Změnit ikonu zen-folders-unload-all-tooltip = - .tooltiptext = Unload active in this folder + .tooltiptext = Uspat aktivní panely v této složce zen-folders-unload-folder = .label = Uspat všechny panely zen-folders-search-no-results = Žádný panel neodpovídá tomuto hledání 🤔 diff --git a/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl b/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl index 7c0105d34..41d115b07 100644 --- a/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl +++ b/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl @@ -27,7 +27,7 @@ zen-glance-trigger-shift-click = zen-glance-trigger-meta-click = .label = Meta (Command) + 单击 zen-glance-trigger-mantain-click = - .label = 长按(即将上线) + .label = 长按(即将上线!) zen-look-and-feel-compact-view-header = 以紧凑视图显示 zen-look-and-feel-compact-view-description = 仅显示您使用的工具栏! zen-look-and-feel-compact-view-enabled = diff --git a/locales/zh-CN/browser/browser/zen-folders.ftl b/locales/zh-CN/browser/browser/zen-folders.ftl index 3c19d8a30..1e4eb6498 100644 --- a/locales/zh-CN/browser/browser/zen-folders.ftl +++ b/locales/zh-CN/browser/browser/zen-folders.ftl @@ -1,21 +1,21 @@ zen-folders-search-placeholder = .placeholder = 搜索 { $folder-name }…… zen-folders-panel-rename-folder = - .label = Rename Folder + .label = 重命名文件夹 zen-folders-panel-unpack-folder = .label = Unpack Folder zen-folders-new-subfolder = - .label = New Subfolder + .label = 新建子文件夹 zen-folders-panel-delete-folder = - .label = Delete Folder + .label = 删除文件夹 zen-folders-panel-convert-folder-to-space = - .label = Convert folder to Space + .label = 将文件夹转换为工作区 zen-folders-panel-change-folder-space = - .label = Change Space... + .label = 更改工作区…… zen-folders-panel-change-icon-folder = - .label = Change Icon + .label = 更改图标 zen-folders-unload-all-tooltip = - .tooltiptext = Unload active in this folder + .tooltiptext = 卸载此文件夹中的活动 zen-folders-unload-folder = .label = Unload All Tabs -zen-folders-search-no-results = No tabs matching that search 🤔 +zen-folders-search-no-results = 没有搜索到匹配的标签 🤔 diff --git a/locales/zh-CN/browser/browser/zen-general.ftl b/locales/zh-CN/browser/browser/zen-general.ftl index a3380fcf3..1b8a68ea3 100644 --- a/locales/zh-CN/browser/browser/zen-general.ftl +++ b/locales/zh-CN/browser/browser/zen-general.ftl @@ -43,6 +43,6 @@ zen-close-label = 关闭 zen-singletoolbar-urlbar-placeholder-with-name = .placeholder = 搜索…… zen-icons-picker-emoji = - .label = Emojis + .label = 表情符号 zen-icons-picker-svg = - .label = Icons + .label = 图标集 diff --git a/locales/zh-CN/browser/browser/zen-vertical-tabs.ftl b/locales/zh-CN/browser/browser/zen-vertical-tabs.ftl index 12bd9bbca..2a250d42c 100644 --- a/locales/zh-CN/browser/browser/zen-vertical-tabs.ftl +++ b/locales/zh-CN/browser/browser/zen-vertical-tabs.ftl @@ -15,7 +15,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = 两者都隐藏 .accesskey = H zen-toolbar-context-new-folder = - .label = New Folder + .label = 新建文件夹 .accesskey = N sidebar-zen-expand = .label = 展开侧边栏 diff --git a/locales/zh-CN/browser/browser/zen-workspaces.ftl b/locales/zh-CN/browser/browser/zen-workspaces.ftl index 3afed2945..2d81a70e2 100644 --- a/locales/zh-CN/browser/browser/zen-workspaces.ftl +++ b/locales/zh-CN/browser/browser/zen-workspaces.ftl @@ -2,7 +2,7 @@ zen-panel-ui-workspaces-text = 工作区 zen-panel-ui-workspaces-create = .label = 创建工作区 zen-panel-ui-folder-create = - .label = Create Folder + .label = 新建文件夹 zen-workspaces-panel-context-delete = .label = 删除工作区 .accesskey = D @@ -48,4 +48,4 @@ zen-workspace-creation-profile = 身份 zen-workspace-creation-header = 创建工作区 zen-workspace-creation-label = 工作区用于组织标签页和会话。 zen-workspaces-delete-workspace-title = 删除工作区? -zen-workspaces-delete-workspace-body = Are you sure you want to delete { $name }? This action cannot be undone. +zen-workspaces-delete-workspace-body = 你确定要删除 { $name } 吗?这个操作无法撤销。