diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 607470d6f..00e8d76f1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -505,6 +505,20 @@ jobs: run: | git clone https://github.com/zen-browser/windows-binaries.git .github/workflows/object --depth 1 + - name: Download signmar-linux-x86_64 from artifacts + uses: actions/download-artifact@v4 + with: + name: signmar-linux-x86_64 + + - name: Sign MAR files + env: + SIGNMAR: ${{ github.workspace }}/signmar-linux-x86_64/signmar + ZEN_MAR_SIGNING_PASSWORD: ${{ secrets.ZEN_MAR_SIGNING_PASSWORD }} + ZEN_SIGNING_CERT_PEM_BASE64: ${{ secrets.ZEN_SIGNING_CERT_PEM_BASE64 }} + ZEN_SIGNING_PRIVATE_KEY_PEM_BASE64: ${{ secrets.ZEN_SIGNING_PRIVATE_KEY_PEM_BASE64 }} + run: | + bash scripts/mar_sign.sh -s + - name: Copy update manifests env: RELEASE_BRANCH: ${{ inputs.update_branch }} @@ -551,8 +565,6 @@ jobs: ./zen-x86_64.AppImage.zsync/* ./zen-aarch64.AppImage/* ./zen-aarch64.AppImage.zsync/* - ./zen.win-x86_64.zip/* - ./zen.win-arm64.zip/* ./linux.mar/* ./linux-aarch64.mar/* ./windows.mar/* @@ -590,8 +602,6 @@ jobs: ./zen-x86_64.AppImage.zsync/* ./zen-aarch64.AppImage/* ./zen-aarch64.AppImage.zsync/* - ./.github/workflows/object/windows-x64-signed-x86_64/zen.win-x86_64.zip - ./.github/workflows/object/windows-x64-signed-arm64/zen.win-arm64.zip ./linux.mar/* ./linux-aarch64.mar/* ./.github/workflows/object/windows-x64-signed-x86_64/windows.mar diff --git a/.github/workflows/issue-metrics.yml b/.github/workflows/issue-metrics.yml index 56ac6763e..7a623410f 100644 --- a/.github/workflows/issue-metrics.yml +++ b/.github/workflows/issue-metrics.yml @@ -42,7 +42,7 @@ jobs: echo "last_month_year=$previous_year" >> "$GITHUB_ENV" - name: Run issue-metrics tool - uses: github/issue-metrics@v2 + uses: github-community-projects/issue-metrics@v2 env: GH_TOKEN: ${{ secrets.DEPLOY_KEY }} HIDE_AUTHOR: true diff --git a/.github/workflows/linux-release-build.yml b/.github/workflows/linux-release-build.yml index 93c6a70da..2ce7906cc 100644 --- a/.github/workflows/linux-release-build.yml +++ b/.github/workflows/linux-release-build.yml @@ -173,3 +173,11 @@ jobs: retention-days: 5 name: linux_update_manifest_${{ matrix.arch }} path: ./dist/update + + - name: Upload signmar + if: ${{ matrix.arch == 'x86_64' }} + uses: actions/upload-artifact@v4 + with: + retention-days: 2 + name: signmar-linux-x86_64 + path: engine/obj-x86_64-pc-linux-gnu/dist/bin/signmar diff --git a/.github/workflows/macos-release-build.yml b/.github/workflows/macos-release-build.yml index 5b09a5706..ccfeacf39 100644 --- a/.github/workflows/macos-release-build.yml +++ b/.github/workflows/macos-release-build.yml @@ -128,7 +128,6 @@ jobs: # Always exist with 0, even if bootstrap fails ./mach --no-interactive bootstrap --application-choice browser --exclude macos-sdk || true cd .. - ls /Library/Developer/CommandLineTools/SDKs/MacOSX26.2.sdk - name: Build language packs run: sh scripts/download-language-packs.sh diff --git a/.github/workflows/src/release-build.sh b/.github/workflows/src/release-build.sh index e553f3942..7b2a5b034 100644 --- a/.github/workflows/src/release-build.sh +++ b/.github/workflows/src/release-build.sh @@ -10,6 +10,8 @@ fi . $HOME/.cargo/env +bash ./scripts/mar_sign.sh -i + ulimit -n 4096 if command -v Xvfb &> /dev/null; then diff --git a/.github/workflows/sync-upstream.yml b/.github/workflows/sync-upstream.yml index 3913e4099..a8f81b400 100644 --- a/.github/workflows/sync-upstream.yml +++ b/.github/workflows/sync-upstream.yml @@ -103,6 +103,10 @@ jobs: fi echo "version=$VERSION" >> $GITHUB_OUTPUT + - name: Import external patches + if: steps.git-check.outputs.files_changed == 'true' + run: python3 scripts/update_external_patches.py || true + - name: Check if patches got applied if: steps.git-check.outputs.files_changed == 'true' id: check-patches @@ -115,10 +119,6 @@ jobs: if: steps.git-check.outputs.files_changed == 'true' run: python3 scripts/import_external_tests.py || true - - name: Import external patches - if: steps.git-check.outputs.files_changed == 'true' - run: python3 scripts/update_external_patches.py || true - - name: Create pull request uses: peter-evans/create-pull-request@v7 if: steps.git-check.outputs.files_changed == 'true' diff --git a/.gitignore b/.gitignore index 0239f5075..67b3b7ef6 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,12 @@ locales/firefox-l10n/ !src/toolkit/themes/shared/design-system/dist/ .DS_Store + +mozconfig + +build/signing/env/ +build/signing/nss_config/ +build/signing/cert.pem +build/signing/private_key.pem +build/signing/private_key.p12 + diff --git a/README.md b/README.md index 39b0bd086..fe46e784a 100644 --- a/README.md +++ b/README.md @@ -34,8 +34,8 @@ 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 `148.0.2`! 🚀 -- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 149.0`! +- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `149.0.2`! 🚀 +- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 149.0.2`! ### Contributing diff --git a/build/firefox-cache/l10n-last-commit-hash b/build/firefox-cache/l10n-last-commit-hash index d845bf6e1..adafe3fc8 100644 --- a/build/firefox-cache/l10n-last-commit-hash +++ b/build/firefox-cache/l10n-last-commit-hash @@ -1 +1 @@ -c10d7dc50d4b596942cce48f8b023b831a27480a \ No newline at end of file +fc45ac45a16dd9312a3e678fdaef33aaa7e0e641 \ No newline at end of file diff --git a/build/signing/public_key.der b/build/signing/public_key.der new file mode 100644 index 000000000..689941690 Binary files /dev/null and b/build/signing/public_key.der differ diff --git a/configs/common/mozconfig b/configs/common/mozconfig index 3d41bc83a..a93df9072 100644 --- a/configs/common/mozconfig +++ b/configs/common/mozconfig @@ -89,8 +89,6 @@ if test "$ZEN_RELEASE"; then ac_add_options --enable-replace-malloc fi -ac_add_options --enable-unverified-updates - ac_add_options --enable-jxl ac_add_options --with-unsigned-addon-scopes=app,system diff --git a/configs/macos/mozconfig b/configs/macos/mozconfig index a2f794c6b..317f6b4e8 100644 --- a/configs/macos/mozconfig +++ b/configs/macos/mozconfig @@ -43,10 +43,6 @@ else fi fi -if test "$ZEN_RELEASE"; then - ac_add_options --with-macos-sdk=/Library/Developer/CommandLineTools/SDKs/MacOSX26.2.sdk -fi - # Keep using ld64 on PGO/LTO builds because of performance regressions when using lld. # Mozilla sets "MOZ_LD64_KNOWN_GOOD" to true when they do automated builds with PGO/LTO on macOS. # See https://searchfox.org/firefox-main/rev/e61d59b5c9a651fd7bf28043f87c0dc669833496/build/moz.configure/lto-pgo.configure#261 diff --git a/configs/windows/mozconfig b/configs/windows/mozconfig index ffe7892bf..9290c08bc 100644 --- a/configs/windows/mozconfig +++ b/configs/windows/mozconfig @@ -26,9 +26,6 @@ fi # This line should be removed once the detection is fixed. ac_add_options --without-ccache -ac_add_options --disable-maintenance-service -ac_add_options --disable-bits-download - 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/locales/ar/browser/browser/zen-general.ftl b/locales/ar/browser/browser/zen-general.ftl index 0ceabb83e..997a14a2b 100644 --- a/locales/ar/browser/browser/zen-general.ftl +++ b/locales/ar/browser/browser/zen-general.ftl @@ -6,9 +6,9 @@ zen-panel-ui-current-profile-text = الملف الشخصي الحالي unified-extensions-description = تستخدم الإضافات لجلب المزيد من الوظائف الإضافية إلى { -brand-short-name }. tab-context-zen-reset-pinned-tab = .label = - {$isEssential -> - [true] إعادة تعيين علامة التبويب الأساسية - *[false] إعادة تعيين التبويب المثبت + { $isEssential -> + [true] إعادة تعيين علامة التبويب الأساسية + *[false] إعادة تعيين التبويب المثبت } .accesskey = ر tab-context-zen-add-essential = @@ -20,10 +20,11 @@ tab-context-zen-remove-essential = .accesskey = R tab-context-zen-replace-pinned-url-with-current = .label = - {$isEssential -> + { $isEssential -> [true] استبدل الرابط الأساسي بـ - *[false] استبدل الرابط المثبت بـ - الحالي + *[false] + استبدل الرابط المثبت بـ + الحالي } .accesskey = C tab-context-zen-edit-title = diff --git a/locales/ar/browser/browser/zen-menubar.ftl b/locales/ar/browser/browser/zen-menubar.ftl index ccfb9f5ba..b1f8ed00d 100644 --- a/locales/ar/browser/browser/zen-menubar.ftl +++ b/locales/ar/browser/browser/zen-menubar.ftl @@ -4,7 +4,7 @@ zen-menubar-toggle-pinned-tabs = .label = - {$pinnedAreCollapsed -> + { $pinnedAreCollapsed -> [true] توسيع علامات التبويب المثبتة *[false] طي علامات التبويب المثبتة } diff --git a/locales/ar/browser/browser/zen-vertical-tabs.ftl b/locales/ar/browser/browser/zen-vertical-tabs.ftl index 151c53648..47898b5db 100644 --- a/locales/ar/browser/browser/zen-vertical-tabs.ftl +++ b/locales/ar/browser/browser/zen-vertical-tabs.ftl @@ -26,19 +26,19 @@ sidebar-zen-create-new = .label = إنشاء جديد... tabbrowser-unload-tab-button = .tooltiptext = - {$tabCount -> + { $tabCount -> [one] تفريغ والتبديل إلى علامة التبويب *[other] تفريغ { $tabCount } علامات التبويب والتبديل إلى الأولى } tabbrowser-reset-pin-button = .tooltiptext = - {$tabCount -> + { $tabCount -> [one] إعادة تعيين علامة التبويب وتثبيتها - *[other] إعادة تعيين وتثبيت { $tabCount} + *[other] إعادة تعيين وتثبيت { $tabCount } } zen-tab-sublabel = - {$tabSubtitle -> + { $tabSubtitle -> [zen-default-pinned] العودة إلى الرابط المثبت [zen-default-pinned-cmd] فصل عن علامة التبويب المثبتة - *[other] { $tabSubtitle} + *[other] { $tabSubtitle } } diff --git a/locales/bg/browser/browser/zen-split-view.ftl b/locales/bg/browser/browser/zen-split-view.ftl index e7cb9c67b..8fbcd79c2 100644 --- a/locales/bg/browser/browser/zen-split-view.ftl +++ b/locales/bg/browser/browser/zen-split-view.ftl @@ -5,8 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Split Tab (multiple selected tabs needed) - *[other] Split { $tabCount } Tabs + [1] Join Tab (multiple selected tabs needed) + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/bs/browser/browser/zen-split-view.ftl b/locales/bs/browser/browser/zen-split-view.ftl index 10593eed9..743688eed 100644 --- a/locales/bs/browser/browser/zen-split-view.ftl +++ b/locales/bs/browser/browser/zen-split-view.ftl @@ -5,8 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Split Tab (multiple selected tabs needed) - *[other] Split { $tabCount } Tabs + [1] Join Tab (multiple selected tabs needed) + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/ca/browser/browser/zen-general.ftl b/locales/ca/browser/browser/zen-general.ftl index ea3ccbf70..e9a05a52a 100644 --- a/locales/ca/browser/browser/zen-general.ftl +++ b/locales/ca/browser/browser/zen-general.ftl @@ -14,7 +14,7 @@ tab-context-zen-reset-pinned-tab = tab-context-zen-add-essential = .label = Afegeix als essencials .accesskey = E -tab-context-zen-add-essential-badge = { $num } / { $max } espais ocupats +tab-context-zen-add-essential-badge = { $num } / { $max } tab-context-zen-remove-essential = .label = Elimina dels essencials .accesskey = R diff --git a/locales/ca/browser/browser/zen-split-view.ftl b/locales/ca/browser/browser/zen-split-view.ftl index 3da537f6b..52ba7b3e1 100644 --- a/locales/ca/browser/browser/zen-split-view.ftl +++ b/locales/ca/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Pestanya dividida (calen diverses pestanyes seleccionades) - *[other] Divideix { $tabCount } pestanyes + [-1] Pestanya dividida + [1] Uneix pestanyes (calen diverses pestanyes seleccionades) + *[other] Uneix { $tabCount } pestanyes } .accesskey = S zen-split-link = diff --git a/locales/cy/browser/browser/zen-general.ftl b/locales/cy/browser/browser/zen-general.ftl index a4f31b20b..9b8202002 100644 --- a/locales/cy/browser/browser/zen-general.ftl +++ b/locales/cy/browser/browser/zen-general.ftl @@ -22,7 +22,7 @@ tab-context-zen-replace-pinned-url-with-current = .label = { $isEssential -> [true] Amnewid URL Hanfodol gyda'r Cyfredol - *[false] Amnewid URL wedi'i binio gyda'r Cyfredol + *[false] Amnewid URL wedi'i binio gyda'r Cyfredol } .accesskey = P tab-context-zen-edit-title = diff --git a/locales/cy/browser/browser/zen-workspaces.ftl b/locales/cy/browser/browser/zen-workspaces.ftl index 30bc974eb..28f2adf99 100644 --- a/locales/cy/browser/browser/zen-workspaces.ftl +++ b/locales/cy/browser/browser/zen-workspaces.ftl @@ -2,7 +2,7 @@ # 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-workspaces-text = Gofodau Gwaith +zen-panel-ui-workspaces-text = Gofodau zen-panel-ui-spaces-label = .label = Gofodau zen-panel-ui-workspaces-create = @@ -10,7 +10,7 @@ zen-panel-ui-workspaces-create = zen-panel-ui-folder-create = .label = Creu Ffolder zen-panel-ui-live-folder-create = - .label = Live Folder + .label = Ffolder Byw zen-panel-ui-new-empty-split = .label = Hollt Newydd zen-workspaces-panel-context-delete = @@ -25,7 +25,7 @@ zen-workspaces-panel-context-default-profile = zen-workspaces-panel-unload = .label = Dadlwytho Gofod zen-workspaces-panel-unload-others = - .label = Unload All Other Spaces + .label = Dadlwytho Pob Gofod Arall zen-workspaces-how-to-reorder-title = Sut i aildrefnu gofodau zen-workspaces-how-to-reorder-desc = Llusgwch yr eiconau gofod ar waelod y bar ochr i'w haildrefnu zen-workspaces-change-theme = diff --git a/locales/de/browser/browser/preferences/zen-preferences.ftl b/locales/de/browser/browser/preferences/zen-preferences.ftl index c7a76cc71..e17936377 100644 --- a/locales/de/browser/browser/preferences/zen-preferences.ftl +++ b/locales/de/browser/browser/preferences/zen-preferences.ftl @@ -8,9 +8,9 @@ category-zen-looks = zen-warning-language = Das Ändern der Standardsprache könnte es Websites erleichtern, dich zu verfolgen. zen-vertical-tabs-layout-header = Browser-Layout zen-vertical-tabs-layout-description = Wähle das Layout, das am besten zu dir passt -zen-layout-single-toolbar = Einzelne Symbolleiste -zen-layout-multiple-toolbar = Mehrere Symbolleisten -zen-layout-collapsed-toolbar = Eingeklappte Symbolleiste +zen-layout-single-toolbar = Nur Seitenleiste +zen-layout-multiple-toolbar = Seitenleiste und obere Symbolleiste +zen-layout-collapsed-toolbar = Eingeklappte Seitenleiste sync-currently-syncing-workspaces = Arbeitsbereiche sync-engine-workspaces = .label = Arbeitsbereiche @@ -43,11 +43,11 @@ category-zen-workspaces = .tooltiptext = { pane-zen-tabs-title } pane-settings-workspaces-title = Arbeitsbereiche 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 = Beim Schließen eines Tabs zum zuletzt verwendeten Tab wechseln statt zum nächsten zen-tabs-close-on-back-with-no-history = - .label = Tab schließen und zum Besitzer-Tab (oder dem zuletzt benutzten Tab) wechseln, wenn kein Tab-Verlauf vorhanden ist + .label = Tab schließen und zum Besitzer-Tab (oder dem zuletzt verwendeten Tab) wechseln, wenn kein Verlauf vorhanden ist zen-settings-workspaces-sync-unpinned-tabs = - .label = Sync only pinned tabs in workspaces + .label = Nur angeheftete Tabs in Arbeitsbereichen synchronisieren zen-tabs-cycle-by-attribute = .label = Strg+Tab wechselt nur zwischen Essential- oder Arbeitsbereich-Tabs zen-tabs-cycle-ignore-pending-tabs = @@ -57,11 +57,11 @@ zen-look-and-feel-compact-toolbar-themed = .label = Theme-Hintergrund für kompakte Symbolleiste verwenden zen-workspace-continue-where-left-off = .label = Dort fortfahren, wo du aufgehört hast -pane-zen-pinned-tab-manager-title = Angepinnte Tabs -zen-pinned-tab-manager-header = Allgemeine Einstellungen für angepinnte Tabs -zen-pinned-tab-manager-description = Zusätzliches Verhalten von angepinnten Tabs verwalten +pane-zen-pinned-tab-manager-title = Angeheftete Tabs +zen-pinned-tab-manager-header = Allgemeine Einstellungen für angeheftete Tabs +zen-pinned-tab-manager-description = Zusätzliches Verhalten von angehefteten Tabs verwalten zen-pinned-tab-manager-restore-pinned-tabs-to-pinned-url = - .label = Angepinnte Tabs beim Start auf ihre ursprünglich angepinnte URL zurücksetzen + .label = Angeheftete Tabs beim Start auf ihre ursprüngliche URL zurücksetzen zen-pinned-tab-manager-container-specific-essentials-enabled = .label = Container-spezifische Essentials aktivieren zen-pinned-tab-manager-close-shortcut-behavior-label = Verhalten der Tastenkombination zum Schließen von Tabs @@ -83,17 +83,17 @@ zen-settings-workspaces-description = Mit Arbeitsbereichen kannst du mehrere Bro zen-settings-workspaces-enabled = .label = Arbeitsbereiche aktivieren (experimentell) zen-settings-workspaces-hide-default-container-indicator = - .label = Container-Indikator in der Tab-Leiste ausblenden + .label = Standard-Container-Indikator in der Tab-Leiste ausblenden zen-key-unsaved = Nicht gespeichertes Tastenkürzel! Bitte speichere es, indem du nach der Eingabe die „Escape“-Taste drückst. zen-key-conflict = Konflikt mit { $group } -> { $shortcut } pane-zen-theme-title = Design-Einstellungen zen-vertical-tabs-title = Seitenleiste und Tab-Layout zen-vertical-tabs-header = Vertikale Tabs -zen-vertical-tabs-description = Verwalte die Ausrichtung der Tabs und andere Layout-Einstellungen +zen-vertical-tabs-description = Verwalte deine Tabs in einem vertikalen Layout zen-vertical-tabs-show-expand-button = .label = Erweitern-Schaltfläche anzeigen zen-vertical-tabs-newtab-on-tab-list = - .label = "Neuer Tab"-Button in der Tab-Liste anzeigen + .label = „Neuer Tab“-Button in der Tab-Liste anzeigen zen-vertical-tabs-newtab-top-button-up = .label = Schaltfläche „Neuer Tab“ nach oben verschieben zen-vertical-tabs-expand-tabs-by-default = Tabs standardmäßig erweitern @@ -106,7 +106,7 @@ zen-theme-disable-all-enabled = .title = Alle Mods deaktivieren zen-theme-disable-all-disabled = .title = Alle Mods aktivieren -zen-theme-marketplace-description = Finde und installiere Designs aus dem Store. +zen-theme-marketplace-description = Finde und installiere Mods aus dem Store. zen-theme-marketplace-remove-button = .label = Design entfernen zen-theme-marketplace-check-for-updates-button = @@ -119,27 +119,27 @@ zen-theme-marketplace-import-success = Mods erfolgreich importiert zen-theme-marketplace-import-failure = Beim Importieren der Mods ist ein Fehler aufgetreten zen-theme-marketplace-export-success = Mods erfolgreich exportiert zen-theme-marketplace-export-failure = Beim Exportieren der Mods ist ein Fehler aufgetreten -zen-theme-marketplace-updates-success = Design erfolgreich aktualisiert +zen-theme-marketplace-updates-success = Mods erfolgreich aktualisiert zen-theme-marketplace-updates-failure = Es konnten keine Updates gefunden werden! zen-theme-marketplace-toggle-enabled-button = .title = Design deaktivieren zen-theme-marketplace-toggle-disabled-button = .title = Design aktivieren -zen-theme-marketplace-remove-confirmation = Möchtest du dieses Mod wirklich entfernen? +zen-theme-marketplace-remove-confirmation = Möchtest du diesen Mod wirklich entfernen? zen-theme-marketplace-close-modal = Schließen zen-theme-marketplace-theme-header-title = .title = CSS-Selektor: { $name } zen-theme-marketplace-dropdown-default-label = .label = Keine zen-theme-marketplace-input-default-placeholder = - .placeholder = Gib etwas ein... + .placeholder = Etwas eingeben... pane-zen-marketplace-title = Zen-Mods zen-themes-auto-update = .label = Installierte Mods beim Start automatisch aktualisieren zen-settings-workspaces-force-container-tabs-to-workspace = .label = Zum Arbeitsbereich wechseln, in dem Container als Standard gesetzt ist, wenn Container-Tabs geöffnet werden zen-theme-marketplace-link = Store besuchen -zen-dark-theme-styles-header = Dunkles Design – Stile +zen-dark-theme-styles-header = Dunkles Design zen-dark-theme-styles-description = Passe das dunkle Design nach deinen Wünschen an zen-dark-theme-styles-amoled = Nacht-Design zen-dark-theme-styles-default = Standardmäßiges dunkles Design @@ -149,7 +149,7 @@ zen-compact-mode-styles-top = Obere Leiste ausblenden zen-compact-mode-styles-both = Beides ausblenden zen-urlbar-title = Zen-Adressleiste zen-urlbar-header = Allgemeine Einstellungen für die Adressleiste -zen-urlbar-description = Passen Sie die Adressleiste nach Ihren Wünschen an +zen-urlbar-description = Passe die Adressleiste nach deinen Wünschen an zen-urlbar-behavior-label = Verhalten zen-urlbar-behavior-normal = .label = Normal @@ -162,7 +162,7 @@ category-zen-CKS = .tooltiptext = { pane-zen-CKS-title } pane-settings-CKS-title = { -brand-short-name }-Tastenkürzel category-zen-marketplace = - .tooltiptext = Zen Mods + .tooltiptext = Zen-Mods zen-settings-CKS-header = Passen Sie Ihre Tastenkürzel an zen-settings-CKS-description = Ändere die Standard-Tastenkürzel nach deinen Wünschen und verbessere dein Browser-Erlebnis zen-settings-CKS-disable-firefox = @@ -175,9 +175,9 @@ zenCKSOption-group-other = Sonstiges zenCKSOption-group-windowAndTabManagement = Fenster- und Tab-Verwaltung zenCKSOption-group-navigation = Navigation zenCKSOption-group-searchAndFind = Suchen und Finden -zenCKSOption-group-pageOperations = Seitenoperationen -zenCKSOption-group-historyAndBookmarks = Verlauf & Lesezeichen -zenCKSOption-group-mediaAndDisplay = Medien & Anzeige +zenCKSOption-group-pageOperations = Seitenaktionen +zenCKSOption-group-historyAndBookmarks = Verlauf und Lesezeichen +zenCKSOption-group-mediaAndDisplay = Medien und Anzeige zenCKSOption-group-zen-compact-mode = Kompaktmodus zenCKSOption-group-zen-workspace = Zen-Arbeitsbereiche zenCKSOption-group-zen-other = Andere Zen-Funktionen @@ -245,7 +245,7 @@ zen-find-shortcut = Auf Seite suchen zen-search-find-again-shortcut = Weitersuchen zen-search-find-again-shortcut-prev = Vorheriges suchen zen-search-find-again-shortcut-2 = Weitersuchen (Alt) -zen-bookmark-this-page-shortcut = Diese Seite zu Lesezeichen hinzufügen +zen-bookmark-this-page-shortcut = Diese Seite als Lesezeichen speichern zen-bookmark-show-library-shortcut = Lesezeichen-Bibliothek anzeigen zen-key-stop = Laden stoppen zen-full-zoom-reduce-shortcut = Herauszoomen @@ -256,7 +256,7 @@ zen-full-zoom-enlarge-shortcut-alt = Hineinzoomen (Alt) zen-full-zoom-enlarge-shortcut-alt2 = Hineinzoomen (Alt 2) zen-bidi-switch-direction-shortcut = Text-Richtung wechseln zen-private-browsing-shortcut = Privaten Modus öffnen -zen-screenshot-shortcut = Screenshot machen +zen-screenshot-shortcut = Bildschirmfoto erstellen zen-key-sanitize = Browser-Daten löschen zen-quit-app-shortcut = Anwendung beenden zen-key-wr-capture-cmd = WR-Aufnahme-Befehl @@ -268,7 +268,7 @@ zen-close-tab-shortcut = Tab schließen zen-compact-mode-shortcut-show-sidebar = Schwebende Seitenleiste umschalten zen-compact-mode-shortcut-show-toolbar = Schwebende Symbolleiste umschalten zen-compact-mode-shortcut-toggle = Kompaktmodus umschalten -zen-glance-expand = Glance erweitern +zen-glance-expand = Schnellansicht vergrößern zen-workspace-shortcut-switch-1 = Zu Arbeitsbereich 1 wechseln zen-workspace-shortcut-switch-2 = Zu Arbeitsbereich 2 wechseln zen-workspace-shortcut-switch-3 = Zu Arbeitsbereich 3 wechseln @@ -288,14 +288,14 @@ zen-split-view-shortcut-vertical = Vertikales Layout für geteilte Ansicht umsch zen-split-view-shortcut-horizontal = Horizontales Layout für geteilte Ansicht umschalten zen-split-view-shortcut-unsplit = Geteilte Ansicht schließen zen-new-empty-split-view-shortcut = Neue leere geteilte Ansicht -zen-key-select-tab-1 = Tab #1 auswählen -zen-key-select-tab-2 = Tab #2 auswählen -zen-key-select-tab-3 = Tab #3 auswählen -zen-key-select-tab-4 = Tab #4 auswählen -zen-key-select-tab-5 = Tab #5 auswählen -zen-key-select-tab-6 = Tab #6 auswählen -zen-key-select-tab-7 = Tab #7 auswählen -zen-key-select-tab-8 = Tab #8 auswählen +zen-key-select-tab-1 = Tab 1 auswählen +zen-key-select-tab-2 = Tab 2 auswählen +zen-key-select-tab-3 = Tab 3 auswählen +zen-key-select-tab-4 = Tab 4 auswählen +zen-key-select-tab-5 = Tab 5 auswählen +zen-key-select-tab-6 = Tab 6 auswählen +zen-key-select-tab-7 = Tab 7 auswählen +zen-key-select-tab-8 = Tab 8 auswählen zen-key-select-tab-last = Letzten Tab auswählen zen-key-show-all-tabs = Alle Tabs anzeigen zen-key-goto-history = Zum Verlauf gehen @@ -316,4 +316,4 @@ zen-devtools-toggle-storage-shortcut = Speicher umschalten 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 = New Unsynced Window +zen-new-unsynced-window-shortcut = Neues leeres Fenster diff --git a/locales/de/browser/browser/zen-folders.ftl b/locales/de/browser/browser/zen-folders.ftl index e8afb554e..14a00f11c 100644 --- a/locales/de/browser/browser/zen-folders.ftl +++ b/locales/de/browser/browser/zen-folders.ftl @@ -20,4 +20,4 @@ zen-folders-unload-all-tooltip = .tooltiptext = Alle aktiven Tabs in diesem Ordner entladen zen-folders-unload-folder = .label = Alle Tabs entladen -zen-folders-search-no-results = Keine Tabs gefunden +zen-folders-search-no-results = Keine Tabs gefunden 🤔 diff --git a/locales/de/browser/browser/zen-general.ftl b/locales/de/browser/browser/zen-general.ftl index efe81f675..ad0ad3fce 100644 --- a/locales/de/browser/browser/zen-general.ftl +++ b/locales/de/browser/browser/zen-general.ftl @@ -7,8 +7,8 @@ unified-extensions-description = Mit Erweiterungen kannst du { -brand-short-name tab-context-zen-reset-pinned-tab = .label = { $isEssential -> - [true] Reset Essential Tab - *[false] Reset Pinned Tab + [true] Essential-Tab zurücksetzen + *[false] Angehefteten Tab zurücksetzen } .accesskey = R tab-context-zen-add-essential = @@ -21,15 +21,15 @@ 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] Essential-URL durch aktuelle ersetzen + *[false] Angeheftete URL durch aktuelle ersetzen } .accesskey = C tab-context-zen-edit-title = .label = Titel ändern... tab-context-zen-edit-icon = .label = Symbol ändern... -zen-themes-corrupted = Deine { -brand-short-name }-Mods-Datei ist beschädigt. Wir haben sie auf das Standard-Design zurückgesetzt. +zen-themes-corrupted = Deine { -brand-short-name }-Mods-Datei ist beschädigt. Sie wurde auf das Standard-Design zurückgesetzt. zen-shortcuts-corrupted = Deine { -brand-short-name }-Tastenkombinationsdatei ist beschädigt. Sie wurde auf die Standard-Tastenkombinationen zurückgesetzt. # note: Do not translate the "
" tags in the following string zen-new-urlbar-notification = @@ -41,7 +41,7 @@ pictureinpicture-minimize-btn = .tooltip = Minimieren zen-panel-ui-gradient-generator-custom-color = Eigene Farbe zen-copy-current-url-confirmation = URL kopiert! -zen-copy-current-url-as-markdown-confirmation = Copied current URL as Markdown! +zen-copy-current-url-as-markdown-confirmation = URL als Markdown kopiert! zen-general-cancel-label = .label = Abbrechen zen-general-confirm = @@ -69,8 +69,8 @@ zen-site-data-settings = Einstellungen zen-generic-manage = Verwalten zen-generic-more = Mehr zen-generic-next = Weiter -zen-essentials-promo-label = Hinzufügen zu Essentials -zen-essentials-promo-sublabel = Behalte deine Lieblings-Tabs nur einen Klick entfernt +zen-essentials-promo-label = Zu Essentials hinzufügen +zen-essentials-promo-sublabel = Deine Lieblings-Tabs, immer nur einen Klick entfernt # These labels will be used for the site data panel settings zen-site-data-setting-allow = Erlaubt zen-site-data-setting-block = Blockiert @@ -106,7 +106,7 @@ zen-site-data-setting-site-protection = Tracking-Schutz zen-site-data-panel-feature-callout-title = Hier findest du Add-ons, Berechtigungen und mehr zen-site-data-panel-feature-callout-subtitle = Klicke auf das Symbol, um Website-Einstellungen anzupassen, Sicherheitsinfos anzuzeigen, auf Erweiterungen zuzugreifen und häufige Aktionen auszuführen. zen-open-link-in-glance = - .label = Link in Glance öffnen + .label = Link in Schnellansicht öffnen .accesskey = G zen-sidebar-notification-updated-heading = Update abgeschlossen! @@ -123,4 +123,4 @@ zen-window-sync-migration-dialog-message = Zen synchronisiert jetzt Fenster auf zen-window-sync-migration-dialog-learn-more = Mehr erfahren zen-window-sync-migration-dialog-accept = Verstanden zen-appmenu-new-blank-window = - .label = New blank window + .label = Neues leeres Fenster diff --git a/locales/de/browser/browser/zen-menubar.ftl b/locales/de/browser/browser/zen-menubar.ftl index 1a1496dbc..e07c10b8b 100644 --- a/locales/de/browser/browser/zen-menubar.ftl +++ b/locales/de/browser/browser/zen-menubar.ftl @@ -5,13 +5,13 @@ zen-menubar-toggle-pinned-tabs = .label = { $pinnedAreCollapsed -> - [true] Fixierte Tabs ausklappen - *[false] Fixierte Tabs einklappen + [true] Angeheftete Tabs ausklappen + *[false] Angeheftete Tabs einklappen } zen-menubar-appearance = .label = Erscheinungsbild zen-menubar-appearance-description = - .label = Webseiten werden nutzen: + .label = Websites verwenden: zen-menubar-appearance-auto = .label = Automatisch zen-menubar-appearance-light = @@ -19,4 +19,4 @@ zen-menubar-appearance-light = zen-menubar-appearance-dark = .label = Dunkel zen-menubar-new-blank-window = - .label = New Blank Window + .label = Neues leeres Fenster diff --git a/locales/de/browser/browser/zen-split-view.ftl b/locales/de/browser/browser/zen-split-view.ftl index 38487e18e..d466fbbd5 100644 --- a/locales/de/browser/browser/zen-split-view.ftl +++ b/locales/de/browser/browser/zen-split-view.ftl @@ -5,6 +5,7 @@ tab-zen-split-tabs = .label = { $tabCount -> + [-1] Aufteilung aufheben [1] Tab aufteilen (wähle mehrere Tabs aus) *[other] { $tabCount } Tabs aufteilen } diff --git a/locales/de/browser/browser/zen-vertical-tabs.ftl b/locales/de/browser/browser/zen-vertical-tabs.ftl index 00ea39a67..4b38283b1 100644 --- a/locales/de/browser/browser/zen-vertical-tabs.ftl +++ b/locales/de/browser/browser/zen-vertical-tabs.ftl @@ -27,7 +27,7 @@ sidebar-zen-create-new = tabbrowser-unload-tab-button = .tooltiptext = { $tabCount -> - [one] Tab entladen und öffnen + [one] Tab entladen und wechseln *[other] { $tabCount } Tabs entladen und zum ersten wechseln } tabbrowser-reset-pin-button = @@ -38,7 +38,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] Zurück zur angehefteten URL + [zen-default-pinned-cmd] Vom angehefteten Tab lösen *[other] { $tabSubtitle } } diff --git a/locales/de/browser/browser/zen-welcome.ftl b/locales/de/browser/browser/zen-welcome.ftl index 332b9af23..d46b7759a 100644 --- a/locales/de/browser/browser/zen-welcome.ftl +++ b/locales/de/browser/browser/zen-welcome.ftl @@ -17,7 +17,7 @@ zen-welcome-workspace-colors-title = Deine Arbeitsbereiche, deine Farben zen-welcome-workspace-colors-description = Personalisiere deinen Browser, indem du jedem Arbeitsbereich eine eigene Farbidentität gibst. zen-welcome-start-browsing-title = Alles bereit?
- Los geht’s! + Los geht's! zen-welcome-start-browsing-description-1 = Du bist startklar! Klicke auf den Button unten, um mit { -brand-short-name } loszulegen. zen-welcome-start-browsing = Los geht's! zen-welcome-default-search-title = Deine Standard-Suchmaschine diff --git a/locales/de/browser/browser/zen-workspaces.ftl b/locales/de/browser/browser/zen-workspaces.ftl index 24973bbaf..829e1f606 100644 --- a/locales/de/browser/browser/zen-workspaces.ftl +++ b/locales/de/browser/browser/zen-workspaces.ftl @@ -10,7 +10,7 @@ zen-panel-ui-workspaces-create = zen-panel-ui-folder-create = .label = Ordner erstellen zen-panel-ui-live-folder-create = - .label = Live Folder + .label = Live-Ordner zen-panel-ui-new-empty-split = .label = Neuen Split erstellen zen-workspaces-panel-context-delete = @@ -25,7 +25,7 @@ zen-workspaces-panel-context-default-profile = zen-workspaces-panel-unload = .label = Arbeitsbereich entladen zen-workspaces-panel-unload-others = - .label = Unload All Other Spaces + .label = Alle anderen Arbeitsbereiche entladen zen-workspaces-how-to-reorder-title = So ordnest du Arbeitsbereiche neu an zen-workspaces-how-to-reorder-desc = Zieh die Arbeitsbereich-Symbole am unteren Rand der Seitenleiste, um sie neu anzuordnen zen-workspaces-change-theme = @@ -42,7 +42,7 @@ zen-bookmark-edit-panel-workspace-selector = zen-panel-ui-gradient-generator-algo-complementary = .label = Komplementär zen-panel-ui-gradient-generator-algo-splitComplementary = - .label = Geteilt-Komplementär + .label = Split-Komplementär zen-panel-ui-gradient-generator-algo-analogous = .label = Analog zen-panel-ui-gradient-generator-algo-triadic = diff --git a/locales/el/browser/browser/zen-workspaces.ftl b/locales/el/browser/browser/zen-workspaces.ftl index 7c0263a5c..320be140b 100644 --- a/locales/el/browser/browser/zen-workspaces.ftl +++ b/locales/el/browser/browser/zen-workspaces.ftl @@ -10,7 +10,7 @@ zen-panel-ui-workspaces-create = zen-panel-ui-folder-create = .label = Δημιουργία Φακέλου zen-panel-ui-live-folder-create = - .label = Live Folder + .label = Ζωντανός Φάκελος zen-panel-ui-new-empty-split = .label = Νέος Διαχωρισμός zen-workspaces-panel-context-delete = @@ -25,7 +25,7 @@ zen-workspaces-panel-context-default-profile = zen-workspaces-panel-unload = .label = Εκφόρτωση Χώρου Εργασίας zen-workspaces-panel-unload-others = - .label = Unload All Other Spaces + .label = Εκφόρτωση Όλων Των Άλλων Χώρων zen-workspaces-how-to-reorder-title = Πώς να αναδιατάξετε τους χώρους zen-workspaces-how-to-reorder-desc = Σύρετε τα εικονίδια χώρου στο κάτω μέρος της πλαϊνής μπάρας για να τα αναδιατάξετε zen-workspaces-change-theme = diff --git a/locales/en-GB/browser/browser/zen-split-view.ftl b/locales/en-GB/browser/browser/zen-split-view.ftl index 3593d390b..97d65b70a 100644 --- a/locales/en-GB/browser/browser/zen-split-view.ftl +++ b/locales/en-GB/browser/browser/zen-split-view.ftl @@ -5,8 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Split Tab (multiple selected tabs needed) - *[other] Split { $tabCount } Tabs + [1] Join Tab (multiple selected tabs needed) + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/en-US/browser/browser/preferences/zen-preferences.ftl b/locales/en-US/browser/browser/preferences/zen-preferences.ftl index 7b304613c..c803f7304 100644 --- a/locales/en-US/browser/browser/preferences/zen-preferences.ftl +++ b/locales/en-US/browser/browser/preferences/zen-preferences.ftl @@ -357,3 +357,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 \ No newline at end of file diff --git a/locales/en-US/browser/browser/zen-general.ftl b/locales/en-US/browser/browser/zen-general.ftl index ef3bbe3c5..f88f215fd 100644 --- a/locales/en-US/browser/browser/zen-general.ftl +++ b/locales/en-US/browser/browser/zen-general.ftl @@ -15,7 +15,7 @@ tab-context-zen-reset-pinned-tab = tab-context-zen-add-essential = .label = Add to Essentials .accesskey = E -tab-context-zen-add-essential-badge = { $num } / { $max } slots filled +tab-context-zen-add-essential-badge = { $num } / { $max } tab-context-zen-remove-essential = .label = Remove from Essentials .accesskey = R diff --git a/locales/en-US/browser/browser/zen-split-view.ftl b/locales/en-US/browser/browser/zen-split-view.ftl index 86090453a..8e9aaaed5 100644 --- a/locales/en-US/browser/browser/zen-split-view.ftl +++ b/locales/en-US/browser/browser/zen-split-view.ftl @@ -5,9 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [-1] Unsplit Tabs - [1] Split Tab (multiple selected tabs needed) - *[other] Split { $tabCount } Tabs + [-1] Split out tab + [1] Join Tab (multiple selected tabs needed) + *[other] Join { $tabCount } Tabs } .accesskey = S diff --git a/locales/es-ES/browser/browser/zen-split-view.ftl b/locales/es-ES/browser/browser/zen-split-view.ftl index c32efc261..915fdba54 100644 --- a/locales/es-ES/browser/browser/zen-split-view.ftl +++ b/locales/es-ES/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Vista dividida (se necesitan varias pestañas seleccionadas) - *[other] Añadir { $tabCount } pestañas a vista dividida + [-1] Deshacer división + [1] Vista dividida (seleccione varias pestañas) + *[other] Añadir { $tabCount } pestañas a la vista dividida } .accesskey = S zen-split-link = diff --git a/locales/eu/browser/browser/zen-split-view.ftl b/locales/eu/browser/browser/zen-split-view.ftl index 0cf9037a1..a83fc33d2 100644 --- a/locales/eu/browser/browser/zen-split-view.ftl +++ b/locales/eu/browser/browser/zen-split-view.ftl @@ -5,9 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [-1] Unsplit Tabs - [1] Split Tab (multiple selected tabs needed) - *[other] Split { $tabCount } Tabs + [-1] Split out tab + [1] Join Tab (multiple selected tabs needed) + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/fa/browser/browser/zen-split-view.ftl b/locales/fa/browser/browser/zen-split-view.ftl index c9d226f89..bfcdba4dd 100644 --- a/locales/fa/browser/browser/zen-split-view.ftl +++ b/locales/fa/browser/browser/zen-split-view.ftl @@ -5,8 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Split Tab (multiple selected tabs needed) - *[other] Split { $tabCount } Tabs + [1] Join Tab (multiple selected tabs needed) + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/fr/browser/browser/zen-general.ftl b/locales/fr/browser/browser/zen-general.ftl index ccb6cbd0b..51f0bc559 100644 --- a/locales/fr/browser/browser/zen-general.ftl +++ b/locales/fr/browser/browser/zen-general.ftl @@ -14,7 +14,7 @@ tab-context-zen-reset-pinned-tab = tab-context-zen-add-essential = .label = Ajouter aux Essentials .accesskey = E -tab-context-zen-add-essential-badge = { $num } / { $max } emplacements occupés +tab-context-zen-add-essential-badge = { $num } / { $max } tab-context-zen-remove-essential = .label = Retirer des Essentials .accesskey = R diff --git a/locales/ga-IE/browser/browser/zen-general.ftl b/locales/ga-IE/browser/browser/zen-general.ftl index 4bd0dd106..9b8963a6b 100644 --- a/locales/ga-IE/browser/browser/zen-general.ftl +++ b/locales/ga-IE/browser/browser/zen-general.ftl @@ -7,8 +7,8 @@ unified-extensions-description = Úsáidtear síntí chun níos mó feidhmiúlac tab-context-zen-reset-pinned-tab = .label = { $isEssential -> - [true] Athshocraigh an Cluaisín Riachtanach - *[false] Athshocraigh an Cluaisín Priontáilte + [true] Athshocraigh an Cluaisín Riachtanach + *[false] Athshocraigh an Cluaisín Priontáilte } .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] Cuir an URL Riachtanach in ionad an URL Reatha - *[false] Cuir an URL Priontáilte in ionad an URL Reatha + [true] Cuir an URL Riachtanach in ionad an URL Reatha + *[false] Cuir an URL Priontáilte in ionad an URL Reatha } .accesskey = C tab-context-zen-edit-title = diff --git a/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl b/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl index 7d73f6055..9e7631a79 100644 --- a/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl +++ b/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl @@ -38,7 +38,7 @@ tabbrowser-reset-pin-button = } zen-tab-sublabel = { $tabSubtitle -> - [zen-default-pinned] Ar ais go dtí an url bioráilte - [zen-default-pinned-cmd] Ar leithligh ón gcluaisín bioráilte - *[other] { $tabSubtitle } + [zen-default-pinned] Ar ais go dtí an url bioráilte + [zen-default-pinned-cmd] Ar leithligh ón gcluaisín bioráilte + *[other] { $tabSubtitle } } diff --git a/locales/id/browser/browser/preferences/zen-preferences.ftl b/locales/id/browser/browser/preferences/zen-preferences.ftl index 4939f5492..dd9b7c3c8 100644 --- a/locales/id/browser/browser/preferences/zen-preferences.ftl +++ b/locales/id/browser/browser/preferences/zen-preferences.ftl @@ -43,13 +43,13 @@ category-zen-workspaces = .tooltiptext = { pane-zen-tabs-title } pane-settings-workspaces-title = Ruang Kerja 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 = Saat menutup tab, beralih ke tab yang terakhir digunakan alih-alih tab berikutnya zen-tabs-close-on-back-with-no-history = - .label = Tutup tab dan beralih ke tab pemiliknya (atau tab yang terakhir digunakan) saat kembali tanpa riwayat + .label = Tutup tab dan beralih ke tab asal (atau terakhir digunakan) saat kembali tanpa riwayat zen-settings-workspaces-sync-unpinned-tabs = - .label = Sync only pinned tabs in workspaces + .label = (Window Sync) Hanya sinkronkan tab tersemat dalam ruang kerja zen-tabs-cycle-by-attribute = - .label = Ctrl+Tab berputar hanya dalam tab Esensial atau Ruang Kerja + .label = Ctrl+Tab hanya beralih di antara tab Esensial atau Ruang Kerja zen-tabs-cycle-ignore-pending-tabs = .label = Lewati tab tak termuat saat beralih dengan Ctrl+Tab zen-tabs-cycle-by-attribute-warning = Ctrl+Tab akan beralih berdasarkan urutan terakhir digunakan @@ -63,18 +63,18 @@ zen-pinned-tab-manager-description = Kelola perilaku tambahan dari tab yang dise zen-pinned-tab-manager-restore-pinned-tabs-to-pinned-url = .label = Pulihkan tab yang disematkan ke URL awal saat mulai ulang zen-pinned-tab-manager-container-specific-essentials-enabled = - .label = Aktifkan kontainer-spesifik essentials + .label = Aktifkan pemisahan esensial per kontainer zen-pinned-tab-manager-close-shortcut-behavior-label = Perilaku Pintasan Tutup Tab zen-pinned-tab-manager-reset-unload-switch-close-shortcut-option = - .label = Setel Ulang URL, lepaskan, dan beralih ke tab berikutnya + .label = Setel ulang URL, lepaskan, dan beralih ke tab berikutnya zen-pinned-tab-manager-unload-switch-close-shortcut-option = .label = Lepaskan dan beralih ke tab berikutnya zen-pinned-tab-manager-reset-switch-close-shortcut-option = - .label = Setel Ulang URL dan beralih ke tab berikutnya + .label = Setel ulang URL dan beralih ke tab berikutnya zen-pinned-tab-manager-switch-close-shortcut-option = .label = Beralih ke tab berikutnya zen-pinned-tab-manager-reset-close-shortcut-option = - .label = Setel Ulang URL + .label = Setel ulang URL zen-pinned-tab-manager-close-close-shortcut-option = .label = Tutup tab pane-zen-workspaces-header = Ruang Kerja @@ -137,7 +137,7 @@ pane-zen-marketplace-title = Zen Mods zen-themes-auto-update = .label = Otomatis perbarui mod yang terinstal saat startup zen-settings-workspaces-force-container-tabs-to-workspace = - .label = Saat membuka tab kontainer, otomatis pindahkan ke ruang kerja default kontainer tab itu + .label = Otomatis pindahkan tab kontainer ke ruang kerja defaultnya saat dibuka zen-theme-marketplace-link = Kunjungi Toko zen-dark-theme-styles-header = Gaya Tema Gelap zen-dark-theme-styles-description = Mengkustomisasi mode gelap sesuai kemauanmu @@ -189,7 +189,7 @@ zen-tab-new-shortcut = Tab Baru zen-key-redo = Ulangi zen-restore-last-closed-tab-shortcut = Pulihkan Tab yang Terakhir Ditutup zen-location-open-shortcut = Buka Lokasi -zen-location-open-shortcut-alt = Buka Lokasi +zen-location-open-shortcut-alt = Buka Lokasi (Alt) zen-key-undo-close-window = Batalkan Tutup Jendela zen-text-action-undo-shortcut = Batalkan zen-text-action-redo-shortcut = Ulangi @@ -246,7 +246,7 @@ zen-search-find-again-shortcut = Temukan Lagi zen-search-find-again-shortcut-prev = Cari Sebelumnya zen-search-find-again-shortcut-2 = Cari Lagi (Alt) zen-bookmark-this-page-shortcut = Markahi Laman Ini -zen-bookmark-show-library-shortcut = Tampilkan Pustaka Bookmark +zen-bookmark-show-library-shortcut = Tampilkan Pustaka Markah zen-key-stop = Berhenti Memuat zen-full-zoom-reduce-shortcut = Perkecil zen-full-zoom-enlarge-shortcut = Perbesar diff --git a/locales/id/browser/browser/zen-general.ftl b/locales/id/browser/browser/zen-general.ftl index 0e5f6bfdc..e352fc1fd 100644 --- a/locales/id/browser/browser/zen-general.ftl +++ b/locales/id/browser/browser/zen-general.ftl @@ -3,26 +3,26 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. zen-panel-ui-current-profile-text = profil saat ini -unified-extensions-description = Ekstensi digunakan untuk menambahkan lebih banyak fungsi ekstra ke { -brand-short-name }. +unified-extensions-description = Ekstensi digunakan untuk menambahkan fungsi ekstra ke { -brand-short-name }. tab-context-zen-reset-pinned-tab = .label = { $isEssential -> - [true] Reset Essential Tab - *[false] Reset Pinned Tab + [true] Reset Tab Esensial ke URL awal + *[false] Reset Tab Sematan ke URL awal } .accesskey = R tab-context-zen-add-essential = - .label = Tambahkan ke Essentials + .label = Tambahkan ke Esensial .accesskey = E tab-context-zen-add-essential-badge = { $num } / { $max } slot terisi tab-context-zen-remove-essential = - .label = Hapus dari Essentials + .label = Hapus dari Esensial .accesskey = R tab-context-zen-replace-pinned-url-with-current = .label = { $isEssential -> - [true] Replace Essential URL with Current - *[false] Replace Pinned URL with Current + [true] Perbarui URL awal Tab Esensial + *[false] Perbarui URL awal Tab Sematan } .accesskey = C tab-context-zen-edit-title = @@ -41,7 +41,7 @@ pictureinpicture-minimize-btn = .tooltip = Minimalkan zen-panel-ui-gradient-generator-custom-color = Warna Kustom zen-copy-current-url-confirmation = URL Disalin! -zen-copy-current-url-as-markdown-confirmation = Copied current URL as Markdown! +zen-copy-current-url-as-markdown-confirmation = URL disalin sebagai Markdown! zen-general-cancel-label = .label = Batalkan zen-general-confirm = @@ -69,7 +69,7 @@ zen-site-data-settings = Pengaturan zen-generic-manage = Kelola zen-generic-more = Selengkapnya zen-generic-next = Lanjut -zen-essentials-promo-label = Tambahkan ke Essentials +zen-essentials-promo-label = Tambahkan ke Esensial zen-essentials-promo-sublabel = Akses tab favorit Anda hanya dengan sekali klik # These labels will be used for the site data panel settings zen-site-data-setting-allow = Diizinkan diff --git a/locales/id/browser/browser/zen-menubar.ftl b/locales/id/browser/browser/zen-menubar.ftl index 1b91dd1ab..3045694cf 100644 --- a/locales/id/browser/browser/zen-menubar.ftl +++ b/locales/id/browser/browser/zen-menubar.ftl @@ -19,4 +19,4 @@ zen-menubar-appearance-light = zen-menubar-appearance-dark = .label = Gelap zen-menubar-new-blank-window = - .label = New Blank Window + .label = Jendela Kosong Baru diff --git a/locales/id/browser/browser/zen-vertical-tabs.ftl b/locales/id/browser/browser/zen-vertical-tabs.ftl index edb8c6381..369fdb910 100644 --- a/locales/id/browser/browser/zen-vertical-tabs.ftl +++ b/locales/id/browser/browser/zen-vertical-tabs.ftl @@ -38,7 +38,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] Kembali ke URL Awal + [zen-default-pinned-cmd] Pisahkan dari tab tersemat *[other] { $tabSubtitle } } diff --git a/locales/id/browser/browser/zen-welcome.ftl b/locales/id/browser/browser/zen-welcome.ftl index 8cebcb240..4bfb2798e 100644 --- a/locales/id/browser/browser/zen-welcome.ftl +++ b/locales/id/browser/browser/zen-welcome.ftl @@ -3,23 +3,23 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. zen-welcome-title-line1 = Selamat datang di -zen-welcome-title-line2 = internet yang tenang +zen-welcome-title-line2 = internet yang lebih tenang zen-welcome-import-title = Permulaan baru, Bookmark tetap sama zen-welcome-import-description-1 = Bookmark, histori dan password anda adalah Jejak remah roti yang anda tinggalkan di internet--jangan tinggalkan begitu saja! zen-welcome-import-description-2 = Semudah mengambil dari peramban lain dan melanjutkan dari yang anda tinggalkan. zen-welcome-import-button = Impor sekarang -zen-welcome-set-default-browser = Atur { -brand-short-name } sebagai peramban bawaan -zen-welcome-dont-set-default-browser = Jangan membuat { -brand-short-name } sebagai peramban bawaan -zen-welcome-initial-essentials-title = Tab penting anda, akan selalu dalam genggaman -zen-welcome-initial-essentials-description-1 = Simpan tab penting anda mudah diakses dan berada dalam jangkauan anda, seberapapun anda membukanya. -zen-welcome-initial-essentials-description-2 = Tab penting selalu terlihat, dimanapun tempat kerja anda. -zen-welcome-workspace-colors-title = Ruang Kerja anda, Warna anda +zen-welcome-set-default-browser = Jadikan { -brand-short-name } sebagai peramban baku +zen-welcome-dont-set-default-browser = Jangan jadikan { -brand-short-name } sebagai peramban baku +zen-welcome-initial-essentials-title = Tab Penting Anda, Selalu dalam Jangkauan +zen-welcome-initial-essentials-description-1 = Pastikan tab terpenting Anda mudah diakses dan selalu tersedia, berapa pun jumlah tab yang Anda buka. +zen-welcome-initial-essentials-description-2 = Tab esensial selalu terlihat, di ruang kerja mana pun Anda berada. +zen-welcome-workspace-colors-title = Ruang Kerja Anda, Warna Anda zen-welcome-workspace-colors-description = Atur peramban anda dengan memberikan warna tersendiri tiap ruang kerja. zen-welcome-start-browsing-title = Semua Pengaturan selesai?
Mari mulai menjelajah! zen-welcome-start-browsing-description-1 = Anda selesai melakukan pengaturan dan siap untuk mulai. Klik tombol di bawah ini untuk mulai menjelajah dengan { -brand-short-name }. -zen-welcome-start-browsing = Penyelaman dimulai! +zen-welcome-start-browsing = Ayo, mulai! zen-welcome-default-search-title = Mesin Pencari Default Anda zen-welcome-default-search-description = Pilih mesin pencari default Anda. Anda selalu dapat mengubahnya nanti! zen-welcome-skip-button = Lewati diff --git a/locales/id/browser/browser/zen-workspaces.ftl b/locales/id/browser/browser/zen-workspaces.ftl index 138955863..abc634e71 100644 --- a/locales/id/browser/browser/zen-workspaces.ftl +++ b/locales/id/browser/browser/zen-workspaces.ftl @@ -25,7 +25,7 @@ zen-workspaces-panel-context-default-profile = zen-workspaces-panel-unload = .label = Lepaskan Ruang zen-workspaces-panel-unload-others = - .label = Unload All Other Spaces + .label = Lepaskan Ruang Lainnya zen-workspaces-how-to-reorder-title = Cara Mengurutkan Ulang Ruang zen-workspaces-how-to-reorder-desc = Seret ikon ruang di bagian bawah bilah sisi untuk menyusun ulang urutannya zen-workspaces-change-theme = @@ -61,7 +61,7 @@ zen-workspace-creation-profile = Profil .tooltiptext = Profil (Kontainer) digunakan untuk memisahkan cookie dan data situs antar Ruang. zen-workspace-creation-header = Buat sebuah Ruang zen-workspace-creation-label = Ruang digunakan untuk mengorganisasikan tab dan sesi Anda. -zen-workspaces-delete-workspace-title = Delete Workspace? +zen-workspaces-delete-workspace-title = Hapus Ruang? zen-workspaces-delete-workspace-body = Apakah Anda yakin ingin menghapus { $name }? Tindakan ini tidak bisa dibatalkan. # Note that the html tag MUST not be changed or removed, as it is used to better # display the shortcut in the toast notification. diff --git a/locales/is/browser/browser/zen-general.ftl b/locales/is/browser/browser/zen-general.ftl index 5b5bc95f4..fa7468dbc 100644 --- a/locales/is/browser/browser/zen-general.ftl +++ b/locales/is/browser/browser/zen-general.ftl @@ -14,7 +14,7 @@ tab-context-zen-reset-pinned-tab = tab-context-zen-add-essential = .label = Bæta við þarfaflipa .accesskey = F -tab-context-zen-add-essential-badge = { $num } / { $max } hólf fyllt +tab-context-zen-add-essential-badge = { $num } / { $max } tab-context-zen-remove-essential = .label = Fjarlægja úr þarfaflipum .accesskey = R diff --git a/locales/it/browser/browser/zen-split-view.ftl b/locales/it/browser/browser/zen-split-view.ftl index e0958b3ce..31a8ad7a5 100644 --- a/locales/it/browser/browser/zen-split-view.ftl +++ b/locales/it/browser/browser/zen-split-view.ftl @@ -6,7 +6,7 @@ tab-zen-split-tabs = .label = { $tabCount -> [1] Split Tab (sono necessarie più schede selezionate) - *[other] Split { $tabCount } Tabs + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/ja/browser/browser/preferences/zen-preferences.ftl b/locales/ja/browser/browser/preferences/zen-preferences.ftl index a3cba696b..33aa65fc3 100644 --- a/locales/ja/browser/browser/preferences/zen-preferences.ftl +++ b/locales/ja/browser/browser/preferences/zen-preferences.ftl @@ -5,7 +5,7 @@ pane-zen-looks-title = 外観 category-zen-looks = .tooltiptext = { pane-zen-looks-title }{ pane-zen-looks-title } -zen-warning-language = デフォルト言語を変更すると、ウェブサイトがあなたにトラッキングしやすいです。 +zen-warning-language = デフォルト言語を変更すると、ウェブサイトにトラッキングされやすくなります。 zen-vertical-tabs-layout-header = ブラウザーのレイアウト zen-vertical-tabs-layout-description = 自分に合ったレイアウトを選んでください zen-layout-single-toolbar = サイドバーのみ @@ -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 = @@ -57,11 +57,11 @@ zen-look-and-feel-compact-toolbar-themed = .label = コンパクトツールバーにテーマの背景を使用する zen-workspace-continue-where-left-off = .label = 中断したところから再開する -pane-zen-pinned-tab-manager-title = 固定したタブ -zen-pinned-tab-manager-header = 固定したタブの一般的な設定 -zen-pinned-tab-manager-description = 固定したタブの追加的な動作を管理する +pane-zen-pinned-tab-manager-title = ピン留めされたタブ +zen-pinned-tab-manager-header = ピン留めされたタブの設定 +zen-pinned-tab-manager-description = ピン留めされたタブの追加的な動作を管理する zen-pinned-tab-manager-restore-pinned-tabs-to-pinned-url = - .label = 固定したタブを起動時に元の固定したURLに復元します + .label = ピン留めされたタブを起動時に元のピン留めされた URL に復元します zen-pinned-tab-manager-container-specific-essentials-enabled = .label = コンテナ固有のEssentialsを有効にする zen-pinned-tab-manager-close-shortcut-behavior-label = タブを閉じるショートカットの動作 @@ -79,7 +79,7 @@ zen-pinned-tab-manager-close-close-shortcut-option = .label = タブを閉じる pane-zen-workspaces-header = ワークスペース zen-settings-workspaces-header = ワークスペースの一般的な設定 -zen-settings-workspaces-description = ワークスペースを使用すると、一度に複数のブラウジングセッションがあるといいです! +zen-settings-workspaces-description = ワークスペースを使用すると、同時に複数のブラウジングセッションを行うことができます! zen-settings-workspaces-enabled = .label = ワークスペースを有効にする zen-settings-workspaces-hide-default-container-indicator = @@ -279,8 +279,8 @@ zen-workspace-shortcut-switch-7 = ワークスペース7に切り替える zen-workspace-shortcut-switch-8 = ワークスペース8に切り替える zen-workspace-shortcut-switch-9 = ワークスペース9に切り替える zen-workspace-shortcut-switch-10 = ワークスペース10に切り替える -zen-workspace-shortcut-forward = ワークスペースを転送 -zen-workspace-shortcut-backward = 後方ワークスペース +zen-workspace-shortcut-forward = 次のワークスペースに移動 +zen-workspace-shortcut-backward = 前のワークスペースへ移動 zen-sidebar-shortcut-toggle = サイドバーの幅を切り替える zen-pinned-tab-shortcut-reset = ピン留めされたタブをピン留めしたURLにリセット zen-split-view-shortcut-grid = 分割表示グリッドの切り替え diff --git a/locales/ja/browser/browser/zen-general.ftl b/locales/ja/browser/browser/zen-general.ftl index 85b35e249..7f272d724 100644 --- a/locales/ja/browser/browser/zen-general.ftl +++ b/locales/ja/browser/browser/zen-general.ftl @@ -7,8 +7,8 @@ unified-extensions-description = 拡張機能は{ -brand-short-name }に多く tab-context-zen-reset-pinned-tab = .label = { $isEssential -> - [true] Reset Essential Tab - *[false] Reset Pinned Tab + [true] Essentialタブの遷移をリセット + *[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] EssentialタブのURLを今開いているURLで置き換える + *[false] ピン留めされたタブのURLを今開いているURLで置き換える } .accesskey = C tab-context-zen-edit-title = @@ -41,13 +41,13 @@ 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 = URLをMarkdownとしてコピーしました! zen-general-cancel-label = .label = キャンセル zen-general-confirm = .label = 確定 zen-pinned-tab-replaced = 固定したタブのURLが現在のURLに置き換えられました! -zen-tabs-renamed = タグの名前は無事に変更されました! +zen-tabs-renamed = タブの名前は無事に変更されました! zen-background-tab-opened-toast = 新しい背景タブが開きました! zen-workspace-renamed-toast = ワークスペースの名前が変更されました! zen-toggle-compact-mode-button = diff --git a/locales/ja/browser/browser/zen-vertical-tabs.ftl b/locales/ja/browser/browser/zen-vertical-tabs.ftl index d6fcad712..c759ab05d 100644 --- a/locales/ja/browser/browser/zen-vertical-tabs.ftl +++ b/locales/ja/browser/browser/zen-vertical-tabs.ftl @@ -33,12 +33,12 @@ tabbrowser-unload-tab-button = tabbrowser-reset-pin-button = .tooltiptext = { $tabCount -> - [one] タブをリセットして固定する - *[other] タブをリセットして{ $tabCount }つタブを固定する + [one] タブをリセットしてピン留め + *[other] タブをリセットして{ $tabCount }つのタブをピン留め } zen-tab-sublabel = { $tabSubtitle -> - [zen-default-pinned] Back to pinned url - [zen-default-pinned-cmd] Separate from pinned tab + [zen-default-pinned] ピン止めされた URL に戻る + [zen-default-pinned-cmd] ピン止めされたタブから切り離す *[other] { $tabSubtitle } } diff --git a/locales/ja/browser/browser/zen-workspaces.ftl b/locales/ja/browser/browser/zen-workspaces.ftl index 3310fe1e0..5af1417c3 100644 --- a/locales/ja/browser/browser/zen-workspaces.ftl +++ b/locales/ja/browser/browser/zen-workspaces.ftl @@ -2,7 +2,7 @@ # 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-workspaces-text = スペース +zen-panel-ui-workspaces-text = ワークスペース zen-panel-ui-spaces-label = .label = スペース zen-panel-ui-workspaces-create = @@ -25,7 +25,7 @@ zen-workspaces-panel-context-default-profile = zen-workspaces-panel-unload = .label = スペースをアンロードする zen-workspaces-panel-unload-others = - .label = Unload All Other Spaces + .label = 他のスペースをアンロードする zen-workspaces-how-to-reorder-title = 並べ替える方法 zen-workspaces-how-to-reorder-desc = サイドバーの下部にあるスペースアイコンをドラッグして並べ替えます zen-workspaces-change-theme = @@ -68,7 +68,7 @@ zen-workspaces-delete-workspace-body = { $name }を削除してもよろしい zen-workspaces-close-all-unpinned-tabs-toast = タブを閉じました!元に戻すには、 { $shortcut }を使用してください。 zen-workspaces-close-all-unpinned-tabs-title = .label = 削除する - .tooltiptext = すべての固定しなかったタブを閉じる + .tooltiptext = すべてのピン留めされていないタブを閉じる zen-panel-ui-workspaces-change-forward = .label = 次のスペースに移動 zen-panel-ui-workspaces-change-back = diff --git a/locales/nb/browser/browser/zen-general.ftl b/locales/nb/browser/browser/zen-general.ftl index 16e27e1d2..6255689e7 100644 --- a/locales/nb/browser/browser/zen-general.ftl +++ b/locales/nb/browser/browser/zen-general.ftl @@ -14,7 +14,7 @@ tab-context-zen-reset-pinned-tab = tab-context-zen-add-essential = .label = Legg til i essensielle .accesskey = E -tab-context-zen-add-essential-badge = { $num } / { $max } felt utfylt +tab-context-zen-add-essential-badge = { $num } / { $max } tab-context-zen-remove-essential = .label = Fjern fra essensielle .accesskey = R diff --git a/locales/nn-NO/browser/browser/zen-split-view.ftl b/locales/nn-NO/browser/browser/zen-split-view.ftl index 10593eed9..743688eed 100644 --- a/locales/nn-NO/browser/browser/zen-split-view.ftl +++ b/locales/nn-NO/browser/browser/zen-split-view.ftl @@ -5,8 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Split Tab (multiple selected tabs needed) - *[other] Split { $tabCount } Tabs + [1] Join Tab (multiple selected tabs needed) + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/pl/browser/browser/preferences/zen-preferences.ftl b/locales/pl/browser/browser/preferences/zen-preferences.ftl index 1fd35037c..cb32bb957 100644 --- a/locales/pl/browser/browser/preferences/zen-preferences.ftl +++ b/locales/pl/browser/browser/preferences/zen-preferences.ftl @@ -5,9 +5,9 @@ pane-zen-looks-title = Wygląd i działanie category-zen-looks = .tooltiptext = { pane-zen-looks-title } -zen-warning-language = Zmiana domyślnego języka może ułatwić śledzenie stron internetowych. -zen-vertical-tabs-layout-header = Wygląd przeglądarki -zen-vertical-tabs-layout-description = Wybierz wygląd, który pasuje Ci najbardziej +zen-warning-language = Zmiana domyślnego języka może ułatwić stronom internetowym śledzenie Twojej aktywności. +zen-vertical-tabs-layout-header = Układ przeglądarki +zen-vertical-tabs-layout-description = Wybierz układ, który najbardziej Ci odpowiada zen-layout-single-toolbar = Tylko pasek boczny zen-layout-multiple-toolbar = Pasek boczny i górny pasek narzędzi zen-layout-collapsed-toolbar = Zwinięty pasek boczny @@ -43,15 +43,15 @@ category-zen-workspaces = .tooltiptext = { pane-zen-tabs-title } pane-settings-workspaces-title = Obszary robocze zen-tabs-select-recently-used-on-close = - .label = Podczas zamykania karty, przejdź do ostatnio używanej karty zamiast do następnej karty + .label = Podczas zamykania karty, przełącz na ostatnio używaną kartę zamiast na następną kartę zen-tabs-close-on-back-with-no-history = - .label = Zamknij kartę i przejdź do karty głównej (lub ostatnio używanej karty) podczas powrotu bez historii + .label = Zamknij kartę i przełącz na kartę nadrzędną (lub ostatnio używaną kartę) podczas cofania bez historii zen-settings-workspaces-sync-unpinned-tabs = .label = Zsynchronizuj tylko przypięte karty w obszarach roboczych zen-tabs-cycle-by-attribute = .label = Ctrl+Tab przełącza tylko między kartami niezbędnymi lub kartami obszaru roboczego zen-tabs-cycle-ignore-pending-tabs = - .label = Ignoruj oczekujące karty podczas przełączania między kartami z Ctrl+Tab + .label = Ignoruj oczekujące karty podczas przełączania się za pomocą skrótu Ctrl+Tab zen-tabs-cycle-by-attribute-warning = Ctrl+Tab będzie przełączał karty według ostatnio używanej kolejności, ponieważ jest włączona zen-look-and-feel-compact-toolbar-themed = .label = Użyj tła motywu dla kompaktowego paska narzędzi @@ -61,18 +61,18 @@ pane-zen-pinned-tab-manager-title = Przypięte karty zen-pinned-tab-manager-header = Ogólne ustawienia przypiętych kart zen-pinned-tab-manager-description = Zarządzaj dodatkowym zachowaniem przypiętych kart zen-pinned-tab-manager-restore-pinned-tabs-to-pinned-url = - .label = Przywróć przypięte karty do pierwotnie przypiętego adresu URL przy starcie + .label = Przywróć przypięte karty do ich pierwotnych adresów URL podczas uruchamiania zen-pinned-tab-manager-container-specific-essentials-enabled = - .label = Włącz podstawowe funkcje specyficzne dla kontenera + .label = Włącz niezbędne karty specyficzne dla kontenerów zen-pinned-tab-manager-close-shortcut-behavior-label = Zachowanie skrótu zamykania karty zen-pinned-tab-manager-reset-unload-switch-close-shortcut-option = - .label = Zresetuj adres URL, wyładuj i przejdź do następnej karty + .label = Zresetuj adres URL, wyładuj i przełącz na następną kartę zen-pinned-tab-manager-unload-switch-close-shortcut-option = - .label = Wyładuj i przejdź do następnej karty + .label = Wyładuj i przełącz na następną kartę zen-pinned-tab-manager-reset-switch-close-shortcut-option = - .label = Zresetuj adres URL i przejdź do następnej karty + .label = Zresetuj adres URL i przełącz na następną kartę zen-pinned-tab-manager-switch-close-shortcut-option = - .label = Przejdź do następnej karty + .label = Przełącz na następną kartę zen-pinned-tab-manager-reset-close-shortcut-option = .label = Zresetuj adres URL zen-pinned-tab-manager-close-close-shortcut-option = @@ -100,7 +100,7 @@ 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-header = Jak rozwinąć karty -zen-vertical-tabs-expand-tabs-description = Wybierz jak rozwinąć karty na pasku bocznym +zen-vertical-tabs-expand-tabs-description = Wybierz sposób rozwijania kart na pasku bocznym zen-theme-marketplace-header = Modyfikacje Zen zen-theme-disable-all-enabled = .title = Wyłącz wszystkie modyfikacje @@ -137,7 +137,7 @@ pane-zen-marketplace-title = Modyfikacje Zen zen-themes-auto-update = .label = Automatycznie aktualizuj zainstalowane modyfikacje podczas startu przeglądarki zen-settings-workspaces-force-container-tabs-to-workspace = - .label = Przełącz się do obszaru roboczego, w którym kontener jest ustawiony jako domyślny podczas otwierania kart kontenera + .label = Przełącz na obszar roboczy, w którym kontener jest ustawiony jako domyślny podczas otwierania kart kontenera zen-theme-marketplace-link = Odwiedź sklep zen-dark-theme-styles-header = Style ciemnego motywu zen-dark-theme-styles-description = Dostosuj ciemny motyw do swoich upodobań @@ -154,9 +154,9 @@ zen-urlbar-behavior-label = Zachowanie zen-urlbar-behavior-normal = .label = Normalne zen-urlbar-behavior-floating-on-type = - .label = Widoczny podczas pisania + .label = Pływający tylko podczas pisania zen-urlbar-behavior-float = - .label = Zawsze widoczny + .label = Zawsze pływający pane-zen-CKS-title = Skróty klawiaturowe category-zen-CKS = .tooltiptext = { pane-zen-CKS-title } @@ -166,7 +166,7 @@ category-zen-marketplace = zen-settings-CKS-header = Dostosuj skróty klawiaturowe zen-settings-CKS-description = Zmień domyślne skróty klawiaturowe zgodnie z własnymi preferencjami i popraw komfort przeglądania stron internetowych zen-settings-CKS-disable-firefox = - .label = Wyłącz domyślne skróty klawiszowe { -brand-short-name } + .label = Wyłącz domyślne skróty klawiaturowe { -brand-short-name } zen-settings-CKS-duplicate-shortcut = .label = Duplikuj skrót zen-settings-CKS-reset-shortcuts = @@ -182,7 +182,7 @@ zenCKSOption-group-zen-compact-mode = Tryb kompaktowy zenCKSOption-group-zen-workspace = Obszary robocze zenCKSOption-group-zen-other = Inne funkcje Zen zenCKSOption-group-zen-split-view = Podziel widok -zenCKSOption-group-devTools = Narzędzia developerskie +zenCKSOption-group-devTools = Narzędzia deweloperskie zen-key-quick-restart = Szybkie ponowne uruchomienie zen-window-new-shortcut = Nowe okno zen-tab-new-shortcut = Nowa karta @@ -214,7 +214,7 @@ zen-help-shortcut = Otwórz pomoc zen-preferences-shortcut = Otwórz ustawienia zen-hide-app-shortcut = Ukryj aplikację zen-hide-other-apps-shortcut = Ukryj inne aplikacje -zen-search-focus-shortcut = Szukaj w centrum uwagi +zen-search-focus-shortcut = Przejdź do wyszukiwania zen-search-focus-shortcut-alt = Przejdź do wyszukiwania (Alt) zen-downloads-shortcut = Otwórz pobieranie zen-addons-shortcut = Otwórz dodatki @@ -223,7 +223,7 @@ zen-save-page-shortcut = Zapisz stronę zen-print-shortcut = Wydrukuj stronę zen-close-shortcut-2 = Zamknij kartę zen-mute-toggle-shortcut = Przełącz wyciszenie -zen-key-delete = Usuń klucz +zen-key-delete = Klawisz Delete zen-key-go-back = Powrót zen-key-go-forward = Przejdź do przodu zen-nav-back-shortcut-alt = Nawiguj wstecz (Alt) @@ -281,13 +281,13 @@ zen-workspace-shortcut-switch-9 = Przełącz na obszar roboczy 9 zen-workspace-shortcut-switch-10 = Przełącz na obszar roboczy 10 zen-workspace-shortcut-forward = Następny obszar roboczy zen-workspace-shortcut-backward = Poprzedni obszar roboczy -zen-sidebar-shortcut-toggle = Przełącz szerokość paska bocznego -zen-pinned-tab-shortcut-reset = Zresetuj przypiętą kartę do przypiętego adresu URL -zen-split-view-shortcut-grid = Przełącz siatkę widoku dzielonego +zen-sidebar-shortcut-toggle = Przełącz szerokość panelu bocznego +zen-pinned-tab-shortcut-reset = Przywróć przypiętą kartę do przypiętego adresu URL +zen-split-view-shortcut-grid = Przełącz widok podziału na siatkę zen-split-view-shortcut-vertical = Przełącz podział ekranu w pionie zen-split-view-shortcut-horizontal = Przełącz podział ekranu w poziomie zen-split-view-shortcut-unsplit = Zamknij podział widoku -zen-new-empty-split-view-shortcut = Nowy pusty widok podziału +zen-new-empty-split-view-shortcut = Nowy pusty widok podzielony zen-key-select-tab-1 = Wybierz kartę #1 zen-key-select-tab-2 = Wybierz kartę #2 zen-key-select-tab-3 = Wybierz kartę #3 @@ -302,17 +302,17 @@ zen-key-goto-history = Przejdź do historii zen-key-go-home = Przejdź do strony głównej zen-bookmark-show-sidebar-shortcut = Pokaż pasek boczny zakładek zen-bookmark-show-toolbar-shortcut = Pokaż pasek zakładek -zen-devtools-toggle-shortcut = Włącz narzędzia developerskie +zen-devtools-toggle-shortcut = Przełącz narzędzia deweloperskie zen-devtools-toggle-browser-toolbox-shortcut = Włącz narzędzia przeglądarki zen-devtools-toggle-browser-console-shortcut = Włącz konsolę przeglądarki zen-devtools-toggle-responsive-design-mode-shortcut = Włącz tryb responsywny zen-devtools-toggle-inspector-shortcut = Włącz Inspektor -zen-devtools-toggle-web-console-shortcut = Włącz konsolę sieciową +zen-devtools-toggle-web-console-shortcut = Włącz konsolę zen-devtools-toggle-js-debugger-shortcut = Włącz debugger JavaScript zen-devtools-toggle-net-monitor-shortcut = Włącz monitor sieci zen-devtools-toggle-style-editor-shortcut = Włącz edytor stylów zen-devtools-toggle-performance-shortcut = Włącz Wydajność -zen-devtools-toggle-storage-shortcut = Włącz Pamięć +zen-devtools-toggle-storage-shortcut = Włącz Dane 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 diff --git a/locales/pl/browser/browser/zen-folders.ftl b/locales/pl/browser/browser/zen-folders.ftl index d684d1c58..214a529c3 100644 --- a/locales/pl/browser/browser/zen-folders.ftl +++ b/locales/pl/browser/browser/zen-folders.ftl @@ -9,13 +9,13 @@ zen-folders-panel-rename-folder = zen-folders-panel-unpack-folder = .label = Rozpakuj folder zen-folders-new-subfolder = - .label = Nowy folder + .label = Nowy podfolder zen-folders-panel-delete-folder = .label = Usuń folder zen-folders-panel-convert-folder-to-space = .label = Konwertuj folder na przestrzeń zen-folders-panel-change-folder-space = - .label = Zmień nazwę przestrzeni... + .label = Zmień przestrzeń... zen-folders-unload-all-tooltip = .tooltiptext = Wyładuj aktywne w tym folderze zen-folders-unload-folder = diff --git a/locales/pl/browser/browser/zen-general.ftl b/locales/pl/browser/browser/zen-general.ftl index 9dec64db3..43b723f1e 100644 --- a/locales/pl/browser/browser/zen-general.ftl +++ b/locales/pl/browser/browser/zen-general.ftl @@ -14,7 +14,7 @@ tab-context-zen-reset-pinned-tab = tab-context-zen-add-essential = .label = Dodaj do niezbędnych .accesskey = E -tab-context-zen-add-essential-badge = { $num } / { $max } zajętych miejsc +tab-context-zen-add-essential-badge = { $num } / { $max } tab-context-zen-remove-essential = .label = Usuń z niezbędnych .accesskey = R @@ -47,7 +47,7 @@ zen-general-cancel-label = zen-general-confirm = .label = Potwierdź zen-pinned-tab-replaced = URL przypiętej karty został zastąpiony bieżącym adresem! -zen-tabs-renamed = Nazwa karty została z powodzeniem zmieniona! +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-toggle-compact-mode-button = @@ -92,7 +92,7 @@ zen-site-data-site-settings = zen-site-data-header-share = .tooltiptext = Udostępnij tę stronę zen-site-data-header-reader-mode = - .tooltiptext = Wejdź do trybu czytnika + .tooltiptext = Przejdź do trybu czytania zen-site-data-header-screenshot = .tooltiptext = Zrzut ekranu zen-site-data-header-bookmark = @@ -119,7 +119,7 @@ zen-sidebar-notification-restart-safe-mode-label = Coś się zepsuło? zen-sidebar-notification-restart-safe-mode-tooltip = .title = Zrestartuj w trybie bezpiecznym zen-window-sync-migration-dialog-title = Utrzymuj synchronizację okien -zen-window-sync-migration-dialog-message = Zen synchronizuje okna na jednym urządzeniu, żeby zmiany w jednym oknie były natychmiast odzwierciedlone w pozostałych. +zen-window-sync-migration-dialog-message = Zen synchronizuje teraz okna na tym samym urządzeniu, dzięki czemu zmiany wprowadzone w jednym oknie są natychmiast odzwierciedlane w pozostałych. zen-window-sync-migration-dialog-learn-more = Dowiedz się więcej zen-window-sync-migration-dialog-accept = Rozumiem zen-appmenu-new-blank-window = diff --git a/locales/pl/browser/browser/zen-split-view.ftl b/locales/pl/browser/browser/zen-split-view.ftl index b04437a84..54b7f4722 100644 --- a/locales/pl/browser/browser/zen-split-view.ftl +++ b/locales/pl/browser/browser/zen-split-view.ftl @@ -5,13 +5,15 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Podziel zakładkę (potrzeba wielu wybranych kart) - *[other] Zakładki do podzielenia: { $tabCount } + [-1] Oddziel kartę + [1] Złącz kartę (wymagane jest zaznaczenie wielu kart) + [few] Złącz { $tabCount } karty + *[other] Złącz { $tabCount } kart } .accesskey = S zen-split-link = - .label = Podziel link na nową kartę + .label = Otwórz link w widoku podzielonym .accesskey = S -zen-split-view-modifier-header = Podziel widok +zen-split-view-modifier-header = Widok podzielony zen-split-view-modifier-activate-reallocation = .label = Aktywuj realokację diff --git a/locales/pl/browser/browser/zen-vertical-tabs.ftl b/locales/pl/browser/browser/zen-vertical-tabs.ftl index b4eb2a704..23c158b23 100644 --- a/locales/pl/browser/browser/zen-vertical-tabs.ftl +++ b/locales/pl/browser/browser/zen-vertical-tabs.ftl @@ -27,14 +27,16 @@ sidebar-zen-create-new = tabbrowser-unload-tab-button = .tooltiptext = { $tabCount -> - [one] Dezaktywuj i przełącz na kartę - *[other] Dezaktywuj { $tabCount } karty i przełącz na pierwszą + [one] Wyładuj i przełącz na kartę + [few] Wyładuj { $tabCount } karty i przełącz na pierwszą + *[other] Wyładuj { $tabCount } kart i przełącz na pierwszą } tabbrowser-reset-pin-button = .tooltiptext = { $tabCount -> [one] Zresetuj i przypnij kartę - *[other] Zresetuj i przypnij karty w liczbie: { $tabCount } + [few] Zresetuj i przypnij { $tabCount } karty + *[other] Zresetuj i przypnij { $tabCount } kart } zen-tab-sublabel = { $tabSubtitle -> diff --git a/locales/pl/browser/browser/zen-welcome.ftl b/locales/pl/browser/browser/zen-welcome.ftl index 41665e0c9..b3ec9ae53 100644 --- a/locales/pl/browser/browser/zen-welcome.ftl +++ b/locales/pl/browser/browser/zen-welcome.ftl @@ -10,7 +10,7 @@ zen-welcome-import-description-2 = Łatwo przenieś je z innej przeglądarki i k zen-welcome-import-button = Zaimportuj teraz zen-welcome-set-default-browser = Ustaw { -brand-short-name } jako swoją domyślną przeglądarkę zen-welcome-dont-set-default-browser = NIE ustawiaj { -brand-short-name } jako swoja domyślna przeglądarka -zen-welcome-initial-essentials-title = Twoje kluczowe karty, zawsze w zasięgu +zen-welcome-initial-essentials-title = Twoje kluczowe karty, zawsze pod ręką zen-welcome-initial-essentials-description-1 = Utrzymuj swoje najważniejsze karty zawsze pod ręką, niezależnie od tego, jak wiele masz ich otwartych. zen-welcome-initial-essentials-description-2 = Niezbędne karty są zawsze widoczne, niezależnie od bieżącego obszaru roboczego. zen-welcome-workspace-colors-title = Twój obszar roboczy, Twoje kolory diff --git a/locales/pt-BR/browser/browser/zen-split-view.ftl b/locales/pt-BR/browser/browser/zen-split-view.ftl index 4d80e0a41..83351cef1 100644 --- a/locales/pt-BR/browser/browser/zen-split-view.ftl +++ b/locales/pt-BR/browser/browser/zen-split-view.ftl @@ -5,8 +5,9 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Dividir aba (é necessário várias abas selecionadas) - *[other] Dividir { $tabCount } Abas + [-1] Dividir aba + [1] Juntar Aba (necessário várias abas selecionadas) + *[other] Juntar { $tabCount } Abas } .accesskey = S.O. zen-split-link = diff --git a/locales/ro/browser/browser/zen-split-view.ftl b/locales/ro/browser/browser/zen-split-view.ftl index 10593eed9..743688eed 100644 --- a/locales/ro/browser/browser/zen-split-view.ftl +++ b/locales/ro/browser/browser/zen-split-view.ftl @@ -5,8 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Split Tab (multiple selected tabs needed) - *[other] Split { $tabCount } Tabs + [1] Join Tab (multiple selected tabs needed) + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/sk/browser/browser/zen-split-view.ftl b/locales/sk/browser/browser/zen-split-view.ftl index fb145b79e..3c7f07d8b 100644 --- a/locales/sk/browser/browser/zen-split-view.ftl +++ b/locales/sk/browser/browser/zen-split-view.ftl @@ -5,8 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Split Tab (multiple selected tabs needed) - *[other] Split { $tabCount } Tabs + [1] Join Tab (multiple selected tabs needed) + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/sv-SE/browser/browser/zen-split-view.ftl b/locales/sv-SE/browser/browser/zen-split-view.ftl index cf628496c..9a2208714 100644 --- a/locales/sv-SE/browser/browser/zen-split-view.ftl +++ b/locales/sv-SE/browser/browser/zen-split-view.ftl @@ -5,6 +5,7 @@ tab-zen-split-tabs = .label = { $tabCount -> + [-1] Avdela flikar [1] Delad flik (flera valda flikar behövs) *[other] Delad { $tabCount } flikar } diff --git a/locales/th/browser/browser/zen-split-view.ftl b/locales/th/browser/browser/zen-split-view.ftl index 10593eed9..743688eed 100644 --- a/locales/th/browser/browser/zen-split-view.ftl +++ b/locales/th/browser/browser/zen-split-view.ftl @@ -5,8 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Split Tab (multiple selected tabs needed) - *[other] Split { $tabCount } Tabs + [1] Join Tab (multiple selected tabs needed) + *[other] Join { $tabCount } Tabs } .accesskey = S zen-split-link = diff --git a/locales/tr/browser/browser/preferences/zen-preferences.ftl b/locales/tr/browser/browser/preferences/zen-preferences.ftl index 4a8a122c9..591473b78 100644 --- a/locales/tr/browser/browser/preferences/zen-preferences.ftl +++ b/locales/tr/browser/browser/preferences/zen-preferences.ftl @@ -8,9 +8,9 @@ category-zen-looks = zen-warning-language = Varsayılan dili değiştirmek, Websitesinin sizi izlemesini kolaylaştırabilir. zen-vertical-tabs-layout-header = Tarayıcı Düzeni zen-vertical-tabs-layout-description = Size en uygun düzeni seçin -zen-layout-single-toolbar = Tek Araç Çubuğu +zen-layout-single-toolbar = Sadece kenar çubuğu zen-layout-multiple-toolbar = Kenar çubuğu ve üst araç çubuğu -zen-layout-collapsed-toolbar = Daraltılmış Araç Çubuğu +zen-layout-collapsed-toolbar = Daraltılmış kenar çubuğu sync-currently-syncing-workspaces = Çalışma alanları sync-engine-workspaces = .label = Çalışma alanları @@ -64,7 +64,7 @@ zen-pinned-tab-manager-restore-pinned-tabs-to-pinned-url = .label = Sabitlenmiş sekmelerin URL'lerini tarayıcı açılışında orjinaline döndür zen-pinned-tab-manager-container-specific-essentials-enabled = .label = Kapsayıcıya özgü temel sekmeleri etkinleştir -zen-pinned-tab-manager-close-shortcut-behavior-label = Sekmeyi Kapatma Kısayolu Davranışı +zen-pinned-tab-manager-close-shortcut-behavior-label = Sekme kapatma kısayolu davranışı zen-pinned-tab-manager-reset-unload-switch-close-shortcut-option = .label = URL'yi sıfırla, yüklemesini kaldır ve sonraki sekmeye geç zen-pinned-tab-manager-unload-switch-close-shortcut-option = @@ -78,7 +78,7 @@ zen-pinned-tab-manager-reset-close-shortcut-option = zen-pinned-tab-manager-close-close-shortcut-option = .label = Sekmeyi kapat pane-zen-workspaces-header = Çalışma Alanları -zen-settings-workspaces-header = Çalışma alanları için genel ayarlar +zen-settings-workspaces-header = Çalışma Alanları Genel Ayarları zen-settings-workspaces-description = Çalışma alanları sayesinde birden fazla göz atma oturumuna aynı anda sahip olabilirsin! zen-settings-workspaces-enabled = .label = Çalışma alanlarını aktif et @@ -175,23 +175,23 @@ zenCKSOption-group-other = Diğer zenCKSOption-group-windowAndTabManagement = Pencere ve Sekme Yönetimi zenCKSOption-group-navigation = Navigasyon zenCKSOption-group-searchAndFind = Ara ve Bul -zenCKSOption-group-pageOperations = Sayfa Eylemleri +zenCKSOption-group-pageOperations = Sayfa İşlemleri zenCKSOption-group-historyAndBookmarks = Geçmiş ve Yer İmleri zenCKSOption-group-mediaAndDisplay = Medya ve Görüntü zenCKSOption-group-zen-compact-mode = Kompakt Mod zenCKSOption-group-zen-workspace = Çalışma Alanları zenCKSOption-group-zen-other = Diğer Zen Özellikleri -zenCKSOption-group-zen-split-view = Bölmeli Görünüm +zenCKSOption-group-zen-split-view = Bölünmüş Görünüm zenCKSOption-group-devTools = Geliştirici Araçları -zen-key-quick-restart = Hızlı Yeniden Başlatma -zen-window-new-shortcut = Yeni Pencere -zen-tab-new-shortcut = Yeni Sekme -zen-key-redo = Geri Al +zen-key-quick-restart = Hızlı yeniden başlat +zen-window-new-shortcut = Yeni pencere aç +zen-tab-new-shortcut = Yeni sekme aç +zen-key-redo = Yinele zen-restore-last-closed-tab-shortcut = Son kapatılan sekmeyi geri aç zen-location-open-shortcut = Dizini aç zen-location-open-shortcut-alt = Dizini aç (Alt) zen-key-undo-close-window = Kapatılan pencereyi geri al -zen-text-action-undo-shortcut = Geri Al +zen-text-action-undo-shortcut = Geri al zen-text-action-redo-shortcut = Yinele zen-text-action-cut-shortcut = Kes zen-text-action-copy-shortcut = Kopyala @@ -233,9 +233,9 @@ zen-key-enter-full-screen = Tam ekrana gir zen-key-exit-full-screen = Tam ekrandan çık zen-ai-chatbot-sidebar-shortcut = Yapay zeka sohbet kenar çubuğunu aç/kapat zen-key-inspector-mac = Denetleyi aç/kapat (Mac) -zen-toggle-sidebar-shortcut = Firefox kenar çubuğunu aktif et +zen-toggle-sidebar-shortcut = Firefox kenar çubuğunu aç/kapat zen-toggle-pin-tab-shortcut = Sekme sabitlemeyi aç/kapat -zen-reader-mode-toggle-shortcut-other = Okuma modunu aktif et +zen-reader-mode-toggle-shortcut-other = Okuma modunu aç/kapat zen-picture-in-picture-toggle-shortcut = Görsel içinde görseli (PiP) aç/kapat zen-nav-reload-shortcut-2 = Sayfayı yenile zen-key-about-processes = İşlemler Hakkında @@ -269,41 +269,41 @@ zen-compact-mode-shortcut-show-sidebar = Kayan kenar çubuğunu aç/kapat zen-compact-mode-shortcut-show-toolbar = Kayan alet çubuğunu aç/kapat zen-compact-mode-shortcut-toggle = Kompakt modu aktifleştir zen-glance-expand = Hızlı bakışı genişlet -zen-workspace-shortcut-switch-1 = 1. Çalışma Alanına Geç -zen-workspace-shortcut-switch-2 = 2. Çalışma Alanına Geç -zen-workspace-shortcut-switch-3 = 3. Çalışma Alanına Geç -zen-workspace-shortcut-switch-4 = 4. Çalışma Alanına Geç -zen-workspace-shortcut-switch-5 = 5. Çalışma Alanına Geç -zen-workspace-shortcut-switch-6 = 6. Çalışma Alanına Geç -zen-workspace-shortcut-switch-7 = 7. Çalışma Alanına Geç -zen-workspace-shortcut-switch-8 = 8. Çalışma Alanına Geç -zen-workspace-shortcut-switch-9 = 9. Çalışma Alanına Geç -zen-workspace-shortcut-switch-10 = 10. Çalışma Alanına Geç +zen-workspace-shortcut-switch-1 = 1. çalışma alanına geç +zen-workspace-shortcut-switch-2 = 2. çalışma alanına geç +zen-workspace-shortcut-switch-3 = 3. çalışma alanına geç +zen-workspace-shortcut-switch-4 = 4. çalışma alanına geç +zen-workspace-shortcut-switch-5 = 5. çalışma alanına geç +zen-workspace-shortcut-switch-6 = 6. çalışma alanına geç +zen-workspace-shortcut-switch-7 = 7. çalışma alanına geç +zen-workspace-shortcut-switch-8 = 8. çalışma alanına geç +zen-workspace-shortcut-switch-9 = 9. çalışma alanına geç +zen-workspace-shortcut-switch-10 = 10. çalışma alanına geç zen-workspace-shortcut-forward = Sonraki çalışma alanı zen-workspace-shortcut-backward = Önceki çalışma alanı -zen-sidebar-shortcut-toggle = Kenar çubuğunun genişliğini değiştir +zen-sidebar-shortcut-toggle = Kenar çubuğu genişliğini değiştir zen-pinned-tab-shortcut-reset = Sabitlenen sekmeyi sabitlenen URL'ye sıfırla zen-split-view-shortcut-grid = Izgaralı bölünmüş görünümü aç/kapat zen-split-view-shortcut-vertical = Dikey bölünmüş görünümü aç/kapat zen-split-view-shortcut-horizontal = Yatay Bölünmüş Görünümü Aç/Kapat -zen-split-view-shortcut-unsplit = Bölünmüş Görünümü Kapat -zen-new-empty-split-view-shortcut = Yeni Boş Bölünmüş Görünüm -zen-key-select-tab-1 = 1. Sekmeyi Seç -zen-key-select-tab-2 = 2. Sekmeyi Seç -zen-key-select-tab-3 = 3. Sekmeyi Seç -zen-key-select-tab-4 = 4. Sekmeyi Seç -zen-key-select-tab-5 = 5. Sekmeyi Seç -zen-key-select-tab-6 = 6. Sekmeyi Seç -zen-key-select-tab-7 = 7. Sekmeyi Seç -zen-key-select-tab-8 = 8. Sekmeyi Seç -zen-key-select-tab-last = Son Sekmeyi Seç -zen-key-show-all-tabs = Tüm Sekmeleri Göster -zen-key-goto-history = Arama Geçmişine Git -zen-key-go-home = Ana Sayfaya Git -zen-bookmark-show-sidebar-shortcut = Yer İmlerini Kenar Çubuğunda Göster -zen-bookmark-show-toolbar-shortcut = Yer İmlerini Araç Çubuğunda Göster -zen-devtools-toggle-shortcut = Geliştirici Araçlarını Aç/Kapat -zen-devtools-toggle-browser-toolbox-shortcut = Tarayıcı Araç Kutusunu Aç/Kapat +zen-split-view-shortcut-unsplit = Bölünmüş görünümü kapat +zen-new-empty-split-view-shortcut = Yeni boş bölünmüş görünüm +zen-key-select-tab-1 = 1. sekmeyi seç +zen-key-select-tab-2 = 2. sekmeyi seç +zen-key-select-tab-3 = 3. sekmeyi seç +zen-key-select-tab-4 = 4. sekmeyi seç +zen-key-select-tab-5 = 5. sekmeyi seç +zen-key-select-tab-6 = 6. sekmeyi seç +zen-key-select-tab-7 = 7. sekmeyi seç +zen-key-select-tab-8 = 8. sekmeyi seç +zen-key-select-tab-last = Son sekmeyi seç +zen-key-show-all-tabs = Tüm sekmeleri göster +zen-key-goto-history = Arama geçmişine git +zen-key-go-home = Ana sayfaya git +zen-bookmark-show-sidebar-shortcut = Yer imlerini kenar çubuğunda göster +zen-bookmark-show-toolbar-shortcut = Yer imlerini araç çubuğunda göster +zen-devtools-toggle-shortcut = Geliştirici araçlarını aç/kapat +zen-devtools-toggle-browser-toolbox-shortcut = Tarayıcı araç kutusunu aç/kapat zen-devtools-toggle-browser-console-shortcut = Tarayıcı konsolunu aç/kapat zen-devtools-toggle-responsive-design-mode-shortcut = Uyumlu tasarım modunu aç/kapat zen-devtools-toggle-inspector-shortcut = Denetleyiciyi aç/kapat diff --git a/locales/tr/browser/browser/zen-general.ftl b/locales/tr/browser/browser/zen-general.ftl index 7cbca0b21..ffe49dd44 100644 --- a/locales/tr/browser/browser/zen-general.ftl +++ b/locales/tr/browser/browser/zen-general.ftl @@ -7,22 +7,22 @@ unified-extensions-description = Uzantılar { -brand-short-name }'e daha fazla e tab-context-zen-reset-pinned-tab = .label = { $isEssential -> - [true] Temel sekmeyi sıfırla - *[false] Sabitlenmiş sekmeyi sıfırla + [true] Temel sekmeyi sıfırla + *[false] Sabitlenmiş sekmeyi sıfırla } .accesskey = R tab-context-zen-add-essential = .label = Temel sekmelere ekle .accesskey = E -tab-context-zen-add-essential-badge = { $num } / { $max } yuva dolu +tab-context-zen-add-essential-badge = { $num } / { $max } tab-context-zen-remove-essential = .label = Temel sekmelerden kaldır .accesskey = R tab-context-zen-replace-pinned-url-with-current = .label = { $isEssential -> - [true] Temel sekmenin URL’sini geçerli olanla değiştir - *[false] Sabitlenmiş sekme URL’sini geçerli olanla değiştir + [true] Temel sekmenin URL’sini geçerli olanla değiştir + *[false] Sabitlenmiş sekme URL’sini geçerli olanla değiştir } .accesskey = C tab-context-zen-edit-title = @@ -88,7 +88,7 @@ zen-site-data-manage-addons = zen-site-data-get-addons = .label = Uzantı ekle zen-site-data-site-settings = - .label = Tüm Site Ayarları + .label = Tüm site ayarları zen-site-data-header-share = .tooltiptext = Bu sayfayı paylaş zen-site-data-header-reader-mode = diff --git a/locales/tr/browser/browser/zen-split-view.ftl b/locales/tr/browser/browser/zen-split-view.ftl index dfb0f93d0..ac0cd0fef 100644 --- a/locales/tr/browser/browser/zen-split-view.ftl +++ b/locales/tr/browser/browser/zen-split-view.ftl @@ -5,7 +5,8 @@ tab-zen-split-tabs = .label = { $tabCount -> - [1] Bölünmüş Sekme (birden fazla seçilmiş sekme gerekir) + [-1] Sekmeleri birleştir + [1] Sekmeyi böl (birden fazla seçilmiş sekme gerekir) *[other] { $tabCount } Sekmeyi Böl } .accesskey = S diff --git a/locales/tr/browser/browser/zen-vertical-tabs.ftl b/locales/tr/browser/browser/zen-vertical-tabs.ftl index 174af8645..f80af01e3 100644 --- a/locales/tr/browser/browser/zen-vertical-tabs.ftl +++ b/locales/tr/browser/browser/zen-vertical-tabs.ftl @@ -27,18 +27,18 @@ sidebar-zen-create-new = tabbrowser-unload-tab-button = .tooltiptext = { $tabCount -> - [bir] Kapatın ve sekmeye geçin + [one] Kapatın ve sekmeye geçin *[other] { $tabCount } sekmesini kaldır ve ilkine geç } tabbrowser-reset-pin-button = .tooltiptext = { $tabCount -> - [bir] Sıfırlayın ve sabitleyin + [one] Sıfırlayın ve sabitleyin *[other] { $tabCount } Sekmeyi sıfırla ve sabitle } zen-tab-sublabel = { $tabSubtitle -> - [zen-default-pinned] Sabitlenmiş URL’ye geri dön - [zen-default-pinned-cmd] Sabitlenmiş sekmeden ayır - *[other] { $tabSubtitle } + [zen-default-pinned] Sabitlenmiş URL’ye geri dön + [zen-default-pinned-cmd] Sabitlenmiş sekmeden ayır + *[other] { $tabSubtitle } } diff --git a/locales/tr/browser/browser/zen-workspaces.ftl b/locales/tr/browser/browser/zen-workspaces.ftl index 770a9cb16..39a66c11f 100644 --- a/locales/tr/browser/browser/zen-workspaces.ftl +++ b/locales/tr/browser/browser/zen-workspaces.ftl @@ -31,7 +31,7 @@ zen-workspaces-how-to-reorder-desc = Alanları yeniden sıralamak için kenar ç zen-workspaces-change-theme = .label = Temayı düzenle zen-workspaces-panel-context-open = - .label = Çalışma Alanı Aç + .label = Çalışma alanı aç .accesskey = O zen-workspaces-panel-context-edit = .label = Çalışma alanını düzenle diff --git a/locales/vi/browser/browser/zen-general.ftl b/locales/vi/browser/browser/zen-general.ftl index e3c36371c..22b6e477f 100644 --- a/locales/vi/browser/browser/zen-general.ftl +++ b/locales/vi/browser/browser/zen-general.ftl @@ -7,8 +7,8 @@ unified-extensions-description = Các tiện ích mở rộng được sử dụ tab-context-zen-reset-pinned-tab = .label = { $isEssential -> - [true] Đặt lại thẻ chính - *[false] Đặt lại thẻ đã ghim + [true] Đặt lại thẻ chính + *[false] Đặt lại thẻ đã ghim } .accesskey = R tab-context-zen-add-essential = diff --git a/locales/zh-CN/browser/browser/zen-general.ftl b/locales/zh-CN/browser/browser/zen-general.ftl index 06202624d..cdc66cb76 100644 --- a/locales/zh-CN/browser/browser/zen-general.ftl +++ b/locales/zh-CN/browser/browser/zen-general.ftl @@ -121,4 +121,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 = 新空白窗口 + .label = 新建空白窗口 diff --git a/locales/zh-CN/browser/browser/zen-split-view.ftl b/locales/zh-CN/browser/browser/zen-split-view.ftl index 4b01a51f5..92e65dd2f 100644 --- a/locales/zh-CN/browser/browser/zen-split-view.ftl +++ b/locales/zh-CN/browser/browser/zen-split-view.ftl @@ -5,6 +5,7 @@ tab-zen-split-tabs = .label = { $tabCount -> + [-1] 取消分屏标签页 [1] 分屏标签页(需要选择多个标签页) *[other] 分屏 { $tabCount } 个标签页 } diff --git a/locales/zh-TW/browser/browser/zen-general.ftl b/locales/zh-TW/browser/browser/zen-general.ftl index a4ad834c4..d73909f24 100644 --- a/locales/zh-TW/browser/browser/zen-general.ftl +++ b/locales/zh-TW/browser/browser/zen-general.ftl @@ -14,7 +14,7 @@ tab-context-zen-reset-pinned-tab = tab-context-zen-add-essential = .label = 新增至 Essentials .accesskey = E -tab-context-zen-add-essential-badge = 已使用 { $num } / { $max } 個位置 +tab-context-zen-add-essential-badge = { $num } / { $max } tab-context-zen-remove-essential = .label = 從 Essentials 中移除 .accesskey = R diff --git a/package-lock.json b/package-lock.json index 279cdb9e9..c773998a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1005,15 +1005,15 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", - "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "dev": true, "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", - "proxy-from-env": "^1.1.0" + "proxy-from-env": "^2.1.0" } }, "node_modules/b4a": { @@ -3074,9 +3074,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -3254,11 +3254,14 @@ } }, "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=10" + } }, "node_modules/pump": { "version": "3.0.2", diff --git a/package.json b/package.json index a9d156ad1..f5dff7d7a 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,6 @@ "sync:l10n": "python3 scripts/update_ff.py --just-l10n", "lint": "cd engine && ./mach lint zen", "lint:fix": "npm run lint -- --fix", - "prepare": "husky", "reset-ff": "surfer reset", "surfer": "surfer", "test": "python3 scripts/run_tests.py", @@ -38,9 +37,6 @@ "type": "git", "url": "git+https://github.com/zen-browser/desktop.git" }, - "hooks": { - "pre-commit": "npm run prepare" - }, "keywords": [], "author": "", "license": "MPL-2.0", diff --git a/prefs/firefox/browser.yaml b/prefs/firefox/browser.yaml index 41575963d..23db6a4e4 100644 --- a/prefs/firefox/browser.yaml +++ b/prefs/firefox/browser.yaml @@ -86,3 +86,7 @@ - name: browser.tabs.splitView.enabled value: false locked: true + +# See gh-12985 for details on the following preferences +- name: browser.search.widget.new + value: true diff --git a/prefs/zen/glance.yaml b/prefs/zen/glance.yaml index 2246aa916..ef01648c1 100644 --- a/prefs/zen/glance.yaml +++ b/prefs/zen/glance.yaml @@ -16,3 +16,6 @@ - name: zen.glance.animation-duration value: 350 # in milliseconds + +- name: zen.glance.deactivate-docshell-during-animation + value: true diff --git a/prefs/zen/macos.yaml b/prefs/zen/macos.yaml index bf28c7266..abca5c987 100644 --- a/prefs/zen/macos.yaml +++ b/prefs/zen/macos.yaml @@ -27,3 +27,7 @@ - name: widget.macos.native-popovers value: true condition: "defined(XP_MACOSX)" + +- name: zen.widget.macos.override-system-swipe-gestures + value: true + condition: "defined(XP_MACOSX)" diff --git a/requirements.txt b/requirements.txt index 45da7b672..03b71cd68 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,4 +8,4 @@ packaging==24.2 pathspec==0.12.1 platformdirs==4.3.6 pycodestyle==2.12.1 -requests==2.32.5 +requests==2.33.0 diff --git a/scripts/mar_sign.sh b/scripts/mar_sign.sh new file mode 100644 index 000000000..8b12a5d68 --- /dev/null +++ b/scripts/mar_sign.sh @@ -0,0 +1,167 @@ +#!/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/. + +set -e + +CERT_PATH_DIR=build/signing +UPDATER_CERT_DIR="engine/toolkit/mozapps/update/updater" +NSS_CONFIG_DIR="$CERT_PATH_DIR/nss_config" + +generate_certs() { + mkdir temp + cd temp + + # 1. Generate private key + openssl genrsa -out private_key.pem 4096 + + # 2. Generate self-signed certificate (required for PKCS#12 bundling) + openssl req -new -x509 \ + -key private_key.pem \ + -out cert.pem \ + -subj "/CN=MAR Signing" + + # 3. Export public key as SPKI DER (for embedding in updater) + openssl rsa -in private_key.pem -pubout -outform DER -out public_key.der + + cd .. + mkdir -p "$CERT_PATH_DIR" + mv temp/private_key.pem "$CERT_PATH_DIR"/private_key.pem + mv temp/cert.pem "$CERT_PATH_DIR"/cert.pem + mv temp/public_key.der "$CERT_PATH_DIR"/public_key.der + + mkdir -p "$CERT_PATH_DIR/env" + 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 + + rm -rf temp +} + +import_cert() { + if [ ! -f "$CERT_PATH_DIR/public_key.der" ]; then + 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" + echo "Done. Rebuild the updater to embed the new certificate." +} + +create_nss_config_dir() { + rm -rf "$NSS_CONFIG_DIR" + mkdir "$NSS_CONFIG_DIR" + + if [ -z "$ZEN_MAR_SIGNING_PASSWORD" ]; then + echo "Warning: ZEN_MAR_SIGNING_PASSWORD environment variable not set. Using empty password." >&2 + ZEN_MAR_SIGNING_PASSWORD="" + fi + + password_file="$NSS_CONFIG_DIR/password.txt" + echo "$ZEN_MAR_SIGNING_PASSWORD" > "$password_file" + + if [ "$ZEN_SIGNING_CERT_PEM_BASE64" ]; then + echo "Decoding signing certificate from ZEN_SIGNING_CERT_PEM_BASE64 environment variable..." + echo "$ZEN_SIGNING_CERT_PEM_BASE64" | base64 -d > "$CERT_PATH_DIR/cert.pem" + fi + + if [ "$ZEN_SIGNING_PRIVATE_KEY_PEM_BASE64" ]; then + echo "Decoding signing private key from ZEN_SIGNING_PRIVATE_KEY_PEM_BASE64 environment variable..." + echo "$ZEN_SIGNING_PRIVATE_KEY_PEM_BASE64" | base64 -d > "$CERT_PATH_DIR/private_key.pem" + fi + + echo "Generating NSS config directory at $NSS_CONFIG_DIR" + certutil -N -d "$NSS_CONFIG_DIR" -f "$password_file" + + echo "Wrapping private key into PKCS#12..." + echo "Wrapping key + cert into PKCS#12..." + openssl pkcs12 -export \ + -inkey "$CERT_PATH_DIR/private_key.pem" \ + -in "$CERT_PATH_DIR/cert.pem" \ + -name "private_key" \ + -passout pass:"$ZEN_MAR_SIGNING_PASSWORD" \ + -out "$CERT_PATH_DIR/private_key.p12" + + echo "Importing PKCS#12 into NSS database..." + pk12util \ + -i "$CERT_PATH_DIR/private_key.p12" \ + -d "$NSS_CONFIG_DIR" \ + -W "$ZEN_MAR_SIGNING_PASSWORD" \ + -K "$ZEN_MAR_SIGNING_PASSWORD" +} + +cleanup_certs() { + rm -rf "$NSS_CONFIG_DIR" + rm -rf "$CERT_PATH_DIR/env" + + rm -f "$CERT_PATH_DIR/private_key.p12" + rm -f "$CERT_PATH_DIR/private_key.pem" + rm -f "$CERT_PATH_DIR/cert.pem" +} + +sign_mars() { + if [ ! -f "$SIGNMAR" ]; then + echo "Error: signmar not found at $SIGNMAR. Build the engine first." >&2 + exit 1 + fi + + chmod +x "$SIGNMAR" + + create_nss_config_dir + + folders=( + linux.mar + linux-aarch64.mar + windows.mar + windows-arm64 + macos.mar + ) + # 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 + for mar_file in "$folder"/*.mar; do + if [ -f "$mar_file" ]; then + echo "" + echo "Signing $mar_file..." + # mar [-C workingDir] -d NSSConfigDir -n certname -s archive.mar out_signed_archive.mar + "$SIGNMAR" -d "$NSS_CONFIG_DIR" -n "private_key" -s "$mar_file" "$mar_file".signed + echo "Signed $mar_file. Verifying signature..." + "$SIGNMAR" -d "$NSS_CONFIG_DIR" -n "private_key" -v "$mar_file".signed + mv "$mar_file".signed "$mar_file" + echo "Successfully signed $mar_file" + else + echo "No .mar files found in $folder, skipping." + fi + done + else + echo "Directory $folder not found, skipping." + fi + done + + cleanup_certs +} + +case "$1" in + -g) + generate_certs + ;; + -i) + import_cert + ;; + -s) + sign_mars + ;; + *) + echo "Usage: $0 [-g] [-i] [-s]" >&2 + echo " -g Generate MAR signing certificates" >&2 + echo " -i Import the certificate into the updater (release_primary.der)" >&2 + echo " -s Sign *.mar files in the current directory in-place" >&2 + exit 1 + ;; +esac diff --git a/scripts/update_external_patches.py b/scripts/update_external_patches.py index 1ad279ab6..3e4c1057b 100644 --- a/scripts/update_external_patches.py +++ b/scripts/update_external_patches.py @@ -55,7 +55,7 @@ def main(): name = patch.get("name") if not phab_id or not name: die(f"Patch entry missing 'id' or 'name': {patch}") - name = name.replace(" ", "_").lower() + name = name.replace(" ", "_").replace(".", "_").lower() output_file = os.path.join(OUTPUT_DIR, "firefox", f"{name}.patch") print(f"Processing Phabricator patch: {phab_id} -> {output_file}") download_phab_patch(phab_id, output_file) diff --git a/src/browser/base/content/browser-commands-js.patch b/src/browser/base/content/browser-commands-js.patch index fa9a0af70..87a12716c 100644 --- a/src/browser/base/content/browser-commands-js.patch +++ b/src/browser/base/content/browser-commands-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/base/content/browser-commands.js b/browser/base/content/browser-commands.js -index 75ddd82c18979571f377dec94fe1883f1349cc16..58ae4d88f7f0b37187cb61fcaf4cf84a9af7991f 100644 +index 75ddd82c18979571f377dec94fe1883f1349cc16..129d78214db53fc8dbd17d23b4a5a042ec297a41 100644 --- a/browser/base/content/browser-commands.js +++ b/browser/base/content/browser-commands.js @@ -14,6 +14,10 @@ var BrowserCommands = { @@ -24,11 +24,14 @@ index 75ddd82c18979571f377dec94fe1883f1349cc16..58ae4d88f7f0b37187cb61fcaf4cf84a // A notification intended to be useful for modular peformance tracking // starting as close as is reasonably possible to the time when the user // expressed the intent to open a new tab. Since there are a lot of -@@ -399,6 +407,11 @@ var BrowserCommands = { +@@ -399,6 +407,14 @@ var BrowserCommands = { return; } + if (gBrowser.selectedTab.hasAttribute("zen-empty-tab")) { ++ if (gBrowser.selectedTab.hasAttribute("split-view")) { ++ return; ++ } + gZenWorkspaces.handleTabCloseWindow(); + return; + } @@ -36,7 +39,7 @@ index 75ddd82c18979571f377dec94fe1883f1349cc16..58ae4d88f7f0b37187cb61fcaf4cf84a // Keyboard shortcuts that would close a tab that is pinned select the first // unpinned tab instead. if ( -@@ -406,8 +419,8 @@ var BrowserCommands = { +@@ -406,8 +422,8 @@ var BrowserCommands = { (event.ctrlKey || event.metaKey || event.altKey) && gBrowser.selectedTab.pinned ) { diff --git a/src/browser/base/content/browser-gestureSupport-js.patch b/src/browser/base/content/browser-gestureSupport-js.patch index ef205d5df..7132d6fdd 100644 --- a/src/browser/base/content/browser-gestureSupport-js.patch +++ b/src/browser/base/content/browser-gestureSupport-js.patch @@ -1,8 +1,19 @@ diff --git a/browser/base/content/browser-gestureSupport.js b/browser/base/content/browser-gestureSupport.js -index a28d54bf72c0e6495b9586f220d1859aac794936..66154668b9f85ffbaacea1e8351370659260227b 100644 +index a28d54bf72c0e6495b9586f220d1859aac794936..411d7255a68c48643617d77cc279a0a831fdf5c9 100644 --- a/browser/base/content/browser-gestureSupport.js +++ b/browser/base/content/browser-gestureSupport.js -@@ -832,7 +832,7 @@ var gHistorySwipeAnimation = { +@@ -247,6 +247,10 @@ var gGestureSupport = { + : aEvent.DIRECTION_LEFT; + } + ++ if (!gHistorySwipeAnimation._isSupported()) { ++ return; ++ } ++ + return canGoBack || canGoForward; + }, + +@@ -832,7 +836,7 @@ var gHistorySwipeAnimation = { * @return true if there is a previous page in history, false otherwise. */ canGoBack: function HSA_canGoBack() { diff --git a/src/browser/base/content/zen-commands.inc.xhtml b/src/browser/base/content/zen-commands.inc.xhtml index de2cec15d..4f9e0fca9 100644 --- a/src/browser/base/content/zen-commands.inc.xhtml +++ b/src/browser/base/content/zen-commands.inc.xhtml @@ -66,4 +66,6 @@ + + diff --git a/src/browser/base/content/zen-panels/popups.inc b/src/browser/base/content/zen-panels/popups.inc index c79bf726b..c888a26c2 100644 --- a/src/browser/base/content/zen-panels/popups.inc +++ b/src/browser/base/content/zen-panels/popups.inc @@ -3,23 +3,6 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. - - - - - - - - diff --git a/src/browser/components/customizableui/ToolbarContextMenu-sys-mjs.patch b/src/browser/components/customizableui/ToolbarContextMenu-sys-mjs.patch index bf9fc9dbb..3a849bafb 100644 --- a/src/browser/components/customizableui/ToolbarContextMenu-sys-mjs.patch +++ b/src/browser/components/customizableui/ToolbarContextMenu-sys-mjs.patch @@ -1,7 +1,16 @@ diff --git a/browser/components/customizableui/ToolbarContextMenu.sys.mjs b/browser/components/customizableui/ToolbarContextMenu.sys.mjs -index d5fd707b98e4b163a624c97ff4a8f2574e0b0180..32360b11270d9dad4b83229428932e598f69e774 100644 +index d5fd707b98e4b163a624c97ff4a8f2574e0b0180..b5d7e84c3567e83b95a6493e8333d3036dc88f36 100644 --- a/browser/components/customizableui/ToolbarContextMenu.sys.mjs +++ b/browser/components/customizableui/ToolbarContextMenu.sys.mjs +@@ -183,7 +183,7 @@ export var ToolbarContextMenu = { + + let showTabStripItems = toolbarItem?.id == "tabbrowser-tabs"; + let isVerticalTabStripMenu = +- showTabStripItems && toolbarItem.parentElement.id == "vertical-tabs"; ++ showTabStripItems && toolbarItem.parentElement.id == "TabsToolbar-customization-target"; + + if (aInsertPoint) { + aInsertPoint.hidden = isVerticalTabStripMenu; @@ -243,10 +243,7 @@ export var ToolbarContextMenu = { // Show/hide sidebar and vertical tabs menu items let sidebarRevampEnabled = Services.prefs.getBoolPref("sidebar.revamp"); @@ -14,3 +23,11 @@ index d5fd707b98e4b163a624c97ff4a8f2574e0b0180..32360b11270d9dad4b83229428932e59 let toggleVerticalTabsItem = document.getElementById( "toolbar-context-toggle-vertical-tabs" +@@ -267,6 +264,7 @@ export var ToolbarContextMenu = { + document.getElementById("sidebarRevampSeparator").hidden = + !showSidebarActions || isVerticalTabStripMenu; + document.getElementById("customizationMenuSeparator").hidden = ++ true || + toolbarItem?.id == "tabbrowser-tabs" || + (toolbarItem?.localName == "toolbarspring" && + !CustomizationHandler.isCustomizing()) || diff --git a/src/browser/components/preferences/main-js.patch b/src/browser/components/preferences/main-js.patch index 2a03cb2c3..d13a304c5 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 e77dfebdf3a15033182eeae6eccd44a63aae3740..4e25b3e1abaeeaec3e83e0e1b53bf578eba5587b 100644 +index a5f2e4258942010ee61ed7a86497f51793366fcd..f01524a09512ec6cd1972a9fdb173ff427a0d753 100644 --- a/browser/components/preferences/main.js +++ b/browser/components/preferences/main.js @@ -2652,6 +2652,11 @@ SettingGroupManager.registerGroups({ diff --git a/src/browser/components/preferences/zen-settings.js b/src/browser/components/preferences/zen-settings.js index 4541bf90a..16ddcbc63 100644 --- a/src/browser/components/preferences/zen-settings.js +++ b/src/browser/components/preferences/zen-settings.js @@ -1067,7 +1067,7 @@ var gZenCKSSettings = { zenMissingKeyboardShortcutL10n[conflictShortcut.getID()] ?? conflictShortcut.getL10NID(); - const [group] = await document.l10n.formatValues([ + const [group, conflictName] = await document.l10n.formatValues([ { id: `${ZEN_CKS_GROUP_PREFIX}-${conflictShortcut.getGroup()}` }, { id: shortcutL10nKey }, ]); @@ -1082,7 +1082,7 @@ var gZenCKSSettings = { document.l10n.setAttributes(input.nextElementSibling, "zen-key-conflict", { group: group ?? "", - shortcut: shortcut ?? "", + shortcut: conflictName ?? shortcut ?? "", }); } } else { diff --git a/src/browser/components/tabbrowser/content/drag-and-drop-js.patch b/src/browser/components/tabbrowser/content/drag-and-drop-js.patch index 6d7d0be43..2a9d213f2 100644 --- a/src/browser/components/tabbrowser/content/drag-and-drop-js.patch +++ b/src/browser/components/tabbrowser/content/drag-and-drop-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/tabbrowser/content/drag-and-drop.js b/browser/components/tabbrowser/content/drag-and-drop.js -index ced2bfd88de2d16e2c028ca3f4d9d27516363575..aaf6e82782357c819ca875f05020723600e41e6b 100644 +index ced2bfd88de2d16e2c028ca3f4d9d27516363575..69b45c7dad9d294e4290de4ce878d184925e5610 100644 --- a/browser/components/tabbrowser/content/drag-and-drop.js +++ b/browser/components/tabbrowser/content/drag-and-drop.js @@ -35,6 +35,9 @@ @@ -277,7 +277,11 @@ index ced2bfd88de2d16e2c028ca3f4d9d27516363575..aaf6e82782357c819ca875f050207236 tab.removeAttribute("small-stack"); tab.removeAttribute("big-stack"); } -@@ -2582,7 +2585,6 @@ +@@ -2578,11 +2581,9 @@ + )) { + label.style.width = ""; + label.style.maxWidth = ""; +- label.style.height = ""; label.style.left = ""; label.style.top = ""; label.style.pointerEvents = ""; diff --git a/src/browser/components/tabbrowser/content/tab-js.patch b/src/browser/components/tabbrowser/content/tab-js.patch index 8bd69d35d..8f386d14f 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 e4266a159a0d5c42cc294602d00b8f66131f35d5..88c321f05dabd948d06e155f6e0474669fc15c20 100644 +index e4266a159a0d5c42cc294602d00b8f66131f35d5..f3e362f062063ebe08bd26cc694f2d965ccffd84 100644 --- a/browser/components/tabbrowser/content/tab.js +++ b/browser/components/tabbrowser/content/tab.js @@ -21,6 +21,7 @@ @@ -52,7 +52,7 @@ index e4266a159a0d5c42cc294602d00b8f66131f35d5..88c321f05dabd948d06e155f6e047466 return; } -@@ -225,11 +228,23 @@ +@@ -225,11 +228,25 @@ } get visible() { @@ -74,14 +74,16 @@ index e4266a159a0d5c42cc294602d00b8f66131f35d5..88c321f05dabd948d06e155f6e047466 + } + currentParent = currentParent.group; + } -+ if (this.pinned && !this.hasAttribute("zen-essential") && gZenWorkspaces.activeWorkspaceElement?.hasCollapsedPinnedTabs) { ++ if (this.pinned && !this.hasAttribute("zen-essential") && ++ gZenWorkspaces.activeWorkspaceElement?.hasCollapsedPinnedTabs && ++ !gZenWorkspaces.activeWorkspaceElement.collapsiblePins.activeTabs?.includes(this)) { + return false; + } + return true; } get hidden() { -@@ -308,7 +323,7 @@ +@@ -308,7 +325,7 @@ return false; } @@ -90,7 +92,7 @@ index e4266a159a0d5c42cc294602d00b8f66131f35d5..88c321f05dabd948d06e155f6e047466 } get lastAccessed() { -@@ -393,7 +408,18 @@ +@@ -393,7 +410,18 @@ } get group() { @@ -110,7 +112,7 @@ index e4266a159a0d5c42cc294602d00b8f66131f35d5..88c321f05dabd948d06e155f6e047466 } get splitview() { -@@ -475,6 +501,10 @@ +@@ -475,6 +503,10 @@ } } @@ -121,7 +123,7 @@ index e4266a159a0d5c42cc294602d00b8f66131f35d5..88c321f05dabd948d06e155f6e047466 // If the previous target wasn't part of this tab then this is a mouseenter event. if (!this.contains(event.relatedTarget)) { this._mouseenter(); -@@ -504,6 +534,7 @@ +@@ -504,6 +536,7 @@ if (!this.contains(event.relatedTarget)) { this._mouseleave(); } @@ -129,7 +131,7 @@ index e4266a159a0d5c42cc294602d00b8f66131f35d5..88c321f05dabd948d06e155f6e047466 } on_dragstart(event) { -@@ -538,6 +569,8 @@ +@@ -538,6 +571,8 @@ this.style.MozUserFocus = "ignore"; } else if ( event.target.classList.contains("tab-close-button") || @@ -138,7 +140,7 @@ index e4266a159a0d5c42cc294602d00b8f66131f35d5..88c321f05dabd948d06e155f6e047466 event.target.classList.contains("tab-icon-overlay") || event.target.classList.contains("tab-audio-button") ) { -@@ -592,16 +625,21 @@ +@@ -592,16 +627,21 @@ this.style.MozUserFocus = ""; } @@ -161,7 +163,7 @@ index e4266a159a0d5c42cc294602d00b8f66131f35d5..88c321f05dabd948d06e155f6e047466 gBrowser.multiSelectedTabsCount > 0 && !event.target.classList.contains("tab-close-button") && !event.target.classList.contains("tab-icon-overlay") && -@@ -613,8 +651,9 @@ +@@ -613,8 +653,9 @@ } if ( @@ -173,7 +175,7 @@ index e4266a159a0d5c42cc294602d00b8f66131f35d5..88c321f05dabd948d06e155f6e047466 ) { if (this.activeMediaBlocked) { if (this.multiselected) { -@@ -632,7 +671,7 @@ +@@ -632,7 +673,7 @@ return; } @@ -182,7 +184,7 @@ index e4266a159a0d5c42cc294602d00b8f66131f35d5..88c321f05dabd948d06e155f6e047466 if (this.multiselected) { gBrowser.removeMultiSelectedTabs( lazy.TabMetrics.userTriggeredContext( -@@ -652,6 +691,14 @@ +@@ -652,6 +693,14 @@ // (see tabbrowser-tabs 'click' handler). gBrowser.tabContainer._blockDblClick = true; } @@ -197,7 +199,7 @@ index e4266a159a0d5c42cc294602d00b8f66131f35d5..88c321f05dabd948d06e155f6e047466 } on_dblclick(event) { -@@ -675,6 +722,8 @@ +@@ -675,6 +724,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 2c47ad27a..a328ea9d9 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 d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c19d2c96fa 100644 +index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..aed843d26eaf56d66883f95c373d40106d93dc08 100644 --- a/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js @@ -413,6 +413,7 @@ @@ -186,6 +186,15 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 // If focus is on the old tab, move it to the new tab. if (activeEl == oldTab) { newTab.focus(); +@@ -1822,7 +1902,7 @@ + // Focus the location bar if it was previously focused for that tab. + // In full screen mode, only bother making the location bar visible + // if the tab is a blank one. +- if (gURLBar.getBrowserState(newBrowser).urlbarFocused) { ++ if (gURLBar.getBrowserState(newBrowser).urlbarFocused && (!gZenVerticalTabsManager._hasSetSingleToolbar || isBlankPageURL(newBrowser.currentURI?.spec))) { + let selectURL = () => { + if (this._asyncTabSwitching) { + // Set _awaitingSetURI flag to suppress popup notification @@ -2110,7 +2190,12 @@ return this._setTabLabel(aTab, aLabel); } @@ -473,10 +482,10 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 + gZenWorkspaces._initialTab._shouldRemove = true; + } + } -+ } + } + else { + gZenWorkspaces._tabToRemoveForEmpty = this.selectedTab; - } ++ } + this._hasAlreadyInitializedZenSessionStore = true; if (tabs.length > 1 || !tabs[0].selected) { @@ -579,8 +588,8 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 } catch (e) { console.error(e); } -@@ -5524,6 +5679,12 @@ - aTab._closeTimeNoAnimTimerId = Glean.browserTabclose.timeNoAnim.start(); +@@ -5531,6 +5686,13 @@ + return; } + if (gZenWorkspaces.workspaceEnabled) { @@ -589,10 +598,11 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 + this.selectedTab = newTab; + } + } - // Handle requests for synchronously removing an already - // asynchronously closing tab. - if (!animate && aTab.closing) { -@@ -5538,6 +5699,9 @@ ++ + 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 +@@ -5538,6 +5700,9 @@ // state). let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width; let isLastTab = this.#isLastTabInWindow(aTab); @@ -602,7 +612,23 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 if ( !this._beginRemoveTab(aTab, { closeWindowFastpath: true, -@@ -5586,7 +5750,13 @@ +@@ -5549,13 +5714,14 @@ + telemetrySource, + }) + ) { ++ delete gZenWorkspaces._isClosingWindow; + Glean.browserTabclose.timeAnim.cancel(aTab._closeTimeAnimTimerId); + aTab._closeTimeAnimTimerId = null; + Glean.browserTabclose.timeNoAnim.cancel(aTab._closeTimeNoAnimTimerId); + aTab._closeTimeNoAnimTimerId = null; + return; + } +- ++ gZenWorkspaces.handleTabBeforeRemove(); + let lockTabSizing = + !this.tabContainer.verticalMode && + !aTab.pinned && +@@ -5586,7 +5752,13 @@ // We're not animating, so we can cancel the animation stopwatch. Glean.browserTabclose.timeAnim.cancel(aTab._closeTimeAnimTimerId); aTab._closeTimeAnimTimerId = null; @@ -617,7 +643,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 return; } -@@ -5720,7 +5890,7 @@ +@@ -5720,7 +5892,7 @@ closeWindowWithLastTab != null ? closeWindowWithLastTab : !window.toolbar.visible || @@ -626,7 +652,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 if (closeWindow) { // We've already called beforeunload on all the relevant tabs if we get here, -@@ -5744,6 +5914,7 @@ +@@ -5744,6 +5916,7 @@ newTab = true; } @@ -634,7 +660,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 aTab._endRemoveArgs = [closeWindow, newTab]; // swapBrowsersAndCloseOther will take care of closing the window without animation. -@@ -5784,13 +5955,7 @@ +@@ -5784,13 +5957,7 @@ aTab._mouseleave(); if (newTab) { @@ -649,7 +675,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 } else { TabBarVisibility.update(); } -@@ -5923,6 +6088,7 @@ +@@ -5923,6 +6090,7 @@ this.tabs[i]._tPos = i; } @@ -657,7 +683,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 if (!this._windowIsClosing) { // update tab close buttons state this.tabContainer._updateCloseButtons(); -@@ -6153,6 +6319,7 @@ +@@ -6153,6 +6321,7 @@ } let excludeTabs = new Set(aExcludeTabs); @@ -665,7 +691,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 // If this tab has a successor, it should be selectable, since // hiding or closing a tab removes that tab as a successor. -@@ -6165,15 +6332,22 @@ +@@ -6165,15 +6334,22 @@ !excludeTabs.has(aTab.owner) && Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose") ) { @@ -690,7 +716,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 let tab = this.tabContainer.findNextTab(aTab, { direction: 1, filter: _tab => remainingTabs.includes(_tab), -@@ -6187,7 +6361,7 @@ +@@ -6187,7 +6363,7 @@ } if (tab) { @@ -699,7 +725,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 } // If no qualifying visible tab was found, see if there is a tab in -@@ -6208,7 +6382,7 @@ +@@ -6208,7 +6384,7 @@ }); } @@ -708,7 +734,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 } _blurTab(aTab) { -@@ -6219,7 +6393,7 @@ +@@ -6219,7 +6395,7 @@ * @returns {boolean} * False if swapping isn't permitted, true otherwise. */ @@ -717,7 +743,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 // Do not allow transfering a private tab to a non-private window // and vice versa. if ( -@@ -6273,6 +6447,7 @@ +@@ -6273,6 +6449,7 @@ // fire the beforeunload event in the process. Close the other // window if this was its last tab. if ( @@ -725,7 +751,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 !remoteBrowser._beginRemoveTab(aOtherTab, { adoptedByTab: aOurTab, closeWindowWithLastTab: true, -@@ -6284,7 +6459,7 @@ +@@ -6284,7 +6461,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. @@ -734,7 +760,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 if (closeWindow) { let win = aOtherTab.ownerGlobal; win.windowUtils.suppressAnimation(true); -@@ -6412,11 +6587,13 @@ +@@ -6412,11 +6589,13 @@ } // Finish tearing down the tab that's going away. @@ -748,7 +774,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 this.setTabTitle(aOurTab); -@@ -6618,10 +6795,10 @@ +@@ -6618,10 +6797,10 @@ SessionStore.deleteCustomTabValue(aTab, "hiddenBy"); } @@ -761,7 +787,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 aTab.selected || aTab.closing || // Tabs that are sharing the screen, microphone or camera cannot be hidden. -@@ -6681,7 +6858,8 @@ +@@ -6681,7 +6860,8 @@ * @param {object} [aOptions={}] * Key-value pairs that will be serialized into the features string. */ @@ -771,7 +797,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 if (this.tabs.length == 1) { return null; } -@@ -6698,7 +6876,7 @@ +@@ -6698,7 +6878,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); @@ -780,7 +806,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 private: PrivateBrowsingUtils.isWindowPrivate(window), features: Object.entries(aOptions) .map(([key, value]) => `${key}=${value}`) -@@ -6706,6 +6884,8 @@ +@@ -6706,6 +6886,8 @@ openerWindow: window, args, }); @@ -789,7 +815,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 } /** -@@ -6818,7 +6998,7 @@ +@@ -6818,7 +7000,7 @@ * `true` if element is a `` */ isTabGroup(element) { @@ -798,7 +824,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 } /** -@@ -6903,8 +7083,8 @@ +@@ -6903,8 +7085,8 @@ } // Don't allow mixing pinned and unpinned tabs. @@ -809,7 +835,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 } else { tabIndex = Math.max(tabIndex, this.pinnedTabCount); } -@@ -6933,13 +7113,19 @@ +@@ -6933,13 +7115,19 @@ this.#handleTabMove( element, () => { @@ -831,7 +857,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 let useAfter = false; if (this.isTab(element)) { useAfter = neighbor && tabIndex > element._tPos; -@@ -7004,23 +7190,31 @@ +@@ -7004,23 +7192,31 @@ #moveTabNextTo(element, targetElement, moveBefore = false, metricsContext) { if (this.isTabGroupLabel(targetElement)) { targetElement = targetElement.group; @@ -869,7 +895,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 } 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 -@@ -7033,12 +7227,35 @@ +@@ -7033,12 +7229,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. @@ -906,7 +932,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 // 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. -@@ -7047,6 +7264,7 @@ +@@ -7047,6 +7266,7 @@ } let getContainer = () => @@ -914,7 +940,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 element.pinned ? this.tabContainer.pinnedTabsContainer : this.tabContainer; -@@ -7055,11 +7273,15 @@ +@@ -7055,11 +7275,15 @@ element, () => { if (moveBefore) { @@ -931,7 +957,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 } }, metricsContext -@@ -7133,10 +7355,10 @@ +@@ -7133,10 +7357,10 @@ * @param {TabMetricsContext} [metricsContext] */ moveTabToExistingGroup(aTab, aGroup, metricsContext) { @@ -944,7 +970,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 return; } if (aTab.group && aTab.group.id === aGroup.id) { -@@ -7209,6 +7431,7 @@ +@@ -7209,6 +7433,7 @@ let state = { tabIndex: tab._tPos, @@ -952,7 +978,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 }; if (tab.visible) { state.elementIndex = tab.elementIndex; -@@ -7240,7 +7463,7 @@ +@@ -7240,7 +7465,7 @@ let changedSplitView = previousTabState.splitViewId != currentTabState.splitViewId; @@ -961,7 +987,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 tab.dispatchEvent( new CustomEvent("TabMove", { bubbles: true, -@@ -7281,6 +7504,10 @@ +@@ -7281,6 +7506,10 @@ moveActionCallback(); @@ -972,7 +998,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 // Clear tabs cache after moving nodes because the order of tabs may have // changed. this.tabContainer._invalidateCachedTabs(); -@@ -7331,7 +7558,22 @@ +@@ -7331,7 +7560,22 @@ * @returns {object} * The new tab in the current window, null if the tab couldn't be adopted. */ @@ -996,7 +1022,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 // 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 -@@ -7374,6 +7616,8 @@ +@@ -7374,6 +7618,8 @@ } params.skipLoad = true; let newTab = this.addWebTab("about:blank", params); @@ -1005,7 +1031,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 aTab.container.tabDragAndDrop.finishAnimateTabMove(); -@@ -8076,7 +8320,7 @@ +@@ -8076,7 +8322,7 @@ // preventDefault(). It will still raise the window if appropriate. return; } @@ -1014,7 +1040,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 window.focus(); aEvent.preventDefault(); } -@@ -8093,7 +8337,6 @@ +@@ -8093,7 +8339,6 @@ on_TabGroupCollapse(aEvent) { aEvent.target.tabs.forEach(tab => { @@ -1022,7 +1048,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 }); } -@@ -8427,7 +8670,9 @@ +@@ -8427,7 +8672,9 @@ let filter = this._tabFilters.get(tab); if (filter) { @@ -1032,7 +1058,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 let listener = this._tabListeners.get(tab); if (listener) { -@@ -9233,6 +9478,7 @@ +@@ -9233,6 +9480,7 @@ aWebProgress.isTopLevel ) { this.mTab.setAttribute("busy", "true"); @@ -1040,7 +1066,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 gBrowser._tabAttrModified(this.mTab, ["busy"]); this.mTab._notselectedsinceload = !this.mTab.selected; } -@@ -9313,6 +9559,7 @@ +@@ -9313,6 +9561,7 @@ // known defaults. Note we use the original URL since about:newtab // redirects to a prerendered page. const shouldRemoveFavicon = @@ -1048,7 +1074,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 !this.mBrowser.mIconURL && !ignoreBlank && !(originalLocation.spec in FAVICON_DEFAULTS); -@@ -9487,13 +9734,6 @@ +@@ -9487,13 +9736,6 @@ this.mBrowser.originalURI = aRequest.originalURI; } @@ -1062,7 +1088,7 @@ index d88bc0e5570c8fd428a84fdf5af0f6bab1e2a636..5bb791734fdf066c82de3975b74cf1c1 } let userContextId = this.mBrowser.getAttribute("usercontextid") || 0; -@@ -10379,7 +10619,7 @@ var TabContextMenu = { +@@ -10379,7 +10621,7 @@ var TabContextMenu = { ); contextUnpinSelectedTabs.hidden = !this.contextTab.pinned || !this.multiselected; diff --git a/src/browser/components/tabbrowser/content/tabgroup-js.patch b/src/browser/components/tabbrowser/content/tabgroup-js.patch index 4517ac261..e1803b91f 100644 --- a/src/browser/components/tabbrowser/content/tabgroup-js.patch +++ b/src/browser/components/tabbrowser/content/tabgroup-js.patch @@ -1,5 +1,5 @@ diff --git a/browser/components/tabbrowser/content/tabgroup.js b/browser/components/tabbrowser/content/tabgroup.js -index 3ca119e8dc72fac652c98505211864483d98add2..026b524be51170882e788a701095b938d6923f3e 100644 +index 3ca119e8dc72fac652c98505211864483d98add2..b65307ee8df896488a4c51e3a25bf9ad9e1c8179 100644 --- a/browser/components/tabbrowser/content/tabgroup.js +++ b/browser/components/tabbrowser/content/tabgroup.js @@ -14,11 +14,11 @@ @@ -101,7 +101,13 @@ index 3ca119e8dc72fac652c98505211864483d98add2..026b524be51170882e788a701095b938 resetDefaultGroupName = () => { this.#defaultGroupName = ""; -@@ -178,7 +201,9 @@ +@@ -175,10 +198,15 @@ + if (!this.#tabChangeObserver) { + this.#tabChangeObserver = new window.MutationObserver(mutations => { + if (!this.tabs.length) { ++ if (this.tagName === "zen-workspace-collapsible-pins") { ++ return; ++ } this.dispatchEvent( new CustomEvent("TabGroupRemoved", { bubbles: true }) ); @@ -111,7 +117,7 @@ index 3ca119e8dc72fac652c98505211864483d98add2..026b524be51170882e788a701095b938 Services.obs.notifyObservers( this, "browser-tabgroup-removed-from-dom" -@@ -223,7 +248,10 @@ +@@ -223,7 +251,10 @@ } }); } @@ -123,7 +129,7 @@ index 3ca119e8dc72fac652c98505211864483d98add2..026b524be51170882e788a701095b938 } get color() { -@@ -317,6 +345,9 @@ +@@ -317,6 +348,9 @@ } set collapsed(val) { @@ -133,7 +139,7 @@ index 3ca119e8dc72fac652c98505211864483d98add2..026b524be51170882e788a701095b938 if (!!val == this.collapsed) { return; } -@@ -403,7 +434,6 @@ +@@ -403,7 +437,6 @@ tabGroupName, }) .then(result => { @@ -141,7 +147,7 @@ index 3ca119e8dc72fac652c98505211864483d98add2..026b524be51170882e788a701095b938 }); } -@@ -478,13 +508,65 @@ +@@ -478,13 +511,65 @@ * @returns {MozTabbrowserTab[]} */ get tabs() { @@ -212,7 +218,7 @@ index 3ca119e8dc72fac652c98505211864483d98add2..026b524be51170882e788a701095b938 } /** -@@ -592,7 +674,6 @@ +@@ -592,7 +677,6 @@ ); } else { if (tabOrSplitView.pinned) { @@ -220,7 +226,7 @@ index 3ca119e8dc72fac652c98505211864483d98add2..026b524be51170882e788a701095b938 } let tabToMove = this.ownerGlobal === tabOrSplitView.ownerGlobal -@@ -661,7 +742,7 @@ +@@ -661,7 +745,7 @@ */ on_click(event) { let isToggleElement = @@ -229,7 +235,7 @@ index 3ca119e8dc72fac652c98505211864483d98add2..026b524be51170882e788a701095b938 event.target === this.#overflowCountLabel; if (isToggleElement && event.button === 0) { event.preventDefault(); -@@ -740,5 +821,6 @@ +@@ -740,5 +824,6 @@ } } diff --git a/src/browser/installer/package-manifest-in.patch b/src/browser/installer/package-manifest-in.patch index 3aec7d9df..f07fcc3ac 100644 --- a/src/browser/installer/package-manifest-in.patch +++ b/src/browser/installer/package-manifest-in.patch @@ -1,18 +1,8 @@ diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in -index 36eafe35063f02fe3d4acaab24a08dc1b7b0ae24..951889b156498f66118d67d4245aca649e27a3a2 100644 +index 36eafe35063f02fe3d4acaab24a08dc1b7b0ae24..b6bf327bf286de5246e5c50d89519d16d5771caf 100644 --- a/browser/installer/package-manifest.in +++ b/browser/installer/package-manifest.in -@@ -378,17 +378,17 @@ bin/libfreebl_64int_3.so - ; [MaintenanceService] - ; - #ifdef MOZ_MAINTENANCE_SERVICE --@BINPATH@/maintenanceservice.exe --@BINPATH@/maintenanceservice_installer.exe -+;@BINPATH@/maintenanceservice.exe -+;@BINPATH@/maintenanceservice_installer.exe - #endif - - ; [Crash Reporter] +@@ -386,9 +386,9 @@ bin/libfreebl_64int_3.so ; #ifdef MOZ_CRASHREPORTER #ifdef XP_MACOSX diff --git a/src/browser/themes/shared/urlbar-searchbar-css.patch b/src/browser/themes/shared/urlbar-searchbar-css.patch index 416f79f84..9af6e9d75 100644 --- a/src/browser/themes/shared/urlbar-searchbar-css.patch +++ b/src/browser/themes/shared/urlbar-searchbar-css.patch @@ -1,5 +1,5 @@ diff --git a/browser/themes/shared/urlbar-searchbar.css b/browser/themes/shared/urlbar-searchbar.css -index cbbf55f31ae5e456401172f79ddbbe41256025a4..8cab0f2809a43c0aa4249453732eb0e006c2c676 100644 +index cbbf55f31ae5e456401172f79ddbbe41256025a4..dc471dfe30dedf7c4917322a5b2257a9ec9c4f90 100644 --- a/browser/themes/shared/urlbar-searchbar.css +++ b/browser/themes/shared/urlbar-searchbar.css @@ -10,7 +10,7 @@ @@ -25,7 +25,7 @@ index cbbf55f31ae5e456401172f79ddbbe41256025a4..8cab0f2809a43c0aa4249453732eb0e0 .urlbar[breakout][breakout-extend] { height: auto; + align-items: center; -+ :root:not([zen-single-toolbar='true']) { ++ :root:not([zen-single-toolbar='true']) & { margin-left: calc(-1 * var(--urlbar-margin-inline)); + } width: calc(var(--urlbar-width) + 2 * var(--urlbar-margin-inline)); diff --git a/src/browser/themes/shared/zen-icons/icons.css b/src/browser/themes/shared/zen-icons/icons.css index 6544689d3..5cea1393b 100644 --- a/src/browser/themes/shared/zen-icons/icons.css +++ b/src/browser/themes/shared/zen-icons/icons.css @@ -96,7 +96,9 @@ max-height: 16px; } -#appMenu-translate-button { +#appMenu-translate-button, +#translations-button-icon { + --urlbar-icon-fill-opacity: 0.6; list-style-image: url("translations.svg") !important; } diff --git a/src/browser/themes/shared/zen-icons/nucleo/algorithm.svg b/src/browser/themes/shared/zen-icons/nucleo/algorithm.svg index f4514168a..4594ea39f 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/algorithm.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/algorithm.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/arrow-down.svg b/src/browser/themes/shared/zen-icons/nucleo/arrow-down.svg index 5e0c26ca3..af570ec31 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/arrow-down.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/arrow-down.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/arrow-left.svg b/src/browser/themes/shared/zen-icons/nucleo/arrow-left.svg index 699b46edd..09a5dc028 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/arrow-left.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/arrow-left.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/arrow-right.svg b/src/browser/themes/shared/zen-icons/nucleo/arrow-right.svg index 6756d32bc..9cefe9a0a 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/arrow-right.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/arrow-right.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/arrow-up.svg b/src/browser/themes/shared/zen-icons/nucleo/arrow-up.svg index 27f801aeb..100fcab9d 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/arrow-up.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/arrow-up.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/autoplay-media-blocked.svg b/src/browser/themes/shared/zen-icons/nucleo/autoplay-media-blocked.svg index 81c05e0d4..65ba9fc5d 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/autoplay-media-blocked.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/autoplay-media-blocked.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/autoplay-media-fill.svg b/src/browser/themes/shared/zen-icons/nucleo/autoplay-media-fill.svg index 4522c6113..8de8fafd8 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/autoplay-media-fill.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/autoplay-media-fill.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/autoplay-media.svg b/src/browser/themes/shared/zen-icons/nucleo/autoplay-media.svg index debd55d00..2d970131d 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/autoplay-media.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/autoplay-media.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/back.svg b/src/browser/themes/shared/zen-icons/nucleo/back.svg index d8e53602b..1755318fb 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/back.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/back.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/bookmark-hollow.svg b/src/browser/themes/shared/zen-icons/nucleo/bookmark-hollow.svg index cc807d4b5..4c25b7b84 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/bookmark-hollow.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/bookmark-hollow.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/bookmark-star-on-tray.svg b/src/browser/themes/shared/zen-icons/nucleo/bookmark-star-on-tray.svg index 7fbd21601..166796c0f 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/bookmark-star-on-tray.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/bookmark-star-on-tray.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/bookmark.svg b/src/browser/themes/shared/zen-icons/nucleo/bookmark.svg index 4ad47f9fe..2fad2d376 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/bookmark.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/bookmark.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/camera-blocked.svg b/src/browser/themes/shared/zen-icons/nucleo/camera-blocked.svg index ff7a068ae..d0a58ee48 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/camera-blocked.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/camera-blocked.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/camera-fill.svg b/src/browser/themes/shared/zen-icons/nucleo/camera-fill.svg index 29264b05b..ac6efa506 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/camera-fill.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/camera-fill.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/camera.svg b/src/browser/themes/shared/zen-icons/nucleo/camera.svg index 712afcf21..5a49a2f80 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/camera.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/camera.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/canvas-blocked.svg b/src/browser/themes/shared/zen-icons/nucleo/canvas-blocked.svg index d3499066b..f012129e3 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/canvas-blocked.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/canvas-blocked.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/canvas.svg b/src/browser/themes/shared/zen-icons/nucleo/canvas.svg index 2d011ca40..3f22037f0 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/canvas.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/canvas.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/chevron.svg b/src/browser/themes/shared/zen-icons/nucleo/chevron.svg index 93ad1f2f2..97611dfce 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/chevron.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/chevron.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/close.svg b/src/browser/themes/shared/zen-icons/nucleo/close.svg index 682dc2a9a..dc4791118 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/close.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/close.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/container-tab.svg b/src/browser/themes/shared/zen-icons/nucleo/container-tab.svg index df1090238..97ea3578e 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/container-tab.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/container-tab.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/cookies-fill.svg b/src/browser/themes/shared/zen-icons/nucleo/cookies-fill.svg index 6b5ffcb58..3fb917399 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/cookies-fill.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/cookies-fill.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/customize.svg b/src/browser/themes/shared/zen-icons/nucleo/customize.svg index 8ce703086..1f8568882 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/customize.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/customize.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/dart-down.svg b/src/browser/themes/shared/zen-icons/nucleo/dart-down.svg index f338c2767..b8b5f8536 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/dart-down.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/dart-down.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/desktop-notification-blocked.svg b/src/browser/themes/shared/zen-icons/nucleo/desktop-notification-blocked.svg index 348998b89..e9c4bdd9d 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/desktop-notification-blocked.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/desktop-notification-blocked.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/desktop-notification-fill.svg b/src/browser/themes/shared/zen-icons/nucleo/desktop-notification-fill.svg index f17ecffa2..d18a8cb00 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/desktop-notification-fill.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/desktop-notification-fill.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/desktop-notification.svg b/src/browser/themes/shared/zen-icons/nucleo/desktop-notification.svg index 2a97be245..4b47aa250 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/desktop-notification.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/desktop-notification.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/developer.svg b/src/browser/themes/shared/zen-icons/nucleo/developer.svg index 25697fa7e..21cc6e2aa 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/developer.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/developer.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/downloads.svg b/src/browser/themes/shared/zen-icons/nucleo/downloads.svg index 65c677830..87aca2942 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/downloads.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/downloads.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/drag-indicator.svg b/src/browser/themes/shared/zen-icons/nucleo/drag-indicator.svg index daf42154c..845c93494 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/drag-indicator.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/drag-indicator.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/duplicate-tab.svg b/src/browser/themes/shared/zen-icons/nucleo/duplicate-tab.svg index 04facae18..806d411db 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/duplicate-tab.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/duplicate-tab.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/edit-copy.svg b/src/browser/themes/shared/zen-icons/nucleo/edit-copy.svg index 28a99ca70..c88606b77 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/edit-copy.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/edit-copy.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/edit-cut.svg b/src/browser/themes/shared/zen-icons/nucleo/edit-cut.svg index 9dc977d11..1c30ad18e 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/edit-cut.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/edit-cut.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/edit-delete.svg b/src/browser/themes/shared/zen-icons/nucleo/edit-delete.svg index e5a96abc8..c106d2db3 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/edit-delete.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/edit-delete.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/edit-paste.svg b/src/browser/themes/shared/zen-icons/nucleo/edit-paste.svg index b60422888..119b4f9b9 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/edit-paste.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/edit-paste.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/edit-theme.svg b/src/browser/themes/shared/zen-icons/nucleo/edit-theme.svg index 7eac7ca93..a949ad413 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/edit-theme.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/edit-theme.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/essential-add.svg b/src/browser/themes/shared/zen-icons/nucleo/essential-add.svg index 7f72f85d1..815e8cc7d 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/essential-add.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/essential-add.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/essential-remove.svg b/src/browser/themes/shared/zen-icons/nucleo/essential-remove.svg index 6f7d58e78..d43e32d98 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/essential-remove.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/essential-remove.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/expand-sidebar.svg b/src/browser/themes/shared/zen-icons/nucleo/expand-sidebar.svg index 1e1b34598..fd2f53f0a 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/expand-sidebar.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/expand-sidebar.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/extension-blocked.svg b/src/browser/themes/shared/zen-icons/nucleo/extension-blocked.svg index f6a9170ee..5a24a6931 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/extension-blocked.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/extension-blocked.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/extension-fill.svg b/src/browser/themes/shared/zen-icons/nucleo/extension-fill.svg index d94034e4d..562d4f6b4 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/extension-fill.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/extension-fill.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/extension.svg b/src/browser/themes/shared/zen-icons/nucleo/extension.svg index 1887eb430..a706c639f 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/extension.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/extension.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/face-sun.svg b/src/browser/themes/shared/zen-icons/nucleo/face-sun.svg index 09743afb1..9e989c0d9 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/face-sun.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/face-sun.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/folder.svg b/src/browser/themes/shared/zen-icons/nucleo/folder.svg index 76f4ec08e..4359e15ec 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/folder.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/folder.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/forget.svg b/src/browser/themes/shared/zen-icons/nucleo/forget.svg index d3fcb2765..534c190fc 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/forget.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/forget.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/forward.svg b/src/browser/themes/shared/zen-icons/nucleo/forward.svg index f079b67c3..7d169d790 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/forward.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/forward.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/fullscreen-exit.svg b/src/browser/themes/shared/zen-icons/nucleo/fullscreen-exit.svg index b099e610b..6df790b96 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/fullscreen-exit.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/fullscreen-exit.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/fullscreen.svg b/src/browser/themes/shared/zen-icons/nucleo/fullscreen.svg index f37907cd4..197955151 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/fullscreen.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/fullscreen.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/geo-blocked.svg b/src/browser/themes/shared/zen-icons/nucleo/geo-blocked.svg index d65cdc5ab..e3cbb283b 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/geo-blocked.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/geo-blocked.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/geo-fill.svg b/src/browser/themes/shared/zen-icons/nucleo/geo-fill.svg index 1813d46e4..4ff0589f3 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/geo-fill.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/geo-fill.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/geo.svg b/src/browser/themes/shared/zen-icons/nucleo/geo.svg index 49657477c..40b42baab 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/geo.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/geo.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/heart-circle-fill.svg b/src/browser/themes/shared/zen-icons/nucleo/heart-circle-fill.svg index 3457a757f..10a98896a 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/heart-circle-fill.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/heart-circle-fill.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/help.svg b/src/browser/themes/shared/zen-icons/nucleo/help.svg index cba6bc196..e5fb256db 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/help.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/help.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/history.svg b/src/browser/themes/shared/zen-icons/nucleo/history.svg index c5e7bcea9..267f03bb1 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/history.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/history.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/home.svg b/src/browser/themes/shared/zen-icons/nucleo/home.svg index 5b638db37..45e7017b2 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/home.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/home.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/info.svg b/src/browser/themes/shared/zen-icons/nucleo/info.svg index 34f4459dc..3a49e573b 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/info.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/info.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/library.svg b/src/browser/themes/shared/zen-icons/nucleo/library.svg index e5a520e5e..ad7acbea0 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/library.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/library.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/link.svg b/src/browser/themes/shared/zen-icons/nucleo/link.svg index 70d498a01..cb5530255 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/link.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/link.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/mail.svg b/src/browser/themes/shared/zen-icons/nucleo/mail.svg index 173f98aac..5d35fbab6 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/mail.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/mail.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/manage.svg b/src/browser/themes/shared/zen-icons/nucleo/manage.svg index bc5b89319..b280bfb2c 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/manage.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/manage.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/media-mute.svg b/src/browser/themes/shared/zen-icons/nucleo/media-mute.svg index 747136ecf..2919778f9 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/media-mute.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/media-mute.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/media-next.svg b/src/browser/themes/shared/zen-icons/nucleo/media-next.svg index c934347a6..fe3fecb6b 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/media-next.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/media-next.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/media-pause.svg b/src/browser/themes/shared/zen-icons/nucleo/media-pause.svg index dd6db9478..6b0e84500 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/media-pause.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/media-pause.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/media-play.svg b/src/browser/themes/shared/zen-icons/nucleo/media-play.svg index 2eb8d235f..ece7b0c35 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/media-play.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/media-play.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/media-previous.svg b/src/browser/themes/shared/zen-icons/nucleo/media-previous.svg index 6fc0e72f3..54ac78515 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/media-previous.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/media-previous.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/media-unmute.svg b/src/browser/themes/shared/zen-icons/nucleo/media-unmute.svg index 99c33a266..828cc1e51 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/media-unmute.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/media-unmute.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/menu.svg b/src/browser/themes/shared/zen-icons/nucleo/menu.svg index 553364a62..60a5fe231 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/menu.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/menu.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/microphone-blocked-fill.svg b/src/browser/themes/shared/zen-icons/nucleo/microphone-blocked-fill.svg index 9672461d5..53b52dad0 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/microphone-blocked-fill.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/microphone-blocked-fill.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/microphone-blocked.svg b/src/browser/themes/shared/zen-icons/nucleo/microphone-blocked.svg index b87298c2b..8a6d9a187 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/microphone-blocked.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/microphone-blocked.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/microphone-fill.svg b/src/browser/themes/shared/zen-icons/nucleo/microphone-fill.svg index 3a254649a..67c2e4f02 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/microphone-fill.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/microphone-fill.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/microphone.svg b/src/browser/themes/shared/zen-icons/nucleo/microphone.svg index 0d22847bf..69b35004f 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/microphone.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/microphone.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/midi.svg b/src/browser/themes/shared/zen-icons/nucleo/midi.svg index 1f464fad7..ca5660a70 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/midi.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/midi.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/moon-stars.svg b/src/browser/themes/shared/zen-icons/nucleo/moon-stars.svg index 56b7cf243..523323b51 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/moon-stars.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/moon-stars.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/new-tab-image.svg b/src/browser/themes/shared/zen-icons/nucleo/new-tab-image.svg index 632d9cc11..76ad06602 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/new-tab-image.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/new-tab-image.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/open.svg b/src/browser/themes/shared/zen-icons/nucleo/open.svg index abc191e15..ecb782117 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/open.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/open.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/page-portrait.svg b/src/browser/themes/shared/zen-icons/nucleo/page-portrait.svg index 364d712c9..4305f13f1 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/page-portrait.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/page-portrait.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/palette.svg b/src/browser/themes/shared/zen-icons/nucleo/palette.svg index 8eff0c8a9..86311017c 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/palette.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/palette.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/passwords.svg b/src/browser/themes/shared/zen-icons/nucleo/passwords.svg index 997311848..c5134f8d8 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/passwords.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/passwords.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/permissions-fill.svg b/src/browser/themes/shared/zen-icons/nucleo/permissions-fill.svg index d6366878e..8fea9f6dd 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/permissions-fill.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/permissions-fill.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/permissions.svg b/src/browser/themes/shared/zen-icons/nucleo/permissions.svg index 29d2475b4..670958d43 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/permissions.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/permissions.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/persistent-storage-blocked.svg b/src/browser/themes/shared/zen-icons/nucleo/persistent-storage-blocked.svg index f6a9170ee..5a24a6931 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/persistent-storage-blocked.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/persistent-storage-blocked.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/persistent-storage-fill.svg b/src/browser/themes/shared/zen-icons/nucleo/persistent-storage-fill.svg index f9508d46c..46bf4c7b1 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/persistent-storage-fill.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/persistent-storage-fill.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/persistent-storage.svg b/src/browser/themes/shared/zen-icons/nucleo/persistent-storage.svg index a9286a712..f67adadbc 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/persistent-storage.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/persistent-storage.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/pin.svg b/src/browser/themes/shared/zen-icons/nucleo/pin.svg index f52884e9c..c9b7956e2 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/pin.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/pin.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/plus.svg b/src/browser/themes/shared/zen-icons/nucleo/plus.svg index 6dbeca893..73b9e148f 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/plus.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/plus.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/popup-fill.svg b/src/browser/themes/shared/zen-icons/nucleo/popup-fill.svg index 24e246664..613e790e1 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/popup-fill.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/popup-fill.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/popup.svg b/src/browser/themes/shared/zen-icons/nucleo/popup.svg index d560848ea..985630a5c 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/popup.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/popup.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/print.svg b/src/browser/themes/shared/zen-icons/nucleo/print.svg index df41f9088..675345d5f 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/print.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/print.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/private-window.svg b/src/browser/themes/shared/zen-icons/nucleo/private-window.svg index 1610af628..9941ac6c8 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/private-window.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/private-window.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/privateBrowsing.svg b/src/browser/themes/shared/zen-icons/nucleo/privateBrowsing.svg index edc485a72..9941ac6c8 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/privateBrowsing.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/privateBrowsing.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/reader-mode.svg b/src/browser/themes/shared/zen-icons/nucleo/reader-mode.svg index 033cb82e6..bbfbf0532 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/reader-mode.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/reader-mode.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/reload.svg b/src/browser/themes/shared/zen-icons/nucleo/reload.svg index a16acd3a8..b48cd26d4 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/reload.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/reload.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/save.svg b/src/browser/themes/shared/zen-icons/nucleo/save.svg index 35544ad70..eeb0be9e3 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/save.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/save.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/screen-blocked.svg b/src/browser/themes/shared/zen-icons/nucleo/screen-blocked.svg index 8e8a065a6..1a8f858ad 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/screen-blocked.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/screen-blocked.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/screen.svg b/src/browser/themes/shared/zen-icons/nucleo/screen.svg index 41d102c49..3eaad0394 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/screen.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/screen.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/screenshot.svg b/src/browser/themes/shared/zen-icons/nucleo/screenshot.svg index 60f1a3218..ab59fe5fb 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/screenshot.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/screenshot.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/search-glass.svg b/src/browser/themes/shared/zen-icons/nucleo/search-glass.svg index 5b7f6e579..05181f39a 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/search-glass.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/search-glass.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/search-page.svg b/src/browser/themes/shared/zen-icons/nucleo/search-page.svg index 25f5a9b4c..b5afcb418 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/search-page.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/search-page.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/security-broken.svg b/src/browser/themes/shared/zen-icons/nucleo/security-broken.svg index 5027043a8..704c7440a 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/security-broken.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/security-broken.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/security-warning.svg b/src/browser/themes/shared/zen-icons/nucleo/security-warning.svg index 48e62f68c..fb1c7a4a6 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/security-warning.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/security-warning.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/security.svg b/src/browser/themes/shared/zen-icons/nucleo/security.svg index 2c8e94752..d0d8a5831 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/security.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/security.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/send-to-device.svg b/src/browser/themes/shared/zen-icons/nucleo/send-to-device.svg index 61c3d2a55..47f4831fc 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/send-to-device.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/send-to-device.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/settings-fill.svg b/src/browser/themes/shared/zen-icons/nucleo/settings-fill.svg index 725a26427..88595365e 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/settings-fill.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/settings-fill.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/settings.svg b/src/browser/themes/shared/zen-icons/nucleo/settings.svg index 99a067a22..9eac58174 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/settings.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/settings.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/share.svg b/src/browser/themes/shared/zen-icons/nucleo/share.svg index 67ce16621..124307efb 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/share.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/share.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/sidebar-right.svg b/src/browser/themes/shared/zen-icons/nucleo/sidebar-right.svg index 19a32e735..1256a3997 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/sidebar-right.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/sidebar-right.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/sidebar.svg b/src/browser/themes/shared/zen-icons/nucleo/sidebar.svg index bb27965dd..b5a095f80 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/sidebar.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/sidebar.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/sidebars-right.svg b/src/browser/themes/shared/zen-icons/nucleo/sidebars-right.svg index 82df4c0ab..77be9acda 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/sidebars-right.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/sidebars-right.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/sparkles.svg b/src/browser/themes/shared/zen-icons/nucleo/sparkles.svg index 360cb6df6..3fa7f008c 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/sparkles.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/sparkles.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/spell-check.svg b/src/browser/themes/shared/zen-icons/nucleo/spell-check.svg index fda83e401..b2bc07dac 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/spell-check.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/spell-check.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/split.svg b/src/browser/themes/shared/zen-icons/nucleo/split.svg index aa9ff7355..6843842ae 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/split.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/split.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/tab-audio-blocked-small.svg b/src/browser/themes/shared/zen-icons/nucleo/tab-audio-blocked-small.svg index 36b89213d..1a157f720 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/tab-audio-blocked-small.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/tab-audio-blocked-small.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/tab-audio-muted-small.svg b/src/browser/themes/shared/zen-icons/nucleo/tab-audio-muted-small.svg index c3d676dfa..503b7cae5 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/tab-audio-muted-small.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/tab-audio-muted-small.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/tab-audio-playing-small.svg b/src/browser/themes/shared/zen-icons/nucleo/tab-audio-playing-small.svg index 6708ff93e..371f0b12e 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/tab-audio-playing-small.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/tab-audio-playing-small.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/tab.svg b/src/browser/themes/shared/zen-icons/nucleo/tab.svg index d541b0249..154b67429 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/tab.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/tab.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/tool-profiler.svg b/src/browser/themes/shared/zen-icons/nucleo/tool-profiler.svg index 8af76d2ee..741f98727 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/tool-profiler.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/tool-profiler.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/tracking-protection-fill.svg b/src/browser/themes/shared/zen-icons/nucleo/tracking-protection-fill.svg index acf96caf6..49f889a99 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/tracking-protection-fill.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/tracking-protection-fill.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/tracking-protection.svg b/src/browser/themes/shared/zen-icons/nucleo/tracking-protection.svg index 52e6c3e04..7e9ee6b6a 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/tracking-protection.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/tracking-protection.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/translations.svg b/src/browser/themes/shared/zen-icons/nucleo/translations.svg index d805e3d21..f32d848ca 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/translations.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/translations.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/trash.svg b/src/browser/themes/shared/zen-icons/nucleo/trash.svg index 4a285a230..97fa8c232 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/trash.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/trash.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/unpin.svg b/src/browser/themes/shared/zen-icons/nucleo/unpin.svg index 227e9a2e8..aec72314c 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/unpin.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/unpin.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/video-blocked-fill.svg b/src/browser/themes/shared/zen-icons/nucleo/video-blocked-fill.svg index dc380422b..741e8b98a 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/video-blocked-fill.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/video-blocked-fill.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/video-fill.svg b/src/browser/themes/shared/zen-icons/nucleo/video-fill.svg index 90703d751..8262338e7 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/video-fill.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/video-fill.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/window.svg b/src/browser/themes/shared/zen-icons/nucleo/window.svg index 632d9cc11..7f00409e9 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/window.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/window.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/xr-blocked.svg b/src/browser/themes/shared/zen-icons/nucleo/xr-blocked.svg index 11a1fde71..2340b2eab 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/xr-blocked.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/xr-blocked.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/xr-fill.svg b/src/browser/themes/shared/zen-icons/nucleo/xr-fill.svg index 5ed058840..4719b3174 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/xr-fill.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/xr-fill.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/xr.svg b/src/browser/themes/shared/zen-icons/nucleo/xr.svg index e83a1577a..5a38091ce 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/xr.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/xr.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/nucleo/zoom-out.svg b/src/browser/themes/shared/zen-icons/nucleo/zoom-out.svg index 227e9a2e8..aec72314c 100644 --- a/src/browser/themes/shared/zen-icons/nucleo/zoom-out.svg +++ b/src/browser/themes/shared/zen-icons/nucleo/zoom-out.svg @@ -2,4 +2,4 @@ # 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/. - \ No newline at end of file + diff --git a/src/browser/themes/shared/zen-icons/update-resources.sh b/src/browser/themes/shared/zen-icons/update-resources.sh index ee4bea86a..33a6ef63d 100755 --- a/src/browser/themes/shared/zen-icons/update-resources.sh +++ b/src/browser/themes/shared/zen-icons/update-resources.sh @@ -31,47 +31,10 @@ add_header_to_file() { fi } -merge_svg_paths() { - # Remove all lines starting with "#" so we can use a valid svg file - file="$1" - echo "Merging paths in $file" - temp_file=${file}.tmp.svg - grep -v '^#' "$file" > $temp_file && mv $temp_file "$file" - # migrate the svg attributes such as fill and fill-opacity, stroke, etc to the svg tag - fill_attr=$(grep -o 'fill="[^"]*"' "$file" | head -n 1) - fill_opacity_attr=$(grep -o 'fill-opacity="[^"]*"' "$file" | head -n 1) - stroke_attr=$(grep -o 'stroke="[^"]*"' "$file" | head -n 1) - stroke_width_attr=$(grep -o 'stroke-width="[^"]*"' "$file" | head -n 1) - stroke_opacity_attr=$(grep -o 'stroke-opacity="[^"]*"' "$file" | head -n 1) - # Check if the file is in the do_not_optimize list - if [[ " ${do_not_optimize[@]} " =~ " $(basename $file) " ]]; then - echo "Skipping optimization for $file" - return - fi - # Use inkscape to merge all paths into one - inkscape "$file" --actions="select-all;object-to-path;select-all;path-combine" --export-plain-svg --export-filename="${temp_file}" - # optimize the svg - npx svgo --multipass "${temp_file}" --config=../../../../../svgo.config.js - # add the attributes to the svg tag - sed -i '' "s/ $temp_file - echo "# License, v. 2.0. If a copy of the MPL was not distributed with this" >> $temp_file - echo "# file, You can obtain one at http://mozilla.org/MPL/2.0/." >> $temp_file - cat "$file" >> $temp_file - mv "$temp_file" "$file" -} - do_icons() { system=$1 preprocessed_os=$2 echo "#ifdef XP_$preprocessed_os" >> jar.inc.mn - for filename in $system/*.svg; do - # make it a sub-process so we can do this process faster - merge_svg_paths $filename & - done wait # wait for all background processes to finish for filename in $system/*.svg; do echo "Working on $filename" @@ -87,12 +50,14 @@ do_common_icons() { # remove the os/ prefix add_header_to_file $filename filename=$(basename $filename) + echo "Working on $filename" echo "* skin/classic/browser/zen-icons/$filename (../shared/zen-icons/common/$filename) " >> jar.inc.mn done for filename in common/selectable/*.svg; do # remove the os/ prefix add_header_to_file $filename filename=$(basename $filename) + echo "Working on $filename" echo "* skin/classic/browser/zen-icons/selectable/$filename (../shared/zen-icons/common/selectable/$filename) " >> jar.inc.mn done } diff --git a/src/dom/base/Document-cpp.patch b/src/dom/base/Document-cpp.patch index 665d7a948..79ca8e065 100644 --- a/src/dom/base/Document-cpp.patch +++ b/src/dom/base/Document-cpp.patch @@ -1,5 +1,5 @@ diff --git a/dom/base/Document.cpp b/dom/base/Document.cpp -index b837e66d4fd5b6a96ad3d9c35f8e50e911cd168b..c35a395da59fc30d70b1e05b94db41b7136db0de 100644 +index 2876a539b21c038340d318d8f0d29da88c518686..1f6bbf828b86dc509f63c7c3d0032f1d4d551d9c 100644 --- a/dom/base/Document.cpp +++ b/dom/base/Document.cpp @@ -464,6 +464,7 @@ diff --git a/src/dom/chrome-webidl/MediaController-webidl.patch b/src/dom/chrome-webidl/MediaController-webidl.patch index d7c868534..3548fa9b6 100644 --- a/src/dom/chrome-webidl/MediaController-webidl.patch +++ b/src/dom/chrome-webidl/MediaController-webidl.patch @@ -1,5 +1,5 @@ diff --git a/dom/chrome-webidl/MediaController.webidl b/dom/chrome-webidl/MediaController.webidl -index 20f416d1c3b41798e0f90bbac5db40ed2a4ab000..1c5d893f9166a3aa7bc7802bb0d1207d169033ee 100644 +index 2df28da9620f8564edb3e77184c674a95941e022..4e2a126766999543422d3a90c66c629f46b58bda 100644 --- a/dom/chrome-webidl/MediaController.webidl +++ b/dom/chrome-webidl/MediaController.webidl @@ -20,6 +20,12 @@ enum MediaControlKey { @@ -15,9 +15,9 @@ index 20f416d1c3b41798e0f90bbac5db40ed2a4ab000..1c5d893f9166a3aa7bc7802bb0d1207d /** * MediaController is used to control media playback for a tab, and each tab * would only have one media controller, which can be accessed from the -@@ -32,10 +38,14 @@ interface MediaController : EventTarget { - readonly attribute boolean isAudible; +@@ -33,10 +39,14 @@ interface MediaController : EventTarget { readonly attribute boolean isPlaying; + readonly attribute boolean isAnyMediaBeingControlled; readonly attribute MediaSessionPlaybackState playbackState; + readonly attribute boolean isBeingUsedInPIPModeOrFullscreen; diff --git a/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch b/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch index 0df960077..e65990ad5 100644 --- a/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch +++ b/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch @@ -1,5 +1,5 @@ diff --git a/dom/media/mediaelement/HTMLMediaElement.cpp b/dom/media/mediaelement/HTMLMediaElement.cpp -index 624375b514cb0b101ae24bb5906d0097d4b335db..27c91b01db611a0cd75b20907310d2fa4c8a1b47 100644 +index b5b932e421894f33e1397149dcc580f891329cbc..ffc3fb68e01a0c11a3ebbbd7793e682d8dc6be47 100644 --- a/dom/media/mediaelement/HTMLMediaElement.cpp +++ b/dom/media/mediaelement/HTMLMediaElement.cpp @@ -451,6 +451,7 @@ class HTMLMediaElement::MediaControlKeyListener final diff --git a/src/external-patches/firefox/ff150_1_pgo_patch_for_bug-1962418.patch b/src/external-patches/firefox/ff150_1_pgo_patch_for_bug-1962418.patch new file mode 100644 index 000000000..efe430372 --- /dev/null +++ b/src/external-patches/firefox/ff150_1_pgo_patch_for_bug-1962418.patch @@ -0,0 +1,441 @@ +diff --git a/build/pgo/index.html b/build/pgo/index.html +--- a/build/pgo/index.html ++++ b/build/pgo/index.html +@@ -3,11 +3,50 @@ + * 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/. */ + + /* global Quitter */ + +- var list = [ ++ var defaultTimeout = 2 * 1000; ++ var extendedTimeout = 2 * 60 * 1000; ++ var superExtendedTimeout = 5 * 60 * 1000; ++ var hasExtendedCorpus = ++ new URLSearchParams(location.search).get("extendedCorpus") == "true"; ++ ++ function waitTimeout(time) { ++ return new Promise(resolve => { ++ window.setTimeout(() => { ++ resolve(); ++ }, time); ++ }); ++ } ++ ++ /** ++ * An item in the PGO training corpus ++ */ ++ class Item { ++ url; ++ timeout; ++ ++ constructor(url, timeout = defaultTimeout) { ++ this.url = url; ++ this.timeout = timeout; ++ } ++ ++ async run() { ++ var subWindow = window.open(this.url); ++ ++ // Prevent the perf-reftest-singletons from calling alert() ++ subWindow.tpRecordTime = function () {}; ++ ++ // Wait until the timeout is finished ++ await waitTimeout(this.timeout); ++ ++ subWindow.close(); ++ } ++ } ++ ++ var defaultItemUrls = [ + "blueprint/elements.html", + "blueprint/forms.html", + "blueprint/grid.html", + "blueprint/sample.html", + "js-input/3d-thingy.html", +@@ -72,42 +111,46 @@ + "talos/tests/perf-reftest-singletons/style-sharing.html", + "talos/tests/perf-reftest-singletons/svg-text-textLength-1.html", + "talos/tests/perf-reftest-singletons/svg-text-getExtentOfChar-1.html", + "talos/tests/perf-reftest-singletons/tiny-traversal-singleton.html", + "talos/tests/perf-reftest-singletons/window-named-property-get.html", +- "webkit/PerformanceTests/Speedometer/index.html", +- "http://localhost:8000/index.html?startAutomatically=true", +- "webkit/PerformanceTests/webaudio/index.html?raptor&rendering-buffer-length=30", + ]; +- var defaultInterval = 2000; +- var idx = 0; +- var w; + +- window.onload = function () { +- w = window.open("about:blank"); +- window.setTimeout(loadURL, defaultInterval); +- }; +- function loadURL() { +- var interval = defaultInterval; +- var testURL = list[idx++]; +- if (testURL.includes("webkit") || testURL.includes("localhost")) { +- interval = 120000; +- } +- w.close(); +- w = window.open(testURL); +- // Prevent the perf-reftest-singletons from calling alert() +- w.tpRecordTime = function () {}; ++ // Start with items with the default timeout ++ var items = defaultItemUrls.map(x => new Item(x)); + +- if (idx < list.length) { +- window.setTimeout(loadURL, interval); +- } else { +- window.setTimeout(Quitter.quit, interval); +- } ++ // Add items that needs longer timeouts ++ items.push( ++ new Item("webkit/PerformanceTests/Speedometer/index.html", extendedTimeout), ++ new Item( ++ "http://localhost:8000/index.html?startAutomatically=true", ++ extendedTimeout ++ ), ++ new Item( ++ "webkit/PerformanceTests/webaudio/index.html?raptor&rendering-buffer-length=30", ++ extendedTimeout ++ ) ++ ); ++ ++ // Add optional items if there is a 'pgo-extended-corpus' provided ++ if (hasExtendedCorpus) { ++ items.push( ++ new Item( ++ "http://localhost:8001/index.html?startAutomatically=true&testIterationCount=3&worstCaseCount=1", ++ superExtendedTimeout ++ ) ++ ); + } +- var i; + +- for (i = 0; i < list.length; i++) { ++ window.onload = async function () { ++ for (let item of items) { ++ await item.run(); ++ } ++ Quitter.quit(); ++ }; ++ ++ for (let item of items) { + // eslint-disable-next-line no-unsanitized/method +- document.write(list[i]); ++ document.write(item.url); + document.write("
"); + } + +diff --git a/build/pgo/profileserver.py b/build/pgo/profileserver.py +--- a/build/pgo/profileserver.py ++++ b/build/pgo/profileserver.py +@@ -56,12 +56,33 @@ + test_name=name, + ) + return rc + + ++class ProfileServerCLI(CLI): ++ def __init__(self, args=sys.argv[1:]): ++ CLI.__init__(self, args=args) ++ ++ def add_options(self, parser): ++ CLI.add_options(self, parser) ++ ++ # add profileserver options ++ parser.add_option( ++ "-e", ++ "--extended-corpus", ++ dest="extended_corpus_dir", ++ help="Directory of the optional extended corpus.", ++ metavar=None, ++ default=None, ++ ) ++ ++ def extended_corpus_dir(self): ++ return self.options.extended_corpus_dir ++ ++ + if __name__ == "__main__": +- cli = CLI() ++ cli = ProfileServerCLI() + debug_args, interactive = cli.debugger_arguments() + runner_args = cli.runner_args() + + build = MozbuildObject.from_environment() + +@@ -72,29 +93,51 @@ + except BinaryNotFoundException as e: + print(f"{e}\n\n{e.help()}\n") + sys.exit(1) + binary = os.path.normpath(os.path.abspath(binary)) + ++ extended_corpus_dir = cli.extended_corpus_dir() ++ has_extended_corpus = extended_corpus_dir is not None ++ + path_mappings = { + k: os.path.join(build.topsrcdir, v) for k, v in PATH_MAPPINGS.items() + } + httpd = MozHttpd( + port=PORT, + docroot=os.path.join(build.topsrcdir, "build", "pgo"), + path_mappings=path_mappings, + ) + httpd.start(block=False) + ++ # Speedometer3 must run in its own server. The benchmark assumes that it ++ # is in a root path, and will fail if it's not. + sp3_httpd = MozHttpd( + port=8000, + docroot=os.path.join( + build.topsrcdir, "third_party", "webkit", "PerformanceTests", "Speedometer3" + ), + path_mappings=path_mappings, + ) + sp3_httpd.start(block=False) + print("started SP3 server on port 8000") ++ ++ if has_extended_corpus: ++ js3_dir = os.path.join(extended_corpus_dir, "JetStream") ++ ++ if not os.path.exists(js3_dir): ++ print(f"Error: JetStream directory does not exist at {js3_dir}") ++ sys.exit(1) ++ ++ # JetStream3 must run in its own server. The benchmark assumes that it ++ # is in a root path, and will fail if it's not. ++ js3_httpd = MozHttpd( ++ port=8001, ++ docroot=js3_dir, ++ ) ++ js3_httpd.start(block=False) ++ print("started JS3 server on port 8001") ++ + locations = ServerLocations() + locations.add_host(host="127.0.0.1", port=PORT, options="primary,privileged") + + old_profraw_files = glob.glob("*.profraw") + for f in old_profraw_files: +@@ -167,10 +210,12 @@ + if logfile: + print("Firefox output (%s):" % logfile) + with open(logfile) as f: + print(f.read()) + sp3_httpd.stop() ++ if has_extended_corpus: ++ js3_httpd.stop() + httpd.stop() + get_crashreports(profilePath, name="Profile initialization") + sys.exit(ret) + + jarlog = os.getenv("JARLOG_FILE") +@@ -182,21 +227,26 @@ + + if "UPLOAD_PATH" in env: + process_args["logfile"] = os.path.join( + env["UPLOAD_PATH"], "profile-run-2.log" + ) +- cmdargs = ["http://localhost:%d/index.html" % PORT] ++ cmdargs = [ ++ "http://localhost:%d/index.html?extendedCorpus=%s" ++ % (PORT, str(has_extended_corpus).lower()) ++ ] + runner = FirefoxRunner( + profile=profile, + binary=binary, + cmdargs=cmdargs, + env=env, + process_args=process_args, + ) + runner.start(debug_args=debug_args, interactive=interactive) + ret = runner.wait() + sp3_httpd.stop() ++ if has_extended_corpus: ++ js3_httpd.stop() + httpd.stop() + if ret: + print("Firefox exited with code %d during profiling" % ret) + logfile = process_args.get("logfile") + if logfile: +diff --git a/python/mozbuild/mozbuild/build_commands.py b/python/mozbuild/mozbuild/build_commands.py +--- a/python/mozbuild/mozbuild/build_commands.py ++++ b/python/mozbuild/mozbuild/build_commands.py +@@ -10,10 +10,11 @@ + + import mozpack.path as mozpath + from mach.decorators import Command, CommandArgument + + from mozbuild.backend import backends ++from mozbuild.bootstrap import bootstrap_toolchain + from mozbuild.mozconfig import MozconfigLoader + from mozbuild.util import ( + MOZBUILD_METRICS_PATH, + ensure_l10n_central, + get_latest_file, +@@ -275,10 +276,21 @@ + raise Exception("Cannot specify targets (%s) in MOZ_PGO=1 builds" % what) + instr = command_context._spawn(BuildDriver) + orig_topobjdir = instr._topobjdir + instr._topobjdir = mozpath.join(instr._topobjdir, "instrumented") + ++ # Allow opt-in of using the pgo-extended-corpus ++ use_extended_corpus = ( ++ configure_args and "MOZ_PGO_EXTENDED_CORPUS=1" in configure_args ++ ) ++ ++ # Get the location of the pgo-extended-corpus, if we are using it ++ if use_extended_corpus: ++ pgo_extended_corpus = bootstrap_toolchain("pgo-extended-corpus") ++ if not pgo_extended_corpus: ++ raise Exception("Cannot find pgo-extended-corpus.") ++ + append_env = {"MOZ_PROFILE_GENERATE": "1"} + status = instr.build( + command_context.metrics, + what=what, + jobs=jobs, +@@ -312,10 +324,13 @@ + pgo_env["JARLOG_FILE"] = mozpath.join(orig_topobjdir, "jarlog/en-US.log") + pgo_cmd = [ + command_context.virtualenv_manager.python_path, + mozpath.join(command_context.topsrcdir, "build/pgo/profileserver.py"), + ] ++ if use_extended_corpus: ++ pgo_cmd.extend(["--extended-corpus", str(pgo_extended_corpus)]) ++ + subprocess.check_call(pgo_cmd, cwd=instr.topobjdir, env=pgo_env) + + # Set the default build to MOZ_PROFILE_USE + append_env = {"MOZ_PROFILE_USE": "1"} + +diff --git a/taskcluster/kinds/fetch/benchmarks.yml b/taskcluster/kinds/fetch/benchmarks.yml +--- a/taskcluster/kinds/fetch/benchmarks.yml ++++ b/taskcluster/kinds/fetch/benchmarks.yml +@@ -15,5 +15,22 @@ + fetch: + type: static-url + url: https://github.com/mozilla/perf-automation/releases/download/V1/web-tooling-benchmark-b2ac25c897c9.zip + sha256: 93b0b51df0cec3ca9bfa0bdf81d782306dcf18532e39b3ff3180409125daaff1 + size: 5444135 ++ ++# A collection of benchmarks for use in PGO profiling runs. Currently it is ++# just JetStream3. ++# ++# Keep this in sync with the version used in performance testing by updating: ++# 1. `testing/raptor/raptor/tests/benchmarks/jetstream3-desktop.toml` ++# 2. `testing/raptor/raptor/tests/benchmarks/jetstream3-mobile.toml` ++pgo-extended-corpus: ++ description: JetStream3 benchmark suite ++ fetch: ++ type: static-url ++ url: https://github.com/WebKit/JetStream/archive/a3f5c45465f5271bed385321a0587bd4202682d6.tar.gz ++ sha256: 0af66b94bfbc2eb67cbe6c30bbafd13d7789f8f8623d308783194934601b5fdd ++ size: 194426956 ++ artifact-name: pgo-extended-corpus.tar.zst ++ strip-components: 1 ++ add-prefix: pgo-extended-corpus/JetStream/ +diff --git a/taskcluster/kinds/generate-profile/kind.yml b/taskcluster/kinds/generate-profile/kind.yml +--- a/taskcluster/kinds/generate-profile/kind.yml ++++ b/taskcluster/kinds/generate-profile/kind.yml +@@ -3,10 +3,11 @@ + # file, You can obtain one at http://mozilla.org/MPL/2.0/. + --- + loader: taskgraph.loader.transform:loader + + kind-dependencies: ++ - fetch + - toolchain + - instrumented-build + + transforms: + - gecko_taskgraph.transforms.build_attrs:transforms +@@ -22,10 +23,13 @@ + treeherder: + symbol: Bpgo(run) + kind: build + tier: 1 + use-python: default ++ fetches: ++ fetch: ++ - pgo-extended-corpus + + tasks: + linux64-shippable/opt: + description: "Linux64 Profile Generation" + shipping-phase: build +diff --git a/taskcluster/scripts/misc/run-profileserver-macos.sh b/taskcluster/scripts/misc/run-profileserver-macos.sh +--- a/taskcluster/scripts/misc/run-profileserver-macos.sh ++++ b/taskcluster/scripts/misc/run-profileserver-macos.sh +@@ -13,8 +13,8 @@ + export LLVM_PROFDATA=$MOZ_FETCHES_DIR/clang/bin/llvm-profdata + + set -v + + ./mach python python/mozbuild/mozbuild/action/install.py $MOZ_FETCHES_DIR/target.dmg $MOZ_FETCHES_DIR +-./mach python build/pgo/profileserver.py --binary $MOZ_FETCHES_DIR/*.app/Contents/MacOS/firefox ++./mach python build/pgo/profileserver.py --binary $MOZ_FETCHES_DIR/*.app/Contents/MacOS/firefox --extended-corpus $MOZ_FETCHES_DIR/pgo-extended-corpus/ + + tar -Jcvf $UPLOAD_PATH/profdata.tar.xz merged.profdata en-US.log +diff --git a/taskcluster/scripts/misc/run-profileserver.sh b/taskcluster/scripts/misc/run-profileserver.sh +--- a/taskcluster/scripts/misc/run-profileserver.sh ++++ b/taskcluster/scripts/misc/run-profileserver.sh +@@ -35,8 +35,8 @@ + # Move our fetched firefox into objdir/dist so the jarlog entries will match + # the paths when the final PGO stage packages the build. + mkdir -p $PGO_RUNDIR + mkdir -p $UPLOAD_PATH + mv $MOZ_FETCHES_DIR/firefox $PGO_RUNDIR +-./mach python build/pgo/profileserver.py --binary $PGO_RUNDIR/firefox/firefox ++./mach python build/pgo/profileserver.py --binary $PGO_RUNDIR/firefox/firefox --extended-corpus $MOZ_FETCHES_DIR/pgo-extended-corpus/ + + tar -acvf $UPLOAD_PATH/profdata.tar.xz merged.profdata en-US.log +diff --git a/testing/mozharness/scripts/android_emulator_pgo.py b/testing/mozharness/scripts/android_emulator_pgo.py +--- a/testing/mozharness/scripts/android_emulator_pgo.py ++++ b/testing/mozharness/scripts/android_emulator_pgo.py +@@ -22,10 +22,11 @@ + from mozharness.mozilla.testing.testbase import TestingMixin, testing_config_options + + PAGES = [ + "js-input/webkit/PerformanceTests/Speedometer/index.html", + "js-input/webkit/PerformanceTests/Speedometer3/index.html?startAutomatically=true", ++ # TODO: Add support for the pgo-extended-corpus to get JetStream3 running here. + "blueprint/sample.html", + "blueprint/forms.html", + "blueprint/grid.html", + "blueprint/elements.html", + "js-input/3d-thingy.html", +diff --git a/testing/raptor/raptor/tests/benchmarks/jetstream3-desktop.toml b/testing/raptor/raptor/tests/benchmarks/jetstream3-desktop.toml +--- a/testing/raptor/raptor/tests/benchmarks/jetstream3-desktop.toml ++++ b/testing/raptor/raptor/tests/benchmarks/jetstream3-desktop.toml +@@ -14,10 +14,12 @@ + test_url = "http://:/" + type = "benchmark" + unit = "score" + support_class = "jetstream3.py" + repository = "https://github.com/webkit/jetstream" ++# Keep this in sync with the version used in PGO instrumentation by updating ++# `taskcluster/kinds/fetch/benchmarks.yml`. + repository_revision = "a3f5c45465f5271bed385321a0587bd4202682d6" + test_script = "jetstream3.js" + + ["jetstream3"] + suite_name = "JetStream3.0" +diff --git a/testing/raptor/raptor/tests/benchmarks/jetstream3-mobile.toml b/testing/raptor/raptor/tests/benchmarks/jetstream3-mobile.toml +--- a/testing/raptor/raptor/tests/benchmarks/jetstream3-mobile.toml ++++ b/testing/raptor/raptor/tests/benchmarks/jetstream3-mobile.toml +@@ -19,10 +19,12 @@ + test_url = "http://:/" + type = "benchmark" + unit = "score" + support_class = "jetstream3.py" + repository = "https://github.com/webkit/jetstream" ++# Keep this in sync with the version used in PGO instrumentation by updating ++# `taskcluster/kinds/fetch/benchmarks.yml`. + repository_revision = "a3f5c45465f5271bed385321a0587bd4202682d6" + test_script = "jetstream3.js" + + ["jetstream3"] + suite_name = "JetStream3.0" + diff --git a/src/external-patches/firefox/ff150_2_pgo_patch_for_bug-2011620.patch b/src/external-patches/firefox/ff150_2_pgo_patch_for_bug-2011620.patch new file mode 100644 index 000000000..da9579a02 --- /dev/null +++ b/src/external-patches/firefox/ff150_2_pgo_patch_for_bug-2011620.patch @@ -0,0 +1,409 @@ +diff --git a/build/pgo/index.html b/build/pgo/index.html +--- a/build/pgo/index.html ++++ b/build/pgo/index.html +@@ -10,10 +10,11 @@ + "blueprint/forms.html", + "blueprint/grid.html", + "blueprint/sample.html", + "js-input/3d-thingy.html", + "js-input/crypto-otp.html", ++ "js-input/normalizer_bench.html", + "js-input/sunspider/3d-cube.html", + "js-input/sunspider/3d-morph.html", + "js-input/sunspider/3d-raytrace.html", + "js-input/sunspider/access-binary-trees.html", + "js-input/sunspider/access-fannkuch.html", +diff --git a/build/pgo/js-input/normalizer_bench.html b/build/pgo/js-input/normalizer_bench.html +new file mode 100644 +--- /dev/null ++++ b/build/pgo/js-input/normalizer_bench.html +@@ -0,0 +1,358 @@ ++ ++ ++ ++ ++Normalizer bench ++ ++

