From 3b85ac912eb88041c957e4c002dd3f023c05435d Mon Sep 17 00:00:00 2001 From: KelTech Date: Thu, 16 Apr 2026 23:55:13 -0700 Subject: [PATCH 01/31] gh-13095: restore multi-select highlight for split-view tabs (gh-13292) Fixes #13095. The selector change in fe19b44 replaced the :has(multiselected) match with [hasactivetab], which only fires when the active tab is inside the split group. Multi-selecting tabs without the split tab in the initial selection dropped the highlight. Added the multiselected path back as a union so both cases get the selected styling. --- src/zen/split-view/zen-split-group.inc.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/zen/split-view/zen-split-group.inc.css b/src/zen/split-view/zen-split-group.inc.css index a5ab1d382..a153d165c 100644 --- a/src/zen/split-view/zen-split-group.inc.css +++ b/src/zen/split-view/zen-split-group.inc.css @@ -104,7 +104,8 @@ tab-group[split-view-group] { } } - tab-group[split-view-group]:where([hasactivetab]) & { + tab-group[split-view-group]:where([hasactivetab]) &, + &:has(> tab:is([multiselected])) { background-color: var(--tab-selected-bgcolor); box-shadow: var(--tab-selected-shadow); From 7046d16956d8e9f28d49aef64eeb3a2f509deb43 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Fri, 17 Apr 2026 13:32:22 +0200 Subject: [PATCH 02/31] gh-13149: Fixed WS marking tabs as inactive in certain cases (gh-13298) --- scripts/mar_sign.sh | 20 ++++++++++++++++---- src/zen/sessionstore/ZenWindowSync.sys.mjs | 10 ++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/scripts/mar_sign.sh b/scripts/mar_sign.sh index fb47c6a80..e0c02802b 100644 --- a/scripts/mar_sign.sh +++ b/scripts/mar_sign.sh @@ -47,10 +47,22 @@ import_cert() { echo "Error: public_key.der not found. Run with -g first." >&2 exit 1 fi - echo "Importing certificate into $UPDATER_CERT_DIR/release_primary.der" - cp "$CERT_PATH_DIR/public_key.der" "$UPDATER_CERT_DIR/release_primary.der" - echo "Importing certificate into $UPDATER_CERT_DIR/release_secondary.der" - cp "$CERT_PATH_DIR/public_key.der" "$UPDATER_CERT_DIR/release_secondary.der" + files=( + "$UPDATER_CERT_DIR/release_primary.der" + "$UPDATER_CERT_DIR/release_secondary.der" + "$UPDATER_CERT_DIR/dep1.der" + "$UPDATER_CERT_DIR/dep2.der" + "$UPDATER_CERT_DIR/xpcshellCertificate.der" + ) + for file in "${files[@]}"; do + if [ ! -f "$file" ]; then + echo "Error: $file not found. Make sure the updater certificates exist." >&2 + exit 1 + fi + rm -f "$file" + echo "Copying $CERT_PATH_DIR/public_key.der to $file" + cp "$CERT_PATH_DIR/public_key.der" "$file" + done echo "Done. Rebuild the updater to embed the new certificate." } diff --git a/src/zen/sessionstore/ZenWindowSync.sys.mjs b/src/zen/sessionstore/ZenWindowSync.sys.mjs index 564693dca..8612601c4 100644 --- a/src/zen/sessionstore/ZenWindowSync.sys.mjs +++ b/src/zen/sessionstore/ZenWindowSync.sys.mjs @@ -795,6 +795,16 @@ class nsZenWindowSync { ); return false; } + // Theoretical case where we are trying to swap two tabs in the same window. + // There has been some reports of this happening in the wild, and while it shouldn't + // cause any critical issues, it can cause some weird states and we should avoid it. + // For example, see gh-13149 + if (aOtherTab.ownerGlobal === aOurTab.ownerGlobal) { + this.log( + `Cannot swap browsers between tabs ${aOurTab.id} and ${aOtherTab.id} because they are in the same window` + ); + return false; + } // Can't swap between chrome and content processes. if ( aOurTab.linkedBrowser.isRemoteBrowser != From d3a601bd7761d5907c7ce17d8000853c4027b823 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Fri, 17 Apr 2026 13:32:38 +0200 Subject: [PATCH 03/31] gh-13296: Fixed toolbars having white text on white bg (gh-13297) --- .../shared/design-system/src/toolbar-css.patch | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/toolkit/themes/shared/design-system/src/toolbar-css.patch diff --git a/src/toolkit/themes/shared/design-system/src/toolbar-css.patch b/src/toolkit/themes/shared/design-system/src/toolbar-css.patch new file mode 100644 index 000000000..6a3c8765b --- /dev/null +++ b/src/toolkit/themes/shared/design-system/src/toolbar-css.patch @@ -0,0 +1,12 @@ +diff --git a/toolkit/themes/shared/design-system/src/toolbar.css b/toolkit/themes/shared/design-system/src/toolbar.css +index 61667b3f778a66b74aa7b169cd646a8437a5dd42..d1a9e5ad121a44f182e7061a21f4bbe9540cae8c 100644 +--- a/toolkit/themes/shared/design-system/src/toolbar.css ++++ b/toolkit/themes/shared/design-system/src/toolbar.css +@@ -61,7 +61,6 @@ + --toolbar-field-color: inherit; + + @media (prefers-color-scheme: light) { +- --toolbar-bgcolor: var(--color-white); + } + } + From a164e226dc53fba52f50e544ebf574e49300446f Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Fri, 17 Apr 2026 14:33:32 +0200 Subject: [PATCH 04/31] gh-10649: Avoid making unnecessary sidebar duplications (gh-13299) --- src/zen/sessionstore/ZenSessionManager.sys.mjs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/zen/sessionstore/ZenSessionManager.sys.mjs b/src/zen/sessionstore/ZenSessionManager.sys.mjs index 6ff9860c7..791d24c68 100644 --- a/src/zen/sessionstore/ZenSessionManager.sys.mjs +++ b/src/zen/sessionstore/ZenSessionManager.sys.mjs @@ -712,10 +712,7 @@ export class nsZenSessionManager { // We only want to collect the sidebar data once from // a single window, as all windows share the same // sidebar data. - let sidebarData = this.#sidebar; - if (!sidebarData) { - sidebarData = {}; - } + let sidebarData = {}; sidebarData.lastCollected = Date.now(); this.#collectTabsData(sidebarData, aStateWindows); From 2700722a1e6741f26ea7de14058953fe7a00821c Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sat, 18 Apr 2026 16:25:58 +0200 Subject: [PATCH 05/31] gh-9836: Register correct signing issuers for windows (gh-13304) --- .github/workflows/linux-release-build.yml | 2 ++ .github/workflows/macos-release-build.yml | 4 +++- .github/workflows/windows-profile-build.yml | 2 ++ .github/workflows/windows-release-build.yml | 2 ++ build/windows/sign.ps1 | 4 ++++ package-lock.json | 8 +++---- package.json | 2 +- .../sessionstore/SessionStore-sys-mjs.patch | 10 +++++++- src/zen/sessionstore/ZenWindowSync.sys.mjs | 24 +++++++++++++++---- src/zen/tabs/ZenPinnedTabManager.mjs | 2 +- 10 files changed, 47 insertions(+), 13 deletions(-) diff --git a/.github/workflows/linux-release-build.yml b/.github/workflows/linux-release-build.yml index 2fba0e880..06250bec2 100644 --- a/.github/workflows/linux-release-build.yml +++ b/.github/workflows/linux-release-build.yml @@ -104,6 +104,8 @@ jobs: - name: Import env: SURFER_COMPAT: ${{ matrix.arch }} + SURFER_CERT_PATCH_ISSUER: ${{ secrets.SURFER_CERT_PATCH_ISSUER }} + SURFER_CERT_PATCH_NAME: ${{ secrets.SURFER_CERT_PATCH_NAME }} run: | . "$HOME/.cargo/env" npm run import diff --git a/.github/workflows/macos-release-build.yml b/.github/workflows/macos-release-build.yml index ccfeacf39..cd256497c 100644 --- a/.github/workflows/macos-release-build.yml +++ b/.github/workflows/macos-release-build.yml @@ -118,7 +118,9 @@ jobs: - name: Import env: SURFER_COMPAT: ${{ matrix.arch }} - run: npm run import -- --verbose + SURFER_CERT_PATCH_ISSUER: ${{ secrets.SURFER_CERT_PATCH_ISSUER }} + SURFER_CERT_PATCH_NAME: ${{ secrets.SURFER_CERT_PATCH_NAME }} + run: npm run import - name: Bootstrap run: | diff --git a/.github/workflows/windows-profile-build.yml b/.github/workflows/windows-profile-build.yml index 740c5fd3f..84f2a01bc 100644 --- a/.github/workflows/windows-profile-build.yml +++ b/.github/workflows/windows-profile-build.yml @@ -80,6 +80,8 @@ jobs: if: ${{ matrix.arch == 'x86_64' }} env: SURFER_NO_BRANDING_PATCH: true + SURFER_CERT_PATCH_ISSUER: ${{ secrets.SURFER_CERT_PATCH_ISSUER }} + SURFER_CERT_PATCH_NAME: ${{ secrets.SURFER_CERT_PATCH_NAME }} run: npm run import - name: Generate diff --git a/.github/workflows/windows-release-build.yml b/.github/workflows/windows-release-build.yml index 10c1da6d3..2207d35aa 100644 --- a/.github/workflows/windows-release-build.yml +++ b/.github/workflows/windows-release-build.yml @@ -165,6 +165,8 @@ jobs: if: ${{ !(inputs.generate-gpo && matrix.arch == 'aarch64') }} env: SURFER_COMPAT: ${{ matrix.arch }} + SURFER_CERT_PATCH_ISSUER: ${{ secrets.SURFER_CERT_PATCH_ISSUER }} + SURFER_CERT_PATCH_NAME: ${{ secrets.SURFER_CERT_PATCH_NAME }} run: | . "$HOME/.cargo/env" npm run import -- --verbose diff --git a/build/windows/sign.ps1 b/build/windows/sign.ps1 index 2c935d776..b9301141c 100644 --- a/build/windows/sign.ps1 +++ b/build/windows/sign.ps1 @@ -4,6 +4,7 @@ param( [string][Parameter(Mandatory=$true)]$SignIdentity, + [string][Parameter(Mandatory=$true)]$SignIdentityIssuer, [string][Parameter(Mandatory=$true)]$GithubRunId ) @@ -26,6 +27,9 @@ mkdir windsign-temp -ErrorAction SilentlyContinue $env:SURFER_MOZCONFIG_ONLY="1" $env:SURFER_SIGNING_MODE="" +$env:SURFER_CERT_PATCH_ISSUER=$SignIdentityIssuer +$env:SURFER_CERT_PATCH_NAME=$SignIdentity + Start-Job -Name "DownloadGitl10n" -ScriptBlock { param($PWD) cd $PWD diff --git a/package-lock.json b/package-lock.json index b794c5098..e92095f25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "devDependencies": { "@babel/preset-typescript": "^7.27.0", "@zen-browser/prettier": "^3.9.3", - "@zen-browser/surfer": "^1.13.4", + "@zen-browser/surfer": "^1.14.3", "formal-git": "^1.2.9", "globals": "^16.3.0", "husky": "^9.1.7", @@ -868,9 +868,9 @@ } }, "node_modules/@zen-browser/surfer": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.13.4.tgz", - "integrity": "sha512-rpwceHYN3k1kaZP+IhAiZ5ksLgedqGv8uo8kqACFR4dDX/DO5P7XoCQtooOPrEyrxcI7uu/gI/xtuldfOBKUkQ==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.14.3.tgz", + "integrity": "sha512-AjJx7jedNSSP5WRWsG3W5fUxYSaWlY3nir/MZ2RFS+C0/rs6Uj+qpOVlMu6ZrQf9cr9r13e33nP5GGhSWbGOSA==", "dev": true, "license": "MPL-2.0", "dependencies": { diff --git a/package.json b/package.json index f5dff7d7a..cff1d55eb 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "devDependencies": { "@babel/preset-typescript": "^7.27.0", "@zen-browser/prettier": "^3.9.3", - "@zen-browser/surfer": "^1.13.4", + "@zen-browser/surfer": "^1.14.3", "formal-git": "^1.2.9", "globals": "^16.3.0", "husky": "^9.1.7", diff --git a/src/browser/components/sessionstore/SessionStore-sys-mjs.patch b/src/browser/components/sessionstore/SessionStore-sys-mjs.patch index 7d341f99a..27134f020 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 71921cec2b6aa0f103856c31254fd6c4affefccb..fbb44402e3201a00eb37765d60829828d40e70ea 100644 +index 71921cec2b6aa0f103856c31254fd6c4affefccb..d39f2bd587e9aa320d69f94a2bd30be909c3e608 100644 --- a/browser/components/sessionstore/SessionStore.sys.mjs +++ b/browser/components/sessionstore/SessionStore.sys.mjs @@ -129,6 +129,9 @@ const TAB_EVENTS = [ @@ -350,3 +350,11 @@ index 71921cec2b6aa0f103856c31254fd6c4affefccb..fbb44402e3201a00eb37765d60829828 // Convert any open groups into saved groups. let groupStateToSave = window.groups.find( groupState => groupState.id == window.tabs[tIndex].groupId +@@ -8076,7 +8139,6 @@ var SessionStoreInternal = { + timer.initWithCallback( + function () { + if (beats <= 0) { +- this._log.debug(`looseTimer of ${delay} timed out`); + Glean.sessionRestore.shutdownFlushAllOutcomes.timed_out.add(1); + deferred.resolve(); + } diff --git a/src/zen/sessionstore/ZenWindowSync.sys.mjs b/src/zen/sessionstore/ZenWindowSync.sys.mjs index 8612601c4..b18f3dadc 100644 --- a/src/zen/sessionstore/ZenWindowSync.sys.mjs +++ b/src/zen/sessionstore/ZenWindowSync.sys.mjs @@ -731,7 +731,14 @@ class nsZenWindowSync { return; } await this.#styleSwapedBrowsers(aOurTab, aOtherTab, () => { - this.#swapBrowserDocShellsInner(aOurTab, aOtherTab); + try { + this.#swapBrowserDocShellsInner(aOurTab, aOtherTab); + } catch (e) { + console.error( + `Error swapping browsers for tabs ${aOurTab.id} and ${aOtherTab.id}:`, + e + ); + } }); } @@ -1066,10 +1073,17 @@ class nsZenWindowSync { continue; } delete tab._zenContentsVisible; - this.#swapBrowserDocShellsInner(targetTab, tab, { - focus: targetTab.selected, - onClose: true, - }); + try { + this.#swapBrowserDocShellsInner(targetTab, tab, { + focus: targetTab.selected, + onClose: true, + }); + } catch (e) { + console.error( + `Error swapping browsers for tabs ${tab.id} and ${targetTab.id} during close:`, + e + ); + } this.#swapedTabsEntriesForWC.set( tab.linkedBrowser.permanentKey, targetTab diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs index 2c048c8cc..71009f921 100644 --- a/src/zen/tabs/ZenPinnedTabManager.mjs +++ b/src/zen/tabs/ZenPinnedTabManager.mjs @@ -857,7 +857,7 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature { const pinUrl = tab._zenPinnedInitialState.entry.url.split("#")[0]; const currentUrl = location.split("#")[0]; // Add an indicator that the pin has been changed - if (pinUrl === currentUrl) { + if (Services.io.newURI(currentUrl).spec === Services.io.newURI(pinUrl).spec) { this.resetPinChangedUrl(tab); return; } From 3d14e98c766152de4c224a2f8164f561c035ffb3 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sun, 19 Apr 2026 00:38:23 +0200 Subject: [PATCH 06/31] no-bug: Add alt+click for splitting tabs and other polishing details (gh-13308) --- locales/en-US/browser/browser/zen-general.ftl | 1 + .../en-US/browser/browser/zen-split-view.ftl | 2 +- prefs/zen/glance.yaml | 2 +- .../tabbrowser/content/tab-js.patch | 23 +++-- .../tabbrowser/content/tabbrowser-js.patch | 83 +++++++++-------- .../themes/shared/tabbrowser/tabs-css.patch | 26 ++++-- src/zen/common/modules/ZenUIManager.mjs | 17 ++-- src/zen/common/styles/zen-animations.css | 11 +-- .../common/styles/zen-single-components.css | 5 +- src/zen/common/sys/ui/ZenProgressBar.sys.mjs | 2 +- src/zen/drag-and-drop/ZenDragAndDrop.js | 93 +++++++++++++------ src/zen/folders/ZenFolders.mjs | 12 ++- src/zen/glance/ZenGlanceManager.mjs | 60 ++++++------ src/zen/glance/zen-glance.css | 4 + src/zen/spaces/ZenSpaceManager.mjs | 15 +-- src/zen/split-view/ZenViewSplitter.mjs | 86 ++++++++++------- src/zen/tabs/ZenPinnedTabManager.mjs | 4 +- src/zen/tabs/zen-tabs/vertical-tabs.css | 4 +- src/zen/tests/spaces/browser_issue_10455.js | 8 -- src/zen/tests/spaces/browser_private_mode.js | 4 - 20 files changed, 263 insertions(+), 199 deletions(-) diff --git a/locales/en-US/browser/browser/zen-general.ftl b/locales/en-US/browser/browser/zen-general.ftl index f88f215fd..d1229b04f 100644 --- a/locales/en-US/browser/browser/zen-general.ftl +++ b/locales/en-US/browser/browser/zen-general.ftl @@ -58,6 +58,7 @@ 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-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Compact Mode diff --git a/locales/en-US/browser/browser/zen-split-view.ftl b/locales/en-US/browser/browser/zen-split-view.ftl index 8e9aaaed5..ee1e7081f 100644 --- a/locales/en-US/browser/browser/zen-split-view.ftl +++ b/locales/en-US/browser/browser/zen-split-view.ftl @@ -6,7 +6,7 @@ tab-zen-split-tabs = .label = { $tabCount -> [-1] Split out tab - [1] Join Tab (multiple selected tabs needed) + [1] Add split view... *[other] Join { $tabCount } Tabs } .accesskey = S diff --git a/prefs/zen/glance.yaml b/prefs/zen/glance.yaml index 299e616c7..cf73cddb9 100644 --- a/prefs/zen/glance.yaml +++ b/prefs/zen/glance.yaml @@ -18,4 +18,4 @@ value: 300 # in milliseconds - name: zen.glance.deactivate-docshell-during-animation - value: true + value: false diff --git a/src/browser/components/tabbrowser/content/tab-js.patch b/src/browser/components/tabbrowser/content/tab-js.patch index 06007dfe2..8ac45c8e5 100644 --- a/src/browser/components/tabbrowser/content/tab-js.patch +++ b/src/browser/components/tabbrowser/content/tab-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js -index 2e02bad1a7c89b4c3b5aee1e14c13bb953a64eb6..439766a40df5632ad790ab54a0c6af78a831e8ee 100644 +index 2e02bad1a7c89b4c3b5aee1e14c13bb953a64eb6..3ac8d2facb224ae39d2199f2c5ec08b77e0c1dfd 100644 --- a/browser/components/tabbrowser/content/tab.js +++ b/browser/components/tabbrowser/content/tab.js @@ -21,6 +21,7 @@ @@ -151,7 +151,18 @@ index 2e02bad1a7c89b4c3b5aee1e14c13bb953a64eb6..439766a40df5632ad790ab54a0c6af78 on_click(event) { if (event.button != 0) { return; -@@ -620,11 +659,12 @@ +@@ -617,14 +656,23 @@ + trigger: "alt_click", + }); + } ++ if ( ++ !event.target.classList.contains("tab-close-button") && ++ !event.target.classList.contains("tab-icon-overlay") && ++ !event.target.classList.contains("tab-audio-button") && ++ !this.splitView ++ ) { ++ gZenViewSplitter.contextSplitTabs(this); ++ } return; } @@ -165,7 +176,7 @@ index 2e02bad1a7c89b4c3b5aee1e14c13bb953a64eb6..439766a40df5632ad790ab54a0c6af78 gBrowser.multiSelectedTabsCount > 0 && !event.target.classList.contains("tab-close-button") && !event.target.classList.contains("tab-icon-overlay") && -@@ -636,8 +676,9 @@ +@@ -636,8 +684,9 @@ } if ( @@ -177,7 +188,7 @@ index 2e02bad1a7c89b4c3b5aee1e14c13bb953a64eb6..439766a40df5632ad790ab54a0c6af78 ) { if (this.activeMediaBlocked) { if (this.multiselected) { -@@ -655,7 +696,7 @@ +@@ -655,7 +704,7 @@ return; } @@ -186,7 +197,7 @@ index 2e02bad1a7c89b4c3b5aee1e14c13bb953a64eb6..439766a40df5632ad790ab54a0c6af78 if (this.multiselected) { gBrowser.removeMultiSelectedTabs( lazy.TabMetrics.userTriggeredContext( -@@ -675,6 +716,14 @@ +@@ -675,6 +724,14 @@ // (see tabbrowser-tabs 'click' handler). gBrowser.tabContainer._blockDblClick = true; } @@ -201,7 +212,7 @@ index 2e02bad1a7c89b4c3b5aee1e14c13bb953a64eb6..439766a40df5632ad790ab54a0c6af78 } on_dblclick(event) { -@@ -698,6 +747,8 @@ +@@ -698,6 +755,8 @@ animate: true, triggeringEvent: event, }); diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch index 1e24da5bd..5becce548 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 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25b964ccbb 100644 +index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35e66ff55a 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js @@ -413,6 +413,7 @@ @@ -587,7 +587,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 } catch (e) { console.error(e); } -@@ -5603,6 +5757,13 @@ +@@ -5603,6 +5757,14 @@ return; } @@ -597,11 +597,12 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 + this.selectedTab = newTab; + } + } ++ animate &&= !aTab.splitView; + let isVisibleTab = aTab.visible; // We have to sample the tab width now, since _beginRemoveTab might // end up modifying the DOM in such a way that aTab gets a new -@@ -5610,6 +5771,9 @@ +@@ -5610,6 +5772,9 @@ // state). let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width; let isLastTab = this.#isLastTabInWindow(aTab); @@ -611,7 +612,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 if ( !this._beginRemoveTab(aTab, { closeWindowFastpath: true, -@@ -5621,13 +5785,14 @@ +@@ -5621,13 +5786,14 @@ telemetrySource, }) ) { @@ -627,7 +628,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 let lockTabSizing = !this.tabContainer.verticalMode && !aTab.pinned && -@@ -5658,7 +5823,13 @@ +@@ -5658,7 +5824,13 @@ // We're not animating, so we can cancel the animation stopwatch. Glean.browserTabclose.timeAnim.cancel(aTab._closeTimeAnimTimerId); aTab._closeTimeAnimTimerId = null; @@ -642,7 +643,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 return; } -@@ -5792,7 +5963,7 @@ +@@ -5792,7 +5964,7 @@ closeWindowWithLastTab != null ? closeWindowWithLastTab : !window.toolbar.visible || @@ -651,7 +652,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 if (closeWindow) { // We've already called beforeunload on all the relevant tabs if we get here, -@@ -5816,6 +5987,7 @@ +@@ -5816,6 +5988,7 @@ newTab = true; } @@ -659,7 +660,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 aTab._endRemoveArgs = [closeWindow, newTab]; // swapBrowsersAndCloseOther will take care of closing the window without animation. -@@ -5856,13 +6028,7 @@ +@@ -5856,13 +6029,7 @@ aTab._mouseleave(); if (newTab) { @@ -674,7 +675,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 } else { TabBarVisibility.update(); } -@@ -5995,6 +6161,7 @@ +@@ -5995,6 +6162,7 @@ this.tabs[i]._tPos = i; } @@ -682,7 +683,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 if (!this._windowIsClosing) { // update tab close buttons state this.tabContainer._updateCloseButtons(); -@@ -6225,6 +6392,7 @@ +@@ -6225,6 +6393,7 @@ } let excludeTabs = new Set(aExcludeTabs); @@ -690,7 +691,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 // If this tab has a successor, it should be selectable, since // hiding or closing a tab removes that tab as a successor. -@@ -6237,15 +6405,22 @@ +@@ -6237,15 +6406,22 @@ !excludeTabs.has(aTab.owner) && Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose") ) { @@ -715,7 +716,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 let tab = this.tabContainer.findNextTab(aTab, { direction: 1, filter: _tab => remainingTabs.includes(_tab), -@@ -6259,7 +6434,7 @@ +@@ -6259,7 +6435,7 @@ } if (tab) { @@ -724,7 +725,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 } // If no qualifying visible tab was found, see if there is a tab in -@@ -6280,7 +6455,7 @@ +@@ -6280,7 +6456,7 @@ }); } @@ -733,7 +734,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 } _blurTab(aTab) { -@@ -6291,7 +6466,7 @@ +@@ -6291,7 +6467,7 @@ * @returns {boolean} * False if swapping isn't permitted, true otherwise. */ @@ -742,7 +743,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 // Do not allow transfering a private tab to a non-private window // and vice versa. if ( -@@ -6345,6 +6520,7 @@ +@@ -6345,6 +6521,7 @@ // fire the beforeunload event in the process. Close the other // window if this was its last tab. if ( @@ -750,7 +751,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 !remoteBrowser._beginRemoveTab(aOtherTab, { adoptedByTab: aOurTab, closeWindowWithLastTab: true, -@@ -6356,7 +6532,7 @@ +@@ -6356,7 +6533,7 @@ // If this is the last tab of the window, hide the window // immediately without animation before the docshell swap, to avoid // about:blank being painted. @@ -759,7 +760,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 if (closeWindow) { let win = aOtherTab.ownerGlobal; win.windowUtils.suppressAnimation(true); -@@ -6484,11 +6660,13 @@ +@@ -6484,11 +6661,13 @@ } // Finish tearing down the tab that's going away. @@ -773,7 +774,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 this.setTabTitle(aOurTab); -@@ -6690,10 +6868,10 @@ +@@ -6690,10 +6869,10 @@ SessionStore.deleteCustomTabValue(aTab, "hiddenBy"); } @@ -786,7 +787,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 aTab.selected || aTab.closing || // Tabs that are sharing the screen, microphone or camera cannot be hidden. -@@ -6753,7 +6931,8 @@ +@@ -6753,7 +6932,8 @@ * @param {object} [aOptions={}] * Key-value pairs that will be serialized into the features string. */ @@ -796,7 +797,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 if (this.tabs.length == 1) { return null; } -@@ -6770,7 +6949,7 @@ +@@ -6770,7 +6950,7 @@ // tell a new window to take the "dropped" tab let args = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray); args.appendElement(aTab.splitview ?? aTab); @@ -805,7 +806,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 private: PrivateBrowsingUtils.isWindowPrivate(window), features: Object.entries(aOptions) .map(([key, value]) => `${key}=${value}`) -@@ -6778,6 +6957,8 @@ +@@ -6778,6 +6958,8 @@ openerWindow: window, args, }); @@ -814,7 +815,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 } /** -@@ -6890,7 +7071,7 @@ +@@ -6890,7 +7072,7 @@ * `true` if element is a `` */ isTabGroup(element) { @@ -823,7 +824,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 } /** -@@ -6975,8 +7156,8 @@ +@@ -6975,8 +7157,8 @@ } // Don't allow mixing pinned and unpinned tabs. @@ -834,7 +835,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 } else { tabIndex = Math.max(tabIndex, this.pinnedTabCount); } -@@ -7005,13 +7186,19 @@ +@@ -7005,13 +7187,19 @@ this.#handleTabMove( element, () => { @@ -856,7 +857,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 let useAfter = false; if (this.isTab(element)) { useAfter = neighbor && tabIndex > element._tPos; -@@ -7076,23 +7263,31 @@ +@@ -7076,23 +7264,31 @@ #moveTabNextTo(element, targetElement, moveBefore = false, metricsContext) { if (this.isTabGroupLabel(targetElement)) { targetElement = targetElement.group; @@ -894,7 +895,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 } 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 -@@ -7105,12 +7300,35 @@ +@@ -7105,12 +7301,35 @@ // 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. @@ -931,7 +932,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 // We want to include the splitview wrapper if it's the targetElement, but // not in the case where we want to reverse tabs within the same splitview. -@@ -7119,6 +7337,7 @@ +@@ -7119,6 +7338,7 @@ } let getContainer = () => @@ -939,7 +940,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 element.pinned ? this.tabContainer.pinnedTabsContainer : this.tabContainer; -@@ -7127,11 +7346,15 @@ +@@ -7127,11 +7347,15 @@ element, () => { if (moveBefore) { @@ -956,7 +957,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 } }, metricsContext -@@ -7205,10 +7428,10 @@ +@@ -7205,10 +7429,10 @@ * @param {TabMetricsContext} [metricsContext] */ moveTabToExistingGroup(aTab, aGroup, metricsContext) { @@ -969,7 +970,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 return; } if (aTab.group && aTab.group.id === aGroup.id) { -@@ -7281,6 +7504,7 @@ +@@ -7281,6 +7505,7 @@ let state = { tabIndex: tab._tPos, @@ -977,7 +978,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 }; if (tab.visible) { state.elementIndex = tab.elementIndex; -@@ -7312,7 +7536,7 @@ +@@ -7312,7 +7537,7 @@ let changedSplitView = previousTabState.splitViewId != currentTabState.splitViewId; @@ -986,7 +987,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 tab.dispatchEvent( new CustomEvent("TabMove", { bubbles: true, -@@ -7354,6 +7578,10 @@ +@@ -7354,6 +7579,10 @@ moveActionCallback(); @@ -997,7 +998,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 // Clear tabs cache after moving nodes because the order of tabs may have // changed. this.tabContainer._invalidateCachedTabs(); -@@ -7404,7 +7632,22 @@ +@@ -7404,7 +7633,22 @@ * @returns {object} * The new tab in the current window, null if the tab couldn't be adopted. */ @@ -1021,7 +1022,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 // Swap the dropped tab with a new one we create and then close // it in the other window (making it seem to have moved between // windows). We also ensure that the tab we create to swap into has -@@ -7447,6 +7690,8 @@ +@@ -7447,6 +7691,8 @@ } params.skipLoad = true; let newTab = this.addWebTab("about:blank", params); @@ -1030,7 +1031,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 aTab.container.tabDragAndDrop.finishAnimateTabMove(); -@@ -8149,7 +8394,7 @@ +@@ -8149,7 +8395,7 @@ // preventDefault(). It will still raise the window if appropriate. return; } @@ -1039,7 +1040,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 window.focus(); aEvent.preventDefault(); } -@@ -8166,7 +8411,6 @@ +@@ -8166,7 +8412,6 @@ on_TabGroupCollapse(aEvent) { aEvent.target.tabs.forEach(tab => { @@ -1047,7 +1048,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 }); } -@@ -8500,7 +8744,9 @@ +@@ -8500,7 +8745,9 @@ let filter = this._tabFilters.get(tab); if (filter) { @@ -1057,7 +1058,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 let listener = this._tabListeners.get(tab); if (listener) { -@@ -9306,6 +9552,7 @@ +@@ -9306,6 +9553,7 @@ aWebProgress.isTopLevel ) { this.mTab.setAttribute("busy", "true"); @@ -1065,7 +1066,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 gBrowser._tabAttrModified(this.mTab, ["busy"]); this.mTab._notselectedsinceload = !this.mTab.selected; } -@@ -9386,6 +9633,7 @@ +@@ -9386,6 +9634,7 @@ // known defaults. Note we use the original URL since about:newtab // redirects to a prerendered page. const shouldRemoveFavicon = @@ -1073,7 +1074,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 !this.mBrowser.mIconURL && !ignoreBlank && !(originalLocation.spec in FAVICON_DEFAULTS); -@@ -9560,13 +9808,6 @@ +@@ -9560,13 +9809,6 @@ this.mBrowser.originalURI = aRequest.originalURI; } @@ -1087,7 +1088,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..642b74cdf0edc63e5cf4ca8c69481e25 } let userContextId = this.mBrowser.getAttribute("usercontextid") || 0; -@@ -10450,7 +10691,7 @@ var TabContextMenu = { +@@ -10450,7 +10692,7 @@ var TabContextMenu = { ); contextUnpinSelectedTabs.hidden = !this.contextTab.pinned || !this.multiselected; diff --git a/src/browser/themes/shared/tabbrowser/tabs-css.patch b/src/browser/themes/shared/tabbrowser/tabs-css.patch index b75e177ea..c639f757b 100644 --- a/src/browser/themes/shared/tabbrowser/tabs-css.patch +++ b/src/browser/themes/shared/tabbrowser/tabs-css.patch @@ -1,5 +1,5 @@ diff --git a/browser/themes/shared/tabbrowser/tabs.css b/browser/themes/shared/tabbrowser/tabs.css -index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d3409383217e2ca 100644 +index 203b546933842f4b0134188fda020c4db4dcd0d2..0d67deabac2984574636248a16e58d1669f2e1a4 100644 --- a/browser/themes/shared/tabbrowser/tabs.css +++ b/browser/themes/shared/tabbrowser/tabs.css @@ -24,7 +24,7 @@ @@ -97,7 +97,15 @@ index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d340938 &:is([soundplaying], [muted], [activemedia-blocked]) { display: flex; } -@@ -1614,7 +1606,7 @@ tab-group { +@@ -1048,7 +1040,6 @@ tab-split-view-wrapper[dragtarget] { + .tabbrowser-tab:is([image], [pinned]) > .tab-stack > .tab-content[attention]:not([selected]), + .tabbrowser-tab > .tab-stack > .tab-content[pinned][titlechanged]:not([selected]), + #tabbrowser-tabs[orient="vertical"] .tabbrowser-tab > .tab-stack > .tab-content[titlechanged]:not([selected]) { +- background-image: radial-gradient(circle, var(--tab-attention-dot-color), var(--tab-attention-dot-color) 2px, transparent 2px); + background-position: center bottom 6.5px; + background-size: 4px 4px; + background-repeat: no-repeat; +@@ -1614,7 +1605,7 @@ tab-group { } #tabbrowser-tabs[orient="vertical"][expanded] { @@ -106,7 +114,7 @@ index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d340938 &[movingtab][movingtab-addToGroup]:not([movingtab-group], [movingtab-ungroup]) tab-group > .tabbrowser-tab:is(:active, [multiselected]) { margin-inline-start: var(--space-medium); } -@@ -2089,7 +2081,7 @@ tab-group { +@@ -2089,7 +2080,7 @@ tab-group { } } @@ -115,7 +123,7 @@ index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d340938 #vertical-tabs-newtab-button { appearance: none; min-height: var(--tab-min-height); -@@ -2100,7 +2092,7 @@ tab-group { +@@ -2100,7 +2091,7 @@ tab-group { margin-inline: var(--tab-inner-inline-margin); #tabbrowser-tabs[orient="vertical"]:not([expanded]) & > .toolbarbutton-text { @@ -124,7 +132,7 @@ index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d340938 } &:hover { -@@ -2124,7 +2116,7 @@ tab-group { +@@ -2124,7 +2115,7 @@ tab-group { * flex container. #tabs-newtab-button is a child of the arrowscrollbox where * we don't want a gap (between tabs), so we have to add some margin. */ @@ -133,7 +141,7 @@ index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d340938 margin-block: var(--tab-block-margin); } -@@ -2312,7 +2304,6 @@ tab-group { +@@ -2312,7 +2303,6 @@ tab-group { &:not([expanded]) { .tabbrowser-tab[pinned] { @@ -141,7 +149,7 @@ index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d340938 } .tab-background { -@@ -2352,8 +2343,8 @@ tab-group { +@@ -2352,8 +2342,8 @@ tab-group { display: block; position: absolute; inset: auto; @@ -152,7 +160,7 @@ index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d340938 &:-moz-window-inactive { background-image: -@@ -2438,9 +2429,6 @@ tab-group { +@@ -2438,9 +2428,6 @@ tab-group { :root:not([privatebrowsingmode]) :is(toolbarbutton, toolbarpaletteitem) ~ #tabbrowser-tabs, :root[privatebrowsingmode] :is(toolbarbutton:not(#firefox-view-button), toolbarpaletteitem:not(#wrapper-firefox-view-button)) ~ #tabbrowser-tabs { @@ -162,7 +170,7 @@ index 203b546933842f4b0134188fda020c4db4dcd0d2..011bcfb023d0cabd55dfa7e49d340938 } :root[privatebrowsingmode] :is(#firefox-view-button, #menu_openFirefoxView) { -@@ -2472,7 +2460,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button { +@@ -2472,7 +2459,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button { list-style-image: url(chrome://global/skin/icons/plus.svg); } diff --git a/src/zen/common/modules/ZenUIManager.mjs b/src/zen/common/modules/ZenUIManager.mjs index ff0af0495..fa9fe5591 100644 --- a/src/zen/common/modules/ZenUIManager.mjs +++ b/src/zen/common/modules/ZenUIManager.mjs @@ -101,10 +101,12 @@ window.gZenUIManager = { ) { const yValues = rawKeyframes.y || []; const xValues = rawKeyframes.x || []; - const scaleValues = rawKeyframes.scale || []; + const scaleYValues = rawKeyframes.scaleY || []; + const scaleXValues = rawKeyframes.scaleX || []; delete rawKeyframes.y; delete rawKeyframes.x; - delete rawKeyframes.scale; + delete rawKeyframes.scaleY; + delete rawKeyframes.scaleX; rawKeyframes.transform = []; if ( yValues.length !== 0 && @@ -116,14 +118,17 @@ window.gZenUIManager = { const keyframeLength = Math.max( yValues.length, xValues.length, - scaleValues.length + scaleYValues.length, + scaleXValues.length ); for (let i = 0; i < keyframeLength; i++) { const y = yValues[i] !== undefined ? `translateY(${yValues[i]}px)` : ""; const x = xValues[i] !== undefined ? `translateX(${xValues[i]}px)` : ""; - const scale = - scaleValues[i] !== undefined ? `scale(${scaleValues[i]})` : ""; - rawKeyframes.transform.push(`${x} ${y} ${scale}`.trim()); + const scaleY = + scaleYValues[i] !== undefined ? `scaleY(${scaleYValues[i]})` : ""; + const scaleX = + scaleXValues[i] !== undefined ? `scaleX(${scaleXValues[i]})` : ""; + rawKeyframes.transform.push(`${x} ${y} ${scaleX} ${scaleY}`.trim()); } } let keyframes = []; diff --git a/src/zen/common/styles/zen-animations.css b/src/zen/common/styles/zen-animations.css index 9b0185ada..8e5aaee3e 100644 --- a/src/zen/common/styles/zen-animations.css +++ b/src/zen/common/styles/zen-animations.css @@ -58,18 +58,15 @@ } @keyframes zen-progress-bar-pulse { - 0% { - transform: scale(0.8) translate(-50%, -50%); + from { + transform: scale(0.85) translate(-50%, -50%); opacity: 0.6; } - 50% { + + to { transform: scale(0.95) translate(-50%, -50%); opacity: 1; } - 100% { - transform: scale(0.8) translate(-50%, -50%); - opacity: 0.6; - } } @keyframes zen-progress-bar-long-load { diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css index 2feb7948b..28373c559 100644 --- a/src/zen/common/styles/zen-single-components.css +++ b/src/zen/common/styles/zen-single-components.css @@ -695,6 +695,7 @@ :root:is([zen-no-padding="true"], [inDOMFullscreen="true"]) & { top: 4px; } + left: 50%; transform: translate(-50%, -50%) scale(0); background: var(--zen-loading-progress-bar-color); @@ -707,8 +708,10 @@ transform .3s ease-in-out; overflow: clip; pointer-events: none; - animation: zen-progress-bar-pulse 1.5s linear infinite forwards; + animation: zen-progress-bar-pulse 1s ease-in-out infinite forwards; + animation-direction: alternate; transform-origin: 0 0; + contain: content; &[long-load="true"] { opacity: 1; diff --git a/src/zen/common/sys/ui/ZenProgressBar.sys.mjs b/src/zen/common/sys/ui/ZenProgressBar.sys.mjs index e8fa8157e..d1add0fc6 100644 --- a/src/zen/common/sys/ui/ZenProgressBar.sys.mjs +++ b/src/zen/common/sys/ui/ZenProgressBar.sys.mjs @@ -50,7 +50,7 @@ export class ZenProgressBar extends ZenUIComponent { this.window.gZenUIManager.elementAnimate( this.#element, { - opacity: [0, 0.6], + opacity: [0, 0.8], }, { duration: 400, diff --git a/src/zen/drag-and-drop/ZenDragAndDrop.js b/src/zen/drag-and-drop/ZenDragAndDrop.js index 0e87be0be..30154a4db 100644 --- a/src/zen/drag-and-drop/ZenDragAndDrop.js +++ b/src/zen/drag-and-drop/ZenDragAndDrop.js @@ -119,6 +119,10 @@ init() { super.init(); this.handle_windowDragEnter = this.handle_windowDragEnter.bind(this); + gZenWorkspaces.workspaceIcons.addEventListener( + "dragover", + this.handle_spaceIconDragOver.bind(this) + ); window.addEventListener( "dragleave", this.handle_windowDragLeave.bind(this), @@ -676,6 +680,31 @@ } } + #onSpaceChanged(spaceChanged, dt) { + if (AppConstants.platform !== "macosx") { + // See the hack in #createDragImageForTabs for more details which + // explains why we need to do this on non-macOS platforms. + return; + } + let tabs = this.originalDragImageArgs[0].children; + const { isDarkMode, isExplicitMode } = + gZenThemePicker.getGradientForWorkspace(spaceChanged, { + getGradient: false, + }); + for (let tab of tabs) { + if (isExplicitMode) { + tab.style.colorScheme = isDarkMode ? "dark" : "light"; + } else { + tab.style.colorScheme = ""; + } + } + requestAnimationFrame(() => { + requestAnimationFrame(() => { + dt.updateDragImage(...this.originalDragImageArgs); + }); + }); + } + #handle_sidebarDragOver(event) { const dt = event.dataTransfer; const draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0); @@ -696,28 +725,7 @@ /* Disable wrapping */ true ) .then(spaceChanged => { - if (AppConstants.platform !== "macosx") { - // See the hack in #createDragImageForTabs for more details which - // explains why we need to do this on non-macOS platforms. - return; - } - let tabs = this.originalDragImageArgs[0].children; - const { isDarkMode, isExplicitMode } = - gZenThemePicker.getGradientForWorkspace(spaceChanged, { - getGradient: false, - }); - for (let tab of tabs) { - if (isExplicitMode) { - tab.style.colorScheme = isDarkMode ? "dark" : "light"; - } else { - tab.style.colorScheme = ""; - } - } - requestAnimationFrame(() => { - requestAnimationFrame(() => { - dt.updateDragImage(...this.originalDragImageArgs); - }); - }); + this.#onSpaceChanged(spaceChanged, dt); }); this.#changeSpaceTimer = null; }, this._dndSwitchSpaceDelay); @@ -727,6 +735,27 @@ } } + handle_spaceIconDragOver(event) { + const dt = event.dataTransfer; + const draggedTab = dt.mozGetDataAt(TAB_DROP_TYPE, 0); + if (draggedTab.hasAttribute("zen-essential")) { + return; + } + const target = event.target; + const spaceId = target.getAttribute("zen-workspace-id"); + if (!spaceId) { + return; + } + this.clearDragOverVisuals(); + const currentSpaceId = gZenWorkspaces.activeWorkspace; + if (spaceId === currentSpaceId || gZenWorkspaces._animatingChange) { + return; + } + gZenWorkspaces.changeWorkspaceWithID(spaceId).then(spaceChanged => { + this.#onSpaceChanged(spaceChanged, dt); + }); + } + #handle_tabDragOverToSplit(event) { if (!this._dndSplitEnabled) { return; @@ -1238,18 +1267,24 @@ ) { let lastTab = gBrowser.tabs.at(-1); let pinnedTabsCount = gBrowser._numVisiblePinTabsWithoutCollapsed; + let isHoveringSeparator = + event.target.parentElement.classList.contains( + "zen-workspace-pinned-tabs-section" + ); // Only if there are no normal tabs to drop after showIndicatorUnderNewTabButton = lastTab.hasAttribute("zen-empty-tab"); - let useLastPinnd = - (hoveringPeriphery || - (showIndicatorUnderNewTabButton && - !(pinnedTabsCount - gBrowser._numZenEssentials))) && - Services.prefs.getBoolPref("zen.view.show-newtab-button-top"); + let useLastPinned = + (showIndicatorUnderNewTabButton && + !(pinnedTabsCount - gBrowser._numZenEssentials) && + Services.prefs.getBoolPref("zen.view.show-newtab-button-top")) || + isHoveringSeparator; dropElement = - (useLastPinnd - ? this._tabbrowserTabs.ariaFocusableItems.at(pinnedTabsCount) + (useLastPinned + ? this._tabbrowserTabs.ariaFocusableItems.at( + pinnedTabsCount ? pinnedTabsCount - 1 : 0 + ) : this._tabbrowserTabs.ariaFocusableItems.at(-1)) || lastTab; } } diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs index d5a579c4a..08a60a24c 100644 --- a/src/zen/folders/ZenFolders.mjs +++ b/src/zen/folders/ZenFolders.mjs @@ -744,8 +744,14 @@ class nsZenFolders extends nsZenDOMOperatedFeature { const onKeyDown = event => { // Arrow down and up to navigate through the list - if (event.key === "ArrowDown" || event.key === "ArrowUp") { + if ( + event.key === "ArrowDown" || + event.key === "ArrowUp" || + event.key === "Tab" + ) { event.preventDefault(); + let isUp = + event.key === "ArrowUp" || (event.key === "Tab" && event.shiftKey); const items = Array.from(tabsList.children).filter( item => !item.hidden ); @@ -755,9 +761,9 @@ class nsZenFolders extends nsZenDOMOperatedFeature { let index = items.indexOf( tabsList.querySelector(".folders-tabs-list-item[selected]") ); - if (event.key === "ArrowDown") { + if (!isUp) { index = (index + 1) % items.length; - } else if (event.key === "ArrowUp") { + } else { index = (index - 1 + items.length) % items.length; } items.forEach(item => item.removeAttribute("selected")); diff --git a/src/zen/glance/ZenGlanceManager.mjs b/src/zen/glance/ZenGlanceManager.mjs index cd6c8d5d2..9c738cd01 100644 --- a/src/zen/glance/ZenGlanceManager.mjs +++ b/src/zen/glance/ZenGlanceManager.mjs @@ -39,8 +39,9 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { ARC_HEIGHT_RATIO: 0.2, // Arc height = distance * ratio (capped at MAX_ARC_HEIGHT) }); - #GLANCE_ANIMATION_DURATION = - Services.prefs.getIntPref("zen.glance.animation-duration") / 1000; + #GLANCE_ANIMATION_DURATION = Services.prefs.getIntPref( + "zen.glance.animation-duration" + ); init() { this.#setupEventListeners(); @@ -294,7 +295,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { { duration: 0.2, type: "spring", - delay: this.#GLANCE_ANIMATION_DURATION - 0.2, + delay: this.#GLANCE_ANIMATION_DURATION / 1000 - 0.2, bounce: 0, } ); @@ -450,7 +451,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { opacity: [1, 0.3], }, { - duration: this.#GLANCE_ANIMATION_DURATION, + duration: this.#GLANCE_ANIMATION_DURATION / 1000, type: "spring", bounce: 0.2, } @@ -536,13 +537,13 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { // nice fade-in effect to the content. But if it doesn't exist, // we just fall back to always showing the browser directly. if (data.elementData) { - gZenUIManager.motion - .animate( + gZenUIManager + .elementAnimate( this.contentWrapper, { opacity: [0, 1] }, { duration: this.#GLANCE_ANIMATION_DURATION / 4, - easing: "easeInOut", + easing: "ease-in-out", } ) .then(() => { @@ -559,12 +560,12 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { browserElement.zenModeActive = false; browserElement.docShellIsActive = false; } - gZenUIManager.motion - .animate(this.browserWrapper, arcSequence, { + gZenUIManager + .elementAnimate(this.browserWrapper, arcSequence, { duration: gZenUIManager.testingEnabled ? 0 : this.#GLANCE_ANIMATION_DURATION, - ease: "easeInOut", + easing: "ease-in-out", }) .then(() => { if (shouldDeactivateDocShell) { @@ -971,7 +972,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { { duration: 0.2, type: "spring", - bounce: this.#GLANCE_ANIMATION_DURATION - 0.1, + bounce: this.#GLANCE_ANIMATION_DURATION / 1000 - 0.1, } ) .then(() => { @@ -1019,7 +1020,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { opacity: [0.3, 1], }, { - duration: this.#GLANCE_ANIMATION_DURATION / 1.5, + duration: this.#GLANCE_ANIMATION_DURATION / 1000 / 1.5, type: "spring", bounce: 0, } @@ -1062,10 +1063,10 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { this.browserWrapper.style.width = ""; this.browserWrapper.style.height = ""; - gZenUIManager.motion - .animate(this.browserWrapper, arcSequence, { + gZenUIManager + .elementAnimate(this.browserWrapper, arcSequence, { duration: this.#GLANCE_ANIMATION_DURATION, - ease: "easeOut", + easing: "ease-out", }) .then(() => { // Remove element preview after closing animation @@ -1573,9 +1574,6 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { this.#handleZenFolderPinning(); gBrowser.moveTabAfter(this.#currentTab, this.#currentParentTab); - const browserRect = window.windowUtils.getBoundsWithoutFlushing( - this.browserWrapper - ); this.#prepareTabForFullOpen(); const sidebarButtons = this.browserWrapper.querySelector( @@ -1596,7 +1594,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { return; } - await this.#animateFullOpen(browserRect); + await this.#animateFullOpen(); this.finishOpeningGlance(); } @@ -1632,31 +1630,27 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature { /** * Animate the full opening process - * - * @param {object} browserRect - The browser rectangle */ - async #animateFullOpen(browserRect) { + async #animateFullOpen() { // Write styles early to avoid flickering - this.browserWrapper.style.opacity = 1; - this.browserWrapper.style.width = `${browserRect.width}px`; - this.browserWrapper.style.height = `${browserRect.height}px`; + this.browserWrapper.style.width = "100%"; + this.browserWrapper.style.height = "100%"; - await gZenUIManager.motion.animate( - this.browserWrapper, + await gZenUIManager.elementAnimate( + this.browserWrapper.parentElement, { - width: ["80%", "100%"], - height: ["100%", "100%"], + scale: [1, 1.005, 1], }, { - duration: this.#GLANCE_ANIMATION_DURATION, - type: "spring", - bounce: 0, + duration: 250, + easing: "ease-in-out", } ); + this.browserWrapper.style.scale = ""; + this.browserWrapper.style.opacity = ""; this.browserWrapper.style.width = ""; this.browserWrapper.style.height = ""; - this.browserWrapper.style.opacity = ""; gZenViewSplitter.deactivateCurrentSplitView({ removeDeckSelected: true }); } diff --git a/src/zen/glance/zen-glance.css b/src/zen/glance/zen-glance.css index bca099ab7..44bffb1a0 100644 --- a/src/zen/glance/zen-glance.css +++ b/src/zen/glance/zen-glance.css @@ -9,6 +9,9 @@ display: flex; z-index: 999; + will-change: transform, opacity; + contain: content; + top: 15px; padding: 12px; gap: 12px; @@ -121,6 +124,7 @@ &:not([has-finished-animation="true"]) { will-change: transform; + contain: layout size; transform-origin: 0 0; #statuspanel { diff --git a/src/zen/spaces/ZenSpaceManager.mjs b/src/zen/spaces/ZenSpaceManager.mjs index daa8f3f08..dc9c2b660 100644 --- a/src/zen/spaces/ZenSpaceManager.mjs +++ b/src/zen/spaces/ZenSpaceManager.mjs @@ -1602,7 +1602,6 @@ class nsZenWorkspaces { } #prepareNewWorkspace(space) { - document.documentElement.setAttribute("zen-workspace-id", space.uuid); let tabCount = 0; for (let tab of gBrowser.tabs) { const isEssential = tab.getAttribute("zen-essential") === "true"; @@ -1643,12 +1642,12 @@ class nsZenWorkspaces { async changeWorkspaceWithID(workspaceID, ...args) { const workspace = this.getWorkspaceFromId(workspaceID); - await this.changeWorkspace(workspace, ...args); + return await this.changeWorkspace(workspace, ...args); } async changeWorkspace(workspace, ...args) { if (!this.workspaceEnabled) { - return; + return workspace; } this.#currentSpaceSwitchContext.animations.forEach(animation => { animation.complete(); @@ -1668,6 +1667,7 @@ class nsZenWorkspaces { } this.#inChangingWorkspace = false; resolve(); + return workspace; } _cancelSwipeAnimation() { @@ -2429,9 +2429,6 @@ class nsZenWorkspaces { tabToSelect, { previousWorkspaceIndex, previousWorkspace } = {} ) { - // Update document state - document.documentElement.setAttribute("zen-workspace-id", workspace.uuid); - // Recalculate new tab observers gBrowser.tabContainer.observe( null, @@ -2975,8 +2972,7 @@ class nsZenWorkspaces { } let nextWorkspace = workspaces[targetIndex]; - await this.changeWorkspace(nextWorkspace, { whileScrolling }); - return nextWorkspace; + return await this.changeWorkspace(nextWorkspace, { whileScrolling }); } #initializeWorkspaceTabContextMenus() { @@ -3000,9 +2996,8 @@ class nsZenWorkspaces { ? gBrowser.selectedTabs : [TabContextMenu.contextTab]; document.getElementById("tabContextMenu").hidePopup(); - const previousWorkspaceID = - document.documentElement.getAttribute("zen-workspace-id"); for (let tab of tabs) { + const previousWorkspaceID = tab.getAttribute("zen-workspace-id"); this.moveTabToWorkspace(tab, workspaceID); if (this.lastSelectedWorkspaceTabs[previousWorkspaceID] === tab) { // This tab is no longer the last selected tab in the previous workspace because it's being moved to diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs index dbc99e678..521ecd1d0 100644 --- a/src/zen/split-view/ZenViewSplitter.mjs +++ b/src/zen/split-view/ZenViewSplitter.mjs @@ -1239,13 +1239,24 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { /** * Splits the selected tabs. + * + * @param {Tab|null} otherTabHint - An optional hint for another tab to split with (used for glance tabs). */ - contextSplitTabs() { + contextSplitTabs(otherTabHint = null) { let tabs; - if (TabContextMenu.contextTab.multiselected) { + let currentTab = TabContextMenu.contextTab || gBrowser.selectedTab; + if (currentTab.multiselected) { tabs = gBrowser.selectedTabs; } else { - tabs = [TabContextMenu.contextTab]; + tabs = [currentTab]; + } + if (otherTabHint && !tabs.includes(otherTabHint)) { + tabs.push(otherTabHint); + } + if (tabs.length < 2) { + gBrowser.selectedTab = tabs[0]; + this.createEmptySplit(); + return; } // If all are already in a split view, we unsplit them first. if (tabs.every(tab => tab.splitView)) { @@ -1265,10 +1276,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { * @returns {boolean} True if the tabs can be split, false otherwise. */ contextCanSplitTabs() { - if ( - window.gBrowser.selectedTabs.length < 2 || - window.gBrowser.selectedTabs.length > this.MAX_TABS - ) { + if (window.gBrowser.selectedTabs.length > this.MAX_TABS) { return false; } for (const tab of window.gBrowser.selectedTabs) { @@ -1323,7 +1331,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { * @param {Array} tabs * @param {Tab} relativeTab */ - _moveTabsToContainer(tabs, relativeTab) { + #moveTabsToContainer(tabs, relativeTab) { const relativeTabIsPinned = relativeTab.pinned; const relativeTabIsEssential = relativeTab.hasAttribute("zen-essential"); @@ -1340,6 +1348,32 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { } } + #useTabsToSplit(tabs) { + // If there's ANY pinned tab on the list, we clone the pinned tab + // state to all the tabs + const allArePinned = tabs.every(tab => tab.pinned); + const thereIsOnePinned = tabs.some(tab => tab.pinned); + const thereIsOneEssential = tabs.some(tab => + tab.hasAttribute("zen-essential") + ); + const thereIsOneLiveFolder = tabs.some(tab => + tab.hasAttribute("zen-live-folder-item-id") + ); + + if ( + thereIsOneEssential || + (thereIsOnePinned && !allArePinned) || + thereIsOneLiveFolder + ) { + for (let i = 0; i < tabs.length; i++) { + const tab = tabs[i]; + if (tab.pinned) { + tabs[i] = gBrowser.duplicateTab(tab, true); + } + } + } + } + /** * Splits the given tabs. * @@ -1364,17 +1398,20 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { let shouldActivateSplit = (initialIndex >= 0 || tabs.includes(window.gBrowser.selectedTab)) && !this._sessionRestoring; + if (existingSplitTab) { - this._moveTabsToContainer(tabs, tabs[tabIndexToUse]); const groupIndex = this._data.findIndex(group => group.tabs.includes(existingSplitTab) ); const group = this._data[groupIndex]; - const gridTypeChange = gridType && group.gridType !== gridType; - const newTabsAdded = tabs.find(t => !group.tabs.includes(t)); if (group.tabs.length >= this.MAX_TABS) { + gZenUIManager.showToast("zen-split-view-limit-toast"); return; } + this.#useTabsToSplit(tabs); + this.#moveTabsToContainer(tabs, tabs[tabIndexToUse]); + const gridTypeChange = gridType && group.gridType !== gridType; + const newTabsAdded = tabs.find(t => !group.tabs.includes(t)); if (gridTypeChange && !newTabsAdded) { // reset layout group.gridType = gridType; @@ -1406,30 +1443,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { return group; } - // We are here if none of the tabs have been previously split - // If there's ANY pinned tab on the list, we clone the pinned tab - // state to all the tabs - const allArePinned = tabs.every(tab => tab.pinned); - const thereIsOnePinned = tabs.some(tab => tab.pinned); - const thereIsOneEssential = tabs.some(tab => - tab.hasAttribute("zen-essential") - ); - const thereIsOneLiveFolder = tabs.some(tab => - tab.hasAttribute("zen-live-folder-item-id") - ); - - if ( - thereIsOneEssential || - (thereIsOnePinned && !allArePinned) || - thereIsOneLiveFolder - ) { - for (let i = 0; i < tabs.length; i++) { - const tab = tabs[i]; - if (tab.pinned) { - tabs[i] = gBrowser.duplicateTab(tab, true); - } - } - } + this.#useTabsToSplit(tabs); gridType ??= "grid"; @@ -2172,7 +2186,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { splitGroup && (!draggedTab.group || draggedTab.group !== splitGroup) ) { - this._moveTabsToContainer([draggedTab], droppedOnTab); + this.#moveTabsToContainer([draggedTab], droppedOnTab); gBrowser.moveTabToExistingGroup(draggedTab, splitGroup); if (hoverSide === "left" || hoverSide === "top") { try { diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs index 71009f921..7270eef67 100644 --- a/src/zen/tabs/ZenPinnedTabManager.mjs +++ b/src/zen/tabs/ZenPinnedTabManager.mjs @@ -857,7 +857,9 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature { const pinUrl = tab._zenPinnedInitialState.entry.url.split("#")[0]; const currentUrl = location.split("#")[0]; // Add an indicator that the pin has been changed - if (Services.io.newURI(currentUrl).spec === Services.io.newURI(pinUrl).spec) { + if ( + Services.io.newURI(currentUrl).spec === Services.io.newURI(pinUrl).spec + ) { this.resetPinChangedUrl(tab); return; } diff --git a/src/zen/tabs/zen-tabs/vertical-tabs.css b/src/zen/tabs/zen-tabs/vertical-tabs.css index b324a7116..f3d5777e7 100644 --- a/src/zen/tabs/zen-tabs/vertical-tabs.css +++ b/src/zen/tabs/zen-tabs/vertical-tabs.css @@ -474,13 +474,13 @@ overflow-y: auto; height: 100%; - :root[zen-workspace-id][zen-sidebar-expanded="true"] & { + :root[zen-sidebar-expanded="true"] & { margin-left: calc(-1 * var(--zen-toolbox-padding)); width: calc(100% + var(--zen-toolbox-padding) * 2); } } -:root[zen-workspace-id] #pinned-tabs-container { +#pinned-tabs-container { display: none; } diff --git a/src/zen/tests/spaces/browser_issue_10455.js b/src/zen/tests/spaces/browser_issue_10455.js index 48578c798..ed7644d39 100644 --- a/src/zen/tests/spaces/browser_issue_10455.js +++ b/src/zen/tests/spaces/browser_issue_10455.js @@ -12,10 +12,6 @@ add_task(async function test_Issue_10455() { let newWindow = await BrowserTestUtils.openNewBrowserWindow(); await newWindow.gZenWorkspaces.promiseInitialized; - ok( - newWindow.document.documentElement.hasAttribute("zen-workspace-id"), - "New window should have a zen-workspace-id attribute" - ); const unloadEvent = BrowserTestUtils.waitForEvent(newWindow, "unload"); newWindow.BrowserCommands.closeTabOrWindow(); @@ -33,10 +29,6 @@ add_task(async function test_Issue_10455_Dont_Close() { let newWindow = await BrowserTestUtils.openNewBrowserWindow(); await newWindow.gZenWorkspaces.promiseInitialized; - ok( - newWindow.document.documentElement.hasAttribute("zen-workspace-id"), - "New window should have a zen-workspace-id attribute" - ); newWindow.BrowserCommands.closeTabOrWindow(); Assert.strictEqual( diff --git a/src/zen/tests/spaces/browser_private_mode.js b/src/zen/tests/spaces/browser_private_mode.js index b3f3bd66d..e2c0e19fd 100644 --- a/src/zen/tests/spaces/browser_private_mode.js +++ b/src/zen/tests/spaces/browser_private_mode.js @@ -12,10 +12,6 @@ add_task(async function test_Private_Mode() { private: true, }); await privateWindow.gZenWorkspaces.promiseInitialized; - ok( - privateWindow.document.documentElement.hasAttribute("zen-workspace-id"), - "Private window should have a zen-workspace-id attribute" - ); await BrowserTestUtils.closeWindow(privateWindow); await SpecialPowers.popPrefEnv(); From e9634e10573b6838e40a2f8e20dce403c38d3e00 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sun, 19 Apr 2026 01:11:44 +0200 Subject: [PATCH 07/31] no-bug: Move API keys to release script (gh-13309) --- .github/workflows/linux-release-build.yml | 12 +++--------- .github/workflows/macos-release-build.yml | 12 +++--------- .github/workflows/src/release-build.sh | 8 ++++++++ .github/workflows/windows-release-build.yml | 12 +++--------- configs/common/mozconfig | 10 +++++++++- 5 files changed, 26 insertions(+), 28 deletions(-) diff --git a/.github/workflows/linux-release-build.yml b/.github/workflows/linux-release-build.yml index 06250bec2..b92181af2 100644 --- a/.github/workflows/linux-release-build.yml +++ b/.github/workflows/linux-release-build.yml @@ -120,15 +120,13 @@ jobs: ./mach --no-interactive bootstrap --application-choice browser cd .. - - name: Insert API Keys - run: | - mkdir -p ~/.zen-keys - echo "${{ secrets.ZEN_SAFEBROWSING_API_KEY }}" > ~/.zen-keys/safebrowsing.dat - - name: Build env: SURFER_COMPAT: ${{ matrix.arch }} ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }} + ZEN_SAFEBROWSING_API_KEY: ${{ secrets.ZEN_SAFEBROWSING_API_KEY }} + ZEN_MOZILLA_API_KEY: ${{ secrets.ZEN_MOZILLA_API_KEY }} + ZEN_GOOGLE_LOCATION_SERVICE_API_KEY: ${{ secrets.ZEN_GOOGLE_LOCATION_SERVICE_API_KEY }} continue-on-error: true run: | export SURFER_PLATFORM="linux" @@ -146,10 +144,6 @@ jobs: export ZEN_RELEASE=1 npm run package - - name: Remove API Keys - run: | - rm -rf ~/.zen-keys - - name: Rename artifacts run: | mv dist/zen-*.tar.xz "zen.linux-${{ matrix.arch }}.tar.xz" diff --git a/.github/workflows/macos-release-build.yml b/.github/workflows/macos-release-build.yml index cd256497c..a14aac90c 100644 --- a/.github/workflows/macos-release-build.yml +++ b/.github/workflows/macos-release-build.yml @@ -134,15 +134,13 @@ jobs: - name: Build language packs run: sh scripts/download-language-packs.sh - - name: Insert API Keys - run: | - mkdir -p ~/.zen-keys - echo "${{ secrets.ZEN_SAFEBROWSING_API_KEY }}" > ~/.zen-keys/safebrowsing.dat - - name: Build Zen env: SURFER_COMPAT: ${{ matrix.arch }} ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }} + ZEN_SAFEBROWSING_API_KEY: ${{ secrets.ZEN_SAFEBROWSING_API_KEY }} + ZEN_MOZILLA_API_KEY: ${{ secrets.ZEN_MOZILLA_API_KEY }} + ZEN_GOOGLE_LOCATION_SERVICE_API_KEY: ${{ secrets.ZEN_GOOGLE_LOCATION_SERVICE_API_KEY }} run: | export SURFER_PLATFORM="darwin" if [[ -n ${{ inputs.MOZ_BUILD_DATE }} ]];then @@ -159,10 +157,6 @@ jobs: export ZEN_RELEASE=1 npm run package - - name: Remove API Keys - run: | - rm -rf ~/.zen-keys - - name: Rename artifacts run: | echo "Tarballing DMG" diff --git a/.github/workflows/src/release-build.sh b/.github/workflows/src/release-build.sh index 7b2a5b034..fbccedce2 100644 --- a/.github/workflows/src/release-build.sh +++ b/.github/workflows/src/release-build.sh @@ -8,6 +8,11 @@ if command -v apt-get &> /dev/null; then sudo apt-get install -y xvfb libnvidia-egl-wayland1 mesa-utils libgl1-mesa-dri fi +mkdir -p ~/.zen-keys +echo "$ZEN_SAFEBROWSING_API_KEY" > ~/.zen-keys/safebrowsing.dat +echo "$ZEN_MOZILLA_API_KEY" > ~/.zen-keys/mozilla.dat +echo "$ZEN_GOOGLE_LOCATION_SERVICE_API_KEY" > ~/.zen-keys/google_location_service.dat + . $HOME/.cargo/env bash ./scripts/mar_sign.sh -i @@ -30,3 +35,6 @@ else export ZEN_RELEASE=1 npm run build fi + +echo "Build complete, removing API keys" +rm -rf ~/.zen-keys diff --git a/.github/workflows/windows-release-build.yml b/.github/workflows/windows-release-build.yml index 2207d35aa..dc054aef3 100644 --- a/.github/workflows/windows-release-build.yml +++ b/.github/workflows/windows-release-build.yml @@ -228,16 +228,14 @@ jobs: chmod +x ~/artifact/en-US.log chmod +x ~/artifact/merged.profdata - - name: Insert API Keys - run: | - mkdir -p ~/.zen-keys - echo "${{ secrets.ZEN_SAFEBROWSING_API_KEY }}" > ~/.zen-keys/safebrowsing.dat - - name: Build if: ${{ !(inputs.generate-gpo && matrix.arch == 'aarch64') }} env: SURFER_COMPAT: ${{ matrix.arch }} ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }} + ZEN_SAFEBROWSING_API_KEY: ${{ secrets.ZEN_SAFEBROWSING_API_KEY }} + ZEN_MOZILLA_API_KEY: ${{ secrets.ZEN_MOZILLA_API_KEY }} + ZEN_GOOGLE_LOCATION_SERVICE_API_KEY: ${{ secrets.ZEN_GOOGLE_LOCATION_SERVICE_API_KEY }} run: | set -x dos2unix configs/windows/mozconfig @@ -266,10 +264,6 @@ jobs: ls ./dist ls . - - name: Remove API Keys - run: | - rm -rf ~/.zen-keys - - name: Move package for PGO upload if: ${{ inputs.generate-gpo && matrix.arch == 'x86_64' }} run: | diff --git a/configs/common/mozconfig b/configs/common/mozconfig index a93df9072..ddb795b86 100644 --- a/configs/common/mozconfig +++ b/configs/common/mozconfig @@ -35,11 +35,19 @@ if ! test "$SCCACHE_GHA_ENABLED" = "false"; then fi fi -# add safe browsing key if it exists on a file +# add API keys if it exists on a file if test -f "$HOME/.zen-keys/safebrowsing.dat"; then ac_add_options --with-google-safebrowsing-api-keyfile="$HOME/.zen-keys/safebrowsing.dat" fi +if test -f "$HOME/.zen-keys/mozilla.dat"; then + ac_add_options --with-mozilla-api-keyfile="$HOME/.zen-keys/mozilla.dat" +fi + +if test -f "$HOME/.zen-keys/google_location_service.dat"; then + ac_add_options --with-google-location-service-api-keyfile="$HOME/.zen-keys/google_location_service.dat" +fi + if test "$ZEN_RELEASE"; then # TODO: Make this successful in builds From 721b10abda42ad04f580320e379d2214a779c812 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sun, 19 Apr 2026 09:10:02 +0200 Subject: [PATCH 08/31] no-bug: Ignore certs when running windows profiling (gh-13313) --- .github/workflows/windows-profile-build.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/windows-profile-build.yml b/.github/workflows/windows-profile-build.yml index 84f2a01bc..740c5fd3f 100644 --- a/.github/workflows/windows-profile-build.yml +++ b/.github/workflows/windows-profile-build.yml @@ -80,8 +80,6 @@ jobs: if: ${{ matrix.arch == 'x86_64' }} env: SURFER_NO_BRANDING_PATCH: true - SURFER_CERT_PATCH_ISSUER: ${{ secrets.SURFER_CERT_PATCH_ISSUER }} - SURFER_CERT_PATCH_NAME: ${{ secrets.SURFER_CERT_PATCH_NAME }} run: npm run import - name: Generate From 598c299e180d478f987ce886115cbfb35f219830 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sun, 19 Apr 2026 16:14:25 +0200 Subject: [PATCH 09/31] no-bug: Add `Move to folder` context menu item (gh-13315) --- .../browser/browser/zen-vertical-tabs.ftl | 4 + scripts/mar_sign.sh | 25 +++++-- .../sessionstore/SessionStore-sys-mjs.patch | 10 ++- .../tabbrowser/content/tabbrowser-js.patch | 74 ++++++++++--------- src/zen/folders/ZenFolders.mjs | 73 +++++++++++++++++- .../sessionstore/ZenSessionManager.sys.mjs | 5 ++ src/zen/tabs/ZenPinnedTabManager.mjs | 32 +------- 7 files changed, 152 insertions(+), 71 deletions(-) diff --git a/locales/en-US/browser/browser/zen-vertical-tabs.ftl b/locales/en-US/browser/browser/zen-vertical-tabs.ftl index f54a0d3b0..73e4a2a03 100644 --- a/locales/en-US/browser/browser/zen-vertical-tabs.ftl +++ b/locales/en-US/browser/browser/zen-vertical-tabs.ftl @@ -19,6 +19,10 @@ zen-toolbar-context-compact-mode-hide-both = .label = Hide both .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M + zen-toolbar-context-new-folder = .label = New Folder .accesskey = N diff --git a/scripts/mar_sign.sh b/scripts/mar_sign.sh index e0c02802b..6a9fac2e0 100644 --- a/scripts/mar_sign.sh +++ b/scripts/mar_sign.sh @@ -17,13 +17,16 @@ generate_certs() { openssl genrsa -out private_key.pem 4096 # 2. Generate self-signed certificate (required for PKCS#12 bundling) + # RFC 5280 "no well-defined expiration" sentinel: 99991231235959Z openssl req -new -x509 \ -key private_key.pem \ -out cert.pem \ - -subj "/CN=MAR Signing" + -subj "/CN=MAR Signing" \ + -not_before 20000101000000Z \ + -not_after 99991231235959Z - # 3. Export public key as SPKI DER (for embedding in updater) - openssl rsa -in private_key.pem -pubout -outform DER -out public_key.der + # 3. Export certificate as DER (for embedding in updater) + openssl x509 -in cert.pem -outform DER -out public_key.der cd .. mkdir -p "$CERT_PATH_DIR" @@ -35,9 +38,10 @@ generate_certs() { base64 -w 0 "$CERT_PATH_DIR"/cert.pem > "$CERT_PATH_DIR"/env/ZEN_SIGNING_CERT_PEM_BASE64 base64 -w 0 "$CERT_PATH_DIR"/private_key.pem > "$CERT_PATH_DIR"/env/ZEN_SIGNING_PRIVATE_KEY_PEM_BASE64 - # Verify public key - openssl rsa -in "$CERT_PATH_DIR"/public_key.der \ - -pubin -inform DER -text -noout + # Make sure no private keys or certs are left + # in the public_key.der file, which is the only one that + # should be distributed and embedded in the updater + openssl x509 -in "$CERT_PATH_DIR"/public_key.der -inform DER -noout -text > /dev/null rm -rf temp } @@ -196,6 +200,15 @@ sign_mars() { "$SIGNMAR" -d "$NSS_CONFIG_DIR" -n "mar_sig" -s "$mar_file" "$mar_file".signed echo "Signed $mar_file. Verifying signature..." "$SIGNMAR" -d "$NSS_CONFIG_DIR" -n "mar_sig" -v "$mar_file".signed + if [ $? -ne 0 ]; then + echo "Signature verification failed for $mar_file.signed" >&2 + exit 1 + fi + "$SIGNMAR" -D "build/signing/public_key.der" -v "$mar_file".signed + if [ $? -ne 0 ]; then + echo "Public key verification failed for $mar_file.signed" >&2 + exit 1 + fi mv "$mar_file".signed "$mar_file" echo "Successfully signed $mar_file" update_manifests "$mar_file" diff --git a/src/browser/components/sessionstore/SessionStore-sys-mjs.patch b/src/browser/components/sessionstore/SessionStore-sys-mjs.patch index 27134f020..84ecce245 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 71921cec2b6aa0f103856c31254fd6c4affefccb..d39f2bd587e9aa320d69f94a2bd30be909c3e608 100644 +index 71921cec2b6aa0f103856c31254fd6c4affefccb..ed13d7e2aa5ff1199872fedbc26494aae463ace4 100644 --- a/browser/components/sessionstore/SessionStore.sys.mjs +++ b/browser/components/sessionstore/SessionStore.sys.mjs @@ -129,6 +129,9 @@ const TAB_EVENTS = [ @@ -358,3 +358,11 @@ index 71921cec2b6aa0f103856c31254fd6c4affefccb..d39f2bd587e9aa320d69f94a2bd30be9 Glean.sessionRestore.shutdownFlushAllOutcomes.timed_out.add(1); deferred.resolve(); } +@@ -8552,6 +8614,7 @@ var SessionStoreInternal = { + if ( + !savedTabGroupState.tabs.length || + this.getSavedTabGroup(savedTabGroupState.id) ++ && false + ) { + return; + } diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch index 5becce548..35b9a51e4 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 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35e66ff55a 100644 +index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..451feb3d412cbf20f2a65bfa73bdbafb7506bdc5 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js @@ -413,6 +413,7 @@ @@ -683,7 +683,15 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 if (!this._windowIsClosing) { // update tab close buttons state this.tabContainer._updateCloseButtons(); -@@ -6225,6 +6393,7 @@ +@@ -6180,6 +6348,7 @@ + memory_after: await getTotalMemoryUsage(), + time_to_unload_in_ms: timeElapsed, + }); ++ return true; + } + + /** +@@ -6225,6 +6394,7 @@ } let excludeTabs = new Set(aExcludeTabs); @@ -691,7 +699,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 // If this tab has a successor, it should be selectable, since // hiding or closing a tab removes that tab as a successor. -@@ -6237,15 +6406,22 @@ +@@ -6237,15 +6407,22 @@ !excludeTabs.has(aTab.owner) && Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose") ) { @@ -716,7 +724,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 let tab = this.tabContainer.findNextTab(aTab, { direction: 1, filter: _tab => remainingTabs.includes(_tab), -@@ -6259,7 +6435,7 @@ +@@ -6259,7 +6436,7 @@ } if (tab) { @@ -725,7 +733,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 } // If no qualifying visible tab was found, see if there is a tab in -@@ -6280,7 +6456,7 @@ +@@ -6280,7 +6457,7 @@ }); } @@ -734,7 +742,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 } _blurTab(aTab) { -@@ -6291,7 +6467,7 @@ +@@ -6291,7 +6468,7 @@ * @returns {boolean} * False if swapping isn't permitted, true otherwise. */ @@ -743,7 +751,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 // Do not allow transfering a private tab to a non-private window // and vice versa. if ( -@@ -6345,6 +6521,7 @@ +@@ -6345,6 +6522,7 @@ // fire the beforeunload event in the process. Close the other // window if this was its last tab. if ( @@ -751,7 +759,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 !remoteBrowser._beginRemoveTab(aOtherTab, { adoptedByTab: aOurTab, closeWindowWithLastTab: true, -@@ -6356,7 +6533,7 @@ +@@ -6356,7 +6534,7 @@ // If this is the last tab of the window, hide the window // immediately without animation before the docshell swap, to avoid // about:blank being painted. @@ -760,7 +768,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 if (closeWindow) { let win = aOtherTab.ownerGlobal; win.windowUtils.suppressAnimation(true); -@@ -6484,11 +6661,13 @@ +@@ -6484,11 +6662,13 @@ } // Finish tearing down the tab that's going away. @@ -774,7 +782,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 this.setTabTitle(aOurTab); -@@ -6690,10 +6869,10 @@ +@@ -6690,10 +6870,10 @@ SessionStore.deleteCustomTabValue(aTab, "hiddenBy"); } @@ -787,7 +795,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 aTab.selected || aTab.closing || // Tabs that are sharing the screen, microphone or camera cannot be hidden. -@@ -6753,7 +6932,8 @@ +@@ -6753,7 +6933,8 @@ * @param {object} [aOptions={}] * Key-value pairs that will be serialized into the features string. */ @@ -797,7 +805,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 if (this.tabs.length == 1) { return null; } -@@ -6770,7 +6950,7 @@ +@@ -6770,7 +6951,7 @@ // tell a new window to take the "dropped" tab let args = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray); args.appendElement(aTab.splitview ?? aTab); @@ -806,7 +814,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 private: PrivateBrowsingUtils.isWindowPrivate(window), features: Object.entries(aOptions) .map(([key, value]) => `${key}=${value}`) -@@ -6778,6 +6958,8 @@ +@@ -6778,6 +6959,8 @@ openerWindow: window, args, }); @@ -815,7 +823,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 } /** -@@ -6890,7 +7072,7 @@ +@@ -6890,7 +7073,7 @@ * `true` if element is a `` */ isTabGroup(element) { @@ -824,7 +832,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 } /** -@@ -6975,8 +7157,8 @@ +@@ -6975,8 +7158,8 @@ } // Don't allow mixing pinned and unpinned tabs. @@ -835,7 +843,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 } else { tabIndex = Math.max(tabIndex, this.pinnedTabCount); } -@@ -7005,13 +7187,19 @@ +@@ -7005,13 +7188,19 @@ this.#handleTabMove( element, () => { @@ -857,7 +865,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 let useAfter = false; if (this.isTab(element)) { useAfter = neighbor && tabIndex > element._tPos; -@@ -7076,23 +7264,31 @@ +@@ -7076,23 +7265,31 @@ #moveTabNextTo(element, targetElement, moveBefore = false, metricsContext) { if (this.isTabGroupLabel(targetElement)) { targetElement = targetElement.group; @@ -895,7 +903,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 } 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 -@@ -7105,12 +7301,35 @@ +@@ -7105,12 +7302,35 @@ // 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. @@ -932,7 +940,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 // We want to include the splitview wrapper if it's the targetElement, but // not in the case where we want to reverse tabs within the same splitview. -@@ -7119,6 +7338,7 @@ +@@ -7119,6 +7339,7 @@ } let getContainer = () => @@ -940,7 +948,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 element.pinned ? this.tabContainer.pinnedTabsContainer : this.tabContainer; -@@ -7127,11 +7347,15 @@ +@@ -7127,11 +7348,15 @@ element, () => { if (moveBefore) { @@ -957,7 +965,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 } }, metricsContext -@@ -7205,10 +7429,10 @@ +@@ -7205,10 +7430,10 @@ * @param {TabMetricsContext} [metricsContext] */ moveTabToExistingGroup(aTab, aGroup, metricsContext) { @@ -970,7 +978,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 return; } if (aTab.group && aTab.group.id === aGroup.id) { -@@ -7281,6 +7505,7 @@ +@@ -7281,6 +7506,7 @@ let state = { tabIndex: tab._tPos, @@ -978,7 +986,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 }; if (tab.visible) { state.elementIndex = tab.elementIndex; -@@ -7312,7 +7537,7 @@ +@@ -7312,7 +7538,7 @@ let changedSplitView = previousTabState.splitViewId != currentTabState.splitViewId; @@ -987,7 +995,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 tab.dispatchEvent( new CustomEvent("TabMove", { bubbles: true, -@@ -7354,6 +7579,10 @@ +@@ -7354,6 +7580,10 @@ moveActionCallback(); @@ -998,7 +1006,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 // Clear tabs cache after moving nodes because the order of tabs may have // changed. this.tabContainer._invalidateCachedTabs(); -@@ -7404,7 +7633,22 @@ +@@ -7404,7 +7634,22 @@ * @returns {object} * The new tab in the current window, null if the tab couldn't be adopted. */ @@ -1022,7 +1030,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 // Swap the dropped tab with a new one we create and then close // it in the other window (making it seem to have moved between // windows). We also ensure that the tab we create to swap into has -@@ -7447,6 +7691,8 @@ +@@ -7447,6 +7692,8 @@ } params.skipLoad = true; let newTab = this.addWebTab("about:blank", params); @@ -1031,7 +1039,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 aTab.container.tabDragAndDrop.finishAnimateTabMove(); -@@ -8149,7 +8395,7 @@ +@@ -8149,7 +8396,7 @@ // preventDefault(). It will still raise the window if appropriate. return; } @@ -1040,7 +1048,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 window.focus(); aEvent.preventDefault(); } -@@ -8166,7 +8412,6 @@ +@@ -8166,7 +8413,6 @@ on_TabGroupCollapse(aEvent) { aEvent.target.tabs.forEach(tab => { @@ -1048,7 +1056,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 }); } -@@ -8500,7 +8745,9 @@ +@@ -8500,7 +8746,9 @@ let filter = this._tabFilters.get(tab); if (filter) { @@ -1058,7 +1066,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 let listener = this._tabListeners.get(tab); if (listener) { -@@ -9306,6 +9553,7 @@ +@@ -9306,6 +9554,7 @@ aWebProgress.isTopLevel ) { this.mTab.setAttribute("busy", "true"); @@ -1066,7 +1074,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 gBrowser._tabAttrModified(this.mTab, ["busy"]); this.mTab._notselectedsinceload = !this.mTab.selected; } -@@ -9386,6 +9634,7 @@ +@@ -9386,6 +9635,7 @@ // known defaults. Note we use the original URL since about:newtab // redirects to a prerendered page. const shouldRemoveFavicon = @@ -1074,7 +1082,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 !this.mBrowser.mIconURL && !ignoreBlank && !(originalLocation.spec in FAVICON_DEFAULTS); -@@ -9560,13 +9809,6 @@ +@@ -9560,13 +9810,6 @@ this.mBrowser.originalURI = aRequest.originalURI; } @@ -1088,7 +1096,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..2e1151dd1ac42b01529e746ee3b45c35 } let userContextId = this.mBrowser.getAttribute("usercontextid") || 0; -@@ -10450,7 +10692,7 @@ var TabContextMenu = { +@@ -10450,7 +10693,7 @@ var TabContextMenu = { ); contextUnpinSelectedTabs.hidden = !this.contextTab.pinned || !this.multiselected; diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs index 08a60a24c..fe2b7c2c7 100644 --- a/src/zen/folders/ZenFolders.mjs +++ b/src/zen/folders/ZenFolders.mjs @@ -65,9 +65,14 @@ class nsZenFolders extends nsZenDOMOperatedFeature { } #initContextMenu() { - const contextMenuItems = window.MozXULElement.parseXULToFragment( - `` - ); + const contextMenuItems = window.MozXULElement.parseXULToFragment(` + + + + + + + `); document.getElementById("context_moveTabToGroup").before(contextMenuItems); const contextMenuItemsToolbar = window.MozXULElement.parseXULToFragment( ` @@ -227,6 +232,7 @@ class nsZenFolders extends nsZenDOMOperatedFeature { document .getElementById("zen-context-menu-new-folder-toolbar") .addEventListener("command", onNewFolder); + this.#initMoveTabToFolder(); SessionStore.promiseInitialized.then(() => { gBrowser.tabContainer.addEventListener( "dragstart", @@ -235,6 +241,67 @@ class nsZenFolders extends nsZenDOMOperatedFeature { }); } + #initMoveTabToFolder() { + const moveTabToFolderMenu = document.getElementById( + "context_zenMoveToFolder" + ); + moveTabToFolderMenu.addEventListener("popupshowing", () => { + const separator = moveTabToFolderMenu.querySelector("menuseparator"); + let tabs = TabContextMenu.contextTab?.multiselected + ? gBrowser.selectedTabs + : [TabContextMenu.contextTab]; + let groups = gBrowser.tabGroups.filter(group => { + const isZenFolder = group?.isZenFolder; + const isLiveFolder = group?.isLiveFolder; + const spaceId = group?.getAttribute("zen-workspace-id"); + if ( + !isZenFolder || + isLiveFolder || + spaceId !== gZenWorkspaces.activeWorkspace + ) { + return false; + } + return !tabs.some(tab => tab.group === group); + }); + separator.hidden = groups.length === 0; + for (const group of groups) { + const icon = group.iconURL; + const menuItem = document.createXULElement("menuitem"); + menuItem.setAttribute("label", group.label); + menuItem.classList.add("context-zen-move-to-folder-item"); + if (icon) { + menuItem.setAttribute("image", icon); + } + menuItem._group = group; + separator.before(menuItem); + } + }); + + moveTabToFolderMenu.addEventListener("popuphidden", () => { + const items = moveTabToFolderMenu.querySelectorAll( + ".context-zen-move-to-folder-item" + ); + for (const item of items) { + delete item._group; + item.remove(); + } + }); + + moveTabToFolderMenu.addEventListener("command", event => { + if (!event.target.classList.contains("context-zen-move-to-folder-item")) { + return; + } + const group = event.target._group; + if (!group) { + return; + } + let tabs = TabContextMenu.contextTab?.multiselected + ? gBrowser.selectedTabs + : [TabContextMenu.contextTab]; + group.addTabs(tabs); + }); + } + handleEvent(aEvent) { let methodName = `on_${aEvent.type}`; if (methodName in this) { diff --git a/src/zen/sessionstore/ZenSessionManager.sys.mjs b/src/zen/sessionstore/ZenSessionManager.sys.mjs index 791d24c68..ae2321a76 100644 --- a/src/zen/sessionstore/ZenSessionManager.sys.mjs +++ b/src/zen/sessionstore/ZenSessionManager.sys.mjs @@ -357,6 +357,11 @@ export class nsZenSessionManager { if (this._shouldRunMigration) { initialState = this.#runStateMigration(initialState); } + // Clear the memory of the groups saved in the session file, + // as we don't really need them anyways. + if (initialState?.savedGroups) { + initialState.savedGroups = []; + } if (!lazy.gWindowSyncEnabled) { if (initialState?.windows?.length && this.#shouldRestoreOnlyPinned) { this.log("Window sync disabled, restoring only pinned tabs"); diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs index 7270eef67..2b6376a88 100644 --- a/src/zen/tabs/ZenPinnedTabManager.mjs +++ b/src/zen/tabs/ZenPinnedTabManager.mjs @@ -285,8 +285,6 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature { return; } - const selectedTabs = pinnedTabs.filter(tab => tab.selected); - event.stopPropagation(); event.preventDefault(); @@ -366,14 +364,14 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature { return; } } - await gBrowser.explicitUnloadTabs(pinnedTabs); + let successful = await gBrowser.explicitUnloadTabs(pinnedTabs); + if (!successful) { + return; + } for (const tab of pinnedTabs) { tab.removeAttribute("discarded"); } } - if (selectedTabs.length) { - this._handleTabSwitch(selectedTabs[0]); - } if (behavior.includes("reset")) { for (const tab of pinnedTabs) { this.#resetTabToStoredState(tab); @@ -392,28 +390,6 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature { } } - _handleTabSwitch(selectedTab) { - if (selectedTab !== gBrowser.selectedTab) { - return; - } - const findNextTab = direction => - gBrowser.tabContainer.findNextTab(selectedTab, { - direction, - filter: tab => !tab.hidden && !tab.pinned, - }); - - let nextTab = findNextTab(1) || findNextTab(-1); - - if (!nextTab) { - gZenWorkspaces.selectEmptyTab(); - return; - } - - if (nextTab) { - gBrowser.selectedTab = nextTab; - } - } - #resetTabToStoredState(tab) { const state = this.#getTabState(tab); From 049c39839f6fa37c746410ffeda0b6d0bb6e90e9 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sun, 19 Apr 2026 16:18:38 +0200 Subject: [PATCH 10/31] no-bug: Update public key for mar signing (gh-13316) --- build/signing/public_key.der | Bin 550 -> 1299 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/build/signing/public_key.der b/build/signing/public_key.der index 68994169095e588fc3ab481756409d8c543063fd..733d575085c4e015eb1986ce720c21bc3bab7cc5 100644 GIT binary patch delta 1283 zcmZ3+GMTI1pox{=po!`G0%j&gCMFTRpcNfcQ+S>zH0<9L9+0Zv@JF@HfR~L^tIebB zJ1-+6H!FjIn4yS)5F2wS3o{S5uVauxaAta5W?s61f;g{%fq|icp#c~~N$^`*T3Q+! z85_ z>`Lbk=`9H@RtLg!imYE8I{&XQjbnb1y^G`H0>;Ms>cXEMuC1FsZO)T_hNZQqZo7Lf ztGN)pEU9p2huro%Uh_CB-%s4`wP4W;KJyuO|2xK7RlEK^cgSbozFEJgfB#_QSO0Qb zfIydE#_V{_uF9=9kDONKPE7GNx6p0Q?F>pTtvk(YDts>WX{N@5$3nlF`&o>*7$bi- z^55AYxRYtG!)9Nht!oZuntxPZ@VCPCy4KcXO?&d)8|pg@ixN|l-Y{8Z|9fV@#&Fn> z_vn#{f5g6IM9xb+(4*trWOS!W+cnqHKc?OCpi-AKk!y~HM=t=EpXR+U$G`*#;RuN4NWIqb_*CZ2!BrGWGh`Z$?eXM z9~yTqgx<;Hb9t-1zH(++sosO9H^RP~bKdA#>Xy)4cKW!L;O9=8ZTFj=xqWXC`mgb5 zw((A``T((C55J#k3n=-v@J95vH~QIOyMya|yve*Z1J#~V|x zcJ}0&H!uG$ax+ejiLdQmX*r2`!{#kF_|{+V-RV?)>cjq)`q-_f8=06H85kD_8w482 zvN4Cs^0A1qh-mnhmhCo?`w=hUG_$T!Fy>s|ym|w9khC(3gn?KCb_M((1;UJs|5;cK zm>C)Wqa|VHCMHIPuK0?(3h5gfPyOm?uc&X{Sr?k^;I-R*O;9EG1xqVK?nCx@tD|aK z0s`6sJwpUuy*4YI5XQbl;R$=Q>y|zLS7!YFUU~9kqSU_p=!yR?m~Qyo#--A_L3~!* z`MdX9udYA;;PdnY^SzDMO5FT&;Zv4e>5DtbJ7$N*Et_*;MxVXbSG7qT%(05UR^1U@ zaCNQu>iW&*Aq^@YCoXE79GG|H$&;>gZm(?Er)_7-y}M>g*#grSMRz{5oo?Rps`ZRX zZ``5Ui_FbWrf71$TQBfF^aS&r&65TD%&flLOm;uDYw5$O&v;jxOc1DBc(P|k>h2JK zhSjT=%3oByxNTqN+oYZU1#|B0w~l6&!r&+m=UUnB}@VBc*M1Q%o zYs&kkBj%r%OEG<}`g-(fCevpRP3tYXHVZ2%mzwqZT$_5C(_3Lr3-80Ol@|l{e{z-h zvCdM!cI6!DofA7)G=m?Mec|hnJ|MP$@0Q)e0~ZgUOcir@Co3~+ci-uYZMG_fcb^;! zpRD~oWxK(XBVix=bv*Y5Rqc%wuyy!a!e$Y8CdH(AvD~%t8kGc|UGlNdR_xmq)^K3* p4$g$FR|6)UvHUFkrsdK>Q5BWY2Zf1?%U5lh{XObn<(}@h{s6qSOG^L% delta 529 zcmbQtwTxwAi(>tT=3nuD7v5YD`<}VhTP9@Q60Vg@de2UtUuSnCw~vMEn%mT4@4Qc) zchXs%(x9*JeX?$X)!Npbu`OBa=cX?`X+3B8Mz^2k%o-lcynn8FyIWGz!{M34`4t~# zzo@iLx^wE2e|F?lyH7fn8ylM~92vI+C2m?PR#D8p-TI;C@nl}k)%CZ2JpH`D=jFP~ z{|>2Vt~{jlY2`cv$>zyRcD`Ufm*jekEC2R~`Ra4uc*L1Jm3%z!s_NpIT`zxkY;xSc zW2frxIlUPeXH`#kn<;D%P6kto>6zl_&f|g5q~(pX+?g6Mh=_ZhB!a z)+Bj%~0@Rts*?z=Z9>DO(nxmN#fbKTjl!rRP$gR0b5Z_402t7oKbeQmYjxnfQZ zci|UJr`vVZp{8S`VS)OlIE{+|u)63?E~{@&=y zF4f!D-`Ry;%~>0{Gbdfz>feh4tGT0(ZDqN&IcrzViBmh?D=sSTE7e-E%$+5#?pj`E zJ-@(9TK)*;PdaP?DL-?53(a4{B!e6y2kS2?>)&t1NNtr?R76m%hty? zzjWNAas1`=#1d7X2%aAr2A!#aOJ(2QEdBO$Tg0#X)#iScCl{=HrgUJ7;uStM?Flz^ tV_sCbZ}xp|lbqhS!Tv+(vg87#AW{9PbM*bbxSZk?etp1^iJ6gs5deJg2xb5P From 3fa5b4867cee556db4d8ee06950b9b6120e1a26d Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sun, 19 Apr 2026 18:34:19 +0200 Subject: [PATCH 11/31] no-bug: Add a switch case for pin unloading (gh-13317) --- .../components/tabbrowser/content/tabbrowser-js.patch | 4 ++-- src/zen/tabs/ZenPinnedTabManager.mjs | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch index 35b9a51e4..9aaa78e55 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 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..451feb3d412cbf20f2a65bfa73bdbafb7506bdc5 100644 +index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cbd4b1418a 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js @@ -413,6 +413,7 @@ @@ -597,7 +597,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..451feb3d412cbf20f2a65bfa73bdbafb + this.selectedTab = newTab; + } + } -+ animate &&= !aTab.splitView; ++ animate &&= !aTab.group?.hasAttribute("split-view-group"); + let isVisibleTab = aTab.visible; // We have to sample the tab width now, since _beginRemoveTab might diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs index 2b6376a88..b764c250c 100644 --- a/src/zen/tabs/ZenPinnedTabManager.mjs +++ b/src/zen/tabs/ZenPinnedTabManager.mjs @@ -371,6 +371,12 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature { for (const tab of pinnedTabs) { tab.removeAttribute("discarded"); } + } else if (pinnedTabs.some(tab => tab.selected)) { + const selectedTabs = pinnedTabs.filter(tab => tab.selected); + gBrowser.selectedTab = gBrowser._findTabToBlurTo( + selectedTabs[0], + selectedTabs + ); } if (behavior.includes("reset")) { for (const tab of pinnedTabs) { From 4e84352023440f617fa1c9726445a954a7fd6238 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sun, 19 Apr 2026 20:41:42 +0200 Subject: [PATCH 12/31] no-bug: Remove extra verification when signing mars (gh-13321) --- scripts/mar_sign.sh | 9 --------- 1 file changed, 9 deletions(-) diff --git a/scripts/mar_sign.sh b/scripts/mar_sign.sh index 6a9fac2e0..b5d147705 100644 --- a/scripts/mar_sign.sh +++ b/scripts/mar_sign.sh @@ -200,15 +200,6 @@ sign_mars() { "$SIGNMAR" -d "$NSS_CONFIG_DIR" -n "mar_sig" -s "$mar_file" "$mar_file".signed echo "Signed $mar_file. Verifying signature..." "$SIGNMAR" -d "$NSS_CONFIG_DIR" -n "mar_sig" -v "$mar_file".signed - if [ $? -ne 0 ]; then - echo "Signature verification failed for $mar_file.signed" >&2 - exit 1 - fi - "$SIGNMAR" -D "build/signing/public_key.der" -v "$mar_file".signed - if [ $? -ne 0 ]; then - echo "Public key verification failed for $mar_file.signed" >&2 - exit 1 - fi mv "$mar_file".signed "$mar_file" echo "Successfully signed $mar_file" update_manifests "$mar_file" From 68d66136ff7960bffd5674097582a3bc861f08c3 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Sun, 19 Apr 2026 22:59:23 +0200 Subject: [PATCH 13/31] gh-13318: Make MacOS windows follow inactive preference (gh-13322) --- prefs/zen/view.yaml | 3 +++ src/widget/cocoa/VibrancyManager-mm.patch | 18 ++++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/prefs/zen/view.yaml b/prefs/zen/view.yaml index 1f36da3f0..f5a54e27c 100644 --- a/prefs/zen/view.yaml +++ b/prefs/zen/view.yaml @@ -32,7 +32,10 @@ value: false - name: zen.view.grey-out-inactive-windows + cpptype: bool value: true + mirror: always + type: static - name: zen.view.show-newtab-button-top value: true diff --git a/src/widget/cocoa/VibrancyManager-mm.patch b/src/widget/cocoa/VibrancyManager-mm.patch index 214d2a3c1..00ea2b670 100644 --- a/src/widget/cocoa/VibrancyManager-mm.patch +++ b/src/widget/cocoa/VibrancyManager-mm.patch @@ -1,5 +1,5 @@ diff --git a/widget/cocoa/VibrancyManager.mm b/widget/cocoa/VibrancyManager.mm -index 5df70a63afb235d2db11712276bb63f756222a0f..8ba0bf1b046f58d9776981e0872a78144bed5139 100644 +index 5df70a63afb235d2db11712276bb63f756222a0f..a2865aa2748433cbfd956ae46d197200fbbcfadd 100644 --- a/widget/cocoa/VibrancyManager.mm +++ b/widget/cocoa/VibrancyManager.mm @@ -11,6 +11,7 @@ @@ -10,7 +10,17 @@ index 5df70a63afb235d2db11712276bb63f756222a0f..8ba0bf1b046f58d9776981e0872a7814 using namespace mozilla; -@@ -36,7 +37,23 @@ static NSVisualEffectMaterial VisualEffectMaterialForVibrancyType( +@@ -29,6 +30,9 @@ static NSVisualEffectState VisualEffectStateForVibrancyType( + case VibrancyType::Sidebar: + break; + } ++ if (!StaticPrefs::zen_view_grey_out_inactive_windows()) { ++ return NSVisualEffectStateActive; ++ } + return NSVisualEffectStateFollowsWindowActiveState; + } + +@@ -36,7 +40,23 @@ static NSVisualEffectMaterial VisualEffectMaterialForVibrancyType( VibrancyType aType) { switch (aType) { case VibrancyType::Sidebar: @@ -35,7 +45,7 @@ index 5df70a63afb235d2db11712276bb63f756222a0f..8ba0bf1b046f58d9776981e0872a7814 case VibrancyType::Titlebar: return NSVisualEffectMaterialTitlebar; } -@@ -76,6 +93,7 @@ static NSVisualEffectBlendingMode VisualEffectBlendingModeForVibrancyType( +@@ -76,6 +96,7 @@ - (NSView*)hitTest:(NSPoint)aPoint { - (void)prefChanged { self.blendingMode = VisualEffectBlendingModeForVibrancyType(mType); @@ -43,7 +53,7 @@ index 5df70a63afb235d2db11712276bb63f756222a0f..8ba0bf1b046f58d9776981e0872a7814 } @end -@@ -86,6 +104,7 @@ static void PrefChanged(const char* aPref, void* aClosure) { +@@ -86,6 +107,7 @@ static void PrefChanged(const char* aPref, void* aClosure) { static constexpr nsLiteralCString kObservedPrefs[] = { "widget.macos.sidebar-blend-mode.behind-window"_ns, "widget.macos.titlebar-blend-mode.behind-window"_ns, From 6562610df14b13e05b3a47a99c97b7dd5183623f Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Mon, 20 Apr 2026 01:02:58 +0200 Subject: [PATCH 14/31] no-bug: Add a flag to indicate new windows (gh-13323) --- .../tabbrowser/content/tabbrowser-js.patch | 107 +++++++++--------- .../sessionstore/ZenSessionManager.sys.mjs | 1 + 2 files changed, 55 insertions(+), 53 deletions(-) diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch index 9aaa78e55..5f81d07e5 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 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cbd4b1418a 100644 +index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..4f845f2175464ce24c2de0014ce102c574daf5dc 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js @@ -413,6 +413,7 @@ @@ -466,7 +466,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb ); tabsFragment.appendChild(tabGroup.node); } -@@ -4598,9 +4729,22 @@ +@@ -4598,9 +4729,23 @@ // to remove the old selected tab. if (tabToSelect) { let leftoverTab = this.selectedTab; @@ -483,13 +483,14 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb + } + } + } else { -+ gZenWorkspaces._keepSelectedTab = true; ++ gZenWorkspaces._keepSelectedTab = !window.__isNewZenWindow; } ++ delete window.__isNewZenWindow; + this._hasAlreadyInitializedZenSessionStore = true; if (tabs.length > 1 || !tabs[0].selected) { this._updateTabsAfterInsert(); -@@ -4791,11 +4935,14 @@ +@@ -4791,11 +4936,14 @@ if (ownerTab) { tab.owner = ownerTab; } @@ -505,7 +506,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb if ( !bulkOrderedOpen && ((openerTab && -@@ -4807,7 +4954,7 @@ +@@ -4807,7 +4955,7 @@ let lastRelatedTab = openerTab && this._lastRelatedTabMap.get(openerTab); let previousTab = lastRelatedTab || openerTab || this.selectedTab; @@ -514,7 +515,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb tabGroup = previousTab.group; } if ( -@@ -4823,7 +4970,7 @@ +@@ -4823,7 +4971,7 @@ previousTab.splitview ) + 1; } else if (previousTab.visible) { @@ -523,7 +524,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb } else if (previousTab == FirefoxViewHandler.tab) { elementIndex = 0; } -@@ -4851,14 +4998,14 @@ +@@ -4851,14 +4999,14 @@ } // Ensure index is within bounds. if (tab.pinned) { @@ -542,7 +543,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb if (pinned && !itemAfter?.pinned) { itemAfter = null; -@@ -4875,7 +5022,7 @@ +@@ -4875,7 +5023,7 @@ this.tabContainer._invalidateCachedTabs(); @@ -551,7 +552,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb if ( (this.isTab(itemAfter) && itemAfter.group == tabGroup) || this.isSplitViewWrapper(itemAfter) -@@ -4906,7 +5053,11 @@ +@@ -4906,7 +5054,11 @@ const tabContainer = pinned ? this.tabContainer.pinnedTabsContainer : this.tabContainer; @@ -563,7 +564,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb } if (tab.group?.collapsed) { -@@ -4921,6 +5072,7 @@ +@@ -4921,6 +5073,7 @@ if (pinned) { this._updateTabBarForPinnedTabs(); } @@ -571,7 +572,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb TabBarVisibility.update(); } -@@ -5469,6 +5621,7 @@ +@@ -5469,6 +5622,7 @@ telemetrySource, } = {} ) { @@ -579,7 +580,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb // When 'closeWindowWithLastTab' pref is enabled, closing all tabs // can be considered equivalent to closing the window. if ( -@@ -5558,6 +5711,7 @@ +@@ -5558,6 +5712,7 @@ if (lastToClose) { this.removeTab(lastToClose, aParams); } @@ -587,7 +588,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb } catch (e) { console.error(e); } -@@ -5603,6 +5757,14 @@ +@@ -5603,6 +5758,14 @@ return; } @@ -602,7 +603,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb let isVisibleTab = aTab.visible; // We have to sample the tab width now, since _beginRemoveTab might // end up modifying the DOM in such a way that aTab gets a new -@@ -5610,6 +5772,9 @@ +@@ -5610,6 +5773,9 @@ // state). let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width; let isLastTab = this.#isLastTabInWindow(aTab); @@ -612,7 +613,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb if ( !this._beginRemoveTab(aTab, { closeWindowFastpath: true, -@@ -5621,13 +5786,14 @@ +@@ -5621,13 +5787,14 @@ telemetrySource, }) ) { @@ -628,7 +629,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb let lockTabSizing = !this.tabContainer.verticalMode && !aTab.pinned && -@@ -5658,7 +5824,13 @@ +@@ -5658,7 +5825,13 @@ // We're not animating, so we can cancel the animation stopwatch. Glean.browserTabclose.timeAnim.cancel(aTab._closeTimeAnimTimerId); aTab._closeTimeAnimTimerId = null; @@ -643,7 +644,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb return; } -@@ -5792,7 +5964,7 @@ +@@ -5792,7 +5965,7 @@ closeWindowWithLastTab != null ? closeWindowWithLastTab : !window.toolbar.visible || @@ -652,7 +653,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb if (closeWindow) { // We've already called beforeunload on all the relevant tabs if we get here, -@@ -5816,6 +5988,7 @@ +@@ -5816,6 +5989,7 @@ newTab = true; } @@ -660,7 +661,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb aTab._endRemoveArgs = [closeWindow, newTab]; // swapBrowsersAndCloseOther will take care of closing the window without animation. -@@ -5856,13 +6029,7 @@ +@@ -5856,13 +6030,7 @@ aTab._mouseleave(); if (newTab) { @@ -675,7 +676,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb } else { TabBarVisibility.update(); } -@@ -5995,6 +6162,7 @@ +@@ -5995,6 +6163,7 @@ this.tabs[i]._tPos = i; } @@ -683,7 +684,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb if (!this._windowIsClosing) { // update tab close buttons state this.tabContainer._updateCloseButtons(); -@@ -6180,6 +6348,7 @@ +@@ -6180,6 +6349,7 @@ memory_after: await getTotalMemoryUsage(), time_to_unload_in_ms: timeElapsed, }); @@ -691,7 +692,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb } /** -@@ -6225,6 +6394,7 @@ +@@ -6225,6 +6395,7 @@ } let excludeTabs = new Set(aExcludeTabs); @@ -699,7 +700,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb // If this tab has a successor, it should be selectable, since // hiding or closing a tab removes that tab as a successor. -@@ -6237,15 +6407,22 @@ +@@ -6237,15 +6408,22 @@ !excludeTabs.has(aTab.owner) && Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose") ) { @@ -724,7 +725,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb let tab = this.tabContainer.findNextTab(aTab, { direction: 1, filter: _tab => remainingTabs.includes(_tab), -@@ -6259,7 +6436,7 @@ +@@ -6259,7 +6437,7 @@ } if (tab) { @@ -733,7 +734,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb } // If no qualifying visible tab was found, see if there is a tab in -@@ -6280,7 +6457,7 @@ +@@ -6280,7 +6458,7 @@ }); } @@ -742,7 +743,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb } _blurTab(aTab) { -@@ -6291,7 +6468,7 @@ +@@ -6291,7 +6469,7 @@ * @returns {boolean} * False if swapping isn't permitted, true otherwise. */ @@ -751,7 +752,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb // Do not allow transfering a private tab to a non-private window // and vice versa. if ( -@@ -6345,6 +6522,7 @@ +@@ -6345,6 +6523,7 @@ // fire the beforeunload event in the process. Close the other // window if this was its last tab. if ( @@ -759,7 +760,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb !remoteBrowser._beginRemoveTab(aOtherTab, { adoptedByTab: aOurTab, closeWindowWithLastTab: true, -@@ -6356,7 +6534,7 @@ +@@ -6356,7 +6535,7 @@ // If this is the last tab of the window, hide the window // immediately without animation before the docshell swap, to avoid // about:blank being painted. @@ -768,7 +769,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb if (closeWindow) { let win = aOtherTab.ownerGlobal; win.windowUtils.suppressAnimation(true); -@@ -6484,11 +6662,13 @@ +@@ -6484,11 +6663,13 @@ } // Finish tearing down the tab that's going away. @@ -782,7 +783,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb this.setTabTitle(aOurTab); -@@ -6690,10 +6870,10 @@ +@@ -6690,10 +6871,10 @@ SessionStore.deleteCustomTabValue(aTab, "hiddenBy"); } @@ -795,7 +796,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb aTab.selected || aTab.closing || // Tabs that are sharing the screen, microphone or camera cannot be hidden. -@@ -6753,7 +6933,8 @@ +@@ -6753,7 +6934,8 @@ * @param {object} [aOptions={}] * Key-value pairs that will be serialized into the features string. */ @@ -805,7 +806,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb if (this.tabs.length == 1) { return null; } -@@ -6770,7 +6951,7 @@ +@@ -6770,7 +6952,7 @@ // tell a new window to take the "dropped" tab let args = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray); args.appendElement(aTab.splitview ?? aTab); @@ -814,7 +815,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb private: PrivateBrowsingUtils.isWindowPrivate(window), features: Object.entries(aOptions) .map(([key, value]) => `${key}=${value}`) -@@ -6778,6 +6959,8 @@ +@@ -6778,6 +6960,8 @@ openerWindow: window, args, }); @@ -823,7 +824,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb } /** -@@ -6890,7 +7073,7 @@ +@@ -6890,7 +7074,7 @@ * `true` if element is a `` */ isTabGroup(element) { @@ -832,7 +833,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb } /** -@@ -6975,8 +7158,8 @@ +@@ -6975,8 +7159,8 @@ } // Don't allow mixing pinned and unpinned tabs. @@ -843,7 +844,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb } else { tabIndex = Math.max(tabIndex, this.pinnedTabCount); } -@@ -7005,13 +7188,19 @@ +@@ -7005,13 +7189,19 @@ this.#handleTabMove( element, () => { @@ -865,7 +866,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb let useAfter = false; if (this.isTab(element)) { useAfter = neighbor && tabIndex > element._tPos; -@@ -7076,23 +7265,31 @@ +@@ -7076,23 +7266,31 @@ #moveTabNextTo(element, targetElement, moveBefore = false, metricsContext) { if (this.isTabGroupLabel(targetElement)) { targetElement = targetElement.group; @@ -903,7 +904,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb } 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 -@@ -7105,12 +7302,35 @@ +@@ -7105,12 +7303,35 @@ // 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. @@ -940,7 +941,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb // We want to include the splitview wrapper if it's the targetElement, but // not in the case where we want to reverse tabs within the same splitview. -@@ -7119,6 +7339,7 @@ +@@ -7119,6 +7340,7 @@ } let getContainer = () => @@ -948,7 +949,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb element.pinned ? this.tabContainer.pinnedTabsContainer : this.tabContainer; -@@ -7127,11 +7348,15 @@ +@@ -7127,11 +7349,15 @@ element, () => { if (moveBefore) { @@ -965,7 +966,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb } }, metricsContext -@@ -7205,10 +7430,10 @@ +@@ -7205,10 +7431,10 @@ * @param {TabMetricsContext} [metricsContext] */ moveTabToExistingGroup(aTab, aGroup, metricsContext) { @@ -978,7 +979,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb return; } if (aTab.group && aTab.group.id === aGroup.id) { -@@ -7281,6 +7506,7 @@ +@@ -7281,6 +7507,7 @@ let state = { tabIndex: tab._tPos, @@ -986,7 +987,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb }; if (tab.visible) { state.elementIndex = tab.elementIndex; -@@ -7312,7 +7538,7 @@ +@@ -7312,7 +7539,7 @@ let changedSplitView = previousTabState.splitViewId != currentTabState.splitViewId; @@ -995,7 +996,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb tab.dispatchEvent( new CustomEvent("TabMove", { bubbles: true, -@@ -7354,6 +7580,10 @@ +@@ -7354,6 +7581,10 @@ moveActionCallback(); @@ -1006,7 +1007,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb // Clear tabs cache after moving nodes because the order of tabs may have // changed. this.tabContainer._invalidateCachedTabs(); -@@ -7404,7 +7634,22 @@ +@@ -7404,7 +7635,22 @@ * @returns {object} * The new tab in the current window, null if the tab couldn't be adopted. */ @@ -1030,7 +1031,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb // Swap the dropped tab with a new one we create and then close // it in the other window (making it seem to have moved between // windows). We also ensure that the tab we create to swap into has -@@ -7447,6 +7692,8 @@ +@@ -7447,6 +7693,8 @@ } params.skipLoad = true; let newTab = this.addWebTab("about:blank", params); @@ -1039,7 +1040,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb aTab.container.tabDragAndDrop.finishAnimateTabMove(); -@@ -8149,7 +8396,7 @@ +@@ -8149,7 +8397,7 @@ // preventDefault(). It will still raise the window if appropriate. return; } @@ -1048,7 +1049,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb window.focus(); aEvent.preventDefault(); } -@@ -8166,7 +8413,6 @@ +@@ -8166,7 +8414,6 @@ on_TabGroupCollapse(aEvent) { aEvent.target.tabs.forEach(tab => { @@ -1056,7 +1057,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb }); } -@@ -8500,7 +8746,9 @@ +@@ -8500,7 +8747,9 @@ let filter = this._tabFilters.get(tab); if (filter) { @@ -1066,7 +1067,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb let listener = this._tabListeners.get(tab); if (listener) { -@@ -9306,6 +9554,7 @@ +@@ -9306,6 +9555,7 @@ aWebProgress.isTopLevel ) { this.mTab.setAttribute("busy", "true"); @@ -1074,7 +1075,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb gBrowser._tabAttrModified(this.mTab, ["busy"]); this.mTab._notselectedsinceload = !this.mTab.selected; } -@@ -9386,6 +9635,7 @@ +@@ -9386,6 +9636,7 @@ // known defaults. Note we use the original URL since about:newtab // redirects to a prerendered page. const shouldRemoveFavicon = @@ -1082,7 +1083,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb !this.mBrowser.mIconURL && !ignoreBlank && !(originalLocation.spec in FAVICON_DEFAULTS); -@@ -9560,13 +9810,6 @@ +@@ -9560,13 +9811,6 @@ this.mBrowser.originalURI = aRequest.originalURI; } @@ -1096,7 +1097,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..1b2aacc43c3e3b9ef13a1984458fa2cb } let userContextId = this.mBrowser.getAttribute("usercontextid") || 0; -@@ -10450,7 +10693,7 @@ var TabContextMenu = { +@@ -10450,7 +10694,7 @@ var TabContextMenu = { ); contextUnpinSelectedTabs.hidden = !this.contextTab.pinned || !this.multiselected; diff --git a/src/zen/sessionstore/ZenSessionManager.sys.mjs b/src/zen/sessionstore/ZenSessionManager.sys.mjs index ae2321a76..f784e1656 100644 --- a/src/zen/sessionstore/ZenSessionManager.sys.mjs +++ b/src/zen/sessionstore/ZenSessionManager.sys.mjs @@ -897,6 +897,7 @@ export class nsZenSessionManager { const newState = { windows: [newWindow] }; this.log(`Cloning window with ${newWindow.tabs.length} tabs`); + aWindow.__isNewZenWindow = true; SessionStoreInternal._deferredInitialState = newState; SessionStoreInternal.initializeWindow(aWindow, newState); } From f828d2eb203a53896c6bb4a6c4e3f3fca994e170 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Mon, 20 Apr 2026 22:21:06 +0200 Subject: [PATCH 15/31] no-bug: Add more PGO training and enable clang plugins (gh-13325) --- .github/workflows/linux-release-build.yml | 33 ++++++++++- .github/workflows/macos-release-build.yml | 31 +++++++++- .../macos-universal-release-build.yml | 2 + .../workflows/twilight-release-schedule.yml | 2 +- .github/workflows/windows-profile-build.yml | 3 +- .github/workflows/windows-release-build.yml | 1 - configs/common/mozconfig | 9 +-- configs/linux/mozconfig | 10 +++- configs/macos/mozconfig | 15 +++-- configs/windows/mozconfig | 4 -- prefs/zen/split-view.yaml | 2 +- scripts/download_pgo_extended_corpus.py | 59 +++++++++++++++++++ .../base/content/browser-box-inc-xhtml.patch | 26 +++++--- src/browser/base/content/browser-xhtml.patch | 6 +- src/browser/base/content/zen-assets.inc.xhtml | 12 ---- .../base/content/zen-preloaded.inc.xhtml | 2 - .../moz-configure/lto-pgo-configure.patch | 12 +++- src/zen/common/ZenPreloadedScripts.js | 53 ++++++++++++++--- src/zen/common/modules/ZenStartup.mjs | 16 ----- .../common/styles/zen-single-components.css | 2 +- src/zen/drag-and-drop/ZenDragAndDrop.js | 16 ++--- src/zen/split-view/ZenViewSplitter.mjs | 16 ++--- 22 files changed, 240 insertions(+), 92 deletions(-) create mode 100644 scripts/download_pgo_extended_corpus.py diff --git a/.github/workflows/linux-release-build.yml b/.github/workflows/linux-release-build.yml index b92181af2..5e5a32bff 100644 --- a/.github/workflows/linux-release-build.yml +++ b/.github/workflows/linux-release-build.yml @@ -34,7 +34,6 @@ jobs: env: SCCACHE_GHA_ENABLED: ${{ inputs.use-sccache && 'true' || 'false' }} CARGO_TERM_COLOR: always - RUSTC_WRAPPER: ${{ inputs.use-sccache && 'sccache' || '' }} CARGO_INCREMENTAL: 0 name: Build Linux - ${{ matrix.arch }} @@ -120,6 +119,38 @@ jobs: ./mach --no-interactive bootstrap --application-choice browser cd .. + - name: Build (PGO stage 1 - generate) + if: ${{ matrix.arch == 'x86_64' }} + env: + SURFER_COMPAT: ${{ matrix.arch }} + ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }} + ZEN_GA_GENERATE_PROFILE: 1 + ZEN_SAFEBROWSING_API_KEY: ${{ secrets.ZEN_SAFEBROWSING_API_KEY }} + ZEN_MOZILLA_API_KEY: ${{ secrets.ZEN_MOZILLA_API_KEY }} + ZEN_GOOGLE_LOCATION_SERVICE_API_KEY: ${{ secrets.ZEN_GOOGLE_LOCATION_SERVICE_API_KEY }} + continue-on-error: true + run: | + export SURFER_PLATFORM="linux" + if [[ -n ${{ inputs.MOZ_BUILD_DATE }} ]];then + export MOZ_BUILD_DATE=${{ inputs.MOZ_BUILD_DATE }} + fi + bash .github/workflows/src/release-build.sh + + - name: Generate PGO profile data + if: ${{ matrix.arch == 'x86_64' }} + run: | + set -x + export DISPLAY=:2 + export LLVM_PROFDATA="$HOME/.mozbuild/clang/bin/llvm-profdata" + export JARLOG_FILE=en-US.log + mkdir -p "$HOME/artifact" + cd engine + ./mach python ../scripts/download_pgo_extended_corpus.py + ./mach package + ./mach python build/pgo/profileserver.py --extended-corpus ./pgo-extended-corpus + mv merged.profdata "$HOME/artifact/merged.profdata" + mv en-US.log "$HOME/artifact/en-US.log" + - name: Build env: SURFER_COMPAT: ${{ matrix.arch }} diff --git a/.github/workflows/macos-release-build.yml b/.github/workflows/macos-release-build.yml index a14aac90c..4be480468 100644 --- a/.github/workflows/macos-release-build.yml +++ b/.github/workflows/macos-release-build.yml @@ -35,7 +35,6 @@ jobs: env: SCCACHE_GHA_ENABLED: ${{ inputs.use-sccache && 'true' || 'false' }} CARGO_TERM_COLOR: always - RUSTC_WRAPPER: ${{ inputs.use-sccache && 'sccache' || '' }} CARGO_INCREMENTAL: 0 steps: - name: Checkout repository @@ -134,6 +133,36 @@ jobs: - name: Build language packs run: sh scripts/download-language-packs.sh + - name: Build Zen (PGO stage 1 - generate) + env: + SURFER_COMPAT: ${{ matrix.arch }} + ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }} + ZEN_GA_GENERATE_PROFILE: 1 + ZEN_SAFEBROWSING_API_KEY: ${{ secrets.ZEN_SAFEBROWSING_API_KEY }} + ZEN_MOZILLA_API_KEY: ${{ secrets.ZEN_MOZILLA_API_KEY }} + ZEN_GOOGLE_LOCATION_SERVICE_API_KEY: ${{ secrets.ZEN_GOOGLE_LOCATION_SERVICE_API_KEY }} + run: | + export SURFER_PLATFORM="darwin" + if [[ -n ${{ inputs.MOZ_BUILD_DATE }} ]];then + export MOZ_BUILD_DATE=${{ inputs.MOZ_BUILD_DATE }} + fi + bash .github/workflows/src/release-build.sh + + - name: Generate PGO profile data + env: + SURFER_COMPAT: ${{ matrix.arch }} + run: | + set -x + export LLVM_PROFDATA="$HOME/.mozbuild/clang/bin/llvm-profdata" + export JARLOG_FILE=en-US.log + mkdir -p "$HOME/artifact" + cd engine + ./mach python ../scripts/download_pgo_extended_corpus.py + ./mach package + ./mach python build/pgo/profileserver.py --extended-corpus ./pgo-extended-corpus + mv merged.profdata "$HOME/artifact/merged.profdata" + mv en-US.log "$HOME/artifact/en-US.log" + - name: Build Zen env: SURFER_COMPAT: ${{ matrix.arch }} diff --git a/.github/workflows/macos-universal-release-build.yml b/.github/workflows/macos-universal-release-build.yml index dbc2130f0..b4fea39a0 100644 --- a/.github/workflows/macos-universal-release-build.yml +++ b/.github/workflows/macos-universal-release-build.yml @@ -93,6 +93,7 @@ jobs: env: SURFER_MOZCONFIG_ONLY: true ZEN_RELEASE: 1 + ZEN_GA_DISABLE_PGO: true run: | npm run build cd engine @@ -232,6 +233,7 @@ jobs: - name: Package for mar env: JUST_MAR: true + ZEN_GA_DISABLE_PGO: true run: | # we don't need it anymore set -ex diff --git a/.github/workflows/twilight-release-schedule.yml b/.github/workflows/twilight-release-schedule.yml index de9e3ff1e..5b50f55c3 100644 --- a/.github/workflows/twilight-release-schedule.yml +++ b/.github/workflows/twilight-release-schedule.yml @@ -20,7 +20,7 @@ jobs: with: create_release: ${{ github.event_name != 'workflow_dispatch' && true || inputs.create_release }} update_branch: twilight - use-sccache: false + use-sccache: true update_version: false post-build: diff --git a/.github/workflows/windows-profile-build.yml b/.github/workflows/windows-profile-build.yml index 740c5fd3f..0984f2d37 100644 --- a/.github/workflows/windows-profile-build.yml +++ b/.github/workflows/windows-profile-build.yml @@ -93,7 +93,8 @@ jobs: echo "cd $workspace_dir" '' >> mozilla-build-run.sh echo 'export PATH=/c/mozilla-build/msys2/usr/bin:$PATH' '' >> mozilla-build-run.sh echo './mach --no-interactive bootstrap --application-choice browser' '' >> mozilla-build-run.sh - echo 'LLVM_PROFDATA=/c/Users/runneradmin/.mozbuild/clang/bin/llvm-profdata.exe JARLOG_FILE=en-US.log ./mach python build/pgo/profileserver.py --binary /c/artifact/zen/zen.exe' '' >> mozilla-build-run.sh + echo './mach python ../scripts/download_pgo_extended_corpus.py' '' >> mozilla-build-run.sh + echo 'LLVM_PROFDATA=/c/Users/runneradmin/.mozbuild/clang/bin/llvm-profdata.exe JARLOG_FILE=en-US.log ./mach python build/pgo/profileserver.py --binary /c/artifact/zen/zen.exe --extended-corpus ./pgo-extended-corpus --' '' >> mozilla-build-run.sh C:\mozilla-build\start-shell.bat $workspace_dir_current\mozilla-build-run.sh - name: Move profile data diff --git a/.github/workflows/windows-release-build.yml b/.github/workflows/windows-release-build.yml index dc054aef3..d2570dbfd 100644 --- a/.github/workflows/windows-release-build.yml +++ b/.github/workflows/windows-release-build.yml @@ -39,7 +39,6 @@ jobs: env: SCCACHE_GHA_ENABLED: ${{ inputs.use-sccache && 'true' || 'false' }} CARGO_TERM_COLOR: always - RUSTC_WRAPPER: ${{ inputs.use-sccache && 'sccache' || '' }} CARGO_INCREMENTAL: 0 strategy: fail-fast: false diff --git a/configs/common/mozconfig b/configs/common/mozconfig index ddb795b86..22b8e95c5 100644 --- a/configs/common/mozconfig +++ b/configs/common/mozconfig @@ -26,13 +26,15 @@ export MOZ_INCLUDE_SOURCE_INFO=1 ac_add_options --enable-application=browser -# Anything except 'SCCACHE_GHA_ENABLED == false' -if ! test "$SCCACHE_GHA_ENABLED" = "false"; then +if test "$SCCACHE_GHA_ENABLED" = "true"; then if test -x "$(command -v sccache)"; then ac_add_options --with-ccache=sccache elif test -f "$HOME/.mozbuild/sccache/sccache"; then ac_add_options --with-ccache="$HOME"/.mozbuild/sccache/sccache fi + + mk_add_options 'export RUSTC_WRAPPER=sccache' + mk_add_options 'export CCACHE_CPP2=yes' fi # add API keys if it exists on a file @@ -50,8 +52,7 @@ fi if test "$ZEN_RELEASE"; then - # TODO: Make this successful in builds - # ac_add_options --enable-clang-plugin + ac_add_options --enable-clang-plugin ac_add_options --enable-bootstrap=-sccache ac_add_options --enable-optimize diff --git a/configs/linux/mozconfig b/configs/linux/mozconfig index b15dcd399..9816e7580 100644 --- a/configs/linux/mozconfig +++ b/configs/linux/mozconfig @@ -18,8 +18,14 @@ if test "$ZEN_RELEASE"; then # Enable Profile Guided Optimization if ! test "$ZEN_GA_DISABLE_PGO"; then - export MOZ_PGO=1 - ac_add_options MOZ_PGO=1 + if test "$ZEN_GA_GENERATE_PROFILE"; then + mk_add_options "export MOZ_AUTOMATION_PACKAGE_GENERATED_SOURCES=0" + ac_add_options --enable-profile-generate=cross + else + ac_add_options --enable-profile-use=cross + ac_add_options --with-pgo-profile-path="$(echo ~)/artifact/merged.profdata" + ac_add_options --with-pgo-jarlog="$(echo ~)/artifact/en-US.log" + fi fi elif test "$SURFER_COMPAT" = "aarch64"; then ac_add_options --target=aarch64-linux-gnu diff --git a/configs/macos/mozconfig b/configs/macos/mozconfig index 317f6b4e8..3dd601a49 100644 --- a/configs/macos/mozconfig +++ b/configs/macos/mozconfig @@ -15,11 +15,15 @@ if test "$ZEN_RELEASE"; then fi if test "$ZEN_RELEASE"; then - if test "$ZEN_GA_DISABLE_PGO"; then - export ZEN_DUMMY=1 - else - export MOZ_PGO=1 - ac_add_options MOZ_PGO=1 + if ! test "$ZEN_GA_DISABLE_PGO"; then + if test "$ZEN_GA_GENERATE_PROFILE"; then + mk_add_options "export MOZ_AUTOMATION_PACKAGE_GENERATED_SOURCES=0" + ac_add_options --enable-profile-generate=cross + else + ac_add_options --enable-profile-use=cross + ac_add_options --with-pgo-profile-path="$(echo ~)/artifact/merged.profdata" + ac_add_options --with-pgo-jarlog="$(echo ~)/artifact/en-US.log" + fi fi fi @@ -30,7 +34,6 @@ if test "$SURFER_COMPAT" = "x86_64"; then ac_add_options --enable-wasm-avx fi else - ac_add_options --enable-clang-plugin ac_add_options --target=aarch64-apple-darwin if test "$ZEN_RELEASE"; then diff --git a/configs/windows/mozconfig b/configs/windows/mozconfig index 9290c08bc..065ed1291 100644 --- a/configs/windows/mozconfig +++ b/configs/windows/mozconfig @@ -22,10 +22,6 @@ if test "$ZEN_CROSS_COMPILING"; then fi fi -# We wrongly detect ccache on windows, which leads to build failures. -# This line should be removed once the detection is fixed. -ac_add_options --without-ccache - if test "$SURFER_COMPAT" = "x86_64"; then ac_add_options --target=x86_64-pc-windows-msvc ac_add_options --enable-eme=widevine,wmfcdm diff --git a/prefs/zen/split-view.yaml b/prefs/zen/split-view.yaml index aa02b6def..a950cb328 100644 --- a/prefs/zen/split-view.yaml +++ b/prefs/zen/split-view.yaml @@ -18,4 +18,4 @@ value: 350 - name: zen.splitView.drag-over-split-threshold - value: 25 + value: 40 diff --git a/scripts/download_pgo_extended_corpus.py b/scripts/download_pgo_extended_corpus.py new file mode 100644 index 000000000..f8a06190a --- /dev/null +++ b/scripts/download_pgo_extended_corpus.py @@ -0,0 +1,59 @@ +# 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/. + +import yaml +import os +import requests +import tarfile +import hashlib + +EXTENDED_CORPUS_KEY="pgo-extended-corpus" +TASKCLUSTER_PATH=os.path.join("taskcluster", "kinds", "fetch", "benchmarks.yml") + +def download_corpus(corpus_url, expected_sha256, output_path): + response = requests.get(corpus_url, stream=True) + response.raise_for_status() + + os.makedirs(output_path, exist_ok=True) + archive_path = os.path.join(output_path, "corpus.tar.gz") + + with open(archive_path, "wb") as f: + for chunk in response.iter_content(chunk_size=8192): + f.write(chunk) + + # Verify the SHA256 checksum + sha256 = hashlib.sha256() + with open(archive_path, "rb") as f: + for chunk in iter(lambda: f.read(8192), b""): + sha256.update(chunk) + if sha256.hexdigest() != expected_sha256: + os.remove(archive_path) + raise ValueError("SHA256 checksum does not match expected value.") + + print("Checksum verified ({}). Extracting corpus...".format(expected_sha256)) + with tarfile.open(archive_path, "r:gz") as tar: + tar.extractall(path=output_path) + + # rename "JetStream-[id]" to just "JetStream" + for item in os.listdir(output_path): + if item.startswith("JetStream-"): + os.rename(os.path.join(output_path, item), os.path.join(output_path, "JetStream")) + break + + # Clean up the downloaded archive + os.remove(archive_path) + print(f"Corpus downloaded and extracted to: {output_path}") + +def main(): + print("\n------------------------------------\n") + print("Fetching PGO extended corpus information from Taskcluster...") + with open(TASKCLUSTER_PATH, "r", encoding="utf-8") as f: + benchmarks = yaml.safe_load(f) + corpus_url = benchmarks[EXTENDED_CORPUS_KEY] + fetch_info = corpus_url["fetch"] + download_corpus(fetch_info["url"], fetch_info["sha256"], "pgo-extended-corpus") + print("\n------------------------------------\n") + +if __name__ == "__main__": + main() diff --git a/src/browser/base/content/browser-box-inc-xhtml.patch b/src/browser/base/content/browser-box-inc-xhtml.patch index 938d1881c..6f5f7ee91 100644 --- a/src/browser/base/content/browser-box-inc-xhtml.patch +++ b/src/browser/base/content/browser-box-inc-xhtml.patch @@ -1,32 +1,40 @@ diff --git a/browser/base/content/browser-box.inc.xhtml b/browser/base/content/browser-box.inc.xhtml -index d58fcdf99843d110b708f3fbf9fb317787fadfcf..ba37068c52b24c6ebcb835c59b43ca2f1621a001 100644 +index d58fcdf99843d110b708f3fbf9fb317787fadfcf..cfc2aad902641609c3804e615c4cb66ce65299b7 100644 --- a/browser/base/content/browser-box.inc.xhtml +++ b/browser/base/content/browser-box.inc.xhtml -@@ -3,6 +3,9 @@ +@@ -3,12 +3,22 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. ++#include navigator-toolbox.inc.xhtml + + + + diff --git a/src/browser/base/content/browser-xhtml.patch b/src/browser/base/content/browser-xhtml.patch index 9abce4268..0dfd8f916 100644 --- a/src/browser/base/content/browser-xhtml.patch +++ b/src/browser/base/content/browser-xhtml.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml -index b42287485c2baeabe831b0d54c6f09330b0caabd..6426bb6742401470e4e48b4049cd365e2a5952e8 100644 +index b42287485c2baeabe831b0d54c6f09330b0caabd..e404c2e028e24eb4fa9b97f143ba476c1b1461fd 100644 --- a/browser/base/content/browser.xhtml +++ b/browser/base/content/browser.xhtml @@ -19,6 +19,7 @@ @@ -21,12 +21,12 @@ index b42287485c2baeabe831b0d54c6f09330b0caabd..6426bb6742401470e4e48b4049cd365e # All sets except for popupsets (commands, keys, and stringbundles) -@@ -135,9 +138,11 @@ +@@ -135,9 +138,10 @@ +-#include navigator-toolbox.inc.xhtml + - #include navigator-toolbox.inc.xhtml #include browser-box.inc.xhtml + diff --git a/src/browser/base/content/zen-assets.inc.xhtml b/src/browser/base/content/zen-assets.inc.xhtml index b88b74cfe..f67426009 100644 --- a/src/browser/base/content/zen-assets.inc.xhtml +++ b/src/browser/base/content/zen-assets.inc.xhtml @@ -39,15 +39,3 @@ # file so that ESLint works correctly: # tools/lint/eslint/eslint-plugin-mozilla/lib/environments/browser-window.js - -# Scripts used all over the browser - - - - - - -s - - - diff --git a/src/browser/base/content/zen-preloaded.inc.xhtml b/src/browser/base/content/zen-preloaded.inc.xhtml index d7893b9e6..dd7e3e9e0 100644 --- a/src/browser/base/content/zen-preloaded.inc.xhtml +++ b/src/browser/base/content/zen-preloaded.inc.xhtml @@ -8,5 +8,3 @@ - - \ No newline at end of file diff --git a/src/build/moz-configure/lto-pgo-configure.patch b/src/build/moz-configure/lto-pgo-configure.patch index 5870f5f98..f91a32571 100644 --- a/src/build/moz-configure/lto-pgo-configure.patch +++ b/src/build/moz-configure/lto-pgo-configure.patch @@ -1,8 +1,16 @@ diff --git a/build/moz.configure/lto-pgo.configure b/build/moz.configure/lto-pgo.configure -index df2b0bf0081edfdc2c7bccaefc780d2b0c6555ff..8619fc5fbf284c7a5660d5b7a77494404e448e44 100644 +index df2b0bf0081edfdc2c7bccaefc780d2b0c6555ff..53a3b55de7650799e3730372e72ad7b4bb2eea03 100644 --- a/build/moz.configure/lto-pgo.configure +++ b/build/moz.configure/lto-pgo.configure -@@ -256,7 +256,6 @@ option( +@@ -234,6 +234,7 @@ def moz_pgo_rust(pgo, profile_use, profile_generate, c_compiler): + if c_compiler.type == "gcc": + die("Cannot use cross-language PGO with GCC.") + ++ log.info("Enabling cross-language PGO for Rust") + return True + + +@@ -256,7 +257,6 @@ option( help="Indicate that ld64 is free of symbol aliasing bugs", ) diff --git a/src/zen/common/ZenPreloadedScripts.js b/src/zen/common/ZenPreloadedScripts.js index 01fa01ddd..6c4265ce9 100644 --- a/src/zen/common/ZenPreloadedScripts.js +++ b/src/zen/common/ZenPreloadedScripts.js @@ -7,13 +7,52 @@ { Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenSpaceBookmarksStorage.js", this); - ChromeUtils.importESModule("chrome://browser/content/ZenStartup.mjs", { global: "current" }); - ChromeUtils.importESModule("resource:///modules/zen/ZenSpaceManager.mjs", { global: "current" }); - ChromeUtils.importESModule("chrome://browser/content/zen-components/ZenCompactMode.mjs", { global: "current" }); - ChromeUtils.importESModule("chrome://browser/content/ZenUIManager.mjs", { global: "current" }); - ChromeUtils.importESModule("chrome://browser/content/zen-components/ZenMods.mjs", { global: "current" }); - ChromeUtils.importESModule("chrome://browser/content/zen-components/ZenKeyboardShortcuts.mjs", { global: "current" }); - ChromeUtils.importESModule("chrome://browser/content/zen-components/ZenSessionStore.mjs", { global: "current" }); + let scripts = [ + "chrome://browser/content/ZenStartup.mjs", + "resource:///modules/zen/ZenSpaceManager.mjs", + "chrome://browser/content/zen-components/ZenCompactMode.mjs", + "chrome://browser/content/ZenUIManager.mjs", + "chrome://browser/content/zen-components/ZenMods.mjs", + "chrome://browser/content/zen-components/ZenKeyboardShortcuts.mjs", + "chrome://browser/content/zen-components/ZenSessionStore.mjs", + "chrome://browser/content/zen-components/ZenMediaController.mjs", + "chrome://browser/content/zen-components/ZenGlanceManager.mjs", + "chrome://browser/content/zen-components/ZenPinnedTabManager.mjs", + "chrome://browser/content/zen-components/ZenViewSplitter.mjs", + "chrome://browser/content/zen-components/ZenFolders.mjs", + "chrome://browser/content/zen-components/ZenEmojiPicker.mjs", + "chrome://browser/content/zen-components/ZenLiveFoldersUI.mjs", + ]; + + for (let script of scripts) { + ChromeUtils.importESModule(script, { global: "current" }); + } + + let customZenElements = [ + ["zen-folder", "chrome://browser/content/zen-components/ZenFolder.mjs"], + ["zen-download-animation", "chrome://browser/content/zen-components/ZenDownloadAnimation.mjs"], + ["zen-workspace-creation", "resource:///modules/zen/ZenSpaceCreation.mjs"], + ["zen-workspace", "resource:///modules/zen/ZenSpace.mjs"], + ["zen-workspace-icons", "resource:///modules/zen/ZenSpaceIcons.mjs"] + ]; + + document.addEventListener( + "DOMContentLoaded", + () => { + // Only sync-import widgets once the document has loaded. If a widget is + // used before DOMContentLoaded it will be imported and upgraded when + // registering the customElements.setElementCreationCallback(). + for (let [tag, script] of customZenElements) { + customElements.setElementCreationCallback( + tag, + function customElementCreationCallback() { + ChromeUtils.importESModule(script, { global: "current" }); + } + ); + } + }, + { once: true } + ); Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenDragAndDrop.js", this); } diff --git a/src/zen/common/modules/ZenStartup.mjs b/src/zen/common/modules/ZenStartup.mjs index a0611a8df..dd37719f8 100644 --- a/src/zen/common/modules/ZenStartup.mjs +++ b/src/zen/common/modules/ZenStartup.mjs @@ -17,7 +17,6 @@ class ZenStartup { init() { this.openWatermark(); - this.#changeSidebarLocation(); this.#zenInitBrowserLayout(); } @@ -147,21 +146,6 @@ class ZenStartup { }); } - #changeSidebarLocation() { - const kElementsToAppend = ["sidebar-splitter", "sidebar-box"]; - - const browser = document.getElementById("browser"); - browser.prepend(gNavToolbox); - - const sidebarPanelWrapper = document.getElementById("tabbrowser-tabbox"); - for (let id of kElementsToAppend) { - const elem = document.getElementById(id); - if (elem) { - sidebarPanelWrapper.prepend(elem); - } - } - } - #initUIComponents() { const kUIComponents = ["ZenProgressBar"]; for (let component of kUIComponents) { diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css index 28373c559..a2386a42d 100644 --- a/src/zen/common/styles/zen-single-components.css +++ b/src/zen/common/styles/zen-single-components.css @@ -686,7 +686,7 @@ /* Loading progress bar */ #zen-loading-progress-bar { - --zen-loading-progress-bar-color: color-mix(in srgb, var(--zen-primary-color), light-dark(rgba(0, 0, 0, 0.7), rgba(255, 255, 255, 0.7)) 70%); + --zen-loading-progress-bar-color: color-mix(in srgb, var(--zen-primary-color), light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.5)) 70%); position: fixed; diff --git a/src/zen/drag-and-drop/ZenDragAndDrop.js b/src/zen/drag-and-drop/ZenDragAndDrop.js index 30154a4db..b69087884 100644 --- a/src/zen/drag-and-drop/ZenDragAndDrop.js +++ b/src/zen/drag-and-drop/ZenDragAndDrop.js @@ -1267,24 +1267,18 @@ ) { let lastTab = gBrowser.tabs.at(-1); let pinnedTabsCount = gBrowser._numVisiblePinTabsWithoutCollapsed; - let isHoveringSeparator = - event.target.parentElement.classList.contains( - "zen-workspace-pinned-tabs-section" - ); // Only if there are no normal tabs to drop after showIndicatorUnderNewTabButton = lastTab.hasAttribute("zen-empty-tab"); let useLastPinned = - (showIndicatorUnderNewTabButton && - !(pinnedTabsCount - gBrowser._numZenEssentials) && - Services.prefs.getBoolPref("zen.view.show-newtab-button-top")) || - isHoveringSeparator; + (hoveringPeriphery || + (showIndicatorUnderNewTabButton && + !(pinnedTabsCount - gBrowser._numZenEssentials))) && + Services.prefs.getBoolPref("zen.view.show-newtab-button-top"); dropElement = (useLastPinned - ? this._tabbrowserTabs.ariaFocusableItems.at( - pinnedTabsCount ? pinnedTabsCount - 1 : 0 - ) + ? this._tabbrowserTabs.ariaFocusableItems.at(pinnedTabsCount) : this._tabbrowserTabs.ariaFocusableItems.at(-1)) || lastTab; } } diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs index 521ecd1d0..ce37c77ea 100644 --- a/src/zen/split-view/ZenViewSplitter.mjs +++ b/src/zen/split-view/ZenViewSplitter.mjs @@ -220,14 +220,8 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { } const group = this._data[groupIndex]; const tabIndex = group.tabs.indexOf(tab); - group.tabs.splice(tabIndex, 1); - this.resetTabState(tab, forUnsplit); - if (tab.group && tab.group.hasAttribute("split-view-group")) { - gBrowser.ungroupTab(tab); - this.#dispatchItemEvent("ZenTabRemovedFromSplit", tab); - } - if (group.tabs.length < 2) { + if (group.tabs.length < 3) { // We need to remove all remaining tabs from the group when unsplitting let remainingTabs = [...group.tabs]; // Copy array since we'll modify it if (!dontRebuildGrid) { @@ -243,6 +237,14 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { .removeAttribute("disabled"); } } else { + group.tabs.splice(tabIndex, 1); + + this.resetTabState(tab, forUnsplit); + if (tab.group && tab.group.hasAttribute("split-view-group")) { + gBrowser.ungroupTab(tab); + this.#dispatchItemEvent("ZenTabRemovedFromSplit", tab); + } + const node = this.getSplitNodeFromTab(tab); const toUpdate = this.removeNode(node); this.applyGridLayout(toUpdate); From 77dbc2090c1b2aa4036ad9ed795d5409fa5498c3 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Mon, 20 Apr 2026 23:15:23 +0200 Subject: [PATCH 16/31] no-bug: Fixed transparency not working after Firefox `150.0` (gh-13334) --- src/zen/common/styles/zen-browser-ui.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/zen/common/styles/zen-browser-ui.css b/src/zen/common/styles/zen-browser-ui.css index f80f6c245..6618d653e 100644 --- a/src/zen/common/styles/zen-browser-ui.css +++ b/src/zen/common/styles/zen-browser-ui.css @@ -4,6 +4,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +body, #tabbrowser-tabpanels { background: transparent !important; } From 1f77fe2ea7707b950fa707a01e40dc232f1bc0d9 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Tue, 21 Apr 2026 00:05:50 +0200 Subject: [PATCH 17/31] no-bug: Run less color blending for macos and windows (gh-13335) --- .../common/styles/zen-browser-container.css | 2 +- src/zen/spaces/ZenGradientGenerator.mjs | 28 +++++++++++++++++-- src/zen/split-view/ZenViewSplitter.mjs | 2 +- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/zen/common/styles/zen-browser-container.css b/src/zen/common/styles/zen-browser-container.css index a8de2b24c..48701b785 100644 --- a/src/zen/common/styles/zen-browser-container.css +++ b/src/zen/common/styles/zen-browser-container.css @@ -18,7 +18,7 @@ } &[transparent="true"] { - background: light-dark(rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.1)); + background: light-dark(rgba(255, 255, 255, 0.6), rgba(255, 255, 255, 0.1)); } } diff --git a/src/zen/spaces/ZenGradientGenerator.mjs b/src/zen/spaces/ZenGradientGenerator.mjs index c4ebebf78..b46e3f078 100644 --- a/src/zen/spaces/ZenGradientGenerator.mjs +++ b/src/zen/spaces/ZenGradientGenerator.mjs @@ -1258,10 +1258,10 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { let colorToBlendOpacity; if (this.isMica) { colorToBlend = this.isDarkMode ? [0, 0, 0] : [255, 255, 255]; - colorToBlendOpacity = 0.25; + colorToBlendOpacity = 0.12; } else if (AppConstants.platform === "macosx") { colorToBlend = [255, 255, 255]; - colorToBlendOpacity = 0.35; + colorToBlendOpacity = 0.18; } if (colorToBlend) { const blendedAlpha = Math.min( @@ -1473,7 +1473,15 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { * @returns {string} The primary color in hex format. */ getAccentColorForUI(accentColor) { - return `rgb(${accentColor[0]}, ${accentColor[1]}, ${accentColor[2]})`; + const [h, s, l] = this.rgbToHsl(...accentColor); + if (s < 0.1) { + return `rgb(${accentColor[0]}, ${accentColor[1]}, ${accentColor[2]})`; + } + const saturation = Math.min(1, s + 0.3); + const targetLightness = this.isDarkMode ? 0.62 : 0.42; + const lightness = l * 0.4 + targetLightness * 0.6; + const [r, g, b] = this.hslToRgb(h / 360, saturation, lightness); + return `rgb(${r}, ${g}, ${b})`; } getMostDominantColor(allColors) { @@ -1757,6 +1765,20 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { "--toolbar-color-scheme", isDarkMode ? "dark" : "light" ); + // Tint toolbar elements with an accent-hued color toned against the + // current mode — dark mode gets a light tint, light mode a dark tint. + const tintTarget = isDarkMode ? [255, 255, 255] : [0, 0, 0]; + const [tr, tg, tb] = this.blendColors(dominantColor, tintTarget, 25); + const elementBgAlpha = isDarkMode ? 0.18 : 0.1; + const elementHoverAlpha = isDarkMode ? 0.28 : 0.16; + docElement.style.setProperty( + "--zen-toolbar-element-bg", + `rgba(${tr}, ${tg}, ${tb}, ${elementBgAlpha})` + ); + docElement.style.setProperty( + "--zen-toolbar-element-bg-hover", + `rgba(${tr}, ${tg}, ${tb}, ${elementHoverAlpha})` + ); } if (!skipUpdate) { diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs index ce37c77ea..92639db26 100644 --- a/src/zen/split-view/ZenViewSplitter.mjs +++ b/src/zen/split-view/ZenViewSplitter.mjs @@ -1166,7 +1166,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { insetUpdateContextMenuItems() { const contentAreaContextMenu = document.getElementById("tabContextMenu"); contentAreaContextMenu.addEventListener("popupshowing", () => { - let contextTab = TabContextMenu.contextTab; + let contextTab = TabContextMenu.contextTab || gBrowser.selectedTab; let selectedTabs = contextTab.multiselected ? gBrowser.selectedTabs : [contextTab]; From 014eabed3cbdbfd0a4cf07c75d22d0c84cb6f130 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Tue, 21 Apr 2026 01:18:48 +0200 Subject: [PATCH 18/31] no-bug: Fixed loading bar appearing twice (gh-13337) --- prefs/zen/glance.yaml | 2 +- src/zen/common/sys/ui/ZenProgressBar.sys.mjs | 17 ++++++++++++++--- src/zen/sessionstore/ZenSessionManager.sys.mjs | 11 +++++++---- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/prefs/zen/glance.yaml b/prefs/zen/glance.yaml index cf73cddb9..5788dbca1 100644 --- a/prefs/zen/glance.yaml +++ b/prefs/zen/glance.yaml @@ -15,7 +15,7 @@ value: "alt" # ctrl, alt, shift - name: zen.glance.animation-duration - value: 300 # in milliseconds + value: 350 # in milliseconds - name: zen.glance.deactivate-docshell-during-animation value: false diff --git a/src/zen/common/sys/ui/ZenProgressBar.sys.mjs b/src/zen/common/sys/ui/ZenProgressBar.sys.mjs index d1add0fc6..511c68c37 100644 --- a/src/zen/common/sys/ui/ZenProgressBar.sys.mjs +++ b/src/zen/common/sys/ui/ZenProgressBar.sys.mjs @@ -10,6 +10,7 @@ export class ZenProgressBar extends ZenUIComponent { #element = null; #loadingTab = null; #longLoadTimer = null; + #promise = null; init() { this.listenBrowserTabsProgress(); @@ -60,7 +61,8 @@ export class ZenProgressBar extends ZenUIComponent { return this.#element; } - #checkBrowserProgress(webProgress) { + async #checkBrowserProgress(webProgress) { + await this.#promise; const window = this.window; const gBrowser = window.gBrowser; const tab = gBrowser.getTabForBrowser(webProgress); @@ -74,7 +76,7 @@ export class ZenProgressBar extends ZenUIComponent { } } - #hideProgressBar() { + #hideProgressBar(aInstant = false) { const progressBar = this.#element; const window = this.window; if (this.#longLoadTimer) { @@ -86,12 +88,15 @@ export class ZenProgressBar extends ZenUIComponent { if (!progressBar) { return; } + let { promise, resolve } = Promise.withResolvers(); + this.#promise = promise; const callback = () => { delete progressBar._loadingTab; progressBar.remove(); this.#element = null; + resolve(); }; - if (this.window.gReduceMotion) { + if (this.window.gReduceMotion || aInstant) { callback(); return; } @@ -113,6 +118,11 @@ export class ZenProgressBar extends ZenUIComponent { if (this.#loadingTab === aTab) { return; } + if (this.#element) { + return; + } + let { promise, resolve } = Promise.withResolvers(); + this.#promise = promise; this.#loadingTab = aTab; const progressBar = this.#progressBar; progressBar.removeAttribute("fade-out"); @@ -123,5 +133,6 @@ export class ZenProgressBar extends ZenUIComponent { } this.#longLoadTimer = null; }, WAIT_BEFORE_SHOWING_LONG_LOAD); + resolve(); } } diff --git a/src/zen/sessionstore/ZenSessionManager.sys.mjs b/src/zen/sessionstore/ZenSessionManager.sys.mjs index f784e1656..39f2d0eb2 100644 --- a/src/zen/sessionstore/ZenSessionManager.sys.mjs +++ b/src/zen/sessionstore/ZenSessionManager.sys.mjs @@ -290,10 +290,13 @@ export class nsZenSessionManager { console.error("ZenSessionManager: Failed to read session file", e); } this.#sidebar = this._dataFromFile || {}; - if (!this.#sidebar.spaces?.length && !this._shouldRunMigration) { + if ( + !this.#sidebarWithoutCloning.spaces?.length && + !this._shouldRunMigration + ) { this.log( "No spaces data found in session file, running migration", - this.#sidebar + this.#sidebarWithoutCloning ); // If we have no spaces data, we should run migration // to restore them from the database. Note we also do a @@ -304,7 +307,7 @@ export class nsZenSessionManager { if ( Services.prefs.getBoolPref("zen.session-store.log-tab-entries", false) ) { - for (const tab of this.#sidebar.tabs || []) { + for (const tab of this.#sidebarWithoutCloning.tabs || []) { this.log("Tab entry in session file:", tab); } } @@ -492,7 +495,7 @@ export class nsZenSessionManager { delete this._migrationData?.recoveryData; // Restore spaces into the sidebar object if we don't // have any yet. - if (!this.#sidebar.spaces?.length) { + if (!this.#sidebarWithoutCloning.spaces?.length) { this.#sidebar = { ...this.#sidebar, spaces: this._migrationData?.spaces || [], From 1753d8855c80dd8c03fc2ef493ca570cc17208fb Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Tue, 21 Apr 2026 10:41:53 +0200 Subject: [PATCH 19/31] no-bug: Fixed trying to update without verified MAR channels (gh-13341) --- package-lock.json | 8 ++++---- package.json | 2 +- src/zen/common/modules/ZenUIManager.mjs | 2 +- src/zen/common/styles/zen-omnibox.css | 8 ++++---- src/zen/sessionstore/ZenWindowSync.sys.mjs | 18 +++++++++++++++++- src/zen/tabs/zen-tabs/vertical-tabs.css | 1 + 6 files changed, 28 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index e92095f25..353ce847b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "devDependencies": { "@babel/preset-typescript": "^7.27.0", "@zen-browser/prettier": "^3.9.3", - "@zen-browser/surfer": "^1.14.3", + "@zen-browser/surfer": "^1.14.4", "formal-git": "^1.2.9", "globals": "^16.3.0", "husky": "^9.1.7", @@ -868,9 +868,9 @@ } }, "node_modules/@zen-browser/surfer": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.14.3.tgz", - "integrity": "sha512-AjJx7jedNSSP5WRWsG3W5fUxYSaWlY3nir/MZ2RFS+C0/rs6Uj+qpOVlMu6ZrQf9cr9r13e33nP5GGhSWbGOSA==", + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.14.4.tgz", + "integrity": "sha512-9PA3Z/wJL/wCbjAuy51N1LsOgd/5dIyZOJ+Sn81S6mm/3g5yZhrWMxcwugH2p6ULp/G4wu+3sCmd39Jrj0ccWg==", "dev": true, "license": "MPL-2.0", "dependencies": { diff --git a/package.json b/package.json index cff1d55eb..e05332468 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "devDependencies": { "@babel/preset-typescript": "^7.27.0", "@zen-browser/prettier": "^3.9.3", - "@zen-browser/surfer": "^1.14.3", + "@zen-browser/surfer": "^1.14.4", "formal-git": "^1.2.9", "globals": "^16.3.0", "husky": "^9.1.7", diff --git a/src/zen/common/modules/ZenUIManager.mjs b/src/zen/common/modules/ZenUIManager.mjs index fa9fe5591..5cd2ba2e8 100644 --- a/src/zen/common/modules/ZenUIManager.mjs +++ b/src/zen/common/modules/ZenUIManager.mjs @@ -264,7 +264,7 @@ window.gZenUIManager = { ); gURLBar.style.setProperty( "--zen-urlbar-width", - `${Math.min(window.innerWidth / 2, 750)}px` + `${Math.min(window.innerWidth / 1.5, 750)}px` ); gZenVerticalTabsManager.actualWindowButtons.removeAttribute( "zen-has-hover" diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css index 0a29c1936..9b7b1efd1 100644 --- a/src/zen/common/styles/zen-omnibox.css +++ b/src/zen/common/styles/zen-omnibox.css @@ -268,7 +268,7 @@ background-color: var(--zen-urlbar-background-transparent, var(--zen-urlbar-background-base)) !important; box-shadow: 0 30px 140px -15px light-dark(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.6)) !important; backdrop-filter: none !important; - outline: 0.5px solid light-dark(rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.2)) !important; + outline: 0.5px solid light-dark(rgba(0, 0, 0, 0.2), rgba(255, 255, 255, 0.2)) !important; outline-offset: var(--zen-urlbar-outline-offset) !important; /* stylelint-disable-next-line media-query-no-invalid */ @@ -300,7 +300,7 @@ :root[zen-single-toolbar="true"] { --urlbar-icon-border-radius: 8px !important; - --urlbar-inner-border-radius: var(--toolbarbutton-border-radius) !important; + --urlbar-inner-border-radius: 6px !important; #identity-permission-box > *:not(#zen-site-data-icon-button) { visibility: collapse; @@ -517,7 +517,7 @@ margin-left: 0 !important; margin-right: 12px !important; padding: 6px !important; - border-radius: 4px !important; + border-radius: 3px !important; } .urlbarView-userContext { @@ -635,7 +635,7 @@ } &[selected] { - --zen-selected-bg: color-mix(in srgb, var(--zen-primary-color) 55%, light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.2)) 50%); + --zen-selected-bg: color-mix(in srgb, var(--zen-primary-color) 50%, light-dark(rgba(0, 0, 0, 0.2), rgba(255, 255, 255, 0.2))); --zen-selected-color: color-mix(in srgb, var(--zen-selected-bg), black 30%); background-color: var(--zen-selected-bg) !important; diff --git a/src/zen/sessionstore/ZenWindowSync.sys.mjs b/src/zen/sessionstore/ZenWindowSync.sys.mjs index b18f3dadc..00b66f2ae 100644 --- a/src/zen/sessionstore/ZenWindowSync.sys.mjs +++ b/src/zen/sessionstore/ZenWindowSync.sys.mjs @@ -297,6 +297,18 @@ class nsZenWindowSync { if (tab.pinned && !tab._zenPinnedInitialState) { await this.setPinnedTabState(tab); } + // Lets clear extra values to save some memory, we only really + // care about the URL and title for the initial state, and we want + // to avoid keeping the whole session history around. + if (tab._zenPinnedInitialState) { + tab._zenPinnedInitialState = { + ...tab._zenPinnedInitialState, + entry: { + url: tab._zenPinnedInitialState.entry.url, + title: tab._zenPinnedInitialState.entry.title, + }, + }; + } if ( !lazy.gWindowSyncEnabled || (lazy.gSyncOnlyPinnedTabs && !tab.pinned) @@ -1215,8 +1227,12 @@ class nsZenWindowSync { activeIndex--; activeIndex = Math.min(activeIndex, entries.length - 1); activeIndex = Math.max(activeIndex, 0); + let entryToUse = (entries[activeIndex] || entries[0]) ?? null; const initialState = { - entry: (entries[activeIndex] || entries[0]) ?? null, + entry: { + url: entryToUse?.url, + title: entryToUse?.title, + }, image, }; this.#runOnAllWindows(null, win => { diff --git a/src/zen/tabs/zen-tabs/vertical-tabs.css b/src/zen/tabs/zen-tabs/vertical-tabs.css index f3d5777e7..389f8bbdd 100644 --- a/src/zen/tabs/zen-tabs/vertical-tabs.css +++ b/src/zen/tabs/zen-tabs/vertical-tabs.css @@ -353,6 +353,7 @@ &:-moz-broken { content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100'%3E%3C/svg%3E") !important; background: color-mix(in srgb, var(--zen-primary-color) 80%, light-dark(rgb(0, 0, 0), rgb(255, 255, 255))); + opacity: 0.5; } } From c2d45162e02d57a70bcbbc5680608f3a7051683d Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Tue, 21 Apr 2026 22:26:50 +0200 Subject: [PATCH 20/31] no-bug: New Crowdin updates (gh-13349) --- .../browser/preferences/zen-preferences.ftl | 1 + locales/ar/browser/browser/zen-general.ftl | 1 + locales/ar/browser/browser/zen-split-view.ftl | 5 ++-- .../ar/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/bg/browser/browser/zen-general.ftl | 1 + locales/bg/browser/browser/zen-split-view.ftl | 3 ++- .../bg/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/bs/browser/browser/zen-general.ftl | 1 + locales/bs/browser/browser/zen-split-view.ftl | 3 ++- .../bs/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/ca/browser/browser/zen-general.ftl | 1 + locales/ca/browser/browser/zen-split-view.ftl | 2 +- .../ca/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 5 ++-- locales/cs/browser/browser/zen-general.ftl | 13 ++++++----- locales/cs/browser/browser/zen-menubar.ftl | 2 +- locales/cs/browser/browser/zen-split-view.ftl | 8 +++---- .../cs/browser/browser/zen-vertical-tabs.ftl | 3 +++ locales/cs/browser/browser/zen-workspaces.ftl | 4 ++-- .../browser/preferences/zen-preferences.ftl | 1 + locales/cy/browser/browser/zen-general.ftl | 1 + locales/cy/browser/browser/zen-split-view.ftl | 5 ++-- .../cy/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/da/browser/browser/zen-general.ftl | 1 + locales/da/browser/browser/zen-split-view.ftl | 5 ++-- .../da/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/de/browser/browser/zen-general.ftl | 1 + locales/de/browser/browser/zen-split-view.ftl | 6 ++--- .../de/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 5 ++-- locales/el/browser/browser/zen-general.ftl | 13 ++++++----- locales/el/browser/browser/zen-menubar.ftl | 2 +- locales/el/browser/browser/zen-split-view.ftl | 5 ++-- .../el/browser/browser/zen-vertical-tabs.ftl | 7 ++++-- .../browser/preferences/zen-preferences.ftl | 1 + locales/en-GB/browser/browser/zen-general.ftl | 1 + .../en-GB/browser/browser/zen-split-view.ftl | 3 ++- .../browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/es-ES/browser/browser/zen-general.ftl | 1 + .../es-ES/browser/browser/zen-split-view.ftl | 6 ++--- .../browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/et/browser/browser/zen-general.ftl | 1 + locales/et/browser/browser/zen-split-view.ftl | 5 ++-- .../et/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/eu/browser/browser/zen-general.ftl | 1 + locales/eu/browser/browser/zen-split-view.ftl | 2 +- .../eu/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/fa/browser/browser/zen-general.ftl | 1 + locales/fa/browser/browser/zen-split-view.ftl | 3 ++- .../fa/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/fi/browser/browser/zen-general.ftl | 1 + locales/fi/browser/browser/zen-split-view.ftl | 5 ++-- .../fi/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/fr/browser/browser/zen-general.ftl | 1 + locales/fr/browser/browser/zen-split-view.ftl | 5 ++-- .../fr/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/ga-IE/browser/browser/zen-general.ftl | 1 + .../ga-IE/browser/browser/zen-split-view.ftl | 5 ++-- .../browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/he/browser/browser/zen-general.ftl | 1 + locales/he/browser/browser/zen-split-view.ftl | 5 ++-- .../he/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/hu/browser/browser/zen-general.ftl | 1 + locales/hu/browser/browser/zen-split-view.ftl | 5 ++-- .../hu/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/id/browser/browser/zen-general.ftl | 1 + locales/id/browser/browser/zen-split-view.ftl | 5 ++-- .../id/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 17 +++++++------- locales/is/browser/browser/zen-general.ftl | 1 + locales/is/browser/browser/zen-split-view.ftl | 7 +++--- .../is/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/it/browser/browser/zen-general.ftl | 1 + locales/it/browser/browser/zen-split-view.ftl | 3 ++- .../it/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/ja/browser/browser/zen-general.ftl | 1 + locales/ja/browser/browser/zen-split-view.ftl | 5 ++-- .../ja/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/ko/browser/browser/zen-general.ftl | 1 + locales/ko/browser/browser/zen-split-view.ftl | 5 ++-- .../ko/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/lt/browser/browser/zen-general.ftl | 1 + locales/lt/browser/browser/zen-split-view.ftl | 8 +++---- .../lt/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 3 ++- locales/nb/browser/browser/zen-general.ftl | 23 ++++++++++--------- locales/nb/browser/browser/zen-split-view.ftl | 5 ++-- .../nb/browser/browser/zen-vertical-tabs.ftl | 3 +++ locales/nb/browser/browser/zen-welcome.ftl | 2 +- .../browser/preferences/zen-preferences.ftl | 1 + locales/nl/browser/browser/zen-general.ftl | 3 ++- locales/nl/browser/browser/zen-menubar.ftl | 2 +- locales/nl/browser/browser/zen-split-view.ftl | 5 ++-- .../nl/browser/browser/zen-vertical-tabs.ftl | 7 ++++-- locales/nl/browser/browser/zen-workspaces.ftl | 4 ++-- .../browser/preferences/zen-preferences.ftl | 1 + locales/nn-NO/browser/browser/zen-general.ftl | 1 + .../nn-NO/browser/browser/zen-split-view.ftl | 3 ++- .../browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 3 ++- locales/pl/browser/browser/zen-general.ftl | 1 + locales/pl/browser/browser/zen-split-view.ftl | 2 +- .../pl/browser/browser/zen-vertical-tabs.ftl | 5 +++- locales/pl/browser/browser/zen-workspaces.ftl | 2 +- .../browser/preferences/zen-preferences.ftl | 1 + locales/pt-BR/browser/browser/zen-general.ftl | 1 + .../pt-BR/browser/browser/zen-split-view.ftl | 4 ++-- .../browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 5 ++-- locales/pt-PT/browser/browser/zen-general.ftl | 13 ++++++----- locales/pt-PT/browser/browser/zen-menubar.ftl | 2 +- .../pt-PT/browser/browser/zen-split-view.ftl | 5 ++-- .../browser/browser/zen-vertical-tabs.ftl | 11 +++++---- .../pt-PT/browser/browser/zen-workspaces.ftl | 4 ++-- .../browser/preferences/zen-preferences.ftl | 1 + locales/ro/browser/browser/zen-general.ftl | 1 + locales/ro/browser/browser/zen-split-view.ftl | 3 ++- .../ro/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/ru/browser/browser/zen-general.ftl | 1 + locales/ru/browser/browser/zen-split-view.ftl | 7 +++--- .../ru/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/sk/browser/browser/zen-general.ftl | 1 + locales/sk/browser/browser/zen-split-view.ftl | 3 ++- .../sk/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/sv-SE/browser/browser/zen-general.ftl | 1 + .../sv-SE/browser/browser/zen-split-view.ftl | 6 ++--- .../browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/th/browser/browser/zen-general.ftl | 1 + locales/th/browser/browser/zen-split-view.ftl | 3 ++- .../th/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/tr/browser/browser/zen-general.ftl | 1 + locales/tr/browser/browser/zen-split-view.ftl | 6 ++--- .../tr/browser/browser/zen-vertical-tabs.ftl | 5 +++- .../browser/preferences/zen-preferences.ftl | 1 + locales/uk/browser/browser/zen-general.ftl | 1 + locales/uk/browser/browser/zen-split-view.ftl | 6 +++-- .../uk/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 1 + locales/vi/browser/browser/zen-general.ftl | 1 + locales/vi/browser/browser/zen-split-view.ftl | 5 ++-- .../vi/browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 11 +++++---- locales/zh-CN/browser/browser/zen-general.ftl | 1 + .../zh-CN/browser/browser/zen-split-view.ftl | 4 ++-- .../browser/browser/zen-vertical-tabs.ftl | 3 +++ .../browser/preferences/zen-preferences.ftl | 23 ++++++++++--------- locales/zh-TW/browser/browser/zen-general.ftl | 11 +++++---- .../zh-TW/browser/browser/zen-split-view.ftl | 5 ++-- .../browser/browser/zen-vertical-tabs.ftl | 3 +++ .../zh-TW/browser/browser/zen-workspaces.ftl | 10 ++++---- 174 files changed, 407 insertions(+), 177 deletions(-) diff --git a/locales/ar/browser/browser/preferences/zen-preferences.ftl b/locales/ar/browser/browser/preferences/zen-preferences.ftl index 14e96263f..c8d4332a5 100644 --- a/locales/ar/browser/browser/preferences/zen-preferences.ftl +++ b/locales/ar/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = قلب DOM zen-devtools-toggle-accessibility-shortcut = قلب إمكانية الوصول zen-close-all-unpinned-tabs-shortcut = إغلاق جميع علامات التبويب الغير مثبتة zen-new-unsynced-window-shortcut = New Unsynced Window +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/ar/browser/browser/zen-general.ftl b/locales/ar/browser/browser/zen-general.ftl index 997a14a2b..688288f1b 100644 --- a/locales/ar/browser/browser/zen-general.ftl +++ b/locales/ar/browser/browser/zen-general.ftl @@ -52,6 +52,7 @@ zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL. zen-tabs-renamed = تم تغيير اسم التبويب بنجاح! zen-background-tab-opened-toast = تم فتح علامة تبويب خلفية جديدة! zen-workspace-renamed-toast = تم تغيير اسم مساحة العمل بنجاح! +zen-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = الوضع المدمج .tooltiptext = تبديل الوضع المدمج diff --git a/locales/ar/browser/browser/zen-split-view.ftl b/locales/ar/browser/browser/zen-split-view.ftl index 6539c2f0b..281cc5cfd 100644 --- a/locales/ar/browser/browser/zen-split-view.ftl +++ b/locales/ar/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] تبويب تقسيم (عدة علامات تبويب محددة مطلوبة) - *[other] تقسيم { $tabCount } علامات التبويب + [-1] Split out tab + [1] Add split view... + *[other] Join { $tabCount } Tabs } .accesskey = س zen-split-link = diff --git a/locales/ar/browser/browser/zen-vertical-tabs.ftl b/locales/ar/browser/browser/zen-vertical-tabs.ftl index 47898b5db..ab6a38a17 100644 --- a/locales/ar/browser/browser/zen-vertical-tabs.ftl +++ b/locales/ar/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = إخفاء كليهما .accesskey = خ +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = مجلّد جديد .accesskey = ن diff --git a/locales/bg/browser/browser/preferences/zen-preferences.ftl b/locales/bg/browser/browser/preferences/zen-preferences.ftl index da9d313b4..ed26f72b8 100644 --- a/locales/bg/browser/browser/preferences/zen-preferences.ftl +++ b/locales/bg/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toggle DOM zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs zen-new-unsynced-window-shortcut = New Unsynced Window +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/bg/browser/browser/zen-general.ftl b/locales/bg/browser/browser/zen-general.ftl index ead213776..3e7defe97 100644 --- a/locales/bg/browser/browser/zen-general.ftl +++ b/locales/bg/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Адресът на закачения раздел б zen-tabs-renamed = Разделът беше успешно преименуван! zen-background-tab-opened-toast = Отворен е нов раздел на заден план! zen-workspace-renamed-toast = Работното пространство беше преименувано успешно! +zen-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Компактен изглед .tooltiptext = Превключи компактен режим diff --git a/locales/bg/browser/browser/zen-split-view.ftl b/locales/bg/browser/browser/zen-split-view.ftl index 8fbcd79c2..e09ec8107 100644 --- a/locales/bg/browser/browser/zen-split-view.ftl +++ b/locales/bg/browser/browser/zen-split-view.ftl @@ -5,7 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Join Tab (multiple selected tabs needed) + [-1] Split out tab + [1] Add split view... *[other] Join { $tabCount } Tabs } .accesskey = S diff --git a/locales/bg/browser/browser/zen-vertical-tabs.ftl b/locales/bg/browser/browser/zen-vertical-tabs.ftl index ff8a3775c..9989c7666 100644 --- a/locales/bg/browser/browser/zen-vertical-tabs.ftl +++ b/locales/bg/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Hide both .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = New Folder .accesskey = N diff --git a/locales/bs/browser/browser/preferences/zen-preferences.ftl b/locales/bs/browser/browser/preferences/zen-preferences.ftl index da9d313b4..ed26f72b8 100644 --- a/locales/bs/browser/browser/preferences/zen-preferences.ftl +++ b/locales/bs/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toggle DOM zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs zen-new-unsynced-window-shortcut = New Unsynced Window +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/bs/browser/browser/zen-general.ftl b/locales/bs/browser/browser/zen-general.ftl index 21d9a7475..709b4575f 100644 --- a/locales/bs/browser/browser/zen-general.ftl +++ b/locales/bs/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ 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-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Compact Mode .tooltiptext = Toggle Compact Mode diff --git a/locales/bs/browser/browser/zen-split-view.ftl b/locales/bs/browser/browser/zen-split-view.ftl index 743688eed..4430fab34 100644 --- a/locales/bs/browser/browser/zen-split-view.ftl +++ b/locales/bs/browser/browser/zen-split-view.ftl @@ -5,7 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Join Tab (multiple selected tabs needed) + [-1] Split out tab + [1] Add split view... *[other] Join { $tabCount } Tabs } .accesskey = S diff --git a/locales/bs/browser/browser/zen-vertical-tabs.ftl b/locales/bs/browser/browser/zen-vertical-tabs.ftl index ff8a3775c..9989c7666 100644 --- a/locales/bs/browser/browser/zen-vertical-tabs.ftl +++ b/locales/bs/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Hide both .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = New Folder .accesskey = N diff --git a/locales/ca/browser/browser/preferences/zen-preferences.ftl b/locales/ca/browser/browser/preferences/zen-preferences.ftl index 0c7d866c6..4b9b2c758 100644 --- a/locales/ca/browser/browser/preferences/zen-preferences.ftl +++ b/locales/ca/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Commuta el DOM zen-devtools-toggle-accessibility-shortcut = Commuta l'accessibilitat zen-close-all-unpinned-tabs-shortcut = Tanca totes les pestanyes no fixades zen-new-unsynced-window-shortcut = Nova finestra en blanc +zen-duplicate-tab-shortcut = Duplica la pestanya diff --git a/locales/ca/browser/browser/zen-general.ftl b/locales/ca/browser/browser/zen-general.ftl index e9a05a52a..d50b46e7c 100644 --- a/locales/ca/browser/browser/zen-general.ftl +++ b/locales/ca/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = L'URL de la pestanya fixada s'ha substituït per l'URL zen-tabs-renamed = S'ha canviat el nom de la pestanya correctament zen-background-tab-opened-toast = S'ha obert una nova pestanya de fons zen-workspace-renamed-toast = S'ha canviat el nom de l'espai de treball correctament +zen-split-view-limit-toast = No es poden afegir més panells a la vista dividida! zen-toggle-compact-mode-button = .label = Mode compacte .tooltiptext = Commuta el mode compacte diff --git a/locales/ca/browser/browser/zen-split-view.ftl b/locales/ca/browser/browser/zen-split-view.ftl index 52ba7b3e1..5a2953f5a 100644 --- a/locales/ca/browser/browser/zen-split-view.ftl +++ b/locales/ca/browser/browser/zen-split-view.ftl @@ -6,7 +6,7 @@ tab-zen-split-tabs = .label = { $tabCount -> [-1] Pestanya dividida - [1] Uneix pestanyes (calen diverses pestanyes seleccionades) + [1] Afegeix una vista dividida... *[other] Uneix { $tabCount } pestanyes } .accesskey = S diff --git a/locales/ca/browser/browser/zen-vertical-tabs.ftl b/locales/ca/browser/browser/zen-vertical-tabs.ftl index 868efd1b5..d8932f8a9 100644 --- a/locales/ca/browser/browser/zen-vertical-tabs.ftl +++ b/locales/ca/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Amaga les dues .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Mou a la carpeta... + .accesskey = M zen-toolbar-context-new-folder = .label = Carpeta nova .accesskey = N diff --git a/locales/cs/browser/browser/preferences/zen-preferences.ftl b/locales/cs/browser/browser/preferences/zen-preferences.ftl index 1b46b53ff..fdacf7348 100644 --- a/locales/cs/browser/browser/preferences/zen-preferences.ftl +++ b/locales/cs/browser/browser/preferences/zen-preferences.ftl @@ -43,11 +43,11 @@ category-zen-workspaces = .tooltiptext = { pane-zen-tabs-title } pane-settings-workspaces-title = Pracoviště zen-tabs-select-recently-used-on-close = - .label = When closing a tab, switch to the most recently used tab instead of the next tab + .label = Při zavření panelu přepnout na naposledy použitý panel namísto dalšího panelu zen-tabs-close-on-back-with-no-history = .label = Zavřít panel a přepnout na jeho nadřazený panel (nebo naposledy použitý panel), když se vracíte zpět bez historie zen-settings-workspaces-sync-unpinned-tabs = - .label = Sync only pinned tabs in workspaces + .label = Synchronizovat pouze připnuté panely v pracovních prostorách zen-tabs-cycle-by-attribute = .label = Ctrl+Tab zahrnuje Essentials v pracovních panelech zen-tabs-cycle-ignore-pending-tabs = @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Přepnout DOM zen-devtools-toggle-accessibility-shortcut = Přepnout přístupnost zen-close-all-unpinned-tabs-shortcut = Zavřít všechny nepřipnuté panely zen-new-unsynced-window-shortcut = Nové nesynchronizované okno +zen-duplicate-tab-shortcut = Duplikovat panel diff --git a/locales/cs/browser/browser/zen-general.ftl b/locales/cs/browser/browser/zen-general.ftl index a7afe69a1..ca6132599 100644 --- a/locales/cs/browser/browser/zen-general.ftl +++ b/locales/cs/browser/browser/zen-general.ftl @@ -7,8 +7,8 @@ unified-extensions-description = Rozšíření slouží k přidání dalších f tab-context-zen-reset-pinned-tab = .label = { $isEssential -> - [true] Reset Essential Tab - *[false] Reset Pinned Tab + [true] Resetovat Essential panel + *[false] Resetovat připnutý panel } .accesskey = R tab-context-zen-add-essential = @@ -21,8 +21,8 @@ tab-context-zen-remove-essential = tab-context-zen-replace-pinned-url-with-current = .label = { $isEssential -> - [true] Replace Essential URL with Current - *[false] Replace Pinned URL with Current + [true] Nahradit Essential URL aktuální + *[false] Nahradit připnutou URL aktuální } .accesskey = C tab-context-zen-edit-title = @@ -41,7 +41,7 @@ pictureinpicture-minimize-btn = .tooltip = Minimalizovat zen-panel-ui-gradient-generator-custom-color = Vlastní barva zen-copy-current-url-confirmation = URL adresa byla zkopírována! -zen-copy-current-url-as-markdown-confirmation = Copied current URL as Markdown! +zen-copy-current-url-as-markdown-confirmation = Kopírovat aktuální URL jako Markdown! zen-general-cancel-label = .label = Zrušit zen-general-confirm = @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Připnutá URL adresa panelu byla nahrazena aktuální zen-tabs-renamed = Panel byl úspěšně přejmenován! zen-background-tab-opened-toast = Nový panel na pozadí byl otevřen! zen-workspace-renamed-toast = Pracovní prostor byl úspěšně přejmenován! +zen-split-view-limit-toast = Do rozděleného zobrazení nelze přidat více panelů! zen-toggle-compact-mode-button = .label = Kompaktní režim .tooltiptext = Přepnout kompaktní režim @@ -123,4 +124,4 @@ zen-window-sync-migration-dialog-message = Zen nyní synchronizuje okna na stejn zen-window-sync-migration-dialog-learn-more = Zjistit více zen-window-sync-migration-dialog-accept = Rozumím zen-appmenu-new-blank-window = - .label = New blank window + .label = Nové prázdné okno diff --git a/locales/cs/browser/browser/zen-menubar.ftl b/locales/cs/browser/browser/zen-menubar.ftl index 4f09f176f..738649024 100644 --- a/locales/cs/browser/browser/zen-menubar.ftl +++ b/locales/cs/browser/browser/zen-menubar.ftl @@ -19,4 +19,4 @@ zen-menubar-appearance-light = zen-menubar-appearance-dark = .label = Tmavý zen-menubar-new-blank-window = - .label = New Blank Window + .label = Nové prázdné okno diff --git a/locales/cs/browser/browser/zen-split-view.ftl b/locales/cs/browser/browser/zen-split-view.ftl index 8b807444f..c6f4f5e07 100644 --- a/locales/cs/browser/browser/zen-split-view.ftl +++ b/locales/cs/browser/browser/zen-split-view.ftl @@ -5,11 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Rozdělit kartu (je třeba více vybraných karet) - [2] Rozdělit { $tabCount } karty - [3] Rozdělit { $tabCount } karty - [4] Rozdělit { $tabCount } karty - *[other] Rozdělit { $tabCount } karet + [-1] Split out tab + [1] Add split view... + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/cs/browser/browser/zen-vertical-tabs.ftl b/locales/cs/browser/browser/zen-vertical-tabs.ftl index a76c866a5..bfeae9159 100644 --- a/locales/cs/browser/browser/zen-vertical-tabs.ftl +++ b/locales/cs/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Skrýt obojí .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Přesunout do složky... + .accesskey = M zen-toolbar-context-new-folder = .label = Nová složka .accesskey = N diff --git a/locales/cs/browser/browser/zen-workspaces.ftl b/locales/cs/browser/browser/zen-workspaces.ftl index 140984833..529d3514c 100644 --- a/locales/cs/browser/browser/zen-workspaces.ftl +++ b/locales/cs/browser/browser/zen-workspaces.ftl @@ -10,7 +10,7 @@ zen-panel-ui-workspaces-create = zen-panel-ui-folder-create = .label = Vytvořit složku zen-panel-ui-live-folder-create = - .label = Live Folder + .label = Živá složka zen-panel-ui-new-empty-split = .label = Nové rozdělení zen-workspaces-panel-context-delete = @@ -25,7 +25,7 @@ zen-workspaces-panel-context-default-profile = zen-workspaces-panel-unload = .label = Uspat prostor zen-workspaces-panel-unload-others = - .label = Unload All Other Spaces + .label = Uvolnit všechny ostatní prostory zen-workspaces-how-to-reorder-title = Jak změnit pořadí prostorů zen-workspaces-how-to-reorder-desc = Pořadí prostorů změníte přetažením jejich ikon dole v postranním panelu zen-workspaces-change-theme = diff --git a/locales/cy/browser/browser/preferences/zen-preferences.ftl b/locales/cy/browser/browser/preferences/zen-preferences.ftl index 541c1735c..080a9aa69 100644 --- a/locales/cy/browser/browser/preferences/zen-preferences.ftl +++ b/locales/cy/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toglo DOM zen-devtools-toggle-accessibility-shortcut = Toglo Hygyrchedd zen-close-all-unpinned-tabs-shortcut = Cau Pob Tab Heb ei Binio zen-new-unsynced-window-shortcut = Ffenestr Wag Newydd +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/cy/browser/browser/zen-general.ftl b/locales/cy/browser/browser/zen-general.ftl index 9b8202002..aa8a8074e 100644 --- a/locales/cy/browser/browser/zen-general.ftl +++ b/locales/cy/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Mae URL y tab wedi'i binio wedi'i newid i'r URL gyfred zen-tabs-renamed = Mae'r tab wedi cael ei ailenwi'n llwyddiannus! zen-background-tab-opened-toast = Tab cefndir newydd wedi'i agor! zen-workspace-renamed-toast = Mae'r Man Gwaith wedi cael ei ailenwi'n llwyddiannus! +zen-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Modd Cryno .tooltiptext = Togglo Modd Cryno diff --git a/locales/cy/browser/browser/zen-split-view.ftl b/locales/cy/browser/browser/zen-split-view.ftl index 2c1ac6ee6..e0aa8889e 100644 --- a/locales/cy/browser/browser/zen-split-view.ftl +++ b/locales/cy/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Tab Hollt (angen sawl tab wedi'u dewis) - *[other] Hollti { $tabCount } Tab + [-1] Split out tab + [1] Add split view... + *[other] Join { $tabCount } Tabs } .accesskey = H zen-split-link = diff --git a/locales/cy/browser/browser/zen-vertical-tabs.ftl b/locales/cy/browser/browser/zen-vertical-tabs.ftl index 27fb40f5c..688e6aa86 100644 --- a/locales/cy/browser/browser/zen-vertical-tabs.ftl +++ b/locales/cy/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Cuddio'r ddau .accesskey = C +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = Ffolder Newydd .accesskey = N diff --git a/locales/da/browser/browser/preferences/zen-preferences.ftl b/locales/da/browser/browser/preferences/zen-preferences.ftl index 8d0f4e290..c710dc69c 100644 --- a/locales/da/browser/browser/preferences/zen-preferences.ftl +++ b/locales/da/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Vis/skjul DOM zen-devtools-toggle-accessibility-shortcut = Vis/skjul Tilgængelighed zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs zen-new-unsynced-window-shortcut = New Unsynced Window +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/da/browser/browser/zen-general.ftl b/locales/da/browser/browser/zen-general.ftl index 6f835c8c7..b8181d220 100644 --- a/locales/da/browser/browser/zen-general.ftl +++ b/locales/da/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Den fastgjorte fane-URL blev erstattet med den aktuell zen-tabs-renamed = Fanen blev omdøbt! zen-background-tab-opened-toast = Ny baggrundsfane åbnet! zen-workspace-renamed-toast = Arbejdsområde blev omdøbt! +zen-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Kompakt tilstand .tooltiptext = Kompakt tilstand til/fra diff --git a/locales/da/browser/browser/zen-split-view.ftl b/locales/da/browser/browser/zen-split-view.ftl index 80323f2b9..5dd6024ab 100644 --- a/locales/da/browser/browser/zen-split-view.ftl +++ b/locales/da/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Opdel fane (flere faner skal vælges) - *[other] Opdel { $tabCount } faner + [-1] Split out tab + [1] Add split view... + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/da/browser/browser/zen-vertical-tabs.ftl b/locales/da/browser/browser/zen-vertical-tabs.ftl index 80af30f7f..77325e82f 100644 --- a/locales/da/browser/browser/zen-vertical-tabs.ftl +++ b/locales/da/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Skjul begge .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = Ny mappe .accesskey = N diff --git a/locales/de/browser/browser/preferences/zen-preferences.ftl b/locales/de/browser/browser/preferences/zen-preferences.ftl index e17936377..86aff9c81 100644 --- a/locales/de/browser/browser/preferences/zen-preferences.ftl +++ b/locales/de/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = DOM umschalten zen-devtools-toggle-accessibility-shortcut = Barrierefreiheit umschalten zen-close-all-unpinned-tabs-shortcut = Alle nicht angehefteten Tabs schließen zen-new-unsynced-window-shortcut = Neues leeres Fenster +zen-duplicate-tab-shortcut = Tab duplizieren diff --git a/locales/de/browser/browser/zen-general.ftl b/locales/de/browser/browser/zen-general.ftl index ad0ad3fce..66b8d4849 100644 --- a/locales/de/browser/browser/zen-general.ftl +++ b/locales/de/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Die URL des angehefteten Tabs wurde aktualisiert! zen-tabs-renamed = Tab umbenannt! zen-background-tab-opened-toast = Neuer Tab im Hintergrund geöffnet! zen-workspace-renamed-toast = Arbeitsbereich umbenannt! +zen-split-view-limit-toast = Diese Split View kann keine weiteren Panels aufnehmen! zen-toggle-compact-mode-button = .label = Kompakter Modus .tooltiptext = Kompakten Modus umschalten diff --git a/locales/de/browser/browser/zen-split-view.ftl b/locales/de/browser/browser/zen-split-view.ftl index d466fbbd5..d230a24cb 100644 --- a/locales/de/browser/browser/zen-split-view.ftl +++ b/locales/de/browser/browser/zen-split-view.ftl @@ -5,9 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [-1] Aufteilung aufheben - [1] Tab aufteilen (wähle mehrere Tabs aus) - *[other] { $tabCount } Tabs aufteilen + [-1] Tab abtrennen + [1] Split View hinzufügen... + *[other] { $tabCount } Tabs zusammenführen } .accesskey = S zen-split-link = diff --git a/locales/de/browser/browser/zen-vertical-tabs.ftl b/locales/de/browser/browser/zen-vertical-tabs.ftl index 4b38283b1..633973af8 100644 --- a/locales/de/browser/browser/zen-vertical-tabs.ftl +++ b/locales/de/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Beides ausblenden .accesskey = H +zen-toolbar-context-move-to-folder = + .label = In Ordner verschieben... + .accesskey = M zen-toolbar-context-new-folder = .label = Neuer Ordner .accesskey = N diff --git a/locales/el/browser/browser/preferences/zen-preferences.ftl b/locales/el/browser/browser/preferences/zen-preferences.ftl index 968896da6..d46b987d2 100644 --- a/locales/el/browser/browser/preferences/zen-preferences.ftl +++ b/locales/el/browser/browser/preferences/zen-preferences.ftl @@ -43,11 +43,11 @@ category-zen-workspaces = .tooltiptext = { pane-zen-tabs-title } pane-settings-workspaces-title = Χώροι Εργασίας zen-tabs-select-recently-used-on-close = - .label = When closing a tab, switch to the most recently used tab instead of the next tab + .label = Στο κλείσιμο καρτέλας, αλλαγή στην πιο πρόσφατα χρησιμοποιημένη καρτέλα αντί για την επόμενη καρτέλα zen-tabs-close-on-back-with-no-history = .label = Κλείσιμο καρτέλας και αλλαγή στην καρτέλα ιδιοκτήτη (ή στην πιο πρόσφατα χρησιμοποιούμενη καρτέλα) όταν επιστρέφεις χωρίς ιστορικό zen-settings-workspaces-sync-unpinned-tabs = - .label = Sync only pinned tabs in workspaces + .label = Συγχρονισμός μόνο καρφιτσωμένων καρτελών στους χώρους εργασίας zen-tabs-cycle-by-attribute = .label = Ctrl+Tab επιλέγει κυκλικά μόνο από τις καρτέλες στα Απαραίτητα η στο Χώρο Εργασίας zen-tabs-cycle-ignore-pending-tabs = @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Εναλλαγή DOM zen-devtools-toggle-accessibility-shortcut = Εναλλαγή Προσβασιμότητας zen-close-all-unpinned-tabs-shortcut = Κλείσιμο όλων των μη καρφιτσωμένων καρτελών zen-new-unsynced-window-shortcut = New Unsynced Window +zen-duplicate-tab-shortcut = Διπλασιασμός Καρτέλας diff --git a/locales/el/browser/browser/zen-general.ftl b/locales/el/browser/browser/zen-general.ftl index 0ef357e09..2966c4ca8 100644 --- a/locales/el/browser/browser/zen-general.ftl +++ b/locales/el/browser/browser/zen-general.ftl @@ -7,8 +7,8 @@ unified-extensions-description = Οι επεκτάσεις χρησιμοποι tab-context-zen-reset-pinned-tab = .label = { $isEssential -> - [true] Reset Essential Tab - *[false] Reset Pinned Tab + [true] Επαναφορά Απαραίτητης Καρτέλας + *[false] Επαναφορά Καρφιτσωμένης Καρτέλας } .accesskey = R tab-context-zen-add-essential = @@ -21,8 +21,8 @@ tab-context-zen-remove-essential = tab-context-zen-replace-pinned-url-with-current = .label = { $isEssential -> - [true] Replace Essential URL with Current - *[false] Replace Pinned URL with Current + [true] Αντικατάσταση Απαραίτητης διεύθυνσής με την τωρινή + *[false] Αντικατάσταση Καρφιτσωμένης διεύθυνσής με την τωρινή } .accesskey = C tab-context-zen-edit-title = @@ -41,7 +41,7 @@ pictureinpicture-minimize-btn = .tooltip = Ελαχιστοποίηση zen-panel-ui-gradient-generator-custom-color = Προσαρμοσμένο Χρώμα zen-copy-current-url-confirmation = Αντιγράφηκε το τρέχον URL! -zen-copy-current-url-as-markdown-confirmation = Copied current URL as Markdown! +zen-copy-current-url-as-markdown-confirmation = Η τωρινή διεύθυνσή αντιγράφηκε ως Markdown! zen-general-cancel-label = .label = Ακύρωση zen-general-confirm = @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Το URL της καρφιτσωμένης καρτέ zen-tabs-renamed = Η καρτέλα μετονομάστηκε επιτυχώς! zen-background-tab-opened-toast = Άνοιξε νέα καρτέλα στο παρασκήνιο! zen-workspace-renamed-toast = Ο χώρος εργασίας μετονομάστηκε επιτυχώς! +zen-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Συμπαγής Λειτουργία .tooltiptext = Εναλλαγή Συμπαγούς Λειτουργίας @@ -123,4 +124,4 @@ zen-window-sync-migration-dialog-message = Το Zen άρα στην ίδια σ zen-window-sync-migration-dialog-learn-more = Περισσότερα zen-window-sync-migration-dialog-accept = Κατάλαβα zen-appmenu-new-blank-window = - .label = New blank window + .label = Νέο κενό παράθυρο diff --git a/locales/el/browser/browser/zen-menubar.ftl b/locales/el/browser/browser/zen-menubar.ftl index 32e7f3032..5e0256174 100644 --- a/locales/el/browser/browser/zen-menubar.ftl +++ b/locales/el/browser/browser/zen-menubar.ftl @@ -19,4 +19,4 @@ zen-menubar-appearance-light = zen-menubar-appearance-dark = .label = Σκοτεινό zen-menubar-new-blank-window = - .label = New Blank Window + .label = Νέο Κενό Παράθυρο diff --git a/locales/el/browser/browser/zen-split-view.ftl b/locales/el/browser/browser/zen-split-view.ftl index 11ba4ae59..70e1a3735 100644 --- a/locales/el/browser/browser/zen-split-view.ftl +++ b/locales/el/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Διαίρεση Καρτέλας (απαιτούνται πολλαπλές επιλεγμένες καρτέλες) - *[other] Διαίρεση { $tabCount } Καρτελών + [-1] Split out tab + [1] Add split view... + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/el/browser/browser/zen-vertical-tabs.ftl b/locales/el/browser/browser/zen-vertical-tabs.ftl index 4ee3103d6..3d4c81e91 100644 --- a/locales/el/browser/browser/zen-vertical-tabs.ftl +++ b/locales/el/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Απόκρυψη όλων .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = Δημιουργία Φακέλου .accesskey = N @@ -38,7 +41,7 @@ tabbrowser-reset-pin-button = } zen-tab-sublabel = { $tabSubtitle -> - [zen-default-pinned] Back to pinned url - [zen-default-pinned-cmd] Separate from pinned tab + [zen-default-pinned] Πίσω στην καρφιτσωμένη διεύθυνσή + [zen-default-pinned-cmd] Διαχωρισμός από την καρφιτσωμένη καρτέλα *[other] { $tabSubtitle } } diff --git a/locales/en-GB/browser/browser/preferences/zen-preferences.ftl b/locales/en-GB/browser/browser/preferences/zen-preferences.ftl index 6c2471ead..a7e3f3c3f 100644 --- a/locales/en-GB/browser/browser/preferences/zen-preferences.ftl +++ b/locales/en-GB/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toggle DOM zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs zen-new-unsynced-window-shortcut = New Unsynced Window +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/en-GB/browser/browser/zen-general.ftl b/locales/en-GB/browser/browser/zen-general.ftl index 5319fcadd..479798b15 100644 --- a/locales/en-GB/browser/browser/zen-general.ftl +++ b/locales/en-GB/browser/browser/zen-general.ftl @@ -48,6 +48,7 @@ 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-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Compact Mode .tooltiptext = Toggle Compact Mode diff --git a/locales/en-GB/browser/browser/zen-split-view.ftl b/locales/en-GB/browser/browser/zen-split-view.ftl index 97d65b70a..844d6dcbd 100644 --- a/locales/en-GB/browser/browser/zen-split-view.ftl +++ b/locales/en-GB/browser/browser/zen-split-view.ftl @@ -5,7 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Join Tab (multiple selected tabs needed) + [-1] Split out tab + [1] Add split view... *[other] Join { $tabCount } Tabs } .accesskey = S diff --git a/locales/en-GB/browser/browser/zen-vertical-tabs.ftl b/locales/en-GB/browser/browser/zen-vertical-tabs.ftl index 41494167b..cddebc1ee 100644 --- a/locales/en-GB/browser/browser/zen-vertical-tabs.ftl +++ b/locales/en-GB/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Hide both .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = New Folder .accesskey = N diff --git a/locales/es-ES/browser/browser/preferences/zen-preferences.ftl b/locales/es-ES/browser/browser/preferences/zen-preferences.ftl index fe1f7c7f7..7e81a58a4 100644 --- a/locales/es-ES/browser/browser/preferences/zen-preferences.ftl +++ b/locales/es-ES/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Alternar DOM zen-devtools-toggle-accessibility-shortcut = Alternar accesibilidad zen-close-all-unpinned-tabs-shortcut = Cerrar todas las pestañas sin fijar zen-new-unsynced-window-shortcut = Nueva ventana no sincronizada +zen-duplicate-tab-shortcut = Duplicar pestaña diff --git a/locales/es-ES/browser/browser/zen-general.ftl b/locales/es-ES/browser/browser/zen-general.ftl index 7410c1077..b9fb5237f 100644 --- a/locales/es-ES/browser/browser/zen-general.ftl +++ b/locales/es-ES/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = La URL de la pestaña fijada se ha reemplazado por la zen-tabs-renamed = ¡La pestaña se ha renombrado con éxito! zen-background-tab-opened-toast = ¡Nueva pestaña abierta en segundo plano! zen-workspace-renamed-toast = ¡El espacio de trabajo ha sido renombrado con éxito! +zen-split-view-limit-toast = ¡No se pueden añadir más paneles a la vista dividida! zen-toggle-compact-mode-button = .label = Modo compacto .tooltiptext = Alternar modo compacto diff --git a/locales/es-ES/browser/browser/zen-split-view.ftl b/locales/es-ES/browser/browser/zen-split-view.ftl index 915fdba54..2d3f297c0 100644 --- a/locales/es-ES/browser/browser/zen-split-view.ftl +++ b/locales/es-ES/browser/browser/zen-split-view.ftl @@ -5,9 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [-1] Deshacer división - [1] Vista dividida (seleccione varias pestañas) - *[other] Añadir { $tabCount } pestañas a la vista dividida + [-1] Separar pestaña + [1] Añadir vista dividida... + *[other] Unir { $tabCount } pestañas } .accesskey = S zen-split-link = diff --git a/locales/es-ES/browser/browser/zen-vertical-tabs.ftl b/locales/es-ES/browser/browser/zen-vertical-tabs.ftl index ddefab297..5d892fcde 100644 --- a/locales/es-ES/browser/browser/zen-vertical-tabs.ftl +++ b/locales/es-ES/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Ocultar ambas .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Mover a la carpeta... + .accesskey = M zen-toolbar-context-new-folder = .label = Nueva carpeta .accesskey = N diff --git a/locales/et/browser/browser/preferences/zen-preferences.ftl b/locales/et/browser/browser/preferences/zen-preferences.ftl index 7918c3927..c15f1b56d 100644 --- a/locales/et/browser/browser/preferences/zen-preferences.ftl +++ b/locales/et/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Lülita DOM sisse/välja zen-devtools-toggle-accessibility-shortcut = Lülita ligipääsetavuse sektsioon sisse/välja zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs zen-new-unsynced-window-shortcut = New Unsynced Window +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/et/browser/browser/zen-general.ftl b/locales/et/browser/browser/zen-general.ftl index 1c55e454d..7ba7cbd2d 100644 --- a/locales/et/browser/browser/zen-general.ftl +++ b/locales/et/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL. 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-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Compact Mode .tooltiptext = Lülita kompaktne režiim sisse/välja diff --git a/locales/et/browser/browser/zen-split-view.ftl b/locales/et/browser/browser/zen-split-view.ftl index 626e4a33a..01814d861 100644 --- a/locales/et/browser/browser/zen-split-view.ftl +++ b/locales/et/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Jaota kaart (mitu kaarti peab olema valitud) - *[other] Jaota { $tabCount } kaarti + [-1] Split out tab + [1] Add split view... + *[other] Join { $tabCount } Tabs } .accesskey = J zen-split-link = diff --git a/locales/et/browser/browser/zen-vertical-tabs.ftl b/locales/et/browser/browser/zen-vertical-tabs.ftl index 79e19799d..c4ecdab54 100644 --- a/locales/et/browser/browser/zen-vertical-tabs.ftl +++ b/locales/et/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Peida mõlemad .accesskey = P +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = Uus kaust .accesskey = U diff --git a/locales/eu/browser/browser/preferences/zen-preferences.ftl b/locales/eu/browser/browser/preferences/zen-preferences.ftl index 48e927caa..728fc5f2e 100644 --- a/locales/eu/browser/browser/preferences/zen-preferences.ftl +++ b/locales/eu/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toggle DOM zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs zen-new-unsynced-window-shortcut = New Blank Window +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/eu/browser/browser/zen-general.ftl b/locales/eu/browser/browser/zen-general.ftl index 06d5c5810..c2754b4f4 100644 --- a/locales/eu/browser/browser/zen-general.ftl +++ b/locales/eu/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Oraingo estekak ordezkatu du ainguratutako fitxarena! zen-tabs-renamed = Fitxaren izena ongi aldatu da! zen-background-tab-opened-toast = Fitxa berri bat zabaldu da bigarren planoan! zen-workspace-renamed-toast = Lan-eremuaren izena ongi aldatu da! +zen-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Modu Trinkoa .tooltiptext = Modu Trinkoa Aktibatu/Desaktibatu diff --git a/locales/eu/browser/browser/zen-split-view.ftl b/locales/eu/browser/browser/zen-split-view.ftl index a83fc33d2..4430fab34 100644 --- a/locales/eu/browser/browser/zen-split-view.ftl +++ b/locales/eu/browser/browser/zen-split-view.ftl @@ -6,7 +6,7 @@ tab-zen-split-tabs = .label = { $tabCount -> [-1] Split out tab - [1] Join Tab (multiple selected tabs needed) + [1] Add split view... *[other] Join { $tabCount } Tabs } .accesskey = S diff --git a/locales/eu/browser/browser/zen-vertical-tabs.ftl b/locales/eu/browser/browser/zen-vertical-tabs.ftl index ff8a3775c..9989c7666 100644 --- a/locales/eu/browser/browser/zen-vertical-tabs.ftl +++ b/locales/eu/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Hide both .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = New Folder .accesskey = N diff --git a/locales/fa/browser/browser/preferences/zen-preferences.ftl b/locales/fa/browser/browser/preferences/zen-preferences.ftl index f28962a53..8f63791ca 100644 --- a/locales/fa/browser/browser/preferences/zen-preferences.ftl +++ b/locales/fa/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toggle DOM zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs zen-new-unsynced-window-shortcut = New Unsynced Window +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/fa/browser/browser/zen-general.ftl b/locales/fa/browser/browser/zen-general.ftl index 281a24d0b..f4b3f238d 100644 --- a/locales/fa/browser/browser/zen-general.ftl +++ b/locales/fa/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ 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-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Compact Mode .tooltiptext = Toggle Compact Mode diff --git a/locales/fa/browser/browser/zen-split-view.ftl b/locales/fa/browser/browser/zen-split-view.ftl index bfcdba4dd..bfc0e2ca8 100644 --- a/locales/fa/browser/browser/zen-split-view.ftl +++ b/locales/fa/browser/browser/zen-split-view.ftl @@ -5,7 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Join Tab (multiple selected tabs needed) + [-1] Split out tab + [1] Add split view... *[other] Join { $tabCount } Tabs } .accesskey = S diff --git a/locales/fa/browser/browser/zen-vertical-tabs.ftl b/locales/fa/browser/browser/zen-vertical-tabs.ftl index 41494167b..cddebc1ee 100644 --- a/locales/fa/browser/browser/zen-vertical-tabs.ftl +++ b/locales/fa/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Hide both .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = New Folder .accesskey = N diff --git a/locales/fi/browser/browser/preferences/zen-preferences.ftl b/locales/fi/browser/browser/preferences/zen-preferences.ftl index be58fe2cd..7f518ecc6 100644 --- a/locales/fi/browser/browser/preferences/zen-preferences.ftl +++ b/locales/fi/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Vaihda DOM:ia zen-devtools-toggle-accessibility-shortcut = Vaihda Esteettömyystilaan zen-close-all-unpinned-tabs-shortcut = Sulje kaikki kiinnittämättömät välilehdet zen-new-unsynced-window-shortcut = New Unsynced Window +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/fi/browser/browser/zen-general.ftl b/locales/fi/browser/browser/zen-general.ftl index c3afa728a..7ddce52f2 100644 --- a/locales/fi/browser/browser/zen-general.ftl +++ b/locales/fi/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Pinned tab URL has been replaced with the current URL. zen-tabs-renamed = Välilehti on nimetty uudelleen! zen-background-tab-opened-toast = Uusi taustavälilehti avattu! zen-workspace-renamed-toast = Työtila on nimetty uudelleen! +zen-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Kompakti Tila .tooltiptext = Ota käyttöön Kompakti tila diff --git a/locales/fi/browser/browser/zen-split-view.ftl b/locales/fi/browser/browser/zen-split-view.ftl index bbc3dbeda..a1e905819 100644 --- a/locales/fi/browser/browser/zen-split-view.ftl +++ b/locales/fi/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Split Välilehti (tarvitaan useita valittuja välilehtiä) - *[other] Split { $tabCount } Välilehdet + [-1] Split out tab + [1] Add split view... + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/fi/browser/browser/zen-vertical-tabs.ftl b/locales/fi/browser/browser/zen-vertical-tabs.ftl index ed852a2fa..c12141fde 100644 --- a/locales/fi/browser/browser/zen-vertical-tabs.ftl +++ b/locales/fi/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Piilota molemmat .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = Uusi kansio .accesskey = N diff --git a/locales/fr/browser/browser/preferences/zen-preferences.ftl b/locales/fr/browser/browser/preferences/zen-preferences.ftl index 89d3fddc8..f2deb00b8 100644 --- a/locales/fr/browser/browser/preferences/zen-preferences.ftl +++ b/locales/fr/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Afficher l’onglet DOM zen-devtools-toggle-accessibility-shortcut = Afficher l’onglet Accessibilité zen-close-all-unpinned-tabs-shortcut = Fermer tous les onglets non épinglés zen-new-unsynced-window-shortcut = Nouvelle fenêtre vierge +zen-duplicate-tab-shortcut = Dupliquer l'onglet diff --git a/locales/fr/browser/browser/zen-general.ftl b/locales/fr/browser/browser/zen-general.ftl index 51f0bc559..41d53b68f 100644 --- a/locales/fr/browser/browser/zen-general.ftl +++ b/locales/fr/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = L’adresse de l'onglet épinglé a été remplacée p zen-tabs-renamed = L’onglet a été renommé avec succès ! zen-background-tab-opened-toast = Nouvel onglet ouvert en arrière-plan ! zen-workspace-renamed-toast = L'espace de travail a été renommé avec succès ! +zen-split-view-limit-toast = Impossible d'ajouter d'autres panneaux à la vue fractionnée ! zen-toggle-compact-mode-button = .label = Mode compact .tooltiptext = Activer/Désactiver le mode compact diff --git a/locales/fr/browser/browser/zen-split-view.ftl b/locales/fr/browser/browser/zen-split-view.ftl index 4b2db603f..a0041cedd 100644 --- a/locales/fr/browser/browser/zen-split-view.ftl +++ b/locales/fr/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Fractionner (sélectionner plusieurs onglets) - *[other] Fractionner { $tabCount } onglets + [-1] Séparer l'onglet + [1] Ajouter une vue fractionnée... + *[other] Fusionner { $tabCount } onglets } .accesskey = S zen-split-link = diff --git a/locales/fr/browser/browser/zen-vertical-tabs.ftl b/locales/fr/browser/browser/zen-vertical-tabs.ftl index 2355634e1..ee6ac4683 100644 --- a/locales/fr/browser/browser/zen-vertical-tabs.ftl +++ b/locales/fr/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Masquer les deux .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Déplacer vers le dossier... + .accesskey = M zen-toolbar-context-new-folder = .label = Nouveau dossier .accesskey = N diff --git a/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl b/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl index 0b07ca8df..10f96fedd 100644 --- a/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl +++ b/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Scoránaigh DOM zen-devtools-toggle-accessibility-shortcut = Scoránaigh Inrochtaineacht zen-close-all-unpinned-tabs-shortcut = Dún Gach Cluaisín Gan Phionáil zen-new-unsynced-window-shortcut = Fuinneog Nua Neamhshioncrónaithe +zen-duplicate-tab-shortcut = Cluaisín Dúblach diff --git a/locales/ga-IE/browser/browser/zen-general.ftl b/locales/ga-IE/browser/browser/zen-general.ftl index 9b8963a6b..a64599b56 100644 --- a/locales/ga-IE/browser/browser/zen-general.ftl +++ b/locales/ga-IE/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Tá URL an chluaisín phinnáilte curtha in ionad an U zen-tabs-renamed = Athainmníodh an cluaisín go rathúil! zen-background-tab-opened-toast = Tá cluaisín cúlra nua oscailte! zen-workspace-renamed-toast = Athainmníodh an spás oibre go rathúil! +zen-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Mód Dlúth .tooltiptext = Mód Dlúth a Athrú diff --git a/locales/ga-IE/browser/browser/zen-split-view.ftl b/locales/ga-IE/browser/browser/zen-split-view.ftl index 8fc871cdb..919ce6b05 100644 --- a/locales/ga-IE/browser/browser/zen-split-view.ftl +++ b/locales/ga-IE/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Scoilt Cluaisín (tá gá le roinnt cluaisíní roghnaithe) - *[other] Scoilt { $tabCount } Cluaisíní + [-1] Split out tab + [1] Add split view... + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl b/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl index 9e7631a79..6fa58656e 100644 --- a/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl +++ b/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Folaigh an dá cheann .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = Fillteán Nua .accesskey = N diff --git a/locales/he/browser/browser/preferences/zen-preferences.ftl b/locales/he/browser/browser/preferences/zen-preferences.ftl index 69eca12ed..fc21b7eb8 100644 --- a/locales/he/browser/browser/preferences/zen-preferences.ftl +++ b/locales/he/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = הפעל/כבה DOM zen-devtools-toggle-accessibility-shortcut = הפעל/כבה נגישות zen-close-all-unpinned-tabs-shortcut = סגירת כל הלשוניות שאינן מוצמדות zen-new-unsynced-window-shortcut = חלון לא מסונכרן חדש +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/he/browser/browser/zen-general.ftl b/locales/he/browser/browser/zen-general.ftl index a5a01774a..0cf72f91c 100644 --- a/locales/he/browser/browser/zen-general.ftl +++ b/locales/he/browser/browser/zen-general.ftl @@ -48,6 +48,7 @@ zen-pinned-tab-replaced = כתובת הלשונית המוצמדת הוחלפה zen-tabs-renamed = שם הלשונית השתנה בהצלחה! zen-background-tab-opened-toast = לשונית נפתחה ברקע! zen-workspace-renamed-toast = שם מרחב העבודה השתנה בהצלחה! +zen-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = מצב חסכוני .tooltiptext = הפעלת/כיבוי מצב חסכוני diff --git a/locales/he/browser/browser/zen-split-view.ftl b/locales/he/browser/browser/zen-split-view.ftl index 4a0f06957..96042d9b5 100644 --- a/locales/he/browser/browser/zen-split-view.ftl +++ b/locales/he/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] פיצול לשונית (נדרש מספר לשוניות מסומנות) - *[other] פיצול { $tabCount } לשוניות + [-1] Split out tab + [1] Add split view... + *[other] Join { $tabCount } Tabs } .accesskey = ד zen-split-link = diff --git a/locales/he/browser/browser/zen-vertical-tabs.ftl b/locales/he/browser/browser/zen-vertical-tabs.ftl index 8365a562d..28121137b 100644 --- a/locales/he/browser/browser/zen-vertical-tabs.ftl +++ b/locales/he/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = הסתרת שני הסרגלים .accesskey = י +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = תיקייה חדשה .accesskey = מ diff --git a/locales/hu/browser/browser/preferences/zen-preferences.ftl b/locales/hu/browser/browser/preferences/zen-preferences.ftl index 4637f208e..02da4b7a0 100644 --- a/locales/hu/browser/browser/preferences/zen-preferences.ftl +++ b/locales/hu/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = DOM kapcsolása zen-devtools-toggle-accessibility-shortcut = Hozzáférhetőség kapcsolása zen-close-all-unpinned-tabs-shortcut = Összes rögzítetlen lap bezárása zen-new-unsynced-window-shortcut = Új szinkronizálatlan ablak +zen-duplicate-tab-shortcut = Lap duplikálása diff --git a/locales/hu/browser/browser/zen-general.ftl b/locales/hu/browser/browser/zen-general.ftl index dd9279f42..93f887358 100644 --- a/locales/hu/browser/browser/zen-general.ftl +++ b/locales/hu/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = A rögzített lap URL címe helyébe az aktuális URL zen-tabs-renamed = A lap sikeresen át lett nevezve! zen-background-tab-opened-toast = Új lap megnyitva! zen-workspace-renamed-toast = A munkakörnyezet sikeresen át lett nevezve! +zen-split-view-limit-toast = Nem lehet további paneleket hozzáadni az osztott nézethez! zen-toggle-compact-mode-button = .label = Kompakt mód .tooltiptext = Kompakt mód ki-/bekapcsolása diff --git a/locales/hu/browser/browser/zen-split-view.ftl b/locales/hu/browser/browser/zen-split-view.ftl index 350e3e4e3..9f4b81858 100644 --- a/locales/hu/browser/browser/zen-split-view.ftl +++ b/locales/hu/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Felosztott lapok (válassz ki több lapot) - *[other] { $tabCount } lap felosztása + [-1] Lap kivétele + [1] Osztott nézethez adás... + *[other] { $tabCount } lap összevonása } .accesskey = S zen-split-link = diff --git a/locales/hu/browser/browser/zen-vertical-tabs.ftl b/locales/hu/browser/browser/zen-vertical-tabs.ftl index dd14881b7..63c85ee0c 100644 --- a/locales/hu/browser/browser/zen-vertical-tabs.ftl +++ b/locales/hu/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Mindkettő elrejtése .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Áthelyezés mappába... + .accesskey = M zen-toolbar-context-new-folder = .label = Új mappa .accesskey = N diff --git a/locales/id/browser/browser/preferences/zen-preferences.ftl b/locales/id/browser/browser/preferences/zen-preferences.ftl index dd9b7c3c8..7f5e29879 100644 --- a/locales/id/browser/browser/preferences/zen-preferences.ftl +++ b/locales/id/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Ubah DOM zen-devtools-toggle-accessibility-shortcut = Ubah Aksesibilitas zen-close-all-unpinned-tabs-shortcut = Tutup Semua Tab yang Tidak Disematkan zen-new-unsynced-window-shortcut = Jendela Kosong Baru +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/id/browser/browser/zen-general.ftl b/locales/id/browser/browser/zen-general.ftl index e352fc1fd..860c3deed 100644 --- a/locales/id/browser/browser/zen-general.ftl +++ b/locales/id/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = URL awal dari tab yang disematkan telah diganti dengan zen-tabs-renamed = Tab telah berhasil diubah namanya! zen-background-tab-opened-toast = Tab baru telah terbuka di latar belakang! zen-workspace-renamed-toast = Ruang Kerja telah berhasil diubah namanya! +zen-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Mode Ringkas .tooltiptext = Aktifkan/Sembunyikan Mode Ringkas diff --git a/locales/id/browser/browser/zen-split-view.ftl b/locales/id/browser/browser/zen-split-view.ftl index 9184dc5cd..c1785a709 100644 --- a/locales/id/browser/browser/zen-split-view.ftl +++ b/locales/id/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Belah Tab (pilih beberapa tab dulu) - *[other] Belah { $tabCount } Tab + [-1] Split out tab + [1] Add split view... + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/id/browser/browser/zen-vertical-tabs.ftl b/locales/id/browser/browser/zen-vertical-tabs.ftl index 369fdb910..b8a94f2a5 100644 --- a/locales/id/browser/browser/zen-vertical-tabs.ftl +++ b/locales/id/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Sembunyikan keduanya .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = Folder Baru .accesskey = N diff --git a/locales/is/browser/browser/preferences/zen-preferences.ftl b/locales/is/browser/browser/preferences/zen-preferences.ftl index 8e3de3969..db2e11183 100644 --- a/locales/is/browser/browser/preferences/zen-preferences.ftl +++ b/locales/is/browser/browser/preferences/zen-preferences.ftl @@ -18,7 +18,7 @@ sync-engine-workspaces = .accesskey = V zen-glance-title = Skyndisýn zen-glance-header = Almennar stillingar fyrir skyndisýn -zen-glance-description = Fáðu fljótlegt heildarsýn yfir tenglana þína án þess að þurfa að opna þá í nýjum flipum +zen-glance-description = Fáðu fljótlegt heildaryfirlit á tenglana þína án þess að þurfa að opna þá í nýjum flipum zen-glance-trigger-label = Virkjunaraðferð zen-glance-enabled = .label = Virkja Skyndisýn @@ -30,7 +30,7 @@ zen-glance-trigger-shift-click = .label = Shift + smella zen-glance-trigger-meta-click = .label = Meta (Slaufa) + smella -zen-look-and-feel-compact-view-header = Sýna í þjappaðri sýn +zen-look-and-feel-compact-view-header = Sýna í þjöppuðu yfirliti zen-look-and-feel-compact-view-description = Aðeins birta verkfærastikurnar sem þú notar! zen-look-and-feel-compact-view-enabled = .label = Virkja þjappað viðmót í { -brand-short-name } @@ -181,7 +181,7 @@ zenCKSOption-group-mediaAndDisplay = Myndefni og birting zenCKSOption-group-zen-compact-mode = Þjappað viðmót zenCKSOption-group-zen-workspace = Vinnusvæði zenCKSOption-group-zen-other = Aðrir eiginleikar Zen -zenCKSOption-group-zen-split-view = Klofningarsýn +zenCKSOption-group-zen-split-view = Klofið yfirlit zenCKSOption-group-devTools = Forritunarverkfæri zen-key-quick-restart = Fljótleg endurræsing zen-window-new-shortcut = Nýr gluggi @@ -283,11 +283,11 @@ zen-workspace-shortcut-forward = Vinnusvæði áfram zen-workspace-shortcut-backward = Vinnusvæði afturábak zen-sidebar-shortcut-toggle = Víxla breidd hliðarspjalds zen-pinned-tab-shortcut-reset = Endursetja festan flipa á festa slóð -zen-split-view-shortcut-grid = Víxla reitaskiptri klofningarsýn -zen-split-view-shortcut-vertical = Víxla lóðréttri klofningarsýn -zen-split-view-shortcut-horizontal = Víxla láréttri klofningarsýn -zen-split-view-shortcut-unsplit = Hætta klofningarsýn -zen-new-empty-split-view-shortcut = Ný auð klofningarsýn +zen-split-view-shortcut-grid = Víxla reitaskiptu klofnu yfirliti +zen-split-view-shortcut-vertical = Víxla lóðréttu klofnu yfirliti +zen-split-view-shortcut-horizontal = Víxla láréttu klofnu yfirliti +zen-split-view-shortcut-unsplit = Loka klofnu yfirliti +zen-new-empty-split-view-shortcut = Nýtt autt klofið yfirlit zen-key-select-tab-1 = Velja flipa #1 zen-key-select-tab-2 = Velja flipa #2 zen-key-select-tab-3 = Velja flipa #3 @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Víxla DOM af/á zen-devtools-toggle-accessibility-shortcut = Víxla auðvelduðu aðgengi af/á zen-close-all-unpinned-tabs-shortcut = Loka öllum ófestum flipum zen-new-unsynced-window-shortcut = Nýr auður gluggi +zen-duplicate-tab-shortcut = Tvítaka flipa diff --git a/locales/is/browser/browser/zen-general.ftl b/locales/is/browser/browser/zen-general.ftl index fa7468dbc..39f8aa763 100644 --- a/locales/is/browser/browser/zen-general.ftl +++ b/locales/is/browser/browser/zen-general.ftl @@ -48,6 +48,7 @@ zen-pinned-tab-replaced = URL-slóð festa flipans hefur verið skipt út með f zen-tabs-renamed = Tókst að endurnefna flipann! zen-background-tab-opened-toast = Nýr bakgrunnsflipi opnaður! zen-workspace-renamed-toast = Tókst að endurnefna vinnusvæðið! +zen-split-view-limit-toast = Get ekki bætt fleiri spjöldum á klofið yfirlit! zen-toggle-compact-mode-button = .label = Þjappað viðmót .tooltiptext = Víxla þjöppuðu viðmóti diff --git a/locales/is/browser/browser/zen-split-view.ftl b/locales/is/browser/browser/zen-split-view.ftl index 47e317d79..04158c866 100644 --- a/locales/is/browser/browser/zen-split-view.ftl +++ b/locales/is/browser/browser/zen-split-view.ftl @@ -5,13 +5,14 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Skipta tengli (margir valdir flipar nauðsynlegir) - *[other] Skipta { $tabCount } flipum + [-1] Kljúfa út flipa + [1] Bæta við klofnu yfirliti... + *[other] Sameina { $tabCount } flipa } .accesskey = S zen-split-link = .label = Kljúfa tengil í nýjan flipa .accesskey = S -zen-split-view-modifier-header = Klofningarsýn +zen-split-view-modifier-header = Klofið yfirlit zen-split-view-modifier-activate-reallocation = .label = Virkja umröðun diff --git a/locales/is/browser/browser/zen-vertical-tabs.ftl b/locales/is/browser/browser/zen-vertical-tabs.ftl index 422618c21..15fa498b3 100644 --- a/locales/is/browser/browser/zen-vertical-tabs.ftl +++ b/locales/is/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Fela bæði .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Færa í möppu... + .accesskey = M zen-toolbar-context-new-folder = .label = Ný mappa .accesskey = N diff --git a/locales/it/browser/browser/preferences/zen-preferences.ftl b/locales/it/browser/browser/preferences/zen-preferences.ftl index a1ab688e8..91ddbba1b 100644 --- a/locales/it/browser/browser/preferences/zen-preferences.ftl +++ b/locales/it/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Attiva/Disattiva DOM zen-devtools-toggle-accessibility-shortcut = Attiva/Disattiva Accessibilità zen-close-all-unpinned-tabs-shortcut = Chiudi Tutte Le Schede Non Bloccate zen-new-unsynced-window-shortcut = New Unsynced Window +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/it/browser/browser/zen-general.ftl b/locales/it/browser/browser/zen-general.ftl index 9e06ec892..b4b052db6 100644 --- a/locales/it/browser/browser/zen-general.ftl +++ b/locales/it/browser/browser/zen-general.ftl @@ -48,6 +48,7 @@ zen-pinned-tab-replaced = L'URL della scheda bloccata è stato sostituito con l' zen-tabs-renamed = La scheda è stata rinominata con successo! zen-background-tab-opened-toast = Nuova scheda aperta in background! zen-workspace-renamed-toast = Il Workspace è stato rinominato con successo! +zen-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Modalità compatta .tooltiptext = Attiva/disattiva Modalità compatta diff --git a/locales/it/browser/browser/zen-split-view.ftl b/locales/it/browser/browser/zen-split-view.ftl index 31a8ad7a5..27af93a9b 100644 --- a/locales/it/browser/browser/zen-split-view.ftl +++ b/locales/it/browser/browser/zen-split-view.ftl @@ -5,7 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Split Tab (sono necessarie più schede selezionate) + [-1] Split out tab + [1] Add split view... *[other] Join { $tabCount } Tabs } .accesskey = S diff --git a/locales/it/browser/browser/zen-vertical-tabs.ftl b/locales/it/browser/browser/zen-vertical-tabs.ftl index d5c8357e4..ca8bf28a1 100644 --- a/locales/it/browser/browser/zen-vertical-tabs.ftl +++ b/locales/it/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Nascondi entrambi .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = Nuova cartella .accesskey = N diff --git a/locales/ja/browser/browser/preferences/zen-preferences.ftl b/locales/ja/browser/browser/preferences/zen-preferences.ftl index 33aa65fc3..feab7607a 100644 --- a/locales/ja/browser/browser/preferences/zen-preferences.ftl +++ b/locales/ja/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = DOMの切り替え zen-devtools-toggle-accessibility-shortcut = アクセシビリティの切り替え zen-close-all-unpinned-tabs-shortcut = ピン留めされていないすべてのタブを閉じる zen-new-unsynced-window-shortcut = New Unsynced Window +zen-duplicate-tab-shortcut = タブを複製 diff --git a/locales/ja/browser/browser/zen-general.ftl b/locales/ja/browser/browser/zen-general.ftl index 7f272d724..81f90c814 100644 --- a/locales/ja/browser/browser/zen-general.ftl +++ b/locales/ja/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = 固定したタブのURLが現在のURLに置き換え zen-tabs-renamed = タブの名前は無事に変更されました! zen-background-tab-opened-toast = 新しい背景タブが開きました! zen-workspace-renamed-toast = ワークスペースの名前が変更されました! +zen-split-view-limit-toast = 分割ビューにこれ以上パネルを追加できません! zen-toggle-compact-mode-button = .label = コンパクトモード .tooltiptext = コンパクトモードの切り替え diff --git a/locales/ja/browser/browser/zen-split-view.ftl b/locales/ja/browser/browser/zen-split-view.ftl index d5c224f25..85df2f982 100644 --- a/locales/ja/browser/browser/zen-split-view.ftl +++ b/locales/ja/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] タブを分割する(2つ以上のタブを選択してください) - *[other] 選択したタブを{ $tabCount }つに分割する + [-1] 分割タブ + [1] 分割ビューを追加... + *[other] { $tabCount } 個のタブを結合するs } .accesskey = S zen-split-link = diff --git a/locales/ja/browser/browser/zen-vertical-tabs.ftl b/locales/ja/browser/browser/zen-vertical-tabs.ftl index c759ab05d..3024f09ed 100644 --- a/locales/ja/browser/browser/zen-vertical-tabs.ftl +++ b/locales/ja/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = サイドバーとツールバーを隠す .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = 新しいフォルダ .accesskey = N diff --git a/locales/ko/browser/browser/preferences/zen-preferences.ftl b/locales/ko/browser/browser/preferences/zen-preferences.ftl index 143922cf1..a1f34396e 100644 --- a/locales/ko/browser/browser/preferences/zen-preferences.ftl +++ b/locales/ko/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = DOM 탭 전환 zen-devtools-toggle-accessibility-shortcut = 접근성 탭 전환 zen-close-all-unpinned-tabs-shortcut = 모든 고정되지 않은 탭 닫기 zen-new-unsynced-window-shortcut = 새 비동기화 창 +zen-duplicate-tab-shortcut = 탭 복제 diff --git a/locales/ko/browser/browser/zen-general.ftl b/locales/ko/browser/browser/zen-general.ftl index 3c99a323a..dd2018713 100644 --- a/locales/ko/browser/browser/zen-general.ftl +++ b/locales/ko/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = 고정 URL이 현재 URL로 변경되었습니다! zen-tabs-renamed = 탭의 이름이 성공적으로 변경되었습니다! zen-background-tab-opened-toast = 새 백그라운드 탭이 열렸습니다! zen-workspace-renamed-toast = 워크스페이스 이름이 변경되었습니다! +zen-split-view-limit-toast = 패널을 더 추가할 수 없습니다! zen-toggle-compact-mode-button = .label = 사이드바 축소 모드 .tooltiptext = 사이드바 축소 토글 diff --git a/locales/ko/browser/browser/zen-split-view.ftl b/locales/ko/browser/browser/zen-split-view.ftl index e742efdf2..ac933dac1 100644 --- a/locales/ko/browser/browser/zen-split-view.ftl +++ b/locales/ko/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] 탭 나누기 (여러 탭이 선택되어 있어야 함) - *[other] 탭 { $tabCount }개 나누기 + [-1] 탭 나누기 + [1] 나눠진 탭 추가... + *[other] { $tabCount }개 탭 합치기 } .accesskey = S zen-split-link = diff --git a/locales/ko/browser/browser/zen-vertical-tabs.ftl b/locales/ko/browser/browser/zen-vertical-tabs.ftl index 269f6a93b..90b619006 100644 --- a/locales/ko/browser/browser/zen-vertical-tabs.ftl +++ b/locales/ko/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = 둘 다 숨기기 .accesskey = H +zen-toolbar-context-move-to-folder = + .label = 폴더로 옮기기... + .accesskey = M zen-toolbar-context-new-folder = .label = 새 폴더 .accesskey = N diff --git a/locales/lt/browser/browser/preferences/zen-preferences.ftl b/locales/lt/browser/browser/preferences/zen-preferences.ftl index 7a9822f54..f909cd273 100644 --- a/locales/lt/browser/browser/preferences/zen-preferences.ftl +++ b/locales/lt/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Perjungti DOM zen-devtools-toggle-accessibility-shortcut = Perjungti prieinamumą zen-close-all-unpinned-tabs-shortcut = Užverti visas neprisegtas korteles zen-new-unsynced-window-shortcut = Naujas tuščias langas +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/lt/browser/browser/zen-general.ftl b/locales/lt/browser/browser/zen-general.ftl index 376ff37ff..453e25076 100644 --- a/locales/lt/browser/browser/zen-general.ftl +++ b/locales/lt/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Prisegtos kortelės URL pakeistas dabartiniu URL. zen-tabs-renamed = Kortelė sėkmingai pervadinta. zen-background-tab-opened-toast = Nauja fonos kortelė atverta. zen-workspace-renamed-toast = Darbo sritis sėkmingai pervadintas. +zen-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Kompaktinis režimas .tooltiptext = Perjungti kompaktinį režimą diff --git a/locales/lt/browser/browser/zen-split-view.ftl b/locales/lt/browser/browser/zen-split-view.ftl index 1e309f3dd..8d74bbfef 100644 --- a/locales/lt/browser/browser/zen-split-view.ftl +++ b/locales/lt/browser/browser/zen-split-view.ftl @@ -5,11 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Skaidyti kortelę (reikia kelių pasirinktų kortelių) - [one] Skaidyti { $tabCount } kortelę - [few] Skaidyti { $tabCount } korteles - [many] Skaidyti { $tabCount } kortelės - *[other] Skaidyti { $tabCount } kortelių + [-1] Split out tab + [1] Add split view... + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/lt/browser/browser/zen-vertical-tabs.ftl b/locales/lt/browser/browser/zen-vertical-tabs.ftl index 52542643a..ed7cc7e80 100644 --- a/locales/lt/browser/browser/zen-vertical-tabs.ftl +++ b/locales/lt/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Slėpti abi .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = Naujas aplankas .accesskey = N diff --git a/locales/nb/browser/browser/preferences/zen-preferences.ftl b/locales/nb/browser/browser/preferences/zen-preferences.ftl index d34e4a570..0feb70cca 100644 --- a/locales/nb/browser/browser/preferences/zen-preferences.ftl +++ b/locales/nb/browser/browser/preferences/zen-preferences.ftl @@ -316,4 +316,5 @@ zen-devtools-toggle-storage-shortcut = Veksle Lagring zen-devtools-toggle-dom-shortcut = Veksle DOM zen-devtools-toggle-accessibility-shortcut = Veksle Tilgjengelighet zen-close-all-unpinned-tabs-shortcut = Lukk alle ufestede faner -zen-new-unsynced-window-shortcut = Nytt usynkronisert vindu +zen-new-unsynced-window-shortcut = Nytt tomt vindu +zen-duplicate-tab-shortcut = Dupliser fane diff --git a/locales/nb/browser/browser/zen-general.ftl b/locales/nb/browser/browser/zen-general.ftl index 6255689e7..97afeee60 100644 --- a/locales/nb/browser/browser/zen-general.ftl +++ b/locales/nb/browser/browser/zen-general.ftl @@ -2,26 +2,26 @@ # 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/. -zen-panel-ui-current-profile-text = nåværende profil -unified-extensions-description = Utvidelser er brukt for å bringe mer ekstra funksjonalitet til { -brand-short-name }. +zen-panel-ui-current-profile-text = gjeldende profil +unified-extensions-description = Utvidelser brukes for å bringe ekstra funksjonalitet til { -brand-short-name }. tab-context-zen-reset-pinned-tab = .label = { $isEssential -> - [true] Nullstill essensiell fane + [true] Nullstill Essential fane *[false] Nullstill festet fane } .accesskey = R tab-context-zen-add-essential = - .label = Legg til i essensielle + .label = Legg til i Essentials .accesskey = E tab-context-zen-add-essential-badge = { $num } / { $max } tab-context-zen-remove-essential = - .label = Fjern fra essensielle + .label = Fjern fra Essentials .accesskey = R tab-context-zen-replace-pinned-url-with-current = .label = { $isEssential -> - [true] Erstatt essensiell nettadresse med gjeldende + [true] Erstatt Essential nettadresse med gjeldende *[false] Erstatt festet nettadresse med gjeldende } .accesskey = C @@ -30,7 +30,7 @@ tab-context-zen-edit-title = tab-context-zen-edit-icon = .label = Endre ikon... zen-themes-corrupted = Din { -brand-short-name }-mods fil er skadet. De har blitt tilbakestilt til standardtemaet. -zen-shortcuts-corrupted = { -brand-short-name } snarvei-filen din er skadet. De har blitt tilbakestilt til standard snarveier. +zen-shortcuts-corrupted = { -brand-short-name } snarvei-filen din er skadet. De har blitt tilbakestilt til standard-snarveiene. # note: Do not translate the "
" tags in the following string zen-new-urlbar-notification = Det nye nettadressefeltet har blitt aktivert, som tar vekk behovet for nye fanesider.

@@ -46,13 +46,14 @@ zen-general-cancel-label = .label = Avbryt zen-general-confirm = .label = Bekreft -zen-pinned-tab-replaced = Nettadressen til den festede fanen har blitt erstattet med gjeldende nettadresse! +zen-pinned-tab-replaced = Festet fanes nettadresse har blit erstattet med gjeldende nettadresse! zen-tabs-renamed = Fanen har fått nytt navn! zen-background-tab-opened-toast = Ny bakgrunnsfane åpnet! zen-workspace-renamed-toast = Arbeidsområdet har fått nytt navn! +zen-split-view-limit-toast = Kan ikke legge til flere paneler i delt visning! zen-toggle-compact-mode-button = - .label = Kompaktmodus - .tooltiptext = Veksle kompaktmodus + .label = Kompakt modus + .tooltiptext = Veksle kompakt modus # note: Do not translate the "
" tags in the following string @@ -69,7 +70,7 @@ zen-site-data-settings = Innstillinger zen-generic-manage = Behandle zen-generic-more = Mer zen-generic-next = Neste -zen-essentials-promo-label = Legg til i essensielle +zen-essentials-promo-label = Legg til i Essentials zen-essentials-promo-sublabel = Hold favorittfanene dine bare et klikk unna # These labels will be used for the site data panel settings zen-site-data-setting-allow = Tillat diff --git a/locales/nb/browser/browser/zen-split-view.ftl b/locales/nb/browser/browser/zen-split-view.ftl index 8010baa96..93bf95ad6 100644 --- a/locales/nb/browser/browser/zen-split-view.ftl +++ b/locales/nb/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Del fane (flere valgte faner trengs) - *[other] Del { $tabCount } faner + [-1] Fordelt fane + [1] Legg til delt visning + *[other] Spleis { $tabCount } faner } .accesskey = S zen-split-link = diff --git a/locales/nb/browser/browser/zen-vertical-tabs.ftl b/locales/nb/browser/browser/zen-vertical-tabs.ftl index 434f68633..c5e89d3e1 100644 --- a/locales/nb/browser/browser/zen-vertical-tabs.ftl +++ b/locales/nb/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Skjul begge .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Flytt til mappe... + .accesskey = Flytt zen-toolbar-context-new-folder = .label = Ny mappe .accesskey = N diff --git a/locales/nb/browser/browser/zen-welcome.ftl b/locales/nb/browser/browser/zen-welcome.ftl index 43f4ea7f9..e29b123af 100644 --- a/locales/nb/browser/browser/zen-welcome.ftl +++ b/locales/nb/browser/browser/zen-welcome.ftl @@ -6,7 +6,7 @@ zen-welcome-title-line1 = Velkommen til zen-welcome-title-line2 = et roligere internett zen-welcome-import-title = En ny start, samme bokmerker zen-welcome-import-description-1 = Bokmerker, historikken og passordene dine er som en sti av brødsmuler gjennom internettet — ikke la dem ligge igjen! -zen-welcome-import-description-2 = Overfør dem enkelt fra en annen nettleser og fortsett akkuratt der du slapp. +zen-welcome-import-description-2 = Overfør dem enkelt fra en annen nettleser og fortsett akkurat der du slapp. zen-welcome-import-button = Importer nå zen-welcome-set-default-browser = Sett { -brand-short-name } som din standard nettleser zen-welcome-dont-set-default-browser = IKKE sett { -brand-short-name } som din standard nettleser diff --git a/locales/nl/browser/browser/preferences/zen-preferences.ftl b/locales/nl/browser/browser/preferences/zen-preferences.ftl index 281e9755e..1db60e73f 100644 --- a/locales/nl/browser/browser/preferences/zen-preferences.ftl +++ b/locales/nl/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = DOM togglen zen-devtools-toggle-accessibility-shortcut = Toegankelijkheid togglen zen-close-all-unpinned-tabs-shortcut = Alle niet-vastgezette tabbladen sluiten zen-new-unsynced-window-shortcut = Nieuw leeg venster +zen-duplicate-tab-shortcut = Tabblad dupliceren diff --git a/locales/nl/browser/browser/zen-general.ftl b/locales/nl/browser/browser/zen-general.ftl index 0f6bb7a16..045faced3 100644 --- a/locales/nl/browser/browser/zen-general.ftl +++ b/locales/nl/browser/browser/zen-general.ftl @@ -14,7 +14,7 @@ tab-context-zen-reset-pinned-tab = tab-context-zen-add-essential = .label = Toevoegen aan Essentials .accesskey = E -tab-context-zen-add-essential-badge = { $num } / { $max } plekken gevuld +tab-context-zen-add-essential-badge = { $num } / { $max } plekken bezet tab-context-zen-remove-essential = .label = Verwijderen uit Essentials .accesskey = R @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Vastgemaakte tabblad URL is vervangen met de huidige U zen-tabs-renamed = Tabblad is succesvol hernoemd! zen-background-tab-opened-toast = Nieuw achtergrondtabblad geopend! zen-workspace-renamed-toast = Werkruimte succesvol is hernoemd! +zen-split-view-limit-toast = Kan geen panelen meer toevoegen aan de gesplitste weergave! zen-toggle-compact-mode-button = .label = Compacte modus .tooltiptext = Compacte modus togglen diff --git a/locales/nl/browser/browser/zen-menubar.ftl b/locales/nl/browser/browser/zen-menubar.ftl index f42fbea90..7757e34f2 100644 --- a/locales/nl/browser/browser/zen-menubar.ftl +++ b/locales/nl/browser/browser/zen-menubar.ftl @@ -19,4 +19,4 @@ zen-menubar-appearance-light = zen-menubar-appearance-dark = .label = Donker zen-menubar-new-blank-window = - .label = New Blank Window + .label = Nieuw blanco venster diff --git a/locales/nl/browser/browser/zen-split-view.ftl b/locales/nl/browser/browser/zen-split-view.ftl index 9f0121fba..e700a9f78 100644 --- a/locales/nl/browser/browser/zen-split-view.ftl +++ b/locales/nl/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Splits tabblad (meerdere geselecteerde tabbladen vereist) - *[other] Splits { $tabCount } tabbladen + [-1] Splits tabbladen op + [1] Voeg gesplitste weergave toe... + *[other] Voeg { $tabCount } tabbladen samen } .accesskey = S zen-split-link = diff --git a/locales/nl/browser/browser/zen-vertical-tabs.ftl b/locales/nl/browser/browser/zen-vertical-tabs.ftl index b46aaaca8..bd2250a67 100644 --- a/locales/nl/browser/browser/zen-vertical-tabs.ftl +++ b/locales/nl/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Beide verbergen .accesskey = U +zen-toolbar-context-move-to-folder = + .label = Verplaats naar map... + .accesskey = M zen-toolbar-context-new-folder = .label = Nieuwe map .accesskey = N @@ -38,7 +41,7 @@ tabbrowser-reset-pin-button = } zen-tab-sublabel = { $tabSubtitle -> - [zen-default-pinned] Back to pinned url - [zen-default-pinned-cmd] Separate from pinned tab + [zen-default-pinned] Terug naar vastgezette URL + [zen-default-pinned-cmd] Afsplitsen van vastgezette tabblad *[other] { $tabSubtitle } } diff --git a/locales/nl/browser/browser/zen-workspaces.ftl b/locales/nl/browser/browser/zen-workspaces.ftl index 2d2529937..11ba1aad7 100644 --- a/locales/nl/browser/browser/zen-workspaces.ftl +++ b/locales/nl/browser/browser/zen-workspaces.ftl @@ -10,7 +10,7 @@ zen-panel-ui-workspaces-create = zen-panel-ui-folder-create = .label = Map aanmaken zen-panel-ui-live-folder-create = - .label = Live Folder + .label = Live map zen-panel-ui-new-empty-split = .label = Nieuwe splitsing zen-workspaces-panel-context-delete = @@ -25,7 +25,7 @@ zen-workspaces-panel-context-default-profile = zen-workspaces-panel-unload = .label = Ruimte ontladen zen-workspaces-panel-unload-others = - .label = Unload All Other Spaces + .label = Alle andere ruimtes ontladen zen-workspaces-how-to-reorder-title = Hoe ruimtes te herschikken zen-workspaces-how-to-reorder-desc = Sleep het ruimte icoon onderaan de zijbalk om ze te herschikken zen-workspaces-change-theme = diff --git a/locales/nn-NO/browser/browser/preferences/zen-preferences.ftl b/locales/nn-NO/browser/browser/preferences/zen-preferences.ftl index a9765ae24..61552982c 100644 --- a/locales/nn-NO/browser/browser/preferences/zen-preferences.ftl +++ b/locales/nn-NO/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toggle DOM zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs zen-new-unsynced-window-shortcut = New Unsynced Window +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/nn-NO/browser/browser/zen-general.ftl b/locales/nn-NO/browser/browser/zen-general.ftl index fed8bc947..f4cd42a80 100644 --- a/locales/nn-NO/browser/browser/zen-general.ftl +++ b/locales/nn-NO/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ 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-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Compact Mode .tooltiptext = Toggle Compact Mode diff --git a/locales/nn-NO/browser/browser/zen-split-view.ftl b/locales/nn-NO/browser/browser/zen-split-view.ftl index 743688eed..4430fab34 100644 --- a/locales/nn-NO/browser/browser/zen-split-view.ftl +++ b/locales/nn-NO/browser/browser/zen-split-view.ftl @@ -5,7 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Join Tab (multiple selected tabs needed) + [-1] Split out tab + [1] Add split view... *[other] Join { $tabCount } Tabs } .accesskey = S diff --git a/locales/nn-NO/browser/browser/zen-vertical-tabs.ftl b/locales/nn-NO/browser/browser/zen-vertical-tabs.ftl index 41494167b..cddebc1ee 100644 --- a/locales/nn-NO/browser/browser/zen-vertical-tabs.ftl +++ b/locales/nn-NO/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Hide both .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = New Folder .accesskey = N diff --git a/locales/pl/browser/browser/preferences/zen-preferences.ftl b/locales/pl/browser/browser/preferences/zen-preferences.ftl index cb32bb957..32fb99b1b 100644 --- a/locales/pl/browser/browser/preferences/zen-preferences.ftl +++ b/locales/pl/browser/browser/preferences/zen-preferences.ftl @@ -98,7 +98,7 @@ zen-vertical-tabs-newtab-top-button-up = .label = Przenieś przycisk nowej karty na górę zen-vertical-tabs-expand-tabs-by-default = Rozwiń karty domyślnie zen-vertical-tabs-dont-expand-tabs-by-default = Nie rozwijaj domyślnie kart -zen-vertical-tabs-expand-tabs-on-hover = Rozwiń zakładki po najechaniu kursorem (nie działa w trybie kompaktowym) +zen-vertical-tabs-expand-tabs-on-hover = Rozwiń karty po najechaniu kursorem (nie działa w trybie kompaktowym) zen-vertical-tabs-expand-tabs-header = Jak rozwinąć karty zen-vertical-tabs-expand-tabs-description = Wybierz sposób rozwijania kart na pasku bocznym zen-theme-marketplace-header = Modyfikacje Zen @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Włącz DOM zen-devtools-toggle-accessibility-shortcut = Włącz Dostępność zen-close-all-unpinned-tabs-shortcut = Zamknij wszystkie nieprzypięte karty zen-new-unsynced-window-shortcut = Nowe niesynchronizowane okno +zen-duplicate-tab-shortcut = Duplikuj kartę diff --git a/locales/pl/browser/browser/zen-general.ftl b/locales/pl/browser/browser/zen-general.ftl index 43b723f1e..3d041a34f 100644 --- a/locales/pl/browser/browser/zen-general.ftl +++ b/locales/pl/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = URL przypiętej karty został zastąpiony bieżącym a zen-tabs-renamed = Nazwa karty została pomyślnie zmieniona! zen-background-tab-opened-toast = Nowa karta została otworzona w tle! zen-workspace-renamed-toast = Zmieniono nazwę przestrzeni roboczej! +zen-split-view-limit-toast = Nie można dodać kolejnych paneli do widoku podzielonego! zen-toggle-compact-mode-button = .label = Tryb kompaktowy .tooltiptext = Przełącz tryb kompaktowy diff --git a/locales/pl/browser/browser/zen-split-view.ftl b/locales/pl/browser/browser/zen-split-view.ftl index 54b7f4722..a706f90eb 100644 --- a/locales/pl/browser/browser/zen-split-view.ftl +++ b/locales/pl/browser/browser/zen-split-view.ftl @@ -6,7 +6,7 @@ tab-zen-split-tabs = .label = { $tabCount -> [-1] Oddziel kartę - [1] Złącz kartę (wymagane jest zaznaczenie wielu kart) + [1] Utwórz widok podzielony [few] Złącz { $tabCount } karty *[other] Złącz { $tabCount } kart } diff --git a/locales/pl/browser/browser/zen-vertical-tabs.ftl b/locales/pl/browser/browser/zen-vertical-tabs.ftl index 23c158b23..5b5cb6824 100644 --- a/locales/pl/browser/browser/zen-vertical-tabs.ftl +++ b/locales/pl/browser/browser/zen-vertical-tabs.ftl @@ -3,7 +3,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. zen-toolbar-context-tabs-right = - .label = Zakładki po prawej + .label = Karty po prawej .accesskey = R zen-toolbar-context-compact-mode = .label = Tryb kompaktowy @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Ukryj oba .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Przenieś do folderu... + .accesskey = M zen-toolbar-context-new-folder = .label = Nowy folder .accesskey = N diff --git a/locales/pl/browser/browser/zen-workspaces.ftl b/locales/pl/browser/browser/zen-workspaces.ftl index 9b2cfc70d..143622b49 100644 --- a/locales/pl/browser/browser/zen-workspaces.ftl +++ b/locales/pl/browser/browser/zen-workspaces.ftl @@ -58,7 +58,7 @@ zen-move-tab-to-workspace-button = zen-workspaces-panel-context-reorder = .label = Reorganizuj przestrzenie zen-workspace-creation-profile = Profil - .tooltiptext = Profile są wykorzystywane do oddzielenia ciasteczek i danych stron pomiędzy przestrzeniami. + .tooltiptext = Profile służą do rozdzielania plików cookie i danych witryny między przestrzeniami. zen-workspace-creation-header = Utwórz przestrzeń zen-workspace-creation-label = Przestrzenie są wykorzystywane do zorganizowania kart i sesji. zen-workspaces-delete-workspace-title = Usunąć przestrzeń? diff --git a/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl b/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl index 14bc467d5..8bc0fee98 100644 --- a/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl +++ b/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Ativar/Desativar DOM zen-devtools-toggle-accessibility-shortcut = Ativar/Desativar Acessibilidade zen-close-all-unpinned-tabs-shortcut = Fechar Todas as Abas Não Fixadas zen-new-unsynced-window-shortcut = Nova Janela Dessincronizada +zen-duplicate-tab-shortcut = Duplicar Aba diff --git a/locales/pt-BR/browser/browser/zen-general.ftl b/locales/pt-BR/browser/browser/zen-general.ftl index f8ba80093..d1a05e002 100644 --- a/locales/pt-BR/browser/browser/zen-general.ftl +++ b/locales/pt-BR/browser/browser/zen-general.ftl @@ -48,6 +48,7 @@ zen-pinned-tab-replaced = A URL da guia fixada foi substituída pela URL atual! zen-tabs-renamed = A guia foi renomeada com sucesso! zen-background-tab-opened-toast = Nova guia em segundo plano aberta! zen-workspace-renamed-toast = A área de trabalho foi renomeada com sucesso! +zen-split-view-limit-toast = Não é possível adicionar mais painéis à visualização dividida! zen-toggle-compact-mode-button = .label = Modo Compacto .tooltiptext = Alternar Modo Compacto diff --git a/locales/pt-BR/browser/browser/zen-split-view.ftl b/locales/pt-BR/browser/browser/zen-split-view.ftl index 83351cef1..9006d5896 100644 --- a/locales/pt-BR/browser/browser/zen-split-view.ftl +++ b/locales/pt-BR/browser/browser/zen-split-view.ftl @@ -5,8 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [-1] Dividir aba - [1] Juntar Aba (necessário várias abas selecionadas) + [-1] Dividir Aba + [1] Adicionar divisão... *[other] Juntar { $tabCount } Abas } .accesskey = S.O. diff --git a/locales/pt-BR/browser/browser/zen-vertical-tabs.ftl b/locales/pt-BR/browser/browser/zen-vertical-tabs.ftl index 19aeefae9..152f25918 100644 --- a/locales/pt-BR/browser/browser/zen-vertical-tabs.ftl +++ b/locales/pt-BR/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Esconder os dois .accesskey = A +zen-toolbar-context-move-to-folder = + .label = Mover para Pasta... + .accesskey = M zen-toolbar-context-new-folder = .label = Nova Pasta .accesskey = N diff --git a/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl b/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl index 4bb041172..8ed17f431 100644 --- a/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl +++ b/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl @@ -43,11 +43,11 @@ category-zen-workspaces = .tooltiptext = { pane-zen-tabs-title } pane-settings-workspaces-title = Espaços de Trabalho zen-tabs-select-recently-used-on-close = - .label = When closing a tab, switch to the most recently used tab instead of the next tab + .label = Ao fechar um separador, mudar para o separador usado mais recentemente, em vez do próximo separador zen-tabs-close-on-back-with-no-history = .label = Fechar separador e mudar para o seu separador proprietário (ou para o mais recente) quando retroceder zen-settings-workspaces-sync-unpinned-tabs = - .label = Sync only pinned tabs in workspaces + .label = Sincronizar apenas separadores fixados em espaços de trabalho zen-tabs-cycle-by-attribute = .label = Ctrl+Tab percorre apenas nos separadores Essenciais e de Espaço de trabalho zen-tabs-cycle-ignore-pending-tabs = @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Alternar DOM zen-devtools-toggle-accessibility-shortcut = Alternar Acessibilidade zen-close-all-unpinned-tabs-shortcut = Fechar Todos os Separadores Não Fixados zen-new-unsynced-window-shortcut = Nova janela sem sincronização +zen-duplicate-tab-shortcut = Duplicar Separador diff --git a/locales/pt-PT/browser/browser/zen-general.ftl b/locales/pt-PT/browser/browser/zen-general.ftl index 609ad22f4..c92bfecfe 100644 --- a/locales/pt-PT/browser/browser/zen-general.ftl +++ b/locales/pt-PT/browser/browser/zen-general.ftl @@ -7,8 +7,8 @@ unified-extensions-description = As extensões são usadas para trazer funcional tab-context-zen-reset-pinned-tab = .label = { $isEssential -> - [true] Reset Essential Tab - *[false] Reset Pinned Tab + [true] Repor Separador Essencial + *[false] Repor Separador Fixado } .accesskey = R tab-context-zen-add-essential = @@ -21,8 +21,8 @@ tab-context-zen-remove-essential = tab-context-zen-replace-pinned-url-with-current = .label = { $isEssential -> - [true] Replace Essential URL with Current - *[false] Replace Pinned URL with Current + [true] Substituir URL Essencial com o Atual + *[false] Substituir URL Fixado com o Atual } .accesskey = C tab-context-zen-edit-title = @@ -41,7 +41,7 @@ pictureinpicture-minimize-btn = .tooltip = Minimizar zen-panel-ui-gradient-generator-custom-color = Cor personalizada zen-copy-current-url-confirmation = URL atual copiado! -zen-copy-current-url-as-markdown-confirmation = Copied current URL as Markdown! +zen-copy-current-url-as-markdown-confirmation = URL atual copiado em Markdown! zen-general-cancel-label = .label = Cancelar zen-general-confirm = @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = O URL do separador fixado foi substituído pelo URL at zen-tabs-renamed = Nome do separador alterado com sucesso! zen-background-tab-opened-toast = Novo separador aberto em segundo plano! zen-workspace-renamed-toast = Nome do espaço de trabalho alterado com sucesso! +zen-split-view-limit-toast = Não é possível adicionar mais painéis à vista dividida! zen-toggle-compact-mode-button = .label = Modo Compacto .tooltiptext = Alternar Modo Compacto @@ -123,4 +124,4 @@ zen-window-sync-migration-dialog-message = Agora, o Zen sincroniza as janelas no zen-window-sync-migration-dialog-learn-more = Saber Mais zen-window-sync-migration-dialog-accept = Entendido zen-appmenu-new-blank-window = - .label = New blank window + .label = Nova janela sem sincronização diff --git a/locales/pt-PT/browser/browser/zen-menubar.ftl b/locales/pt-PT/browser/browser/zen-menubar.ftl index 0c6919501..c0ac59017 100644 --- a/locales/pt-PT/browser/browser/zen-menubar.ftl +++ b/locales/pt-PT/browser/browser/zen-menubar.ftl @@ -19,4 +19,4 @@ zen-menubar-appearance-light = zen-menubar-appearance-dark = .label = Escuro zen-menubar-new-blank-window = - .label = New Blank Window + .label = Nova Janela sem Sincronização diff --git a/locales/pt-PT/browser/browser/zen-split-view.ftl b/locales/pt-PT/browser/browser/zen-split-view.ftl index 5983f03f8..e6e9e73f6 100644 --- a/locales/pt-PT/browser/browser/zen-split-view.ftl +++ b/locales/pt-PT/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Dividir Separadores (selecione vários separadores) - *[other] Dividir { $tabCount } Separadores + [-1] Dividir separador + [1] Adicionar vista dividida... + *[other] Juntar { $tabCount } Separadores } .accesskey = S zen-split-link = diff --git a/locales/pt-PT/browser/browser/zen-vertical-tabs.ftl b/locales/pt-PT/browser/browser/zen-vertical-tabs.ftl index bc873641d..190b4e630 100644 --- a/locales/pt-PT/browser/browser/zen-vertical-tabs.ftl +++ b/locales/pt-PT/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Ocultar ambas .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Mover para Pasta... + .accesskey = M zen-toolbar-context-new-folder = .label = Nova Pasta .accesskey = N @@ -28,7 +31,7 @@ tabbrowser-unload-tab-button = .tooltiptext = { $tabCount -> [one] Hibernar e mudar para o separador - *[other] Hibernar { $tabCount } separadores mudar para o primeiro + *[other] Hibernar { $tabCount } separadores e mudar para o primeiro } tabbrowser-reset-pin-button = .tooltiptext = @@ -37,8 +40,8 @@ tabbrowser-reset-pin-button = *[other] Restaurar e fixar { $tabCount } separadores } zen-tab-sublabel = - { $tabSubtitle -> - [zen-default-pinned] Back to pinned url - [zen-default-pinned-cmd] Separate from pinned tab + rl{ $tabSubtitle -> + [zen-default-pinned] Voltar para URL fixado + [zen-default-pinned-cmd] Separar do separador fixado *[other] { $tabSubtitle } } diff --git a/locales/pt-PT/browser/browser/zen-workspaces.ftl b/locales/pt-PT/browser/browser/zen-workspaces.ftl index c6e36e7f8..985a837c1 100644 --- a/locales/pt-PT/browser/browser/zen-workspaces.ftl +++ b/locales/pt-PT/browser/browser/zen-workspaces.ftl @@ -10,7 +10,7 @@ zen-panel-ui-workspaces-create = zen-panel-ui-folder-create = .label = Criar Pasta zen-panel-ui-live-folder-create = - .label = Live Folder + .label = Pasta Viva zen-panel-ui-new-empty-split = .label = Nova Divisão zen-workspaces-panel-context-delete = @@ -25,7 +25,7 @@ zen-workspaces-panel-context-default-profile = zen-workspaces-panel-unload = .label = Descarregar Espaço zen-workspaces-panel-unload-others = - .label = Unload All Other Spaces + .label = Descarregar Todos os Outros Espaços zen-workspaces-how-to-reorder-title = Como reordenar espaços zen-workspaces-how-to-reorder-desc = Arraste os ícones de espaço na parte inferior da barra lateral para os reordenar zen-workspaces-change-theme = diff --git a/locales/ro/browser/browser/preferences/zen-preferences.ftl b/locales/ro/browser/browser/preferences/zen-preferences.ftl index da9d313b4..ed26f72b8 100644 --- a/locales/ro/browser/browser/preferences/zen-preferences.ftl +++ b/locales/ro/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toggle DOM zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs zen-new-unsynced-window-shortcut = New Unsynced Window +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/ro/browser/browser/zen-general.ftl b/locales/ro/browser/browser/zen-general.ftl index 21d9a7475..709b4575f 100644 --- a/locales/ro/browser/browser/zen-general.ftl +++ b/locales/ro/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ 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-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Compact Mode .tooltiptext = Toggle Compact Mode diff --git a/locales/ro/browser/browser/zen-split-view.ftl b/locales/ro/browser/browser/zen-split-view.ftl index 743688eed..4430fab34 100644 --- a/locales/ro/browser/browser/zen-split-view.ftl +++ b/locales/ro/browser/browser/zen-split-view.ftl @@ -5,7 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Join Tab (multiple selected tabs needed) + [-1] Split out tab + [1] Add split view... *[other] Join { $tabCount } Tabs } .accesskey = S diff --git a/locales/ro/browser/browser/zen-vertical-tabs.ftl b/locales/ro/browser/browser/zen-vertical-tabs.ftl index ff8a3775c..9989c7666 100644 --- a/locales/ro/browser/browser/zen-vertical-tabs.ftl +++ b/locales/ro/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Hide both .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = New Folder .accesskey = N diff --git a/locales/ru/browser/browser/preferences/zen-preferences.ftl b/locales/ru/browser/browser/preferences/zen-preferences.ftl index 78388440c..4942900e9 100644 --- a/locales/ru/browser/browser/preferences/zen-preferences.ftl +++ b/locales/ru/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Переключить DOM zen-devtools-toggle-accessibility-shortcut = Включить/выключить специальные возможности zen-close-all-unpinned-tabs-shortcut = Закрыть все не закреплённые вкладки zen-new-unsynced-window-shortcut = Новое пустое окно +zen-duplicate-tab-shortcut = Дублировать вкладку diff --git a/locales/ru/browser/browser/zen-general.ftl b/locales/ru/browser/browser/zen-general.ftl index f23c9f228..af51df15e 100644 --- a/locales/ru/browser/browser/zen-general.ftl +++ b/locales/ru/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Адрес закреплённой вкладки з zen-tabs-renamed = Вкладка успешно переименована! zen-background-tab-opened-toast = Открыта новая фоновая вкладка! zen-workspace-renamed-toast = Пространство успешно переименовано! +zen-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Компактный режим .tooltiptext = Переключить компактный режим diff --git a/locales/ru/browser/browser/zen-split-view.ftl b/locales/ru/browser/browser/zen-split-view.ftl index 580394f91..b89b20b46 100644 --- a/locales/ru/browser/browser/zen-split-view.ftl +++ b/locales/ru/browser/browser/zen-split-view.ftl @@ -5,10 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Разделить вкладку (выберите несколько вкладок) - [one] Разделить { $tabCount } вкладку - [few] Разделить { $tabCount } вкладки - *[other] Разделить { $tabCount } вкладок + [-1] Split out tab + [1] Add split view... + *[other] Join { $tabCount } Tabs } .accesskey = Ы zen-split-link = diff --git a/locales/ru/browser/browser/zen-vertical-tabs.ftl b/locales/ru/browser/browser/zen-vertical-tabs.ftl index 8f5b9decf..6a9227289 100644 --- a/locales/ru/browser/browser/zen-vertical-tabs.ftl +++ b/locales/ru/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Скрыть оба .accesskey = Н +zen-toolbar-context-move-to-folder = + .label = Переместить в папку... + .accesskey = M zen-toolbar-context-new-folder = .label = Новая папка .accesskey = Т diff --git a/locales/sk/browser/browser/preferences/zen-preferences.ftl b/locales/sk/browser/browser/preferences/zen-preferences.ftl index a88a6104d..91d5cd501 100644 --- a/locales/sk/browser/browser/preferences/zen-preferences.ftl +++ b/locales/sk/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Prepnúť DOM zen-devtools-toggle-accessibility-shortcut = Prepnúť prístupnosť zen-close-all-unpinned-tabs-shortcut = Zatvoriť všetky nepripnuté karty zen-new-unsynced-window-shortcut = New Unsynced Window +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/sk/browser/browser/zen-general.ftl b/locales/sk/browser/browser/zen-general.ftl index 8b99903bc..2768b6852 100644 --- a/locales/sk/browser/browser/zen-general.ftl +++ b/locales/sk/browser/browser/zen-general.ftl @@ -48,6 +48,7 @@ zen-pinned-tab-replaced = URL pripnutej karty bola nahradená aktuálnou URL! zen-tabs-renamed = Karta bola úspešne premenovaná! zen-background-tab-opened-toast = Nová karta otvorená na pozadí! zen-workspace-renamed-toast = Pracovný priestor bol úspešne premenovaný! +zen-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Kompaktný Režim .tooltiptext = Prepnúť Kompaktný Režim diff --git a/locales/sk/browser/browser/zen-split-view.ftl b/locales/sk/browser/browser/zen-split-view.ftl index 3c7f07d8b..802a8db0f 100644 --- a/locales/sk/browser/browser/zen-split-view.ftl +++ b/locales/sk/browser/browser/zen-split-view.ftl @@ -5,7 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Join Tab (multiple selected tabs needed) + [-1] Split out tab + [1] Add split view... *[other] Join { $tabCount } Tabs } .accesskey = S diff --git a/locales/sk/browser/browser/zen-vertical-tabs.ftl b/locales/sk/browser/browser/zen-vertical-tabs.ftl index 42ea7be3a..03fab80b1 100644 --- a/locales/sk/browser/browser/zen-vertical-tabs.ftl +++ b/locales/sk/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Skryť oboje .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = Nový Priečinok .accesskey = N diff --git a/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl b/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl index fd3b8b586..5734cbcc6 100644 --- a/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl +++ b/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Växla DOM zen-devtools-toggle-accessibility-shortcut = Växla tillgänglighetsinställningar zen-close-all-unpinned-tabs-shortcut = Stäng alla flikar som inte är fästa zen-new-unsynced-window-shortcut = Nytt tomt fönster +zen-duplicate-tab-shortcut = Duplicera flik diff --git a/locales/sv-SE/browser/browser/zen-general.ftl b/locales/sv-SE/browser/browser/zen-general.ftl index 61acc0b1c..db279ce9e 100644 --- a/locales/sv-SE/browser/browser/zen-general.ftl +++ b/locales/sv-SE/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Den fästa flikens URL har ersatts med den aktuella UR zen-tabs-renamed = Fliken har fått nytt namn! zen-background-tab-opened-toast = Ny bakgrundsflik öppnad! zen-workspace-renamed-toast = Arbetsytan har fått ett nytt namn! +zen-split-view-limit-toast = Kan inte lägga till fler paneler till delad vy! zen-toggle-compact-mode-button = .label = Kompakt läge .tooltiptext = Växla kompakt läge diff --git a/locales/sv-SE/browser/browser/zen-split-view.ftl b/locales/sv-SE/browser/browser/zen-split-view.ftl index 9a2208714..6aacf61f4 100644 --- a/locales/sv-SE/browser/browser/zen-split-view.ftl +++ b/locales/sv-SE/browser/browser/zen-split-view.ftl @@ -5,9 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [-1] Avdela flikar - [1] Delad flik (flera valda flikar behövs) - *[other] Delad { $tabCount } flikar + [-1] Dela upp flik + [1] Lägg till delad vy... + *[other] Gå med i { $tabCount } flikar } .accesskey = S zen-split-link = diff --git a/locales/sv-SE/browser/browser/zen-vertical-tabs.ftl b/locales/sv-SE/browser/browser/zen-vertical-tabs.ftl index c474bd227..5d8e94fc6 100644 --- a/locales/sv-SE/browser/browser/zen-vertical-tabs.ftl +++ b/locales/sv-SE/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Dölj båda .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Flytta till mapp... + .accesskey = M zen-toolbar-context-new-folder = .label = Ny mapp .accesskey = N diff --git a/locales/th/browser/browser/preferences/zen-preferences.ftl b/locales/th/browser/browser/preferences/zen-preferences.ftl index e960be53a..809b5601a 100644 --- a/locales/th/browser/browser/preferences/zen-preferences.ftl +++ b/locales/th/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Toggle DOM zen-devtools-toggle-accessibility-shortcut = Toggle Accessibility zen-close-all-unpinned-tabs-shortcut = Close All Unpinned Tabs zen-new-unsynced-window-shortcut = New Unsynced Window +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/th/browser/browser/zen-general.ftl b/locales/th/browser/browser/zen-general.ftl index 4fc7e513a..c8f27e979 100644 --- a/locales/th/browser/browser/zen-general.ftl +++ b/locales/th/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ 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-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = โหมดกะทัดรัด .tooltiptext = Toggle Compact Mode diff --git a/locales/th/browser/browser/zen-split-view.ftl b/locales/th/browser/browser/zen-split-view.ftl index 743688eed..4430fab34 100644 --- a/locales/th/browser/browser/zen-split-view.ftl +++ b/locales/th/browser/browser/zen-split-view.ftl @@ -5,7 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Join Tab (multiple selected tabs needed) + [-1] Split out tab + [1] Add split view... *[other] Join { $tabCount } Tabs } .accesskey = S diff --git a/locales/th/browser/browser/zen-vertical-tabs.ftl b/locales/th/browser/browser/zen-vertical-tabs.ftl index cc392cbea..f808dd82d 100644 --- a/locales/th/browser/browser/zen-vertical-tabs.ftl +++ b/locales/th/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = ซ่อนทั้งคู่ .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = สร้างโฟลเดอร์ใหม่ .accesskey = N diff --git a/locales/tr/browser/browser/preferences/zen-preferences.ftl b/locales/tr/browser/browser/preferences/zen-preferences.ftl index 591473b78..9fe0debf3 100644 --- a/locales/tr/browser/browser/preferences/zen-preferences.ftl +++ b/locales/tr/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = DOM'u aç/kapat zen-devtools-toggle-accessibility-shortcut = Erişilebilirliği aç/kapat zen-close-all-unpinned-tabs-shortcut = Sabitlenmemiş tüm sekmeleri kapat zen-new-unsynced-window-shortcut = Yeni boş pencere +zen-duplicate-tab-shortcut = Sekmeyi çoğalt diff --git a/locales/tr/browser/browser/zen-general.ftl b/locales/tr/browser/browser/zen-general.ftl index ffe49dd44..111178b6b 100644 --- a/locales/tr/browser/browser/zen-general.ftl +++ b/locales/tr/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = Sabitlenmiş sekmenin URL’si, mevcut URL ile değiş zen-tabs-renamed = Sekme başarıyla yeniden adlandırıldı! zen-background-tab-opened-toast = Yeni arka plan sekmesi açıldı! zen-workspace-renamed-toast = Çalışma alanı başarıyla yeniden adlandırıldı! +zen-split-view-limit-toast = Bölünmüş görünüme daha fazla panel eklenemiyor! zen-toggle-compact-mode-button = .label = Kompakt mod .tooltiptext = Kompakt modu aç/kapat diff --git a/locales/tr/browser/browser/zen-split-view.ftl b/locales/tr/browser/browser/zen-split-view.ftl index ac0cd0fef..c70955488 100644 --- a/locales/tr/browser/browser/zen-split-view.ftl +++ b/locales/tr/browser/browser/zen-split-view.ftl @@ -5,9 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [-1] Sekmeleri birleştir - [1] Sekmeyi böl (birden fazla seçilmiş sekme gerekir) - *[other] { $tabCount } Sekmeyi Böl + [-1] Sekmeyi ayır + [1] Bölünmüş görünüme ekle... + *[other] { $tabCount } sekmeyi birleştir } .accesskey = S zen-split-link = diff --git a/locales/tr/browser/browser/zen-vertical-tabs.ftl b/locales/tr/browser/browser/zen-vertical-tabs.ftl index f80af01e3..47f635615 100644 --- a/locales/tr/browser/browser/zen-vertical-tabs.ftl +++ b/locales/tr/browser/browser/zen-vertical-tabs.ftl @@ -6,7 +6,7 @@ zen-toolbar-context-tabs-right = .label = Sekmeler sağda olsun .accesskey = R zen-toolbar-context-compact-mode = - .label = Kompakt Mod + .label = Kompakt mod zen-toolbar-context-compact-mode-enable = .label = Kompakt modu aktifleştir .accesskey = D @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = İkisini de gizle .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Klasöre taşı... + .accesskey = M zen-toolbar-context-new-folder = .label = Yeni klasör .accesskey = N diff --git a/locales/uk/browser/browser/preferences/zen-preferences.ftl b/locales/uk/browser/browser/preferences/zen-preferences.ftl index 4a93aa684..3dcce31ba 100644 --- a/locales/uk/browser/browser/preferences/zen-preferences.ftl +++ b/locales/uk/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Увімк. / Вимк. DOM zen-devtools-toggle-accessibility-shortcut = Увімк. / Вимк. доступ zen-close-all-unpinned-tabs-shortcut = Закрити всі відкріплені вкладки zen-new-unsynced-window-shortcut = Нове несинхронізоване вікно +zen-duplicate-tab-shortcut = Дублювати вкладку diff --git a/locales/uk/browser/browser/zen-general.ftl b/locales/uk/browser/browser/zen-general.ftl index 89c949c3f..a727b433b 100644 --- a/locales/uk/browser/browser/zen-general.ftl +++ b/locales/uk/browser/browser/zen-general.ftl @@ -50,6 +50,7 @@ zen-pinned-tab-replaced = URL-адресу закріпленої вкладки zen-tabs-renamed = Вкладку успішно перейменовано! zen-background-tab-opened-toast = Відкрито нову фонову вкладку! zen-workspace-renamed-toast = Робочий простір успішно перейменовано! +zen-split-view-limit-toast = Неможливо додати більше панелей до розділеного перегляду! zen-toggle-compact-mode-button = .label = Компактний режим .tooltiptext = Увімк. / Вимк. компактний режим diff --git a/locales/uk/browser/browser/zen-split-view.ftl b/locales/uk/browser/browser/zen-split-view.ftl index 5c970da09..77ea3247f 100644 --- a/locales/uk/browser/browser/zen-split-view.ftl +++ b/locales/uk/browser/browser/zen-split-view.ftl @@ -5,8 +5,10 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Розділити вкладку (потрібно кілька виділених вкладок) - *[other] Розділити { $tabCount } вкладки + [-1] Відокремити вкладку + [1] Додати розділений перегляд... + [few] Об’єднати { $tabCount } вкладки + *[other] Об’єднати { $tabCount } вкладок } .accesskey = S zen-split-link = diff --git a/locales/uk/browser/browser/zen-vertical-tabs.ftl b/locales/uk/browser/browser/zen-vertical-tabs.ftl index 97bb9312b..bc42a7fed 100644 --- a/locales/uk/browser/browser/zen-vertical-tabs.ftl +++ b/locales/uk/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Приховувати обидві .accesskey = Н +zen-toolbar-context-move-to-folder = + .label = Перемістити до теки... + .accesskey = M zen-toolbar-context-new-folder = .label = Нова тека .accesskey = N diff --git a/locales/vi/browser/browser/preferences/zen-preferences.ftl b/locales/vi/browser/browser/preferences/zen-preferences.ftl index 3539717bd..cc89ed45d 100644 --- a/locales/vi/browser/browser/preferences/zen-preferences.ftl +++ b/locales/vi/browser/browser/preferences/zen-preferences.ftl @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = Bật/Tắt DOM zen-devtools-toggle-accessibility-shortcut = Bật/Tắt trợ năng zen-close-all-unpinned-tabs-shortcut = Đóng tất cả thẻ chưa ghim zen-new-unsynced-window-shortcut = Cửa sổ trống mới +zen-duplicate-tab-shortcut = Duplicate Tab diff --git a/locales/vi/browser/browser/zen-general.ftl b/locales/vi/browser/browser/zen-general.ftl index 22b6e477f..71e6413c8 100644 --- a/locales/vi/browser/browser/zen-general.ftl +++ b/locales/vi/browser/browser/zen-general.ftl @@ -48,6 +48,7 @@ zen-pinned-tab-replaced = URL của thẻ đã ghim đã được thay thế b zen-tabs-renamed = Thẻ đã được đổi tên! zen-background-tab-opened-toast = Một thẻ mới đã được mở dưới nền! zen-workspace-renamed-toast = Không gian làm việc đã được đổi tên! +zen-split-view-limit-toast = Can't add more panels to the split view! zen-toggle-compact-mode-button = .label = Chế độ thu gọn .tooltiptext = Bật Chế độ thu gọn diff --git a/locales/vi/browser/browser/zen-split-view.ftl b/locales/vi/browser/browser/zen-split-view.ftl index 7a6fbb796..ec563698d 100644 --- a/locales/vi/browser/browser/zen-split-view.ftl +++ b/locales/vi/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Chia tab (cần nhiều tab được chọn) - *[other] Chia { $tabCount } tab + [-1] Split out tab + [1] Add split view... + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/vi/browser/browser/zen-vertical-tabs.ftl b/locales/vi/browser/browser/zen-vertical-tabs.ftl index 4f3287af3..ae63b8b3b 100644 --- a/locales/vi/browser/browser/zen-vertical-tabs.ftl +++ b/locales/vi/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = Ẩn cả hai .accesskey = H +zen-toolbar-context-move-to-folder = + .label = Move to Folder... + .accesskey = M zen-toolbar-context-new-folder = .label = Thư mục mới .accesskey = N diff --git a/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl b/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl index 48730f6e2..da82d2771 100644 --- a/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl +++ b/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl @@ -181,7 +181,7 @@ zenCKSOption-group-mediaAndDisplay = 媒体与显示 zenCKSOption-group-zen-compact-mode = 简洁模式 zenCKSOption-group-zen-workspace = 工作区 zenCKSOption-group-zen-other = Zen 的其它功能 -zenCKSOption-group-zen-split-view = 拆分视图 +zenCKSOption-group-zen-split-view = 分屏视图 zenCKSOption-group-devTools = 开发者工具 zen-key-quick-restart = 快速重启 zen-window-new-shortcut = 新建窗口 @@ -283,10 +283,10 @@ zen-workspace-shortcut-forward = 下一个工作区 zen-workspace-shortcut-backward = 上一个工作区 zen-sidebar-shortcut-toggle = 折叠/展开侧边栏 zen-pinned-tab-shortcut-reset = 重置固定标签页至其固定的 URL -zen-split-view-shortcut-grid = 切换网格拆分视图 -zen-split-view-shortcut-vertical = 切换垂直拆分视图 -zen-split-view-shortcut-horizontal = 切换水平拆分视图 -zen-split-view-shortcut-unsplit = 关闭拆分视图 +zen-split-view-shortcut-grid = 切换网格分屏视图 +zen-split-view-shortcut-vertical = 切换垂直分屏视图 +zen-split-view-shortcut-horizontal = 切换水平分屏视图 +zen-split-view-shortcut-unsplit = 关闭分屏视图 zen-new-empty-split-view-shortcut = 新建空白分屏视图 zen-key-select-tab-1 = 选择标签页 #1 zen-key-select-tab-2 = 选择标签页 #2 @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = 切换 DOM zen-devtools-toggle-accessibility-shortcut = 切换无障碍环境 zen-close-all-unpinned-tabs-shortcut = 关闭所有未固定的标签页 zen-new-unsynced-window-shortcut = 新建空白窗口 +zen-duplicate-tab-shortcut = 克隆标签页 diff --git a/locales/zh-CN/browser/browser/zen-general.ftl b/locales/zh-CN/browser/browser/zen-general.ftl index cdc66cb76..0f2a108fc 100644 --- a/locales/zh-CN/browser/browser/zen-general.ftl +++ b/locales/zh-CN/browser/browser/zen-general.ftl @@ -48,6 +48,7 @@ zen-pinned-tab-replaced = 固定标签页的网址已更新为当前页面网址 zen-tabs-renamed = 标签页重命名成功! zen-background-tab-opened-toast = 新的后台标签页已打开 ! zen-workspace-renamed-toast = 工作区重命名成功! +zen-split-view-limit-toast = 无法在分屏视图中添加更多面板! zen-toggle-compact-mode-button = .label = 简洁模式 .tooltiptext = 切换简洁模式 diff --git a/locales/zh-CN/browser/browser/zen-split-view.ftl b/locales/zh-CN/browser/browser/zen-split-view.ftl index 92e65dd2f..eb2e38c01 100644 --- a/locales/zh-CN/browser/browser/zen-split-view.ftl +++ b/locales/zh-CN/browser/browser/zen-split-view.ftl @@ -6,13 +6,13 @@ tab-zen-split-tabs = .label = { $tabCount -> [-1] 取消分屏标签页 - [1] 分屏标签页(需要选择多个标签页) + [1] 添加分屏视图 *[other] 分屏 { $tabCount } 个标签页 } .accesskey = S zen-split-link = .label = 拆分链接到新标签页 .accesskey = S -zen-split-view-modifier-header = 拆分视图 +zen-split-view-modifier-header = 分屏视图 zen-split-view-modifier-activate-reallocation = .label = 激活重新分配 diff --git a/locales/zh-CN/browser/browser/zen-vertical-tabs.ftl b/locales/zh-CN/browser/browser/zen-vertical-tabs.ftl index b8268f043..1ef740980 100644 --- a/locales/zh-CN/browser/browser/zen-vertical-tabs.ftl +++ b/locales/zh-CN/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = 两者都隐藏 .accesskey = H +zen-toolbar-context-move-to-folder = + .label = 移动到文件夹… + .accesskey = M zen-toolbar-context-new-folder = .label = 新建文件夹 .accesskey = N diff --git a/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl b/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl index ed55f391d..0b7a4eb24 100644 --- a/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl +++ b/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl @@ -8,9 +8,9 @@ category-zen-looks = zen-warning-language = 更改預設的語言可能會讓網站更容易的追蹤你。 zen-vertical-tabs-layout-header = 瀏覽器版面配置 zen-vertical-tabs-layout-description = 選擇最適合您的版面 -zen-layout-single-toolbar = 單一工具列 -zen-layout-multiple-toolbar = 多個工具列 -zen-layout-collapsed-toolbar = 摺疊工具列 +zen-layout-single-toolbar = 單一側邊欄 +zen-layout-multiple-toolbar = 側邊欄及頂部工具列 +zen-layout-collapsed-toolbar = 摺疊側邊欄 sync-currently-syncing-workspaces = 工作區 sync-engine-workspaces = .label = 工作區 @@ -18,7 +18,7 @@ sync-engine-workspaces = .accesskey = W zen-glance-title = Glance zen-glance-header = Glance 一般設定 -zen-glance-description = 無需打開新分頁,即可快速預覽 +zen-glance-description = 無需打開新分頁,即可快速預覽連結 zen-glance-trigger-label = 觸發方式 zen-glance-enabled = .label = 啟用 Glance @@ -43,9 +43,9 @@ category-zen-workspaces = .tooltiptext = { pane-zen-tabs-title } pane-settings-workspaces-title = 工作區 zen-tabs-select-recently-used-on-close = - .label = 關閉分頁後,切換至最近造訪過的分頁而非下一個相鄰分頁 + .label = 關閉分頁後,切換至最近造訪的分頁而非下一個相鄰分頁 zen-tabs-close-on-back-with-no-history = - .label = 在沒有返回紀錄時,關閉分頁並切換回其來源分頁(或最近使用的分頁) + .label = 若沒有上一頁紀錄,返回時關閉分頁並切換為其來源分頁(或最近造訪的分頁) zen-settings-workspaces-sync-unpinned-tabs = .label = 僅對工作區中的釘選分頁進行同步 zen-tabs-cycle-by-attribute = @@ -54,9 +54,9 @@ zen-tabs-cycle-ignore-pending-tabs = .label = 使用 Ctrl+Tab 切換分頁時,忽略卸載的分頁 zen-tabs-cycle-by-attribute-warning = Ctrl+Tab 將按最近使用順序循環,因為該設定已啟用 zen-look-and-feel-compact-toolbar-themed = - .label = 將主題顏色套用至折疊工具欄 + .label = 將主題顏色套用至緊湊模式時的工具欄 zen-workspace-continue-where-left-off = - .label = 繼續上次的工作階段 + .label = 從上次最後造訪的分頁繼續開始 pane-zen-pinned-tab-manager-title = 釘選分頁 zen-pinned-tab-manager-header = 釘選分頁的一般設定 zen-pinned-tab-manager-description = 釘選分頁的額外行為 @@ -64,7 +64,7 @@ zen-pinned-tab-manager-restore-pinned-tabs-to-pinned-url = .label = 啟動時恢復釘選分頁至其初始的網址 zen-pinned-tab-manager-container-specific-essentials-enabled = .label = 啟用容器專屬 Essentials 功能 -zen-pinned-tab-manager-close-shortcut-behavior-label = 關閉分頁快捷鍵的行為 +zen-pinned-tab-manager-close-shortcut-behavior-label = 使用快捷鍵關閉分頁時, zen-pinned-tab-manager-reset-unload-switch-close-shortcut-option = .label = 重置網址,卸載並切換到下一個分頁 zen-pinned-tab-manager-unload-switch-close-shortcut-option = @@ -83,7 +83,7 @@ zen-settings-workspaces-description = 透過工作區,您能同時擁有多個 zen-settings-workspaces-enabled = .label = 啟用工作區 zen-settings-workspaces-hide-default-container-indicator = - .label = 隱藏分頁欄中的容器指標 + .label = 在分頁欄中隱藏工作區預設的容器指標 zen-key-unsaved = 快捷鍵未儲存!請重新輸入並按下 "Escape" 鍵來儲存快捷鍵。 zen-key-conflict = 與 { $group } -> { $shortcut } 衝突 pane-zen-theme-title = 主題設定 @@ -164,7 +164,7 @@ pane-settings-CKS-title = { -brand-short-name } 快捷鍵 category-zen-marketplace = .tooltiptext = Zen 模組 zen-settings-CKS-header = 自定義您的快捷鍵 -zen-settings-CKS-description = 依據您的愛好來更改預設的快捷鍵以近一步改善你的瀏覽體驗 +zen-settings-CKS-description = 依據您的愛好來更改預設的快捷鍵以進一步改善瀏覽體驗 zen-settings-CKS-disable-firefox = .label = 停用 { -brand-short-name } 的預設快捷鍵 zen-settings-CKS-duplicate-shortcut = @@ -317,3 +317,4 @@ zen-devtools-toggle-dom-shortcut = 開啟 DOM zen-devtools-toggle-accessibility-shortcut = 開啟輔助功能 zen-close-all-unpinned-tabs-shortcut = 關閉所有未釘選的分頁 zen-new-unsynced-window-shortcut = 開新簡白視窗 +zen-duplicate-tab-shortcut = 複製分頁 diff --git a/locales/zh-TW/browser/browser/zen-general.ftl b/locales/zh-TW/browser/browser/zen-general.ftl index d73909f24..2f32fe5eb 100644 --- a/locales/zh-TW/browser/browser/zen-general.ftl +++ b/locales/zh-TW/browser/browser/zen-general.ftl @@ -21,8 +21,8 @@ tab-context-zen-remove-essential = tab-context-zen-replace-pinned-url-with-current = .label = { $isEssential -> - [true] 以當前URL替換Essentials - *[false] 以當前URL替換釘選分頁 + [true] 以當前網址替換Essentials + *[false] 以當前網址替換釘選分頁 } .accesskey = C tab-context-zen-edit-title = @@ -39,7 +39,7 @@ pictureinpicture-minimize-btn = .tooltip = 最小化 zen-panel-ui-gradient-generator-custom-color = 自訂顏色 zen-copy-current-url-confirmation = 網址已複製到剪貼簿! -zen-copy-current-url-as-markdown-confirmation = 已以Markdown格式複製當前URL! +zen-copy-current-url-as-markdown-confirmation = 已以Markdown格式複製當前網址! zen-general-cancel-label = .label = 取消 zen-general-confirm = @@ -48,9 +48,10 @@ zen-pinned-tab-replaced = 釘選分頁網址已替換為當前網址! zen-tabs-renamed = 已成功重新命名分頁! zen-background-tab-opened-toast = 已在背景開啟新分頁! zen-workspace-renamed-toast = 已成功重新命名工作區! +zen-split-view-limit-toast = 無法加入更多分頁至分割畫面! zen-toggle-compact-mode-button = - .label = 簡潔模式 - .tooltiptext = 切換簡潔模式 + .label = 緊湊模式 + .tooltiptext = 切換緊湊模式 # note: Do not translate the "
" tags in the following string diff --git a/locales/zh-TW/browser/browser/zen-split-view.ftl b/locales/zh-TW/browser/browser/zen-split-view.ftl index f4d7e4837..7072401a8 100644 --- a/locales/zh-TW/browser/browser/zen-split-view.ftl +++ b/locales/zh-TW/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] 分割畫面頁籤 (需要選擇多個分頁) - *[other] 分割 { $tabCount } 個分頁 + [-1] 將分頁移出分割畫面 + [1] 新增分割畫面... + *[other] 將 { $tabCount } 個分頁組成分割畫面 } .accesskey = S zen-split-link = diff --git a/locales/zh-TW/browser/browser/zen-vertical-tabs.ftl b/locales/zh-TW/browser/browser/zen-vertical-tabs.ftl index dd94e1d15..9cc2509bd 100644 --- a/locales/zh-TW/browser/browser/zen-vertical-tabs.ftl +++ b/locales/zh-TW/browser/browser/zen-vertical-tabs.ftl @@ -17,6 +17,9 @@ zen-toolbar-context-compact-mode-just-toolbar = zen-toolbar-context-compact-mode-hide-both = .label = 兩者皆隱藏 .accesskey = H +zen-toolbar-context-move-to-folder = + .label = 移至分頁夾... + .accesskey = M zen-toolbar-context-new-folder = .label = 新增分頁夾 .accesskey = N diff --git a/locales/zh-TW/browser/browser/zen-workspaces.ftl b/locales/zh-TW/browser/browser/zen-workspaces.ftl index 33fd84550..c0a20939b 100644 --- a/locales/zh-TW/browser/browser/zen-workspaces.ftl +++ b/locales/zh-TW/browser/browser/zen-workspaces.ftl @@ -6,13 +6,13 @@ zen-panel-ui-workspaces-text = 工作區 zen-panel-ui-spaces-label = .label = 工作區 zen-panel-ui-workspaces-create = - .label = 建立工作區 + .label = 新增工作區 zen-panel-ui-folder-create = - .label = 建立分頁夾 + .label = 新增分頁夾 zen-panel-ui-live-folder-create = - .label = 建立動態分頁夾 + .label = 新增動態分頁夾 zen-panel-ui-new-empty-split = - .label = 新分頁分割 + .label = 新增分割畫面 zen-workspaces-panel-context-delete = .label = 刪除工作區 .accesskey = D @@ -54,7 +54,7 @@ zen-workspace-creation-name = .placeholder = 工作區名稱 zen-move-tab-to-workspace-button = .label = 移動至… - .tooltiptext = 將此視窗所有頁面移至單一工作區 + .tooltiptext = 將此視窗所有分頁移至單一工作區 zen-workspaces-panel-context-reorder = .label = 排序工作區 zen-workspace-creation-profile = 設定檔 From 3b8e6f4718ba0eff29779fa59068b4b27c8e88ce Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Tue, 21 Apr 2026 22:28:15 +0200 Subject: [PATCH 21/31] no-bug: Start making use of blacksmith macos runners for release (gh-13350) --- .github/workflows/macos-release-build.yml | 2 +- configs/macos/mozconfig | 11 ++++------ package-lock.json | 8 +++---- package.json | 2 +- src/zen/common/styles/zen-omnibox.css | 1 + src/zen/common/styles/zen-theme.css | 18 +++++++++------- src/zen/folders/zen-folders.css | 2 +- src/zen/spaces/ZenGradientGenerator.mjs | 26 +++++++---------------- src/zen/spaces/zen-workspaces.css | 8 ++++++- src/zen/tabs/zen-tabs/vertical-tabs.css | 4 ++-- 10 files changed, 39 insertions(+), 43 deletions(-) diff --git a/.github/workflows/macos-release-build.yml b/.github/workflows/macos-release-build.yml index 4be480468..2e3e7a142 100644 --- a/.github/workflows/macos-release-build.yml +++ b/.github/workflows/macos-release-build.yml @@ -26,7 +26,7 @@ on: jobs: mac-build: name: Build macOS - ${{ matrix.arch }} - runs-on: macos-26 + runs-on: ${{ (inputs.release-branch == 'release' && matrix.arch == 'aarch64') && 'blacksmith-6vcpu-macos-latest' || 'macos-26' }} strategy: fail-fast: false diff --git a/configs/macos/mozconfig b/configs/macos/mozconfig index 3dd601a49..a4c359bc0 100644 --- a/configs/macos/mozconfig +++ b/configs/macos/mozconfig @@ -7,13 +7,6 @@ unset MOZ_STDCXX_COMPAT ac_add_options --disable-dmd ac_add_options --enable-eme=widevine -if test "$ZEN_RELEASE"; then - # override LTO settings - # TODO: Dont use LTO for now, it's causing a lot of issues - export MOZ_LTO=cross,thin - ac_add_options --enable-lto=cross,thin -fi - if test "$ZEN_RELEASE"; then if ! test "$ZEN_GA_DISABLE_PGO"; then if test "$ZEN_GA_GENERATE_PROFILE"; then @@ -32,6 +25,10 @@ if test "$SURFER_COMPAT" = "x86_64"; then if test "$ZEN_RELEASE"; then ac_add_options --enable-wasm-avx + + # override LTO settings + export MOZ_LTO=cross,thin + ac_add_options --enable-lto=cross,thin fi else ac_add_options --target=aarch64-apple-darwin diff --git a/package-lock.json b/package-lock.json index 353ce847b..a19e60ef3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "devDependencies": { "@babel/preset-typescript": "^7.27.0", "@zen-browser/prettier": "^3.9.3", - "@zen-browser/surfer": "^1.14.4", + "@zen-browser/surfer": "^1.14.5", "formal-git": "^1.2.9", "globals": "^16.3.0", "husky": "^9.1.7", @@ -868,9 +868,9 @@ } }, "node_modules/@zen-browser/surfer": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.14.4.tgz", - "integrity": "sha512-9PA3Z/wJL/wCbjAuy51N1LsOgd/5dIyZOJ+Sn81S6mm/3g5yZhrWMxcwugH2p6ULp/G4wu+3sCmd39Jrj0ccWg==", + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.14.5.tgz", + "integrity": "sha512-VLvYuM1y86Hqux5GDcPwU7FIx2ADbpumnNyO3NI5mK3DtUB8jULPXbhzEtB8qnnRLiQ86yxyPf9ONT28/7FZCg==", "dev": true, "license": "MPL-2.0", "dependencies": { diff --git a/package.json b/package.json index e05332468..6b9efa519 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "devDependencies": { "@babel/preset-typescript": "^7.27.0", "@zen-browser/prettier": "^3.9.3", - "@zen-browser/surfer": "^1.14.4", + "@zen-browser/surfer": "^1.14.5", "formal-git": "^1.2.9", "globals": "^16.3.0", "husky": "^9.1.7", diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css index 9b7b1efd1..e5cb5ce19 100644 --- a/src/zen/common/styles/zen-omnibox.css +++ b/src/zen/common/styles/zen-omnibox.css @@ -584,6 +584,7 @@ position: relative; scale: 0.93; transform-origin: right; + opacity: 0.7; &::after { content: ""; diff --git a/src/zen/common/styles/zen-theme.css b/src/zen/common/styles/zen-theme.css index 85abf3bc3..27851827c 100644 --- a/src/zen/common/styles/zen-theme.css +++ b/src/zen/common/styles/zen-theme.css @@ -70,18 +70,18 @@ --in-content-primary-button-background: color-mix( in srgb, - var(--zen-primary-color) 30%, - var(--zen-branding-bg-reverse) 70% + var(--zen-primary-color) 40%, + var(--zen-branding-bg-reverse) ) !important; --in-content-primary-button-background-hover: color-mix( in srgb, - var(--zen-primary-color) 35%, - var(--zen-branding-bg-reverse) 65% + var(--zen-primary-color) 45%, + var(--zen-branding-bg-reverse) ) !important; --in-content-primary-button-background-active: color-mix( in srgb, - var(--zen-primary-color) 40%, - var(--zen-branding-bg-reverse) 60% + var(--zen-primary-color) 50%, + var(--zen-branding-bg-reverse) ) !important; --in-content-primary-button-text-color: var(--zen-branding-bg) !important; --in-content-primary-button-border-color: transparent !important; @@ -250,7 +250,7 @@ --panel-separator-color: color-mix(in srgb, currentColor 15%, transparent) !important; --zen-big-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px; - --zen-active-tab-scale: 0.98; + --zen-active-tab-scale: 0.99; /* Define tab hover background color */ --tab-hover-background-color: var(--toolbarbutton-hover-background); @@ -258,11 +258,13 @@ /* Sidebar Notifications */ --zen-sidebar-notification-bg: color-mix( in srgb, - var(--zen-primary-color) 15%, + var(--zen-primary-color) 5%, light-dark(white, black) ); --zen-sidebar-notification-shadow: 0 0 6px light-dark(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.3)); + --zen-sidebar-themed-icon-fill: color-mix(in srgb, var(--zen-primary-color) 40%, light-dark(black, white)); + --zen-native-inner-radius: var( --zen-webview-border-radius, /* Inner radius calculation: diff --git a/src/zen/folders/zen-folders.css b/src/zen/folders/zen-folders.css index cc82d727a..146e94364 100644 --- a/src/zen/folders/zen-folders.css +++ b/src/zen/folders/zen-folders.css @@ -177,7 +177,7 @@ zen-folder { & > label { width: 100% !important; border: none !important; - color: var(--sidebar-text-color) !important; + color: var(--toolbar-color) !important; margin: 0 !important; font-weight: 600; align-self: center !important; diff --git a/src/zen/spaces/ZenGradientGenerator.mjs b/src/zen/spaces/ZenGradientGenerator.mjs index b46e3f078..43464097e 100644 --- a/src/zen/spaces/ZenGradientGenerator.mjs +++ b/src/zen/spaces/ZenGradientGenerator.mjs @@ -1493,9 +1493,13 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { return color; } - getToolbarColor(isDarkMode = false) { + getToolbarColor(isDarkMode = false, accentColor = null) { const opacity = 0.8; - return isDarkMode ? [255, 255, 255, opacity] : [0, 0, 0, opacity]; // Default toolbar + let baseColor = isDarkMode ? [255, 255, 255, opacity] : [0, 0, 0, opacity]; // Default toolbar + if (accentColor) { + return this.blendColors(baseColor.slice(0, 3), accentColor, 75).concat(1); + } + return baseColor; } get browserBackgroundElement() { @@ -1756,7 +1760,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { } } // Set `--toolbox-textcolor` to have a contrast with the primary color - const textColor = this.getToolbarColor(isDarkMode); + let textColor = this.getToolbarColor(isDarkMode, dominantColor); docElement.style.setProperty( "--toolbox-textcolor", `rgba(${textColor[0]}, ${textColor[1]}, ${textColor[2]}, ${textColor[3]})` @@ -1765,20 +1769,6 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { "--toolbar-color-scheme", isDarkMode ? "dark" : "light" ); - // Tint toolbar elements with an accent-hued color toned against the - // current mode — dark mode gets a light tint, light mode a dark tint. - const tintTarget = isDarkMode ? [255, 255, 255] : [0, 0, 0]; - const [tr, tg, tb] = this.blendColors(dominantColor, tintTarget, 25); - const elementBgAlpha = isDarkMode ? 0.18 : 0.1; - const elementHoverAlpha = isDarkMode ? 0.28 : 0.16; - docElement.style.setProperty( - "--zen-toolbar-element-bg", - `rgba(${tr}, ${tg}, ${tb}, ${elementBgAlpha})` - ); - docElement.style.setProperty( - "--zen-toolbar-element-bg-hover", - `rgba(${tr}, ${tg}, ${tb}, ${elementHoverAlpha})` - ); } if (!skipUpdate) { @@ -2007,7 +1997,7 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature { grain: theme.texture ?? 0, isDarkMode, isExplicitMode, - toolbarColor: this.getToolbarColor(isDarkMode), + toolbarColor: this.getToolbarColor(isDarkMode, dominantColor), primaryColor: this.getAccentColorForUI(dominantColor), }; this.currentOpacity = previousOpacity; diff --git a/src/zen/spaces/zen-workspaces.css b/src/zen/spaces/zen-workspaces.css index 97a2c11a3..2de76a26b 100644 --- a/src/zen/spaces/zen-workspaces.css +++ b/src/zen/spaces/zen-workspaces.css @@ -40,6 +40,8 @@ align-items: center; position: relative; fill-opacity: 0.6; + -moz-context-properties: fill-opacity, fill; + fill: currentColor; & .zen-workspace-icon { pointer-events: none; @@ -71,6 +73,10 @@ width 0.1s, transform 0.2s; + &[active='true'] .zen-workspace-icon { + fill: var(--zen-sidebar-themed-icon-fill); + } + &[active='true'], &:hover, &[dragged='true'] { @@ -212,7 +218,7 @@ align-items: center; fill-opacity: 0.6; -moz-context-properties: fill-opacity, fill; - fill: var(--toolbox-textcolor); + fill: var(--zen-sidebar-themed-icon-fill); font-size: 16px; padding-top: 2px; color: light-dark(rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0.8)); diff --git a/src/zen/tabs/zen-tabs/vertical-tabs.css b/src/zen/tabs/zen-tabs/vertical-tabs.css index 389f8bbdd..0118c3b8d 100644 --- a/src/zen/tabs/zen-tabs/vertical-tabs.css +++ b/src/zen/tabs/zen-tabs/vertical-tabs.css @@ -341,7 +341,7 @@ :root:not([zen-renaming-tab="true"]) #tabbrowser-tabs:not([movingtab]) & .tab-content > image:active { - scale: 0.98; + scale: 0.97; } & .tab-icon-image { @@ -1089,7 +1089,7 @@ &:active, &[open] { - scale: 0.98; + scale: 0.99; } &[in-urlbar] { From 3166d504120f86a0313dd530af414dd90452bf40 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Tue, 21 Apr 2026 23:18:10 +0200 Subject: [PATCH 22/31] no-bug: Sync upstream Firefox to version `150.0` (gh-13351) --- README.md | 2 +- build/firefox-cache/l10n-last-commit-hash | 2 +- scripts/mar_sign.sh | 11 +++++++++-- surfer.json | 4 ++-- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f92956ab3..26e5634e7 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Zen is a firefox-based browser with the aim of pushing your productivity to a ne ### Firefox Versions -- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `149.0.2`! 🚀 +- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `150.0`! 🚀 - [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 150.0`! ### Contributing diff --git a/build/firefox-cache/l10n-last-commit-hash b/build/firefox-cache/l10n-last-commit-hash index 901736b71..fc5481288 100644 --- a/build/firefox-cache/l10n-last-commit-hash +++ b/build/firefox-cache/l10n-last-commit-hash @@ -1 +1 @@ -11d1ba8e182db855a1aba82796e219c2abe8c3ac \ No newline at end of file +fb55808f9cdd2172649e551705008af4f98038fe \ No newline at end of file diff --git a/scripts/mar_sign.sh b/scripts/mar_sign.sh index b5d147705..3420cc884 100644 --- a/scripts/mar_sign.sh +++ b/scripts/mar_sign.sh @@ -185,10 +185,17 @@ sign_mars() { folders=( linux.mar linux-aarch64.mar - windows.mar - windows-arm64.mar macos.mar ) + + if [ -d ".github/workflows/object/windows-x64-signed-x86_64" ]; then + folders+=(".github/workflows/object/windows-x64-signed-x86_64") + folders+=(".github/workflows/object/windows-x64-signed-arm64") + else + folders+=("windows.mar") + folders+=("windows-arm64.mar") + fi + # each folder will contain the .mar files for that platform, and the signature will be written in-place for folder in "${folders[@]}"; do if [ -d "$folder" ]; then diff --git a/surfer.json b/surfer.json index dce500c57..ed36546cd 100644 --- a/surfer.json +++ b/surfer.json @@ -5,7 +5,7 @@ "binaryName": "zen", "version": { "product": "firefox", - "version": "149.0.2", + "version": "150.0", "candidate": "150.0", "candidateBuild": 1 }, @@ -20,7 +20,7 @@ "brandShortName": "Zen", "brandFullName": "Zen Browser", "release": { - "displayVersion": "1.19.8b", + "displayVersion": "1.19.9b", "github": { "repo": "zen-browser/desktop" }, From 91f276dd0a8185883cf898509540cb7ca9644a8e Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Wed, 22 Apr 2026 15:49:43 +0200 Subject: [PATCH 23/31] no-bug: Run update verification before releasing (gh-13353) --- .github/workflows/build.yml | 7 + .github/workflows/macos-release-build.yml | 2 +- scripts/mar_verify.sh | 280 +++++++++++++++++++++ src/tools/update-packaging/common-sh.patch | 13 + src/zen/common/styles/zen-omnibox.css | 8 +- src/zen/common/styles/zen-theme.css | 4 +- src/zen/drag-and-drop/ZenDragAndDrop.js | 10 +- src/zen/spaces/ZenSpacesSwipe.mjs | 5 +- src/zen/spaces/zen-workspaces.css | 3 +- 9 files changed, 319 insertions(+), 13 deletions(-) create mode 100755 scripts/mar_verify.sh create mode 100644 src/tools/update-packaging/common-sh.patch diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3bd0e581d..6977bfe8c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -514,6 +514,13 @@ jobs: run: | bash scripts/mar_sign.sh -s + - name: Verify MARs and update manifests + env: + SIGNMAR: ${{ github.workspace }}/linux-bin-x86_64/signmar + RELEASE_BRANCH: ${{ inputs.update_branch }} + run: | + bash scripts/mar_verify.sh + - name: Copy update manifests env: RELEASE_BRANCH: ${{ inputs.update_branch }} diff --git a/.github/workflows/macos-release-build.yml b/.github/workflows/macos-release-build.yml index 2e3e7a142..66f2789f0 100644 --- a/.github/workflows/macos-release-build.yml +++ b/.github/workflows/macos-release-build.yml @@ -26,7 +26,7 @@ on: jobs: mac-build: name: Build macOS - ${{ matrix.arch }} - runs-on: ${{ (inputs.release-branch == 'release' && matrix.arch == 'aarch64') && 'blacksmith-6vcpu-macos-latest' || 'macos-26' }} + runs-on: ${{ (inputs.release-branch == 'release') && 'blacksmith-6vcpu-macos-latest' || 'macos-26' }} strategy: fail-fast: false diff --git a/scripts/mar_verify.sh b/scripts/mar_verify.sh new file mode 100755 index 000000000..67f939ecc --- /dev/null +++ b/scripts/mar_verify.sh @@ -0,0 +1,280 @@ +#!/usr/bin/env bash +# 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/. +# +# Pre-release verification for MAR artifacts. +# +# Run this AFTER `scripts/mar_sign.sh -s` and BEFORE publishing a release. +# It confirms that every MAR we are about to ship is present, non-empty, +# signed with the cert whose public half lives at build/signing/public_key.der, +# and that the accompanying update.xml manifest reflects the signed file's +# current sha512 / size. Exits non-zero on the first verification failure so +# CI halts before we overwrite a good release with a broken one. + +set -euo pipefail + +CERT_PATH_DIR="build/signing" +PUBLIC_KEY_DER="$CERT_PATH_DIR/public_key.der" +VERIFY_NSS_DIR="$CERT_PATH_DIR/nss_verify" +LINUX_EXTRACT_DIR="$CERT_PATH_DIR/extracted_linux" +LINUX_ARCHIVE="zen.linux-x86_64.tar.xz/zen.linux-x86_64.tar.xz" + +FAILURES=0 + +fail() { + echo " [FAIL] $*" >&2 + FAILURES=$((FAILURES + 1)) +} + +ok() { + echo " [ OK ] $*" +} + +cleanup_verify_db() { + rm -rf "$VERIFY_NSS_DIR" + rm -rf "$LINUX_EXTRACT_DIR" +} +trap cleanup_verify_db EXIT + +if [ -z "${SIGNMAR:-}" ]; then + echo "Error: SIGNMAR environment variable is not set." >&2 + exit 1 +fi +if [ ! -f "$SIGNMAR" ]; then + echo "Error: signmar not found at $SIGNMAR." >&2 + exit 1 +fi +chmod +x "$SIGNMAR" + +if [ ! -f "$PUBLIC_KEY_DER" ]; then + echo "Error: $PUBLIC_KEY_DER not found. Run 'mar_sign.sh -g' first." >&2 + exit 1 +fi + +EXPECTED_MAR_CHANNEL="${RELEASE_BRANCH:-}" +if [ -z "$EXPECTED_MAR_CHANNEL" ]; then + echo "Error: RELEASE_BRANCH environment variable is not set (expected 'release' or 'twilight')." >&2 + exit 1 +fi + +# Build a throwaway NSS database that trusts only the signing cert, so +# signmar -v can verify signatures without the private key being present. +setup_verify_db() { + rm -rf "$VERIFY_NSS_DIR" + mkdir -p "$VERIFY_NSS_DIR" + local pass="$VERIFY_NSS_DIR/password.txt" + : > "$pass" + certutil -N -d "$VERIFY_NSS_DIR" -f "$pass" + certutil -A -d "$VERIFY_NSS_DIR" -n "mar_sig" -t "CT,C,C" -i "$PUBLIC_KEY_DER" +} + +# Each entry: "||" +declare -a pairs=( + "linux.mar/linux.mar|linux_update_manifest_x86_64|linux-x86_64" + "linux-aarch64.mar/linux-aarch64.mar|linux_update_manifest_aarch64|linux-aarch64" + "macos.mar/macos.mar|macos_update_manifest|macos" +) + +if [ -d ".github/workflows/object/windows-x64-signed-x86_64" ]; then + pairs+=( + ".github/workflows/object/windows-x64-signed-x86_64/windows.mar|.github/workflows/object/windows-x64-signed-x86_64/update_manifest|windows-x86_64" + ".github/workflows/object/windows-x64-signed-arm64/windows-arm64.mar|.github/workflows/object/windows-x64-signed-arm64/update_manifest|windows-arm64" + ) +else + pairs+=( + "windows.mar/windows.mar|windows_update_manifest_x86_64|windows-x86_64" + "windows-arm64.mar/windows-arm64.mar|windows_update_manifest_arm64|windows-arm64" + ) +fi + +hash_file() { + if command -v sha512sum >/dev/null 2>&1; then + sha512sum "$1" | awk '{print $1}' + else + shasum -a 512 "$1" | awk '{print $1}' + fi +} + +size_file() { + wc -c < "$1" | tr -d ' ' +} + +verify_signature() { + local mar="$1" + if "$SIGNMAR" -d "$VERIFY_NSS_DIR" -n "mar_sig" -v "$mar" >/dev/null 2>&1; then + ok "Signature valid: $mar" + else + fail "Signature INVALID (or missing) for $mar" + fi +} + +# Cache signmar -T output per MAR so we only pay for it once per file. +mar_info() { + local mar="$1" + "$SIGNMAR" -T "$mar" 2>&1 +} + +verify_signature_count() { + local mar="$1" + local info count + info=$(mar_info "$mar") + # signmar -T prints one "Signature :" line per signature block. + count=$(echo "$info" | grep -cE '^[[:space:]]*Signature[[:space:]]+[0-9]+:' || true) + if [ "$count" != "1" ]; then + fail "$mar has $count signatures, expected exactly 1" + else + ok "$mar has exactly 1 signature" + fi +} + +verify_mar_channel() { + local mar="$1" + local info channel + info=$(mar_info "$mar") + # Accept either "MAR channel name:" or "MAR channel ID:" — the label + # has drifted between Mozilla releases. + channel=$(echo "$info" \ + | grep -iE 'MAR channel (name|id)[[:space:]]*:' \ + | head -1 \ + | sed -E 's/.*MAR channel (name|id)[[:space:]]*:[[:space:]]*//I' \ + | tr -d '[:space:]') + if [ -z "$channel" ]; then + fail "$mar: could not read MAR channel from product info block" + return + fi + if [ "$channel" != "$EXPECTED_MAR_CHANNEL" ]; then + fail "$mar: MAR channel is '$channel', expected '$EXPECTED_MAR_CHANNEL' (RELEASE_BRANCH)" + else + ok "$mar: MAR channel = $channel" + fi +} + +verify_update_settings() { + echo "" + echo "Checking update-settings.ini in $LINUX_ARCHIVE..." + if [ ! -f "$LINUX_ARCHIVE" ]; then + fail "Linux build archive not found at $LINUX_ARCHIVE" + return + fi + + rm -rf "$LINUX_EXTRACT_DIR" + mkdir -p "$LINUX_EXTRACT_DIR" + if ! tar -xf "$LINUX_ARCHIVE" -C "$LINUX_EXTRACT_DIR"; then + fail "Failed to extract $LINUX_ARCHIVE" + return + fi + + local ini + ini=$(find "$LINUX_EXTRACT_DIR" -type f -name "update-settings.ini" | head -1) + if [ -z "$ini" ]; then + fail "update-settings.ini not found inside $LINUX_ARCHIVE" + return + fi + + local accepted + accepted=$(grep -oP '^ACCEPTED_MAR_CHANNEL_IDS[[:space:]]*=[[:space:]]*\K.*' "$ini" \ + | head -1 | tr -d '\r') + if [ -z "$accepted" ]; then + fail "ACCEPTED_MAR_CHANNEL_IDS not set in $ini" + return + fi + + # ACCEPTED_MAR_CHANNEL_IDS is a comma-separated list; membership is what + # the updater enforces, so we check membership rather than strict equality. + local found=0 entry + IFS=',' read -ra entries <<< "$accepted" + for entry in "${entries[@]}"; do + entry=$(echo "$entry" | tr -d '[:space:]') + if [ "$entry" = "$EXPECTED_MAR_CHANNEL" ]; then + found=1 + break + fi + done + + if [ "$found" = "1" ]; then + ok "update-settings.ini accepts MAR channel '$EXPECTED_MAR_CHANNEL' (ACCEPTED_MAR_CHANNEL_IDS=$accepted)" + else + fail "update-settings.ini ACCEPTED_MAR_CHANNEL_IDS='$accepted' does not include '$EXPECTED_MAR_CHANNEL'" + fi +} + +verify_manifest() { + local mar="$1" manifest_dir="$2" label="$3" + + if [ ! -d "$manifest_dir" ]; then + fail "$label: manifest directory $manifest_dir not found" + return + fi + + local xmls + xmls=$(find "$manifest_dir" -type f -name "update.xml") + if [ -z "$xmls" ]; then + fail "$label: no update.xml files found under $manifest_dir" + return + fi + + local actual_hash actual_size + actual_hash=$(hash_file "$mar") + actual_size=$(size_file "$mar") + + while IFS= read -r xml; do + local xhash xsize xurl + xhash=$(grep -oP 'hashValue="\K[^"]+' "$xml" | head -1 || true) + xsize=$(grep -oP 'size="\K[^"]+' "$xml" | head -1 || true) + xurl=$(grep -oP 'URL="\K[^"]+' "$xml" | head -1 || true) + if [ -z "$xhash" ] || [ -z "$xsize" ]; then + fail "$label: $xml is missing hashValue or size" + continue + fi + if [ -z "$xurl" ]; then + fail "$label: $xml is missing URL attribute" + continue + fi + if ! grep -q 'hashFunction="sha512"' "$xml"; then + fail "$label: $xml hashFunction is not sha512" + continue + fi + if [ "$xhash" != "$actual_hash" ]; then + fail "$label: hashValue mismatch in $xml" + echo " manifest: $xhash" >&2 + echo " actual: $actual_hash" >&2 + continue + fi + if [ "$xsize" != "$actual_size" ]; then + fail "$label: size mismatch in $xml (manifest=$xsize, actual=$actual_size)" + continue + fi + ok "$label: $(basename "$xml") matches $mar (size=$actual_size)" + done <<< "$xmls" +} + +setup_verify_db +verify_update_settings + +for entry in "${pairs[@]}"; do + IFS='|' read -r mar manifest label <<< "$entry" + echo "" + echo "Verifying $label: $mar" + + if [ ! -f "$mar" ]; then + fail "$label: MAR file $mar not found" + continue + fi + if [ ! -s "$mar" ]; then + fail "$label: MAR file $mar is empty" + continue + fi + + verify_signature "$mar" + verify_signature_count "$mar" + verify_mar_channel "$mar" + verify_manifest "$mar" "$manifest" "$label" +done + +echo "" +if [ "$FAILURES" -gt 0 ]; then + echo "Pre-release verification FAILED with $FAILURES issue(s)." >&2 + exit 1 +fi +echo "Pre-release verification passed." diff --git a/src/tools/update-packaging/common-sh.patch b/src/tools/update-packaging/common-sh.patch new file mode 100644 index 000000000..96aefa1cb --- /dev/null +++ b/src/tools/update-packaging/common-sh.patch @@ -0,0 +1,13 @@ +diff --git a/tools/update-packaging/common.sh b/tools/update-packaging/common.sh +index be2061b98cbba0d472e5f4d03cab2b058b249cb8..caa3379cd09efc2ded9686929fc658985a9dda51 100755 +--- a/tools/update-packaging/common.sh ++++ b/tools/update-packaging/common.sh +@@ -94,8 +94,6 @@ check_for_add_if_not_update() { + + if [[ "$(basename "$add_if_not_file_chk")" = "channel-prefs.js" || \ + "$add_if_not_file_chk" =~ (^|/)ChannelPrefs\.framework/ || \ +- "$(basename "$add_if_not_file_chk")" = "update-settings.ini" || \ +- "$add_if_not_file_chk" =~ (^|/)UpdateSettings\.framework/ || \ + "$(basename "$add_if_not_file_chk")" = "distribution.ini" ]]; then + ## "true" + return 0; diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css index e5cb5ce19..9eede5da4 100644 --- a/src/zen/common/styles/zen-omnibox.css +++ b/src/zen/common/styles/zen-omnibox.css @@ -586,6 +586,10 @@ transform-origin: right; opacity: 0.7; + .urlbarView-row[selected] & { + opacity: 1; + } + &::after { content: ""; display: inline-block; @@ -636,7 +640,7 @@ } &[selected] { - --zen-selected-bg: color-mix(in srgb, var(--zen-primary-color) 50%, light-dark(rgba(0, 0, 0, 0.2), rgba(255, 255, 255, 0.2))); + --zen-selected-bg: color-mix(in srgb, var(--zen-primary-color) 50%, light-dark(rgba(0, 0, 0, 0.5), rgba(255, 255, 255, 0.1))); --zen-selected-color: color-mix(in srgb, var(--zen-selected-bg), black 30%); background-color: var(--zen-selected-bg) !important; @@ -654,7 +658,7 @@ color: var(--zen-selected-color) !important; } - &:where([type="switchtab"], [type="dynamic"], [type^="history"], [type^="autofill_"], [type="top_site"]) .urlbarView-favicon, + &:where([type="switchtab"], [type="dynamic"], [type^="history"], [type^="autofill_"], [type="top_site"], [type="bookmark"]) .urlbarView-favicon, & .urlbarView-shortcutContent { fill: var(--zen-selected-color) !important; background-color: rgba(255, 255, 255, 0.9) !important; diff --git a/src/zen/common/styles/zen-theme.css b/src/zen/common/styles/zen-theme.css index 27851827c..56d40d3cd 100644 --- a/src/zen/common/styles/zen-theme.css +++ b/src/zen/common/styles/zen-theme.css @@ -214,7 +214,7 @@ --urlbar-margin-inline: 1px !important; --tab-icon-overlay-stroke: light-dark(white, black) !important; - --tab-close-button-padding: 5px !important; + --tab-close-button-padding: 4px !important; --input-border-color: var(--zen-input-border-color) !important; --zen-themed-toolbar-bg-transparent: light-dark(var(--zen-branding-bg), #171717); @@ -263,7 +263,7 @@ ); --zen-sidebar-notification-shadow: 0 0 6px light-dark(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.3)); - --zen-sidebar-themed-icon-fill: color-mix(in srgb, var(--zen-primary-color) 40%, light-dark(black, white)); + --zen-sidebar-themed-icon-fill: light-dark(color-mix(in srgb, var(--zen-primary-color) 50%, black), color-mix(in srgb, var(--zen-colors-primary) 15%, #ebebeb)); --zen-native-inner-radius: var( --zen-webview-border-radius, diff --git a/src/zen/drag-and-drop/ZenDragAndDrop.js b/src/zen/drag-and-drop/ZenDragAndDrop.js index b69087884..94c6dff3f 100644 --- a/src/zen/drag-and-drop/ZenDragAndDrop.js +++ b/src/zen/drag-and-drop/ZenDragAndDrop.js @@ -119,10 +119,12 @@ init() { super.init(); this.handle_windowDragEnter = this.handle_windowDragEnter.bind(this); - gZenWorkspaces.workspaceIcons.addEventListener( - "dragover", - this.handle_spaceIconDragOver.bind(this) - ); + if (gZenWorkspaces.workspaceEnabled) { + gZenWorkspaces.workspaceIcons.addEventListener( + "dragover", + this.handle_spaceIconDragOver.bind(this) + ); + } window.addEventListener( "dragleave", this.handle_windowDragLeave.bind(this), diff --git a/src/zen/spaces/ZenSpacesSwipe.mjs b/src/zen/spaces/ZenSpacesSwipe.mjs index dca3359b7..fdffd64a5 100644 --- a/src/zen/spaces/ZenSpacesSwipe.mjs +++ b/src/zen/spaces/ZenSpacesSwipe.mjs @@ -131,15 +131,14 @@ export class ZenSpacesSwipe { event.preventDefault(); event.stopPropagation(); - const delta = event.delta * 300; const stripWidth = window.windowUtils.getBoundsWithoutFlushing( document.getElementById("navigator-toolbox") ).width + window.windowUtils.getBoundsWithoutFlushing( document.getElementById("zen-sidebar-splitter") - ).width * - 2; + ).width; + const delta = event.delta * stripWidth; let translateX = this._swipeState.lastDelta + delta; // Add a force multiplier as we are translating the strip depending on how close to the edge we are let forceMultiplier = Math.min( diff --git a/src/zen/spaces/zen-workspaces.css b/src/zen/spaces/zen-workspaces.css index 2de76a26b..f5d7cc796 100644 --- a/src/zen/spaces/zen-workspaces.css +++ b/src/zen/spaces/zen-workspaces.css @@ -75,6 +75,7 @@ &[active='true'] .zen-workspace-icon { fill: var(--zen-sidebar-themed-icon-fill); + fill-opacity: 1; } &[active='true'], @@ -216,7 +217,7 @@ height: 16px; justify-content: center; align-items: center; - fill-opacity: 0.6; + fill-opacity: 1; -moz-context-properties: fill-opacity, fill; fill: var(--zen-sidebar-themed-icon-fill); font-size: 16px; From 55041f89332c46690c1a339f8abeffa97695ad7e Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Wed, 22 Apr 2026 23:08:21 +0200 Subject: [PATCH 24/31] no-bug: Correctly parse mar sign output for verification (gh-13363) --- scripts/mar_verify.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/mar_verify.sh b/scripts/mar_verify.sh index 67f939ecc..f9b5d670b 100755 --- a/scripts/mar_verify.sh +++ b/scripts/mar_verify.sh @@ -119,8 +119,8 @@ verify_signature_count() { local mar="$1" local info count info=$(mar_info "$mar") - # signmar -T prints one "Signature :" line per signature block. - count=$(echo "$info" | grep -cE '^[[:space:]]*Signature[[:space:]]+[0-9]+:' || true) + # signmar -T prints one "Signature block found with 1 signature" line per signature block. + count=$(echo "$info" | grep -cE '^[[:space:]]*Signature block found with [0-9]+ signature' || true) if [ "$count" != "1" ]; then fail "$mar has $count signatures, expected exactly 1" else From 26c907bb39946f97a60702142ebca924c79f16c5 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Wed, 22 Apr 2026 23:08:34 +0200 Subject: [PATCH 25/31] no-bug: New Crowdin updates (gh-13362) --- locales/ga-IE/browser/browser/zen-general.ftl | 2 +- locales/ga-IE/browser/browser/zen-split-view.ftl | 6 +++--- locales/ga-IE/browser/browser/zen-vertical-tabs.ftl | 2 +- locales/ja/browser/browser/zen-vertical-tabs.ftl | 10 +++++----- .../lt/browser/browser/preferences/zen-preferences.ftl | 2 +- locales/lt/browser/browser/zen-general.ftl | 2 +- locales/lt/browser/browser/zen-split-view.ftl | 9 ++++++--- locales/lt/browser/browser/zen-vertical-tabs.ftl | 2 +- 8 files changed, 19 insertions(+), 16 deletions(-) diff --git a/locales/ga-IE/browser/browser/zen-general.ftl b/locales/ga-IE/browser/browser/zen-general.ftl index a64599b56..7b73f797e 100644 --- a/locales/ga-IE/browser/browser/zen-general.ftl +++ b/locales/ga-IE/browser/browser/zen-general.ftl @@ -50,7 +50,7 @@ zen-pinned-tab-replaced = Tá URL an chluaisín phinnáilte curtha in ionad an U zen-tabs-renamed = Athainmníodh an cluaisín go rathúil! zen-background-tab-opened-toast = Tá cluaisín cúlra nua oscailte! zen-workspace-renamed-toast = Athainmníodh an spás oibre go rathúil! -zen-split-view-limit-toast = Can't add more panels to the split view! +zen-split-view-limit-toast = Ní féidir níos mó painéil a chur leis an radharc scoilte! zen-toggle-compact-mode-button = .label = Mód Dlúth .tooltiptext = Mód Dlúth a Athrú diff --git a/locales/ga-IE/browser/browser/zen-split-view.ftl b/locales/ga-IE/browser/browser/zen-split-view.ftl index 919ce6b05..f99a79e01 100644 --- a/locales/ga-IE/browser/browser/zen-split-view.ftl +++ b/locales/ga-IE/browser/browser/zen-split-view.ftl @@ -5,9 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [-1] Split out tab - [1] Add split view... - *[other] Join { $tabCount } Tabs + [-1] Cluaisín scoilte + [1] Amharc scoilte a chur leis... + *[other] Ceangail le { $tabCount } Cluaisíní } .accesskey = S zen-split-link = diff --git a/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl b/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl index 6fa58656e..d107deb12 100644 --- a/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl +++ b/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl @@ -18,7 +18,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = Folaigh an dá cheann .accesskey = H zen-toolbar-context-move-to-folder = - .label = Move to Folder... + .label = Bog go Fillteán... .accesskey = M zen-toolbar-context-new-folder = .label = Fillteán Nua diff --git a/locales/ja/browser/browser/zen-vertical-tabs.ftl b/locales/ja/browser/browser/zen-vertical-tabs.ftl index 3024f09ed..dc726b4bb 100644 --- a/locales/ja/browser/browser/zen-vertical-tabs.ftl +++ b/locales/ja/browser/browser/zen-vertical-tabs.ftl @@ -18,7 +18,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = サイドバーとツールバーを隠す .accesskey = H zen-toolbar-context-move-to-folder = - .label = Move to Folder... + .label = フォルダに移動する… .accesskey = M zen-toolbar-context-new-folder = .label = 新しいフォルダ @@ -36,12 +36,12 @@ tabbrowser-unload-tab-button = tabbrowser-reset-pin-button = .tooltiptext = { $tabCount -> - [one] タブをリセットしてピン留め - *[other] タブをリセットして{ $tabCount }つのタブをピン留め + [one] タブをリセットして固定する + *[other] タブをリセットして{ $tabCount }つのタブを固定する } zen-tab-sublabel = { $tabSubtitle -> - [zen-default-pinned] ピン止めされた URL に戻る - [zen-default-pinned-cmd] ピン止めされたタブから切り離す + [zen-default-pinned] 固定された URL に戻る + [zen-default-pinned-cmd] 固定されたタブから切り離す *[other] { $tabSubtitle } } diff --git a/locales/lt/browser/browser/preferences/zen-preferences.ftl b/locales/lt/browser/browser/preferences/zen-preferences.ftl index f909cd273..47df9d551 100644 --- a/locales/lt/browser/browser/preferences/zen-preferences.ftl +++ b/locales/lt/browser/browser/preferences/zen-preferences.ftl @@ -317,4 +317,4 @@ zen-devtools-toggle-dom-shortcut = Perjungti DOM zen-devtools-toggle-accessibility-shortcut = Perjungti prieinamumą zen-close-all-unpinned-tabs-shortcut = Užverti visas neprisegtas korteles zen-new-unsynced-window-shortcut = Naujas tuščias langas -zen-duplicate-tab-shortcut = Duplicate Tab +zen-duplicate-tab-shortcut = Dubliuoti kortelę diff --git a/locales/lt/browser/browser/zen-general.ftl b/locales/lt/browser/browser/zen-general.ftl index 453e25076..17f8c20b2 100644 --- a/locales/lt/browser/browser/zen-general.ftl +++ b/locales/lt/browser/browser/zen-general.ftl @@ -50,7 +50,7 @@ zen-pinned-tab-replaced = Prisegtos kortelės URL pakeistas dabartiniu URL. zen-tabs-renamed = Kortelė sėkmingai pervadinta. zen-background-tab-opened-toast = Nauja fonos kortelė atverta. zen-workspace-renamed-toast = Darbo sritis sėkmingai pervadintas. -zen-split-view-limit-toast = Can't add more panels to the split view! +zen-split-view-limit-toast = Negalima įtraukti daugiau skydelių į suskaidytą rodinį. zen-toggle-compact-mode-button = .label = Kompaktinis režimas .tooltiptext = Perjungti kompaktinį režimą diff --git a/locales/lt/browser/browser/zen-split-view.ftl b/locales/lt/browser/browser/zen-split-view.ftl index 8d74bbfef..dd0d361bd 100644 --- a/locales/lt/browser/browser/zen-split-view.ftl +++ b/locales/lt/browser/browser/zen-split-view.ftl @@ -5,9 +5,12 @@ tab-zen-split-tabs = .label = { $tabCount -> - [-1] Split out tab - [1] Add split view... - *[other] Join { $tabCount } Tabs + [-1] Išskaidyti kortelę + [1] Įtraukti skaidymo rodinį + [one] Sujungti { $tabCount } kortelę + [few] Sujungti { $tabCount } korteles + [many] Sujungti { $tabCount } kortelės + *[other] Sujungti { $tabCount } kortelių } .accesskey = S zen-split-link = diff --git a/locales/lt/browser/browser/zen-vertical-tabs.ftl b/locales/lt/browser/browser/zen-vertical-tabs.ftl index ed7cc7e80..4c8929735 100644 --- a/locales/lt/browser/browser/zen-vertical-tabs.ftl +++ b/locales/lt/browser/browser/zen-vertical-tabs.ftl @@ -18,7 +18,7 @@ zen-toolbar-context-compact-mode-hide-both = .label = Slėpti abi .accesskey = H zen-toolbar-context-move-to-folder = - .label = Move to Folder... + .label = Perkelti į aplanką... .accesskey = M zen-toolbar-context-new-folder = .label = Naujas aplankas From 05af15d70ac668dc3ec6e42348ae0966b07e6594 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Thu, 23 Apr 2026 10:25:27 +0200 Subject: [PATCH 26/31] gh-13364: Fixed split out context menu showing wrong label (gh-13365) --- package-lock.json | 8 ++++---- package.json | 2 +- src/zen/common/ZenPreloadedScripts.js | 14 +++++++------- src/zen/split-view/ZenViewSplitter.mjs | 10 +++++++++- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index a19e60ef3..ed796cc6f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "devDependencies": { "@babel/preset-typescript": "^7.27.0", "@zen-browser/prettier": "^3.9.3", - "@zen-browser/surfer": "^1.14.5", + "@zen-browser/surfer": "^1.14.6", "formal-git": "^1.2.9", "globals": "^16.3.0", "husky": "^9.1.7", @@ -868,9 +868,9 @@ } }, "node_modules/@zen-browser/surfer": { - "version": "1.14.5", - "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.14.5.tgz", - "integrity": "sha512-VLvYuM1y86Hqux5GDcPwU7FIx2ADbpumnNyO3NI5mK3DtUB8jULPXbhzEtB8qnnRLiQ86yxyPf9ONT28/7FZCg==", + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.14.6.tgz", + "integrity": "sha512-hgTKadIJ/9/9dizHn4229ZZHQckd7D4OR6e7HVkcmtuq1Jke3OAn6SH7u7NjvzvYy35Mb2sXjVUvZEG1ITIfgg==", "dev": true, "license": "MPL-2.0", "dependencies": { diff --git a/package.json b/package.json index 6b9efa519..705e3e515 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "devDependencies": { "@babel/preset-typescript": "^7.27.0", "@zen-browser/prettier": "^3.9.3", - "@zen-browser/surfer": "^1.14.5", + "@zen-browser/surfer": "^1.14.6", "formal-git": "^1.2.9", "globals": "^16.3.0", "husky": "^9.1.7", diff --git a/src/zen/common/ZenPreloadedScripts.js b/src/zen/common/ZenPreloadedScripts.js index 6c4265ce9..559d4c8e4 100644 --- a/src/zen/common/ZenPreloadedScripts.js +++ b/src/zen/common/ZenPreloadedScripts.js @@ -22,6 +22,7 @@ "chrome://browser/content/zen-components/ZenFolders.mjs", "chrome://browser/content/zen-components/ZenEmojiPicker.mjs", "chrome://browser/content/zen-components/ZenLiveFoldersUI.mjs", + "chrome://browser/content/zen-components/ZenDownloadAnimation.mjs", ]; for (let script of scripts) { @@ -30,7 +31,6 @@ let customZenElements = [ ["zen-folder", "chrome://browser/content/zen-components/ZenFolder.mjs"], - ["zen-download-animation", "chrome://browser/content/zen-components/ZenDownloadAnimation.mjs"], ["zen-workspace-creation", "resource:///modules/zen/ZenSpaceCreation.mjs"], ["zen-workspace", "resource:///modules/zen/ZenSpace.mjs"], ["zen-workspace-icons", "resource:///modules/zen/ZenSpaceIcons.mjs"] @@ -43,12 +43,12 @@ // used before DOMContentLoaded it will be imported and upgraded when // registering the customElements.setElementCreationCallback(). for (let [tag, script] of customZenElements) { - customElements.setElementCreationCallback( - tag, - function customElementCreationCallback() { - ChromeUtils.importESModule(script, { global: "current" }); - } - ); + customElements.setElementCreationCallback( + tag, + function customElementCreationCallback() { + ChromeUtils.importESModule(script, { global: "current" }); + } + ); } }, { once: true } diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs index 92639db26..37fc8e6cf 100644 --- a/src/zen/split-view/ZenViewSplitter.mjs +++ b/src/zen/split-view/ZenViewSplitter.mjs @@ -1166,7 +1166,10 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { insetUpdateContextMenuItems() { const contentAreaContextMenu = document.getElementById("tabContextMenu"); contentAreaContextMenu.addEventListener("popupshowing", () => { - let contextTab = TabContextMenu.contextTab || gBrowser.selectedTab; + let contextTab = TabContextMenu.contextTab; + if (!contextTab) { + return; + } let selectedTabs = contextTab.multiselected ? gBrowser.selectedTabs : [contextTab]; @@ -1249,6 +1252,11 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { let currentTab = TabContextMenu.contextTab || gBrowser.selectedTab; if (currentTab.multiselected) { tabs = gBrowser.selectedTabs; + } else if (!currentTab.selected) { + tabs = [ + currentTab, + ...gBrowser.selectedTabs.filter(t => t !== currentTab), + ]; } else { tabs = [currentTab]; } From 5a841063f2c428efd35eccf83a97b232fc8cac66 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Thu, 23 Apr 2026 19:49:58 +0200 Subject: [PATCH 27/31] no-bug: Always select the first tab when unsplitting (gh-13378) --- src/zen/drag-and-drop/ZenDragAndDrop.js | 14 +++++++++++++- src/zen/split-view/ZenViewSplitter.mjs | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/zen/drag-and-drop/ZenDragAndDrop.js b/src/zen/drag-and-drop/ZenDragAndDrop.js index 94c6dff3f..75dc2455f 100644 --- a/src/zen/drag-and-drop/ZenDragAndDrop.js +++ b/src/zen/drag-and-drop/ZenDragAndDrop.js @@ -68,6 +68,7 @@ #maxTabsPerRow = 0; #changeSpaceTimer = null; #isAnimatingTabMove = false; + #firstHapticFeedbackPlayed = false; #dragOverSplit = {}; @@ -1150,12 +1151,17 @@ // outside of a valid drop target. ownerGlobal.gZenFolders.highlightGroupOnDragOver(null); this.ZenDragAndDropService.onDragEnd(); - super.handle_dragend(event); + try { + super.handle_dragend(event); + } catch (e) { + console.error(e); + } thisFromGlobal.clearDragOverVisuals(); ownerGlobal.gZenPinnedTabManager.removeTabContainersDragoverClass(); thisFromGlobal._clearDragOverSplit(); this.#maybeClearVerticalPinnedGridDragOver(); thisFromGlobal.originalDragImageArgs = []; + this.#firstHapticFeedbackPlayed = false; window.removeEventListener( "dragenter", thisFromGlobal.handle_windowDragEnter, @@ -1410,6 +1416,12 @@ dropBefore = true; } } + if (shouldPlayHapticFeedback && !this.#firstHapticFeedbackPlayed) { + // The first haptic feedback can often be too annoying, + // so we skip it, but play for subsequent dragovers. + this.#firstHapticFeedbackPlayed = true; + shouldPlayHapticFeedback = false; + } if (shouldPlayHapticFeedback) { // eslint-disable-next-line mozilla/valid-services Services.zen.playHapticFeedback(); diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs index 37fc8e6cf..50082ed63 100644 --- a/src/zen/split-view/ZenViewSplitter.mjs +++ b/src/zen/split-view/ZenViewSplitter.mjs @@ -231,7 +231,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature { } this.removeGroup(groupIndex); if (changeTab) { - gBrowser.selectedTab = remainingTabs[remainingTabs.length - 1]; + gBrowser.selectedTab = remainingTabs[0]; document .getElementById("cmd_zenNewEmptySplit") .removeAttribute("disabled"); From 0dd99a2ec72f9ac1be44c40420792e4ebbac491d Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Thu, 23 Apr 2026 20:00:57 +0200 Subject: [PATCH 28/31] no-bug: Support glane right click event register (gh-13379) --- src/browser/themes/shared/preferences/zen-preferences.css | 2 +- src/zen/glance/actors/ZenGlanceChild.sys.mjs | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/browser/themes/shared/preferences/zen-preferences.css b/src/browser/themes/shared/preferences/zen-preferences.css index f51d8fbad..f67ae39f7 100644 --- a/src/browser/themes/shared/preferences/zen-preferences.css +++ b/src/browser/themes/shared/preferences/zen-preferences.css @@ -498,7 +498,7 @@ groupbox h2 { #category-ai-features, #setting-control-supportFirefox, .mission-message, -html|setting-group[data-subcategory="layout"] { +html|setting-group:is([data-subcategory="layout"], [groupid="support"]) { display: none !important; } diff --git a/src/zen/glance/actors/ZenGlanceChild.sys.mjs b/src/zen/glance/actors/ZenGlanceChild.sys.mjs index 45a3b520a..c5da67cd2 100644 --- a/src/zen/glance/actors/ZenGlanceChild.sys.mjs +++ b/src/zen/glance/actors/ZenGlanceChild.sys.mjs @@ -50,6 +50,9 @@ export class ZenGlanceChild extends JSWindowActorChild { #sendClickDataToParent(node, originalTarget) { if (!node) { + node = originalTarget; + } + if (!node?.getBoundingClientRect) { return; } // Get the largest element we can get. If the `A` element From d1dc4586f6ee0abab4d08e4a11bbf105aa825f10 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Thu, 23 Apr 2026 20:23:50 +0200 Subject: [PATCH 29/31] no-bug: Make sure to animate when adding the first tab of a folder (gh-13380) --- prefs/zen/split-view.yaml | 2 +- .../tabbrowser/content/tabbrowser-js.patch | 36 +++++++++++-------- src/zen/drag-and-drop/ZenDragAndDrop.js | 6 ++++ 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/prefs/zen/split-view.yaml b/prefs/zen/split-view.yaml index a950cb328..9448fa486 100644 --- a/prefs/zen/split-view.yaml +++ b/prefs/zen/split-view.yaml @@ -15,7 +15,7 @@ value: true - name: zen.splitView.drag-over-split-delayMC - value: 350 + value: 500 - name: zen.splitView.drag-over-split-threshold value: 40 diff --git a/src/browser/components/tabbrowser/content/tabbrowser-js.patch b/src/browser/components/tabbrowser/content/tabbrowser-js.patch index 5f81d07e5..1eb9d8636 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 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..4f845f2175464ce24c2de0014ce102c574daf5dc 100644 +index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..d16fe62c8a67913dd1499b2665a22ff606d98f1e 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js @@ -413,6 +413,7 @@ @@ -966,7 +966,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..4f845f2175464ce24c2de0014ce102c5 } }, metricsContext -@@ -7205,10 +7431,10 @@ +@@ -7205,11 +7431,15 @@ * @param {TabMetricsContext} [metricsContext] */ moveTabToExistingGroup(aTab, aGroup, metricsContext) { @@ -975,11 +975,17 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..4f845f2175464ce24c2de0014ce102c5 throw new Error("Can only move a tab into a tab group"); } - if (aTab.pinned) { +- return; + if (aTab.pinned != !!aGroup.pinned) { - return; ++ if (aGroup.pinned) { ++ this.pinTab(aTab); ++ } else { ++ this.unpinTab(aTab); ++ } } if (aTab.group && aTab.group.id === aGroup.id) { -@@ -7281,6 +7507,7 @@ + return; +@@ -7281,6 +7511,7 @@ let state = { tabIndex: tab._tPos, @@ -987,7 +993,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..4f845f2175464ce24c2de0014ce102c5 }; if (tab.visible) { state.elementIndex = tab.elementIndex; -@@ -7312,7 +7539,7 @@ +@@ -7312,7 +7543,7 @@ let changedSplitView = previousTabState.splitViewId != currentTabState.splitViewId; @@ -996,7 +1002,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..4f845f2175464ce24c2de0014ce102c5 tab.dispatchEvent( new CustomEvent("TabMove", { bubbles: true, -@@ -7354,6 +7581,10 @@ +@@ -7354,6 +7585,10 @@ moveActionCallback(); @@ -1007,7 +1013,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..4f845f2175464ce24c2de0014ce102c5 // Clear tabs cache after moving nodes because the order of tabs may have // changed. this.tabContainer._invalidateCachedTabs(); -@@ -7404,7 +7635,22 @@ +@@ -7404,7 +7639,22 @@ * @returns {object} * The new tab in the current window, null if the tab couldn't be adopted. */ @@ -1031,7 +1037,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..4f845f2175464ce24c2de0014ce102c5 // Swap the dropped tab with a new one we create and then close // it in the other window (making it seem to have moved between // windows). We also ensure that the tab we create to swap into has -@@ -7447,6 +7693,8 @@ +@@ -7447,6 +7697,8 @@ } params.skipLoad = true; let newTab = this.addWebTab("about:blank", params); @@ -1040,7 +1046,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..4f845f2175464ce24c2de0014ce102c5 aTab.container.tabDragAndDrop.finishAnimateTabMove(); -@@ -8149,7 +8397,7 @@ +@@ -8149,7 +8401,7 @@ // preventDefault(). It will still raise the window if appropriate. return; } @@ -1049,7 +1055,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..4f845f2175464ce24c2de0014ce102c5 window.focus(); aEvent.preventDefault(); } -@@ -8166,7 +8414,6 @@ +@@ -8166,7 +8418,6 @@ on_TabGroupCollapse(aEvent) { aEvent.target.tabs.forEach(tab => { @@ -1057,7 +1063,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..4f845f2175464ce24c2de0014ce102c5 }); } -@@ -8500,7 +8747,9 @@ +@@ -8500,7 +8751,9 @@ let filter = this._tabFilters.get(tab); if (filter) { @@ -1067,7 +1073,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..4f845f2175464ce24c2de0014ce102c5 let listener = this._tabListeners.get(tab); if (listener) { -@@ -9306,6 +9555,7 @@ +@@ -9306,6 +9559,7 @@ aWebProgress.isTopLevel ) { this.mTab.setAttribute("busy", "true"); @@ -1075,7 +1081,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..4f845f2175464ce24c2de0014ce102c5 gBrowser._tabAttrModified(this.mTab, ["busy"]); this.mTab._notselectedsinceload = !this.mTab.selected; } -@@ -9386,6 +9636,7 @@ +@@ -9386,6 +9640,7 @@ // known defaults. Note we use the original URL since about:newtab // redirects to a prerendered page. const shouldRemoveFavicon = @@ -1083,7 +1089,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..4f845f2175464ce24c2de0014ce102c5 !this.mBrowser.mIconURL && !ignoreBlank && !(originalLocation.spec in FAVICON_DEFAULTS); -@@ -9560,13 +9811,6 @@ +@@ -9560,13 +9815,6 @@ this.mBrowser.originalURI = aRequest.originalURI; } @@ -1097,7 +1103,7 @@ index 2643e1a2aa14ba5cb4a64a92e1c2dfa5f07d242f..4f845f2175464ce24c2de0014ce102c5 } let userContextId = this.mBrowser.getAttribute("usercontextid") || 0; -@@ -10450,7 +10694,7 @@ var TabContextMenu = { +@@ -10450,7 +10698,7 @@ var TabContextMenu = { ); contextUnpinSelectedTabs.hidden = !this.contextTab.pinned || !this.multiselected; diff --git a/src/zen/drag-and-drop/ZenDragAndDrop.js b/src/zen/drag-and-drop/ZenDragAndDrop.js index 75dc2455f..b752a266b 100644 --- a/src/zen/drag-and-drop/ZenDragAndDrop.js +++ b/src/zen/drag-and-drop/ZenDragAndDrop.js @@ -1008,6 +1008,12 @@ } handle_drop_transition(dropElement, draggedTab, movingTabs, dropBefore) { + if ( + dropElement?.hasAttribute("zen-empty-tab") && + dropElement.group?.isZenFolder + ) { + dropElement = dropElement.group; + } if (isTabGroupLabel(dropElement)) { dropElement = dropElement.group; } From e9e1086bc5ce1dfc7d50f22f25e4b3a03c280134 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Thu, 23 Apr 2026 23:14:59 +0200 Subject: [PATCH 30/31] no-bug: Make sure to always show startup options in general page (gh-13382) --- src/browser/components/preferences/main-js.patch | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/browser/components/preferences/main-js.patch b/src/browser/components/preferences/main-js.patch index 16707c082..56517080b 100644 --- a/src/browser/components/preferences/main-js.patch +++ b/src/browser/components/preferences/main-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js -index 8f8da3c4cabb4a05b50431b1feeff8f1f1abcf6e..97c651cb3728353b9a0d09d1aaa9ba87f8c05b57 100644 +index 8f8da3c4cabb4a05b50431b1feeff8f1f1abcf6e..e57102247eb739ed431bd838a3004b353342defb 100644 --- a/browser/components/preferences/main.js +++ b/browser/components/preferences/main.js @@ -2658,6 +2658,11 @@ function createStartupConfig(hidden = false) { @@ -14,6 +14,15 @@ index 8f8da3c4cabb4a05b50431b1feeff8f1f1abcf6e..97c651cb3728353b9a0d09d1aaa9ba87 { id: "windowsLaunchOnLogin", l10nId: "windows-launch-on-login", +@@ -2755,7 +2760,7 @@ SettingGroupManager.registerGroups({ + }, + defaultBrowser: createDefaultBrowserConfig(), + startup: createStartupConfig( +- Services.prefs.getBoolPref("browser.settings-redesign.enabled", false) ++ false + ), + importBrowserData: { + l10nId: "preferences-data-migration-group", @@ -5174,7 +5179,7 @@ function getBundleForLocales(newLocales) { ]) ); From 98e18d5f604b9d140fe32b5dd997322562a29bb7 Mon Sep 17 00:00:00 2001 From: "mr. m" <91018726+mr-cheffy@users.noreply.github.com> Date: Fri, 24 Apr 2026 12:17:13 +0200 Subject: [PATCH 31/31] no-bug: Fixed checking for workflow update manifests (gh-13384) --- scripts/mar_sign.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/mar_sign.sh b/scripts/mar_sign.sh index 3420cc884..48cde3858 100644 --- a/scripts/mar_sign.sh +++ b/scripts/mar_sign.sh @@ -129,12 +129,12 @@ update_manifests() { manifest="linux_update_manifest_aarch64" elif [[ "$mar_file" == "windows.mar" ]]; then manifest=".github/workflows/object/windows-x64-signed-x86_64/update_manifest" - if [ ! -f "$manifest" ]; then + if [ ! -d "$manifest" ]; then manifest="windows_update_manifest_x86_64" fi elif [[ "$mar_file" == "windows-arm64.mar" ]]; then manifest=".github/workflows/object/windows-x64-signed-arm64/update_manifest" - if [ ! -f "$manifest" ]; then + if [ ! -d "$manifest" ]; then manifest="windows_update_manifest_arm64" fi elif [[ "$mar_file" == "macos.mar" ]]; then