Normalizer Bench

++
++
S
++
Short: NFD fits in 32 UTF-16 code units. French and German are adjusted to take a substring that contains a non-ASCII character. (Long input contains the same information in each language instead of having a fixed UTF-16 length.)
++
L
++
Latin1.
++
U
++
Forced UTF-16 form for Latin1 languages. (One non-Latin1 character added to the string.)
++
W
++
Forced write: In the UTF-16 case, a singleton is prepended to force the normalizer to start writing from the start. In the Latin1 case, a character with a compatibility decomposition is prepended, since there are no singletons in Latin1. This means the effect is seen only in the K forms.
++
C
++
Forced copy: In the UTF-16 case, a singleton is appended to force the normalizer to make a copy even when normalizing from NFC to a C form or from NFD to a D form. In the Latin1 case, a character with a compatibility decomposition is appended, since there are no singletons in Latin1. This means the effect is seen only in the K form corresponding to the input C or D form.
++
++ ++

Bench not started.

++ ++ ++ ++ ++
InputNFCNFKCNFDNFKD
Bench not run.
++ ++ ++ +diff --git a/testing/mozharness/scripts/android_emulator_pgo.py b/testing/mozharness/scripts/android_emulator_pgo.py +--- a/testing/mozharness/scripts/android_emulator_pgo.py ++++ b/testing/mozharness/scripts/android_emulator_pgo.py +@@ -28,10 +28,11 @@ + "blueprint/forms.html", + "blueprint/grid.html", + "blueprint/elements.html", + "js-input/3d-thingy.html", + "js-input/crypto-otp.html", ++ "js-input/normalizer_bench.html", + "js-input/sunspider/3d-cube.html", + "js-input/sunspider/3d-morph.html", + "js-input/sunspider/3d-raytrace.html", + "js-input/sunspider/access-binary-trees.html", + "js-input/sunspider/access-fannkuch.html", +diff --git a/toolkit/content/license.html b/toolkit/content/license.html +--- a/toolkit/content/license.html ++++ b/toolkit/content/license.html +@@ -5786,10 +5786,11 @@ +
  • third_party/rust/yoke-derive
  • +
  • third_party/rust/zerofrom
  • +
  • third_party/rust/zerofrom-derive
  • +
  • third_party/rust/zerovec
  • +
  • third_party/rust/zerovec-derive
  • ++
  • build/pgo/js-input/normalizer_bench.html
  • + + + +
    +             UNICODE LICENSE V3
    +
    diff --git a/src/external-patches/firefox/ff150_3_pgo_patch_for_bug-2014422.patch b/src/external-patches/firefox/ff150_3_pgo_patch_for_bug-2014422.patch
    new file mode 100644
    index 000000000..99add604c
    --- /dev/null
    +++ b/src/external-patches/firefox/ff150_3_pgo_patch_for_bug-2014422.patch
    @@ -0,0 +1,868 @@
    +diff --git a/build/pgo/index.html b/build/pgo/index.html
    +--- a/build/pgo/index.html
    ++++ b/build/pgo/index.html
    +@@ -49,10 +49,11 @@
    +     "blueprint/forms.html",
    +     "blueprint/grid.html",
    +     "blueprint/sample.html",
    +     "js-input/3d-thingy.html",
    +     "js-input/crypto-otp.html",
    ++    "js-input/collator_bench.html",
    +     "js-input/normalizer_bench.html",
    +     "js-input/sunspider/3d-cube.html",
    +     "js-input/sunspider/3d-morph.html",
    +     "js-input/sunspider/3d-raytrace.html",
    +     "js-input/sunspider/access-binary-trees.html",
    +diff --git a/build/pgo/js-input/collator_bench.html b/build/pgo/js-input/collator_bench.html
    +new file mode 100644
    +--- /dev/null
    ++++ b/build/pgo/js-input/collator_bench.html
    +@@ -0,0 +1,817 @@
    ++
    ++
    ++
    ++
    ++Collator bench
    ++
    ++

    Collator Bench

    ++ ++

    Bench not started.

    ++ ++ ++ ++ ++
    WorkloadTime
    Bench not run.
    ++ ++ ++ ++ +diff --git a/testing/mozharness/scripts/android_emulator_pgo.py b/testing/mozharness/scripts/android_emulator_pgo.py +--- a/testing/mozharness/scripts/android_emulator_pgo.py ++++ b/testing/mozharness/scripts/android_emulator_pgo.py +@@ -29,10 +29,11 @@ + "blueprint/forms.html", + "blueprint/grid.html", + "blueprint/elements.html", + "js-input/3d-thingy.html", + "js-input/crypto-otp.html", ++ "js-input/collator_bench.html", + "js-input/normalizer_bench.html", + "js-input/sunspider/3d-cube.html", + "js-input/sunspider/3d-morph.html", + "js-input/sunspider/3d-raytrace.html", + "js-input/sunspider/access-binary-trees.html", +diff --git a/toolkit/content/license.html b/toolkit/content/license.html +--- a/toolkit/content/license.html ++++ b/toolkit/content/license.html +@@ -5788,10 +5788,11 @@ +
  • third_party/rust/zerofrom
  • +
  • third_party/rust/zerofrom-derive
  • +
  • third_party/rust/zerovec
  • +
  • third_party/rust/zerovec-derive
  • +
  • build/pgo/js-input/normalizer_bench.html
  • ++
  • build/pgo/js-input/collator_bench.html
  • + + + +
    +             UNICODE LICENSE V3
    +
    diff --git a/src/external-patches/firefox/fix_macos_crash_on_shutdown_firefox_149.patch b/src/external-patches/firefox/fix_macos_crash_on_shutdown_firefox_149.patch
    deleted file mode 100644
    index c76f06760..000000000
    --- a/src/external-patches/firefox/fix_macos_crash_on_shutdown_firefox_149.patch
    +++ /dev/null
    @@ -1,177 +0,0 @@
    -diff --git a/toolkit/components/asyncshutdown/AsyncShutdown.sys.mjs b/toolkit/components/asyncshutdown/AsyncShutdown.sys.mjs
    ---- a/toolkit/components/asyncshutdown/AsyncShutdown.sys.mjs
    -+++ b/toolkit/components/asyncshutdown/AsyncShutdown.sys.mjs
    -@@ -490,10 +490,27 @@
    -       if (accepted) {
    -         return () => spinner.observe();
    -       }
    -       return undefined;
    -     },
    -+
    -+    /**
    -+     * Reset the phase after a call to _trigger().
    -+     * For testing purposes only.
    -+     */
    -+    get _reset() {
    -+      let accepted = Services.prefs.getBoolPref(
    -+        "toolkit.asyncshutdown.testing",
    -+        false
    -+      );
    -+      if (accepted) {
    -+        return () => {
    -+          spinner = new Spinner(topic);
    -+        };
    -+      }
    -+      return undefined;
    -+    },
    -   });
    -   gPhases.set(topic, phase);
    -   return phase;
    - }
    - 
    -diff --git a/toolkit/components/contentrelevancy/ContentRelevancyManager.sys.mjs b/toolkit/components/contentrelevancy/ContentRelevancyManager.sys.mjs
    ---- a/toolkit/components/contentrelevancy/ContentRelevancyManager.sys.mjs
    -+++ b/toolkit/components/contentrelevancy/ContentRelevancyManager.sys.mjs
    -@@ -104,18 +104,14 @@
    -     this._nimbusUpdateCallback = this.#onNimbusUpdate.bind(this);
    -     // This will handle both Nimbus updates and pref changes.
    -     lazy.NimbusFeatures.contentRelevancy.onUpdate(this._nimbusUpdateCallback);
    -     this.#initialized = true;
    - 
    --    if (
    --      Services.startup.isInOrBeyondShutdownPhase(
    --        Ci.nsIAppStartup.SHUTDOWN_PHASE_APPSHUTDOWNCONFIRMED
    --      )
    --    ) {
    -+    if (lazy.AsyncShutdown.profileChangeTeardown.isClosed) {
    -       // Corner case, where we're already in the shutdown phase while being constructed.  In this
    -       // case, uninitialize immediately to deregister callback handlers
    --      // (#https://bugzilla.mozilla.org/show_bug.cgi?id=1990569#c11)
    -+      // (https://bugzilla.mozilla.org/show_bug.cgi?id=1990569#c11)
    -       this.uninit();
    -     } else {
    -       // If we're not in the above corner case, then register a shutdown blocker to uninitialize.
    -       // Interrupt sooner prior to the `profile-before-change` phase to allow
    -       // all the in-progress IOs to exit.
    -diff --git a/toolkit/components/contentrelevancy/tests/xpcshell/test_ContentRelevancyManager.js b/toolkit/components/contentrelevancy/tests/xpcshell/test_ContentRelevancyManager.js
    ---- a/toolkit/components/contentrelevancy/tests/xpcshell/test_ContentRelevancyManager.js
    -+++ b/toolkit/components/contentrelevancy/tests/xpcshell/test_ContentRelevancyManager.js
    -@@ -149,10 +149,39 @@
    -   await TestUtils.waitForCondition(
    -     () => ContentRelevancyManager.interrupt.calledOnce,
    -     "The interrupt shutdown blocker should be called"
    -   );
    - 
    -+  AsyncShutdown.profileChangeTeardown._reset();
    -+  Services.prefs.clearUserPref("toolkit.asyncshutdown.testing");
    -+  Services.prefs.clearUserPref(PREF_CONTENT_RELEVANCY_ENABLED);
    -+  gSandbox.restore();
    -+});
    -+
    -+add_task(async function test_dont_register_blocker_if_in_shutdown() {
    -+  // Test a corner case: the ContentRelevancyManager is initialized during shutdown.
    -+  //
    -+  // In this case it shouldn't register a shutdown blocker, because it's too late to do that.
    -+  // Instead, it should just immediately uninitialize itself.
    -+  //
    -+  // See https://bugzilla.mozilla.org/show_bug.cgi?id=1990569
    -+  ContentRelevancyManager.uninit();
    -+  Services.prefs.setBoolPref(PREF_CONTENT_RELEVANCY_ENABLED, true);
    -+  await TestUtils.waitForTick();
    -+
    -+  gSandbox.spy(ContentRelevancyManager, "interrupt");
    -+
    -+  // Simulate shutdown.
    -+  Services.prefs.setBoolPref("toolkit.asyncshutdown.testing", true);
    -+  AsyncShutdown.profileChangeTeardown._trigger();
    -+  ContentRelevancyManager.init();
    -+  Assert.ok(
    -+    !ContentRelevancyManager.initialized,
    -+    "ContentRelevancyManager should have uninitialized itself"
    -+  );
    -+
    -+  AsyncShutdown.profileChangeTeardown._reset();
    -   Services.prefs.clearUserPref("toolkit.asyncshutdown.testing");
    -   Services.prefs.clearUserPref(PREF_CONTENT_RELEVANCY_ENABLED);
    -   gSandbox.restore();
    - });
    - 
    -diff --git a/toolkit/modules/AppServicesTracing.sys.mjs b/toolkit/modules/AppServicesTracing.sys.mjs
    ---- a/toolkit/modules/AppServicesTracing.sys.mjs
    -+++ b/toolkit/modules/AppServicesTracing.sys.mjs
    -@@ -9,10 +9,11 @@
    -  */
    - 
    - const lazy = {};
    - 
    - ChromeUtils.defineESModuleGetters(lazy, {
    -+  AsyncShutdown: "resource://gre/modules/AsyncShutdown.sys.mjs",
    -   // eslint-disable-next-line mozilla/use-console-createInstance
    -   Log: "resource://gre/modules/Log.sys.mjs",
    - });
    - 
    - import {
    -@@ -118,20 +119,33 @@
    -   }
    - }
    - 
    - /** A singleton uniffi callback interface. */
    - class TracingEventHandler extends EventSink {
    --  static OBSERVER_NAME = "xpcom-will-shutdown";
    --
    -   constructor() {
    -     super();
    -     // Map targets to CallbackLists
    -     this.targetCallbackLists = new Map();
    -     // CallbackList for callbacks registered with registerMinLevelEventSink
    -     this.minLevelCallbackList = new CallbackList();
    - 
    --    Services.obs.addObserver(this, TracingEventHandler.OBSERVER_NAME);
    -+    // Choose `profileBeforeChange` to call `#close()` and deregister our callbacks.
    -+    //
    -+    // Most other components will shutdown during the `profileChangeTeardown` phase, since that's
    -+    // the last opportunity to write to the profile directory.  By choosing the next one, we ensure
    -+    // we can forward any logging that happens when those components shutdown.
    -+    if (lazy.AsyncShutdown.profileBeforeChange.isClosed) {
    -+      // Corner case, where we're already in the shutdown phase while being constructed.  In this
    -+      // case, uninitialize immediately.
    -+      this.#close();
    -+    } else {
    -+      // If we're not in the above corner case, then register a shutdown blocker to uninitialize.
    -+      lazy.AsyncShutdown.profileBeforeChange.addBlocker(
    -+        "TracingEventHandler: deregister callbacks",
    -+        () => this.#close()
    -+      );
    -+    }
    -   }
    - 
    -   register(target, level, callback) {
    -     if (this.targetCallbackLists === null) {
    -       lazy.console.trace(
    -@@ -223,19 +237,17 @@
    -       targetList.processEvent(event);
    -     }
    -     this.minLevelCallbackList.processEvent(event);
    -   }
    - 
    --  observe(_aSubject, aTopic, _aData) {
    --    if (aTopic == TracingEventHandler.OBSERVER_NAME) {
    --      for (let target of this.targetCallbackLists.keys()) {
    --        unregisterEventSink(target);
    --      }
    --      unregisterMinLevelEventSink();
    --      this.targetCallbackLists = null;
    --      this.minLevelCallbackList = null;
    -+  #close() {
    -+    for (let target of this.targetCallbackLists.keys()) {
    -+      unregisterEventSink(target);
    -     }
    -+    unregisterMinLevelEventSink();
    -+    this.targetCallbackLists = null;
    -+    this.minLevelCallbackList = null;
    -   }
    - }
    - 
    - // the singleton.
    - let tracingEventHandler = new TracingEventHandler();
    -
    diff --git a/src/external-patches/firefox/gh-12979_clip_dirty_rect_to_device_size.patch b/src/external-patches/firefox/gh-12979_clip_dirty_rect_to_device_size.patch
    new file mode 100644
    index 000000000..4cd381da1
    --- /dev/null
    +++ b/src/external-patches/firefox/gh-12979_clip_dirty_rect_to_device_size.patch
    @@ -0,0 +1,21 @@
    +diff --git a/gfx/wr/webrender/src/renderer/composite.rs b/gfx/wr/webrender/src/renderer/composite.rs
    +--- a/gfx/wr/webrender/src/renderer/composite.rs
    ++++ b/gfx/wr/webrender/src/renderer/composite.rs
    +@@ -974,12 +974,15 @@
    +                     .iter()
    +                     .chain(self.layer_compositor_frame_state_in_prev_frame.as_ref().unwrap().rects_without_id.iter())  {
    +                     combined_dirty_rect = combined_dirty_rect.union(&rect);
    +                 }
    + 
    ++                let device_rect = DeviceRect::from_size(device_size.to_f32());
    ++                let clipped_dirty_rect = combined_dirty_rect.intersection_unchecked(&device_rect);
    ++
    +                 partial_present_mode = Some(PartialPresentMode::Single {
    +-                    dirty_rect: combined_dirty_rect,
    ++                    dirty_rect: clipped_dirty_rect,
    +                 });
    +             } else {
    +                 partial_present_mode = None;
    +             }
    + 
    +
    diff --git a/src/external-patches/manifest.json b/src/external-patches/manifest.json
    index 157506bcb..ff81da911 100644
    --- a/src/external-patches/manifest.json
    +++ b/src/external-patches/manifest.json
    @@ -2,11 +2,6 @@
     // 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/.
     [
    -  {
    -    "type": "phabricator",
    -    "id": "D279007",
    -    "name": "Fix MacOS Crash on Shutdown Firefox 149"
    -  },
       {
         "type": "phabricator",
         "id": "D284084",
    @@ -40,5 +35,25 @@
           // the parameter's help description with the correct one.
           "application": "Application"
         }
    +  },
    +  {
    +    "type": "phabricator",
    +    "id": "D291714",
    +    "name": "gh-12979 Clip dirty_rect to device_size"
    +  },
    +  {
    +    "type": "phabricator",
    +    "id": "D256645",
    +    "name": "FF150 1 PGO patch for bug-1962418"
    +  },
    +  {
    +    "type": "phabricator",
    +    "id": "D279829",
    +    "name": "FF150 2 PGO patch for bug-2011620"
    +  },
    +  {
    +    "type": "phabricator",
    +    "id": "D281762",
    +    "name": "FF150 3 PGO patch for bug-2014422"
       }
     ]
    diff --git a/src/toolkit/content/widgets/arrowscrollbox-js.patch b/src/toolkit/content/widgets/arrowscrollbox-js.patch
    index 4f15c2c29..082d496fe 100644
    --- a/src/toolkit/content/widgets/arrowscrollbox-js.patch
    +++ b/src/toolkit/content/widgets/arrowscrollbox-js.patch
    @@ -1,5 +1,5 @@
     diff --git a/toolkit/content/widgets/arrowscrollbox.js b/toolkit/content/widgets/arrowscrollbox.js
    -index b80d1049bb6ae305f2ac9c4c35fe975fd508031c..be2cbdb20cb2064459b6f7bef56fd0470c3b7f40 100644
    +index b80d1049bb6ae305f2ac9c4c35fe975fd508031c..574149bffa49329e927c8db9db0c080eb6b87f5f 100644
     --- a/toolkit/content/widgets/arrowscrollbox.js
     +++ b/toolkit/content/widgets/arrowscrollbox.js
     @@ -98,6 +98,7 @@
    @@ -10,7 +10,19 @@ index b80d1049bb6ae305f2ac9c4c35fe975fd508031c..be2cbdb20cb2064459b6f7bef56fd047
              let contentSize =
                slot.getBoundingClientRect()[this.#verticalMode ? "height" : "width"];
              // NOTE(emilio): This should be contentSize > scrollClientSize, but due
    -@@ -642,7 +643,7 @@
    +@@ -125,6 +126,11 @@
    +       overflowObserver.observe(this.scrollbox);
    +     }
    + 
    ++    connectedMoveCallback() {
    ++      // See gh-13015, define connectedMoveCallback to prevent connectedCallback
    ++      // from being called when using moveBefore.
    ++    }
    ++
    +     connectedCallback() {
    +       this.removeAttribute("overflowing");
    + 
    +@@ -642,7 +648,7 @@
      
          on_wheel(event) {
            // Don't consume the event if we can't scroll.
    diff --git a/src/toolkit/modules/PopupNotifications-sys-mjs.patch b/src/toolkit/modules/PopupNotifications-sys-mjs.patch
    new file mode 100644
    index 000000000..20ffbc3ac
    --- /dev/null
    +++ b/src/toolkit/modules/PopupNotifications-sys-mjs.patch
    @@ -0,0 +1,20 @@
    +diff --git a/toolkit/modules/PopupNotifications.sys.mjs b/toolkit/modules/PopupNotifications.sys.mjs
    +index 393f98c71a3b82d0af8ae0e6a863c2ed2963a5db..4a064887e297102353870db9d82f867575dccbef 100644
    +--- a/toolkit/modules/PopupNotifications.sys.mjs
    ++++ b/toolkit/modules/PopupNotifications.sys.mjs
    +@@ -1540,6 +1540,15 @@ PopupNotifications.prototype = {
    +   ) {
    +     for (let anchorElement of anchorElements) {
    +       anchorElement.setAttribute(ICON_ATTRIBUTE_SHOWING, "true");
    ++      let toolbox = anchorElement.closest("#navigator-toolbox");
    ++      if (toolbox) {
    ++        // Disable transitions for now, see gh-11667
    ++        toolbox.style.transition = "none";
    ++        toolbox.setAttribute("zen-compact-mode-active", "true");
    ++        anchorElement.ownerGlobal.setTimeout(() => {
    ++          toolbox.style.transition = "";
    ++        }, 0);
    ++      }
    +     }
    +   },
    + 
    diff --git a/src/toolkit/mozapps/update/updater/updater-common-build.patch b/src/toolkit/mozapps/update/updater/updater-common-build.patch
    index 03390b4c7..ee8ed45d6 100644
    --- a/src/toolkit/mozapps/update/updater/updater-common-build.patch
    +++ b/src/toolkit/mozapps/update/updater/updater-common-build.patch
    @@ -7,7 +7,7 @@ index 57ea0415653678bb300e277e66c97e332e756cc7..5f757e68a685948c83fee8f963c49bee
              "signmar",
          ]
     +    if CONFIG["OS_ARCH"] == "Linux":
    -+        # Zen: --enable-unverified-updates is enabled, the RPATH is not added
    ++        # Zen: ensure RPATH is set so NSS/signmar libs are found at runtime
     +        OS_LIBS += [
     +            "-Wl,-rpath=\\$$ORIGIN",
     +        ]
    diff --git a/src/toolkit/themes/shared/popup-css.patch b/src/toolkit/themes/shared/popup-css.patch
    index b1a0fbd8a..f22e41417 100644
    --- a/src/toolkit/themes/shared/popup-css.patch
    +++ b/src/toolkit/themes/shared/popup-css.patch
    @@ -1,5 +1,5 @@
     diff --git a/toolkit/themes/shared/popup.css b/toolkit/themes/shared/popup.css
    -index 064d39c586c01270545877ee9506ef3befa45a87..9b40bae87c3dd74cb921b5c486be01610c008216 100644
    +index 064d39c586c01270545877ee9506ef3befa45a87..9c68eab80f84e5c2e156ded73242a12ca41e767c 100644
     --- a/toolkit/themes/shared/popup.css
     +++ b/toolkit/themes/shared/popup.css
     @@ -23,8 +23,8 @@ panel {
    @@ -8,7 +8,7 @@ index 064d39c586c01270545877ee9506ef3befa45a87..9b40bae87c3dd74cb921b5c486be0161
      
     -  --panel-shadow-margin: var(--dimension-4);
     -  --panel-shadow: 0 0 var(--panel-shadow-margin) hsla(0, 0%, 0%, 0.2);
    -+  --panel-shadow-margin: 10px;
    ++  --panel-shadow-margin: 8px;
     +  --panel-shadow: var(--zen-big-shadow);
        -moz-window-input-region-margin: var(--panel-shadow-margin);
        margin: calc(-1 * var(--panel-shadow-margin));
    diff --git a/src/widget/cocoa/nsCocoaUtils-mm.patch b/src/widget/cocoa/nsCocoaUtils-mm.patch
    new file mode 100644
    index 000000000..929b28238
    --- /dev/null
    +++ b/src/widget/cocoa/nsCocoaUtils-mm.patch
    @@ -0,0 +1,14 @@
    +diff --git a/widget/cocoa/nsCocoaUtils.mm b/widget/cocoa/nsCocoaUtils.mm
    +index 540130c449b859f50847cad8177bd1065f67078a..83f96be9dc5aefe178e788472f220e9d560f5e2d 100644
    +--- a/widget/cocoa/nsCocoaUtils.mm
    ++++ b/widget/cocoa/nsCocoaUtils.mm
    +@@ -1632,7 +1632,8 @@ bool static ShouldConsiderStartingSwipeFromEvent(NSEvent* anEvent) {
    +   return [anEvent type] == NSEventTypeScrollWheel &&
    +          eventPhase == NSEventPhaseBegan &&
    +          [anEvent hasPreciseScrollingDeltas] &&
    +-         [NSEvent isSwipeTrackingFromScrollEventsEnabled];
    ++         ([NSEvent isSwipeTrackingFromScrollEventsEnabled] ||
    ++              Preferences::GetBool("zen.widget.macos.override-system-swipe-gestures"));
    + }
    + 
    + PanGestureInput nsCocoaUtils::CreatePanGestureEvent(
    diff --git a/src/zen/common/modules/ZenHasPolyfill.mjs b/src/zen/common/modules/ZenHasPolyfill.mjs
    index 986559d7f..44a7c685a 100644
    --- a/src/zen/common/modules/ZenHasPolyfill.mjs
    +++ b/src/zen/common/modules/ZenHasPolyfill.mjs
    @@ -26,6 +26,12 @@ class nsHasPolyfill {
             if (selected?.tagName?.toLowerCase() === "menu") {
               return null;
             }
    +        if (selected) {
    +          gZenCompactModeManager.log(
    +            `Selector "${selector}" exists for: `,
    +            element
    +          );
    +        }
             return selected;
           });
           const { exists: shouldExist = true } = descendantSelectors;
    diff --git a/src/zen/common/modules/ZenStartup.mjs b/src/zen/common/modules/ZenStartup.mjs
    index 31c339d21..bfa20f596 100644
    --- a/src/zen/common/modules/ZenStartup.mjs
    +++ b/src/zen/common/modules/ZenStartup.mjs
    @@ -46,14 +46,13 @@ class ZenStartup {
             }
             newContainer.appendChild(node);
           }
    -
           // Fix notification deck
    -      const deckTemplate = document.getElementById(
    -        "tab-notification-deck-template"
    -      );
    -      if (deckTemplate) {
    -        document.getElementById("zen-appcontent-wrapper").prepend(deckTemplate);
    -      }
    +      const deckTemplate =
    +        document.getElementById("tab-notification-deck-template") ||
    +        document.getElementById("tab-notification-deck");
    +
    +      // overlap and interaction issues with vertical tabs
    +      document.getElementById("browser").prepend(deckTemplate);
     
           gZenWorkspaces.init();
           setTimeout(() => {
    @@ -159,8 +158,13 @@ class ZenStartup {
       }
     
       #checkForWelcomePage() {
    -    if (!Services.prefs.getBoolPref("zen.welcome-screen.seen", false)) {
    -      Services.prefs.setBoolPref("zen.welcome-screen.seen", true);
    +    const kWelcomeScreenSeenPref = "zen.welcome-screen.seen";
    +    if (Services.env.get("MOZ_HEADLESS")) {
    +      Services.prefs.setBoolPref(kWelcomeScreenSeenPref, true);
    +      return;
    +    }
    +    if (!Services.prefs.getBoolPref(kWelcomeScreenSeenPref, false)) {
    +      Services.prefs.setBoolPref(kWelcomeScreenSeenPref, true);
           Services.prefs.setStringPref(
             "zen.updates.last-build-id",
             Services.appinfo.appBuildID
    diff --git a/src/zen/common/modules/ZenUIManager.mjs b/src/zen/common/modules/ZenUIManager.mjs
    index 84526694b..ff0af0495 100644
    --- a/src/zen/common/modules/ZenUIManager.mjs
    +++ b/src/zen/common/modules/ZenUIManager.mjs
    @@ -338,7 +338,12 @@ window.gZenUIManager = {
       // handle the constraint, enabling proper overflow scrolling.
       // See gh-12782
       _constrainNativePopoverHeight(panel) {
    -    if (panel.id !== "appMenu-popup") {
    +    const panelIds = [
    +      "appMenu-popup",
    +      "customizationui-widget-panel",
    +      "widget-overflow",
    +    ];
    +    if (!panelIds.includes(panel.id)) {
           return;
         }
         // NSPopover adds 13px of chrome on all sides (26px vertical total),
    @@ -346,7 +351,8 @@ window.gZenUIManager = {
         // Previous macOS versions have similar or smaller values, so this is a
         // conservative upper bound.
         const popoverChrome = 26;
    -    panel.style.maxHeight = `${window.screen.availHeight - popoverChrome}px`;
    +    const maxHeight = window.screen.availHeight - popoverChrome;
    +    panel.style.maxHeight = `${maxHeight}px`;
       },
     
       onPopupShowing(showEvent) {
    @@ -426,6 +432,9 @@ window.gZenUIManager = {
       },
     
       onUrlbarSearchModeChanged(event) {
    +    if (gReduceMotion) {
    +      return;
    +    }
         const { searchMode } = event.detail;
         const input = gURLBar;
         if (gURLBar.hasAttribute("breakout-extend") && !this._animatingSearchMode) {
    @@ -993,7 +1002,7 @@ window.gZenVerticalTabsManager = {
                     command="cmd_zenToggleTabsOnRight"
             />
         `);
    -    document.getElementById("viewToolbarsMenuSeparator").before(fragment);
    +    document.getElementById("toolbar-context-customize").before(fragment);
       },
     
       get _topButtonsSeparatorElement() {
    @@ -1008,6 +1017,7 @@ window.gZenVerticalTabsManager = {
     
       animateItemOpen(aItem) {
         if (
    +      gReduceMotion ||
           !gZenUIManager.motion ||
           !aItem ||
           !gZenUIManager._hasLoadedDOM ||
    @@ -1027,7 +1037,8 @@ window.gZenVerticalTabsManager = {
         };
     
         try {
    -      const itemSize = aItem.getBoundingClientRect().height;
    +      const itemSize =
    +        window.windowUtils.getBoundsWithoutFlushing(aItem).height;
           const transform = `-${itemSize}px`;
           gZenUIManager.motion
             .animate(
    @@ -1038,7 +1049,7 @@ window.gZenVerticalTabsManager = {
                 marginBottom: isLastItem() ? ["0px", "0px"] : [transform, "0px"],
               },
               {
    -            duration: 0.1,
    +            duration: 0.12,
                 easing: "easeOut",
               }
             )
    @@ -1061,7 +1072,7 @@ window.gZenVerticalTabsManager = {
                 filter: ["blur(1px)", "blur(0px)"],
               },
               {
    -            duration: 0.075,
    +            duration: 0.1,
                 easing: "easeOut",
               }
             )
    @@ -1086,7 +1097,7 @@ window.gZenVerticalTabsManager = {
         ) {
           return Promise.resolve();
         }
    -    const height = aItem.getBoundingClientRect().height;
    +    const height = window.windowUtils.getBoundsWithoutFlushing(aItem).height;
         const visibleItems = gBrowser.tabContainer.ariaFocusableItems;
         const isLastItem = visibleItems[visibleItems.length - 1] === aItem;
         return gZenUIManager.motion.animate(
    @@ -1101,7 +1112,7 @@ window.gZenVerticalTabsManager = {
                 }),
           },
           {
    -        duration: 0.075,
    +        duration: 0.1,
             easing: "easeOut",
           }
         );
    diff --git a/src/zen/common/modules/ZenUpdates.mjs b/src/zen/common/modules/ZenUpdates.mjs
    index 867bbd53f..76c08aa2a 100644
    --- a/src/zen/common/modules/ZenUpdates.mjs
    +++ b/src/zen/common/modules/ZenUpdates.mjs
    @@ -13,35 +13,36 @@ export default function checkForZenUpdates() {
       const lastVersion = Services.prefs.getStringPref(ZEN_UPDATE_PREF, "");
       Services.prefs.setStringPref(ZEN_UPDATE_PREF, version);
       if (
    -    version !== lastVersion &&
    -    !gZenUIManager.testingEnabled &&
    -    Services.prefs.getBoolPref(ZEN_UPDATE_SHOW, true)
    +    version === lastVersion ||
    +    gZenUIManager.testingEnabled ||
    +    !Services.prefs.getBoolPref(ZEN_UPDATE_SHOW, true)
       ) {
    -    const updateUrl = Services.prefs.getStringPref(
    -      "app.releaseNotesURL.prompt",
    -      ""
    -    );
    -    createSidebarNotification({
    -      headingL10nId: "zen-sidebar-notification-updated-heading",
    -      links: [
    -        {
    -          url: Services.urlFormatter.formatURL(
    -            updateUrl.replace("%VERSION%", version)
    -          ),
    -          l10nId: "zen-sidebar-notification-updated",
    -          special: true,
    -          icon: "chrome://browser/skin/zen-icons/heart-circle-fill.svg",
    -        },
    -        {
    -          action: () => {
    -            Services.obs.notifyObservers(window, "restart-in-safe-mode");
    -          },
    -          l10nId: "zen-sidebar-notification-restart-safe-mode",
    -          icon: "chrome://browser/skin/zen-icons/security-broken.svg",
    -        },
    -      ],
    -    });
    +    return;
       }
    +  const updateUrl = Services.prefs.getStringPref(
    +    "app.releaseNotesURL.prompt",
    +    ""
    +  );
    +  createSidebarNotification({
    +    headingL10nId: "zen-sidebar-notification-updated-heading",
    +    links: [
    +      {
    +        url: Services.urlFormatter.formatURL(
    +          updateUrl.replace("%VERSION%", version)
    +        ),
    +        l10nId: "zen-sidebar-notification-updated",
    +        special: true,
    +        icon: "chrome://browser/skin/zen-icons/heart-circle-fill.svg",
    +      },
    +      {
    +        action: () => {
    +          Services.obs.notifyObservers(window, "restart-in-safe-mode");
    +        },
    +        l10nId: "zen-sidebar-notification-restart-safe-mode",
    +        icon: "chrome://browser/skin/zen-icons/security-broken.svg",
    +      },
    +    ],
    +  });
     }
     
     export async function createWindowUpdateAnimation() {
    diff --git a/src/zen/common/styles/schemes/dark.inc.css b/src/zen/common/styles/schemes/dark.inc.css
    index 032dd757d..9b20f1a6a 100644
    --- a/src/zen/common/styles/schemes/dark.inc.css
    +++ b/src/zen/common/styles/schemes/dark.inc.css
    @@ -3,5 +3,4 @@
     % file, You can obtain one at http://mozilla.org/MPL/2.0/.
     
     color-scheme: dark;
    ---toolbar-color-scheme: dark;
     --zen-urlbar-outline-offset: -2px;
    diff --git a/src/zen/common/styles/schemes/light.inc.css b/src/zen/common/styles/schemes/light.inc.css
    index a3c18d0fd..d010f2f19 100644
    --- a/src/zen/common/styles/schemes/light.inc.css
    +++ b/src/zen/common/styles/schemes/light.inc.css
    @@ -3,5 +3,4 @@
     % file, You can obtain one at http://mozilla.org/MPL/2.0/.
     
     color-scheme: light;
    ---toolbar-color-scheme: light;
     --zen-urlbar-outline-offset: 0px;
    diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css
    index 8b8bc51e5..a334a3d04 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.2), rgba(255, 255, 255, 0.2)) !important;
    +    outline: 0.5px solid light-dark(rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.2)) !important;
         outline-offset: var(--zen-urlbar-outline-offset) !important;
     
         /* stylelint-disable-next-line media-query-no-invalid */
    @@ -404,32 +404,6 @@
       min-width: 26px;
     }
     
    -/* Notification Stack */
    -
    -.notificationbox-stack {
    -  background: transparent;
    -
    -  &[notificationside="top"] {
    -    position: fixed;
    -    bottom: calc(var(--zen-element-separation) * 1.5);
    -    right: calc(var(--zen-element-separation) * 1.5);
    -    width: fit-content;
    -    max-width: 30rem !important;
    -    z-index: 9999;
    -
    -    & notification-message {
    -      background: color-mix(in srgb, var(--zen-colors-tertiary) 70%, transparent 30%);
    -      backdrop-filter: blur(10px);
    -      border: 1px solid var(--arrowpanel-border-color);
    -      border-radius: var(--zen-border-radius);
    -
    -      &::before {
    -        display: none;
    -      }
    -    }
    -  }
    -}
    -
     #nav-bar,
     #zen-sidebar-top-buttons {
       min-height: var(--zen-toolbar-height) !important;
    @@ -512,6 +486,11 @@
           margin-block: -1px !important;
         }
       }
    +
    +  & #identity-icon-box {
    +    --urlbar-box-hover-bgcolor: transparent;
    +    margin-inline: 2px 8px;
    +  }
     }
     
     /* stylelint-disable-next-line media-query-no-invalid */
    @@ -708,7 +687,8 @@
       }
     
       #identity-box {
    -    margin-inline-end: 0;
    +    margin-inline-end: 3px !important;
    +    margin-inline-start: 2px !important;
       }
     }
     
    diff --git a/src/zen/common/styles/zen-popup.css b/src/zen/common/styles/zen-popup.css
    index e9f362282..8c29733b0 100644
    --- a/src/zen/common/styles/zen-popup.css
    +++ b/src/zen/common/styles/zen-popup.css
    @@ -36,7 +36,7 @@ menupopup,
     panel {
       --panel-background: var(--arrowpanel-background);
       --menuitem-padding: 6px !important;
    -  --panel-shadow-margin: 10px;
    +  --panel-shadow-margin: 8px;
     
       /* This should match GetMenuCornerRadius() on macOS, or be overridden below */
       @media (-moz-platform: macos) {
    diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css
    index 272197605..bc35b4882 100644
    --- a/src/zen/common/styles/zen-single-components.css
    +++ b/src/zen/common/styles/zen-single-components.css
    @@ -700,3 +700,36 @@
         gap: 4px;
       }
     }
    +
    +
    +/* Notification Stack */
    +
    +.notificationbox-stack {
    +  background: transparent;
    +
    +  &[notificationside="top"] {
    +    position: fixed;
    +    bottom: calc(var(--zen-element-separation) * 1.5);
    +    right: calc(var(--zen-element-separation) * 1.5);
    +
    +    :root[zen-right-side="true"] & {
    +      right: auto;
    +      left: calc(var(--zen-element-separation) * 1.5);
    +    }
    +
    +    width: fit-content;
    +    max-width: 30rem !important;
    +    z-index: 9999;
    +
    +    & notification-message {
    +      background: color-mix(in srgb, var(--zen-colors-tertiary) 70%, transparent 30%);
    +      backdrop-filter: blur(10px);
    +      border: 1px solid var(--arrowpanel-border-color);
    +      border-radius: var(--zen-border-radius);
    +
    +      &::before {
    +        display: none;
    +      }
    +    }
    +  }
    +}
    diff --git a/src/zen/common/styles/zen-theme.css b/src/zen/common/styles/zen-theme.css
    index a6bfb6cab..7b333d1db 100644
    --- a/src/zen/common/styles/zen-theme.css
    +++ b/src/zen/common/styles/zen-theme.css
    @@ -233,6 +233,7 @@
         --zen-primary-color: rgb(11, 10, 11) !important;
         /* Make sure its in sync with getToolbarColor */
         --toolbox-textcolor: rgba(255, 255, 255, 0.8) !important;
    +    --toolbar-color-scheme: dark !important;
       }
     
       &[zen-unsynced-window='true'] {
    @@ -248,7 +249,7 @@
     
       --panel-separator-color: color-mix(in srgb, currentColor 15%, transparent) !important;
     
    -  --zen-big-shadow: 0 0 9.73px 0px light-dark(rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.25));
    +  --zen-big-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px;
       --zen-active-tab-scale: 0.98;
     
       /* Define tab hover background color */
    diff --git a/src/zen/common/sys/ZenActorsManager.sys.mjs b/src/zen/common/sys/ZenActorsManager.sys.mjs
    index e0274fb5c..c56c688fb 100644
    --- a/src/zen/common/sys/ZenActorsManager.sys.mjs
    +++ b/src/zen/common/sys/ZenActorsManager.sys.mjs
    @@ -54,7 +54,7 @@ let JSWINDOWACTORS = {
           },
         },
         allFrames: true,
    -    matches: ["*://*/*"],
    +    remoteTypes: ["web", "file"],
         enablePreference: "zen.glance.enabled",
       },
     };
    diff --git a/src/zen/common/zen-sets.js b/src/zen/common/zen-sets.js
    index 6d539836c..1a1acb728 100644
    --- a/src/zen/common/zen-sets.js
    +++ b/src/zen/common/zen-sets.js
    @@ -143,6 +143,14 @@ document.addEventListener(
                 ZenLiveFoldersManager.handleEvent(event);
                 break;
               }
    +          case "cmd_zenDuplicateTab": {
    +            const selectedTabs = gBrowser.selectedTabs;
    +            let insertAt = selectedTabs.at(-1)._tPos + 1;
    +            for (const tab of selectedTabs) {
    +              gBrowser.duplicateTab(tab, true, { tabIndex: insertAt++ });
    +            }
    +            break;
    +          }
               default:
                 gZenGlanceManager.handleMainCommandSet(event);
                 if (event.target.id.startsWith("cmd_zenWorkspaceSwitch")) {
    diff --git a/src/zen/common/zenThemeModifier.js b/src/zen/common/zenThemeModifier.js
    index 40845b827..76ab3d656 100644
    --- a/src/zen/common/zenThemeModifier.js
    +++ b/src/zen/common/zenThemeModifier.js
    @@ -103,7 +103,7 @@
             if (AppConstants.platform == "macosx") {
               const targetRadius = window.matchMedia("(-moz-mac-tahoe-theme)")
                 .matches
    -            ? 16
    +            ? 14
                 : 10;
               document.documentElement.style.setProperty(
                 "--zen-border-radius",
    diff --git a/src/zen/compact-mode/ZenCompactMode.mjs b/src/zen/compact-mode/ZenCompactMode.mjs
    index c0c40036b..01f2a4416 100644
    --- a/src/zen/compact-mode/ZenCompactMode.mjs
    +++ b/src/zen/compact-mode/ZenCompactMode.mjs
    @@ -185,7 +185,8 @@ window.gZenCompactModeManager = {
           [
             {
               selector:
    -            ":is([panelopen='true'], [open='true'], [breakout-extend='true']):not(#urlbar[zen-floating-urlbar='true']):not(tab):not(.zen-compact-mode-ignore)",
    +            ":where([panelopen='true'], [open='true'], [breakout-extend='true'])" +
    +            ":not(#urlbar[zen-floating-urlbar='true']):not(tab):not(.zen-compact-mode-ignore)",
             },
           ],
           "zen-compact-mode-active",
    @@ -196,7 +197,8 @@ window.gZenCompactModeManager = {
           [
             {
               selector:
    -            ":is([panelopen='true'], [open='true'], #urlbar:focus-within, [breakout-extend='true']):not(.zen-compact-mode-ignore)",
    +            ":where([panelopen='true'], [open='true'], #urlbar:focus-within, [breakout-extend='true'])" +
    +            ":not(.zen-compact-mode-ignore)",
             },
           ],
           "zen-compact-mode-active",
    @@ -233,6 +235,7 @@ window.gZenCompactModeManager = {
               
             
           
    +      
         `);
     
         const idToAction = {
    @@ -247,7 +250,7 @@ window.gZenCompactModeManager = {
           }
         }
     
    -    document.getElementById("viewToolbarsMenuSeparator").before(fragment);
    +    document.getElementById("toolbar-context-menu").prepend(fragment);
         this.updateContextMenu();
       },
     
    @@ -590,7 +593,7 @@ window.gZenCompactModeManager = {
         if (!toggle) {
           return;
         }
    -    toggle.setAttribute("checked", this.preference);
    +    toggle.toggleAttribute("checked", this.preference);
     
         const hideTabBar = this.canHideSidebar;
         const hideToolbar = this.canHideToolbar;
    @@ -600,9 +603,9 @@ window.gZenCompactModeManager = {
         const sidebarItem = document.getElementById(idName + "sidebar");
         const toolbarItem = document.getElementById(idName + "toolbar");
         const bothItem = document.getElementById(idName + "both");
    -    sidebarItem.setAttribute("checked", !hideBoth && hideTabBar);
    -    toolbarItem.setAttribute("checked", !hideBoth && hideToolbar);
    -    bothItem.setAttribute("checked", hideBoth);
    +    sidebarItem.toggleAttribute("checked", !hideBoth && hideTabBar);
    +    toolbarItem.toggleAttribute("checked", !hideBoth && hideToolbar);
    +    bothItem.toggleAttribute("checked", hideBoth);
       },
     
       _removeOpenStateOnUnifiedExtensions() {
    diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs
    index ffb57831e..d5a579c4a 100644
    --- a/src/zen/folders/ZenFolders.mjs
    +++ b/src/zen/folders/ZenFolders.mjs
    @@ -70,7 +70,23 @@ class nsZenFolders extends nsZenDOMOperatedFeature {
         );
         document.getElementById("context_moveTabToGroup").before(contextMenuItems);
         const contextMenuItemsToolbar = window.MozXULElement.parseXULToFragment(
    -      ``
    +      `
    +       
    +         
    +           
    +           
    +           
    +         
    +       `
         );
         document
           .getElementById("toolbar-context-openANewTab")
    diff --git a/src/zen/glance/ZenGlanceManager.mjs b/src/zen/glance/ZenGlanceManager.mjs
    index 362ed7f72..a63ccb234 100644
    --- a/src/zen/glance/ZenGlanceManager.mjs
    +++ b/src/zen/glance/ZenGlanceManager.mjs
    @@ -6,6 +6,8 @@
     
     import { nsZenDOMOperatedFeature } from "chrome://browser/content/zen-components/ZenCommonUtils.mjs";
     
    +const GLANCE_BACKGROUND_SCALE = 0.97;
    +
     /**
      * Manages the Zen Glance feature - a preview overlay system for tabs
      * Allows users to preview content without fully opening new tabs
    @@ -32,7 +34,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
     
       // Arc animation configuration
       #ARC_CONFIG = Object.freeze({
    -    ARC_STEPS: 70, // Increased for smoother bounce
    +    ARC_STEPS: 400, // Increased for smoother bounce
         MAX_ARC_HEIGHT: 25,
         ARC_HEIGHT_RATIO: 0.2, // Arc height = distance * ratio (capped at MAX_ARC_HEIGHT)
       });
    @@ -437,8 +439,8 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
         gZenUIManager.motion.animate(
           parentSidebarContainer,
           {
    -        scale: [1, 0.98],
    -        opacity: [1, 0.4],
    +        scale: [1, GLANCE_BACKGROUND_SCALE],
    +        opacity: [1, 0.3],
           },
           {
             duration: this.#GLANCE_ANIMATION_DURATION,
    @@ -505,17 +507,6 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
         this.#glances.get(this.#currentGlanceID).elementImageData =
           data.elementData;
     
    -    gZenUIManager.motion.animate(
    -      imageDataElement,
    -      {
    -        opacity: [1, 0],
    -      },
    -      {
    -        duration: this.#GLANCE_ANIMATION_DURATION / 2,
    -        easing: "easeInOut",
    -      }
    -    );
    -
         return imageDataElement;
       }
     
    @@ -528,8 +519,8 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
         const rect = window.windowUtils.getBoundsWithoutFlushing(
           this.browserWrapper.parentElement
         );
    -    const minWidth = rect.width * 0.85;
    -    const minHeight = rect.height * 0.85;
    +    const minWidth = rect.width * 0.8;
    +    const minHeight = rect.height * 0.8;
     
         browserElement.style.minWidth = `${minWidth}px`;
         browserElement.style.minHeight = `${minHeight}px`;
    @@ -571,7 +562,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
               this.contentWrapper,
               { opacity: [0, 1] },
               {
    -            duration: this.#GLANCE_ANIMATION_DURATION / 2,
    +            duration: this.#GLANCE_ANIMATION_DURATION / 4,
                 easing: "easeInOut",
               }
             )
    @@ -581,6 +572,14 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
         }
     
         this.#animateParentBackground();
    +    let activeValue = browserElement.zenModeActive;
    +    let shouldDeactivateDocShell = Services.prefs.getBoolPref(
    +      "zen.glance.deactivate-docshell-during-animation"
    +    );
    +    if (shouldDeactivateDocShell) {
    +      browserElement.zenModeActive = false;
    +      browserElement.docShellIsActive = false;
    +    }
         gZenUIManager.motion
           .animate(this.browserWrapper, arcSequence, {
             duration: gZenUIManager.testingEnabled
    @@ -589,6 +588,10 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
             ease: "easeInOut",
           })
           .then(() => {
    +        if (shouldDeactivateDocShell) {
    +          browserElement.zenModeActive = activeValue;
    +          browserElement.docShellIsActive = true;
    +        }
             this.#finalizeGlanceOpening(imageDataElement, browserElement, resolve);
           });
       }
    @@ -610,7 +613,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
           gBrowser.tabpanels
         );
     
    -    const widthPercent = 0.85;
    +    const widthPercent = 0.8;
         if (direction === "opening") {
           startPosition = {
             x: clientX + width / 2,
    @@ -766,7 +769,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
         browserElement.style.minHeight = "";
     
         this.browserWrapper.style.height = "100%";
    -    this.browserWrapper.style.width = "85%";
    +    this.browserWrapper.style.width = "80%";
     
         gBrowser.tabContainer._invalidateCachedTabs();
         this.overlay.style.removeProperty("overflow");
    @@ -992,8 +995,8 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
           .animate(
             browserSidebarContainer,
             {
    -          scale: [0.98, 1],
    -          opacity: [0.4, 1],
    +          scale: [GLANCE_BACKGROUND_SCALE, 1],
    +          opacity: [0.3, 1],
             },
             {
               duration: this.#GLANCE_ANIMATION_DURATION / 1.5,
    @@ -1611,7 +1614,7 @@ class nsZenGlanceManager extends nsZenDOMOperatedFeature {
         await gZenUIManager.motion.animate(
           this.browserWrapper,
           {
    -        width: ["85%", "100%"],
    +        width: ["80%", "100%"],
             height: ["100%", "100%"],
           },
           {
    diff --git a/src/zen/glance/zen-glance.css b/src/zen/glance/zen-glance.css
    index 210a323ea..1257bcdc7 100644
    --- a/src/zen/glance/zen-glance.css
    +++ b/src/zen/glance/zen-glance.css
    @@ -113,6 +113,7 @@
       box-shadow: none !important;
       visibility: inherit;
       z-index: 1;
    +  overflow: visible !important;
     
       :root[zen-no-padding="true"] & {
         --zen-native-inner-radius: 0px;
    @@ -122,11 +123,15 @@
         transform: translate(-50%, -50%);
         position: fixed;
         flex: unset !important;
    -    width: 85%;
    +    width: 80%;
         height: 100%;
     
    -    &:not([has-finished-animation="true"]) #statuspanel {
    -      display: none;
    +    &:not([has-finished-animation="true"]) {
    +      will-change: width, height, transform;
    +
    +      #statuspanel {
    +        display: none;
    +      }
         }
     
         &[has-finished-animation="true"] {
    @@ -143,7 +148,7 @@
         }
     
         & browser {
    -      background: light-dark(rgb(255, 255, 255), rgb(32, 32, 32)) !important;
    +      background: light-dark(rgb(255, 255, 255), rgb(17, 17, 17)) !important;
           width: 100%;
           height: 100%;
         }
    @@ -166,15 +171,22 @@
       pointer-events: none;
       width: 100%;
       height: 100%;
    +  max-width: 100%;
    +  max-height: 100%;
       z-index: 0;
       border-radius: var(--zen-native-inner-radius);
    -  top: 0%;
    +  top: 50%;
       left: 50%;
    -  translate: -50% 0%;
    +  translate: -50% -50%;
       background: rgba(255, 255, 255, 0.1);
     
    +  display: flex;
    +  align-items: center;
    +  justify-content: center;
    +
       & image {
         width: 100%;
         max-width: 100%;
    +    max-height: 100%;
       }
     }
    diff --git a/src/zen/images/brand-header.svg b/src/zen/images/brand-header.svg
    deleted file mode 100644
    index 21b542840..000000000
    --- a/src/zen/images/brand-header.svg
    +++ /dev/null
    @@ -1,6 +0,0 @@
    -
    -
    diff --git a/src/zen/images/jar.inc.mn b/src/zen/images/jar.inc.mn
    index 39b41d70c..d5ac5ccd7 100644
    --- a/src/zen/images/jar.inc.mn
    +++ b/src/zen/images/jar.inc.mn
    @@ -2,7 +2,6 @@
     # 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/.
     
    -        content/browser/zen-images/brand-header.svg                             (../../zen/images/brand-header.svg)
             content/browser/zen-images/layouts/collapsed.png                        (../../zen/images/layouts/collapsed.png)
             content/browser/zen-images/layouts/multiple-toolbar.png                 (../../zen/images/layouts/multiple-toolbar.png)
             content/browser/zen-images/layouts/single-toolbar.png                   (../../zen/images/layouts/single-toolbar.png)
    diff --git a/src/zen/kbs/ZenKeyboardShortcuts.mjs b/src/zen/kbs/ZenKeyboardShortcuts.mjs
    index bceb9e66b..351bfd0a5 100644
    --- a/src/zen/kbs/ZenKeyboardShortcuts.mjs
    +++ b/src/zen/kbs/ZenKeyboardShortcuts.mjs
    @@ -832,7 +832,7 @@ class nsZenKeyboardShortcutsLoader {
     }
     
     class nsZenKeyboardShortcutsVersioner {
    -  static LATEST_KBS_VERSION = 16;
    +  static LATEST_KBS_VERSION = 17;
     
       constructor() {}
     
    @@ -1196,6 +1196,22 @@ class nsZenKeyboardShortcutsVersioner {
           }
         }
     
    +    if (version < 17) {
    +      // Migrate from version 16 to 17.
    +      // Add shortcut to Duplicate Tab
    +      data.push(
    +        new KeyShortcut(
    +          "zen-duplicate-tab",
    +          "",
    +          "",
    +          "windowAndTabManagement",
    +          nsKeyShortcutModifiers.fromObject({}),
    +          "cmd_zenDuplicateTab",
    +          "zen-duplicate-tab-shortcut"
    +        )
    +      );
    +    }
    +
         return data;
       }
     }
    diff --git a/src/zen/live-folders/ZenLiveFolder.sys.mjs b/src/zen/live-folders/ZenLiveFolder.sys.mjs
    index 821a1fb29..54ed5d2c1 100644
    --- a/src/zen/live-folders/ZenLiveFolder.sys.mjs
    +++ b/src/zen/live-folders/ZenLiveFolder.sys.mjs
    @@ -122,7 +122,7 @@ export class nsZenLiveFolderProvider {
         this.manager.saveState();
       }
     
    -  fetch(url, { maxContentLength = 5 * 1024 * 1024 } = {}) {
    +  fetch(url, { maxContentLength = 5 * 1024 * 1024, headers = {} } = {}) {
         const uri = lazy.NetUtil.newURI(url);
         // TODO: Support userContextId when fetching, it should be inherited from the folder's
         // current space context ID.
    @@ -155,6 +155,10 @@ export class nsZenLiveFolderProvider {
           triggeringPrincipal: principal,
         }).QueryInterface(Ci.nsIHttpChannel);
     
    +    for (const [name, value] of Object.entries(headers)) {
    +      channel.setRequestHeader(name, value, false);
    +    }
    +
         let httpStatus = null;
         let contentType = "";
         let headerCharset = null;
    diff --git a/src/zen/live-folders/providers/GithubLiveFolder.sys.mjs b/src/zen/live-folders/providers/GithubLiveFolder.sys.mjs
    index bd8074fea..398ebaa77 100644
    --- a/src/zen/live-folders/providers/GithubLiveFolder.sys.mjs
    +++ b/src/zen/live-folders/providers/GithubLiveFolder.sys.mjs
    @@ -10,8 +10,11 @@ export class nsGithubLiveFolderProvider extends nsZenLiveFolderProvider {
       constructor({ id, state, manager }) {
         super({ id, state, manager });
     
    -    this.state.url = "https://github.com/issues/assigned";
         this.state.type = state.type;
    +    this.state.url =
    +      this.state.type === "pull-requests"
    +        ? "https://github.com/pulls"
    +        : "https://github.com/issues/assigned";
     
         this.state.options = state.options ?? {};
         this.state.repos = new Set(state.repos ?? []);
    @@ -29,128 +32,263 @@ export class nsGithubLiveFolderProvider extends nsZenLiveFolderProvider {
             return "zen-live-folder-github-no-filter";
           }
     
    -      const searchParams = this.#buildSearchOptions();
    -      const url = `${this.state.url}?${searchParams}`;
    -
    -      const { text, status } = await this.fetch(url);
    -
    -      // Assume no auth
    -      if (status === 404) {
    -        return "zen-live-folder-github-no-auth";
    -      }
    -
    -      const document = new DOMParser().parseFromString(text, "text/html");
    -      const issues = document.querySelectorAll(
    -        "div[class^=IssueItem-module__defaultRepoContainer]"
    -      );
    -      const items = [];
    -      const activeRepos = new Set();
    -
    -      if (issues.length) {
    -        const authors = document.querySelectorAll(
    -          "a[class^=IssueItem-module__authorCreatedLink]"
    -        );
    -        const titles = document.querySelectorAll(
    -          "div[class^=Title-module__container]"
    -        );
    -        const links = document.querySelectorAll(
    -          '[data-testid="issue-pr-title-link"]'
    -        );
    -
    -        for (let i = 0; i < issues.length; i++) {
    -          const [rawRepo, rawNumber] = issues[i].childNodes;
    -          const author = authors[i]?.textContent;
    -          const title = titles[i]?.textContent;
    -          const issueUrl = links[i]?.href;
    -
    -          const repo = rawRepo.textContent?.trim();
    -          if (repo) {
    -            activeRepos.add(repo);
    -          }
    -
    -          const numberMatch = rawNumber?.textContent?.match(/[0-9]+/);
    -          const number = numberMatch?.[0] ?? "";
    -
    -          items.push({
    -            title,
    -            subtitle: author,
    -            icon: "chrome://browser/content/zen-images/favicons/github.svg",
    -            url: "https://github.com" + issueUrl,
    -            id: `${repo}#${number}`,
    -          });
    +      if (
    +        this.state.type === "pull-requests" &&
    +        typeof this.state.isJsonApi !== "boolean"
    +      ) {
    +        const { text, status } = await this.fetch(this.state.url, {
    +          headers: {
    +            Accept: "application/json,text/html",
    +          },
    +        });
    +        if (status === 404) {
    +          return "zen-live-folder-github-no-auth";
    +        }
    +        try {
    +          JSON.parse(text);
    +          this.state.isJsonApi = true;
    +        } catch {
    +          this.state.isJsonApi = false;
             }
           }
     
    -      this.state.repos = activeRepos;
    +      const queries = this.#buildSearchOptions();
    +      const requests = await Promise.all(
    +        queries.map(query => {
    +          const url = new URL(this.state.url);
    +          url.searchParams.set("q", query);
     
    -      return items;
    +          if (this.state.type === "pull-requests") {
    +            return this.parsePullRequests(url.href);
    +          }
    +
    +          return this.parseIssues(url.href);
    +        })
    +      );
    +
    +      const combinedItems = new Map();
    +      const combinedActiveRepos = new Set();
    +
    +      for (const { status, items, activeRepos } of requests) {
    +        // Assume no auth
    +        if (status === 404) {
    +          return "zen-live-folder-github-no-auth";
    +        }
    +
    +        if (items) {
    +          for (const item of items) {
    +            combinedItems.set(item.id, item);
    +          }
    +        }
    +
    +        if (activeRepos) {
    +          for (const repo of activeRepos) {
    +            combinedActiveRepos.add(repo);
    +          }
    +        }
    +      }
    +
    +      this.state.repos = combinedActiveRepos;
    +      return Array.from(combinedItems.values());
         } catch (error) {
           console.error("Error fetching or parsing GitHub issues:", error);
           return "zen-live-folder-failed-fetch";
         }
       }
     
    +  async parsePullRequests(url) {
    +    const { text, status } = await this.fetch(url, {
    +      headers: {
    +        Accept: "application/json,text/html",
    +      },
    +    });
    +
    +    if (status !== 200) {
    +      return { status };
    +    }
    +
    +    let parsedJson = null;
    +    try {
    +      parsedJson = JSON.parse(text);
    +      this.state.isJsonApi = true;
    +    } catch {
    +      if (this.state.isJsonApi) {
    +        this.state.isJsonApi = false;
    +        // throw to indicate user to re-try (Url may contain invalid params for non-json /pulls)
    +        throw new Error("Unexpected content type");
    +      }
    +    }
    +
    +    if (parsedJson) {
    +      const results =
    +        parsedJson.payload.pullsDashboardSurfaceContentRoute.results;
    +
    +      const items = [];
    +      const activeRepos = new Set();
    +
    +      for (const pr of results) {
    +        activeRepos.add(pr.repoNameWithOwner);
    +        items.push({
    +          id: `${pr.repoNameWithOwner}#${pr.number}`,
    +          title: pr.title,
    +          subtitle: pr.author.displayLogin,
    +          icon: "chrome://browser/content/zen-images/favicons/github.svg",
    +          url: pr.permalink,
    +        });
    +      }
    +
    +      return {
    +        status,
    +
    +        items,
    +        activeRepos,
    +      };
    +    }
    +    const document = new DOMParser().parseFromString(text, "text/html");
    +    const issues = document.querySelectorAll("div[id^=issue_]");
    +
    +    const items = [];
    +    const activeRepos = new Set();
    +
    +    if (issues.length) {
    +      const authors = document.querySelectorAll(".opened-by a");
    +      const titles = document.querySelectorAll("a[id^=issue_]");
    +
    +      for (let i = 0; i < issues.length; i++) {
    +        const author = authors[i].textContent;
    +        const title = titles[i].textContent;
    +
    +        const repo = titles[i].previousElementSibling.textContent.trim();
    +        if (repo) {
    +          activeRepos.add(repo);
    +        }
    +
    +        const idMatch = authors[i].parentElement.textContent
    +          .match(/#[0-9]+/)
    +          .shift();
    +
    +        items.push({
    +          title,
    +          subtitle: author,
    +          icon: "chrome://browser/content/zen-images/favicons/github.svg",
    +          url: new URL(titles[i].href, this.state.url),
    +          id: `${repo}${idMatch}`,
    +        });
    +      }
    +    }
    +
    +    return {
    +      status,
    +
    +      items,
    +      activeRepos,
    +    };
    +  }
    +
    +  async parseIssues(url) {
    +    const { text, status } = await this.fetch(url);
    +
    +    if (status !== 200) {
    +      return { status };
    +    }
    +
    +    const document = new DOMParser().parseFromString(text, "text/html");
    +    const issues = document.querySelectorAll(
    +      "div[class^=IssueItem-module__defaultRepoContainer]"
    +    );
    +    const items = [];
    +    const activeRepos = new Set();
    +
    +    if (issues.length) {
    +      const authors = document.querySelectorAll(
    +        "a[class^=IssueItem-module__authorCreatedLink]"
    +      );
    +      const titles = document.querySelectorAll(
    +        "div[class^=Title-module__container]"
    +      );
    +      const links = document.querySelectorAll(
    +        '[data-testid="issue-pr-title-link"]'
    +      );
    +
    +      for (let i = 0; i < issues.length; i++) {
    +        const [rawRepo, rawNumber] = issues[i].childNodes;
    +        const author = authors[i]?.textContent;
    +        const title = titles[i]?.textContent;
    +        const issueUrl = links[i]?.href;
    +
    +        const repo = rawRepo.textContent?.trim();
    +        if (repo) {
    +          activeRepos.add(repo);
    +        }
    +
    +        const numberMatch = rawNumber?.textContent?.match(/[0-9]+/);
    +        const number = numberMatch?.[0] ?? "";
    +
    +        items.push({
    +          title,
    +          subtitle: author,
    +          icon: "chrome://browser/content/zen-images/favicons/github.svg",
    +          url: "https://github.com" + issueUrl,
    +          id: `${repo}#${number}`,
    +        });
    +      }
    +    }
    +
    +    return {
    +      status,
    +
    +      items,
    +      activeRepos,
    +    };
    +  }
    +
       #buildSearchOptions() {
    -    let searchParams = new URLSearchParams();
    +    const baseQuery = [
    +      this.state.type === "pull-requests" ? "is:pr" : "is:issue",
    +      "is:open",
    +      "sort:updated-desc",
    +    ];
    +
         const options = [
           {
    -        value: "state:open",
    -        enabled: true,
    +        value: "author:@me",
    +        enabled: this.state.options.authorMe ?? false,
           },
           {
    -        value: "sort:updated-desc",
    -        enabled: true,
    +        value: "assignee:@me",
    +        enabled: this.state.options.assignedMe ?? true,
    +      },
    +      {
    +        value: "review-requested:@me",
    +        enabled: this.state.options.reviewRequested ?? false,
           },
    -      [
    -        {
    -          value: "is:pr",
    -          enabled: this.state.type === "pull-requests",
    -        },
    -        {
    -          value: "is:issue",
    -          enabled: this.state.type === "issues",
    -        },
    -      ],
    -      [
    -        {
    -          value: "author:@me",
    -          enabled: this.state.options.authorMe ?? false,
    -        },
    -        {
    -          value: "assignee:@me",
    -          enabled: this.state.options.assignedMe ?? true,
    -        },
    -        {
    -          value: "review-requested:@me",
    -          enabled: this.state.options.reviewRequested ?? false,
    -        },
    -      ],
         ];
     
         const excluded = this.state.options.repoExcludes;
         for (const repo of excluded) {
           if (repo && repo.trim()) {
    -        options.push({ value: `-repo:${repo.trim()}`, enabled: true });
    +        baseQuery.push(`-repo:${repo.trim()}`);
           }
         }
     
    -    let outputString = "";
    +    const queries = [];
         for (const option of options) {
    -      if (Array.isArray(option)) {
    -        const enabledOptions = option.filter(x => x.enabled).map(x => x.value);
    -        if (enabledOptions.length) {
    -          outputString += ` (${enabledOptions.join(" OR ")}) `;
    -        }
    -        continue;
    -      }
    -
           if (option.enabled) {
    -        outputString += ` ${option.value} `;
    +        queries.push(option.value);
           }
         }
     
    -    searchParams.set("q", outputString.trim().replace(/ +(?= )/g, ""));
    -    return searchParams.toString();
    +    const searchParams = [];
    +    if (this.state.type === "pull-requests" && !this.state.isJsonApi) {
    +      for (const query of queries) {
    +        searchParams.push(`${baseQuery.join(" ")} ${query}`);
    +      }
    +
    +      return searchParams;
    +    }
    +
    +    // type: issues or pull requests json api
    +    return [`${baseQuery.join(" ")} (${queries.join(" OR ")})`];
       }
     
       get options() {
    @@ -209,7 +347,7 @@ export class nsGithubLiveFolderProvider extends nsZenLiveFolderProvider {
         super.onOptionTrigger(option);
     
         const key = option.getAttribute("option-key");
    -    const checked = option.getAttribute("checked") === "true";
    +    const checked = option.hasAttribute("checked");
         if (!this.options.some(x => x.key === key)) {
           return;
         }
    diff --git a/src/zen/sessionstore/ZenSessionManager.sys.mjs b/src/zen/sessionstore/ZenSessionManager.sys.mjs
    index bf7b106a3..ac23ac37c 100644
    --- a/src/zen/sessionstore/ZenSessionManager.sys.mjs
    +++ b/src/zen/sessionstore/ZenSessionManager.sys.mjs
    @@ -151,10 +151,11 @@ export class nsZenSessionManager {
           );
           const db = await PlacesUtils.promiseDBConnection();
           let data = {};
    -      let rows = await db.execute(
    -        "SELECT * FROM zen_workspaces ORDER BY created_at ASC"
    -      );
    +      let rows = [];
           try {
    +        rows = await db.execute(
    +          "SELECT * FROM zen_workspaces ORDER BY created_at ASC"
    +        );
             data.spaces = rows.map(row => ({
               uuid: row.getResultByName("uuid"),
               name: row.getResultByName("name"),
    diff --git a/src/zen/sessionstore/ZenWindowSync.sys.mjs b/src/zen/sessionstore/ZenWindowSync.sys.mjs
    index 95b6c8e70..564693dca 100644
    --- a/src/zen/sessionstore/ZenWindowSync.sys.mjs
    +++ b/src/zen/sessionstore/ZenWindowSync.sys.mjs
    @@ -790,7 +790,10 @@ class nsZenWindowSync {
         // We *shouldn't* care about this scenario since the remoteness should be
         // the same anyways.
         if (!aOurTab.linkedBrowser || !aOtherTab.linkedBrowser) {
    -      return true;
    +      this.log(
    +        `Cannot swap browsers between tabs ${aOurTab.id} and ${aOtherTab.id} because one of them doesn't have a linked browser`
    +      );
    +      return false;
         }
         // Can't swap between chrome and content processes.
         if (
    diff --git a/src/zen/spaces/ZenGradientGenerator.mjs b/src/zen/spaces/ZenGradientGenerator.mjs
    index b4a704fda..f2eb7461e 100644
    --- a/src/zen/spaces/ZenGradientGenerator.mjs
    +++ b/src/zen/spaces/ZenGradientGenerator.mjs
    @@ -1753,6 +1753,10 @@ export class nsZenThemePicker extends nsZenMultiWindowFeature {
               "--toolbox-textcolor",
               `rgba(${textColor[0]}, ${textColor[1]}, ${textColor[2]}, ${textColor[3]})`
             );
    +        docElement.style.setProperty(
    +          "--toolbar-color-scheme",
    +          isDarkMode ? "dark" : "light"
    +        );
           }
     
           if (!skipUpdate) {
    diff --git a/src/zen/spaces/ZenSpaceBookmarksStorage.js b/src/zen/spaces/ZenSpaceBookmarksStorage.js
    index f4e577370..59da45f61 100644
    --- a/src/zen/spaces/ZenSpaceBookmarksStorage.js
    +++ b/src/zen/spaces/ZenSpaceBookmarksStorage.js
    @@ -10,9 +10,6 @@ window.ZenWorkspaceBookmarksStorage = {
         ChromeUtils.defineESModuleGetters(this.lazy, {
           PlacesUtils: "resource://gre/modules/PlacesUtils.sys.mjs",
         });
    -    if (!window.gZenWorkspaces) {
    -      return;
    -    }
         this.promiseInitialized = new Promise(resolve => {
           this._resolveInitialized = resolve;
         });
    diff --git a/src/zen/spaces/ZenSpaceCreation.mjs b/src/zen/spaces/ZenSpaceCreation.mjs
    index 69b8316cf..18243b48d 100644
    --- a/src/zen/spaces/ZenSpaceCreation.mjs
    +++ b/src/zen/spaces/ZenSpaceCreation.mjs
    @@ -199,25 +199,27 @@ class nsZenWorkspaceCreation extends MozXULElement {
             this.style.visibility = "visible";
             gZenCompactModeManager.getAndApplySidebarWidth();
             this.resolveInitialized();
    -        gZenUIManager.motion
    -          .animate(
    -            this.elementsToAnimate,
    -            {
    -              y: [20, 0],
    -              opacity: [0, 1],
    -              filter: ["blur(2px)", "blur(0)"],
    -            },
    -            {
    -              duration: 0.6,
    -              type: "spring",
    -              bounce: 0,
    -              delay: gZenUIManager.motion.stagger(0.05, { startDelay: 0.2 }),
    -            }
    -          )
    -          .then(() => {
    -            this.inputName.focus();
    -            gZenWorkspaces.workspaceElement(this.workspaceId).hidden = false;
    -          });
    +        let animation = gZenUIManager.motion.animate(
    +          this.elementsToAnimate,
    +          {
    +            y: [20, 0],
    +            opacity: [0, 1],
    +            filter: ["blur(2px)", "blur(0)"],
    +          },
    +          {
    +            duration: 0.6,
    +            type: "spring",
    +            bounce: 0,
    +            delay: gZenUIManager.motion.stagger(0.05, { startDelay: 0.2 }),
    +          }
    +        );
    +        if (gReduceMotion) {
    +          animation.complete();
    +        }
    +        animation.then(() => {
    +          this.inputName.focus();
    +          gZenWorkspaces.workspaceElement(this.workspaceId).hidden = false;
    +        });
           });
       }
     
    @@ -303,20 +305,22 @@ class nsZenWorkspaceCreation extends MozXULElement {
       }
     
       async #cleanup() {
    -    await gZenUIManager.motion.animate(
    -      this.elementsToAnimate.reverse(),
    -      {
    -        y: [0, 20],
    -        opacity: [1, 0],
    -        filter: ["blur(0)", "blur(2px)"],
    -      },
    -      {
    -        duration: 0.4,
    -        type: "spring",
    -        bounce: 0,
    -        delay: gZenUIManager.motion.stagger(0.05),
    -      }
    -    );
    +    if (!gReduceMotion) {
    +      await gZenUIManager.motion.animate(
    +        this.elementsToAnimate.reverse(),
    +        {
    +          y: [0, 20],
    +          opacity: [1, 0],
    +          filter: ["blur(0)", "blur(2px)"],
    +        },
    +        {
    +          duration: 0.4,
    +          type: "spring",
    +          bounce: 0,
    +          delay: gZenUIManager.motion.stagger(0.05),
    +        }
    +      );
    +    }
     
         document.getElementById("zen-sidebar-splitter").style.pointerEvents = "";
     
    diff --git a/src/zen/spaces/ZenSpaceManager.mjs b/src/zen/spaces/ZenSpaceManager.mjs
    index e1d619ab8..53dcf5bed 100644
    --- a/src/zen/spaces/ZenSpaceManager.mjs
    +++ b/src/zen/spaces/ZenSpaceManager.mjs
    @@ -44,6 +44,10 @@ class nsZenWorkspaces {
       _workspaceCache = [];
     
       #lastScrollTime = 0;
    +  #currentSpaceSwitchContext = {
    +    promise: null,
    +    animations: [],
    +  };
     
       bookmarkMenus = [
         "PlacesToolbar",
    @@ -777,7 +781,7 @@ class nsZenWorkspaces {
         if (
           !this.privateWindowOrDisabled &&
           spacesFromStore.length === 0 &&
    -      lazy.ZenSessionStore._migrationData
    +      lazy.ZenSessionStore._migrationData?.spaces
         ) {
           spacesFromStore.push(...lazy.ZenSessionStore._migrationData.spaces);
         }
    @@ -871,10 +875,12 @@ class nsZenWorkspaces {
         };
     
         let removedEmptyTab = false;
    +    let initialTabWasEmpty = false;
         if (
           this._initialTab &&
           !(this._initialTab._shouldRemove && this._initialTab._veryPossiblyEmpty)
         ) {
    +      initialTabWasEmpty = !!this._initialTab._veryPossiblyEmpty;
           gBrowser.selectedTab = this._initialTab;
           this.moveTabToWorkspace(this._initialTab, this.activeWorkspace);
           gBrowser.moveTabTo(this._initialTab, {
    @@ -939,7 +945,12 @@ class nsZenWorkspaces {
           delete this._initialTab;
         }
     
    -    showed &&= Services.prefs.getBoolPref("zen.urlbar.open-on-startup", true);
    +    const openOnStartup = Services.prefs.getBoolPref(
    +      "zen.urlbar.open-on-startup",
    +      true
    +    );
    +    showed &&= openOnStartup;
    +    initialTabWasEmpty &&= openOnStartup;
     
         // Wait for the next event loop to ensure that the startup focus logic by
         // firefox has finished doing it's thing.
    @@ -947,7 +958,9 @@ class nsZenWorkspaces {
           setTimeout(() => {
             if (gZenVerticalTabsManager._canReplaceNewTab && showed) {
               BrowserCommands.openTab();
    -        } else if (!showed) {
    +        } else if (showed || initialTabWasEmpty) {
    +          openLocation();
    +        } else {
               gBrowser.selectedBrowser.focus();
             }
           });
    @@ -1062,6 +1075,7 @@ class nsZenWorkspaces {
       }
     
       handleTabBeforeClose(tab, closeWindowWithLastTab) {
    +    delete this._isClosingWindow;
         if (
           !this.workspaceEnabled ||
           this.__contextIsDelete ||
    @@ -1096,10 +1110,6 @@ class nsZenWorkspaces {
               // This call actually closes the window, unless the user
               // cancels the operation.  We are finished here in both cases.
               this._isClosingWindow = true;
    -          // Inside a setTimeout to avoid reentrancy issues.
    -          setTimeout(() => {
    -            document.getElementById("cmd_closeWindow").doCommand();
    -          }, 100);
             }
             return null;
           }
    @@ -1110,6 +1120,19 @@ class nsZenWorkspaces {
         return null;
       }
     
    +  handleTabBeforeRemove() {
    +    // We run this AFTER the beforeunload event check, so we can
    +    // be sure that if we get here, the tab is actually going to be removed,
    +    // and beforeunload won't be called again. See gh-12922 for an example.
    +    if (!this.workspaceEnabled || !this._isClosingWindow) {
    +      return;
    +    }
    +    // Inside a setTimeout to avoid reentrancy issues.
    +    setTimeout(() => {
    +      document.getElementById("cmd_closeWindow").doCommand();
    +    }, 100);
    +  }
    +
       addPopupListeners() {
         const workspaceActions = document.getElementById("zenWorkspaceMoreActions");
         workspaceActions.addEventListener(
    @@ -1528,7 +1551,7 @@ class nsZenWorkspaces {
             !tab.hasAttribute("pending")
         );
     
    -    await gBrowser.explicitUnloadTabs(tabsToUnload); // TODO: unit test this
    +    await gBrowser.explicitUnloadTabs(tabsToUnload);
       }
     
       moveTabToWorkspace(tab, workspaceID) {
    @@ -1621,9 +1644,18 @@ class nsZenWorkspaces {
       }
     
       async changeWorkspace(workspace, ...args) {
    -    if (!this.workspaceEnabled || this.#inChangingWorkspace) {
    +    if (!this.workspaceEnabled) {
           return;
         }
    +    this.#currentSpaceSwitchContext.animations.forEach(animation => {
    +      animation.complete();
    +    });
    +    await this.#currentSpaceSwitchContext.promise;
    +    let { resolve, promise } = Promise.withResolvers();
    +    this.#currentSpaceSwitchContext = {
    +      promise,
    +      animations: [],
    +    };
         this.#inChangingWorkspace = true;
         try {
           this.log("Changing workspace to", workspace?.uuid);
    @@ -1632,10 +1664,11 @@ class nsZenWorkspaces {
           console.error("gZenWorkspaces: Error changing workspace", e);
         }
         this.#inChangingWorkspace = false;
    +    resolve();
       }
     
       _cancelSwipeAnimation() {
    -    this._animateTabs(this.getActiveWorkspaceFromCache(), true);
    +    this.#animateTabs(this.getActiveWorkspaceFromCache(), true);
       }
     
       async #performWorkspaceChange(
    @@ -1913,7 +1946,7 @@ class nsZenWorkspaces {
       }
     
       /* eslint-disable complexity */
    -  async _animateTabs(
    +  async #animateTabs(
         newWorkspace,
         shouldAnimate,
         tabToSelect = null,
    @@ -2243,12 +2276,14 @@ class nsZenWorkspaces {
         let promiseTimeout = new Promise(resolve =>
           setTimeout(resolve, kGlobalAnimationDuration * 1000 + 50)
         );
    +    this.#currentSpaceSwitchContext.animations = animations;
         // See issue https://github.com/zen-browser/desktop/issues/9334, we need to add
         // some sort of timeout to the animation promise, just in case it gets stuck.
         // We are doing a race between the timeout and the animations finishing.
         await Promise.race([Promise.all(animations), promiseTimeout]).catch(
           console.error
         );
    +    this.#currentSpaceSwitchContext.animations = [];
         document.documentElement.removeAttribute("animating-background");
         if (shouldAnimate) {
           for (const cloned of clonedEssentials) {
    @@ -2410,7 +2445,7 @@ class nsZenWorkspaces {
     
         gZenUIManager.tabsWrapper.scrollbarWidth = "none";
         this.workspaceIcons.activeIndex = workspace.uuid;
    -    await this._animateTabs(
    +    await this.#animateTabs(
           workspace,
           !onInit && !this._animatingChange,
           tabToSelect,
    @@ -2434,8 +2469,14 @@ class nsZenWorkspaces {
           }
         }
     
    -    // Reset bookmarks
    -    this.#invalidateBookmarkContainers();
    +    // Avoid forcing a startup toolbar rebuild when there are no
    +    // workspace-specific bookmark assignments to apply.
    +    const hasWorkspaceBookmarks = !!Object.keys(
    +      this._workspaceBookmarksCache?.bookmarks || {}
    +    ).length;
    +    if (!onInit || hasWorkspaceBookmarks) {
    +      this.#invalidateBookmarkContainers();
    +    }
     
         // Update workspace indicator
         await this.updateWorkspaceIndicator(workspace, this.workspaceIndicator);
    diff --git a/src/zen/spaces/zen-workspaces.css b/src/zen/spaces/zen-workspaces.css
    index e9ebba75e..97a2c11a3 100644
    --- a/src/zen/spaces/zen-workspaces.css
    +++ b/src/zen/spaces/zen-workspaces.css
    @@ -309,13 +309,16 @@
     /* mark: workspace element */
     zen-workspace {
       flex-direction: column;
    -  transition: padding-top 0.1s;
       width: calc(100% + var(--zen-toolbox-padding) * 2);
       position: absolute;
       height: 100%;
       overflow: hidden;
       color: var(--toolbox-textcolor);
     
    +  @media not (prefers-reduced-motion: reduce) {
    +    transition: padding-top 0.1s;
    +  }
    +
       :root:not([zen-sidebar-expanded='true']) & {
         width: 100%;
       }
    diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs
    index 40d0053f9..dbc99e678 100644
    --- a/src/zen/split-view/ZenViewSplitter.mjs
    +++ b/src/zen/split-view/ZenViewSplitter.mjs
    @@ -1164,12 +1164,16 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
       insetUpdateContextMenuItems() {
         const contentAreaContextMenu = document.getElementById("tabContextMenu");
         contentAreaContextMenu.addEventListener("popupshowing", () => {
    -      let isExistingSplitView = gBrowser.selectedTabs.some(tab =>
    +      let contextTab = TabContextMenu.contextTab;
    +      let selectedTabs = contextTab.multiselected
    +        ? gBrowser.selectedTabs
    +        : [contextTab];
    +      let isExistingSplitView = selectedTabs.every(tab =>
             tab.group?.hasAttribute("split-view-group")
           );
           const splitTabCommand = document.getElementById("context_zenSplitTabs");
           document.l10n.setAttributes(splitTabCommand, "tab-zen-split-tabs", {
    -        tabCount: isExistingSplitView ? -1 : gBrowser.selectedTabs.length,
    +        tabCount: isExistingSplitView ? -1 : selectedTabs.length,
           });
           if (isExistingSplitView) {
             splitTabCommand.removeAttribute("hidden");
    @@ -1237,9 +1241,14 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
        * Splits the selected tabs.
        */
       contextSplitTabs() {
    -    const tabs = window.gBrowser.selectedTabs;
    -    // If any is already in a split view, we unsplit them first
    -    if (tabs.some(tab => tab.splitView)) {
    +    let tabs;
    +    if (TabContextMenu.contextTab.multiselected) {
    +      tabs = gBrowser.selectedTabs;
    +    } else {
    +      tabs = [TabContextMenu.contextTab];
    +    }
    +    // If all are already in a split view, we unsplit them first.
    +    if (tabs.every(tab => tab.splitView)) {
           for (const tab of tabs) {
             if (tab.splitView) {
               this.removeTabFromGroup(tab);
    @@ -1263,7 +1272,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
           return false;
         }
         for (const tab of window.gBrowser.selectedTabs) {
    -      if (tab.splitView || tab.hasAttribute("zen-empty-tab")) {
    +      if (tab.hasAttribute("zen-empty-tab")) {
             return false;
           }
         }
    diff --git a/src/zen/tabs/ZenEssentialsPromo.mjs b/src/zen/tabs/ZenEssentialsPromo.mjs
    index a62d1481e..c8e0c9397 100644
    --- a/src/zen/tabs/ZenEssentialsPromo.mjs
    +++ b/src/zen/tabs/ZenEssentialsPromo.mjs
    @@ -61,6 +61,8 @@ export function createZenEssentialsPromo(container = undefined) {
       const element = document.createXULElement(TAG_NAME);
       section.appendChild(element);
       section.essentialsPromo = element;
    +  // Trigger re-calculation of pinned height to avoid any flickering
    +  void section.offsetHeight;
       updatePinnedHeight();
       return "created";
     }
    diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs
    index 7d26334ca..8a8e4e832 100644
    --- a/src/zen/tabs/ZenPinnedTabManager.mjs
    +++ b/src/zen/tabs/ZenPinnedTabManager.mjs
    @@ -427,6 +427,11 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
         state.image = tab.zenStaticIcon || initialState.image;
         state.index = 0;
     
    +    // See gh-13024, we need to remove the scroll position from the state,
    +    // otherwise when we reset the pinned tab, it will scroll to the previous position
    +    // which can be confusing for the user, especially if they have a long page.
    +    delete state.scroll;
    +
         SessionStore.setTabState(tab, state);
         this.resetPinChangedUrl(tab);
       }
    @@ -673,14 +678,15 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
               return tab;
             }
             let workspaceId;
    +        if (
    +          !tab.hasAttribute("zen-essential") &&
    +          tab.getAttribute("zen-workspace-id") != gZenWorkspaces.activeWorkspace
    +        ) {
    +          workspaceId = gZenWorkspaces.activeWorkspace;
    +        }
             if (tab.ownerGlobal !== window) {
               fromDifferentWindow = true;
    -          if (
    -            !tab.hasAttribute("zen-essential") &&
    -            tab.getAttribute("zen-workspace-id") !=
    -              gZenWorkspaces.activeWorkspace
    -          ) {
    -            workspaceId = gZenWorkspaces.activeWorkspace;
    +          if (workspaceId) {
                 tab.ownerGlobal.gBrowser.selectedTab =
                   tab.ownerGlobal.gBrowser._findTabToBlurTo(tab, movingTabs);
                 tab.ownerGlobal.gZenWorkspaces.moveTabToWorkspace(tab, workspaceId);
    @@ -695,9 +701,9 @@ class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
               if (tab) {
                 ++newIndex;
               }
    -          if (workspaceId) {
    -            tab.setAttribute("zen-workspace-id", workspaceId);
    -          }
    +        }
    +        if (workspaceId) {
    +          tab.setAttribute("zen-workspace-id", workspaceId);
             }
             return tab;
           });
    diff --git a/src/zen/tabs/zen-tabs/vertical-tabs.css b/src/zen/tabs/zen-tabs/vertical-tabs.css
    index d7adddd34..b324a7116 100644
    --- a/src/zen/tabs/zen-tabs/vertical-tabs.css
    +++ b/src/zen/tabs/zen-tabs/vertical-tabs.css
    @@ -130,10 +130,14 @@
       height: 22px;
       border: none;
       width: 100%;
    -  transition:
    -    height 0.08s ease-in-out,
    -    padding 0.08s ease-in-out,
    -    opacity 0.06s ease-in-out;
    +
    +  @media not (prefers-reduced-motion: reduce) {
    +    transition:
    +      height 0.08s ease-in-out,
    +      padding 0.08s ease-in-out,
    +      opacity 0.06s ease-in-out;
    +  }
    +
       overflow: hidden;
       position: relative;
       opacity: 1;
    @@ -310,11 +314,13 @@
       }
     
       & .tabbrowser-tab {
    -    &,
    -    & .tab-content > image {
    -      transition:
    -        scale 0.07s ease,
    -        var(--zen-tabbox-element-indent-transition);
    +    @media not (prefers-reduced-motion: reduce) {
    +      &,
    +      & .tab-content > image {
    +        transition:
    +          scale 0.2s ease,
    +          var(--zen-tabbox-element-indent-transition);
    +      }
         }
     
         :root[zen-sidebar-expanded="true"] &:not([zen-glance-tab]) {
    @@ -329,12 +335,13 @@
         #tabbrowser-tabs:not([movingtab])
         &:active:not(:has(.tab-content > image:active)) {
           scale: var(--zen-active-tab-scale);
    +      rotate: 0.02deg; /* Subtle rotation to trigger GPU acceleration and prevent blurriness */
         }
     
         :root:not([zen-renaming-tab="true"])
         #tabbrowser-tabs:not([movingtab])
         & .tab-content > image:active {
    -      scale: 0.92;
    +      scale: 0.98;
         }
     
         & .tab-icon-image {
    @@ -1069,7 +1076,7 @@
       #tabs-newtab-button {
         max-height: var(--tab-min-height);
         display: flex !important;
    -    transition: scale 0.1s ease;
    +    transition: scale 0.2s ease;
         #tabbrowser-tabs[movingtab] & {
           transition: transform 0.1s ease;
         }
    diff --git a/src/zen/tests/spaces/browser.toml b/src/zen/tests/spaces/browser.toml
    index ac77baa44..deacec1f7 100644
    --- a/src/zen/tests/spaces/browser.toml
    +++ b/src/zen/tests/spaces/browser.toml
    @@ -24,4 +24,6 @@ support-files = [
     
     ["browser_private_mode_startup.js"]
     
    +["browser_unload_all_other_spaces.js"]
    +
     ["browser_workspace_bookmarks.js"]
    diff --git a/src/zen/tests/spaces/browser_unload_all_other_spaces.js b/src/zen/tests/spaces/browser_unload_all_other_spaces.js
    new file mode 100644
    index 000000000..0280519c1
    --- /dev/null
    +++ b/src/zen/tests/spaces/browser_unload_all_other_spaces.js
    @@ -0,0 +1,162 @@
    +/* Any copyright is dedicated to the Public Domain.
    +   https://creativecommons.org/publicdomain/zero/1.0/ */
    +
    +"use strict";
    +
    +add_setup(async function () {});
    +
    +// verify that with only one workspace, regular tabs should remain loaded
    +add_task(async function test_UnloadAllOtherWorkspace_oneWorkspace() {
    +  const workspace =
    +    await gZenWorkspaces.createAndSaveWorkspace("Test Workspace");
    +  const workspaceId = workspace.uuid;
    +  await gZenWorkspaces.changeWorkspace(workspace);
    +
    +  const tabs = [];
    +  for (let i = 0; i < 3; i++) {
    +    const tab = await BrowserTestUtils.openNewForegroundTab(
    +      window.gBrowser,
    +      `data:text/html,Hi! I am regular tab ${i}`,
    +      true,
    +      { skipAnimation: true }
    +    );
    +    tabs.push(tab);
    +  }
    +
    +  for (const tab of tabs) {
    +    ok(!tab.hasAttribute("pending"), "Tab should not be pending before unload");
    +    ok(tab.linkedPanel, "Tab should have linked panel before unload");
    +  }
    +
    +  await gZenWorkspaces.unloadAllOtherWorkspaces();
    +
    +  for (const tab of tabs) {
    +    ok(!tab.hasAttribute("pending"), "Tab should not be pending after unload");
    +    ok(tab.linkedPanel, "Tab should have linked panel after unload");
    +  }
    +
    +  await gZenWorkspaces.removeWorkspace(workspaceId);
    +});
    +
    +// with multiple workspaces, only regular tabs in other workspaces should be unloaded
    +add_task(async function test_UnloadAllOtherWorkspace_multipleWorkspaces() {
    +  const inactiveWorkspace =
    +    await gZenWorkspaces.createAndSaveWorkspace("Inactive Workspace");
    +  const activeWorkspace =
    +    await gZenWorkspaces.createAndSaveWorkspace("Active Workspace");
    +
    +  const inactiveWorkspaceId = inactiveWorkspace.uuid;
    +  const activeWorkspaceId = activeWorkspace.uuid;
    +
    +  const inactiveWorkspaceTabs = [];
    +  for (let i = 0; i < 2; i++) {
    +    const tab = await BrowserTestUtils.openNewForegroundTab(
    +      gBrowser,
    +      `data:text/html,Regular Tab ${i} in Inactive`,
    +      true,
    +      { skipAnimation: true }
    +    );
    +    tab.setAttribute("zen-workspace-id", inactiveWorkspaceId);
    +    inactiveWorkspaceTabs.push(tab);
    +  }
    +
    +  const activeWorkspaceTabs = [];
    +  for (let i = 0; i < 2; i++) {
    +    const tab = await BrowserTestUtils.openNewForegroundTab(
    +      gBrowser,
    +      `data:text/html,Regular Tab ${i} in Active`,
    +      true,
    +      { skipAnimation: true }
    +    );
    +    tab.setAttribute("zen-workspace-id", activeWorkspaceId);
    +    activeWorkspaceTabs.push(tab);
    +  }
    +
    +  await gZenWorkspaces.unloadAllOtherWorkspaces();
    +
    +  for (const tab of activeWorkspaceTabs) {
    +    ok(
    +      !tab.hasAttribute("pending"),
    +      "Tab in active workspace should not be unloaded"
    +    );
    +    ok(tab.linkedPanel, "Tab in active workspace should have linked panel");
    +  }
    +
    +  for (const tab of inactiveWorkspaceTabs) {
    +    ok(
    +      tab.hasAttribute("pending"),
    +      "Tab in inactive workspace should be unloaded"
    +    );
    +    ok(
    +      !tab.linkedPanel,
    +      "Tab in inactive workspace should not have linked panel"
    +    );
    +  }
    +  await gZenWorkspaces.removeWorkspace(inactiveWorkspaceId);
    +  await gZenWorkspaces.removeWorkspace(activeWorkspaceId);
    +});
    +
    +// essentials in any workspace are not unloaded
    +add_task(async function test_UnloadAllOtherWorkspace_essentials() {
    +  const activeWorkspace =
    +    await gZenWorkspaces.createAndSaveWorkspace("Active Workspace");
    +  const inactiveWorkspace =
    +    await gZenWorkspaces.createAndSaveWorkspace("Inactive Workspace");
    +
    +  const activeWorkspaceId = activeWorkspace.uuid;
    +  const inactiveWorkspaceId = inactiveWorkspace.uuid;
    +
    +  const activeWorkspaceTabs = [];
    +  for (let i = 0; i < 2; i++) {
    +    const tab = await BrowserTestUtils.openNewForegroundTab(
    +      gBrowser,
    +      `data:text/html,Essential Tab ${i} in Active`,
    +      true,
    +      { skipAnimation: true }
    +    );
    +    tab.setAttribute("zen-workspace-id", activeWorkspaceId);
    +    tab.setAttribute("zen-essential", "true");
    +    activeWorkspaceTabs.push(tab);
    +  }
    +
    +  const inactiveWorkspaceTabs = [];
    +  for (let i = 0; i < 2; i++) {
    +    const tab = await BrowserTestUtils.openNewForegroundTab(
    +      gBrowser,
    +      `data:text/html,Essential Tab ${i} in Inactive`,
    +      true,
    +      { skipAnimation: true }
    +    );
    +    gZenPinnedTabManager.addToEssentials(tab);
    +    inactiveWorkspaceTabs.push(tab);
    +  }
    +
    +  await gZenWorkspaces.unloadAllOtherWorkspaces();
    +
    +  for (const tab of activeWorkspaceTabs) {
    +    ok(
    +      !tab.hasAttribute("pending"),
    +      "Essential Tab in active workspace should not be unloaded"
    +    );
    +    ok(
    +      tab.linkedPanel,
    +      "Essential Tab in active workspace should have linked panel"
    +    );
    +  }
    +
    +  for (const tab of inactiveWorkspaceTabs) {
    +    ok(
    +      !tab.hasAttribute("pending"),
    +      "Essential Tab in inactive workspace should not be unloaded"
    +    );
    +    ok(
    +      tab.linkedPanel,
    +      "Essential Tab in inactive workspace should have linked panel"
    +    );
    +  }
    +  for (const tab of inactiveWorkspaceTabs) {
    +    gBrowser.removeTab(tab);
    +  }
    +  await gZenWorkspaces.removeWorkspace(inactiveWorkspaceId);
    +  await gZenWorkspaces.removeWorkspace(activeWorkspaceId);
    +});
    diff --git a/surfer.json b/surfer.json
    index 28bc5aec7..0d514c975 100644
    --- a/surfer.json
    +++ b/surfer.json
    @@ -5,8 +5,8 @@
       "binaryName": "zen",
       "version": {
         "product": "firefox",
    -    "version": "148.0.2",
    -    "candidate": "149.0",
    +    "version": "149.0.2",
    +    "candidate": "149.0.2",
         "candidateBuild": 1
       },
       "buildOptions": {
    @@ -20,7 +20,7 @@
           "brandShortName": "Zen",
           "brandFullName": "Zen Browser",
           "release": {
    -        "displayVersion": "1.19.3b",
    +        "displayVersion": "1.19.8b",
             "github": {
               "repo": "zen-browser/desktop"
             },