diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 8aecf8450..d67c60651 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -266,9 +266,11 @@ jobs:
- name: Compress
run: |
- cd engine
- tar --use-compress-program=zstd -hcf ../zen.source.tar.zst *
- cd ..
+ tar \
+ --exclude='./.git' \
+ --use-compress-program=zstd \
+ -hcf zen.source.tar.zst \
+ -C engine .
- name: Upload artifact
uses: actions/upload-artifact@v4
diff --git a/.github/workflows/code-linter.yml b/.github/workflows/code-linter.yml
index 74e17d709..decb9dcac 100644
--- a/.github/workflows/code-linter.yml
+++ b/.github/workflows/code-linter.yml
@@ -27,8 +27,11 @@ jobs:
with:
node-version-file: '.nvmrc'
- - name: Setup autopep8
- run: sudo apt install python3-autopep8
+ - name: Setup and run autopep8
+ if: ${{ contains(join(github.event.commits.*.modified, ' '), '.py') || contains(join(github.event.commits.*.added, ' '), '.py') || contains(join(github.event.commits.*.removed, ' '), '.py') }}
+ run: |
+ sudo apt install python3-autopep8
+ autopep8 --diff scripts/ src/
- name: Install dependencies
run: npm ci
diff --git a/.github/workflows/macos-release-build.yml b/.github/workflows/macos-release-build.yml
index 724133008..a4e5a48b5 100644
--- a/.github/workflows/macos-release-build.yml
+++ b/.github/workflows/macos-release-build.yml
@@ -26,7 +26,7 @@ on:
jobs:
mac-build:
name: Build macOS - ${{ matrix.arch }}
- runs-on: macos-15
+ runs-on: macos-26
strategy:
fail-fast: false
diff --git a/.github/workflows/macos-universal-release-build.yml b/.github/workflows/macos-universal-release-build.yml
index 933d9766f..a85824927 100644
--- a/.github/workflows/macos-universal-release-build.yml
+++ b/.github/workflows/macos-universal-release-build.yml
@@ -15,7 +15,7 @@ on:
jobs:
mac-build:
name: Unify macOS (Universal)
- runs-on: 'macos-15'
+ runs-on: 'macos-26'
strategy:
fail-fast: false
diff --git a/README.md b/README.md
index 3a81ce9d6..f9166612c 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 `143.0.1`! 🚀
-- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 143.0.1`!
+- [`Release`](https://zen-browser.app/download) - Is currently built using Firefox version `144.0`! 🚀
+- [`Twilight`](https://zen-browser.app/download?twilight) - Is currently built using Firefox version `RC 144.0`!
### Contributing
diff --git a/build/firefox-cache/l10n-last-commit-hash b/build/firefox-cache/l10n-last-commit-hash
index e2d858a12..34eb47c39 100644
--- a/build/firefox-cache/l10n-last-commit-hash
+++ b/build/firefox-cache/l10n-last-commit-hash
@@ -1 +1 @@
-1b0467f0c46520bbed6648f6583a9ba6710d76cb
\ No newline at end of file
+16e978d10b8a1c49267e8f1574f52c3e0d5089ae
\ No newline at end of file
diff --git a/build/flatpak/app.zen_browser.zen.yml.template b/build/flatpak/app.zen_browser.zen.yml.template
index d18329c46..821b0f1e6 100644
--- a/build/flatpak/app.zen_browser.zen.yml.template
+++ b/build/flatpak/app.zen_browser.zen.yml.template
@@ -7,7 +7,7 @@ base-version: '24.08'
add-extensions:
org.freedesktop.Platform.ffmpeg-full:
directory: lib/ffmpeg
- version: '24.08'
+ version: '24.08.26'
add-ld-path: .
app.zen_browser.zen.systemconfig:
directory: etc/zen
diff --git a/build/winsign/sign.ps1 b/build/winsign/sign.ps1
index 1e06067b6..17aa67f9d 100644
--- a/build/winsign/sign.ps1
+++ b/build/winsign/sign.ps1
@@ -35,7 +35,9 @@ Start-Job -Name "SurferInit" -ScriptBlock {
param($PWD)
cd $PWD
npm run import -- --verbose
- npm run surfer -- ci --brand release
+ $surferJson = Get-Content surfer.json | ConvertFrom-Json
+ $version = $surferJson.brands.release.release.displayVersion
+ npm run ci -- $version
} -Verbose -ArgumentList $PWD -Debug
echo "Downloading artifacts info"
diff --git a/docs/issue-metrics/2025_2025-09-01..2025-09-30.md b/docs/issue-metrics/2025_2025-09-01..2025-09-30.md
new file mode 100644
index 000000000..e7a494c53
--- /dev/null
+++ b/docs/issue-metrics/2025_2025-09-01..2025-09-30.md
@@ -0,0 +1,280 @@
+# Issue Metrics
+
+| Metric | Average | Median | 90th percentile |
+| --- | --- | --- | ---: |
+| Time to first response | 17:16:35 | 3:11:05 | 1 day, 7:58:23 |
+| Time to close | 1 day, 8:59:53 | 8:32:05 | 3 days, 14:43:34 |
+
+| Metric | Count |
+| --- | ---: |
+| Number of items that remain open | 123 |
+| Number of items closed | 139 |
+| Total number of items created | 262 |
+
+| Title | URL | Time to first response | Time to close |
+| --- | --- | --- | --- |
+| Auto PIP not working upon tab switch | https://github.com/zen-browser/desktop/issues/10645 | None | None |
+| URL bar Opening on the left side of the browser when clicked on new tab | https://github.com/zen-browser/desktop/issues/10642 | None | None |
+| Browser opens on wrong monitor on macOS | https://github.com/zen-browser/desktop/issues/10639 | None | None |
+| All tabs are lost after each update | https://github.com/zen-browser/desktop/issues/10638 | 2:25:57 | None |
+| Sidebar expands independently | https://github.com/zen-browser/desktop/issues/10637 | 2:21:31 | None |
+| Onboarding broken (tiny window) on flatpak version | https://github.com/zen-browser/desktop/issues/10635 | None | None |
+| Bitwarden extension not synching (self hosted) | https://github.com/zen-browser/desktop/issues/10634 | None | None |
+| Zen completely freezes when clicking on "New Tab" | https://github.com/zen-browser/desktop/issues/10632 | None | None |
+| Zen Browser URL Bar: Search Engine Highlight Rectangle Looks Broken in Input Mode | https://github.com/zen-browser/desktop/issues/10630 | 9:01:57 | 9:01:57 |
+| Url bar doesn't fully appear | https://github.com/zen-browser/desktop/issues/10629 | 1:51:21 | 9:11:03 |
+| 1Password Autofill/Universal Autofill feature fails silently | https://github.com/zen-browser/desktop/issues/10627 | None | None |
+| Moxfield Bug | https://github.com/zen-browser/desktop/issues/10626 | 16:58:48 | 16:58:48 |
+| Tabs are not restored on Startup | https://github.com/zen-browser/desktop/issues/10625 | 0:03:14 | None |
+| Zen uses `$HOME/.mozilla/native-messaging-hosts/` instead of `$HOME/.zen/native-messaging-hosts/` | https://github.com/zen-browser/desktop/issues/10622 | None | None |
+| No video with supported format and MIME type found | https://github.com/zen-browser/desktop/issues/10620 | 4:38:39 | 4:38:39 |
+| Youtube window size | https://github.com/zen-browser/desktop/issues/10619 | None | None |
+| Webpage UI elements glitching and not fully rendering | https://github.com/zen-browser/desktop/issues/10615 | None | None |
+| bookmarks toolbar failed to collapse automatically in single toolbar mode + compact mode | https://github.com/zen-browser/desktop/issues/10612 | None | 8:56:43 |
+| Closing "New Tab" in the "List all tabs" toolbar widget causes zen to not exit cleanly | https://github.com/zen-browser/desktop/issues/10610 | 1:45:50 | 12:56:07 |
+| Opening link in new tab switches focus to new tab instead of staying on current tab | https://github.com/zen-browser/desktop/issues/10609 | 2:14:04 | 13:39:31 |
+| Webpage flickering/glitching during normal browsing | https://github.com/zen-browser/desktop/issues/10605 | None | None |
+| Essentials Get jumbled when reopening the browser | https://github.com/zen-browser/desktop/issues/10602 | 0:19:34 | 0:45:36 |
+| Entering ecom in URL bar shows compact mode as first suggestion. | https://github.com/zen-browser/desktop/issues/10601 | 6:27:16 | 6:27:16 |
+| Loads of empty windows opening on startup and mysterious tray icon | https://github.com/zen-browser/desktop/issues/10598 | None | None |
+| URLbar becomes invisible after bookmarking a tab. | https://github.com/zen-browser/desktop/issues/10597 | None | None |
+| Workspace icons too small with narrow sidebar | https://github.com/zen-browser/desktop/issues/10596 | None | 8:06:55 |
+| Top toolbar has no background in compact mode after changing space until the URL bar is hovered | https://github.com/zen-browser/desktop/issues/10595 | None | 1:45:30 |
+| Video controls going under the screen when in fullscreen using Zen in fullscreen mode | https://github.com/zen-browser/desktop/issues/10594 | None | None |
+| Multiple instances of Zen for each tab | https://github.com/zen-browser/desktop/issues/10593 | 4:55:51 | 4:55:51 |
+| Tabs Disappear | https://github.com/zen-browser/desktop/issues/10592 | None | 6:02:25 |
+| Cannot upgrade from `1.15.5b` to `1.16.1b` | https://github.com/zen-browser/desktop/issues/10590 | None | None |
+| New windows come up with ~200 copies of the same link in the pinned tab of some workspaces | https://github.com/zen-browser/desktop/issues/10589 | None | 15:51:30 |
+| on_TabGroupsCollapse is hiding currently open tabs | https://github.com/zen-browser/desktop/issues/10587 | 18:18:04 | 18:18:04 |
+| websites don't properly go fullscreen in split view on Wayland and windows | https://github.com/zen-browser/desktop/issues/10586 | None | 21:23:38 |
+| Active tabs and URLs not prioritized in URL bar over extensions | https://github.com/zen-browser/desktop/issues/10582 | 8:32:05 | 8:32:05 |
+| Always floating URL bar does not float on new tab with replace-newtab disabled | https://github.com/zen-browser/desktop/issues/10581 | None | None |
+| URL bar not respecting browser.urlbar.maxRichResults setting | https://github.com/zen-browser/desktop/issues/10580 | 0:11:00 | None |
+| "Zoom" Icon is missing in the Application Menu | https://github.com/zen-browser/desktop/issues/10578 | 1 day, 2:23:42 | None |
+| Search/New Tab Popup Misplaced in Compact Mode (Hidden Vertical Tab Bar) | https://github.com/zen-browser/desktop/issues/10576 | 0:50:41 | 1:38:50 |
+| Essentials Tab | https://github.com/zen-browser/desktop/issues/10575 | 2:40:40 | 5:34:25 |
+| Udemy - problem with movies | https://github.com/zen-browser/desktop/issues/10571 | 1:11:04 | 1:11:04 |
+| Fully lost all data | https://github.com/zen-browser/desktop/issues/10568 | 9:29:58 | 10:31:54 |
+| Flatpak fails to launch on Fedora 42 (clone() failure EPERM) | https://github.com/zen-browser/desktop/issues/10567 | 1:22:23 | 3:40:35 |
+| The top bar in compact mode is not controlled by the theme, it appears white | https://github.com/zen-browser/desktop/issues/10566 | 1:47:24 | 1:47:24 |
+| Pinned extension render bug: pinned extensions are floating on the web page | https://github.com/zen-browser/desktop/issues/10565 | None | None |
+| Home link not appearing | https://github.com/zen-browser/desktop/issues/10563 | 0:42:18 | 2:59:02 |
+| Connection to "incoming.telemetry.mozilla.org" on startup. | https://github.com/zen-browser/desktop/issues/10560 | 3:29:10 | 21:14:29 |
+| Command bar actions not work if they are not translated to selected language | https://github.com/zen-browser/desktop/issues/10559 | None | 4:06:26 |
+| the address bar does not respect the color theme when compact mode is enabled | https://github.com/zen-browser/desktop/issues/10557 | 0:14:27 | 0:14:27 |
+| Browser crashing on media playback as of 1.16.1b on Nvidia Wayland (VA-API) | https://github.com/zen-browser/desktop/issues/10555 | 0:14:09 | None |
+| Split View preview effect still remains after using the Escape key | https://github.com/zen-browser/desktop/issues/10554 | 3:49:15 | 1 day, 0:27:29 |
+| Spotify is not working | https://github.com/zen-browser/desktop/issues/10553 | 1:42:55 | 1:42:55 |
+| Command bar features doesn't work with other langage than english | https://github.com/zen-browser/desktop/issues/10551 | None | 0:01:48 |
+| Nested CSS transform breaks backdrop blur | https://github.com/zen-browser/desktop/issues/10550 | 0:55:22 | 1:22:05 |
+| (MINOR) URL bar: custom search engine name has uneven background fill than its icon | https://github.com/zen-browser/desktop/issues/10546 | None | None |
+| Special unicode characters (Chinese, Korean, Japanese, etc.) are not showing | https://github.com/zen-browser/desktop/issues/10545 | 3:45:25 | None |
+| Computer hard freezes when zen is open with performance intensive tasks going in the background | https://github.com/zen-browser/desktop/issues/10544 | None | None |
+| 软件开启使用一会后,右上角关闭按钮失效 | https://github.com/zen-browser/desktop/issues/10543 | 5:28:33 | 5:28:33 |
+| Bookmark menu shows up in wrong place, and its entries' context menu has weird layout problem | https://github.com/zen-browser/desktop/issues/10542 | None | None |
+| Find bar changes into plain white bar when "X" is clicked | https://github.com/zen-browser/desktop/issues/10541 | 8:22:04 | 10:27:21 |
+| browser.tabs.closeWindowWithLastTab doesn't work anymore on v1.16.1b | https://github.com/zen-browser/desktop/issues/10540 | 10:59:55 | None |
+| Some UI Elements are Missing On Some Sites | https://github.com/zen-browser/desktop/issues/10538 | 2:19:13 | 3 days, 22:36:11 |
+| Browser Freeze on Passkey Call&CallBack Failure | https://github.com/zen-browser/desktop/issues/10533 | None | None |
+| Wrong sidebar color in compact mode | https://github.com/zen-browser/desktop/issues/10532 | 0:48:09 | 1 day, 17:09:58 |
+| Playing Audio icon inconsistent on tabs not focused on linux | https://github.com/zen-browser/desktop/issues/10531 | None | 21:06:12 |
+| Missing "Edit Theme" button in the right click menu | https://github.com/zen-browser/desktop/issues/10530 | 0:56:54 | 1 day, 17:21:25 |
+| Stars are shown all over all websites | https://github.com/zen-browser/desktop/issues/10529 | 18:59:14 | None |
+| v1.16b not available on flathub | https://github.com/zen-browser/desktop/issues/10528 | 3:10:02 | 5:21:21 |
+| Firefox-Zen browser name inconsistency in error page | https://github.com/zen-browser/desktop/issues/10527 | None | None |
+| Highlight mini window doesn't close automatically | https://github.com/zen-browser/desktop/issues/10526 | None | None |
+| Zen Browser maximized window overlaps with Windows taskbar area | https://github.com/zen-browser/desktop/issues/10525 | None | 0:37:13 |
+| Spotify Skipping 7 Songs | https://github.com/zen-browser/desktop/issues/10524 | 2:57:34 | 2:57:34 |
+| McAfee notifactions from Zen Browser | https://github.com/zen-browser/desktop/issues/10522 | None | 0:24:17 |
+| Zen Browser crashes occasionally when I download a file | https://github.com/zen-browser/desktop/issues/10520 | 13:03:32 | None |
+| (SERIOUS BUG DONT IGNORE) Split tab bug report | https://github.com/zen-browser/desktop/issues/10519 | None | 0:01:36 |
+| tab spliting issue | https://github.com/zen-browser/desktop/issues/10517 | None | 0:51:11 |
+| Rounded window borders cause choppy scrolling. | https://github.com/zen-browser/desktop/issues/10516 | None | None |
+| Closing the last tab cannot automatically create a new tab | https://github.com/zen-browser/desktop/issues/10515 | 14:08:09 | 14:08:09 |
+| Pinned tabs always load from cache. | https://github.com/zen-browser/desktop/issues/10514 | 1:49:05 | None |
+| Command Bar works only in english language | https://github.com/zen-browser/desktop/issues/10509 | 0:10:10 | 0:10:10 |
+| Pop up windows don't close properly | https://github.com/zen-browser/desktop/issues/10506 | None | None |
+| When accessing Alibaba Cloud DataWorks using the Zen browser, it will report Path Not Found: /page/errorbrowser, or Not Online? | https://github.com/zen-browser/desktop/issues/10503 | 10:29:49 | 10:30:28 |
+| Floating url bar not appering where it is suposed to | https://github.com/zen-browser/desktop/issues/10502 | 3:09:03 | 11:51:16 |
+| Split tabs are not aligned with other tabs | https://github.com/zen-browser/desktop/issues/10501 | 0:15:04 | 2 days, 14:12:29 |
+| Microsoft Entra Platform SSO on MacOS | https://github.com/zen-browser/desktop/issues/10498 | 2 days, 12:29:33 | None |
+| Dragging a split panel to the sidebar opens search for panel id | https://github.com/zen-browser/desktop/issues/10495 | 0:42:53 | None |
+| After closing all tabs, cmd / ctrl + W does not close the window | https://github.com/zen-browser/desktop/issues/10493 | 1:22:58 | 1:22:58 |
+| Youtube lags when adblocker is installed. [Seemingly fixed] | https://github.com/zen-browser/desktop/issues/10492 | 4:34:01 | 4:34:01 |
+| URL Bar mispositioning | https://github.com/zen-browser/desktop/issues/10490 | 0:35:10 | 2:15:20 |
+| Fullscreen F11 | https://github.com/zen-browser/desktop/issues/10489 | 21:42:02 | 3 days, 20:34:06 |
+| Combined tabs are not shown properly in the navigation menu | https://github.com/zen-browser/desktop/issues/10488 | 0:41:09 | None |
+| Translucent color codes do not appear translucent in toolbar themes | https://github.com/zen-browser/desktop/issues/10487 | 6:19:55 | None |
+| Discord always requires me to log in after closing Zen | https://github.com/zen-browser/desktop/issues/10482 | 7 days, 13:26:09 | None |
+| 1.16b crashes a lot on Windows 11 | https://github.com/zen-browser/desktop/issues/10481 | 0:19:54 | None |
+| There is bug on perplexity.ai | https://github.com/zen-browser/desktop/issues/10480 | 2:16:15 | 1 day, 10:27:53 |
+| Theme bug when Zen not focused. | https://github.com/zen-browser/desktop/issues/10479 | 2:39:03 | None |
+| Hiding top bar in collapsed bar mode is white | https://github.com/zen-browser/desktop/issues/10478 | 12:23:32 | 7 days, 4:09:44 |
+| URL preview in split screen always appears on focused window | https://github.com/zen-browser/desktop/issues/10477 | 1:20:54 | None |
+| After the update, all loose tabs disappeared!!! | https://github.com/zen-browser/desktop/issues/10476 | None | None |
+| Compact Mode Url position | https://github.com/zen-browser/desktop/issues/10475 | 2:15:11 | 4:17:47 |
+| Zen captures all touchpad input and no other applications receive it, even if they're in the foreground (including desktop) | https://github.com/zen-browser/desktop/issues/10474 | None | None |
+| Toolbar 'Edit Theme' features broken | https://github.com/zen-browser/desktop/issues/10473 | None | 12:09:50 |
+| Camera / Microphone Permissions | https://github.com/zen-browser/desktop/issues/10471 | 0:09:35 | None |
+| Cannot drag sidebar tabs | https://github.com/zen-browser/desktop/issues/10466 | 7 days, 19:48:26 | None |
+| tool bar not responsive | https://github.com/zen-browser/desktop/issues/10465 | None | None |
+| Zen adaptive history doesn't work (auto-suggestions don't change ranks) | https://github.com/zen-browser/desktop/issues/10464 | 6:38:12 | None |
+| Udemy Videos not playing(some DRM issue) | https://github.com/zen-browser/desktop/issues/10462 | 0:26:28 | 0:26:28 |
+| Clicking a link to open to a new tab from a page in a folder opens outside of the folder instead of staying inside it | https://github.com/zen-browser/desktop/issues/10461 | 1:22:00 | 1:36:41 |
+| bookmark tool bar on full screen mode | https://github.com/zen-browser/desktop/issues/10460 | 7:11:57 | None |
+| Compact mode: hide tab not work | https://github.com/zen-browser/desktop/issues/10459 | 7:21:59 | 7:26:31 |
+| Error Building on mac, suggested fix as well | https://github.com/zen-browser/desktop/issues/10458 | None | None |
+| Clicking on a duplicated tab of an essential tab causes switching to the last workspace | https://github.com/zen-browser/desktop/issues/10457 | 2 days, 11:37:42 | None |
+| Very long opening times | https://github.com/zen-browser/desktop/issues/10456 | 1 day, 12:13:47 | None |
+| Browser window doesn't close when closing last tab | https://github.com/zen-browser/desktop/issues/10455 | None | 22:08:46 |
+| Passkeys not supported | https://github.com/zen-browser/desktop/issues/10454 | 2:29:55 | 2 days, 8:28:48 |
+| Focus Bitwader | https://github.com/zen-browser/desktop/issues/10447 | 1 day, 6:48:09 | 1 day, 6:48:09 |
+| Unable to change workspace name | https://github.com/zen-browser/desktop/issues/10446 | None | None |
+| Udemy video's don't play in Zen. | https://github.com/zen-browser/desktop/issues/10443 | 0:52:31 | 1 day, 21:47:45 |
+| SoundCloud audio stops when joining Discord voice in browser | https://github.com/zen-browser/desktop/issues/10441 | None | None |
+| Calling browser.search.search (from webextensions API) opens glance window instead of new tab. | https://github.com/zen-browser/desktop/issues/10439 | 1:36:27 | None |
+| Side bar expands when you remove pinned extension. | https://github.com/zen-browser/desktop/issues/10438 | 1 day, 2:34:08 | None |
+| Compact mode X Bookmarks on Zen startup / Closing all pages | https://github.com/zen-browser/desktop/issues/10436 | 0:10:16 | None |
+| Zen using more resources while using adblocking dns then ublock. | https://github.com/zen-browser/desktop/issues/10435 | 4:22:57 | 2 days, 3:07:53 |
+| WebRender crashes and switches to Software rendering | https://github.com/zen-browser/desktop/issues/10432 | 5:25:30 | None |
+| When there are 2 rows of essentials, essentials can only be moved up, not down | https://github.com/zen-browser/desktop/issues/10428 | 1:54:32 | 8 days, 4:33:00 |
+| moz-extension page doesnt load for distill web monitor | https://github.com/zen-browser/desktop/issues/10427 | None | None |
+| Sidebar incorrectly overlapping with address bar | https://github.com/zen-browser/desktop/issues/10426 | None | None |
+| Unexpected window pops when aborting bitwarden validation | https://github.com/zen-browser/desktop/issues/10419 | 0:47:28 | 1:04:53 |
+| Redundant `margin-left` on `#sidebar-box` when zen tabs are on the right | https://github.com/zen-browser/desktop/issues/10415 | None | 5:41:18 |
+| Toolbar cannot be automatically hidden in the compact mode | https://github.com/zen-browser/desktop/issues/10414 | 6:26:39 | None |
+| Closing and then reopening the last tab that's part of a split screen (3+ split screen tabs) breaks the split screen | https://github.com/zen-browser/desktop/issues/10413 | None | 14:22:44 |
+| Opening links from external apps creates a new window but doesn’t redirect to the target URL | https://github.com/zen-browser/desktop/issues/10409 | None | None |
+| No Youtube Live Chat | https://github.com/zen-browser/desktop/issues/10408 | 0:14:57 | None |
+| Pinned tab is not focused when closing child tab; focus snaps to last pin instead of owner | https://github.com/zen-browser/desktop/issues/10407 | 1:28:19 | 1:28:19 |
+| Huge CPU usage and RAM comsumption when idle | https://github.com/zen-browser/desktop/issues/10406 | 3:24:27 | None |
+| Browsing history reset itself unexpectedly | https://github.com/zen-browser/desktop/issues/10403 | None | None |
+| Opening new background tab(Middle mouse click) from within folder opens new tab outside folder | https://github.com/zen-browser/desktop/issues/10399 | 4:44:58 | 7:04:02 |
+| Icons for webpages in the Essentials tab don't load on startup. | https://github.com/zen-browser/desktop/issues/10398 | None | 0:03:42 |
+| Can't sign in to any Google services, says cookies are disabled | https://github.com/zen-browser/desktop/issues/10397 | 1:28:00 | 1 day, 6:18:57 |
+| Zen crashes on Fedora Linux | https://github.com/zen-browser/desktop/issues/10395 | 0:53:47 | 1 day, 7:05:12 |
+| Audio bugs on Google Meet | https://github.com/zen-browser/desktop/issues/10394 | 15:13:01 | None |
+| Pinned split screen tabs still not preserved when opening a new window (issue #8583 remains unresolved) | https://github.com/zen-browser/desktop/issues/10388 | None | None |
+| A cursor appears when I click on the screen | https://github.com/zen-browser/desktop/issues/10387 | 1:39:24 | 4:27:59 |
+| Custom set images that you upload yourself for Firefox Home new tab wallpapers have been broken for a while. | https://github.com/zen-browser/desktop/issues/10384 | 15:32:44 | 3 days, 14:22:59 |
+| Scrolling lag when looking at preview (glance) of a webpage when using mouse input | https://github.com/zen-browser/desktop/issues/10382 | None | 3:43:58 |
+| Apple's accout verification Not Working | https://github.com/zen-browser/desktop/issues/10381 | None | 1 day, 22:20:39 |
+| Find bar doesn't go away | https://github.com/zen-browser/desktop/issues/10380 | 4:16:03 | 4:16:08 |
+| Cookies, data, history, and all tabs close and are deleted on every browser restart, despite turning off the settings to do so. | https://github.com/zen-browser/desktop/issues/10377 | None | None |
+| Windows Navigation Icons not Showing Up on Zen | https://github.com/zen-browser/desktop/issues/10374 | None | None |
+| 无法打开部分网站,显示安全问题或超时 | https://github.com/zen-browser/desktop/issues/10372 | 0:12:19 | 0:12:19 |
+| Merci App extension not working - Login not working | https://github.com/zen-browser/desktop/issues/10370 | 3:56:26 | 6:10:52 |
+| Compact mode tabs overlay stays fixed on top of bookmarks bar | https://github.com/zen-browser/desktop/issues/10369 | None | 4:13:01 |
+| Browsing history reset itself unexpectedly | https://github.com/zen-browser/desktop/issues/10367 | 9:50:29 | 2 days, 10:39:26 |
+| Choppy animation while hovering on top bar area in single toolbar compact mode with google doc file open | https://github.com/zen-browser/desktop/issues/10366 | 0:45:17 | None |
+| Logged me out of everything after Restart | https://github.com/zen-browser/desktop/issues/10365 | 0:06:34 | None |
+| Discord fails at uploading and playing media | https://github.com/zen-browser/desktop/issues/10364 | 1:35:04 | 17:56:18 |
+| Pinned tabs inconsisntely dissapear and reappear in the sidebar | https://github.com/zen-browser/desktop/issues/10363 | 2:23:29 | None |
+| 1Password no longer allowing touch ID on latest release | https://github.com/zen-browser/desktop/issues/10362 | 2:03:43 | 21:35:42 |
+| [Linux: Flatpak] Can't open certain local-network URLs | https://github.com/zen-browser/desktop/issues/10360 | 4 days, 15:35:37 | None |
+| Discord WebApp Issue with Audio | https://github.com/zen-browser/desktop/issues/10358 | None | 5:03:34 |
+| Apple Security Blocked | https://github.com/zen-browser/desktop/issues/10354 | None | None |
+| Always Blank Screen - although It's working and loading Pages | https://github.com/zen-browser/desktop/issues/10353 | 0:21:31 | 8 days, 17:02:49 |
+| Tabs are lost then a workspace deletion is synced | https://github.com/zen-browser/desktop/issues/10345 | None | None |
+| Fix | https://github.com/zen-browser/desktop/issues/10344 | 8:18:05 | 1 day, 9:23:10 |
+| 1px white border on the top of the window which wasnt there before | https://github.com/zen-browser/desktop/issues/10342 | 2 days, 0:57:48 | None |
+| zen browser isn't closing correctly | https://github.com/zen-browser/desktop/issues/10337 | 8:28:03 | 17:42:22 |
+| Fix Multiple Tabs/Containers in Split View in Sidebar | https://github.com/zen-browser/desktop/issues/10335 | None | None |
+| Fresh install: "Essentials" are grayed out for some sites | https://github.com/zen-browser/desktop/issues/10333 | 0:17:20 | 2:38:34 |
+| Unticking 'Open Previous Tabs on Startup' messes with pinened folders | https://github.com/zen-browser/desktop/issues/10331 | None | None |
+| Can't open Connection secure (certificate) 'page' anymore | https://github.com/zen-browser/desktop/issues/10330 | 1:25:14 | 4:54:22 |
+| Some favicons of pins / essentials disappear when restarting without `Open previous windows and tabs` | https://github.com/zen-browser/desktop/issues/10329 | 3:12:08 | None |
+| X Spaces breaks when Mic is requested | https://github.com/zen-browser/desktop/issues/10328 | 12 days, 16:06:32 | None |
+| Tabs on Right , have Weird White Container that come out of nowhere | https://github.com/zen-browser/desktop/issues/10327 | None | 0:50:40 |
+| Multiacccount containers + Mozilla sync deletes all custom containers | https://github.com/zen-browser/desktop/issues/10324 | None | None |
+| Cannot open Links from Thunderbird emails in Zen browser | https://github.com/zen-browser/desktop/issues/10323 | 2 days, 7:50:34 | None |
+| As long as the Baidu search engine exists in the search engine, the Baidu search engine in the quick search interface is at the top, regardless of whether it is checked or not. | https://github.com/zen-browser/desktop/issues/10322 | 1 day, 0:23:30 | None |
+| Your tab just crashed | https://github.com/zen-browser/desktop/issues/10321 | None | None |
+| Can not import bookmarks from FF | https://github.com/zen-browser/desktop/issues/10320 | None | None |
+| Separate accounts across workspaces; should workspaces have different cookies and site data? | https://github.com/zen-browser/desktop/issues/10319 | 0:20:35 | None |
+| folder names are a different font size | https://github.com/zen-browser/desktop/issues/10318 | 2:06:09 | 3 days, 16:05:52 |
+| zen.view.experimental-no-window-controls stopped working | https://github.com/zen-browser/desktop/issues/10317 | 7:18:21 | 13:06:50 |
+| Images get corrupted when uploading on Zen Browser (Flatpak + AUR, Linux + Wayland + NVIDIA) | https://github.com/zen-browser/desktop/issues/10316 | None | 4:13:56 |
+| Popout Tab extensions not working | https://github.com/zen-browser/desktop/issues/10315 | None | None |
+| Zen Browser freezing after waking from suspend | https://github.com/zen-browser/desktop/issues/10314 | 1 day, 7:54:39 | None |
+| compact mode not working | https://github.com/zen-browser/desktop/issues/10313 | 3:21:50 | 12:27:20 |
+| libnotify not used in Flatpak | https://github.com/zen-browser/desktop/issues/10310 | 19:30:48 | 19:30:48 |
+| Essentials Tab order reset everytime I restart Zen Browser | https://github.com/zen-browser/desktop/issues/10309 | 1:24:30 | None |
+| [ux]first keydown on fill bar is plain focus, enforce type wwhat to typeout what. on chatgpt.com | https://github.com/zen-browser/desktop/issues/10308 | 4:52:52 | 4:52:52 |
+| Copying URL using shortcut when in reader mode does not work as expected | https://github.com/zen-browser/desktop/issues/10303 | 0:04:42 | None |
+| Reopening Closed Tabs (Ctrl+Shift+T) Duplicates Essentials/Pinned, Causing Loss on Next Session If The Dupes Were Closed | https://github.com/zen-browser/desktop/issues/10302 | 4 days, 23:41:33 | None |
+| Tabs within Folders in Workspaces switch back to the default workspace | https://github.com/zen-browser/desktop/issues/10299 | None | None |
+| Can't clear the cookies and site data due to a UI bug | https://github.com/zen-browser/desktop/issues/10298 | 6:00:32 | 6:00:32 |
+| Cannot move pinned tab to the top of normal tabs | https://github.com/zen-browser/desktop/issues/10295 | None | None |
+| Mouse cursor position can have an undesirable effect on the tab switcher | https://github.com/zen-browser/desktop/issues/10292 | 2:12:31 | 2:29:10 |
+| Essential tabs and Pinned tabs (including the ones inside a folder) do not load on startup | https://github.com/zen-browser/desktop/issues/10291 | 2:47:15 | None |
+| Browser doesn't launch after update | https://github.com/zen-browser/desktop/issues/10290 | 4:30:50 | None |
+| Double-click on sidebar no longer opens a new tab after recent Zen update | https://github.com/zen-browser/desktop/issues/10289 | 12:03:10 | 12:03:10 |
+| ArchLinux AUR: Quellen für ‚zen-browser-bin-1.15.4b-1‘ konnten nicht heruntergeladen werden | https://github.com/zen-browser/desktop/issues/10288 | 2:39:09 | 2:39:09 |
+| Ctrl+Shift+T after reopening Zen mixes tabs from multiple workspaces | https://github.com/zen-browser/desktop/issues/10286 | None | 4 days, 6:16:17 |
+| Keyboard Input Delay While Typing on Monaco Editors | https://github.com/zen-browser/desktop/issues/10285 | 1 day, 6:25:04 | None |
+| the top close maximize minimize are shwoing up and not going according to the theme and its just very bugged | https://github.com/zen-browser/desktop/issues/10284 | 5:13:41 | 6:27:09 |
+| New Tab opens in new window. | https://github.com/zen-browser/desktop/issues/10283 | 0:29:33 | None |
+| Can only open in safe mode. 1.15.5b | https://github.com/zen-browser/desktop/issues/10282 | 2:10:07 | 3:33:03 |
+| Copy to Cliboard button in the url bar not working | https://github.com/zen-browser/desktop/issues/10281 | 2 days, 6:09:05 | 20 days, 2:34:28 |
+| After the 1.15.4b update, the automatic hiding of the top and tab is not working | https://github.com/zen-browser/desktop/issues/10280 | 4:35:52 | 16:55:08 |
+| Cannot move window when holding down left mouse button on sidebar | https://github.com/zen-browser/desktop/issues/10278 | 3 days, 19:54:46 | 3 days, 21:15:09 |
+| Sidebar always visible in compact mode after right-clicking container icon when opening a new tab | https://github.com/zen-browser/desktop/issues/10276 | 1:53:46 | None |
+| zen cannot play youtube livestreams | https://github.com/zen-browser/desktop/issues/10274 | 5:07:19 | None |
+| Compact sidebar pops up when opening menus in menubar | https://github.com/zen-browser/desktop/issues/10273 | None | None |
+| Newest Update — weird Bookmarks behavior | https://github.com/zen-browser/desktop/issues/10272 | None | 0:34:25 |
+| Double-clicking no longer opens a new tab. | https://github.com/zen-browser/desktop/issues/10270 | 1:23:48 | 2:13:30 |
+| Theme is inconsistent with and without focus | https://github.com/zen-browser/desktop/issues/10268 | None | None |
+| Tabs inside folder goes invisible when closing folder | https://github.com/zen-browser/desktop/issues/10267 | 10:34:08 | 11:05:06 |
+| Essentials/Pinned tabs are removed with middle click | https://github.com/zen-browser/desktop/issues/10266 | 2:33:21 | 11:29:40 |
+| Creating split window by dragging pinned Essentials icon removes the Essential icon | https://github.com/zen-browser/desktop/issues/10264 | None | None |
+| Macos: extention pop-ups open up at a different desktop in fullscreen | https://github.com/zen-browser/desktop/issues/10260 | None | None |
+| Split tabs can't be moved to new workspace | https://github.com/zen-browser/desktop/issues/10256 | None | 11:32:53 |
+| Google account not shared between spaces — must re-add to sign in to Figma | https://github.com/zen-browser/desktop/issues/10255 | 8:43:21 | None |
+| Split tabs context menu does not show when selecting already split tabs | https://github.com/zen-browser/desktop/issues/10254 | 1 day, 8:31:56 | None |
+| Netflix Error F7121-1331 | https://github.com/zen-browser/desktop/issues/10251 | 2:31:38 | 0:02:34 |
+| Gradient themes get cut off if using vertical taskbar on W10 | https://github.com/zen-browser/desktop/issues/10250 | 20 days, 21:52:53 | None |
+| White/Transparent search bar and bookmarks | https://github.com/zen-browser/desktop/issues/10247 | 11:15:56 | 1 day, 14:35:40 |
+| Pin tabs duplication | https://github.com/zen-browser/desktop/issues/10246 | 13:43:00 | 13:43:00 |
+| Zen window transparency only works when window is maximized | https://github.com/zen-browser/desktop/issues/10243 | None | None |
+| Cursor rapid flickering on random places within the browser window when graphic tablet is used | https://github.com/zen-browser/desktop/issues/10242 | 21:55:18 | 21:57:24 |
+| MIssing last second(s) in certain audios | https://github.com/zen-browser/desktop/issues/10240 | None | None |
+| Issue with Transparency Effect in background in Zen Browser | https://github.com/zen-browser/desktop/issues/10239 | 3:36:39 | 18 days, 3:00:45 |
+| Zen icon does not load even apon restart. | https://github.com/zen-browser/desktop/issues/10238 | 1 day, 7:03:03 | 1 day, 7:03:03 |
+| Discord login page does not load | https://github.com/zen-browser/desktop/issues/10234 | None | None |
+| Native window title doesn't show Page title(document.title) when tab is pinned and renamed, shows only profile name and app name | https://github.com/zen-browser/desktop/issues/10232 | None | None |
+| Enabling "Always use private browsing mode" results in totally black UI | https://github.com/zen-browser/desktop/issues/10231 | None | None |
+| After newest Update there is now a ugly white Border around the Hidden Compact Sidebar | https://github.com/zen-browser/desktop/issues/10230 | 1 day, 13:55:29 | 2 days, 20:51:00 |
+| File manager not opening in Arch linux | https://github.com/zen-browser/desktop/issues/10226 | 0:12:51 | None |
+| Default color back to orange | https://github.com/zen-browser/desktop/issues/10225 | 0:07:41 | 3:10:01 |
+| NAVEGADOR CONSUMINDO 12 GIGAS? CARALHOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO | https://github.com/zen-browser/desktop/issues/10224 | None | 0:24:57 |
+| gemini style bug | https://github.com/zen-browser/desktop/issues/10222 | 1:32:02 | 1:04:01 |
+| Zen Browser opens on the last used virtual desktop instead of the current one | https://github.com/zen-browser/desktop/issues/10221 | 2:07:09 | None |
+| Tabs having weird behaviour when moving them form one window to the other | https://github.com/zen-browser/desktop/issues/10220 | None | None |
+| Web pages in the workspace cannot be synced | https://github.com/zen-browser/desktop/issues/10219 | 5 days, 0:56:10 | 5 days, 6:23:07 |
+| Swipe workspaces gesture freezes on "Mute Tab" icon hover | https://github.com/zen-browser/desktop/issues/10217 | None | None |
+| Sub-folders of Tabs, Dump Tabs when moved in a Folder List | https://github.com/zen-browser/desktop/issues/10216 | 2 days, 13:52:56 | 4 days, 22:25:16 |
+| Labels rendering bug | https://github.com/zen-browser/desktop/issues/10215 | 11:10:14 | 3 days, 22:48:16 |
+| Browser doesn't allow completion of TOTP number on Paypal site | https://github.com/zen-browser/desktop/issues/10214 | None | None |
+| Unable to use Option+Cmd+ArrowLeft or Option+Cmd+ArrowRight to change spaces. | https://github.com/zen-browser/desktop/issues/10211 | 14:39:09 | 15:34:26 |
+| The Workspace Icon can't be hided anymore | https://github.com/zen-browser/desktop/issues/10209 | 1:41:32 | 1:41:32 |
+| Tabs move into Folders | https://github.com/zen-browser/desktop/issues/10208 | 0:24:03 | 7:25:32 |
+| Native select low contrast theme | https://github.com/zen-browser/desktop/issues/10207 | None | None |
+| Trackpad zooming on PDF no longer working | https://github.com/zen-browser/desktop/issues/10205 | None | None |
+| Can’t add tab to Essentials | https://github.com/zen-browser/desktop/issues/10204 | 1:15:16 | 8:15:36 |
+| Zen browser can't go through system proxies on Linux | https://github.com/zen-browser/desktop/issues/10203 | None | None |
+| The Browser's adressbar is not visible because it blends into the current viewed page. | https://github.com/zen-browser/desktop/issues/10202 | 0:13:50 | 2 days, 23:44:36 |
+| Wrong favicon instead of cached icons bug is back | https://github.com/zen-browser/desktop/issues/10199 | 1 day, 6:59:45 | 2 days, 21:44:37 |
+| iCloud not working | https://github.com/zen-browser/desktop/issues/10192 | 6:18:44 | 11:56:51 |
+| Truncated folder name in the search inside folders feature | https://github.com/zen-browser/desktop/issues/10189 | 2:31:02 | None |
+| Missing translations in the search inside folders feature | https://github.com/zen-browser/desktop/issues/10188 | 2:16:01 | 2:16:01 |
+| New "floadting" tab bar window covers bookmark bar | https://github.com/zen-browser/desktop/issues/10186 | 6:07:17 | 16:21:43 |
+| Revert 1.15.3b!!!! | https://github.com/zen-browser/desktop/issues/10185 | 1:12:24 | 1:03:18 |
+| "New Tab Below" menu item when right clicking on a tab no longer shows after upgrading from 1.14.11b | https://github.com/zen-browser/desktop/issues/10184 | None | 2:40:19 |
+| Multiple bugs with new folder Feature | https://github.com/zen-browser/desktop/issues/10182 | 1:37:43 | None |
+| New window bug - unpinned tabs disappear, folders expand | https://github.com/zen-browser/desktop/issues/10180 | 2:22:55 | 2:22:55 |
+| Essentials not syncing across all spaces in same container | https://github.com/zen-browser/desktop/issues/10179 | 3:37:37 | 24 days, 5:11:42 |
+| Macos Universal download installer | https://github.com/zen-browser/desktop/issues/10175 | 7:10:27 | 7:10:27 |
+
+_This report was generated with the [Issue Metrics Action](https://github.com/github/issue-metrics)_
+Search query used to find these items: `repo:zen-browser/desktop is:issue created:2025-09-01..2025-09-30`
diff --git a/locales/ar/browser/browser/preferences/zen-preferences.ftl b/locales/ar/browser/browser/preferences/zen-preferences.ftl
index 44b2b7635..4484acdfc 100644
--- a/locales/ar/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ar/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = المناوبة + انقر
zen-glance-trigger-meta-click =
.label = Meta (Command) + Click
-zen-glance-trigger-mantain-click =
- .label = النقر
zen-look-and-feel-compact-view-header = إظهار في العرض المدمج
zen-look-and-feel-compact-view-description = فقط إظهار أشرطة الأدوات التي تستخدمها!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = إخفاء مؤشر الحاوية الافتراضي في شريط التبويب
zen-key-unsaved = اختصار غير محفوظ! الرجاء تأمين ذلك بالنقر على مفتاح "الهروب من الخدمة" بعد إعادة الكتابة.
-zen-key-conflict = تعارض مع اختصار آخر
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = إعدادات السمة
zen-vertical-tabs-title = تخطيط الشريط الجانبي وعلامات التبويب
zen-vertical-tabs-header = علامات التبويب العمودية
diff --git a/locales/ar/browser/browser/zen-general.ftl b/locales/ar/browser/browser/zen-general.ftl
index f2b56be25..1999f49b0 100644
--- a/locales/ar/browser/browser/zen-general.ftl
+++ b/locales/ar/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = إعادة تعيين علامة التبويب المثبتة
.accesskey = ر
tab-context-zen-add-essential =
- .label = Add to Essentials ({ $num } / 12 slots filled)
+ .label = Add to Essentials ({ $num } / { $max } slots filled)
.accesskey = E
tab-context-zen-remove-essential =
.label = Remove from Essentials
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimize
zen-panel-ui-gradient-generator-custom-color = لون مخصص
zen-panel-ui-gradient-generator-saved-message = حفظ معامل التدرج بنجاح!
-zen-copy-current-url-confirmation = The URL has been copied to the clipboard.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Cancel
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Spaces
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
# note: Do not translate the "
" tags in the following string
@@ -49,3 +52,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = Icons
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Settings
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+zen-site-data-manage-addons =
+ .label = Manage Extensions
+zen-site-data-get-addons =
+ .label = Add Extensions
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/ar/browser/browser/zen-vertical-tabs.ftl b/locales/ar/browser/browser/zen-vertical-tabs.ftl
index f8c18f11f..0a10972f8 100644
--- a/locales/ar/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/ar/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = ر
zen-toolbar-context-compact-mode =
.label = الوضع المدمج
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = تمكين الوضع المدمج
.accesskey = D
diff --git a/locales/ar/browser/browser/zen-welcome.ftl b/locales/ar/browser/browser/zen-welcome.ftl
index 0767c9bb0..86d517ffd 100644
--- a/locales/ar/browser/browser/zen-welcome.ftl
+++ b/locales/ar/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Dive in!
zen-welcome-default-search-title = Your Default Search Engine
zen-welcome-default-search-description = Choose your default search engine. You can always change it later!
zen-welcome-skip-button = Skip
-zen-welcome-next-action = Next
zen-welcome-finished = Your Zen has been set up correctly!
diff --git a/locales/ar/browser/browser/zen-workspaces.ftl b/locales/ar/browser/browser/zen-workspaces.ftl
index fdba97f34..ff9f422ef 100644
--- a/locales/ar/browser/browser/zen-workspaces.ftl
+++ b/locales/ar/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Change Icon
zen-workspaces-panel-context-default-profile =
.label = Set Profile
+zen-workspaces-panel-unload =
+ .label = Unload Space
zen-workspaces-how-to-reorder-title = How to reorder spaces
zen-workspaces-how-to-reorder-desc = Drag the space icons at the bottom of the sidebar to reorder them
zen-workspaces-change-theme =
diff --git a/locales/ca/browser/browser/preferences/zen-preferences.ftl b/locales/ca/browser/browser/preferences/zen-preferences.ftl
index b439a9e5e..0813471cf 100644
--- a/locales/ca/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ca/browser/browser/preferences/zen-preferences.ftl
@@ -26,10 +26,8 @@ zen-glance-trigger-shift-click =
.label = Bloc. maj. + Clic
zen-glance-trigger-meta-click =
.label = Meta (Comandament) + Clic
-zen-glance-trigger-mantain-click =
- .label = Mantén premut el clic (pròximament!)
zen-look-and-feel-compact-view-header = Mostra en vista compacta
-zen-look-and-feel-compact-view-description = Mostra només les barres d'eines que feu servir!
+zen-look-and-feel-compact-view-description = Mostreu només les barres d'eines que feu servir
zen-look-and-feel-compact-view-enabled =
.label = Habilita el mode compacte de { -brand-short-name }
zen-look-and-feel-compact-view-top-toolbar =
@@ -73,8 +71,8 @@ zen-settings-workspaces-enabled =
.label = Habilita els espais de treball
zen-settings-workspaces-hide-default-container-indicator =
.label = Amaga l'indicador de contenidor per defecte a la barra de pestanyes
-zen-key-unsaved = Drecera no desada! Deseu-la fent clic a la tecla «Esc» després de tornar-la a escriure.
-zen-key-conflict = Conflicte amb una altra drecera
+zen-key-unsaved = Drecera no desada. Deseu-la fent clic a la tecla «Esc» després de tornar-la a escriure.
+zen-key-conflict = Conflicte amb { $group } -> { $shortcut }
pane-zen-theme-title = Configuració del tema
zen-vertical-tabs-title = Disseny de la barra lateral i pestanyes
zen-vertical-tabs-header = Pestanyes verticals
@@ -109,7 +107,7 @@ zen-theme-marketplace-import-failure = Hi ha hagut un error en importar les modi
zen-theme-marketplace-export-success = Les modificacions s'han exportat correctament
zen-theme-marketplace-export-failure = Hi ha hagut un error en exportar les modificacions
zen-theme-marketplace-updates-success = Les modificacions s'han actualitzat correctament
-zen-theme-marketplace-updates-failure = No s'ha trobat cap actualització!
+zen-theme-marketplace-updates-failure = No s'ha trobat cap actualització
zen-theme-marketplace-toggle-enabled-button =
.title = Deshabilita la modificació
zen-theme-marketplace-toggle-disabled-button =
diff --git a/locales/ca/browser/browser/zen-general.ftl b/locales/ca/browser/browser/zen-general.ftl
index 431a5b481..b098352e9 100644
--- a/locales/ca/browser/browser/zen-general.ftl
+++ b/locales/ca/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Restableix la pestanya fixada
.accesskey = R
tab-context-zen-add-essential =
- .label = Afegeix als essentials ({ $num }/12 espais ocupats)
+ .label = Afegeix als essentials ({ $num } / { $max } espais ocupats)
.accesskey = E
tab-context-zen-remove-essential =
.label = Elimina dels essencials
@@ -23,20 +23,23 @@ pictureinpicture-minimize-btn =
.aria-label = Minimitza
.tooltip = Minimitza
zen-panel-ui-gradient-generator-custom-color = Color personalitzat
-zen-panel-ui-gradient-generator-saved-message = El degradat s'ha desat correctament!
-zen-copy-current-url-confirmation = L'URL s'ha copiat al porta-retalls.
+zen-panel-ui-gradient-generator-saved-message = El degradat s'ha desat correctament
+zen-copy-current-url-confirmation = L'URL actual s'ha copiat.
zen-general-cancel-label =
.label = Cancel·la
zen-general-confirm =
.label = Confirma
zen-pinned-tab-replaced = L'URL de la pestanya fixada s'ha substituït per l'URL actual.
-zen-tabs-renamed = S'ha canviat el nom de la pestanya correctament!
-zen-background-tab-opened-toast = S'ha obert una nova pestanya de fons!
-zen-workspace-renamed-toast = S'ha canviat el nom de l'espai de treball correctament!
+zen-tabs-renamed = S'ha canviat el nom de la pestanya correctament
+zen-background-tab-opened-toast = S'ha obert una nova pestanya de fons
+zen-workspace-renamed-toast = S'ha canviat el nom de l'espai de treball correctament
zen-library-sidebar-workspaces =
.label = Espais
zen-library-sidebar-mods =
.label = Modificacions
+zen-toggle-compact-mode-button =
+ .label = Mode compacte
+ .tooltiptext = Commuta el mode compacte
# note: Do not translate the "
" tags in the following string
@@ -48,4 +51,34 @@ zen-icons-picker-emoji =
.label = Emojis
zen-icons-picker-svg =
.label = Icones
-urlbar-search-mode-zen_actions = Actions
+urlbar-search-mode-zen_actions = Accions
+zen-site-data-settings = Configuració
+zen-generic-manage = Gestiona
+zen-generic-more = Més
+zen-generic-next = Següent
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Permès
+zen-site-data-setting-block = Bloquejat
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extensió
+zen-site-data-security-info-secure =
+ .label = Segur
+zen-site-data-security-info-not-secure =
+ .label = No és segur
+zen-site-data-manage-addons =
+ .label = Gestiona les extensions
+zen-site-data-get-addons =
+ .label = Afegeix extensions
+zen-site-data-site-settings =
+ .label = Totes les configuracions del lloc
+zen-site-data-share =
+ .label = Comparteix aquesta pàgina
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copia l'URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = Una nova ubicació per a les extenions, permisos i molt més
+zen-site-data-panel-feature-callout-subtitle = Feu clic a la icona per gestionar la configuració del lloc, veure la informació de seguretat, accedir a les extensions i dur a terme accions habituals.
diff --git a/locales/ca/browser/browser/zen-vertical-tabs.ftl b/locales/ca/browser/browser/zen-vertical-tabs.ftl
index e81e1922f..8b2ed3f1d 100644
--- a/locales/ca/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/ca/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Mode compacte
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Habilita el mode compacte
.accesskey = D
diff --git a/locales/ca/browser/browser/zen-welcome.ftl b/locales/ca/browser/browser/zen-welcome.ftl
index 7d93f6b4a..833c3a73b 100644
--- a/locales/ca/browser/browser/zen-welcome.ftl
+++ b/locales/ca/browser/browser/zen-welcome.ftl
@@ -5,7 +5,7 @@
zen-welcome-title-line1 = Us donem la benvingut
zen-welcome-title-line2 = a un internet més tranquil
zen-welcome-import-title = Un nou començament, els mateixos marcadors
-zen-welcome-import-description-1 = Els vostres marcadors, historial i contrasenyes són com un rastre de molles de pa a través d'Internet: no les deixis enrere!
+zen-welcome-import-description-1 = Els vostres marcadors, historial i contrasenyes són com un rastre de molles de pa a través d'Internet: no les deixis enrere
zen-welcome-import-description-2 = Porteu-los fàcilment des d'un altre navegador i repreneu exactament on ho vau deixar.
zen-welcome-import-button = Importa ara
zen-welcome-set-default-browser = Estableix el { -brand-short-name } com a navegador per defecte
@@ -21,7 +21,6 @@ zen-welcome-start-browsing-title =
zen-welcome-start-browsing-description-1 = Ja esteu llestos i preparats per començar. Feu clic al botó següent per començar a navegar amb el { -brand-short-name }.
zen-welcome-start-browsing = Som-hi!
zen-welcome-default-search-title = El vostre motor de cerca per defecte
-zen-welcome-default-search-description = Trieu el vostre motor de cerca per defecte. Sempre el podeu canviar més tard!
+zen-welcome-default-search-description = Trieu el vostre motor de cerca per defecte. Sempre el podeu canviar més tard
zen-welcome-skip-button = Omet
-zen-welcome-next-action = Següent
-zen-welcome-finished = El Zen s'ha configurat correctament!
+zen-welcome-finished = El Zen s'ha configurat correctament
diff --git a/locales/ca/browser/browser/zen-workspaces.ftl b/locales/ca/browser/browser/zen-workspaces.ftl
index 3a61d13b1..971cb7fc6 100644
--- a/locales/ca/browser/browser/zen-workspaces.ftl
+++ b/locales/ca/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Canvia la icona
zen-workspaces-panel-context-default-profile =
.label = Estableix el perfil
+zen-workspaces-panel-unload =
+ .label = Hiberna l'espai
zen-workspaces-how-to-reorder-title = Com reordenar els espais?
zen-workspaces-how-to-reorder-desc = Arrossegueu les icones d'espais a la part inferior de la barra lateral per reordenar-les
zen-workspaces-change-theme =
diff --git a/locales/cs/browser/browser/preferences/zen-preferences.ftl b/locales/cs/browser/browser/preferences/zen-preferences.ftl
index 2e710990d..764d88da9 100644
--- a/locales/cs/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/cs/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Kliknutí
zen-glance-trigger-meta-click =
.label = Meta (Command) + Kliknutí
-zen-glance-trigger-mantain-click =
- .label = Dlouhé kliktnutí (Již Brzy!)
zen-look-and-feel-compact-view-header = Zobrazit v kompaktním režimu
zen-look-and-feel-compact-view-description = Zobrazte pouze panely nástrojů, které používáte!
zen-look-and-feel-compact-view-enabled =
@@ -43,7 +41,7 @@ pane-settings-workspaces-title = Pracoviště
zen-tabs-unloader-enabled =
.label = Povolit uspání karet
zen-look-and-feel-compact-toolbar-themed =
- .label = Use themed background for compact toolbar
+ .label = Použít tématické pozadí pro kompaktní panel karet
zen-workspace-continue-where-left-off =
.label = Pokračovat tam, kde jste skončili
pane-zen-pinned-tab-manager-title = Připnuté karty
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Skrýt výchozí indikátor kontejneru v panelu záložek
zen-key-unsaved = Neuložený zástupce! Ubezpečte jej po repsaní kliknutím na klávesu "Escap".
-zen-key-conflict = Konflikt s jinou zkratkou
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = Nastavení motivu
zen-vertical-tabs-title = Boční panel a rozložení karet
zen-vertical-tabs-header = Vertikální karty
@@ -274,7 +272,7 @@ zen-split-view-shortcut-grid = Přepnout rozdělený pohled v mřížce
zen-split-view-shortcut-vertical = Přepnout rozdělené zobrazení vertikálně
zen-split-view-shortcut-horizontal = Přepnout horizontální zobrazení rozdělení
zen-split-view-shortcut-unsplit = Zavřít rozdělené zobrazení
-zen-new-empty-split-view-shortcut = New Empty Split View
+zen-new-empty-split-view-shortcut = Nové prázdné rozdělené zobrazení
zen-key-select-tab-1 = Vybrat první kartu
zen-key-select-tab-2 = Vybrat druhou kartu
zen-key-select-tab-3 = Vybrat třetí kartu
diff --git a/locales/cs/browser/browser/zen-general.ftl b/locales/cs/browser/browser/zen-general.ftl
index 425c223a7..26dcdadf6 100644
--- a/locales/cs/browser/browser/zen-general.ftl
+++ b/locales/cs/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Resetovat připnuté karty
.accesskey = R
tab-context-zen-add-essential =
- .label = Přidat do Essentials ({ $num } / 12 zaplněných slotů)
+ .label = Přidat do Essentials ({ $num } / { $max } zaplněných slotů)
.accesskey = E
tab-context-zen-remove-essential =
.label = Odstranit z Essentials
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimalizovat
zen-panel-ui-gradient-generator-custom-color = Vlastní barva
zen-panel-ui-gradient-generator-saved-message = Gradient byl úspěšně uložen!
-zen-copy-current-url-confirmation = URL adresa byla zkopírována do schránky.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Zrušit
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Prostory
zen-library-sidebar-mods =
.label = Módy
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Přepnout kompaktní režim
# note: Do not translate the "
" tags in the following string
@@ -48,4 +51,34 @@ zen-icons-picker-emoji =
.label = Emodži
zen-icons-picker-svg =
.label = Ikony
-urlbar-search-mode-zen_actions = Actions
+urlbar-search-mode-zen_actions = Akce
+zen-site-data-settings = Nastavení
+zen-generic-manage = Spravovat
+zen-generic-more = Více
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Povoleno
+zen-site-data-setting-block = Blokováno
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Rozšíření
+zen-site-data-security-info-secure =
+ .label = Bezpečné
+zen-site-data-security-info-not-secure =
+ .label = Nezabezpečeno
+zen-site-data-manage-addons =
+ .label = Spravovat rozšíření
+zen-site-data-get-addons =
+ .label = Přidat rozšíření
+zen-site-data-site-settings =
+ .label = Nastavení všech stránek
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/cs/browser/browser/zen-vertical-tabs.ftl b/locales/cs/browser/browser/zen-vertical-tabs.ftl
index 11cf7a77e..ec5f0dc50 100644
--- a/locales/cs/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/cs/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Kompaktní režim
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Povolit kompaktní režim
.accesskey = D
diff --git a/locales/cs/browser/browser/zen-welcome.ftl b/locales/cs/browser/browser/zen-welcome.ftl
index 15e19b0fb..135340346 100644
--- a/locales/cs/browser/browser/zen-welcome.ftl
+++ b/locales/cs/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Pustit se do toho!
zen-welcome-default-search-title = Váš výchozí vyhledávač
zen-welcome-default-search-description = Vyberte si svůj výchozí vyhledávač. Později jej můžete změnit!
zen-welcome-skip-button = Přeskočit
-zen-welcome-next-action = Další
zen-welcome-finished = Váš Zen byl úspěšně nastaven!
diff --git a/locales/cs/browser/browser/zen-workspaces.ftl b/locales/cs/browser/browser/zen-workspaces.ftl
index c81cfa2b9..66a3bb7b0 100644
--- a/locales/cs/browser/browser/zen-workspaces.ftl
+++ b/locales/cs/browser/browser/zen-workspaces.ftl
@@ -4,7 +4,7 @@ zen-panel-ui-workspaces-create =
zen-panel-ui-folder-create =
.label = Vytvořit složku
zen-panel-ui-new-empty-split =
- .label = New Split
+ .label = Nové rozdělení
zen-workspaces-panel-context-delete =
.label = Odstranit pracovní prostor
.accesskey = D
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Změnit ikonu
zen-workspaces-panel-context-default-profile =
.label = Nastavit profil
+zen-workspaces-panel-unload =
+ .label = Uspat prostor
zen-workspaces-how-to-reorder-title = Jak změnit pořadí prostorů
zen-workspaces-how-to-reorder-desc = Pořadí prostorů změníte přetažením jejich ikon dole v postranním panelu
zen-workspaces-change-theme =
diff --git a/locales/cy/browser/browser/preferences/zen-preferences.ftl b/locales/cy/browser/browser/preferences/zen-preferences.ftl
index 081a37ecb..55ac59b49 100644
--- a/locales/cy/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/cy/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Click
zen-glance-trigger-meta-click =
.label = Meta (Command) + Click
-zen-glance-trigger-mantain-click =
- .label = Hold Click (Coming Soon!)
zen-look-and-feel-compact-view-header = Show in compact view
zen-look-and-feel-compact-view-description = Only show the toolbars you use!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Hide the default container indicator in the tab bar
zen-key-unsaved = Unsaved shortcut! Please save it by clicking the "Escape" key after retyping it.
-zen-key-conflict = Conflict with another shortcut
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = Theme Settings
zen-vertical-tabs-title = Sidebar and tabs layout
zen-vertical-tabs-header = Vertical Tabs
diff --git a/locales/cy/browser/browser/zen-general.ftl b/locales/cy/browser/browser/zen-general.ftl
index a9bc98fd0..d060f96fc 100644
--- a/locales/cy/browser/browser/zen-general.ftl
+++ b/locales/cy/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Ailosod Tab wedi'i Binio
.accesskey = R
tab-context-zen-add-essential =
- .label = Add to Essentials ({ $num } / 12 slots filled)
+ .label = Add to Essentials ({ $num } / { $max } slots filled)
.accesskey = E
tab-context-zen-remove-essential =
.label = Diddymu o Hanfodion
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimize
zen-panel-ui-gradient-generator-custom-color = Addasu Lliw
zen-panel-ui-gradient-generator-saved-message = Llwyddiant arbedi'r graddiant!
-zen-copy-current-url-confirmation = Mae'r URL wedi'i gopïo i'r clipfwrdd.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Cancel
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Spaces
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
# note: Do not translate the "
" tags in the following string
@@ -49,3 +52,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = Icons
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Settings
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+zen-site-data-manage-addons =
+ .label = Manage Extensions
+zen-site-data-get-addons =
+ .label = Add Extensions
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/cy/browser/browser/zen-vertical-tabs.ftl b/locales/cy/browser/browser/zen-vertical-tabs.ftl
index e59cd7a78..9c71802d2 100644
--- a/locales/cy/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/cy/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Compact mode
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Enable compact mode
.accesskey = D
diff --git a/locales/cy/browser/browser/zen-welcome.ftl b/locales/cy/browser/browser/zen-welcome.ftl
index 5b7310dc4..e3b5e3287 100644
--- a/locales/cy/browser/browser/zen-welcome.ftl
+++ b/locales/cy/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Dive in!
zen-welcome-default-search-title = Your Default Search Engine
zen-welcome-default-search-description = Choose your default search engine. You can always change it later!
zen-welcome-skip-button = Skip
-zen-welcome-next-action = Next
zen-welcome-finished = Your Zen has been set up correctly!
diff --git a/locales/cy/browser/browser/zen-workspaces.ftl b/locales/cy/browser/browser/zen-workspaces.ftl
index 61bf79a12..452a5e9bc 100644
--- a/locales/cy/browser/browser/zen-workspaces.ftl
+++ b/locales/cy/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Change Icon
zen-workspaces-panel-context-default-profile =
.label = Set Profile
+zen-workspaces-panel-unload =
+ .label = Unload Space
zen-workspaces-how-to-reorder-title = How to reorder spaces
zen-workspaces-how-to-reorder-desc = Drag the space icons at the bottom of the sidebar to reorder them
zen-workspaces-change-theme =
diff --git a/locales/da/browser/browser/preferences/zen-preferences.ftl b/locales/da/browser/browser/preferences/zen-preferences.ftl
index ebb632dcb..26e9a8e0e 100644
--- a/locales/da/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/da/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + klik
zen-glance-trigger-meta-click =
.label = Meta (Kommando) + Klik
-zen-glance-trigger-mantain-click =
- .label = Hold klik (kommer snart!)
zen-look-and-feel-compact-view-header = Vis i kompakt visning
zen-look-and-feel-compact-view-description = Vis kun de værktøjslinjer, du bruger!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Skjul standardindikatoren for beholdere i fanelinjen
zen-key-unsaved = Ikke-gemt genvej! Gem den ved at klikke på "Escape"-tasten efter at have indtastet den igen.
-zen-key-conflict = Konflikt med en anden genvej
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = Temaindstillinger
zen-vertical-tabs-title = Layout for sidepanel og faner
zen-vertical-tabs-header = Lodrette Faner
diff --git a/locales/da/browser/browser/zen-general.ftl b/locales/da/browser/browser/zen-general.ftl
index a84ebfefd..ab527f9c6 100644
--- a/locales/da/browser/browser/zen-general.ftl
+++ b/locales/da/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Nulstil fastgjort fane
.accesskey = R
tab-context-zen-add-essential =
- .label = Føj til Essentielle ({ $num } / 12 pladser fyldt)
+ .label = Føj til Essentielle ({ $num } / { $max } pladser fyldt)
.accesskey = E
tab-context-zen-remove-essential =
.label = Fjern fra Essentielle
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimer
zen-panel-ui-gradient-generator-custom-color = Brugerdefineret Farve
zen-panel-ui-gradient-generator-saved-message = Gradienten blev gemt!
-zen-copy-current-url-confirmation = URL'en blev kopieret til udklipsholderen.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Annuller
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Rum
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Kompakt tilstand
+ .tooltiptext = Kompakt tilstand til/fra
# note: Do not translate the "
" tags in the following string
@@ -48,4 +51,34 @@ zen-icons-picker-emoji =
.label = Emojis
zen-icons-picker-svg =
.label = Ikoner
-urlbar-search-mode-zen_actions = Actions
+urlbar-search-mode-zen_actions = Handlinger
+zen-site-data-settings = Indstillinger
+zen-generic-manage = Administrer
+zen-generic-more = Mere
+zen-generic-next = Næste
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Tilladt
+zen-site-data-setting-block = Blokeret
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Udvidelse
+zen-site-data-security-info-secure =
+ .label = Sikker
+zen-site-data-security-info-not-secure =
+ .label = Ikke sikker
+zen-site-data-manage-addons =
+ .label = Administrer udvidelser
+zen-site-data-get-addons =
+ .label = Tilføj udvidelser
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Kopiér URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/da/browser/browser/zen-vertical-tabs.ftl b/locales/da/browser/browser/zen-vertical-tabs.ftl
index 18682f18b..255b40f9a 100644
--- a/locales/da/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/da/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Kompakt tilstand
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Aktivér kompakt tilstand
.accesskey = D
diff --git a/locales/da/browser/browser/zen-welcome.ftl b/locales/da/browser/browser/zen-welcome.ftl
index ffe45216e..d51350c3e 100644
--- a/locales/da/browser/browser/zen-welcome.ftl
+++ b/locales/da/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Kom i gang!
zen-welcome-default-search-title = Din standardsøgemaskine
zen-welcome-default-search-description = Vælg din standardsøgemaskine. Du kan altid ændre det senere!
zen-welcome-skip-button = Spring over
-zen-welcome-next-action = Næste
zen-welcome-finished = Din Zen er blevet opsat korrekt!
diff --git a/locales/da/browser/browser/zen-workspaces.ftl b/locales/da/browser/browser/zen-workspaces.ftl
index 113da5c32..2dba98bab 100644
--- a/locales/da/browser/browser/zen-workspaces.ftl
+++ b/locales/da/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Skift ikon
zen-workspaces-panel-context-default-profile =
.label = Indstil profil
+zen-workspaces-panel-unload =
+ .label = Unload Space
zen-workspaces-how-to-reorder-title = Sådan omarrangerer du rum
zen-workspaces-how-to-reorder-desc = Træk rumikonerne nederst i sidepanelet for at omarrangere dem
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 cc8ded518..19651bc1e 100644
--- a/locales/de/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/de/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Umschalt + Klick
zen-glance-trigger-meta-click =
.label = Meta (Befehlstaste) + Klick
-zen-glance-trigger-mantain-click =
- .label = Klick halten (Kommt bald!)
zen-look-and-feel-compact-view-header = In der Kompaktansicht anzeigen
zen-look-and-feel-compact-view-description = Zeigen Sie nur die Symbolleisten an, die Sie verwenden!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Standard-Container-Anzeige in der Tab-Leiste ausblenden
zen-key-unsaved = Nicht gespeichertes Tastenkürzel! Bitte speichern Sie es, indem Sie nach der Neueingabe die "Escape"-Taste drücken.
-zen-key-conflict = Konflikt mit einem anderen Tastenkürzel
+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
diff --git a/locales/de/browser/browser/zen-general.ftl b/locales/de/browser/browser/zen-general.ftl
index 775af62d7..ac70d5555 100644
--- a/locales/de/browser/browser/zen-general.ftl
+++ b/locales/de/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Angepinnten Tab zurücksetzen
.accesskey = R
tab-context-zen-add-essential =
- .label = Zu Essentials hinzufügen ({ $num } / 12 Plätze belegt)
+ .label = Zu Essentials hinzufügen ({ $num } / { $max } Plätze belegt)
.accesskey = E
tab-context-zen-remove-essential =
.label = Aus Essentials entfernen
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimieren
zen-panel-ui-gradient-generator-custom-color = Benutzerdefinierte Farbe
zen-panel-ui-gradient-generator-saved-message = Farbverlauf erfolgreich gespeichert!
-zen-copy-current-url-confirmation = Die URL wurde in die Zwischenablage kopiert.
+zen-copy-current-url-confirmation = Aktuelle URL kopiert!
zen-general-cancel-label =
.label = Abbrechen
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Arbeitsbereiche
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Compact Mode umschalten
# note: Do not translate the "
" tags in the following string
@@ -48,4 +51,34 @@ zen-icons-picker-emoji =
.label = Emojis
zen-icons-picker-svg =
.label = Symbole
-urlbar-search-mode-zen_actions = Actions
+urlbar-search-mode-zen_actions = Aktionen
+zen-site-data-settings = Einstellungen
+zen-generic-manage = Verwalten
+zen-generic-more = Mehr
+zen-generic-next = Weiter
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Erlaubt
+zen-site-data-setting-block = Blockiert
+zen-site-data-setting-cross-site = Cross-Site-Cookie
+zen-site-data-security-info-extension =
+ .label = Erweiterung
+zen-site-data-security-info-secure =
+ .label = Sicher
+zen-site-data-security-info-not-secure =
+ .label = Nicht sicher
+zen-site-data-manage-addons =
+ .label = Erweiterungen verwalten
+zen-site-data-get-addons =
+ .label = Erweiterungen hinzufügen
+zen-site-data-site-settings =
+ .label = Alle Website-Einstellungen
+zen-site-data-share =
+ .label = Diese Seite teilen
+zen-urlbar-copy-url-button =
+ .tooltiptext = URL kopieren
+zen-site-data-setting-site-protection = Tracking-Schutz
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = Eine neue Heimat für Add-ons, Berechtigungen und mehr
+zen-site-data-panel-feature-callout-subtitle = Klicken Sie auf das Symbol, um Website-Einstellungen zu verwalten, Sicherheitsinformationen anzuzeigen, auf Erweiterungen zuzugreifen und häufige Aktionen auszuführen.
diff --git a/locales/de/browser/browser/zen-vertical-tabs.ftl b/locales/de/browser/browser/zen-vertical-tabs.ftl
index 73519fce6..2c9b6bb10 100644
--- a/locales/de/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/de/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Kompaktmodus
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Kompaktmodus aktivieren
.accesskey = D
diff --git a/locales/de/browser/browser/zen-welcome.ftl b/locales/de/browser/browser/zen-welcome.ftl
index aa2e41933..7a860e4df 100644
--- a/locales/de/browser/browser/zen-welcome.ftl
+++ b/locales/de/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Los geht's!
zen-welcome-default-search-title = Ihre Standard-Suchmaschine
zen-welcome-default-search-description = Wählen Sie Ihre Standard-Suchmaschine. Sie können diese später jederzeit ändern!
zen-welcome-skip-button = Überspringen
-zen-welcome-next-action = Weiter
zen-welcome-finished = Ihr Zen wurde erfolgreich eingerichtet!
diff --git a/locales/de/browser/browser/zen-workspaces.ftl b/locales/de/browser/browser/zen-workspaces.ftl
index 7d142e8de..071228c99 100644
--- a/locales/de/browser/browser/zen-workspaces.ftl
+++ b/locales/de/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Symbol ändern
zen-workspaces-panel-context-default-profile =
.label = Profil festlegen
+zen-workspaces-panel-unload =
+ .label = Arbeitsbereich entladen
zen-workspaces-how-to-reorder-title = Wie Arbeitsbereiche neu angeordnet werden
zen-workspaces-how-to-reorder-desc = Ziehen Sie die Arbeitsbereich-Symbole am unteren Rand der Seitenleiste, um sie neu anzuordnen
zen-workspaces-change-theme =
diff --git a/locales/el/browser/browser/preferences/zen-preferences.ftl b/locales/el/browser/browser/preferences/zen-preferences.ftl
index 4cd0d53c6..fc8b527a6 100644
--- a/locales/el/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/el/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Κλικ
zen-glance-trigger-meta-click =
.label = Meta (Εντολή) + Κλικ
-zen-glance-trigger-mantain-click =
- .label = Παρατεταμένο Κλικ (Έρχεται Σύντομα!)
zen-look-and-feel-compact-view-header = Εμφάνιση σε συμπαγή προβολή
zen-look-and-feel-compact-view-description = Εμφάνιση μόνο των γραμμών εργαλείων που χρησιμοποιείτε!
zen-look-and-feel-compact-view-enabled =
@@ -43,9 +41,9 @@ pane-settings-workspaces-title = Χώροι Εργασίας
zen-tabs-unloader-enabled =
.label = Ενεργοποίηση Εκφορτωτή Καρτέλας
zen-look-and-feel-compact-toolbar-themed =
- .label = Use themed background for compact toolbar
+ .label = Χρήση παρασκηνίου με θέμα για συμπαγή γραμμή εργαλειών
zen-workspace-continue-where-left-off =
- .label = Συνεχεία από εκεί που σταματήσατε
+ .label = Συνέχεια από εκεί που σταματήσατε
pane-zen-pinned-tab-manager-title = Καρφιτσωμένες Καρτέλες
zen-pinned-tab-manager-header = Γενικές ρυθμίσεις για καρφιτσωμένες καρτέλες
zen-pinned-tab-manager-description = Διαχείριση πρόσθετης συμπεριφοράς καρφιτσωμένων καρτελών
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Απόκρυψη της προκαθορισμένης ένδειξης περιέκτη στη γραμμή καρτελών
zen-key-unsaved = Μη αποθηκευμένη συντόμευση! Παρακαλώ αποθηκεύστε την κάνοντας κλικ στο πλήκτρο "Escape" αφού την πληκτρολογήσετε.
-zen-key-conflict = Διένεξη με κάποια άλλη συντόμευση
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = Ρυθμίσεις Θέματος
zen-vertical-tabs-title = Πλευρική γραμμή και διάταξη καρτελών
zen-vertical-tabs-header = Κατακόρυφες Καρτέλες
diff --git a/locales/el/browser/browser/zen-general.ftl b/locales/el/browser/browser/zen-general.ftl
index feda1420c..5e93572b0 100644
--- a/locales/el/browser/browser/zen-general.ftl
+++ b/locales/el/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Επαναφορά Καρφιτσωμένης Καρτέλας
.accesskey = R
tab-context-zen-add-essential =
- .label = Προσθήκη στα Απαραίτητα ({ $num } / 12 θέσεις γεμάτες)
+ .label = Προσθήκη στα Απαραίτητα ({ $num } / { $max } θέσεις γεμάτες)
.accesskey = E
tab-context-zen-remove-essential =
.label = Αφαίρεση από Απαραίτητα
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Ελαχιστοποίηση
zen-panel-ui-gradient-generator-custom-color = Προσαρμοσμένο Χρώμα
zen-panel-ui-gradient-generator-saved-message = Επιτυχής αποθήκευση της διαβάθμισης!
-zen-copy-current-url-confirmation = Το URL έχει αντιγραφεί στο πρόχειρο.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Ακύρωση
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Χώροι
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
# note: Do not translate the "
" tags in the following string
@@ -49,3 +52,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = Icons
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Settings
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+zen-site-data-manage-addons =
+ .label = Manage Extensions
+zen-site-data-get-addons =
+ .label = Add Extensions
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/el/browser/browser/zen-vertical-tabs.ftl b/locales/el/browser/browser/zen-vertical-tabs.ftl
index 06e8740de..20144a1b3 100644
--- a/locales/el/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/el/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Συμπαγής λειτουργία
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Ενεργοποίηση συμπαγούς λειτουργίας
.accesskey = D
diff --git a/locales/el/browser/browser/zen-welcome.ftl b/locales/el/browser/browser/zen-welcome.ftl
index fa9bcce37..3b6840565 100644
--- a/locales/el/browser/browser/zen-welcome.ftl
+++ b/locales/el/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Ξεκινάμε!
zen-welcome-default-search-title = Η Προεπιλεγμένη Μηχανή Αναζήτησης Σας
zen-welcome-default-search-description = Επιλέξτε την προεπιλεγμένη μηχανή αναζήτησης. Μπορείτε πάντα να την αλλάξετε αργότερα!
zen-welcome-skip-button = Παράλειψη
-zen-welcome-next-action = Επόμενο
zen-welcome-finished = Το Zen σας έχει ρυθμιστεί σωστά!
diff --git a/locales/el/browser/browser/zen-workspaces.ftl b/locales/el/browser/browser/zen-workspaces.ftl
index c08c24e79..c70cc2c30 100644
--- a/locales/el/browser/browser/zen-workspaces.ftl
+++ b/locales/el/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Αλλαγή Εικονιδίου
zen-workspaces-panel-context-default-profile =
.label = Ορισμός Προφίλ
+zen-workspaces-panel-unload =
+ .label = Unload Space
zen-workspaces-how-to-reorder-title = Πώς να αναδιατάξετε τους χώρους
zen-workspaces-how-to-reorder-desc = Σύρετε τα εικονίδια χώρου στο κάτω μέρος της πλαϊνής μπάρας για να τα αναδιατάξετε
zen-workspaces-change-theme =
diff --git a/locales/en-GB/browser/browser/preferences/zen-preferences.ftl b/locales/en-GB/browser/browser/preferences/zen-preferences.ftl
index 574d51624..f88081893 100644
--- a/locales/en-GB/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/en-GB/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Click
zen-glance-trigger-meta-click =
.label = Meta (Command) + Click
-zen-glance-trigger-mantain-click =
- .label = Maintain click (Coming Soon!)
zen-look-and-feel-compact-view-header = Show in compact view
zen-look-and-feel-compact-view-description = Only show the toolbars you use!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Hide the default container indicator in the tab bar
zen-key-unsaved = Unsaved shortcut! Please save it by clicking the "Escape" key after retyping it.
-zen-key-conflict = Conflict with another shortcut
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = Theme Settings
zen-vertical-tabs-title = Sidebar and tabs layout
zen-vertical-tabs-header = Vertical Tabs
diff --git a/locales/en-GB/browser/browser/zen-general.ftl b/locales/en-GB/browser/browser/zen-general.ftl
index f2af54421..93bb3bb33 100644
--- a/locales/en-GB/browser/browser/zen-general.ftl
+++ b/locales/en-GB/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Reset Pinned Tab
.accesskey = R
tab-context-zen-add-essential =
- .label = Add to Essentials ({ $num } / 12 slots filled)
+ .label = Add to Essentials ({ $num } / { $max } slots filled)
.accesskey = E
tab-context-zen-remove-essential =
.label = Remove from Essentials
@@ -22,7 +22,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimize
zen-panel-ui-gradient-generator-custom-color = Custom colour
zen-panel-ui-gradient-generator-saved-message = Successfully saved the gradient!
-zen-copy-current-url-confirmation = The URL has been copied to the clipboard.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Cancel
zen-general-confirm =
@@ -35,6 +35,9 @@ zen-library-sidebar-workspaces =
.label = Spaces
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
# note: Do not translate the "
" tags in the following string
@@ -47,3 +50,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = Icons
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Settings
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+zen-site-data-manage-addons =
+ .label = Manage Extensions
+zen-site-data-get-addons =
+ .label = Add Extensions
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/en-GB/browser/browser/zen-vertical-tabs.ftl b/locales/en-GB/browser/browser/zen-vertical-tabs.ftl
index aada1a48b..24d43dbfe 100644
--- a/locales/en-GB/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/en-GB/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Compact mode
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Enable compact mode
.accesskey = D
diff --git a/locales/en-GB/browser/browser/zen-welcome.ftl b/locales/en-GB/browser/browser/zen-welcome.ftl
index 2aeceeb88..0f22364c9 100644
--- a/locales/en-GB/browser/browser/zen-welcome.ftl
+++ b/locales/en-GB/browser/browser/zen-welcome.ftl
@@ -21,5 +21,4 @@ zen-welcome-start-browsing = Dive in!
zen-welcome-default-search-title = Your Default Search Engine
zen-welcome-default-search-description = Choose your default search engine. You can always change it later!
zen-welcome-skip-button = Skip
-zen-welcome-next-action = Next
zen-welcome-finished = Your Zen has been set up correctly!
diff --git a/locales/en-GB/browser/browser/zen-workspaces.ftl b/locales/en-GB/browser/browser/zen-workspaces.ftl
index 172313fae..299057041 100644
--- a/locales/en-GB/browser/browser/zen-workspaces.ftl
+++ b/locales/en-GB/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Change Icon
zen-workspaces-panel-context-default-profile =
.label = Set Profile
+zen-workspaces-panel-unload =
+ .label = Unload Space
zen-workspaces-how-to-reorder-title = How to reorder spaces
zen-workspaces-how-to-reorder-desc = Drag the space icons at the bottom of the sidebar to reorder them
zen-workspaces-change-theme =
diff --git a/locales/en-US/browser/browser/preferences/zen-preferences.ftl b/locales/en-US/browser/browser/preferences/zen-preferences.ftl
index 5ab322e34..43f48460d 100644
--- a/locales/en-US/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/en-US/browser/browser/preferences/zen-preferences.ftl
@@ -8,9 +8,9 @@ zen-warning-language = Changing the default language could make it easier for We
zen-vertical-tabs-layout-header = Browser Layout
zen-vertical-tabs-layout-description = Choose the layout that suits you best
-zen-layout-single-toolbar = Single toolbar
-zen-layout-multiple-toolbar = Multiple toolbars
-zen-layout-collapsed-toolbar = Collapsed toolbar
+zen-layout-single-toolbar = Only Sidebar
+zen-layout-multiple-toolbar = Sidebar and Top Toolbar
+zen-layout-collapsed-toolbar = Collapsed Sidebar
sync-currently-syncing-workspaces = Workspaces
sync-engine-workspaces =
@@ -33,8 +33,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Click
zen-glance-trigger-meta-click =
.label = Meta (Command) + Click
-zen-glance-trigger-mantain-click =
- .label = Hold Click (Coming Soon!)
zen-look-and-feel-compact-view-header = Show in compact view
zen-look-and-feel-compact-view-description = Only show the toolbars you use!
@@ -91,7 +89,7 @@ zen-settings-workspaces-hide-default-container-indicator =
.label = Hide the default container indicator in the tab bar
zen-key-unsaved = Unsaved shortcut! Please save it by clicking the "Escape" key after retyping it.
-zen-key-conflict = Conflict with another shortcut
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = Theme Settings
diff --git a/locales/en-US/browser/browser/zen-general.ftl b/locales/en-US/browser/browser/zen-general.ftl
index 708bc05d9..a1d427124 100644
--- a/locales/en-US/browser/browser/zen-general.ftl
+++ b/locales/en-US/browser/browser/zen-general.ftl
@@ -6,7 +6,7 @@ tab-context-zen-reset-pinned-tab =
.label = Reset Pinned Tab
.accesskey = R
tab-context-zen-add-essential =
- .label = Add to Essentials ({ $num } / 12 slots filled)
+ .label = Add to Essentials ({ $num } / { $max } slots filled)
.accesskey = E
tab-context-zen-remove-essential =
.label = Remove from Essentials
@@ -31,7 +31,7 @@ pictureinpicture-minimize-btn =
zen-panel-ui-gradient-generator-custom-color = Custom Color
zen-panel-ui-gradient-generator-saved-message = Successfully saved the gradient!
-zen-copy-current-url-confirmation = The URL has been copied to the clipboard.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Cancel
@@ -49,6 +49,10 @@ zen-library-sidebar-workspaces =
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
+
# note: Do not translate the "
" tags in the following string
zen-learn-more-text = Learn More
@@ -64,3 +68,38 @@ zen-icons-picker-svg =
.label = Icons
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Settings
+
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+
+zen-site-data-manage-addons =
+ .label = Manage Extensions
+zen-site-data-get-addons =
+ .label = Add Extensions
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/en-US/browser/browser/zen-vertical-tabs.ftl b/locales/en-US/browser/browser/zen-vertical-tabs.ftl
index 63fd3ef6d..1a40fa77a 100644
--- a/locales/en-US/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/en-US/browser/browser/zen-vertical-tabs.ftl
@@ -4,9 +4,7 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
- .label = Compact mode
- .accesskey = C
-
+ .label = Compact Mode
zen-toolbar-context-compact-mode-enable =
.label = Enable compact mode
.accesskey = D
@@ -17,6 +15,7 @@ zen-toolbar-context-compact-mode-just-toolbar =
zen-toolbar-context-compact-mode-hide-both =
.label = Hide both
.accesskey = H
+
zen-toolbar-context-new-folder =
.label = New Folder
.accesskey = N
diff --git a/locales/en-US/browser/browser/zen-welcome.ftl b/locales/en-US/browser/browser/zen-welcome.ftl
index c137bf910..1967595a9 100644
--- a/locales/en-US/browser/browser/zen-welcome.ftl
+++ b/locales/en-US/browser/browser/zen-welcome.ftl
@@ -29,6 +29,5 @@ zen-welcome-default-search-title = Your Default Search Engine
zen-welcome-default-search-description = Choose your default search engine. You can always change it later!
zen-welcome-skip-button = Skip
-zen-welcome-next-action = Next
zen-welcome-finished = Your Zen has been set up correctly!
diff --git a/locales/en-US/browser/browser/zen-workspaces.ftl b/locales/en-US/browser/browser/zen-workspaces.ftl
index 5b6452475..0933f225c 100644
--- a/locales/en-US/browser/browser/zen-workspaces.ftl
+++ b/locales/en-US/browser/browser/zen-workspaces.ftl
@@ -23,6 +23,9 @@ zen-workspaces-panel-change-icon =
zen-workspaces-panel-context-default-profile =
.label = Set Profile
+zen-workspaces-panel-unload =
+ .label = Unload Space
+
zen-workspaces-how-to-reorder-title = How to reorder spaces
zen-workspaces-how-to-reorder-desc = Drag the space icons at the bottom of the sidebar to reorder them
diff --git a/locales/es-ES/browser/browser/preferences/zen-preferences.ftl b/locales/es-ES/browser/browser/preferences/zen-preferences.ftl
index be10c1d3a..ec05a3f90 100644
--- a/locales/es-ES/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/es-ES/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Mayús + Clic
zen-glance-trigger-meta-click =
.label = Meta (Comando) + Clic
-zen-glance-trigger-mantain-click =
- .label = Mantener pulsado el clic (¡Próximamente!)
zen-look-and-feel-compact-view-header = Mostrar en vista compacta
zen-look-and-feel-compact-view-description = ¡Muestre solo las barras de herramientas que usa!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Ocultar el indicador de contenedor por defecto en la barra de pestañas
zen-key-unsaved = ¡Atajo sin guardar! Por favor guárdelo pulsando la tecla "Escape" después de reescribirlo.
-zen-key-conflict = Conflicto con otro atajo de teclado
+zen-key-conflict = Conflicto con { $group } -> { $shortcut }
pane-zen-theme-title = Ajustes del tema
zen-vertical-tabs-title = Diseño de la barra lateral y pestañas
zen-vertical-tabs-header = Pestañas verticales
diff --git a/locales/es-ES/browser/browser/zen-general.ftl b/locales/es-ES/browser/browser/zen-general.ftl
index 19aa9d9ee..fe0588c8b 100644
--- a/locales/es-ES/browser/browser/zen-general.ftl
+++ b/locales/es-ES/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Restablecer pestaña fijada
.accesskey = R
tab-context-zen-add-essential =
- .label = Añadir a esenciales ({ $num } / 12 huecos llenos)
+ .label = Añadir a esenciales ({ $num } / { $max } huecos llenos)
.accesskey = E
tab-context-zen-remove-essential =
.label = Quitar de esenciales
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimizar
zen-panel-ui-gradient-generator-custom-color = Color personalizado
zen-panel-ui-gradient-generator-saved-message = ¡Gradiente guardado con éxito!
-zen-copy-current-url-confirmation = La URL se ha copiado al portapapeles.
+zen-copy-current-url-confirmation = ¡URL actual copiada!
zen-general-cancel-label =
.label = Cancelar
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Espacios
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Modo compacto
+ .tooltiptext = Alternar modo compacto
# note: Do not translate the "
" tags in the following string
@@ -49,3 +52,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = Iconos
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Ajustes
+zen-generic-manage = Administrar
+zen-generic-more = Más
+zen-generic-next = Siguiente
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Permitido
+zen-site-data-setting-block = Bloqueado
+zen-site-data-setting-cross-site = Cookie de terceros
+zen-site-data-security-info-extension =
+ .label = Extensión
+zen-site-data-security-info-secure =
+ .label = Seguro
+zen-site-data-security-info-not-secure =
+ .label = No seguro
+zen-site-data-manage-addons =
+ .label = Administrar extensiones
+zen-site-data-get-addons =
+ .label = Añadir extensión
+zen-site-data-site-settings =
+ .label = Todas las configuraciones del sitio
+zen-site-data-share =
+ .label = Compartir esta página
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copiar URL
+zen-site-data-setting-site-protection = Protección contra el rastreo
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = Un nuevo hogar para complementos, permisos y más
+zen-site-data-panel-feature-callout-subtitle = Haga clic en el icono para administrar la configuración del sitio, ver información de seguridad, acceder a extensiones, y realizar acciones comunes.
diff --git a/locales/es-ES/browser/browser/zen-vertical-tabs.ftl b/locales/es-ES/browser/browser/zen-vertical-tabs.ftl
index 9eda5b098..5e8217d50 100644
--- a/locales/es-ES/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/es-ES/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Modo compacto
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Habilitar modo compacto
.accesskey = D
diff --git a/locales/es-ES/browser/browser/zen-welcome.ftl b/locales/es-ES/browser/browser/zen-welcome.ftl
index 9bba81e9d..9a855f7ee 100644
--- a/locales/es-ES/browser/browser/zen-welcome.ftl
+++ b/locales/es-ES/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = ¡Comencemos!
zen-welcome-default-search-title = Su motor de búsqueda predeterminado
zen-welcome-default-search-description = Elija su motor de búsqueda predeterminado. ¡Siempre puede cambiarlo más tarde!
zen-welcome-skip-button = Omitir
-zen-welcome-next-action = Siguiente
zen-welcome-finished = ¡Su Zen se ha configurado correctamente!
diff --git a/locales/es-ES/browser/browser/zen-workspaces.ftl b/locales/es-ES/browser/browser/zen-workspaces.ftl
index cedb5f1a3..3346d48ea 100644
--- a/locales/es-ES/browser/browser/zen-workspaces.ftl
+++ b/locales/es-ES/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Cambiar icono
zen-workspaces-panel-context-default-profile =
.label = Establecer perfil
+zen-workspaces-panel-unload =
+ .label = Suspender espacio
zen-workspaces-how-to-reorder-title = Cómo reordenar espacios
zen-workspaces-how-to-reorder-desc = Arrastre los iconos de los espacios en la parte inferior de la barra lateral para reordenarlos
zen-workspaces-change-theme =
diff --git a/locales/et/browser/browser/preferences/zen-preferences.ftl b/locales/et/browser/browser/preferences/zen-preferences.ftl
index 4cd455e74..0e89e8121 100644
--- a/locales/et/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/et/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Klõps
zen-glance-trigger-meta-click =
.label = Meta (Command) + Klõps
-zen-glance-trigger-mantain-click =
- .label = Hoia hiireklahvi all (valmib varsti!)
zen-look-and-feel-compact-view-header = Näita kompaktses vaates
zen-look-and-feel-compact-view-description = Näita ainult tööriistaribasid, mida aktiivselt kasutad!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Peida vaikimisi konteineri indikaator kaartide ribal
zen-key-unsaved = Salvestamata otsetee! Salvetamiseks kasuta "Esc" klahvi pärast otsetee sisestamist.
-zen-key-conflict = Vastuolu mõne teise otseteega
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = Teema sätted
zen-vertical-tabs-title = Külgriba ja kaartide paigutus
zen-vertical-tabs-header = Vertikaalsed kaardid
diff --git a/locales/et/browser/browser/zen-general.ftl b/locales/et/browser/browser/zen-general.ftl
index 7c4441100..62789f896 100644
--- a/locales/et/browser/browser/zen-general.ftl
+++ b/locales/et/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Lähtesta püsikaart
.accesskey = p
tab-context-zen-add-essential =
- .label = Märgi oluliseks ({ $num } / 12 täidetud)
+ .label = Märgi oluliseks ({ $num } / { $max } täidetud)
.accesskey = o
tab-context-zen-remove-essential =
.label = Eemalda olulistest
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimeeri
zen-panel-ui-gradient-generator-custom-color = Kohandatud värv
zen-panel-ui-gradient-generator-saved-message = Värviüleminek on edukalt salvestatud!
-zen-copy-current-url-confirmation = URL kopeeriti lõikelauale.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Tühista
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Tööruumid
zen-library-sidebar-mods =
.label = Mods-id
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Lülita kompaktne režiim sisse/välja
# note: Do not translate the "
" tags in the following string
@@ -48,4 +51,34 @@ zen-icons-picker-emoji =
.label = Emojid
zen-icons-picker-svg =
.label = Ikoonid
-urlbar-search-mode-zen_actions = Actions
+urlbar-search-mode-zen_actions = Tegevused
+zen-site-data-settings = Sätted
+zen-generic-manage = Halda
+zen-generic-more = Rohkem
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Lubatud
+zen-site-data-setting-block = Keelatud
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Laiendus
+zen-site-data-security-info-secure =
+ .label = Turvaline
+zen-site-data-security-info-not-secure =
+ .label = Ebaturvaline
+zen-site-data-manage-addons =
+ .label = Halda laiendusi
+zen-site-data-get-addons =
+ .label = Lisa laiendusi
+zen-site-data-site-settings =
+ .label = Kõik saidi sätted
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/et/browser/browser/zen-vertical-tabs.ftl b/locales/et/browser/browser/zen-vertical-tabs.ftl
index d17ca9f44..30609ee0d 100644
--- a/locales/et/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/et/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = p
zen-toolbar-context-compact-mode =
.label = Kompaktne režiim
- .accesskey = K
zen-toolbar-context-compact-mode-enable =
.label = Luba kompaktne režiim
.accesskey = r
diff --git a/locales/et/browser/browser/zen-welcome.ftl b/locales/et/browser/browser/zen-welcome.ftl
index c8f092249..fe19b2e7c 100644
--- a/locales/et/browser/browser/zen-welcome.ftl
+++ b/locales/et/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Hakkame pihta!
zen-welcome-default-search-title = Sinu vaikimisi otsingumootor
zen-welcome-default-search-description = Vali oma vaikimisi otsingumootor. Saad seda alati hiljem muuta!
zen-welcome-skip-button = Jäta vahele
-zen-welcome-next-action = Edasi
zen-welcome-finished = Zen on edukalt seadistatud!
diff --git a/locales/et/browser/browser/zen-workspaces.ftl b/locales/et/browser/browser/zen-workspaces.ftl
index 8b8fed3ee..ee416e641 100644
--- a/locales/et/browser/browser/zen-workspaces.ftl
+++ b/locales/et/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Muuda ikooni
zen-workspaces-panel-context-default-profile =
.label = Määra profiil
+zen-workspaces-panel-unload =
+ .label = Tööruumi mälust eemaldamine
zen-workspaces-how-to-reorder-title = Kuidas vahetada tööruumide järjestust
zen-workspaces-how-to-reorder-desc = Lohista tööruumide ikoone külgriba alumises servas, et nende järjestust muuta
zen-workspaces-change-theme =
diff --git a/locales/fa/browser/browser/preferences/zen-preferences.ftl b/locales/fa/browser/browser/preferences/zen-preferences.ftl
index 876f14a1e..4759f937c 100644
--- a/locales/fa/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/fa/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Click
zen-glance-trigger-meta-click =
.label = Meta (Command) + Click
-zen-glance-trigger-mantain-click =
- .label = Mantain Click
zen-look-and-feel-compact-view-header = نمایش در حالت فشرده
zen-look-and-feel-compact-view-description = Only show the toolbars you use!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Hide the default container indicator in the tab bar
zen-key-unsaved = Unsaved shortcut! Please save it by clicking the "Escape" key after retyping it.
-zen-key-conflict = Conflict with another shortcut
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = تنظیمات پوسته
zen-vertical-tabs-title = نوارکناری و چینش برگهها
zen-vertical-tabs-header = برگههای عمودی
diff --git a/locales/fa/browser/browser/zen-general.ftl b/locales/fa/browser/browser/zen-general.ftl
index 7a046afd4..a46966e24 100644
--- a/locales/fa/browser/browser/zen-general.ftl
+++ b/locales/fa/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Reset Pinned Tab
.accesskey = R
tab-context-zen-add-essential =
- .label = Add to Essentials ({ $num } / 12 slots filled)
+ .label = Add to Essentials ({ $num } / { $max } slots filled)
.accesskey = E
tab-context-zen-remove-essential =
.label = Remove from Essentials
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimize
zen-panel-ui-gradient-generator-custom-color = Custom Color
zen-panel-ui-gradient-generator-saved-message = Successfully saved the gradient!
-zen-copy-current-url-confirmation = The URL has been copied to the clipboard.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Cancel
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Spaces
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
# note: Do not translate the "
" tags in the following string
@@ -49,3 +52,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = Icons
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Settings
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+zen-site-data-manage-addons =
+ .label = Manage Extensions
+zen-site-data-get-addons =
+ .label = Add Extensions
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/fa/browser/browser/zen-vertical-tabs.ftl b/locales/fa/browser/browser/zen-vertical-tabs.ftl
index e59cd7a78..9c71802d2 100644
--- a/locales/fa/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/fa/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Compact mode
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Enable compact mode
.accesskey = D
diff --git a/locales/fa/browser/browser/zen-welcome.ftl b/locales/fa/browser/browser/zen-welcome.ftl
index 0767c9bb0..86d517ffd 100644
--- a/locales/fa/browser/browser/zen-welcome.ftl
+++ b/locales/fa/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Dive in!
zen-welcome-default-search-title = Your Default Search Engine
zen-welcome-default-search-description = Choose your default search engine. You can always change it later!
zen-welcome-skip-button = Skip
-zen-welcome-next-action = Next
zen-welcome-finished = Your Zen has been set up correctly!
diff --git a/locales/fa/browser/browser/zen-workspaces.ftl b/locales/fa/browser/browser/zen-workspaces.ftl
index 9f559215c..93e3ebac9 100644
--- a/locales/fa/browser/browser/zen-workspaces.ftl
+++ b/locales/fa/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Change Icon
zen-workspaces-panel-context-default-profile =
.label = Set Profile
+zen-workspaces-panel-unload =
+ .label = Unload Space
zen-workspaces-how-to-reorder-title = How to reorder spaces
zen-workspaces-how-to-reorder-desc = Drag the space icons at the bottom of the sidebar to reorder them
zen-workspaces-change-theme =
diff --git a/locales/fi/browser/browser/preferences/zen-preferences.ftl b/locales/fi/browser/browser/preferences/zen-preferences.ftl
index 41c23f3dd..877e8753e 100644
--- a/locales/fi/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/fi/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + klikkaa
zen-glance-trigger-meta-click =
.label = Meta (komento) + klikkaus
-zen-glance-trigger-mantain-click =
- .label = Pidä pohjassa klikkausta
zen-look-and-feel-compact-view-header = Näytä kompaktissa näkymätilassa
zen-look-and-feel-compact-view-description = Näytä vain käyttämäsi työkalupalkit!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Piilota säiliön oletusmerkkivalo välilehdessä - palkki
zen-key-unsaved = Tallentamaton pikakuvake! Ole hyvä ja turvaa se painamalla "Escape" -näppäintä kirjoittamisen jälkeen.
-zen-key-conflict = Ristiriita toisen pikakuvakkeen kanssa
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = Teeman Asetukset
zen-vertical-tabs-title = Sivupalkin ja välilehtien asettelu
zen-vertical-tabs-header = Pystysuorat Välilehdet
diff --git a/locales/fi/browser/browser/zen-general.ftl b/locales/fi/browser/browser/zen-general.ftl
index 7330b9882..241971b29 100644
--- a/locales/fi/browser/browser/zen-general.ftl
+++ b/locales/fi/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Nollaa Kiinnitetty Välilehti
.accesskey = R
tab-context-zen-add-essential =
- .label = Add to Essentials ({ $num } / 12 slots filled)
+ .label = Add to Essentials ({ $num } / { $max } slots filled)
.accesskey = E
tab-context-zen-remove-essential =
.label = Poista olennaisista
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimize
zen-panel-ui-gradient-generator-custom-color = Muokattu Väri
zen-panel-ui-gradient-generator-saved-message = Kaltevuus tallennettu onnistuneesti!
-zen-copy-current-url-confirmation = The URL has been copied to the clipboard.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Cancel
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Spaces
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
# note: Do not translate the "
" tags in the following string
@@ -49,3 +52,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = Icons
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Settings
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+zen-site-data-manage-addons =
+ .label = Manage Extensions
+zen-site-data-get-addons =
+ .label = Add Extensions
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/fi/browser/browser/zen-vertical-tabs.ftl b/locales/fi/browser/browser/zen-vertical-tabs.ftl
index 1e83d63e1..4fd1556f6 100644
--- a/locales/fi/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/fi/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Kompakti tila
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Ota kompakti tila käyttöön
.accesskey = D
diff --git a/locales/fi/browser/browser/zen-welcome.ftl b/locales/fi/browser/browser/zen-welcome.ftl
index 0767c9bb0..86d517ffd 100644
--- a/locales/fi/browser/browser/zen-welcome.ftl
+++ b/locales/fi/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Dive in!
zen-welcome-default-search-title = Your Default Search Engine
zen-welcome-default-search-description = Choose your default search engine. You can always change it later!
zen-welcome-skip-button = Skip
-zen-welcome-next-action = Next
zen-welcome-finished = Your Zen has been set up correctly!
diff --git a/locales/fi/browser/browser/zen-workspaces.ftl b/locales/fi/browser/browser/zen-workspaces.ftl
index bae229643..a4ce573ff 100644
--- a/locales/fi/browser/browser/zen-workspaces.ftl
+++ b/locales/fi/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Change Icon
zen-workspaces-panel-context-default-profile =
.label = Set Profile
+zen-workspaces-panel-unload =
+ .label = Unload Space
zen-workspaces-how-to-reorder-title = How to reorder spaces
zen-workspaces-how-to-reorder-desc = Drag the space icons at the bottom of the sidebar to reorder them
zen-workspaces-change-theme =
diff --git a/locales/fr/browser/browser/preferences/zen-preferences.ftl b/locales/fr/browser/browser/preferences/zen-preferences.ftl
index 66e352dcf..148b9ec72 100644
--- a/locales/fr/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/fr/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Maj + clic
zen-glance-trigger-meta-click =
.label = Super (Command) + clic
-zen-glance-trigger-mantain-click =
- .label = Maintenir le clic (très bientôt !)
zen-look-and-feel-compact-view-header = Afficher en mode compact
zen-look-and-feel-compact-view-description = Affichez uniquement les barres d’outils que vous utilisez !
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Dans la barre d’onglets, masquer l’indicateur de conteneur par défaut
zen-key-unsaved = Raccourci non sauvegardé ! Pour l’enregistrer, veuillez le resaisir et en appuyer sur Échap.
-zen-key-conflict = Conflit avec un autre raccourci
+zen-key-conflict = En conflit avec { $group } → { $shortcut }
pane-zen-theme-title = Paramètres de thème
zen-vertical-tabs-title = Disposition de la barre latérale et des onglets
zen-vertical-tabs-header = Onglets verticaux
diff --git a/locales/fr/browser/browser/zen-general.ftl b/locales/fr/browser/browser/zen-general.ftl
index 9da276624..a22ad1afe 100644
--- a/locales/fr/browser/browser/zen-general.ftl
+++ b/locales/fr/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Réinitialiser l’onglet épinglé
.accesskey = R
tab-context-zen-add-essential =
- .label = Ajouter aux Essentials ({ $num } / 12 emplacements remplis)
+ .label = Ajouter aux Essentials ({ $num } / { $max } emplacements occupés)
.accesskey = E
tab-context-zen-remove-essential =
.label = Retirer des Essentials
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimiser
zen-panel-ui-gradient-generator-custom-color = Couleur personnalisée
zen-panel-ui-gradient-generator-saved-message = Le dégradé a été enregistré avec succès !
-zen-copy-current-url-confirmation = L’adresse a été copiée dans le presse-papier.
+zen-copy-current-url-confirmation = URL actuelle copiée !
zen-general-cancel-label =
.label = Annuler
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Espaces
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Mode compact
+ .tooltiptext = Activer/Désactiver le mode compact
# note: Do not translate the "
" tags in the following string
@@ -49,3 +52,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = Icônes
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Paramètres
+zen-generic-manage = Gérer
+zen-generic-more = Plus
+zen-generic-next = Suivant
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Autorisé
+zen-site-data-setting-block = Bloqué
+zen-site-data-setting-cross-site = cookie intersite
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Sécurisé
+zen-site-data-security-info-not-secure =
+ .label = Non sécurisé
+zen-site-data-manage-addons =
+ .label = Gérer les extensions
+zen-site-data-get-addons =
+ .label = Ajouter des extensions
+zen-site-data-site-settings =
+ .label = Tous les paramètres du site
+zen-site-data-share =
+ .label = Partager cette page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copier l'URL
+zen-site-data-setting-site-protection = Protection contre le pistage
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = Un nouvel endroit pour vos extensions, permissions et plus encore
+zen-site-data-panel-feature-callout-subtitle = Cliquez sur l'icône pour gérer les paramètres du site, afficher les infos de sécurité, accéder aux extensions et effectuer d'autres actions.
diff --git a/locales/fr/browser/browser/zen-vertical-tabs.ftl b/locales/fr/browser/browser/zen-vertical-tabs.ftl
index 73e82b59b..2e2f81be2 100644
--- a/locales/fr/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/fr/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Mode compact
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Activer le mode compact
.accesskey = D
diff --git a/locales/fr/browser/browser/zen-welcome.ftl b/locales/fr/browser/browser/zen-welcome.ftl
index 037d9d80c..2de8e50ca 100644
--- a/locales/fr/browser/browser/zen-welcome.ftl
+++ b/locales/fr/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = C’est parti !
zen-welcome-default-search-title = Votre moteur de recherche par défaut
zen-welcome-default-search-description = Sélectionnez votre moteur de recherche par défaut. Vous pouvez toujours le modifier plus tard !
zen-welcome-skip-button = Ignorer
-zen-welcome-next-action = Suivant
zen-welcome-finished = Votre navigateur Zen a été configuré correctement !
diff --git a/locales/fr/browser/browser/zen-workspaces.ftl b/locales/fr/browser/browser/zen-workspaces.ftl
index 8b4e75556..7d4a98b63 100644
--- a/locales/fr/browser/browser/zen-workspaces.ftl
+++ b/locales/fr/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Changer d'icône
zen-workspaces-panel-context-default-profile =
.label = Définir le profil
+zen-workspaces-panel-unload =
+ .label = Décharger l'espace
zen-workspaces-how-to-reorder-title = Comment réordonner les espaces
zen-workspaces-how-to-reorder-desc = Faites glisser les icônes d'espace en bas de la barre latérale pour les réorganiser
zen-workspaces-change-theme =
diff --git a/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl b/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl
index 6f7639c99..de1d4cb77 100644
--- a/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ga-IE/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Cliceáil
zen-glance-trigger-meta-click =
.label = Meta (Ordú) + Cliceáil
-zen-glance-trigger-mantain-click =
- .label = Mantain Click
zen-look-and-feel-compact-view-header = Taispeáin i ndlúth d’amharc
zen-look-and-feel-compact-view-description = Ná taispeáin ach na barraí uirlisí a úsáideann tú!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Folaigh an táscaire coimeádáin réamhshocraithe sa bharra cluaisíní
zen-key-unsaved = Aicearra gan sábháil! Sábháil é trí chliceáil ar an eochair "Escape" tar éis é a athchlóscríobh.
-zen-key-conflict = Coimhlint le aicearra eile
+zen-key-conflict = Coimhlintí le { $group } -> { $shortcut }
pane-zen-theme-title = Socruithe Téama
zen-vertical-tabs-title = Leagan amach barra taobh agus cluaisíní
zen-vertical-tabs-header = Cluaisíní Ingearacha
diff --git a/locales/ga-IE/browser/browser/zen-general.ftl b/locales/ga-IE/browser/browser/zen-general.ftl
index 27bd04d9c..0996ffa2b 100644
--- a/locales/ga-IE/browser/browser/zen-general.ftl
+++ b/locales/ga-IE/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Athshocraigh an Cluaisín Prionáilte
.accesskey = R
tab-context-zen-add-essential =
- .label = Cuir le Bunriachtanais ({ $num } / 12 sliotán líonta)
+ .label = Cuir le Bunriachtanais ({ $num } / { $max } sliotán líonta)
.accesskey = E
tab-context-zen-remove-essential =
.label = Bain de na Bunriachtanais
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Íoslaghdaigh
zen-panel-ui-gradient-generator-custom-color = Dath Saincheaptha
zen-panel-ui-gradient-generator-saved-message = Sábháladh an grádán go rathúil!
-zen-copy-current-url-confirmation = Tá an URL cóipeáilte chuig an ghearrthaisce.
+zen-copy-current-url-confirmation = Cóipeáladh an URL reatha!
zen-general-cancel-label =
.label = Cealaigh
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Spásanna
zen-library-sidebar-mods =
.label = Modanna
+zen-toggle-compact-mode-button =
+ .label = Mód Dlúth
+ .tooltiptext = Mód Dlúth a Athrú
# note: Do not translate the "
" tags in the following string
@@ -48,4 +51,34 @@ zen-icons-picker-emoji =
.label = Emojis
zen-icons-picker-svg =
.label = Deilbhíní
-urlbar-search-mode-zen_actions = Actions
+urlbar-search-mode-zen_actions = Gníomhartha
+zen-site-data-settings = Socruithe
+zen-generic-manage = Bainistigh
+zen-generic-more = Tuilleadh
+zen-generic-next = Ar Aghaidh
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Ceadaithe
+zen-site-data-setting-block = Blocáilte
+zen-site-data-setting-cross-site = Fianán Tras-Láithreáin
+zen-site-data-security-info-extension =
+ .label = Síneadh
+zen-site-data-security-info-secure =
+ .label = Slán
+zen-site-data-security-info-not-secure =
+ .label = Ní Slán
+zen-site-data-manage-addons =
+ .label = Bainistigh Síneadh
+zen-site-data-get-addons =
+ .label = Cuir Síneadh leis
+zen-site-data-site-settings =
+ .label = Gach Socrú Suímh
+zen-site-data-share =
+ .label = Comhroinn an Leathanach seo
+zen-urlbar-copy-url-button =
+ .tooltiptext = Cóipeáil URL
+zen-site-data-setting-site-protection = Cosaint Rianaithe
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = Baile nua do bhreiseáin, ceadanna agus tuilleadh
+zen-site-data-panel-feature-callout-subtitle = Cliceáil an deilbhín chun socruithe suímh a bhainistiú, faisnéis slándála a fheiceáil, rochtain a fháil ar shínteáin, agus gníomhartha coitianta a dhéanamh.
diff --git a/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl b/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl
index d8d7f578c..f98223ee5 100644
--- a/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/ga-IE/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Mód dlúth
- .accesskey = D’Athraigh Chluaisíní(s) go Spás Oibre
zen-toolbar-context-compact-mode-enable =
.label = Cumasaigh mód dlúth
.accesskey = D
diff --git a/locales/ga-IE/browser/browser/zen-welcome.ftl b/locales/ga-IE/browser/browser/zen-welcome.ftl
index 643197f3b..496336dd3 100644
--- a/locales/ga-IE/browser/browser/zen-welcome.ftl
+++ b/locales/ga-IE/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Tum isteach!
zen-welcome-default-search-title = D'Inneall Cuardaigh Réamhshocraithe
zen-welcome-default-search-description = Roghnaigh d'inneall cuardaigh réamhshocraithe. Is féidir leat é a athrú níos déanaí!
zen-welcome-skip-button = Scipeáil
-zen-welcome-next-action = Ar Aghaidh
zen-welcome-finished = Tá do Zen socraithe i gceart!
diff --git a/locales/ga-IE/browser/browser/zen-workspaces.ftl b/locales/ga-IE/browser/browser/zen-workspaces.ftl
index 036a31856..33f9e1b2c 100644
--- a/locales/ga-IE/browser/browser/zen-workspaces.ftl
+++ b/locales/ga-IE/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Athraigh Deilbhín
zen-workspaces-panel-context-default-profile =
.label = Socraigh Próifíl
+zen-workspaces-panel-unload =
+ .label = Díluchtaigh Spás
zen-workspaces-how-to-reorder-title = Conas spásanna a athordú
zen-workspaces-how-to-reorder-desc = Tarraing na deilbhíní spáis ag bun an bharra taoibh chun iad a athordú
zen-workspaces-change-theme =
diff --git a/locales/he/browser/browser/preferences/zen-preferences.ftl b/locales/he/browser/browser/preferences/zen-preferences.ftl
index 02e60d27c..8081799a3 100644
--- a/locales/he/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/he/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + לחיצה
zen-glance-trigger-meta-click =
.label = מטה (Command) + לחיצה
-zen-glance-trigger-mantain-click =
- .label = החזקת לחיצה (בקרוב!)
zen-look-and-feel-compact-view-header = הצגה בתצוגה מכווצת
zen-look-and-feel-compact-view-description = מראה לך רק את הסרגלים בשימוש
zen-look-and-feel-compact-view-enabled =
@@ -43,7 +41,7 @@ pane-settings-workspaces-title = סביבות עבודה
zen-tabs-unloader-enabled =
.label = הפעלת פינוי כרטיסיות
zen-look-and-feel-compact-toolbar-themed =
- .label = Use themed background for compact toolbar
+ .label = שימוש ברקע עם עיצוב לסרגל מכווץ
zen-workspace-continue-where-left-off =
.label = המשכה מאיפה שהפסקת
pane-zen-pinned-tab-manager-title = כרטיסיות מוצמדות
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = הסתרת המחוון המכל המוגדר כברירת מחדל בשורת הכרטיסיות
zen-key-unsaved = קיצור מקלדת לא נשמר! יש לשמור אותו על ידי הקשה על "Escape" לאחר הקלדה מחדש.
-zen-key-conflict = התנגשות עם קיצור מקלדת אחר
+zen-key-conflict = קונפליקט עם { $group } -> { $shortcut }
pane-zen-theme-title = הגדרות ערכת נושא
zen-vertical-tabs-title = סדר סרגל צד כרטיסיות
zen-vertical-tabs-header = כרטיסיות אנכיות
@@ -221,7 +219,7 @@ zen-key-exit-full-screen = צא ממסך מלא
zen-ai-chatbot-sidebar-shortcut = הפעל/כבה סרגל צ'אט AI צד
zen-key-inspector-mac = הפעל/כבה בודק (Mac)
zen-toggle-sidebar-shortcut = הפעל/כבה סרגל צד של Firefox
-zen-toggle-pin-tab-shortcut = Toggle Pin Tab
+zen-toggle-pin-tab-shortcut = הצמדת כרטיסייה
zen-reader-mode-toggle-shortcut-other = הפעל/כבה מצב קריאה
zen-picture-in-picture-toggle-shortcut = הפעל/כבה תמונה-בתמונה
zen-nav-reload-shortcut-2 = רענן עמוד
@@ -255,7 +253,7 @@ zen-close-tab-shortcut = סגור כרטיסיה
zen-compact-mode-shortcut-show-sidebar = הפעל/כבה סרגל צד מרחף
zen-compact-mode-shortcut-show-toolbar = הפעל/כבה סרגל מרחף
zen-compact-mode-shortcut-toggle = הפעל/כבה מצב מכווץ
-zen-glance-expand = Expand Glance
+zen-glance-expand = הרחבת מבט
zen-workspace-shortcut-switch-1 = עבור לסביבת עבודה 1
zen-workspace-shortcut-switch-2 = עבור לסביבת עבודה 2
zen-workspace-shortcut-switch-3 = עבור לסביבת עבודה 3
@@ -274,7 +272,7 @@ zen-split-view-shortcut-grid = הפעל/כבה תצוגה מפוצלת רשת
zen-split-view-shortcut-vertical = הפעל/כבה תצוגה מפוצלת אנכית
zen-split-view-shortcut-horizontal = הפעל/כבה תצוגה מפוצלת אופקית
zen-split-view-shortcut-unsplit = סגור תצוגה מפוצלת
-zen-new-empty-split-view-shortcut = New Empty Split View
+zen-new-empty-split-view-shortcut = פיצול חדש ריק
zen-key-select-tab-1 = בחר כרטיסיה #1
zen-key-select-tab-2 = בחר כרטיסיה #2
zen-key-select-tab-3 = בחר כרטיסיה #3
diff --git a/locales/he/browser/browser/zen-folders.ftl b/locales/he/browser/browser/zen-folders.ftl
index 83dfd55e6..15f540fb2 100644
--- a/locales/he/browser/browser/zen-folders.ftl
+++ b/locales/he/browser/browser/zen-folders.ftl
@@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space =
zen-folders-panel-change-icon-folder =
.label = שינוי סמל
zen-folders-unload-all-tooltip =
- .tooltiptext = Unload active in this folder
+ .tooltiptext = פינוי כל הפעילים בתיקייה הזו
zen-folders-unload-folder =
.label = פינוי כל הכרטיסייות
zen-folders-search-no-results = אין כרטיסיות שתואמות לחיפוש 🤔
diff --git a/locales/he/browser/browser/zen-general.ftl b/locales/he/browser/browser/zen-general.ftl
index 3522defdb..d15ba51f0 100644
--- a/locales/he/browser/browser/zen-general.ftl
+++ b/locales/he/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = אפס כרטיסייה מוצמדת
.accesskey = ר
tab-context-zen-add-essential =
- .label = הוסף לנחוצים ({ $num } / 12 מקומות מלאים)
+ .label = הוסף לנחוצים ({ $num } / { $max } מקומות מלאים)
.accesskey = ק
tab-context-zen-remove-essential =
.label = הסר מנחוצים
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = מזער
zen-panel-ui-gradient-generator-custom-color = צבע מותאם אישית
zen-panel-ui-gradient-generator-saved-message = מיזוג הצבעים נשמר בהצלחה!
-zen-copy-current-url-confirmation = הקישור הועתק ללוח.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = ביטול
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = סביבות
zen-library-sidebar-mods =
.label = מודים
+zen-toggle-compact-mode-button =
+ .label = מצב מכווץ
+ .tooltiptext = הפעל/כבה מצב מכווץ
# note: Do not translate the "
" tags in the following string
@@ -48,4 +51,34 @@ zen-icons-picker-emoji =
.label = אימוג'ים
zen-icons-picker-svg =
.label = סמלים
-urlbar-search-mode-zen_actions = Actions
+urlbar-search-mode-zen_actions = פעולות
+zen-site-data-settings = הגדרות
+zen-generic-manage = ניהול
+zen-generic-more = עוד
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = אושר
+zen-site-data-setting-block = חסום
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = תוספים
+zen-site-data-security-info-secure =
+ .label = מאובטח
+zen-site-data-security-info-not-secure =
+ .label = לא מאובטח
+zen-site-data-manage-addons =
+ .label = נהל תוספים
+zen-site-data-get-addons =
+ .label = הוספת תוספים
+zen-site-data-site-settings =
+ .label = כל הגדרות אתר
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = בית חדש לתוספים, הרשאות, ועוד
+zen-site-data-panel-feature-callout-subtitle = ניתן ללחוץ על הסמל כדי לנהל הגדרות אתר, לצפות במידע אבטחה, לגשת לתוספים, ולבצע פעולות נפוצות.
diff --git a/locales/he/browser/browser/zen-vertical-tabs.ftl b/locales/he/browser/browser/zen-vertical-tabs.ftl
index ca7d7e1f3..4e8e2b706 100644
--- a/locales/he/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/he/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = ר
zen-toolbar-context-compact-mode =
.label = מצב מכווץ
- .accesskey = ב
zen-toolbar-context-compact-mode-enable =
.label = הפעל מצב מכווץ
.accesskey = ג
@@ -15,7 +14,7 @@ zen-toolbar-context-compact-mode-hide-both =
.label = הסתרת שניהם
.accesskey = י
zen-toolbar-context-new-folder =
- .label = New Folder
+ .label = תיקייה חדשה
.accesskey = מ
sidebar-zen-expand =
.label = הרחבת סרגל צדדי
diff --git a/locales/he/browser/browser/zen-welcome.ftl b/locales/he/browser/browser/zen-welcome.ftl
index 1595bd1dd..a4949f8c1 100644
--- a/locales/he/browser/browser/zen-welcome.ftl
+++ b/locales/he/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = יאללה בלאגן!
zen-welcome-default-search-title = מנוע החיפוש ברירת מחדל שלך
zen-welcome-default-search-description = יש לבחור את מנוע החיפוש ברירת מחדל שלך. תמיד ניתן לשנות אותו!
zen-welcome-skip-button = דלג
-zen-welcome-next-action = הבא
zen-welcome-finished = הZen שלך הוגדר בהצלחה!
diff --git a/locales/he/browser/browser/zen-workspaces.ftl b/locales/he/browser/browser/zen-workspaces.ftl
index f6a324858..89fd0dbe7 100644
--- a/locales/he/browser/browser/zen-workspaces.ftl
+++ b/locales/he/browser/browser/zen-workspaces.ftl
@@ -4,7 +4,7 @@ zen-panel-ui-workspaces-create =
zen-panel-ui-folder-create =
.label = יצירת תיקייה
zen-panel-ui-new-empty-split =
- .label = New Split
+ .label = פיצול חדש
zen-workspaces-panel-context-delete =
.label = מחק סיבת עבודה
.accesskey = ג
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = שינוי סמל
zen-workspaces-panel-context-default-profile =
.label = הגדרת פרופיל
+zen-workspaces-panel-unload =
+ .label = פינוי סיבבת עבודה
zen-workspaces-how-to-reorder-title = איך לסדר מחדש סביבות
zen-workspaces-how-to-reorder-desc = אפשר לסדר מחדש סביבות על ידי גרירה ושחרור של הסמלים בסרגל התחתון
zen-workspaces-change-theme =
diff --git a/locales/hu/browser/browser/preferences/zen-preferences.ftl b/locales/hu/browser/browser/preferences/zen-preferences.ftl
index a889eb153..941ba12f3 100644
--- a/locales/hu/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/hu/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Kattintás
zen-glance-trigger-meta-click =
.label = Meta (Command) + Kattintás
-zen-glance-trigger-mantain-click =
- .label = Nyomva tartás (Hamarosan!)
zen-look-and-feel-compact-view-header = Kompakt nézet
zen-look-and-feel-compact-view-description = Csak azokat az eszköztárakat lásd amit használsz!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Alapértelmezett konténerjelző elrejtése a tabulátor sávban
zen-key-unsaved = Nem mentett gyorsbillentyű! Mentsd meg az "Escape" gomb lenyomásával, majd újraírásával.
-zen-key-conflict = Ütközik egy másik gyorsbillentyűvel
+zen-key-conflict = Ütközik ezzel: { $group } → { $shortcut }
pane-zen-theme-title = Téma beállítások
zen-vertical-tabs-title = Oldalsó sáv és lapok elrendezése
zen-vertical-tabs-header = Függőleges lapok
diff --git a/locales/hu/browser/browser/zen-general.ftl b/locales/hu/browser/browser/zen-general.ftl
index a148fdee3..3c75ef5da 100644
--- a/locales/hu/browser/browser/zen-general.ftl
+++ b/locales/hu/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Kitűzött lap visszaállítása
.accesskey = R
tab-context-zen-add-essential =
- .label = Felvétel az alapvetőkbe ({ $num } / 12 hely foglalt)
+ .label = Felvétel az alapvetőkbe ({ $num } / { $max } hely foglalt)
.accesskey = E
tab-context-zen-remove-essential =
.label = Eltávolítás az alapvetőkből
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimalizálás
zen-panel-ui-gradient-generator-custom-color = Egyedi szín
zen-panel-ui-gradient-generator-saved-message = Színátmenet sikeresen mentve!
-zen-copy-current-url-confirmation = Az URL-cím a vágólapra lett másolva.
+zen-copy-current-url-confirmation = Jelenlegi URL másolva!
zen-general-cancel-label =
.label = Mégsem
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Környezetek
zen-library-sidebar-mods =
.label = Modok
+zen-toggle-compact-mode-button =
+ .label = Kompakt mód
+ .tooltiptext = Kompakt mód ki-/bekapcsolása
# note: Do not translate the "
" tags in the following string
@@ -48,4 +51,34 @@ zen-icons-picker-emoji =
.label = Emojik
zen-icons-picker-svg =
.label = Ikonok
-urlbar-search-mode-zen_actions = Actions
+urlbar-search-mode-zen_actions = Műveletek
+zen-site-data-settings = Beállítások
+zen-generic-manage = Kezelés
+zen-generic-more = Több
+zen-generic-next = Következő
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Engedélyezve
+zen-site-data-setting-block = Letiltva
+zen-site-data-setting-cross-site = Webhelyek közötti sütik
+zen-site-data-security-info-extension =
+ .label = Kiegészítő
+zen-site-data-security-info-secure =
+ .label = Biztonságos
+zen-site-data-security-info-not-secure =
+ .label = Nem biztonságos
+zen-site-data-manage-addons =
+ .label = Kiegészítők kezelése
+zen-site-data-get-addons =
+ .label = Kiegészítő hozzáadása
+zen-site-data-site-settings =
+ .label = Minden webhelybeállítás
+zen-site-data-share =
+ .label = Oldal megosztása
+zen-urlbar-copy-url-button =
+ .tooltiptext = URL másolása
+zen-site-data-setting-site-protection = Nyomkövetés védelem
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = Új hely az add-onok, engedélyek és egyéb elemek számára
+zen-site-data-panel-feature-callout-subtitle = Kattints az ikonra a webhely beállításainak kezeléséhez, a biztonsági információk megtekintéséhez, a kiegészítők eléréséhez és a gyakori műveletek végrehajtásához.
diff --git a/locales/hu/browser/browser/zen-vertical-tabs.ftl b/locales/hu/browser/browser/zen-vertical-tabs.ftl
index f6c38a34f..138a4223c 100644
--- a/locales/hu/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/hu/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Kompakt mód
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Kompakt mód engedélyezése
.accesskey = D
diff --git a/locales/hu/browser/browser/zen-welcome.ftl b/locales/hu/browser/browser/zen-welcome.ftl
index daefeb7c6..498869a73 100644
--- a/locales/hu/browser/browser/zen-welcome.ftl
+++ b/locales/hu/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Merüljön el!
zen-welcome-default-search-title = Az Ön alapértelmezett keresőmotorja
zen-welcome-default-search-description = Válassza ki az alapértelmezett keresőmotort. Később bármikor megváltoztathatja!
zen-welcome-skip-button = Kihagyás
-zen-welcome-next-action = Következő
zen-welcome-finished = A Zen helyesen lett beállítva!
diff --git a/locales/hu/browser/browser/zen-workspaces.ftl b/locales/hu/browser/browser/zen-workspaces.ftl
index 13e5f5ebe..c26bc5a16 100644
--- a/locales/hu/browser/browser/zen-workspaces.ftl
+++ b/locales/hu/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Ikon módosítása
zen-workspaces-panel-context-default-profile =
.label = Profil beállítása
+zen-workspaces-panel-unload =
+ .label = Környezet ürítése
zen-workspaces-how-to-reorder-title = Hogyan rendezhetők át a munkakörnyezetek
zen-workspaces-how-to-reorder-desc = Húzza az oldalsáv alján lévő ikonokat az átrendezéshez
zen-workspaces-change-theme =
diff --git a/locales/id/browser/browser/preferences/zen-preferences.ftl b/locales/id/browser/browser/preferences/zen-preferences.ftl
index fa3f07447..0192c9643 100644
--- a/locales/id/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/id/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Klik
zen-glance-trigger-meta-click =
.label = Windows (Command) + Klik
-zen-glance-trigger-mantain-click =
- .label = Tahan Klik (Segera Datang!)
zen-look-and-feel-compact-view-header = Tampilkan dalam tampilan ringkas
zen-look-and-feel-compact-view-description = Tampilkan hanya toolbar yang Anda gunakan!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Sembunyikan indikator kontainer default di bilah tab
zen-key-unsaved = Pintasan belum tersimpan! Simpan dengan mengklik tombol "Escape" setelah mengetik ulang.
-zen-key-conflict = Konflik dengan pintasan lain
+zen-key-conflict = Konflik dengan { $group } -> { $shortcut }
pane-zen-theme-title = Pengaturan Tema
zen-vertical-tabs-title = Susunan sidebar dan tab
zen-vertical-tabs-header = Tab Vertikal
diff --git a/locales/id/browser/browser/zen-general.ftl b/locales/id/browser/browser/zen-general.ftl
index 95b79faf8..7cc80dab9 100644
--- a/locales/id/browser/browser/zen-general.ftl
+++ b/locales/id/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Kembalikan ke URL Awal
.accesskey = R
tab-context-zen-add-essential =
- .label = Tambahkan ke Essentials ({ $num } / 12 slot terisi)
+ .label = Tambahkan ke Essentials ({ $num } / { $max } slot terisi)
.accesskey = E
tab-context-zen-remove-essential =
.label = Hapus dari Essentials
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimalkan
zen-panel-ui-gradient-generator-custom-color = Warna Kustom
zen-panel-ui-gradient-generator-saved-message = Berhasil menyimpan gradien!
-zen-copy-current-url-confirmation = URL telah disalin ke clipboard.
+zen-copy-current-url-confirmation = URL Disalin!
zen-general-cancel-label =
.label = Batalkan
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Ruang
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Mode Ringkas
+ .tooltiptext = Aktifkan/Sembunyikan Mode Ringkas
# note: Do not translate the "
" tags in the following string
@@ -48,4 +51,34 @@ zen-icons-picker-emoji =
.label = Emoji
zen-icons-picker-svg =
.label = Ikon
-urlbar-search-mode-zen_actions = Actions
+urlbar-search-mode-zen_actions = Aksi
+zen-site-data-settings = Pengaturan
+zen-generic-manage = Kelola
+zen-generic-more = Selengkapnya
+zen-generic-next = Lanjut
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Diizinkan
+zen-site-data-setting-block = Diblokir
+zen-site-data-setting-cross-site = Kuki Lintas Situs
+zen-site-data-security-info-extension =
+ .label = Ekstensi
+zen-site-data-security-info-secure =
+ .label = Aman
+zen-site-data-security-info-not-secure =
+ .label = Tidak Aman
+zen-site-data-manage-addons =
+ .label = Kelola Ekstensi
+zen-site-data-get-addons =
+ .label = Tambahkan Ekstensi
+zen-site-data-site-settings =
+ .label = Semua Pengaturan Situs
+zen-site-data-share =
+ .label = Bagikan Halaman Ini
+zen-urlbar-copy-url-button =
+ .tooltiptext = Salin URL
+zen-site-data-setting-site-protection = Perlindungan Pelacakan
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = Rumah baru untuk add-on, izin, dan lainnya
+zen-site-data-panel-feature-callout-subtitle = Klik ikon untuk mengelola pengaturan situs, melihat info keamanan, mengakses ekstensi, dan melakukan tindakan umum.
diff --git a/locales/id/browser/browser/zen-vertical-tabs.ftl b/locales/id/browser/browser/zen-vertical-tabs.ftl
index cb6626afd..2621be1e0 100644
--- a/locales/id/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/id/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Mode Ringkas
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Aktifkan Mode Ringkas
.accesskey = D
diff --git a/locales/id/browser/browser/zen-welcome.ftl b/locales/id/browser/browser/zen-welcome.ftl
index 63b7d4b05..8cebcb240 100644
--- a/locales/id/browser/browser/zen-welcome.ftl
+++ b/locales/id/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Penyelaman dimulai!
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
-zen-welcome-next-action = Lanjut
zen-welcome-finished = Anda berhasil mengatur Zen milik anda!
diff --git a/locales/id/browser/browser/zen-workspaces.ftl b/locales/id/browser/browser/zen-workspaces.ftl
index f5ad9e053..084c2a0f6 100644
--- a/locales/id/browser/browser/zen-workspaces.ftl
+++ b/locales/id/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Ubah Ikon
zen-workspaces-panel-context-default-profile =
.label = Atur Profil
+zen-workspaces-panel-unload =
+ .label = Lepaskan Ruang
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 =
diff --git a/locales/is/browser/browser/preferences/zen-preferences.ftl b/locales/is/browser/browser/preferences/zen-preferences.ftl
index 5874e3d6c..8a6c65792 100644
--- a/locales/is/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/is/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Click
zen-glance-trigger-meta-click =
.label = Meta (Command) + Click
-zen-glance-trigger-mantain-click =
- .label = Mantain Click
zen-look-and-feel-compact-view-header = Sýna í þéttri sýn
zen-look-and-feel-compact-view-description = Only show the toolbars you use!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Hide the default container indicator in the tab bar
zen-key-unsaved = Unsaved shortcut! Please save it by clicking the "Escape" key after retyping it.
-zen-key-conflict = Conflict with another shortcut
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = Theme Settings
zen-vertical-tabs-title = Sidebar and tabs layout
zen-vertical-tabs-header = Vertical Tabs
diff --git a/locales/is/browser/browser/zen-general.ftl b/locales/is/browser/browser/zen-general.ftl
index 47623b075..af3320150 100644
--- a/locales/is/browser/browser/zen-general.ftl
+++ b/locales/is/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Endursetja Festan Flipa
.accesskey = R
tab-context-zen-add-essential =
- .label = Add to Essentials ({ $num } / 12 slots filled)
+ .label = Add to Essentials ({ $num } / { $max } slots filled)
.accesskey = E
tab-context-zen-remove-essential =
.label = Fjarlægja frá Höfuðatriði
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimize
zen-panel-ui-gradient-generator-custom-color = Sérsniðinn litur
zen-panel-ui-gradient-generator-saved-message = Vistað hallann!
-zen-copy-current-url-confirmation = Slóðin hefur verið afrituð á klippiborðið.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Cancel
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Spaces
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
# note: Do not translate the "
" tags in the following string
@@ -49,3 +52,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = Icons
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Settings
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+zen-site-data-manage-addons =
+ .label = Manage Extensions
+zen-site-data-get-addons =
+ .label = Add Extensions
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/is/browser/browser/zen-vertical-tabs.ftl b/locales/is/browser/browser/zen-vertical-tabs.ftl
index e59cd7a78..9c71802d2 100644
--- a/locales/is/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/is/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Compact mode
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Enable compact mode
.accesskey = D
diff --git a/locales/is/browser/browser/zen-welcome.ftl b/locales/is/browser/browser/zen-welcome.ftl
index 0767c9bb0..86d517ffd 100644
--- a/locales/is/browser/browser/zen-welcome.ftl
+++ b/locales/is/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Dive in!
zen-welcome-default-search-title = Your Default Search Engine
zen-welcome-default-search-description = Choose your default search engine. You can always change it later!
zen-welcome-skip-button = Skip
-zen-welcome-next-action = Next
zen-welcome-finished = Your Zen has been set up correctly!
diff --git a/locales/is/browser/browser/zen-workspaces.ftl b/locales/is/browser/browser/zen-workspaces.ftl
index 61bf79a12..452a5e9bc 100644
--- a/locales/is/browser/browser/zen-workspaces.ftl
+++ b/locales/is/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Change Icon
zen-workspaces-panel-context-default-profile =
.label = Set Profile
+zen-workspaces-panel-unload =
+ .label = Unload Space
zen-workspaces-how-to-reorder-title = How to reorder spaces
zen-workspaces-how-to-reorder-desc = Drag the space icons at the bottom of the sidebar to reorder them
zen-workspaces-change-theme =
diff --git a/locales/it/browser/browser/preferences/zen-preferences.ftl b/locales/it/browser/browser/preferences/zen-preferences.ftl
index 1bd514e52..22d8c54f5 100644
--- a/locales/it/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/it/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Maiusc + Click
zen-glance-trigger-meta-click =
.label = Meta (Command) + Click
-zen-glance-trigger-mantain-click =
- .label = Mantieni Clic (In Arrivo!)
zen-look-and-feel-compact-view-header = Mostra nella vista compatta
zen-look-and-feel-compact-view-description = Mostra solo le barre degli strumenti che utilizzi!
zen-look-and-feel-compact-view-enabled =
@@ -43,7 +41,7 @@ pane-settings-workspaces-title = Workspace
zen-tabs-unloader-enabled =
.label = Abilita Scaricamento Scheda
zen-look-and-feel-compact-toolbar-themed =
- .label = Use themed background for compact toolbar
+ .label = Utilizza lo sfondo a tema per la barra degli strumenti compatta
zen-workspace-continue-where-left-off =
.label = Continua da dove avevi interrotto
pane-zen-pinned-tab-manager-title = Schede Bloccate
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Nascondi l'indicatore predefinito del contenitore nella barra delle schede
zen-key-unsaved = Scorciatoia non salvata! Si prega di proteggerla facendo clic sul tasto "Escape" dopo averlo ripetuto.
-zen-key-conflict = Conflitto con un'altra scorciatoia
+zen-key-conflict = Conflitti con { $group } -> { $shortcut }
pane-zen-theme-title = Impostazioni tema
zen-vertical-tabs-title = Layout barra laterale e schede
zen-vertical-tabs-header = Schede verticali
@@ -255,7 +253,7 @@ zen-close-tab-shortcut = Chiudi scheda
zen-compact-mode-shortcut-show-sidebar = Attiva/Disattiva Barra Laterale Fluttuante
zen-compact-mode-shortcut-show-toolbar = Attiva/Disattiva Barra Fluttuante
zen-compact-mode-shortcut-toggle = Attiva/disattiva modalità compatta
-zen-glance-expand = Expand Glance
+zen-glance-expand = Espandi Sguardo
zen-workspace-shortcut-switch-1 = Passa allo spazio di lavoro 1
zen-workspace-shortcut-switch-2 = Passa allo spazio di lavoro 2
zen-workspace-shortcut-switch-3 = Passa allo spazio di lavoro 3
@@ -274,7 +272,7 @@ zen-split-view-shortcut-grid = Attiva/Disattiva Griglia Visualizzazione Dividi
zen-split-view-shortcut-vertical = Attiva/Disattiva Dividi Vista Verticale
zen-split-view-shortcut-horizontal = Attiva/Disattiva Dividi Vista Orizzontale
zen-split-view-shortcut-unsplit = Chiudi vista divisa
-zen-new-empty-split-view-shortcut = New Empty Split View
+zen-new-empty-split-view-shortcut = Nuova vista divisa vuota
zen-key-select-tab-1 = Seleziona Scheda #1
zen-key-select-tab-2 = Seleziona Scheda #2
zen-key-select-tab-3 = Seleziona Scheda #3
diff --git a/locales/it/browser/browser/zen-folders.ftl b/locales/it/browser/browser/zen-folders.ftl
index 722934b28..fa5a5b795 100644
--- a/locales/it/browser/browser/zen-folders.ftl
+++ b/locales/it/browser/browser/zen-folders.ftl
@@ -1,21 +1,21 @@
zen-folders-search-placeholder =
.placeholder = Cerca { $folder-name }...
zen-folders-panel-rename-folder =
- .label = Rinomina Cartella
+ .label = Rinomina cartella
zen-folders-panel-unpack-folder =
- .label = Scompatta Cartella
+ .label = Scompatta cartella
zen-folders-new-subfolder =
- .label = Nuova Sottocartella
+ .label = Nuova sottocartella
zen-folders-panel-delete-folder =
- .label = Cancella Cartella
+ .label = Cancella cartella
zen-folders-panel-convert-folder-to-space =
.label = Converti la cartella in Spazio
zen-folders-panel-change-folder-space =
.label = Cambia Spazio...
zen-folders-panel-change-icon-folder =
- .label = Cambia Icona
+ .label = Cambia icona
zen-folders-unload-all-tooltip =
- .tooltiptext = Unload active in this folder
+ .tooltiptext = Scarica tutte le schede attive in questa cartella
zen-folders-unload-folder =
- .label = Scarica tutte le Schede
+ .label = Scarica tutte le schede
zen-folders-search-no-results = Nessuna scheda corrispondente alla ricerca 🤔
diff --git a/locales/it/browser/browser/zen-general.ftl b/locales/it/browser/browser/zen-general.ftl
index 888c7622d..5b9a31dc6 100644
--- a/locales/it/browser/browser/zen-general.ftl
+++ b/locales/it/browser/browser/zen-general.ftl
@@ -1,10 +1,10 @@
zen-panel-ui-current-profile-text = profilo in uso
unified-extensions-description = Le estensioni sono usate per portare più funzionalità in { -brand-short-name }.
tab-context-zen-reset-pinned-tab =
- .label = Reimposta Scheda Bloccata
+ .label = Reimposta scheda fissata
.accesskey = R
tab-context-zen-add-essential =
- .label = Aggiungi a Essentials ({ $num } / 12 slot riempiti)
+ .label = Aggiungi a Essenziali ({ $num } / { $max } slot riempiti)
.accesskey = E
tab-context-zen-remove-essential =
.label = Rimuovi dagli Essenziali
@@ -20,9 +20,9 @@ zen-disable = Disabilita
pictureinpicture-minimize-btn =
.aria-label = Minimizza
.tooltip = Minimizza
-zen-panel-ui-gradient-generator-custom-color = Colore Personalizzato
+zen-panel-ui-gradient-generator-custom-color = Colore personalizzato
zen-panel-ui-gradient-generator-saved-message = Gradiente salvato con successo!
-zen-copy-current-url-confirmation = L'URL è stato copiato negli appunti.
+zen-copy-current-url-confirmation = L'URL corrente è stato copiato!
zen-general-cancel-label =
.label = Annulla
zen-general-confirm =
@@ -35,6 +35,9 @@ zen-library-sidebar-workspaces =
.label = Spazi
zen-library-sidebar-mods =
.label = Mod
+zen-toggle-compact-mode-button =
+ .label = Modalità compatta
+ .tooltiptext = Attiva/disattiva Modalità compatta
# note: Do not translate the "
" tags in the following string
@@ -46,4 +49,34 @@ zen-icons-picker-emoji =
.label = Emoji
zen-icons-picker-svg =
.label = Icone
-urlbar-search-mode-zen_actions = Actions
+urlbar-search-mode-zen_actions = Azioni
+zen-site-data-settings = Impostazioni
+zen-generic-manage = Gestisci
+zen-generic-more = Altro
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Consentito
+zen-site-data-setting-block = Bloccato
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Estensione
+zen-site-data-security-info-secure =
+ .label = Sicuro
+zen-site-data-security-info-not-secure =
+ .label = Non sicuro
+zen-site-data-manage-addons =
+ .label = Gestisci estensioni
+zen-site-data-get-addons =
+ .label = Aggiungi estensioni
+zen-site-data-site-settings =
+ .label = Tutte le impostazioni del sito
+zen-site-data-share =
+ .label = Condividi questa pagina
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copia URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = Una nuova casa per componenti aggiuntivi, permessi, e altro ancora
+zen-site-data-panel-feature-callout-subtitle = Clicca l'icona per gestire le impostazioni del sito, visualizzare informazioni di sicurezza, accedere alle estensioni, ed eseguire azioni comuni.
diff --git a/locales/it/browser/browser/zen-vertical-tabs.ftl b/locales/it/browser/browser/zen-vertical-tabs.ftl
index d7f3259a3..db92bb5f0 100644
--- a/locales/it/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/it/browser/browser/zen-vertical-tabs.ftl
@@ -3,19 +3,18 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Modalità compatta
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Abilita modalità compatta
.accesskey = D
zen-toolbar-context-compact-mode-just-tabs =
.label = Nascondi barra laterale
zen-toolbar-context-compact-mode-just-toolbar =
- .label = Nascondi barra strumenti
+ .label = Nascondi barra degli strumenti
zen-toolbar-context-compact-mode-hide-both =
.label = Nascondi entrambi
.accesskey = H
zen-toolbar-context-new-folder =
- .label = New Folder
+ .label = Nuova cartella
.accesskey = N
sidebar-zen-expand =
.label = Espandi barra laterale
diff --git a/locales/it/browser/browser/zen-welcome.ftl b/locales/it/browser/browser/zen-welcome.ftl
index 0e4f1dda8..986abd1e7 100644
--- a/locales/it/browser/browser/zen-welcome.ftl
+++ b/locales/it/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Andiamo!
zen-welcome-default-search-title = Il tuo Motore di Ricerca Predefinito
zen-welcome-default-search-description = Scegli il tuo motore di ricerca predefinito. Puoi sempre cambiarlo più tardi!
zen-welcome-skip-button = Salta
-zen-welcome-next-action = Prossimo
zen-welcome-finished = Il tuo Zen è stato configurato correttamente!
diff --git a/locales/it/browser/browser/zen-workspaces.ftl b/locales/it/browser/browser/zen-workspaces.ftl
index 37478dae5..aaacebfa4 100644
--- a/locales/it/browser/browser/zen-workspaces.ftl
+++ b/locales/it/browser/browser/zen-workspaces.ftl
@@ -1,4 +1,4 @@
-zen-panel-ui-workspaces-text = Workspace
+zen-panel-ui-workspaces-text = Spazi
zen-panel-ui-workspaces-create =
.label = Crea Spazio
zen-panel-ui-folder-create =
@@ -6,7 +6,7 @@ zen-panel-ui-folder-create =
zen-panel-ui-new-empty-split =
.label = New Split
zen-workspaces-panel-context-delete =
- .label = Elimina lo spazio di lavoro
+ .label = Elimina lo Spazio
.accesskey = D
zen-workspaces-panel-change-name =
.label = Cambia Nome
@@ -14,21 +14,23 @@ zen-workspaces-panel-change-icon =
.label = Cambia Icona
zen-workspaces-panel-context-default-profile =
.label = Imposta Profilo
+zen-workspaces-panel-unload =
+ .label = Scarica Spazio
zen-workspaces-how-to-reorder-title = Come riordinare gli spazi
zen-workspaces-how-to-reorder-desc = Trascina le icone degli spazi in fondo alla barra laterale per riordinarle
zen-workspaces-change-theme =
.label = Modifica Tema
zen-workspaces-panel-context-open =
- .label = Apri Workspace
+ .label = Apri Spazio
.accesskey = O
zen-workspaces-panel-context-edit =
- .label = Modifica Workspace
+ .label = Modifica Spazio
.accesskey = E
context-zen-change-workspace-tab =
.label = Metti scheda/e su uno spazio di lavoro
.accesskey = C
zen-bookmark-edit-panel-workspace-selector =
- .value = Spazi di lavoro
+ .value = Spazi
.accesskey = W
zen-panel-ui-gradient-generator-algo-complementary =
.label = Complementare
@@ -49,5 +51,5 @@ zen-workspace-creation-profile = Profilo
.tooltiptext = I profili vengono usati per separare i cookie e i dati dei siti tra gli spazi.
zen-workspace-creation-header = Crea uno Spazio
zen-workspace-creation-label = Gli Spazi sono usati per organizzare le tue schede e sessioni.
-zen-workspaces-delete-workspace-title = Delete Workspace?
+zen-workspaces-delete-workspace-title = Eliminare Spazio?
zen-workspaces-delete-workspace-body = Sei sicuro di voler cancellare { $name }? Questa azione non può essere annullata.
diff --git a/locales/ja/browser/browser/preferences/zen-preferences.ftl b/locales/ja/browser/browser/preferences/zen-preferences.ftl
index 2c723bae5..078ac2f41 100644
--- a/locales/ja/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ja/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + クリック
zen-glance-trigger-meta-click =
.label = Meta (Command) + クリック
-zen-glance-trigger-mantain-click =
- .label = クリックを長押し(近日公開予定)
zen-look-and-feel-compact-view-header = コンパクトビューで表示
zen-look-and-feel-compact-view-description = 使用しているツールバーのみを表示します!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = タブバー内のデフォルトのコンテナインジケーターを非表示にする
zen-key-unsaved = 未保存のショートカットです!再入力後、「エスケープ」キーをクリックして安全にしてください。
-zen-key-conflict = 他のショートカットと競合します
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = テーマ設定
zen-vertical-tabs-title = サイドバーとタブのレイアウト
zen-vertical-tabs-header = 垂直タブ
diff --git a/locales/ja/browser/browser/zen-general.ftl b/locales/ja/browser/browser/zen-general.ftl
index 59134277a..f35f070c2 100644
--- a/locales/ja/browser/browser/zen-general.ftl
+++ b/locales/ja/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = ピン留めされたタブをリセット
.accesskey = R
tab-context-zen-add-essential =
- .label = Add to Essentials ({ $num } / 12 slots filled)
+ .label = Add to Essentials ({ $num } / { $max } slots filled)
.accesskey = E
tab-context-zen-remove-essential =
.label = Essentialsから削除
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimize
zen-panel-ui-gradient-generator-custom-color = カスタムカラー
zen-panel-ui-gradient-generator-saved-message = グラデーションを正常に保存しました!
-zen-copy-current-url-confirmation = URLをクリップボードにコピーしました
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Cancel
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Spaces
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
# note: Do not translate the "
" tags in the following string
@@ -49,3 +52,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = Icons
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Settings
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+zen-site-data-manage-addons =
+ .label = Manage Extensions
+zen-site-data-get-addons =
+ .label = Add Extensions
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/ja/browser/browser/zen-vertical-tabs.ftl b/locales/ja/browser/browser/zen-vertical-tabs.ftl
index 846657126..278ea1494 100644
--- a/locales/ja/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/ja/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = コンパクトモード
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = コンパクトモードを有効にする
.accesskey = D
diff --git a/locales/ja/browser/browser/zen-welcome.ftl b/locales/ja/browser/browser/zen-welcome.ftl
index 4aa447a5d..c3141d9ae 100644
--- a/locales/ja/browser/browser/zen-welcome.ftl
+++ b/locales/ja/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Dive in!
zen-welcome-default-search-title = Your Default Search Engine
zen-welcome-default-search-description = Choose your default search engine. You can always change it later!
zen-welcome-skip-button = スキップ
-zen-welcome-next-action = 次へ
zen-welcome-finished = Zen の設定が完了しました!
diff --git a/locales/ja/browser/browser/zen-workspaces.ftl b/locales/ja/browser/browser/zen-workspaces.ftl
index 6328c3143..28c02917b 100644
--- a/locales/ja/browser/browser/zen-workspaces.ftl
+++ b/locales/ja/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Change Icon
zen-workspaces-panel-context-default-profile =
.label = Set Profile
+zen-workspaces-panel-unload =
+ .label = Unload Space
zen-workspaces-how-to-reorder-title = How to reorder spaces
zen-workspaces-how-to-reorder-desc = Drag the space icons at the bottom of the sidebar to reorder them
zen-workspaces-change-theme =
diff --git a/locales/ko/browser/browser/preferences/zen-preferences.ftl b/locales/ko/browser/browser/preferences/zen-preferences.ftl
index 616808c45..a08b26c11 100644
--- a/locales/ko/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ko/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + 클릭
zen-glance-trigger-meta-click =
.label = Meta (Command) + 클릭
-zen-glance-trigger-mantain-click =
- .label = 길게 클릭 (Coming Soon!)
zen-look-and-feel-compact-view-header = 사이드바 축소 모드로 보기
zen-look-and-feel-compact-view-description = 사용하는 툴바만 보세요!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = 탭에서 기본 컨테이너 표시 숨기기
zen-key-unsaved = 단축키가 저장되지 않았습니다! 다시 입력한 후 "Escape" 키를 눌러 저장하세요.
-zen-key-conflict = 다른 단축키와 겹침
+zen-key-conflict = { $group } -> { $shortcut }과 충돌함
pane-zen-theme-title = 테마 설정
zen-vertical-tabs-title = 사이드바 및 탭 레이아웃
zen-vertical-tabs-header = 수직 탭
diff --git a/locales/ko/browser/browser/zen-general.ftl b/locales/ko/browser/browser/zen-general.ftl
index ed8d73e31..2d98c1b11 100644
--- a/locales/ko/browser/browser/zen-general.ftl
+++ b/locales/ko/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = 고정된 탭 초기화
.accesskey = R
tab-context-zen-add-essential =
- .label = 에센셜에 추가 ({ $num } / 12 개 추가됨)
+ .label = 에센셜에 추가 ({ $num } / { $max } 개 추가됨)
.accesskey = E
tab-context-zen-remove-essential =
.label = 에센셜에서 제거하기
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = 최소화
zen-panel-ui-gradient-generator-custom-color = 커스텀 색상
zen-panel-ui-gradient-generator-saved-message = 성공적으로 그라데이션을 저장했습니다!
-zen-copy-current-url-confirmation = URL이 복사되었습니다.
+zen-copy-current-url-confirmation = 현재 URL을 복사했습니다!
zen-general-cancel-label =
.label = 취소
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = 스페이스
zen-library-sidebar-mods =
.label = 모드
+zen-toggle-compact-mode-button =
+ .label = 사이드바 축소 모드
+ .tooltiptext = 사이드바 축소 토글
# note: Do not translate the "
" tags in the following string
@@ -48,4 +51,34 @@ zen-icons-picker-emoji =
.label = 이모티콘
zen-icons-picker-svg =
.label = 아이콘
-urlbar-search-mode-zen_actions = Actions
+urlbar-search-mode-zen_actions = 액션
+zen-site-data-settings = 설정
+zen-generic-manage = 관리
+zen-generic-more = 더 보기
+zen-generic-next = 다음
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = 허용됨
+zen-site-data-setting-block = 금지됨
+zen-site-data-setting-cross-site = 사이트 간 공유 쿠키
+zen-site-data-security-info-extension =
+ .label = 확장
+zen-site-data-security-info-secure =
+ .label = 안전함
+zen-site-data-security-info-not-secure =
+ .label = 안전하지 않음
+zen-site-data-manage-addons =
+ .label = 확장 프로그램 관리
+zen-site-data-get-addons =
+ .label = 확장 프로그램 추가
+zen-site-data-site-settings =
+ .label = 모든 사이트 설정
+zen-site-data-share =
+ .label = 이 페이지 공유
+zen-urlbar-copy-url-button =
+ .tooltiptext = URL 복사
+zen-site-data-setting-site-protection = 추적 보호
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = 애드온, 권한, 그리고 더 많은 것을 위한 새로운 곳
+zen-site-data-panel-feature-callout-subtitle = 아이콘을 클릭해 사이트 설정, 보안 정보 조회, 확장 프로그램 접근, 기타 행동을 수행할 수 있습니다.
diff --git a/locales/ko/browser/browser/zen-vertical-tabs.ftl b/locales/ko/browser/browser/zen-vertical-tabs.ftl
index 846b79e92..c25da40d4 100644
--- a/locales/ko/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/ko/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = 사이드바 축소 모드
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = 사이드바 축소 모드 활성화
.accesskey = D
diff --git a/locales/ko/browser/browser/zen-welcome.ftl b/locales/ko/browser/browser/zen-welcome.ftl
index b166a2b4e..8c308c07a 100644
--- a/locales/ko/browser/browser/zen-welcome.ftl
+++ b/locales/ko/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = 시작하기!
zen-welcome-default-search-title = 기본 검색 엔진
zen-welcome-default-search-description = 기본 검색 엔진을 선택하세요. 나중에 언제든지 바꿀 수 있습니다!
zen-welcome-skip-button = 건너뛰기
-zen-welcome-next-action = 다음
zen-welcome-finished = Zen이 정상적으로 설정되었습니다!
diff --git a/locales/ko/browser/browser/zen-workspaces.ftl b/locales/ko/browser/browser/zen-workspaces.ftl
index 71c70f749..6e300360d 100644
--- a/locales/ko/browser/browser/zen-workspaces.ftl
+++ b/locales/ko/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = 아이콘 변경
zen-workspaces-panel-context-default-profile =
.label = 프로필 설정
+zen-workspaces-panel-unload =
+ .label = 스페이스 로드 해제
zen-workspaces-how-to-reorder-title = 스페이스를 재정렬하는 법
zen-workspaces-how-to-reorder-desc = 사이드바 하단의 스페이스 아이콘을 드래그해 재정렬할 수 있습니다
zen-workspaces-change-theme =
diff --git a/locales/lt/browser/browser/preferences/zen-preferences.ftl b/locales/lt/browser/browser/preferences/zen-preferences.ftl
index b6a8bb193..bd5c567ae 100644
--- a/locales/lt/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/lt/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Lyg2 + spausti
zen-glance-trigger-meta-click =
.label = Meta (Komanda) + spausti
-zen-glance-trigger-mantain-click =
- .label = Laikyti spustelėjus (netrukus pasirodys!)
zen-look-and-feel-compact-view-header = Rodyti kompaktiniame rodinyje
zen-look-and-feel-compact-view-description = Rodyti tik tas įrankių juostas, kurias naudojate!
zen-look-and-feel-compact-view-enabled =
@@ -43,7 +41,7 @@ pane-settings-workspaces-title = Darbo sritys
zen-tabs-unloader-enabled =
.label = Įjungti kortelių iškėlyklę
zen-look-and-feel-compact-toolbar-themed =
- .label = Use themed background for compact toolbar
+ .label = Naudoti teminį foną kompaktinei įrankių juostai
zen-workspace-continue-where-left-off =
.label = Tęskite, kur baigėte
pane-zen-pinned-tab-manager-title = Prisegtos kortelės
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Slėpti numatytojo konteinerio indikatorių kortelių juostoje
zen-key-unsaved = Neįrašytas spartusis klavišas! Iš naujo jį įvedę, paspauskite grįžimo klavišą.
-zen-key-conflict = Konfliktas su kitu sparčiuoju klavišu
+zen-key-conflict = Konfliktuoja su „{ $group }“ -> „{ $shortcut }“
pane-zen-theme-title = Temų nustatymai
zen-vertical-tabs-title = Šoninė juosta ir kortelių išdėstymas
zen-vertical-tabs-header = Vertikalios kortelės
@@ -221,7 +219,7 @@ zen-key-exit-full-screen = Išeiti iš viso ekrano
zen-ai-chatbot-sidebar-shortcut = Perjungti DI pokalbių roboto šoninę juostą
zen-key-inspector-mac = Perjungti inspektoryklę („Mac“)
zen-toggle-sidebar-shortcut = Perjungti „Firefox“ šoninę juostą
-zen-toggle-pin-tab-shortcut = Toggle Pin Tab
+zen-toggle-pin-tab-shortcut = Perjungti prisegtą kortelę
zen-reader-mode-toggle-shortcut-other = Perjungti skaitymo režimą
zen-picture-in-picture-toggle-shortcut = Perjungti vaizdą vaizde
zen-nav-reload-shortcut-2 = Įkelti iš naujo puslapį
@@ -255,7 +253,7 @@ zen-close-tab-shortcut = Užverti kortelę
zen-compact-mode-shortcut-show-sidebar = Perjungti slankančią šoninę juostą
zen-compact-mode-shortcut-show-toolbar = Perjungti slankančią įrankių juostą
zen-compact-mode-shortcut-toggle = Perjungti kompaktinį režimą
-zen-glance-expand = Expand Glance
+zen-glance-expand = Išskleisti greitą pažiūrėjimą
zen-workspace-shortcut-switch-1 = Perjungti į 1 darbo sritį
zen-workspace-shortcut-switch-2 = Perjungti į 2 darbo sritį
zen-workspace-shortcut-switch-3 = Perjungti į 3 darbo sritį
@@ -274,7 +272,7 @@ zen-split-view-shortcut-grid = Perjungti skaidymo rodinį tinkleliu
zen-split-view-shortcut-vertical = Perjungti skaidymo rodinį vertikaliai
zen-split-view-shortcut-horizontal = Perjungti skaidymo rodinį horizontaliai
zen-split-view-shortcut-unsplit = Užverti skaidymo rodinį
-zen-new-empty-split-view-shortcut = New Empty Split View
+zen-new-empty-split-view-shortcut = Naujas tuščias skaidymo rodinys
zen-key-select-tab-1 = Pasirinkti #1 kortelę
zen-key-select-tab-2 = Pasirinkti #2 kortelę
zen-key-select-tab-3 = Pasirinkti #3 kortelę
diff --git a/locales/lt/browser/browser/zen-folders.ftl b/locales/lt/browser/browser/zen-folders.ftl
index 84556ec44..2deb44013 100644
--- a/locales/lt/browser/browser/zen-folders.ftl
+++ b/locales/lt/browser/browser/zen-folders.ftl
@@ -15,7 +15,7 @@ zen-folders-panel-change-folder-space =
zen-folders-panel-change-icon-folder =
.label = Keisti piktogramą
zen-folders-unload-all-tooltip =
- .tooltiptext = Unload active in this folder
+ .tooltiptext = Iškelti aktyvias šiame aplanke
zen-folders-unload-folder =
.label = Iškelti visas korteles
zen-folders-search-no-results = Nėra kortelių, atitinkančių šią paiešką. 🤔
diff --git a/locales/lt/browser/browser/zen-general.ftl b/locales/lt/browser/browser/zen-general.ftl
index 42606787f..03afe42a7 100644
--- a/locales/lt/browser/browser/zen-general.ftl
+++ b/locales/lt/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Atkurti prisegtą kortelę
.accesskey = R
tab-context-zen-add-essential =
- .label = Įtraukti į būtiniausius ({ $num } / 12 užpildytų vietų)
+ .label = Įtraukti į būtiniausius ({ $num } / { $max } užpildytų vietų)
.accesskey = E
tab-context-zen-remove-essential =
.label = Šalinti iš būtiniausių
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Sumažinti
zen-panel-ui-gradient-generator-custom-color = Pasirinktinė spalva
zen-panel-ui-gradient-generator-saved-message = Gradientas sėkmingai įrašytas.
-zen-copy-current-url-confirmation = URL buvo nukopijuotas į iškarpinę.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Atšaukti
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Erdvės
zen-library-sidebar-mods =
.label = Modifikacijos
+zen-toggle-compact-mode-button =
+ .label = Kompaktinis režimas
+ .tooltiptext = Perjungti kompaktinį režimą
# note: Do not translate the "
" tags in the following string
@@ -48,4 +51,34 @@ zen-icons-picker-emoji =
.label = Jaustukai
zen-icons-picker-svg =
.label = Piktogramos
-urlbar-search-mode-zen_actions = Actions
+urlbar-search-mode-zen_actions = Veiksmai
+zen-site-data-settings = Nustatymai
+zen-generic-manage = Tvarkyti
+zen-generic-more = Daugiau
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Leidžiama
+zen-site-data-setting-block = Užblokuota
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Plėtinys
+zen-site-data-security-info-secure =
+ .label = Saugi
+zen-site-data-security-info-not-secure =
+ .label = Nesaugi
+zen-site-data-manage-addons =
+ .label = Tvarkyti plėtinius
+zen-site-data-get-addons =
+ .label = Įtraukti plėtinius
+zen-site-data-site-settings =
+ .label = Visi svetainės nustatymai
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = Nauji namai priedams, leidimams ir daugiau
+zen-site-data-panel-feature-callout-subtitle = Spustelėkite piktogramą, kad tvarkytumėte svetainės nustatymus, peržiūrėtumėte saugumo informaciją, pasiektumėte plėtinius ir atliktumėte įprastus veiksmus.
diff --git a/locales/lt/browser/browser/zen-vertical-tabs.ftl b/locales/lt/browser/browser/zen-vertical-tabs.ftl
index 9276eea15..5b6b37e53 100644
--- a/locales/lt/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/lt/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Kompaktinis režimas
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Įjungti kompaktinį režimą
.accesskey = D
diff --git a/locales/lt/browser/browser/zen-welcome.ftl b/locales/lt/browser/browser/zen-welcome.ftl
index 90eac7629..03ceb5b64 100644
--- a/locales/lt/browser/browser/zen-welcome.ftl
+++ b/locales/lt/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Pirmyn!
zen-welcome-default-search-title = Jūsų numatytasis paieškos variklis
zen-welcome-default-search-description = Pasirinkite numatytąjį paieškos variklį. Vėliau visada galite ją pakeisti!
zen-welcome-skip-button = Praleisti
-zen-welcome-next-action = Toliau
zen-welcome-finished = Jūsų „Zen“ nustatytas teisingai!
diff --git a/locales/lt/browser/browser/zen-workspaces.ftl b/locales/lt/browser/browser/zen-workspaces.ftl
index 018c8120d..27ec93263 100644
--- a/locales/lt/browser/browser/zen-workspaces.ftl
+++ b/locales/lt/browser/browser/zen-workspaces.ftl
@@ -1,12 +1,12 @@
-zen-panel-ui-workspaces-text = Darbo sritys
+zen-panel-ui-workspaces-text = Erdvės
zen-panel-ui-workspaces-create =
.label = Kurti erdvę
zen-panel-ui-folder-create =
.label = Kurti aplanką
zen-panel-ui-new-empty-split =
- .label = New Split
+ .label = Naujas skaidymas
zen-workspaces-panel-context-delete =
- .label = Ištrinti darbo sritį
+ .label = Ištrinti erdvę
.accesskey = D
zen-workspaces-panel-change-name =
.label = Keisti pavadinimą
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Keisti piktogramą
zen-workspaces-panel-context-default-profile =
.label = Nustatyti profilį
+zen-workspaces-panel-unload =
+ .label = Iškelti erdvę
zen-workspaces-how-to-reorder-title = Kaip pertvarkyti erdves
zen-workspaces-how-to-reorder-desc = Nutempkite erdvės piktogramas šoninės juostos apačioje, kad pertvarkytumėte jas.
zen-workspaces-change-theme =
@@ -49,5 +51,5 @@ zen-workspace-creation-profile = Profilis
.tooltiptext = Profiliai naudojami atskirti slapukus ir svetainės duomenis tarp erdvių.
zen-workspace-creation-header = Kurti erdvę
zen-workspace-creation-label = Erdvės naudojamos tvarkyti jūsų korteles ir seansus.
-zen-workspaces-delete-workspace-title = Delete Workspace?
+zen-workspaces-delete-workspace-title = Ištrinti erdvę?
zen-workspaces-delete-workspace-body = Ar tikrai norite ištrinti „{ $name }“? Šio veiksmo anuliuoti negalima.
diff --git a/locales/nl/browser/browser/preferences/zen-preferences.ftl b/locales/nl/browser/browser/preferences/zen-preferences.ftl
index 65451d9cf..c0106766b 100644
--- a/locales/nl/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/nl/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + klik
zen-glance-trigger-meta-click =
.label = Windows (Command) + klik
-zen-glance-trigger-mantain-click =
- .label = Klikken ingedrukt houden (komt binnenkort!)
zen-look-and-feel-compact-view-header = Toon in compacte weergave
zen-look-and-feel-compact-view-description = Toon alleen de werkbalken die je gebruikt!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Verberg de standaard container indicator in de tabbladbalk
zen-key-unsaved = Snelkoppeling is niet opgeslagen! Bewaar deze door op de "Escape" knop te drukken na het opnieuw typen.
-zen-key-conflict = Conflict met een andere snelkoppeling
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = Thema instellingen
zen-vertical-tabs-title = Zijbalk en tabbladen lay-out
zen-vertical-tabs-header = Verticale tabbladen
diff --git a/locales/nl/browser/browser/zen-general.ftl b/locales/nl/browser/browser/zen-general.ftl
index eb4d83cc8..10bee75cd 100644
--- a/locales/nl/browser/browser/zen-general.ftl
+++ b/locales/nl/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Vastgezette tabblad resetten
.accesskey = R
tab-context-zen-add-essential =
- .label = Toevoegen aan Essentials ({ $num } / 12 plekken gevuld)
+ .label = Toevoegen aan Essentials ({ $num } / { $max } plekken gevuld)
.accesskey = E
tab-context-zen-remove-essential =
.label = Verwijderen uit Essentials
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimaliseren
zen-panel-ui-gradient-generator-custom-color = Aangepaste kleur
zen-panel-ui-gradient-generator-saved-message = Verloop is succesvol opgeslagen!
-zen-copy-current-url-confirmation = De URL is gekopieerd naar het klembord.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Annuleren
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Ruimtes
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
# note: Do not translate the "
" tags in the following string
@@ -49,3 +52,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = Icons
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Settings
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+zen-site-data-manage-addons =
+ .label = Manage Extensions
+zen-site-data-get-addons =
+ .label = Add Extensions
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/nl/browser/browser/zen-vertical-tabs.ftl b/locales/nl/browser/browser/zen-vertical-tabs.ftl
index 22b2e4513..c1e21a740 100644
--- a/locales/nl/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/nl/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Compacte modus
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Compacte modus inschakelen
.accesskey = D
diff --git a/locales/nl/browser/browser/zen-welcome.ftl b/locales/nl/browser/browser/zen-welcome.ftl
index 7095987d8..b1a2c3270 100644
--- a/locales/nl/browser/browser/zen-welcome.ftl
+++ b/locales/nl/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Duik erin!
zen-welcome-default-search-title = Je standaard zoekmachine
zen-welcome-default-search-description = Kies je standaard zoekmachine. Je kunt het altijd later wijzigen!
zen-welcome-skip-button = Overslaan
-zen-welcome-next-action = Volgende
zen-welcome-finished = Je Zen is correct ingesteld!
diff --git a/locales/nl/browser/browser/zen-workspaces.ftl b/locales/nl/browser/browser/zen-workspaces.ftl
index 92e0b8926..95d2e37e6 100644
--- a/locales/nl/browser/browser/zen-workspaces.ftl
+++ b/locales/nl/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Icon wijzigen
zen-workspaces-panel-context-default-profile =
.label = Profiel instellen
+zen-workspaces-panel-unload =
+ .label = Unload Space
zen-workspaces-how-to-reorder-title = Hoe ruimtes te herschikken
zen-workspaces-how-to-reorder-desc = Sleep het ruimte icoon onderaan de zijbalk om ze te herschikken
zen-workspaces-change-theme =
diff --git a/locales/nn-NO/browser/browser/preferences/zen-preferences.ftl b/locales/nn-NO/browser/browser/preferences/zen-preferences.ftl
index 84eccbcd3..85e53500d 100644
--- a/locales/nn-NO/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/nn-NO/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Click
zen-glance-trigger-meta-click =
.label = Meta (Command) + Click
-zen-glance-trigger-mantain-click =
- .label = Mantain Click
zen-look-and-feel-compact-view-header = Show in compact view
zen-look-and-feel-compact-view-description = Only show the toolbars you use!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Hide the default container indicator in the tab bar
zen-key-unsaved = Unsaved shortcut! Please save it by clicking the "Escape" key after retyping it.
-zen-key-conflict = Conflict with another shortcut
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = Theme Settings
zen-vertical-tabs-title = Sidebar and tabs layout
zen-vertical-tabs-header = Vertical Tabs
diff --git a/locales/nn-NO/browser/browser/zen-general.ftl b/locales/nn-NO/browser/browser/zen-general.ftl
index 5a5206e4f..b4ce133cf 100644
--- a/locales/nn-NO/browser/browser/zen-general.ftl
+++ b/locales/nn-NO/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Reset Pinned Tab
.accesskey = R
tab-context-zen-add-essential =
- .label = Add to Essentials ({ $num } / 12 slots filled)
+ .label = Add to Essentials ({ $num } / { $max } slots filled)
.accesskey = E
tab-context-zen-remove-essential =
.label = Remove from Essentials
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimize
zen-panel-ui-gradient-generator-custom-color = Custom Color
zen-panel-ui-gradient-generator-saved-message = Successfully saved the gradient!
-zen-copy-current-url-confirmation = The URL has been copied to the clipboard.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Cancel
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Spaces
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
# note: Do not translate the "
" tags in the following string
@@ -49,3 +52,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = Icons
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Settings
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+zen-site-data-manage-addons =
+ .label = Manage Extensions
+zen-site-data-get-addons =
+ .label = Add Extensions
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/nn-NO/browser/browser/zen-vertical-tabs.ftl b/locales/nn-NO/browser/browser/zen-vertical-tabs.ftl
index e59cd7a78..9c71802d2 100644
--- a/locales/nn-NO/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/nn-NO/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Compact mode
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Enable compact mode
.accesskey = D
diff --git a/locales/nn-NO/browser/browser/zen-welcome.ftl b/locales/nn-NO/browser/browser/zen-welcome.ftl
index 0767c9bb0..86d517ffd 100644
--- a/locales/nn-NO/browser/browser/zen-welcome.ftl
+++ b/locales/nn-NO/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Dive in!
zen-welcome-default-search-title = Your Default Search Engine
zen-welcome-default-search-description = Choose your default search engine. You can always change it later!
zen-welcome-skip-button = Skip
-zen-welcome-next-action = Next
zen-welcome-finished = Your Zen has been set up correctly!
diff --git a/locales/nn-NO/browser/browser/zen-workspaces.ftl b/locales/nn-NO/browser/browser/zen-workspaces.ftl
index e194ee7c4..ac5baadd4 100644
--- a/locales/nn-NO/browser/browser/zen-workspaces.ftl
+++ b/locales/nn-NO/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Change Icon
zen-workspaces-panel-context-default-profile =
.label = Set Profile
+zen-workspaces-panel-unload =
+ .label = Unload Space
zen-workspaces-how-to-reorder-title = How to reorder spaces
zen-workspaces-how-to-reorder-desc = Drag the space icons at the bottom of the sidebar to reorder them
zen-workspaces-change-theme =
diff --git a/locales/pl/browser/browser/preferences/zen-preferences.ftl b/locales/pl/browser/browser/preferences/zen-preferences.ftl
index c48814b1c..390737a02 100644
--- a/locales/pl/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/pl/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + kliknięcie
zen-glance-trigger-meta-click =
.label = Meta (Command) + kliknięcie
-zen-glance-trigger-mantain-click =
- .label = Przytrzymaj kliknięcie (wkrótce!)
zen-look-and-feel-compact-view-header = Pokaż w widoku kompaktowym
zen-look-and-feel-compact-view-description = Pokaż tylko paski narzędzi, których używasz!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Ukryj domyślny wskaźnik kontenera na pasku kart
zen-key-unsaved = Niezapisany skrót! Proszę zabezpieczyć go klikając przycisk "Escape" po ponownym wpisaniu.
-zen-key-conflict = Konflikt z innym skrótem
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = Ustawienia Motywu
zen-vertical-tabs-title = Pasek boczny i układ kart
zen-vertical-tabs-header = Pionowe karty
diff --git a/locales/pl/browser/browser/zen-general.ftl b/locales/pl/browser/browser/zen-general.ftl
index 2d71e23c4..9c8b82b2c 100644
--- a/locales/pl/browser/browser/zen-general.ftl
+++ b/locales/pl/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Resetuj przypiętą kartę
.accesskey = R
tab-context-zen-add-essential =
- .label = Dodaj do Niezbędnych ({ $num } / 12 miejsc wypełnione)
+ .label = Dodaj do Niezbędnych ({ $num } / { $max } miejsc wypełnione)
.accesskey = E
tab-context-zen-remove-essential =
.label = Usuń z Niezbędnych
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Zminimalizuj
zen-panel-ui-gradient-generator-custom-color = Niestandardowy kolor
zen-panel-ui-gradient-generator-saved-message = Pomyślnie zapisano gradient!
-zen-copy-current-url-confirmation = Adres URL został skopiowany do schowka.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Anuluj
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Przestrzenie
zen-library-sidebar-mods =
.label = Modyfikacje
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
# note: Do not translate the "
" tags in the following string
@@ -49,3 +52,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = Icons
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Settings
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+zen-site-data-manage-addons =
+ .label = Manage Extensions
+zen-site-data-get-addons =
+ .label = Add Extensions
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/pl/browser/browser/zen-vertical-tabs.ftl b/locales/pl/browser/browser/zen-vertical-tabs.ftl
index 05c52528c..b260030c3 100644
--- a/locales/pl/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/pl/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Tryb kompaktowy
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Włącz tryb kompaktowy
.accesskey = D
diff --git a/locales/pl/browser/browser/zen-welcome.ftl b/locales/pl/browser/browser/zen-welcome.ftl
index d001cd53d..72e1e36b3 100644
--- a/locales/pl/browser/browser/zen-welcome.ftl
+++ b/locales/pl/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Wskakuj!
zen-welcome-default-search-title = Twój domyślny silnik wyszukiwania
zen-welcome-default-search-description = Wybierz swój domyślny silnik wyszukiwania. Możesz to zmienić w przyszłości!
zen-welcome-skip-button = Pomiń
-zen-welcome-next-action = Dalej
zen-welcome-finished = Twoja przeglądarka Zen została prawidłowo przygotowana!
diff --git a/locales/pl/browser/browser/zen-workspaces.ftl b/locales/pl/browser/browser/zen-workspaces.ftl
index 84bbff143..48592dcda 100644
--- a/locales/pl/browser/browser/zen-workspaces.ftl
+++ b/locales/pl/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Zmień ikonę
zen-workspaces-panel-context-default-profile =
.label = Ustaw profil
+zen-workspaces-panel-unload =
+ .label = Unload Space
zen-workspaces-how-to-reorder-title = Jak przesuwać Przestrzenie
zen-workspaces-how-to-reorder-desc = Przesuwaj ikony Przestrzeni na dole paska, żeby je przeorganizować
zen-workspaces-change-theme =
diff --git a/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl b/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl
index 10fca566b..fe1197646 100644
--- a/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/pt-BR/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Clique
zen-glance-trigger-meta-click =
.label = Meta (Comando) + Clique
-zen-glance-trigger-mantain-click =
- .label = Segurar Clique (Em breve!)
zen-look-and-feel-compact-view-header = Exibir em modo compacto
zen-look-and-feel-compact-view-description = Apenas mostre as barras de ferramentas que você usa!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Ocultar o indicador padrão do contêiner na barra de guias
zen-key-unsaved = Atalho não salvo! Proteja-o clicando na tecla "Escape" após digitá-lo novamente.
-zen-key-conflict = Conflito com outro atalho
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = Opções de tema
zen-vertical-tabs-title = Layout de barra lateral e abas
zen-vertical-tabs-header = Abas verticais
diff --git a/locales/pt-BR/browser/browser/zen-general.ftl b/locales/pt-BR/browser/browser/zen-general.ftl
index 4b37157b3..9f48fcd14 100644
--- a/locales/pt-BR/browser/browser/zen-general.ftl
+++ b/locales/pt-BR/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Redefinir Guia Fixada
.accesskey = R
tab-context-zen-add-essential =
- .label = Adicionar aos Essenciais ({ $num } / 12 espaços preenchidos)
+ .label = Adicionar aos Essenciais ({ $num } / { $max } espaços preenchidos)
.accesskey = E
tab-context-zen-remove-essential =
.label = Remover dos Essenciais
@@ -22,7 +22,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimizar
zen-panel-ui-gradient-generator-custom-color = Cor Personalizada
zen-panel-ui-gradient-generator-saved-message = O gradiente foi salvo com sucesso!
-zen-copy-current-url-confirmation = A URL foi copiada para a área de transferência.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Cancelar
zen-general-confirm =
@@ -35,6 +35,9 @@ zen-library-sidebar-workspaces =
.label = Espaços
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Modo Compacto
+ .tooltiptext = Alternar Modo Compacto
# note: Do not translate the "
" tags in the following string
@@ -46,4 +49,34 @@ zen-icons-picker-emoji =
.label = Emojis
zen-icons-picker-svg =
.label = Ícones
-urlbar-search-mode-zen_actions = Actions
+urlbar-search-mode-zen_actions = Ações
+zen-site-data-settings = Configurações
+zen-generic-manage = Gerenciar
+zen-generic-more = Mais
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Permitido
+zen-site-data-setting-block = Bloqueado
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extensão
+zen-site-data-security-info-secure =
+ .label = Seguro
+zen-site-data-security-info-not-secure =
+ .label = Não seguro
+zen-site-data-manage-addons =
+ .label = Gerenciar Extensões
+zen-site-data-get-addons =
+ .label = Adicionar Extensões
+zen-site-data-site-settings =
+ .label = Todas as Configurações do Site
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/pt-BR/browser/browser/zen-vertical-tabs.ftl b/locales/pt-BR/browser/browser/zen-vertical-tabs.ftl
index bf9fda39a..5d3b30d0d 100644
--- a/locales/pt-BR/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/pt-BR/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Modo compacto
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Ativar modo compacto
.accesskey = D
diff --git a/locales/pt-BR/browser/browser/zen-welcome.ftl b/locales/pt-BR/browser/browser/zen-welcome.ftl
index da92f871c..e2ff11fb3 100644
--- a/locales/pt-BR/browser/browser/zen-welcome.ftl
+++ b/locales/pt-BR/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Mergulhe de cabeça!
zen-welcome-default-search-title = Seu Mecanismo de Busca Padrão
zen-welcome-default-search-description = Escolha seu mecanismo de busca padrão. Você sempre pode alterá-lo mais tarde!
zen-welcome-skip-button = Pular
-zen-welcome-next-action = Próximo
zen-welcome-finished = Seu Zen foi configurado corretamente!
diff --git a/locales/pt-BR/browser/browser/zen-workspaces.ftl b/locales/pt-BR/browser/browser/zen-workspaces.ftl
index 5a1c1ca2c..95d57fc06 100644
--- a/locales/pt-BR/browser/browser/zen-workspaces.ftl
+++ b/locales/pt-BR/browser/browser/zen-workspaces.ftl
@@ -2,7 +2,7 @@ zen-panel-ui-workspaces-text = Espaços
zen-panel-ui-workspaces-create =
.label = Criar Espaço
zen-panel-ui-folder-create =
- .label = Nova Pasta
+ .label = Criar Pasta
zen-panel-ui-new-empty-split =
.label = Nova Divisão
zen-workspaces-panel-context-delete =
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Alterar Ícone
zen-workspaces-panel-context-default-profile =
.label = Definir Perfil
+zen-workspaces-panel-unload =
+ .label = Descarregar Espaço
zen-workspaces-how-to-reorder-title = Como reordenar os espaços
zen-workspaces-how-to-reorder-desc = Arraste os ícones dos espaços na parte inferior da barra lateral para reordená-los
zen-workspaces-change-theme =
diff --git a/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl b/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl
index acc8637ea..9edb55b1e 100644
--- a/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/pt-PT/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Clique
zen-glance-trigger-meta-click =
.label = Meta (Command) + Clique
-zen-glance-trigger-mantain-click =
- .label = Manter Clique (Em Breve!)
zen-look-and-feel-compact-view-header = Mostrar na vista compacta
zen-look-and-feel-compact-view-description = Mostrar apenas as barras de ferramentas que usa!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Ocultar o indicador padrão do contentor na barra de separadores
zen-key-unsaved = Atalho não guardado! Por favor, proteja-o clicando na tecla "Escape" depois de o voltar a inserir.
-zen-key-conflict = Conflito com outro atalho
+zen-key-conflict = Conflitua com { $group } -> { $shortcut }
pane-zen-theme-title = Configurações do Tema
zen-vertical-tabs-title = Disposição da Barra Lateral e dos Separadores
zen-vertical-tabs-header = Separadores Verticais
diff --git a/locales/pt-PT/browser/browser/zen-general.ftl b/locales/pt-PT/browser/browser/zen-general.ftl
index 3416a8c96..8ae46244e 100644
--- a/locales/pt-PT/browser/browser/zen-general.ftl
+++ b/locales/pt-PT/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Repor o Separador Fixado
.accesskey = R
tab-context-zen-add-essential =
- .label = Adicionar aos Essenciais ({ $num }/12 espaços preenchidos)
+ .label = Adicionar aos Essenciais ({ $num } / { $max } espaços preenchidos)
.accesskey = E
tab-context-zen-remove-essential =
.label = Remover dos Essenciais
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimizar
zen-panel-ui-gradient-generator-custom-color = Cor personalizada
zen-panel-ui-gradient-generator-saved-message = Gradiente guardado com sucesso!
-zen-copy-current-url-confirmation = O URL foi copiado para a área de transferência.
+zen-copy-current-url-confirmation = URL atual copiado!
zen-general-cancel-label =
.label = Cancelar
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Espaços
zen-library-sidebar-mods =
.label = Modificações
+zen-toggle-compact-mode-button =
+ .label = Modo Compacto
+ .tooltiptext = Alternar Modo Compacto
# note: Do not translate the "
" tags in the following string
@@ -48,4 +51,34 @@ zen-icons-picker-emoji =
.label = Emojis
zen-icons-picker-svg =
.label = Ícones
-urlbar-search-mode-zen_actions = Actions
+urlbar-search-mode-zen_actions = Ações
+zen-site-data-settings = Definições
+zen-generic-manage = Gerir
+zen-generic-more = Mais
+zen-generic-next = Seguinte
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Permitido
+zen-site-data-setting-block = Bloqueado
+zen-site-data-setting-cross-site = Cookies entre sites
+zen-site-data-security-info-extension =
+ .label = Extensão
+zen-site-data-security-info-secure =
+ .label = Seguro
+zen-site-data-security-info-not-secure =
+ .label = Não Seguro
+zen-site-data-manage-addons =
+ .label = Gerir Extensões
+zen-site-data-get-addons =
+ .label = Adicionar Extensões
+zen-site-data-site-settings =
+ .label = Todas as Definições do Site
+zen-site-data-share =
+ .label = Partilhar Esta Página
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copiar URL
+zen-site-data-setting-site-protection = Proteção contra rastreio
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = Uma nova casa para extensões, permissões e mais
+zen-site-data-panel-feature-callout-subtitle = Clique no ícone para gerir definições do site, ver informações de segurança, extensões de acesso e executar ações comuns.
diff --git a/locales/pt-PT/browser/browser/zen-vertical-tabs.ftl b/locales/pt-PT/browser/browser/zen-vertical-tabs.ftl
index 3bf9a69e4..1fa65f89f 100644
--- a/locales/pt-PT/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/pt-PT/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Modo compacto
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Ativar modo compacto
.accesskey = D
diff --git a/locales/pt-PT/browser/browser/zen-welcome.ftl b/locales/pt-PT/browser/browser/zen-welcome.ftl
index c8de82e41..ae323133a 100644
--- a/locales/pt-PT/browser/browser/zen-welcome.ftl
+++ b/locales/pt-PT/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Mergulhar!
zen-welcome-default-search-title = O seu Motor de Busca Padrão
zen-welcome-default-search-description = Escolha o seu motor de busca padrão. Pode sempre alterá-lo mais tarde!
zen-welcome-skip-button = Ignorar
-zen-welcome-next-action = Seguinte
zen-welcome-finished = O seu Zen foi configurado corretamente!
diff --git a/locales/pt-PT/browser/browser/zen-workspaces.ftl b/locales/pt-PT/browser/browser/zen-workspaces.ftl
index e363e5668..9394615ed 100644
--- a/locales/pt-PT/browser/browser/zen-workspaces.ftl
+++ b/locales/pt-PT/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Alterar Ícone
zen-workspaces-panel-context-default-profile =
.label = Definir Perfil
+zen-workspaces-panel-unload =
+ .label = Descarregar Espaço
zen-workspaces-how-to-reorder-title = Como reordenar espaços
zen-workspaces-how-to-reorder-desc = Arraste os ícones de espaço na parte inferior da barra lateral para os reordenar
zen-workspaces-change-theme =
diff --git a/locales/ru/browser/browser/preferences/zen-preferences.ftl b/locales/ru/browser/browser/preferences/zen-preferences.ftl
index c32b2b44a..10787834d 100644
--- a/locales/ru/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/ru/browser/browser/preferences/zen-preferences.ftl
@@ -11,7 +11,7 @@ sync-currently-syncing-workspaces = Рабочие пространства
sync-engine-workspaces =
.label = Рабочие пространства
.tooltiptext = Синхронизируйте пространства между устройствами
- .accesskey = W
+ .accesskey = Ц
zen-glance-title = Предпросмотр
zen-glance-header = Общие настройки предпросмотра
zen-glance-description = Быстро просматривайте ссылки, не открывая их в отдельной вкладке
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + ЛКМ
zen-glance-trigger-meta-click =
.label = Meta (Command) + ЛКМ
-zen-glance-trigger-mantain-click =
- .label = Зажатие ЛКМ (скоро!)
zen-look-and-feel-compact-view-header = Компактный вид
zen-look-and-feel-compact-view-description = Включите только нужные панели инструментов!
zen-look-and-feel-compact-view-enabled =
@@ -43,7 +41,7 @@ pane-settings-workspaces-title = Рабочие пространства
zen-tabs-unloader-enabled =
.label = Включить выгрузку вкладок
zen-look-and-feel-compact-toolbar-themed =
- .label = Use themed background for compact toolbar
+ .label = Использовать цвета темы для фона компактной панели инструментов
zen-workspace-continue-where-left-off =
.label = Продолжить с того места, где вы остановились
pane-zen-pinned-tab-manager-title = Закреплённые вкладки
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Скрывать индикатор контейнера по умолчанию на панели вкладок
zen-key-unsaved = Вы не сохранили сочетание клавиш. Сохраните его, нажав Esc после ввода.
-zen-key-conflict = Конфликт с другим сочетанием клавиш
+zen-key-conflict = Конфликтует с { $group } -> { $shortcut }
pane-zen-theme-title = Настройки темы
zen-vertical-tabs-title = Боковая панель и раскладка вкладок
zen-vertical-tabs-header = Вертикальные вкладки
@@ -195,7 +193,7 @@ zen-picture-in-picture-toggle-shortcut-mac = Переключить изобра
zen-picture-in-picture-toggle-shortcut-mac-alt = Переключить изображение в картинке (Mac Alt)
zen-page-source-shortcut-safari = Просмотр исходного кода страницы (Safari)
zen-nav-stop-shortcut = Остановить загрузку
-zen-history-sidebar-shortcut = Show History Sidebar
+zen-history-sidebar-shortcut = Показать боковую панель истории
zen-window-minimize-shortcut = Свернуть окно
zen-help-shortcut = Открыть справку
zen-preferences-shortcut = Открыть настройки
@@ -221,7 +219,7 @@ zen-key-exit-full-screen = Выйти из полноэкранного режи
zen-ai-chatbot-sidebar-shortcut = Переключить боковую панель ИИ чат-бота
zen-key-inspector-mac = Переключить инспектор (Mac)
zen-toggle-sidebar-shortcut = Переключить боковую панель Firefox
-zen-toggle-pin-tab-shortcut = Toggle Pin Tab
+zen-toggle-pin-tab-shortcut = Переключить закрепление вкладки
zen-reader-mode-toggle-shortcut-other = Переключить режим чтения
zen-picture-in-picture-toggle-shortcut = Переключить изображение в картинке
zen-nav-reload-shortcut-2 = Обновить страницу
@@ -255,7 +253,7 @@ zen-close-tab-shortcut = Закрыть вкладку
zen-compact-mode-shortcut-show-sidebar = Включить/выключить плавающую боковую панель
zen-compact-mode-shortcut-show-toolbar = Инструменты плавающей панели
zen-compact-mode-shortcut-toggle = Компактный режим
-zen-glance-expand = Expand Glance
+zen-glance-expand = Раскрыть предпросмотр
zen-workspace-shortcut-switch-1 = Переключиться на пространство 1
zen-workspace-shortcut-switch-2 = Переключиться на пространство 2
zen-workspace-shortcut-switch-3 = Переключиться на пространство 3
@@ -274,7 +272,7 @@ zen-split-view-shortcut-grid = Переключить разделение се
zen-split-view-shortcut-vertical = Вертикальный режим разделения
zen-split-view-shortcut-horizontal = Горизонтальное разделение
zen-split-view-shortcut-unsplit = Закрыть раздельный вид
-zen-new-empty-split-view-shortcut = New Empty Split View
+zen-new-empty-split-view-shortcut = Новая разделённая вкладка
zen-key-select-tab-1 = Выбрать вкладку #1
zen-key-select-tab-2 = Выбрать вкладку #2
zen-key-select-tab-3 = Выбрать вкладку #3
diff --git a/locales/ru/browser/browser/zen-folders.ftl b/locales/ru/browser/browser/zen-folders.ftl
index e3976b196..c673b1acb 100644
--- a/locales/ru/browser/browser/zen-folders.ftl
+++ b/locales/ru/browser/browser/zen-folders.ftl
@@ -1,21 +1,21 @@
zen-folders-search-placeholder =
- .placeholder = Искать { $folder-name }…
+ .placeholder = Искать в { $folder-name }...
zen-folders-panel-rename-folder =
- .label = Rename Folder
+ .label = Переименовать папку
zen-folders-panel-unpack-folder =
- .label = Unpack Folder
+ .label = Распаковать папку
zen-folders-new-subfolder =
- .label = New Subfolder
+ .label = Новая подпапка
zen-folders-panel-delete-folder =
- .label = Delete Folder
+ .label = Удалить папку
zen-folders-panel-convert-folder-to-space =
- .label = Convert folder to Space
+ .label = Конвертировать папку в пространство
zen-folders-panel-change-folder-space =
- .label = Change Space...
+ .label = Переместить в пространство...
zen-folders-panel-change-icon-folder =
- .label = Change Icon
+ .label = Изменить значок
zen-folders-unload-all-tooltip =
- .tooltiptext = Unload active in this folder
+ .tooltiptext = Выгрузить все активные вкладки в этой папке
zen-folders-unload-folder =
- .label = Unload All Tabs
-zen-folders-search-no-results = No tabs matching that search 🤔
+ .label = Выгрузить все вкладки
+zen-folders-search-no-results = Ничего не найдено 🤔
diff --git a/locales/ru/browser/browser/zen-general.ftl b/locales/ru/browser/browser/zen-general.ftl
index b877ebc45..154f6c9d5 100644
--- a/locales/ru/browser/browser/zen-general.ftl
+++ b/locales/ru/browser/browser/zen-general.ftl
@@ -2,16 +2,16 @@ zen-panel-ui-current-profile-text = текущий профиль
unified-extensions-description = Расширения дополняют функционал { -brand-short-name }.
tab-context-zen-reset-pinned-tab =
.label = Сбросить закреплённую вкладку
- .accesskey = R
+ .accesskey = К
tab-context-zen-add-essential =
- .label = Добавить в важное ({ $num } из 12 слотов заполнено)
- .accesskey = E
+ .label = Добавить в важное ({ $num } из { $max } слотов занято)
+ .accesskey = У
tab-context-zen-remove-essential =
.label = Удалить из важного
- .accesskey = R
+ .accesskey = К
tab-context-zen-replace-pinned-url-with-current =
.label = Заменить закреплённый адрес на текущий
- .accesskey = C
+ .accesskey = С
zen-themes-corrupted = Файл дополнения { -brand-short-name } повреждён. Возвращена тема по умолчанию.
zen-shortcuts-corrupted = Файл комбинаций клавиш { -brand-short-name } повреждён. Возвращены комбинации клавиш по умолчанию.
# note: Do not translate the "
" tags in the following string
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Свернуть
zen-panel-ui-gradient-generator-custom-color = Пользовательский цвет
zen-panel-ui-gradient-generator-saved-message = Градиент успешно сохранён!
-zen-copy-current-url-confirmation = Ссылка скопирована в буфер обмена.
+zen-copy-current-url-confirmation = Адрес скопирован!
zen-general-cancel-label =
.label = Отменить
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Пространства
zen-library-sidebar-mods =
.label = Моды
+zen-toggle-compact-mode-button =
+ .label = Компактный режим
+ .tooltiptext = Переключить компактный режим
# note: Do not translate the "
" tags in the following string
@@ -45,7 +48,37 @@ zen-close-label = Закрыть
zen-singletoolbar-urlbar-placeholder-with-name =
.placeholder = Найти...
zen-icons-picker-emoji =
- .label = Emojis
+ .label = Эмодзи
zen-icons-picker-svg =
- .label = Icons
-urlbar-search-mode-zen_actions = Actions
+ .label = Иконки
+urlbar-search-mode-zen_actions = Действия
+zen-site-data-settings = Настройки
+zen-generic-manage = Изменить
+zen-generic-more = Ещё
+zen-generic-next = Далее
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Разрешено
+zen-site-data-setting-block = Запрещено
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Расширение
+zen-site-data-security-info-secure =
+ .label = Безопасно
+zen-site-data-security-info-not-secure =
+ .label = Небезопасно
+zen-site-data-manage-addons =
+ .label = Управление расширениями
+zen-site-data-get-addons =
+ .label = Добавить расширения
+zen-site-data-site-settings =
+ .label = Все настройки сайта
+zen-site-data-share =
+ .label = Поделиться этой страницей
+zen-urlbar-copy-url-button =
+ .tooltiptext = Скопировать URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = Новый дом для расширений, разрешений и всего остального
+zen-site-data-panel-feature-callout-subtitle = Нажмите на значок для доступа к настройкам сайта, параметрам безопасности, расширениям и прочим действиям.
diff --git a/locales/ru/browser/browser/zen-split-view.ftl b/locales/ru/browser/browser/zen-split-view.ftl
index b3f618278..88d3d207f 100644
--- a/locales/ru/browser/browser/zen-split-view.ftl
+++ b/locales/ru/browser/browser/zen-split-view.ftl
@@ -6,10 +6,10 @@ tab-zen-split-tabs =
[few] Разделить { $tabCount } вкладки
*[other] Разделить { $tabCount } вкладок
}
- .accesskey = S
+ .accesskey = Ы
zen-split-link =
.label = Раздельный вид в новой вкладке
- .accesskey = S
+ .accesskey = Ы
zen-split-view-modifier-header = Разделение вкладок
zen-split-view-modifier-activate-reallocation =
.label = Активировать перемещение вкладок
diff --git a/locales/ru/browser/browser/zen-vertical-tabs.ftl b/locales/ru/browser/browser/zen-vertical-tabs.ftl
index 8267a2e54..f9c47ec4e 100644
--- a/locales/ru/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/ru/browser/browser/zen-vertical-tabs.ftl
@@ -3,20 +3,19 @@ zen-toolbar-context-tabs-right =
.accesskey = Р
zen-toolbar-context-compact-mode =
.label = Компактный вид
- .accesskey = С
zen-toolbar-context-compact-mode-enable =
.label = Включить компактный вид
- .accesskey = D
+ .accesskey = В
zen-toolbar-context-compact-mode-just-tabs =
- .label = Hide sidebar
+ .label = Скрыть боковую панель
zen-toolbar-context-compact-mode-just-toolbar =
.label = Скрыть панель инструментов
zen-toolbar-context-compact-mode-hide-both =
.label = Скрыть оба
.accesskey = Н
zen-toolbar-context-new-folder =
- .label = New Folder
- .accesskey = N
+ .label = Новая папка
+ .accesskey = Т
sidebar-zen-expand =
.label = Развернуть боковую панель
sidebar-zen-create-new =
diff --git a/locales/ru/browser/browser/zen-welcome.ftl b/locales/ru/browser/browser/zen-welcome.ftl
index 147db34bd..27ad1ed1b 100644
--- a/locales/ru/browser/browser/zen-welcome.ftl
+++ b/locales/ru/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Погрузиться!
zen-welcome-default-search-title = Ваша поисковая система по умолчанию
zen-welcome-default-search-description = Выберите поисковую систему по умолчанию. Вы всегда можете изменить её позже!
zen-welcome-skip-button = Пропустить
-zen-welcome-next-action = Продолжить
zen-welcome-finished = Zen настроен правильно!
diff --git a/locales/ru/browser/browser/zen-workspaces.ftl b/locales/ru/browser/browser/zen-workspaces.ftl
index 1d638845f..554aab913 100644
--- a/locales/ru/browser/browser/zen-workspaces.ftl
+++ b/locales/ru/browser/browser/zen-workspaces.ftl
@@ -1,35 +1,37 @@
-zen-panel-ui-workspaces-text = Рабочие пространства
+zen-panel-ui-workspaces-text = Пространства
zen-panel-ui-workspaces-create =
.label = Создать пространство
zen-panel-ui-folder-create =
- .label = Create Folder
+ .label = Создать папку
zen-panel-ui-new-empty-split =
- .label = New Split
+ .label = Новая разделённая вкладка
zen-workspaces-panel-context-delete =
.label = Удалить пространство
- .accesskey = D
+ .accesskey = В
zen-workspaces-panel-change-name =
.label = Переименовать
zen-workspaces-panel-change-icon =
.label = Изменить значок
zen-workspaces-panel-context-default-profile =
.label = Настроить профиль
+zen-workspaces-panel-unload =
+ .label = Выгрузить пространство
zen-workspaces-how-to-reorder-title = Как переупорядочить пространства
zen-workspaces-how-to-reorder-desc = Перетащите пространства внизу боковой панели, чтобы изменить их порядок
zen-workspaces-change-theme =
.label = Изменить тему
zen-workspaces-panel-context-open =
.label = Открыть пространство
- .accesskey = O
+ .accesskey = Щ
zen-workspaces-panel-context-edit =
.label = Редактировать пространство
- .accesskey = E
+ .accesskey = У
context-zen-change-workspace-tab =
.label = Перенести вкладку(-ки) на рабочее пространство
- .accesskey = C
+ .accesskey = С
zen-bookmark-edit-panel-workspace-selector =
.value = Рабочие пространства
- .accesskey = W
+ .accesskey = Ц
zen-panel-ui-gradient-generator-algo-complementary =
.label = Комплементарное
zen-panel-ui-gradient-generator-algo-splitComplementary =
@@ -50,4 +52,4 @@ zen-workspace-creation-profile = Профиль
zen-workspace-creation-header = Создать пространство
zen-workspace-creation-label = Пространства используются для организации ваших вкладок и сеансов.
zen-workspaces-delete-workspace-title = Удалить пространство?
-zen-workspaces-delete-workspace-body = Are you sure you want to delete { $name }? This action cannot be undone.
+zen-workspaces-delete-workspace-body = Вы уверены, что хотите удалить { $name }? Это действие необратимо.
diff --git a/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl b/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl
index 01c75fcd1..c66d08cca 100644
--- a/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/sv-SE/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Skift + Klicka
zen-glance-trigger-meta-click =
.label = Meta (Command) + Click
-zen-glance-trigger-mantain-click =
- .label = Mantain Klicka
zen-look-and-feel-compact-view-header = Visa i kompakt vy
zen-look-and-feel-compact-view-description = Visa bara verktygsfälten du använder!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Dölj standardindikatorn för behållare i flikfältet
zen-key-unsaved = Osparad genväg! Vänligen säkra den genom att klicka på "Escape" knappen efter att du skrivit om den.
-zen-key-conflict = Konflikt med en annan genväg
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = Inställningar för tema
zen-vertical-tabs-title = Sidofält och flikar layout
zen-vertical-tabs-header = Vertikala flikar
diff --git a/locales/sv-SE/browser/browser/zen-general.ftl b/locales/sv-SE/browser/browser/zen-general.ftl
index 0ca33f23e..6bfeca164 100644
--- a/locales/sv-SE/browser/browser/zen-general.ftl
+++ b/locales/sv-SE/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Återställ Fäst flik
.accesskey = R
tab-context-zen-add-essential =
- .label = Lägg till Essentials ({ $num } / 12 platser fyllda)
+ .label = Lägg till Essentials ({ $num } / { $max } platser fyllda)
.accesskey = E
tab-context-zen-remove-essential =
.label = Ta bort från Essentials
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimera
zen-panel-ui-gradient-generator-custom-color = Anpassad färg
zen-panel-ui-gradient-generator-saved-message = Lyckades spara gradienten!
-zen-copy-current-url-confirmation = Länken har kopierats till urklipp.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Avbryt
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Arbetsytor
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
# note: Do not translate the "
" tags in the following string
@@ -49,3 +52,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = Ikoner
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Settings
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+zen-site-data-manage-addons =
+ .label = Manage Extensions
+zen-site-data-get-addons =
+ .label = Add Extensions
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/sv-SE/browser/browser/zen-vertical-tabs.ftl b/locales/sv-SE/browser/browser/zen-vertical-tabs.ftl
index aaae50173..13d31444e 100644
--- a/locales/sv-SE/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/sv-SE/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Kompakt läge
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Aktivera kompakt läge
.accesskey = D
diff --git a/locales/sv-SE/browser/browser/zen-welcome.ftl b/locales/sv-SE/browser/browser/zen-welcome.ftl
index 118f71d08..f375130db 100644
--- a/locales/sv-SE/browser/browser/zen-welcome.ftl
+++ b/locales/sv-SE/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Dyk in!
zen-welcome-default-search-title = Din standardsökmotor
zen-welcome-default-search-description = Välj din standardsökmotor. Du kan alltid ändra det senare!
zen-welcome-skip-button = Hoppa över
-zen-welcome-next-action = Nästa
zen-welcome-finished = Din Zen har konfigurerats korrekt!
diff --git a/locales/sv-SE/browser/browser/zen-workspaces.ftl b/locales/sv-SE/browser/browser/zen-workspaces.ftl
index f1d9f0fc3..56735f244 100644
--- a/locales/sv-SE/browser/browser/zen-workspaces.ftl
+++ b/locales/sv-SE/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Change Icon
zen-workspaces-panel-context-default-profile =
.label = Set Profile
+zen-workspaces-panel-unload =
+ .label = Unload Space
zen-workspaces-how-to-reorder-title = How to reorder spaces
zen-workspaces-how-to-reorder-desc = Drag the space icons at the bottom of the sidebar to reorder them
zen-workspaces-change-theme =
diff --git a/locales/th/browser/browser/preferences/zen-preferences.ftl b/locales/th/browser/browser/preferences/zen-preferences.ftl
index 84eccbcd3..85e53500d 100644
--- a/locales/th/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/th/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Click
zen-glance-trigger-meta-click =
.label = Meta (Command) + Click
-zen-glance-trigger-mantain-click =
- .label = Mantain Click
zen-look-and-feel-compact-view-header = Show in compact view
zen-look-and-feel-compact-view-description = Only show the toolbars you use!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Hide the default container indicator in the tab bar
zen-key-unsaved = Unsaved shortcut! Please save it by clicking the "Escape" key after retyping it.
-zen-key-conflict = Conflict with another shortcut
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = Theme Settings
zen-vertical-tabs-title = Sidebar and tabs layout
zen-vertical-tabs-header = Vertical Tabs
diff --git a/locales/th/browser/browser/zen-general.ftl b/locales/th/browser/browser/zen-general.ftl
index 5a5206e4f..b4ce133cf 100644
--- a/locales/th/browser/browser/zen-general.ftl
+++ b/locales/th/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Reset Pinned Tab
.accesskey = R
tab-context-zen-add-essential =
- .label = Add to Essentials ({ $num } / 12 slots filled)
+ .label = Add to Essentials ({ $num } / { $max } slots filled)
.accesskey = E
tab-context-zen-remove-essential =
.label = Remove from Essentials
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Minimize
zen-panel-ui-gradient-generator-custom-color = Custom Color
zen-panel-ui-gradient-generator-saved-message = Successfully saved the gradient!
-zen-copy-current-url-confirmation = The URL has been copied to the clipboard.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Cancel
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Spaces
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
# note: Do not translate the "
" tags in the following string
@@ -49,3 +52,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = Icons
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Settings
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+zen-site-data-manage-addons =
+ .label = Manage Extensions
+zen-site-data-get-addons =
+ .label = Add Extensions
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/th/browser/browser/zen-vertical-tabs.ftl b/locales/th/browser/browser/zen-vertical-tabs.ftl
index e59cd7a78..9c71802d2 100644
--- a/locales/th/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/th/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Compact mode
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Enable compact mode
.accesskey = D
diff --git a/locales/th/browser/browser/zen-welcome.ftl b/locales/th/browser/browser/zen-welcome.ftl
index 0767c9bb0..86d517ffd 100644
--- a/locales/th/browser/browser/zen-welcome.ftl
+++ b/locales/th/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Dive in!
zen-welcome-default-search-title = Your Default Search Engine
zen-welcome-default-search-description = Choose your default search engine. You can always change it later!
zen-welcome-skip-button = Skip
-zen-welcome-next-action = Next
zen-welcome-finished = Your Zen has been set up correctly!
diff --git a/locales/th/browser/browser/zen-workspaces.ftl b/locales/th/browser/browser/zen-workspaces.ftl
index e194ee7c4..ac5baadd4 100644
--- a/locales/th/browser/browser/zen-workspaces.ftl
+++ b/locales/th/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Change Icon
zen-workspaces-panel-context-default-profile =
.label = Set Profile
+zen-workspaces-panel-unload =
+ .label = Unload Space
zen-workspaces-how-to-reorder-title = How to reorder spaces
zen-workspaces-how-to-reorder-desc = Drag the space icons at the bottom of the sidebar to reorder them
zen-workspaces-change-theme =
diff --git a/locales/tr/browser/browser/preferences/zen-preferences.ftl b/locales/tr/browser/browser/preferences/zen-preferences.ftl
index f21b5c428..2c71e5801 100644
--- a/locales/tr/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/tr/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Tıklama
zen-glance-trigger-meta-click =
.label = Meta (Komut) + Tıklama
-zen-glance-trigger-mantain-click =
- .label = Mantain Click
zen-look-and-feel-compact-view-header = Kompakt görünümde göster
zen-look-and-feel-compact-view-description = Sadece kullandığın araç çubuklarını göster!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Sekme çubuğundaki varsayılan konteyner göstergesini gizle
zen-key-unsaved = Güvenli olmayan kısayol! Lütfen yazdıktan sonra "Escape" tuşuna tıklayarak kaydedin.
-zen-key-conflict = Başka bir kısayol ile karışıyor
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = Tema Ayarları
zen-vertical-tabs-title = Kenar çubuğu ve sekme düzeni
zen-vertical-tabs-header = Dikey Sekmeler
diff --git a/locales/tr/browser/browser/zen-general.ftl b/locales/tr/browser/browser/zen-general.ftl
index 19ea2def8..9c5dd7dba 100644
--- a/locales/tr/browser/browser/zen-general.ftl
+++ b/locales/tr/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Sabitlenen Sekmeyi Sıfırla
.accesskey = R
tab-context-zen-add-essential =
- .label = Add to Essentials ({ $num } / 12 slots filled)
+ .label = Add to Essentials ({ $num } / { $max } slots filled)
.accesskey = E
tab-context-zen-remove-essential =
.label = Temel Ögelerden Kaldır
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Küçült
zen-panel-ui-gradient-generator-custom-color = Özel Renk
zen-panel-ui-gradient-generator-saved-message = Renkler başarıyla kaydedildi!
-zen-copy-current-url-confirmation = URL panoya kopyalandı.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Cancel
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Spaces
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
# note: Do not translate the "
" tags in the following string
@@ -49,3 +52,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = Icons
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Settings
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+zen-site-data-manage-addons =
+ .label = Manage Extensions
+zen-site-data-get-addons =
+ .label = Add Extensions
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/tr/browser/browser/zen-vertical-tabs.ftl b/locales/tr/browser/browser/zen-vertical-tabs.ftl
index e09848ad8..5a384585a 100644
--- a/locales/tr/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/tr/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Kompakt mod
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Komapkt modu aktifleştir
.accesskey = D
diff --git a/locales/tr/browser/browser/zen-welcome.ftl b/locales/tr/browser/browser/zen-welcome.ftl
index 69b30038c..d70d19049 100644
--- a/locales/tr/browser/browser/zen-welcome.ftl
+++ b/locales/tr/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = İçeri dal!
zen-welcome-default-search-title = Varsayılan Arama Motorun
zen-welcome-default-search-description = Varsayılan arama motorunu seç. Bu seçimi istediğin zaman değiştirebilirsin!
zen-welcome-skip-button = Geç
-zen-welcome-next-action = Sonraki
zen-welcome-finished = Zen başarıyla kuruldu ve ayarlandı!
diff --git a/locales/tr/browser/browser/zen-workspaces.ftl b/locales/tr/browser/browser/zen-workspaces.ftl
index 9fe4c3b82..ec4ae1750 100644
--- a/locales/tr/browser/browser/zen-workspaces.ftl
+++ b/locales/tr/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Simgeyi Değiştir
zen-workspaces-panel-context-default-profile =
.label = Set Profile
+zen-workspaces-panel-unload =
+ .label = Unload Space
zen-workspaces-how-to-reorder-title = How to reorder spaces
zen-workspaces-how-to-reorder-desc = Drag the space icons at the bottom of the sidebar to reorder them
zen-workspaces-change-theme =
diff --git a/locales/uk/browser/browser/preferences/zen-preferences.ftl b/locales/uk/browser/browser/preferences/zen-preferences.ftl
index dd5d54edc..206429694 100644
--- a/locales/uk/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/uk/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Клік
zen-glance-trigger-meta-click =
.label = Meta (Command) + Клац
-zen-glance-trigger-mantain-click =
- .label = Затяжний Клік
zen-look-and-feel-compact-view-header = Показати в компактному вигляді
zen-look-and-feel-compact-view-description = Показати лише панелі інструментів, які ви використовуєте!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Приховувати індикатор контейнерів за замовчуванням у панелі вкладок
zen-key-unsaved = Незбережений ярлик! Захистіть його, натиснувши на кнопку „Escape“ після його введення.
-zen-key-conflict = Конфлікт з іншою клавішею
+zen-key-conflict = Конфліктує з { $group } -> { $shortcut }
pane-zen-theme-title = Налаштування теми
zen-vertical-tabs-title = Розташування бічної панелі та вкладок
zen-vertical-tabs-header = Вертикальні таблиці
diff --git a/locales/uk/browser/browser/zen-general.ftl b/locales/uk/browser/browser/zen-general.ftl
index 0b319fc20..ae3fab0b3 100644
--- a/locales/uk/browser/browser/zen-general.ftl
+++ b/locales/uk/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Скинути прикріплену вкладку
.accesskey = Р
tab-context-zen-add-essential =
- .label = Додати до Основного ({ $num } / 12 комірок заповнено)
+ .label = Додати до Основного ({ $num } / { $max } комірок заповнено)
.accesskey = E
tab-context-zen-remove-essential =
.label = Вилучити з основних елементів
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Згорнути
zen-panel-ui-gradient-generator-custom-color = Власний колір
zen-panel-ui-gradient-generator-saved-message = Градієнт успішно збережено!
-zen-copy-current-url-confirmation = URL-адресу було скопійовано до буфера обміну.
+zen-copy-current-url-confirmation = Скопійовано поточну URL-адресу!
zen-general-cancel-label =
.label = Скасувати
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Простори
zen-library-sidebar-mods =
.label = Модифікації
+zen-toggle-compact-mode-button =
+ .label = Компактний режим
+ .tooltiptext = Увімк. / Вимк. компактний режим
# note: Do not translate the "
" tags in the following string
@@ -48,4 +51,34 @@ zen-icons-picker-emoji =
.label = Емоджі
zen-icons-picker-svg =
.label = Значки
-urlbar-search-mode-zen_actions = Actions
+urlbar-search-mode-zen_actions = Дії
+zen-site-data-settings = Налаштування
+zen-generic-manage = Керувати
+zen-generic-more = Більше
+zen-generic-next = Далі
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Дозволено
+zen-site-data-setting-block = Заблоковано
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Розширення
+zen-site-data-security-info-secure =
+ .label = Захищено
+zen-site-data-security-info-not-secure =
+ .label = Не захищено
+zen-site-data-manage-addons =
+ .label = Керування розширеннями
+zen-site-data-get-addons =
+ .label = Додати розширення
+zen-site-data-site-settings =
+ .label = Усі налаштування сайту
+zen-site-data-share =
+ .label = Поділитися цією сторінкою
+zen-urlbar-copy-url-button =
+ .tooltiptext = Копіювати URL-адресу
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = Новий дім для доповнень, дозволів тощо
+zen-site-data-panel-feature-callout-subtitle = Натисніть значок, щоби керувати налаштуваннями сайту, переглядати інформацію про безпеку, отримувати доступ до розширень і виконувати поширені дії.
diff --git a/locales/uk/browser/browser/zen-vertical-tabs.ftl b/locales/uk/browser/browser/zen-vertical-tabs.ftl
index 1dffa9ad7..7ae28454d 100644
--- a/locales/uk/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/uk/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = Р
zen-toolbar-context-compact-mode =
.label = Компактний режим
- .accesskey = До
zen-toolbar-context-compact-mode-enable =
.label = Увімкнути компактний режим
.accesskey = Ре
diff --git a/locales/uk/browser/browser/zen-welcome.ftl b/locales/uk/browser/browser/zen-welcome.ftl
index b09c46e95..ef00afeea 100644
--- a/locales/uk/browser/browser/zen-welcome.ftl
+++ b/locales/uk/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Зануритися!
zen-welcome-default-search-title = Ваша типова пошукова система
zen-welcome-default-search-description = Оберіть вашу типову пошукову систему. Ви завжди зможете змінити її пізніше!
zen-welcome-skip-button = Пропустити
-zen-welcome-next-action = Далі
zen-welcome-finished = Zen налаштовано правильно!
diff --git a/locales/uk/browser/browser/zen-workspaces.ftl b/locales/uk/browser/browser/zen-workspaces.ftl
index e377e672c..3dc3115b6 100644
--- a/locales/uk/browser/browser/zen-workspaces.ftl
+++ b/locales/uk/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Змінити значок
zen-workspaces-panel-context-default-profile =
.label = Встановити профіль
+zen-workspaces-panel-unload =
+ .label = Вивантажити простір
zen-workspaces-how-to-reorder-title = Як впорядкувати простори
zen-workspaces-how-to-reorder-desc = Перетягніть значок простору в нижній частині панелі для зміни їхнього порядку
zen-workspaces-change-theme =
diff --git a/locales/vi/browser/browser/preferences/zen-preferences.ftl b/locales/vi/browser/browser/preferences/zen-preferences.ftl
index a0aae02fc..38bfc6398 100644
--- a/locales/vi/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/vi/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + Click
zen-glance-trigger-meta-click =
.label = Meta (Command) + Click
-zen-glance-trigger-mantain-click =
- .label = Mantain Click
zen-look-and-feel-compact-view-header = Hiển thị ở chế độ thu gọn
zen-look-and-feel-compact-view-description = Chỉ hiển thị các thanh công cụ mà bạn sử dụng!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = Ẩn chỉ báo vùng chứa mặc định trên thanh thẻ
zen-key-unsaved = Lối tắt không an toàn! Xin hãy làm an toàn nó bằng cách ấn nút "Escape/Esc" sau khi nhập lại nó.
-zen-key-conflict = Trùng với lối tắt khác
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = Cài đặt chủ đề
zen-vertical-tabs-title = Bố cục thanh bên và thẻ
zen-vertical-tabs-header = Thẻ dọc
diff --git a/locales/vi/browser/browser/zen-general.ftl b/locales/vi/browser/browser/zen-general.ftl
index 0c73c7861..dfd0650c7 100644
--- a/locales/vi/browser/browser/zen-general.ftl
+++ b/locales/vi/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = Đặt lại thẻ đã ghim
.accesskey = R
tab-context-zen-add-essential =
- .label = Thêm thẻ vào thường trú (đã thêm { $num } / 12 )
+ .label = Thêm thẻ vào thường trú (đã thêm { $num } / { $max } )
.accesskey = E
tab-context-zen-remove-essential =
.label = Loại ra khỏi thẻ thường trú
@@ -24,7 +24,7 @@ pictureinpicture-minimize-btn =
.tooltip = Thu nhỏ
zen-panel-ui-gradient-generator-custom-color = Tùy chỉnh màu sắc
zen-panel-ui-gradient-generator-saved-message = Lưu tùy chỉnh đổ màu thành công!
-zen-copy-current-url-confirmation = Đường dẫn đã được chép vào bộ nhớ.
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = Hủy
zen-general-confirm =
@@ -37,6 +37,9 @@ zen-library-sidebar-workspaces =
.label = Không gian làm việc
zen-library-sidebar-mods =
.label = Mods
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
# note: Do not translate the "
" tags in the following string
@@ -49,3 +52,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = Biểu tượng
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Settings
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+zen-site-data-manage-addons =
+ .label = Manage Extensions
+zen-site-data-get-addons =
+ .label = Add Extensions
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/vi/browser/browser/zen-vertical-tabs.ftl b/locales/vi/browser/browser/zen-vertical-tabs.ftl
index ec1001425..2e519f8f3 100644
--- a/locales/vi/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/vi/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = Chế độ thu gọn
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = Bật chế độ thu gọn
.accesskey = D
diff --git a/locales/vi/browser/browser/zen-welcome.ftl b/locales/vi/browser/browser/zen-welcome.ftl
index aeed748f1..8cb2574c6 100644
--- a/locales/vi/browser/browser/zen-welcome.ftl
+++ b/locales/vi/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = Bắt đầu nào!
zen-welcome-default-search-title = Your Default Search Engine
zen-welcome-default-search-description = Hãy chọn công cụ tìm kiếm mặc đinh. Bạn luôn có thể đổi nó sau này!
zen-welcome-skip-button = Bỏ qua
-zen-welcome-next-action = Tiếp theo
zen-welcome-finished = Trình duyệt của bạn đã được thiết lập thành công!
diff --git a/locales/vi/browser/browser/zen-workspaces.ftl b/locales/vi/browser/browser/zen-workspaces.ftl
index d7f92a4cb..b781169ff 100644
--- a/locales/vi/browser/browser/zen-workspaces.ftl
+++ b/locales/vi/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = Đổi biểu tượng không gian làm việc
zen-workspaces-panel-context-default-profile =
.label = Cài đặt hồ sơ
+zen-workspaces-panel-unload =
+ .label = Unload Space
zen-workspaces-how-to-reorder-title = Cách sắp xếp thứ tự của các không gian làm việc
zen-workspaces-how-to-reorder-desc = Kéo và thả các biểu tượng của không gian làm việc ở dưới thanh bên để sắp xếp thứ tự của chúng
zen-workspaces-change-theme =
diff --git a/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl b/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl
index e73f05a03..5d2cffd86 100644
--- a/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/zh-CN/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + 单击
zen-glance-trigger-meta-click =
.label = Meta (Command) + 单击
-zen-glance-trigger-mantain-click =
- .label = 长按(即将上线!)
zen-look-and-feel-compact-view-header = 以紧凑视图显示
zen-look-and-feel-compact-view-description = 仅显示您使用的工具栏!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = 隐藏在标签页栏中的默认容器指示器
zen-key-unsaved = 快捷键未保存!请重新输入并按下“Escape”键保存。
-zen-key-conflict = 和其它快捷键冲突
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = 主题设置
zen-vertical-tabs-title = 侧边栏和标签页布局
zen-vertical-tabs-header = 垂直标签页
diff --git a/locales/zh-CN/browser/browser/zen-general.ftl b/locales/zh-CN/browser/browser/zen-general.ftl
index 45bba9c94..556104f6b 100644
--- a/locales/zh-CN/browser/browser/zen-general.ftl
+++ b/locales/zh-CN/browser/browser/zen-general.ftl
@@ -4,7 +4,7 @@ tab-context-zen-reset-pinned-tab =
.label = 重置固定标签页
.accesskey = R
tab-context-zen-add-essential =
- .label = 添加到常驻标签页(已使用 { $num } / 12)
+ .label = 添加到常驻标签页(已使用 { $num } / { $max })
.accesskey = E
tab-context-zen-remove-essential =
.label = 从常驻标签页中移除
@@ -22,7 +22,7 @@ pictureinpicture-minimize-btn =
.tooltip = 最小化
zen-panel-ui-gradient-generator-custom-color = 自定义颜色
zen-panel-ui-gradient-generator-saved-message = 渐变保存成功!
-zen-copy-current-url-confirmation = 网址已复制到剪贴板。
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = 取消
zen-general-confirm =
@@ -35,6 +35,9 @@ zen-library-sidebar-workspaces =
.label = 工作区
zen-library-sidebar-mods =
.label = 模组
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
# note: Do not translate the "
" tags in the following string
@@ -47,3 +50,33 @@ zen-icons-picker-emoji =
zen-icons-picker-svg =
.label = 图标集
urlbar-search-mode-zen_actions = Actions
+zen-site-data-settings = Settings
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+zen-site-data-manage-addons =
+ .label = 管理扩展
+zen-site-data-get-addons =
+ .label = 添加扩展
+zen-site-data-site-settings =
+ .label = 所有站点设置
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/zh-CN/browser/browser/zen-vertical-tabs.ftl b/locales/zh-CN/browser/browser/zen-vertical-tabs.ftl
index 6ecd73c1b..5da8c55cd 100644
--- a/locales/zh-CN/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/zh-CN/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = 简洁模式
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = 启用简洁模式
.accesskey = D
diff --git a/locales/zh-CN/browser/browser/zen-welcome.ftl b/locales/zh-CN/browser/browser/zen-welcome.ftl
index be5e1ff37..ba7a349f3 100644
--- a/locales/zh-CN/browser/browser/zen-welcome.ftl
+++ b/locales/zh-CN/browser/browser/zen-welcome.ftl
@@ -23,5 +23,4 @@ zen-welcome-start-browsing = 立刻开始!
zen-welcome-default-search-title = 您的默认搜索引擎
zen-welcome-default-search-description = 选择您的默认搜索引擎。您可以随时更改它!
zen-welcome-skip-button = 跳过
-zen-welcome-next-action = 下一步
zen-welcome-finished = 您的 Zen 已正确设置!
diff --git a/locales/zh-CN/browser/browser/zen-workspaces.ftl b/locales/zh-CN/browser/browser/zen-workspaces.ftl
index 6d0bd9336..7a9c3841f 100644
--- a/locales/zh-CN/browser/browser/zen-workspaces.ftl
+++ b/locales/zh-CN/browser/browser/zen-workspaces.ftl
@@ -14,6 +14,8 @@ zen-workspaces-panel-change-icon =
.label = 更改图标
zen-workspaces-panel-context-default-profile =
.label = 设置身份
+zen-workspaces-panel-unload =
+ .label = Unload Space
zen-workspaces-how-to-reorder-title = 如何排序工作区
zen-workspaces-how-to-reorder-desc = 拖动侧边栏底部的工作区图标以重新排序
zen-workspaces-change-theme =
diff --git a/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl b/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl
index db2022b65..af9de897d 100644
--- a/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl
+++ b/locales/zh-TW/browser/browser/preferences/zen-preferences.ftl
@@ -26,8 +26,6 @@ zen-glance-trigger-shift-click =
.label = Shift + 左鍵
zen-glance-trigger-meta-click =
.label = Meta (Command) + 左鍵
-zen-glance-trigger-mantain-click =
- .label = 長按(即將上線!)
zen-look-and-feel-compact-view-header = 在緊湊模式下顯示
zen-look-and-feel-compact-view-description = 只顯示你需要用的工具欄!
zen-look-and-feel-compact-view-enabled =
@@ -74,7 +72,7 @@ zen-settings-workspaces-enabled =
zen-settings-workspaces-hide-default-container-indicator =
.label = 隱藏分頁欄中的容器指標
zen-key-unsaved = 快捷鍵未儲存!請重新輸入並按下 "Escape" 鍵來儲存快捷鍵。
-zen-key-conflict = 與其它快捷鍵發生衝突
+zen-key-conflict = Conflicts with { $group } -> { $shortcut }
pane-zen-theme-title = 主題設定
zen-vertical-tabs-title = 側邊欄與分頁排版
zen-vertical-tabs-header = 垂直分頁
@@ -92,12 +90,12 @@ zen-vertical-tabs-expand-tabs-header = 如何擴展分頁
zen-vertical-tabs-expand-tabs-description = 選擇要如何擴展側邊欄中的分頁
zen-theme-marketplace-header = Zen 模組
zen-theme-disable-all-enabled =
- .title = 啟用所有主題
+ .title = 啟用所有模組
zen-theme-disable-all-disabled =
- .title = 停用所有主題
-zen-theme-marketplace-description = 從商店尋找並安裝主題。
+ .title = 停用所有模組
+zen-theme-marketplace-description = 從商店尋找並安裝模組。
zen-theme-marketplace-remove-button =
- .label = 移除主題
+ .label = 移除模組
zen-theme-marketplace-check-for-updates-button =
.label = 檢查更新
zen-theme-marketplace-import-button =
@@ -114,15 +112,15 @@ zen-theme-marketplace-toggle-enabled-button =
.title = 關閉佈景主題
zen-theme-marketplace-toggle-disabled-button =
.title = 啟用佈景主題
-zen-theme-marketplace-remove-confirmation = 您確定要移除此模組?
+zen-theme-marketplace-remove-confirmation = 您確定要移除此模組?
zen-theme-marketplace-close-modal = 關閉
zen-theme-marketplace-theme-header-title =
.title = CSS 選擇器:{ $name }
zen-theme-marketplace-dropdown-default-label =
.label = 無
zen-theme-marketplace-input-default-placeholder =
- .placeholder = 請輸入
-pane-zen-marketplace-title = Zen 模式
+ .placeholder = 請輸入...
+pane-zen-marketplace-title = Zen 模組
zen-themes-auto-update =
.label = 啟動時自動更新已安裝模組
zen-settings-workspaces-force-container-tabs-to-workspace =
@@ -150,12 +148,12 @@ pane-zen-CKS-title = 快捷鍵
category-zen-CKS =
.tooltiptext = { pane-zen-CKS-title }
pane-settings-CKS-title = { -brand-short-name } 快捷鍵
-zen-settings-CKS-header = 自定義你的快捷鍵
-zen-settings-CKS-description = 依據你的愛好來更改預設的快捷鍵以近一步改善你的瀏覽體驗
+zen-settings-CKS-header = 自定義您的快捷鍵
+zen-settings-CKS-description = 依據您的愛好來更改預設的快捷鍵以近一步改善你的瀏覽體驗
zen-settings-CKS-disable-firefox =
.label = 停用 { -brand-short-name } 的預設快捷鍵
zen-settings-CKS-duplicate-shortcut =
- .label = 重複的快捷鍵
+ .label = 複製快捷鍵
zen-settings-CKS-reset-shortcuts =
.label = 重設為預設值
zenCKSOption-group-other = 其它
@@ -173,13 +171,13 @@ zenCKSOption-group-devTools = 開發人員工具
zen-key-quick-restart = 快速重啟
zen-window-new-shortcut = 開新視窗
zen-tab-new-shortcut = 開新分頁
-zen-key-redo = 重做
+zen-key-redo = 取消復原
zen-restore-last-closed-tab-shortcut = 復原上次關閉的分頁
zen-location-open-shortcut = 選取網址列
zen-location-open-shortcut-alt = 選取網址列(備用)
zen-key-undo-close-window = 還原已關閉視窗
zen-text-action-undo-shortcut = 復原
-zen-text-action-redo-shortcut = 取消「復原」
+zen-text-action-redo-shortcut = 取消復原
zen-text-action-cut-shortcut = 剪下
zen-text-action-copy-shortcut = 複製
zen-text-action-copy-url-shortcut = 複製目前網址
@@ -219,9 +217,9 @@ zen-history-show-all-shortcut = 顯示所有歷史
zen-key-enter-full-screen = 進入全畫面模式
zen-key-exit-full-screen = 離開全畫面模式
zen-ai-chatbot-sidebar-shortcut = 開啟 AI 聊天側邊欄
-zen-key-inspector-mac = 開啟檢測器(Mac)
+zen-key-inspector-mac = 開啟檢測器 (Mac)
zen-toggle-sidebar-shortcut = 開啟 Firefox 側邊欄
-zen-toggle-pin-tab-shortcut = Toggle Pin Tab
+zen-toggle-pin-tab-shortcut = 切換釘選分頁
zen-reader-mode-toggle-shortcut-other = 切換閱讀模式
zen-picture-in-picture-toggle-shortcut = 切換子母畫面
zen-nav-reload-shortcut-2 = 重新整理
diff --git a/locales/zh-TW/browser/browser/zen-folders.ftl b/locales/zh-TW/browser/browser/zen-folders.ftl
index f29a2b1a5..629509b69 100644
--- a/locales/zh-TW/browser/browser/zen-folders.ftl
+++ b/locales/zh-TW/browser/browser/zen-folders.ftl
@@ -1,21 +1,21 @@
zen-folders-search-placeholder =
- .placeholder = Search { $folder-name }...
+ .placeholder = 搜尋 { $folder-name }...
zen-folders-panel-rename-folder =
- .label = Rename Folder
+ .label = 重新命名分頁夾
zen-folders-panel-unpack-folder =
- .label = Unpack Folder
+ .label = 解散分頁夾
zen-folders-new-subfolder =
- .label = New Subfolder
+ .label = 新增子分頁夾
zen-folders-panel-delete-folder =
- .label = Delete Folder
+ .label = 刪除分頁夾
zen-folders-panel-convert-folder-to-space =
- .label = Convert folder to Space
+ .label = 將分頁夾轉換為工作區
zen-folders-panel-change-folder-space =
- .label = Change Space...
+ .label = 變更工作區...
zen-folders-panel-change-icon-folder =
- .label = Change Icon
+ .label = 變更圖示
zen-folders-unload-all-tooltip =
- .tooltiptext = Unload active in this folder
+ .tooltiptext = 卸載此分頁夾中所有分頁
zen-folders-unload-folder =
- .label = Unload All Tabs
-zen-folders-search-no-results = 沒有找到搜尋的分頁 🤔
+ .label = 卸載所有分頁
+zen-folders-search-no-results = 找不到符合搜尋的分頁 🤔
diff --git a/locales/zh-TW/browser/browser/zen-general.ftl b/locales/zh-TW/browser/browser/zen-general.ftl
index 529088d05..0574bc55c 100644
--- a/locales/zh-TW/browser/browser/zen-general.ftl
+++ b/locales/zh-TW/browser/browser/zen-general.ftl
@@ -1,10 +1,10 @@
zen-panel-ui-current-profile-text = 當前設定檔
-unified-extensions-description = 擴充功能用於為 { -brand-short-name } 帶來更多功能。
+unified-extensions-description = 擴充功能可為 { -brand-short-name } 帶來更多額外功能。
tab-context-zen-reset-pinned-tab =
.label = 重置釘選的分頁
.accesskey = R
tab-context-zen-add-essential =
- .label = Add to Essentials ({ $num } / 12 slots filled)
+ .label = Add to Essentials ({ $num } / { $max } slots filled)
.accesskey = E
tab-context-zen-remove-essential =
.label = 從 Essentials 中移除
@@ -12,29 +12,32 @@ tab-context-zen-remove-essential =
tab-context-zen-replace-pinned-url-with-current =
.label = 將釘選的網址換成目前的網址
.accesskey = C
-zen-themes-corrupted = 你的 { -brand-short-name } 模組文件已損壞,它們已重置為預設佈景主題。
+zen-themes-corrupted = 你的 { -brand-short-name } 模組文件已損壞,它們已重設為預設主題。
zen-shortcuts-corrupted = 你的 { -brand-short-name } 快捷文件已損壞。它們已被重設為預設值。
# note: Do not translate the "
" tags in the following string
zen-new-urlbar-notification = 新的 URL 欄已啟用,你不再需要新增新分頁。
馬上打開新分頁來看看新的 URL 欄!
-zen-disable = 禁用
+zen-disable = 停用
pictureinpicture-minimize-btn =
- .aria-label = Minimize
- .tooltip = Minimize
+ .aria-label = 最小化
+ .tooltip = 最小化
zen-panel-ui-gradient-generator-custom-color = 自訂顏色
-zen-panel-ui-gradient-generator-saved-message = 漸層儲存成功!
-zen-copy-current-url-confirmation = 網址已複製到剪貼簿。
+zen-panel-ui-gradient-generator-saved-message = 已成功儲存漸層!
+zen-copy-current-url-confirmation = Copied current URL!
zen-general-cancel-label =
.label = 取消
zen-general-confirm =
.label = 確認
zen-pinned-tab-replaced = 釘選分頁網址已替換為當前當前網址。
-zen-tabs-renamed = 分頁重新命名成功!
-zen-background-tab-opened-toast = New background tab opened!
-zen-workspace-renamed-toast = Workspace has been successfully renamed!
+zen-tabs-renamed = 已成功重新命名分頁!
+zen-background-tab-opened-toast = 已在背景開啟新分頁!
+zen-workspace-renamed-toast = 已成功重新命名工作區!
zen-library-sidebar-workspaces =
.label = 工作區
zen-library-sidebar-mods =
.label = 模組
+zen-toggle-compact-mode-button =
+ .label = Compact Mode
+ .tooltiptext = Toggle Compact Mode
# note: Do not translate the "
" tags in the following string
@@ -45,5 +48,35 @@ zen-singletoolbar-urlbar-placeholder-with-name =
zen-icons-picker-emoji =
.label = 表情符號
zen-icons-picker-svg =
- .label = Icons
-urlbar-search-mode-zen_actions = Actions
+ .label = 圖示
+urlbar-search-mode-zen_actions = 操作
+zen-site-data-settings = Settings
+zen-generic-manage = Manage
+zen-generic-more = More
+zen-generic-next = Next
+# These labels will be used for the site data panel settings
+zen-site-data-setting-allow = Allowed
+zen-site-data-setting-block = Blocked
+zen-site-data-setting-cross-site = Cross-Site cookie
+zen-site-data-security-info-extension =
+ .label = Extension
+zen-site-data-security-info-secure =
+ .label = Secure
+zen-site-data-security-info-not-secure =
+ .label = Not Secure
+zen-site-data-manage-addons =
+ .label = Manage Extensions
+zen-site-data-get-addons =
+ .label = Add Extensions
+zen-site-data-site-settings =
+ .label = All Site Settings
+zen-site-data-share =
+ .label = Share This Page
+zen-urlbar-copy-url-button =
+ .tooltiptext = Copy URL
+zen-site-data-setting-site-protection = Tracking Protection
+
+# Section: Feature callouts
+
+zen-site-data-panel-feature-callout-title = A new home for add-ons, permissions, and more
+zen-site-data-panel-feature-callout-subtitle = Click the icon to manage site settings, view security info, access extensions, and perform common actions.
diff --git a/locales/zh-TW/browser/browser/zen-split-view.ftl b/locales/zh-TW/browser/browser/zen-split-view.ftl
index 3c6a616de..d7701d89a 100644
--- a/locales/zh-TW/browser/browser/zen-split-view.ftl
+++ b/locales/zh-TW/browser/browser/zen-split-view.ftl
@@ -10,7 +10,7 @@ zen-split-link =
.accesskey = S
zen-split-view-modifier-header = 分割畫面
zen-split-view-modifier-activate-reallocation =
- .label = 啟用重新分配
-zen-split-view-modifier-enabled-toast = 分割畫面重新排列已開啟。
-zen-split-view-modifier-enabled-toast-description = 拖曳畫面以重新排列。按 Esc 鍵退出
-zen-split-view-modifier-disabled-toast = 分割畫面重新排列已關閉
+ .label = 啟用重新排列
+zen-split-view-modifier-enabled-toast = 已開啟分割畫面重新排列功能。
+zen-split-view-modifier-enabled-toast-description = 拖曳畫面以重新排列。按 Esc 鍵退出。
+zen-split-view-modifier-disabled-toast = 已關閉分割畫面重新排列功能。
diff --git a/locales/zh-TW/browser/browser/zen-vertical-tabs.ftl b/locales/zh-TW/browser/browser/zen-vertical-tabs.ftl
index d8a81f797..5be0b8652 100644
--- a/locales/zh-TW/browser/browser/zen-vertical-tabs.ftl
+++ b/locales/zh-TW/browser/browser/zen-vertical-tabs.ftl
@@ -3,7 +3,6 @@ zen-toolbar-context-tabs-right =
.accesskey = R
zen-toolbar-context-compact-mode =
.label = 緊湊模式
- .accesskey = C
zen-toolbar-context-compact-mode-enable =
.label = 開啟緊湊模式
.accesskey = D
@@ -15,12 +14,12 @@ zen-toolbar-context-compact-mode-hide-both =
.label = 兩者皆隱藏
.accesskey = H
zen-toolbar-context-new-folder =
- .label = New Folder
+ .label = 新增分頁夾
.accesskey = N
sidebar-zen-expand =
.label = 展開側邊欄
sidebar-zen-create-new =
- .label = Create New...
+ .label = 新增...
tabbrowser-unload-tab-button =
.tooltiptext =
{ $tabCount ->
diff --git a/locales/zh-TW/browser/browser/zen-welcome.ftl b/locales/zh-TW/browser/browser/zen-welcome.ftl
index 9b2818248..20cb671b2 100644
--- a/locales/zh-TW/browser/browser/zen-welcome.ftl
+++ b/locales/zh-TW/browser/browser/zen-welcome.ftl
@@ -2,26 +2,25 @@
# 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-welcome-title-line1 = Welcome to
-zen-welcome-title-line2 = a calmer internet
-zen-welcome-import-title = A Fresh Start, Same Bookmarks
-zen-welcome-import-description-1 = Your bookmarks, history, and passwords are like a trail of breadcrumbs through the internet—don’t leave them behind!
+zen-welcome-title-line1 = 歡迎使用
+zen-welcome-title-line2 = 更寧靜的網路體驗
+zen-welcome-import-title = 全新開始,書籤依舊
+zen-welcome-import-description-1 = 您的書籤、歷史記錄和密碼,是您網路足跡的珍貴紀錄——別把它們遺忘了!
zen-welcome-import-description-2 = 輕鬆匯入其他瀏覽器的資料,無縫接續瀏覽體驗。
-zen-welcome-import-button = Import now
-zen-welcome-set-default-browser = Set { -brand-short-name } as your default browser
-zen-welcome-dont-set-default-browser = DON’T set { -brand-short-name } as your default browser
-zen-welcome-initial-essentials-title = Your Key Tabs, Always Within Reach
-zen-welcome-initial-essentials-description-1 = Keep your most important tabs easily accessible and always at hand, no matter how many you open.
-zen-welcome-initial-essentials-description-2 = Essential tabs are always visible, no matter what workspace you are in.
-zen-welcome-workspace-colors-title = Your Workspaces, Your Colors
-zen-welcome-workspace-colors-description = Personalize your browser by giving each workspace its own unique color identity.
+zen-welcome-import-button = 立即匯入
+zen-welcome-set-default-browser = 將 { -brand-short-name } 設為您的預設瀏覽器
+zen-welcome-dont-set-default-browser = 不要將 { -brand-short-name } 設為您的預設瀏覽器
+zen-welcome-initial-essentials-title = 重要分頁,隨手可及
+zen-welcome-initial-essentials-description-1 = 無論開啟多少分頁,最重要的分頁將永遠顯示,讓您輕鬆存取。
+zen-welcome-initial-essentials-description-2 = 無論您在哪個工作區,Essential 分頁會永遠顯示。
+zen-welcome-workspace-colors-title = 您的工作區,您的色彩
+zen-welcome-workspace-colors-description = 為每個工作區賦予獨特的色彩,打造個人化瀏覽器。
zen-welcome-start-browsing-title =
- All set?
- Let’s get rolling!
-zen-welcome-start-browsing-description-1 = You’re all set up and ready to go. Click the button below to start browsing with { -brand-short-name }.
-zen-welcome-start-browsing = Dive in!
-zen-welcome-default-search-title = Your Default Search Engine
-zen-welcome-default-search-description = Choose your default search engine. You can always change it later!
-zen-welcome-skip-button = Skip
-zen-welcome-next-action = Next
-zen-welcome-finished = Your Zen has been set up correctly!
+ 準備好了嗎?
+ 馬上開始體驗吧!
+zen-welcome-start-browsing-description-1 = 您已完成所有設定並準備就緒。點擊下方按鈕,開始使用 { -brand-short-name } 瀏覽網路吧。
+zen-welcome-start-browsing = 立即開始!
+zen-welcome-default-search-title = 您的預設搜尋引擎
+zen-welcome-default-search-description = 選擇您的預設搜尋引擎,您可以隨時更改它!
+zen-welcome-skip-button = 跳過
+zen-welcome-finished = 您的 Zen 瀏覽器已成功設定!
diff --git a/locales/zh-TW/browser/browser/zen-workspaces.ftl b/locales/zh-TW/browser/browser/zen-workspaces.ftl
index 92fbccf9f..18f96eaa4 100644
--- a/locales/zh-TW/browser/browser/zen-workspaces.ftl
+++ b/locales/zh-TW/browser/browser/zen-workspaces.ftl
@@ -1,8 +1,8 @@
zen-panel-ui-workspaces-text = 工作區
zen-panel-ui-workspaces-create =
- .label = 創建工作區
+ .label = 建立工作區
zen-panel-ui-folder-create =
- .label = Create Folder
+ .label = 建立分頁夾
zen-panel-ui-new-empty-split =
.label = New Split
zen-workspaces-panel-context-delete =
@@ -13,7 +13,9 @@ zen-workspaces-panel-change-name =
zen-workspaces-panel-change-icon =
.label = 變更圖示
zen-workspaces-panel-context-default-profile =
- .label = Set Profile
+ .label = 設定設定檔
+zen-workspaces-panel-unload =
+ .label = 卸載工作區
zen-workspaces-how-to-reorder-title = 如何排序工作區
zen-workspaces-how-to-reorder-desc = 拖曳側邊欄底部工作區圖示以重新排序
zen-workspaces-change-theme =
@@ -25,7 +27,7 @@ zen-workspaces-panel-context-edit =
.label = 編輯工作區
.accesskey = E
context-zen-change-workspace-tab =
- .label = 將分頁(含多個)移至工作區
+ .label = 將分頁移至工作區
.accesskey = C
zen-bookmark-edit-panel-workspace-selector =
.value = 選擇工作區
@@ -45,9 +47,9 @@ zen-workspace-creation-name =
.placeholder = 工作區名稱
zen-workspaces-panel-context-reorder =
.label = 排序工作區
-zen-workspace-creation-profile = Profile
- .tooltiptext = Profiles are used to separate cookies and site data between spaces.
-zen-workspace-creation-header = 創建工作區
-zen-workspace-creation-label = Spaces are used to organize your tabs and sessions.
+zen-workspace-creation-profile = 設定檔
+ .tooltiptext = 設定檔用於隔離不同工作區的 Cookie 和網站資料。
+zen-workspace-creation-header = 建立工作區
+zen-workspace-creation-label = 工作區用於組織您的分頁與工作階段。
zen-workspaces-delete-workspace-title = 刪除工作區?
-zen-workspaces-delete-workspace-body = 你確定要刪除 { $name } 嗎?該動作無法物復原。
+zen-workspaces-delete-workspace-body = 您確定要刪除 { $name } 嗎?此操錯無法復原。
diff --git a/package-lock.json b/package-lock.json
index 760d8650c..0a4a39033 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,7 @@
"version": "1.0.0",
"license": "MPL-2.0",
"dependencies": {
- "@zen-browser/surfer": "^1.11.21"
+ "@zen-browser/surfer": "^1.11.22"
},
"devDependencies": {
"@babel/preset-typescript": "^7.27.0",
@@ -21,7 +21,7 @@
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-json": "^4.0.1",
"eslint-plugin-react-hooks": "^5.2.0",
- "formal-git": "^1.1.5",
+ "formal-git": "^1.2.9",
"globals": "^16.3.0",
"husky": "^9.1.7",
"lint-staged": "^15.3.0",
@@ -1135,9 +1135,9 @@
"license": "MIT"
},
"node_modules/@zen-browser/surfer": {
- "version": "1.11.21",
- "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.11.21.tgz",
- "integrity": "sha512-tUJMtTi6Vy4SPYoxSHsS4y0xYrgptXvxwkKfIrBsFSH7uMtySu1edgmsMYyhs+KOk1Jff1fLkxhnKl0EJf2XhA==",
+ "version": "1.11.22",
+ "resolved": "https://registry.npmjs.org/@zen-browser/surfer/-/surfer-1.11.22.tgz",
+ "integrity": "sha512-fvV+8stPXJDyX/6lv4bvgkxq1hNGyJJyOU1ysjJSrElxo9CerB35XU8LMjAs6SjuV1olLMILg2DwCIP2gVn0+Q==",
"license": "MPL-2.0",
"dependencies": {
"@resvg/resvg-js": "^1.4.0",
@@ -3387,9 +3387,9 @@
}
},
"node_modules/formal-git": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/formal-git/-/formal-git-1.1.5.tgz",
- "integrity": "sha512-cSPoV0+/LFdUsE+fCGxCOK/eJNZeWj5c+6IxB3PP3QkeWIgdQFgw+RObnnpG/0KOsXy8mFrsD6tkEHbGjNGMpQ==",
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/formal-git/-/formal-git-1.2.9.tgz",
+ "integrity": "sha512-EksDGPXBHz/jyxGt4zvXqDptjCnLYyATI1mb5/kEsc6vuruHu1QCjXarGFdkN8WkfFH0UImoJlvhz3HwwwcKsA==",
"dev": true,
"license": "ISC",
"bin": {
@@ -5525,9 +5525,9 @@
}
},
"node_modules/prebuild-install/node_modules/tar-fs": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz",
- "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==",
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz",
+ "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==",
"license": "MIT",
"dependencies": {
"chownr": "^1.1.1",
@@ -6643,9 +6643,9 @@
}
},
"node_modules/tar-fs": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.9.tgz",
- "integrity": "sha512-XF4w9Xp+ZQgifKakjZYmFdkLoSWd34VGKcsTCwlNWM7QG3ZbaxnTsaBwnjFZqHRf/rROxaR8rXnbtwdvaDI+lA==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz",
+ "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==",
"license": "MIT",
"dependencies": {
"pump": "^3.0.0",
diff --git a/package.json b/package.json
index ea0542817..f84997605 100644
--- a/package.json
+++ b/package.json
@@ -21,7 +21,7 @@
"update-ff:rc": "python3 scripts/update_ff.py --rc",
"update-ff:l10n": "python3 scripts/update_ff.py --just-l10n",
"pretty": "prettier . --write --cache && autopep8 -r --in-place scripts/ src/",
- "lint": "npx eslint src/ && prettier . --check && autopep8 --diff scripts/ src/",
+ "lint": "npx eslint src/ && prettier . --check --cache",
"lint:fix": "npm run pretty && npx eslint src/ --fix",
"prepare": "husky",
"reset-ff": "surfer reset",
@@ -31,7 +31,8 @@
"ffprefs": "cd tools/ffprefs && cargo run --bin ffprefs -- ../../",
"lc": "surfer license-check",
"lc:fix": "surfer license-check --fix",
- "use-moz-src": "cd engine && ./mach use-moz-src"
+ "use-moz-src": "cd engine && ./mach use-moz-src",
+ "ci": "surfer ci --brand release --display-version"
},
"repository": {
"type": "git",
@@ -48,7 +49,7 @@
},
"homepage": "https://github.com/zen-browser/desktop#readme",
"dependencies": {
- "@zen-browser/surfer": "^1.11.21"
+ "@zen-browser/surfer": "^1.11.22"
},
"devDependencies": {
"@babel/preset-typescript": "^7.27.0",
@@ -60,7 +61,7 @@
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-json": "^4.0.1",
"eslint-plugin-react-hooks": "^5.2.0",
- "formal-git": "^1.1.5",
+ "formal-git": "^1.2.9",
"globals": "^16.3.0",
"husky": "^9.1.7",
"lint-staged": "^15.3.0",
diff --git a/prefs/README.md b/prefs/README.md
new file mode 100644
index 000000000..6d1ef9d47
--- /dev/null
+++ b/prefs/README.md
@@ -0,0 +1,7 @@
+# Browser Preferences
+
+This directory contains configuration files for Zen. They are divided by folder according to the source / component they belong to and further divided by file according to their purpose.
+
+- `firefox/`: Preferences to override Firefox defaults.
+- `zen/`: Preferences to configure Zen-specific features.
+- `privatefox/` & `fastfox/`: _Some_ of the preferences got extracted from [Betterfox](https://github.com/yokoffing/Betterfox).
diff --git a/prefs/smoothscroll.yaml b/prefs/fastfox/smoothscroll.yaml
similarity index 100%
rename from prefs/smoothscroll.yaml
rename to prefs/fastfox/smoothscroll.yaml
diff --git a/prefs/ai.yaml b/prefs/firefox/ai.yaml
similarity index 91%
rename from prefs/ai.yaml
rename to prefs/firefox/ai.yaml
index cdeb20691..e54bb0d38 100644
--- a/prefs/ai.yaml
+++ b/prefs/firefox/ai.yaml
@@ -17,3 +17,6 @@
- name: browser.ml.enable
value: false
+
+- name: browser.ml.chat.menu
+ value: false
diff --git a/prefs/browser.yaml b/prefs/firefox/browser.yaml
similarity index 99%
rename from prefs/browser.yaml
rename to prefs/firefox/browser.yaml
index 30aa603e9..7c8c8dfcd 100644
--- a/prefs/browser.yaml
+++ b/prefs/firefox/browser.yaml
@@ -78,6 +78,7 @@
value: false
- name: browser.tabs.groups.hoverPreview.enabled
+ locked: true
value: false
- name: browser.tabs.closeWindowWithLastTab
diff --git a/prefs/extensions.yaml b/prefs/firefox/extensions.yaml
similarity index 100%
rename from prefs/extensions.yaml
rename to prefs/firefox/extensions.yaml
diff --git a/prefs/fullscreen.yaml b/prefs/firefox/fullscreen.yaml
similarity index 100%
rename from prefs/fullscreen.yaml
rename to prefs/firefox/fullscreen.yaml
diff --git a/prefs/multilingual.yaml b/prefs/firefox/multilingual.yaml
similarity index 100%
rename from prefs/multilingual.yaml
rename to prefs/firefox/multilingual.yaml
diff --git a/prefs/newtab.yaml b/prefs/firefox/newtab.yaml
similarity index 100%
rename from prefs/newtab.yaml
rename to prefs/firefox/newtab.yaml
diff --git a/prefs/pdf.yaml b/prefs/firefox/pdf.yaml
similarity index 100%
rename from prefs/pdf.yaml
rename to prefs/firefox/pdf.yaml
diff --git a/prefs/performance.yaml b/prefs/firefox/performance.yaml
similarity index 100%
rename from prefs/performance.yaml
rename to prefs/firefox/performance.yaml
diff --git a/prefs/pip.yaml b/prefs/firefox/pip.yaml
similarity index 100%
rename from prefs/pip.yaml
rename to prefs/firefox/pip.yaml
diff --git a/prefs/urlbar.yaml b/prefs/firefox/urlbar.yaml
similarity index 96%
rename from prefs/urlbar.yaml
rename to prefs/firefox/urlbar.yaml
index 72472cae9..e47a3274b 100644
--- a/prefs/urlbar.yaml
+++ b/prefs/firefox/urlbar.yaml
@@ -53,9 +53,6 @@
- name: browser.formfill.enable
value: false
-- name: network.IDN_show_punycode
- value: true
-
- name: browser.urlbar.suggest.topsites
value: true
locked: true
diff --git a/prefs/disablemozilla.yaml b/prefs/privatefox/disablemozilla.yaml
similarity index 100%
rename from prefs/disablemozilla.yaml
rename to prefs/privatefox/disablemozilla.yaml
diff --git a/prefs/privacy.yaml b/prefs/privatefox/privacy.yaml
similarity index 100%
rename from prefs/privacy.yaml
rename to prefs/privatefox/privacy.yaml
diff --git a/prefs/compact-mode.yaml b/prefs/zen/compact-mode.yaml
similarity index 100%
rename from prefs/compact-mode.yaml
rename to prefs/zen/compact-mode.yaml
diff --git a/prefs/downloads.yaml b/prefs/zen/downloads.yaml
similarity index 100%
rename from prefs/downloads.yaml
rename to prefs/zen/downloads.yaml
diff --git a/prefs/folders.yaml b/prefs/zen/folders.yaml
similarity index 95%
rename from prefs/folders.yaml
rename to prefs/zen/folders.yaml
index b1e98dcf5..7a8edc5ca 100644
--- a/prefs/folders.yaml
+++ b/prefs/zen/folders.yaml
@@ -6,7 +6,7 @@
value: true
- name: zen.folders.search.hover-delay
- value: 1000 # ms
+ value: 900 # ms
- name: zen.folders.max-subfolders
value: 5
diff --git a/prefs/glance.yaml b/prefs/zen/glance.yaml
similarity index 89%
rename from prefs/glance.yaml
rename to prefs/zen/glance.yaml
index cae4738d2..49125fe30 100644
--- a/prefs/glance.yaml
+++ b/prefs/zen/glance.yaml
@@ -8,9 +8,6 @@
- name: zen.glance.enable-contextmenu-search
value: true
-- name: zen.glance.hold-duration
- value: 300 # in ms
-
- name: zen.glance.open-essential-external-links
value: true
diff --git a/prefs/gtk.yaml b/prefs/zen/gtk.yaml
similarity index 63%
rename from prefs/gtk.yaml
rename to prefs/zen/gtk.yaml
index 9f8a6e226..d68eb68a7 100644
--- a/prefs/gtk.yaml
+++ b/prefs/zen/gtk.yaml
@@ -5,17 +5,8 @@
# GTK-specific preferences
- name: widget.gtk.rounded-bottom-corners.enabled
value: true
- condition: 'defined(MOZ_WIDGET_GTK) && defined(UNIX_BUT_NOT_MAC)'
+ condition: 'defined(MOZ_WIDGET_GTK)'
- name: zen.widget.linux.transparency
value: false
condition: 'defined(MOZ_WIDGET_GTK)'
-
-# VAAPI/FFmpeg preferences for Linux
-- name: media.ffmpeg.vaapi.enabled
- value: true
- condition: 'defined(MOZ_WIDGET_GTK)'
-
-- name: media.ffmpeg.encoder.enabled
- value: true
- condition: 'defined(MOZ_WIDGET_GTK)'
diff --git a/prefs/kbs.yaml b/prefs/zen/kbs.yaml
similarity index 100%
rename from prefs/kbs.yaml
rename to prefs/zen/kbs.yaml
diff --git a/prefs/macos.yaml b/prefs/zen/macos.yaml
similarity index 100%
rename from prefs/macos.yaml
rename to prefs/zen/macos.yaml
diff --git a/prefs/media.yaml b/prefs/zen/media.yaml
similarity index 100%
rename from prefs/media.yaml
rename to prefs/zen/media.yaml
diff --git a/prefs/mods.yaml b/prefs/zen/mods.yaml
similarity index 100%
rename from prefs/mods.yaml
rename to prefs/zen/mods.yaml
diff --git a/prefs/split-view.yaml b/prefs/zen/split-view.yaml
similarity index 100%
rename from prefs/split-view.yaml
rename to prefs/zen/split-view.yaml
diff --git a/prefs/static.yaml b/prefs/zen/static.yaml
similarity index 100%
rename from prefs/static.yaml
rename to prefs/zen/static.yaml
diff --git a/prefs/theme.yaml b/prefs/zen/theme.yaml
similarity index 88%
rename from prefs/theme.yaml
rename to prefs/zen/theme.yaml
index d4b51666d..afbc4ba01 100644
--- a/prefs/theme.yaml
+++ b/prefs/zen/theme.yaml
@@ -3,7 +3,7 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
- name: zen.theme.accent-color
- value: '#ffb787'
+ value: 'AccentColor'
- name: zen.theme.content-element-separation
value: 8
@@ -26,7 +26,7 @@
- name: zen.theme.disable-lightweight
value: true
-- name: zen.theme.use-sysyem-colors
+- name: zen.theme.use-system-colors
value: false
- name: zen.theme.hide-tab-throbber
@@ -35,6 +35,9 @@
- name: zen.theme.styled-status-panel
value: '@IS_TWILIGHT@'
+- name: zen.theme.hide-unified-extensions-button
+ value: false
+
# ==== Mark: border radius ====
# macOS border radius
diff --git a/prefs/view.yaml b/prefs/zen/view.yaml
similarity index 95%
rename from prefs/view.yaml
rename to prefs/zen/view.yaml
index cfdd2ae4d..ff34b01d0 100644
--- a/prefs/view.yaml
+++ b/prefs/zen/view.yaml
@@ -51,3 +51,6 @@
- name: zen.view.context-menu.refresh
value: false
+
+- name: zen.view.borderless-fullscreen
+ value: true
diff --git a/prefs/watermark.yaml b/prefs/zen/watermark.yaml
similarity index 100%
rename from prefs/watermark.yaml
rename to prefs/zen/watermark.yaml
diff --git a/prefs/welcome.yaml b/prefs/zen/welcome.yaml
similarity index 100%
rename from prefs/welcome.yaml
rename to prefs/zen/welcome.yaml
diff --git a/prefs/windows.yaml b/prefs/zen/windows.yaml
similarity index 100%
rename from prefs/windows.yaml
rename to prefs/zen/windows.yaml
diff --git a/prefs/workspaces.yaml b/prefs/zen/workspaces.yaml
similarity index 100%
rename from prefs/workspaces.yaml
rename to prefs/zen/workspaces.yaml
diff --git a/prefs/zen-urlbar.yaml b/prefs/zen/zen-urlbar.yaml
similarity index 92%
rename from prefs/zen-urlbar.yaml
rename to prefs/zen/zen-urlbar.yaml
index b9b0533d4..97be59be9 100644
--- a/prefs/zen-urlbar.yaml
+++ b/prefs/zen/zen-urlbar.yaml
@@ -8,6 +8,9 @@
- name: zen.urlbar.show-protections-icon
value: false
+- name: zen.urlbar.show-contextual-id
+ value: false
+
- name: zen.urlbar.behavior
value: floating-on-type
diff --git a/prefs/zen.yaml b/prefs/zen/zen.yaml
similarity index 94%
rename from prefs/zen.yaml
rename to prefs/zen/zen.yaml
index 71744da42..469622931 100644
--- a/prefs/zen.yaml
+++ b/prefs/zen/zen.yaml
@@ -11,6 +11,9 @@
- name: zen.tabs.rename-tabs
value: true
+- name: zen.tabs.essentials.max
+ value: 12
+
- name: zen.tabs.show-newtab-vertical
value: true
diff --git a/requirements.txt b/requirements.txt
index 20fc10ae6..d01dcfa80 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -9,3 +9,4 @@ packaging==24.2
pathspec==0.12.1
platformdirs==4.3.6
pycodestyle==2.12.1
+requests==2.32.5
diff --git a/scripts/run_tests.py b/scripts/run_tests.py
index a4adecd7c..90a7995a8 100644
--- a/scripts/run_tests.py
+++ b/scripts/run_tests.py
@@ -6,6 +6,7 @@ import os
import sys
import json
from pathlib import Path
+from typing import Any
IGNORE_PREFS_FILE_IN = os.path.join(
'src', 'zen', 'tests', 'ignorePrefs.json'
@@ -15,6 +16,15 @@ IGNORE_PREFS_FILE_OUT = os.path.join(
)
+class JSONWithCommentsDecoder(json.JSONDecoder):
+ def __init__(self, **kw):
+ super().__init__(**kw)
+
+ def decode(self, s: str) -> Any:
+ s = '\n'.join(l for l in s.split('\n') if not l.lstrip(' ').startswith('//'))
+ return super().decode(s)
+
+
def copy_ignore_prefs():
print("Copying ignorePrefs.json from src/zen/tests to engine/testing/mochitest...")
# if there are prefs that dont exist on output file, copy them from input file
@@ -22,7 +32,7 @@ def copy_ignore_prefs():
with open(IGNORE_PREFS_FILE_OUT, 'r') as f:
all_prefs = json.load(f)
with open(IGNORE_PREFS_FILE_IN, 'r') as f_in:
- new_prefs = json.load(f_in)
+ new_prefs = json.load(f_in, cls=JSONWithCommentsDecoder)
all_prefs.extend(p for p in new_prefs if p not in all_prefs)
with open(IGNORE_PREFS_FILE_OUT, 'w') as f_out:
json.dump(all_prefs, f_out, indent=2)
diff --git a/src/Cargo-lock.patch b/src/Cargo-lock.patch
index e33677b06..0f9223905 100644
--- a/src/Cargo-lock.patch
+++ b/src/Cargo-lock.patch
@@ -1,8 +1,8 @@
diff --git a/Cargo.lock b/Cargo.lock
-index 2ac65181b1a9561ee4760e0569dfdd621c684142..b159fd8a351ba7c6541e8994a815de8150db619f 100644
+index c079ef11880c5338c4498a0e5b3eb4cf4bfb6e02..ecd06b05381be740197c07c8cf0743dc882727f5 100644
--- a/Cargo.lock
+++ b/Cargo.lock
-@@ -4029,8 +4029,6 @@ dependencies = [
+@@ -4069,8 +4069,6 @@ dependencies = [
[[package]]
name = "mime_guess"
version = "2.0.4"
diff --git a/src/Cargo-toml.patch b/src/Cargo-toml.patch
index e4b55038b..563622667 100644
--- a/src/Cargo-toml.patch
+++ b/src/Cargo-toml.patch
@@ -1,8 +1,8 @@
diff --git a/Cargo.toml b/Cargo.toml
-index 0fdad8b956be8119f5a914b9cee01bb6520cd13d..f1414b5afd5c66c61d1585184de6b32f9918670d 100644
+index 2331ff5733d39e26c0a16301cb83d46ca970f632..777dbd5fb8546466e4a349772ccba254c7ffd691 100644
--- a/Cargo.toml
+++ b/Cargo.toml
-@@ -218,6 +218,8 @@ moz_asserts = { path = "mozglue/static/rust/moz_asserts" }
+@@ -224,6 +224,8 @@ moz_asserts = { path = "mozglue/static/rust/moz_asserts" }
# Workaround for https://github.com/rust-lang/cargo/issues/11232
rure = { path = "third_party/rust/rure" }
diff --git a/src/browser/actors/WebRTCParent-sys-mjs.patch b/src/browser/actors/WebRTCParent-sys-mjs.patch
index fed9ceb84..cee359785 100644
--- a/src/browser/actors/WebRTCParent-sys-mjs.patch
+++ b/src/browser/actors/WebRTCParent-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/browser/actors/WebRTCParent.sys.mjs b/browser/actors/WebRTCParent.sys.mjs
-index f327e1684d0966a0dcfdcdbf8cc70259b27a4504..c8f722bda4cf297f5d0a6aa22dafbe27c4218123 100644
+index 80fd2177c7112c958ff51bbf7a18ebea39e50fbf..24f62810901dc558e25ee874bd49736bd64fd358 100644
--- a/browser/actors/WebRTCParent.sys.mjs
+++ b/browser/actors/WebRTCParent.sys.mjs
@@ -152,6 +152,7 @@ export class WebRTCParent extends JSWindowActorParent {
diff --git a/src/browser/base/content/browser-addons-js.patch b/src/browser/base/content/browser-addons-js.patch
index 318539af9..0264323c8 100644
--- a/src/browser/base/content/browser-addons-js.patch
+++ b/src/browser/base/content/browser-addons-js.patch
@@ -1,8 +1,8 @@
diff --git a/browser/base/content/browser-addons.js b/browser/base/content/browser-addons.js
-index d7542a38a0242dd9c9c6390171d59992d75a0c19..d20e5a9fa42c88c7ba28fac1ef13dd693f1f1135 100644
+index 754ce380ed233eb8764af07af3c8dc95d3f39d5c..29864ab59819271b7319b273c08bdc2736d40c93 100644
--- a/browser/base/content/browser-addons.js
+++ b/browser/base/content/browser-addons.js
-@@ -1064,7 +1064,7 @@ var gXPInstallObserver = {
+@@ -1071,7 +1071,7 @@ var gXPInstallObserver = {
persistent: true,
hideClose: true,
popupOptions: {
@@ -11,7 +11,7 @@ index d7542a38a0242dd9c9c6390171d59992d75a0c19..d20e5a9fa42c88c7ba28fac1ef13dd69
},
};
-@@ -1273,7 +1273,7 @@ var gXPInstallObserver = {
+@@ -1280,7 +1280,7 @@ var gXPInstallObserver = {
hideClose: true,
timeout: Date.now() + 30000,
popupOptions: {
@@ -20,7 +20,47 @@ index d7542a38a0242dd9c9c6390171d59992d75a0c19..d20e5a9fa42c88c7ba28fac1ef13dd69
},
};
-@@ -2608,7 +2608,7 @@ var gUnifiedExtensions = {
+@@ -2212,7 +2212,7 @@ var gUnifiedExtensions = {
+ // If the new ID is not added in NOTIFICATION_IDS, consider handling the case
+ // in the "PopupNotificationsBeforeAnchor" handler elsewhere in this file.
+ getPopupAnchorID(aBrowser, aWindow) {
+- const anchorID = "unified-extensions-button";
++ const anchorID = "zen-site-data-icon-button";
+ const attr = anchorID + "popupnotificationanchor";
+
+ if (!aBrowser[attr]) {
+@@ -2223,7 +2223,7 @@ var gUnifiedExtensions = {
+ anchorID
+ // Anchor on the toolbar icon to position the popup right below the
+ // button.
+- ).firstElementChild;
++ );
+ }
+
+ return anchorID;
+@@ -2516,11 +2516,7 @@ var gUnifiedExtensions = {
+ // Lazy load the unified-extensions-panel panel the first time we need to
+ // display it.
+ if (!this._panel) {
+- let template = document.getElementById(
+- "unified-extensions-panel-template"
+- );
+- template.replaceWith(template.content);
+- this._panel = document.getElementById("unified-extensions-panel");
++ this._panel = document.getElementById("zen-unified-site-data-panel");
+ let customizationArea = this._panel.querySelector(
+ "#unified-extensions-area"
+ );
+@@ -2570,7 +2566,7 @@ var gUnifiedExtensions = {
+
+ // The button should directly open `about:addons` when the user does not
+ // have any active extensions listed in the unified extensions panel.
+- if (!this.hasExtensionsInPanel()) {
++ if (!this.hasExtensionsInPanel() && false) {
+ let viewID;
+ if (
+ Services.prefs.getBoolPref("extensions.getAddons.showPane", true) &&
+@@ -2615,7 +2611,7 @@ var gUnifiedExtensions = {
this.recordButtonTelemetry(reason || "extensions_panel_showing");
this.ensureButtonShownBeforeAttachingPanel(panel);
PanelMultiView.openPopup(panel, this._button, {
@@ -29,7 +69,7 @@ index d7542a38a0242dd9c9c6390171d59992d75a0c19..d20e5a9fa42c88c7ba28fac1ef13dd69
triggerEvent: aEvent,
});
}
-@@ -2795,18 +2795,20 @@ var gUnifiedExtensions = {
+@@ -2802,18 +2798,20 @@ var gUnifiedExtensions = {
this._maybeMoveWidgetNodeBack(widgetId);
}
diff --git a/src/browser/base/content/browser-commands-js.patch b/src/browser/base/content/browser-commands-js.patch
index 7e98cf714..b6d37eec0 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 637e9dda83df5b490d6340367dd63077904ea056..6ffb1dc6ed1d6e58b4e8de1faca887f6b38115cb 100644
+index 74aae01ddcdc4b6460ebbe174355ca129a89010b..52dd4e6aa49929394ed6afa6b25f4ee4954b8b94 100644
--- a/browser/base/content/browser-commands.js
+++ b/browser/base/content/browser-commands.js
@@ -317,6 +317,10 @@ var BrowserCommands = {
diff --git a/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch b/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch
index b71398c94..db1354d84 100644
--- a/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch
+++ b/src/browser/base/content/browser-fullScreenAndPointerLock-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/base/content/browser-fullScreenAndPointerLock.js b/browser/base/content/browser-fullScreenAndPointerLock.js
-index d477ac782e0cb921203f8cd38da70a003ac41b39..648d0b4066b630a9b31da0bb8490f29da701dd3d 100644
+index b41449d4c4bc373a4c9cf449c0bb370bfdbc20d6..f1166929397dd39b7f44bd9cb0d62a45d67f0e1d 100644
--- a/browser/base/content/browser-fullScreenAndPointerLock.js
+++ b/browser/base/content/browser-fullScreenAndPointerLock.js
@@ -427,10 +427,10 @@ var FullScreen = {
diff --git a/src/browser/base/content/browser-init-js.patch b/src/browser/base/content/browser-init-js.patch
index 9b3a7c42d..b8b27c308 100644
--- a/src/browser/base/content/browser-init-js.patch
+++ b/src/browser/base/content/browser-init-js.patch
@@ -1,16 +1,16 @@
diff --git a/browser/base/content/browser-init.js b/browser/base/content/browser-init.js
-index e4a94863c0f0810d1894475b020814b2ad32ffb3..515f61d2df5d4a593fc32d3f32e8fdec2b8f5983 100644
+index 8e63654b343e8518aa0e366a3fd3bf7e0856eafb..3cebc9bb057f51cea639130fecd7576e1c9db79c 100644
--- a/browser/base/content/browser-init.js
+++ b/browser/base/content/browser-init.js
-@@ -191,6 +191,7 @@ var gBrowserInit = {
+@@ -198,6 +198,7 @@ var gBrowserInit = {
},
onLoad() {
+ Services.scriptloader.loadSubScript("chrome://browser/content/zenThemeModifier.js", window);
gBrowser.addEventListener("DOMUpdateBlockedPopups", e =>
- PopupBlockerObserver.handleEvent(e)
+ PopupAndRedirectBlockerObserver.handleEvent(e)
);
-@@ -359,6 +360,7 @@ var gBrowserInit = {
+@@ -372,6 +373,7 @@ var gBrowserInit = {
this._handleURIToLoad();
diff --git a/src/browser/base/content/browser-js.patch b/src/browser/base/content/browser-js.patch
index afc190969..33bd7cf81 100644
--- a/src/browser/base/content/browser-js.patch
+++ b/src/browser/base/content/browser-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
-index c5b7ef2616c1dab9f42970605897e862d57ab7d0..77f0731db6c4a8d835cf8733115d27ae7782a987 100644
+index 32b67f846b9942ad3da4276bb8748fee915eb485..f77d5df7c8ef49c0366ada8b3153c5a6c676239b 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -31,6 +31,7 @@ ChromeUtils.defineESModuleGetters(this, {
@@ -10,7 +10,7 @@ index c5b7ef2616c1dab9f42970605897e862d57ab7d0..77f0731db6c4a8d835cf8733115d27ae
DevToolsSocketStatus:
"resource://devtools/shared/security/DevToolsSocketStatus.sys.mjs",
DownloadUtils: "resource://gre/modules/DownloadUtils.sys.mjs",
-@@ -2291,6 +2292,8 @@ var XULBrowserWindow = {
+@@ -2293,6 +2294,8 @@ var XULBrowserWindow = {
AboutReaderParent.updateReaderButton(gBrowser.selectedBrowser);
TranslationsParent.onLocationChange(gBrowser.selectedBrowser);
@@ -19,7 +19,7 @@ index c5b7ef2616c1dab9f42970605897e862d57ab7d0..77f0731db6c4a8d835cf8733115d27ae
PictureInPicture.updateUrlbarToggle(gBrowser.selectedBrowser);
if (!gMultiProcessBrowser) {
-@@ -5232,6 +5235,9 @@ var ConfirmationHint = {
+@@ -4782,6 +4785,9 @@ var ConfirmationHint = {
MozXULElement.insertFTLIfNeeded("toolkit/branding/brandings.ftl");
MozXULElement.insertFTLIfNeeded("browser/confirmationHints.ftl");
document.l10n.setAttributes(this._message, messageId, options.l10nArgs);
diff --git a/src/browser/base/content/browser-pageActions-js.patch b/src/browser/base/content/browser-pageActions-js.patch
new file mode 100644
index 000000000..197789f45
--- /dev/null
+++ b/src/browser/base/content/browser-pageActions-js.patch
@@ -0,0 +1,12 @@
+diff --git a/browser/base/content/browser-pageActions.js b/browser/base/content/browser-pageActions.js
+index 00da33bc11189db17b6a2e656acb3a778531197c..9571155baccad9a886cbe9c7bf0bd76a135331c4 100644
+--- a/browser/base/content/browser-pageActions.js
++++ b/browser/base/content/browser-pageActions.js
+@@ -451,6 +451,7 @@ var BrowserPageActions = {
+ ),
+ document.getElementById(this.mainButtonNode.id),
+ document.getElementById("identity-icon"),
++ document.getElementById("zen-site-data-icon-button"),
+ ];
+ for (let node of potentialAnchorNodes) {
+ if (node && !node.hidden) {
diff --git a/src/browser/base/content/browser-places-js.patch b/src/browser/base/content/browser-places-js.patch
index e7baf596a..e302f2838 100644
--- a/src/browser/base/content/browser-places-js.patch
+++ b/src/browser/base/content/browser-places-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/base/content/browser-places.js b/browser/base/content/browser-places.js
-index 5ba2b6a58776e2b1d70b80e8cb1533cb20caafc6..65736705968732a185e81561b2866bfbe6f3233a 100644
+index 79b4f6f8fb2f7dd8784920038784e6bb0c967e2d..1f3f4991b3ba7c00516e9708e89e8f95db25a36a 100644
--- a/browser/base/content/browser-places.js
+++ b/browser/base/content/browser-places.js
@@ -252,6 +252,8 @@ var StarUI = {
diff --git a/src/browser/base/content/browser-siteIdentity-js.patch b/src/browser/base/content/browser-siteIdentity-js.patch
index 0da25c7ce..ac751474b 100644
--- a/src/browser/base/content/browser-siteIdentity-js.patch
+++ b/src/browser/base/content/browser-siteIdentity-js.patch
@@ -1,8 +1,20 @@
diff --git a/browser/base/content/browser-siteIdentity.js b/browser/base/content/browser-siteIdentity.js
-index 65354e0ad3097e10de72f36e257c94472524baf7..bc9527ec9ddfab11c0839398d3f3953872ad9632 100644
+index 65354e0ad3097e10de72f36e257c94472524baf7..866cf5672f30f81a1d8e061c9af0c1af5fbb5fb2 100644
--- a/browser/base/content/browser-siteIdentity.js
+++ b/browser/base/content/browser-siteIdentity.js
-@@ -834,7 +834,7 @@ var gIdentityHandler = {
+@@ -453,11 +453,6 @@ var gIdentityHandler = {
+ // avoid a pretty ugly transition. Also hide it even
+ // if the update resulted in no site data, to keep the
+ // illusion that clicking the button had an effect.
+- let hidden = new Promise(c => {
+- this._identityPopup.addEventListener("popuphidden", c, { once: true });
+- });
+- PanelMultiView.hidePopup(this._identityPopup);
+- await hidden;
+
+ let baseDomain = SiteDataManager.getBaseDomainFromHost(this._uri.host);
+ if (SiteDataManager.promptSiteDataRemoval(window, [baseDomain])) {
+@@ -834,7 +829,7 @@ var gIdentityHandler = {
// This is a secure internal Firefox page.
this._identityBox.className = "chromeUI";
let brandBundle = document.getElementById("bundle_brand");
@@ -11,7 +23,7 @@ index 65354e0ad3097e10de72f36e257c94472524baf7..bc9527ec9ddfab11c0839398d3f39538
} else if (this._pageExtensionPolicy) {
// This is a WebExtension page.
this._identityBox.className = "extensionPage";
-@@ -1163,6 +1163,12 @@ var gIdentityHandler = {
+@@ -1163,6 +1158,12 @@ var gIdentityHandler = {
}
}
diff --git a/src/browser/base/content/browser-xhtml.patch b/src/browser/base/content/browser-xhtml.patch
index 7b1a16f57..413da9a2a 100644
--- a/src/browser/base/content/browser-xhtml.patch
+++ b/src/browser/base/content/browser-xhtml.patch
@@ -1,8 +1,8 @@
diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
-index 7c4c05b72845dfb37c11317d011b8e7c6ba07934..856c368e4d6fe7c7d7ab468423348c844cbf1cdf 100644
+index ffddea280e2edffa2531b4b129489c2be0e2c3d2..f03db9e2db0dec06f997740337f28e76a08a3bdb 100644
--- a/browser/base/content/browser.xhtml
+++ b/browser/base/content/browser.xhtml
-@@ -26,6 +26,7 @@
+@@ -19,6 +19,7 @@
sizemode="normal"
retargetdocumentfocus="urlbar-input"
scrolling="false"
@@ -10,7 +10,7 @@ index 7c4c05b72845dfb37c11317d011b8e7c6ba07934..856c368e4d6fe7c7d7ab468423348c84
persist="screenX screenY width height sizemode"
data-l10n-sync="true">
-@@ -105,8 +106,10 @@
+@@ -98,8 +99,10 @@
@@ -21,7 +21,7 @@ index 7c4c05b72845dfb37c11317d011b8e7c6ba07934..856c368e4d6fe7c7d7ab468423348c84
# All sets except for popupsets (commands, keys, and stringbundles)
-@@ -128,9 +131,11 @@
+@@ -132,9 +135,11 @@
diff --git a/src/browser/base/content/main-popupset-inc-xhtml.patch b/src/browser/base/content/main-popupset-inc-xhtml.patch
index c185ae782..45cdf904f 100644
--- a/src/browser/base/content/main-popupset-inc-xhtml.patch
+++ b/src/browser/base/content/main-popupset-inc-xhtml.patch
@@ -1,5 +1,5 @@
diff --git a/browser/base/content/main-popupset.inc.xhtml b/browser/base/content/main-popupset.inc.xhtml
-index fc219ea3dc901fe2ed351161240700113efb8799..f25bdbf886733e2081a4dff55614809056e9885e 100644
+index 69b83857f40bab6a7298c1416989df2d929d78c1..4ac9f02eb31f58a72d4c58c239ebeadcb66d1e16 100644
--- a/browser/base/content/main-popupset.inc.xhtml
+++ b/browser/base/content/main-popupset.inc.xhtml
@@ -208,6 +208,10 @@
@@ -21,7 +21,7 @@ index fc219ea3dc901fe2ed351161240700113efb8799..f25bdbf886733e2081a4dff556148090
-@@ -613,6 +618,8 @@
+@@ -615,6 +620,8 @@
#include popup-notifications.inc.xhtml
diff --git a/src/browser/base/content/navigator-toolbox-inc-xhtml.patch b/src/browser/base/content/navigator-toolbox-inc-xhtml.patch
index 2297b8efd..98bcbfa15 100644
--- a/src/browser/base/content/navigator-toolbox-inc-xhtml.patch
+++ b/src/browser/base/content/navigator-toolbox-inc-xhtml.patch
@@ -1,5 +1,5 @@
diff --git a/browser/base/content/navigator-toolbox.inc.xhtml b/browser/base/content/navigator-toolbox.inc.xhtml
-index 8e56b24b39e9c1607e3ff208d284a9b555a91ebb..2402848ae564234ec22d5a317c43864ea1b36f29 100644
+index 328a9b052e2f758f48df1caa8165347ed0301b33..1c111abe148f2e16afa6b5f33eb118b7c02dfd69 100644
--- a/browser/base/content/navigator-toolbox.inc.xhtml
+++ b/browser/base/content/navigator-toolbox.inc.xhtml
@@ -2,7 +2,7 @@
diff --git a/src/browser/base/content/navigator-toolbox-js.patch b/src/browser/base/content/navigator-toolbox-js.patch
index e775bcd15..167525ff8 100644
--- a/src/browser/base/content/navigator-toolbox-js.patch
+++ b/src/browser/base/content/navigator-toolbox-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/base/content/navigator-toolbox.js b/browser/base/content/navigator-toolbox.js
-index 413bad2a62058a1c434d6a44e927e44eb397289d..b621c586e679bb8686fe9a5e6743512e71604425 100644
+index 413bad2a62058a1c434d6a44e927e44eb397289d..472eab5d3bca2bc665920707a71105167cbe75ec 100644
--- a/browser/base/content/navigator-toolbox.js
+++ b/browser/base/content/navigator-toolbox.js
@@ -8,7 +8,7 @@
@@ -11,6 +11,24 @@ index 413bad2a62058a1c434d6a44e927e44eb397289d..b621c586e679bb8686fe9a5e6743512e
const widgetOverflow = document.getElementById("widget-overflow");
function onPopupShowing(event) {
+@@ -110,7 +110,7 @@ document.addEventListener(
+ #pageActionButton,
+ #downloads-button,
+ #fxa-toolbar-menu-button,
+- #unified-extensions-button,
++ #zen-site-data-icon-button,
+ #library-button
+ `);
+ if (!element) {
+@@ -138,7 +138,7 @@ document.addEventListener(
+ gSync.toggleAccountPanel(element, event);
+ break;
+
+- case "unified-extensions-button":
++ case "zen-site-data-icon-button":
+ gUnifiedExtensions.togglePanel(event);
+ break;
+
@@ -187,6 +187,7 @@ document.addEventListener(
#reload-button ,
#urlbar-go-button,
@@ -27,3 +45,21 @@ index 413bad2a62058a1c434d6a44e927e44eb397289d..b621c586e679bb8686fe9a5e6743512e
gBrowser.handleNewTabMiddleClick(element, event);
break;
+@@ -317,7 +319,7 @@ document.addEventListener(
+ #pageActionButton,
+ #downloads-button,
+ #fxa-toolbar-menu-button,
+- #unified-extensions-button,
++ #zen-site-data-icon-button,
+ #library-button
+ `);
+ if (!element) {
+@@ -396,7 +398,7 @@ document.addEventListener(
+ gSync.toggleAccountPanel(element, event);
+ break;
+
+- case "unified-extensions-button":
++ case "zen-site-data-icon-button":
+ gUnifiedExtensions.togglePanel(event);
+ break;
+
diff --git a/src/browser/base/content/nsContextMenu-sys-mjs.patch b/src/browser/base/content/nsContextMenu-sys-mjs.patch
index 633a2916f..d5ddb503a 100644
--- a/src/browser/base/content/nsContextMenu-sys-mjs.patch
+++ b/src/browser/base/content/nsContextMenu-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/base/content/nsContextMenu.sys.mjs b/browser/base/content/nsContextMenu.sys.mjs
-index bc71ba720ef3603e8b90d295fb16d8415ba114c4..99677f70e22258f61cc9bda31e4d8745d7ca9395 100644
+index b4fe996f9685a085c14324a35a1d51e2fed569b7..c83d5e9bf92f8f2e3d96b121ba3b758dd124393b 100644
--- a/browser/base/content/nsContextMenu.sys.mjs
+++ b/browser/base/content/nsContextMenu.sys.mjs
-@@ -1095,6 +1095,8 @@ export class nsContextMenu {
+@@ -1105,6 +1105,8 @@ export class nsContextMenu {
!this.isSecureAboutPage()
);
diff --git a/src/browser/base/content/zen-commands.inc.xhtml b/src/browser/base/content/zen-commands.inc.xhtml
index aad8b0c74..d1cbacd7a 100644
--- a/src/browser/base/content/zen-commands.inc.xhtml
+++ b/src/browser/base/content/zen-commands.inc.xhtml
@@ -5,10 +5,7 @@
-
-
-
-
+
@@ -42,6 +39,7 @@
+
diff --git a/src/browser/base/content/zen-locales.inc.xhtml b/src/browser/base/content/zen-locales.inc.xhtml
index b9693795e..247fbbc51 100644
--- a/src/browser/base/content/zen-locales.inc.xhtml
+++ b/src/browser/base/content/zen-locales.inc.xhtml
@@ -2,8 +2,10 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+
diff --git a/src/browser/base/content/zen-panels/popups.inc b/src/browser/base/content/zen-panels/popups.inc
index 955609aa4..d94f76ae0 100644
--- a/src/browser/base/content/zen-panels/popups.inc
+++ b/src/browser/base/content/zen-panels/popups.inc
@@ -25,6 +25,7 @@
hide-if-usercontext-disabled="true">
+
@@ -49,3 +50,12 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/browser/base/content/zen-panels/site-data.inc b/src/browser/base/content/zen-panels/site-data.inc
new file mode 100644
index 000000000..e5a774b88
--- /dev/null
+++ b/src/browser/base/content/zen-panels/site-data.inc
@@ -0,0 +1,87 @@
+# 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/.
+
+
+
+# We'll keep the view with this name/id in order to prevent
+# any sort of future issues we may have if firefox decides
+# to change the functionality of this view
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Keep this button on the DOM even though we hide it for ever,
+# again, to keep firefox happy if they decide to change functionality
+# for this specific button / id
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/browser/base/content/zen-popupset.inc.xhtml b/src/browser/base/content/zen-popupset.inc.xhtml
index 3a812435a..e58a85c4c 100644
--- a/src/browser/base/content/zen-popupset.inc.xhtml
+++ b/src/browser/base/content/zen-popupset.inc.xhtml
@@ -5,5 +5,6 @@
#include zen-panels/gradient-generator.inc
#include zen-panels/emojis-picker.inc
#include zen-panels/folders-search.inc
+#include zen-panels/site-data.inc
#include zen-panels/popups.inc
diff --git a/src/browser/base/content/zen-tabbrowser-elements.inc.xhtml b/src/browser/base/content/zen-tabbrowser-elements.inc.xhtml
index 187791740..887db5f26 100644
--- a/src/browser/base/content/zen-tabbrowser-elements.inc.xhtml
+++ b/src/browser/base/content/zen-tabbrowser-elements.inc.xhtml
@@ -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/.
-
+
#include ../../../zen/split-view/zen-splitview-overlay.inc.xhtml
#include ../../../zen/glance/zen-glance.inc.xhtml
\ No newline at end of file
diff --git a/src/browser/base/moz-build.patch b/src/browser/base/moz-build.patch
index 06cd8ea3f..d4813485e 100644
--- a/src/browser/base/moz-build.patch
+++ b/src/browser/base/moz-build.patch
@@ -1,8 +1,8 @@
diff --git a/browser/base/moz.build b/browser/base/moz.build
-index 2f2807a246c262298d0802a6a80abe211c99732c..089a86c9e7f69b994657f20fb2392f3dcc8646bf 100644
+index 086b462e706bb46727d0fed85b4c98debaeaf721..44a4fcb9b8181678667ee11b0443eed681dd2a43 100644
--- a/browser/base/moz.build
+++ b/browser/base/moz.build
-@@ -81,3 +81,5 @@ DEFINES["MOZ_APP_VERSION_DISPLAY"] = CONFIG["MOZ_APP_VERSION_DISPLAY"]
+@@ -82,3 +82,5 @@ DEFINES["MOZ_APP_VERSION_DISPLAY"] = CONFIG["MOZ_APP_VERSION_DISPLAY"]
DEFINES["APP_LICENSE_BLOCK"] = "%s/content/overrides/app-license.html" % SRCDIR
JAR_MANIFESTS += ["jar.mn"]
diff --git a/src/browser/components/BrowserContentHandler-sys-mjs.patch b/src/browser/components/BrowserContentHandler-sys-mjs.patch
deleted file mode 100644
index bfe87274f..000000000
--- a/src/browser/components/BrowserContentHandler-sys-mjs.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/browser/components/BrowserContentHandler.sys.mjs b/browser/components/BrowserContentHandler.sys.mjs
-index 8630614d23147365628e0cb7e9625b8f2a160588..0750869f16336452a458f27627e6fe0492aae462 100644
---- a/browser/components/BrowserContentHandler.sys.mjs
-+++ b/browser/components/BrowserContentHandler.sys.mjs
-@@ -1276,6 +1276,7 @@ function maybeRecordToHandleTelemetry(uri, isLaunch) {
- ".avif",
- ".htm",
- ".html",
-+ ".jxl",
- ".pdf",
- ".shtml",
- ".xht",
diff --git a/src/browser/components/BrowserGlue-sys-mjs.patch b/src/browser/components/BrowserGlue-sys-mjs.patch
index b7d6408ac..7d280fdcd 100644
--- a/src/browser/components/BrowserGlue-sys-mjs.patch
+++ b/src/browser/components/BrowserGlue-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/BrowserGlue.sys.mjs b/browser/components/BrowserGlue.sys.mjs
-index eae3ed9518ad9ce2103bb912963465c1b10ac050..ccbb04cd36fd8fd63fd8c9ebd0b51f0a5966829c 100644
+index 67b2806835baba3070f295d6b96f97077639995a..5f28e0073c893c57c1d6c37deaacf7b097351d60 100644
--- a/browser/components/BrowserGlue.sys.mjs
+++ b/browser/components/BrowserGlue.sys.mjs
@@ -8,6 +8,7 @@ import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
@@ -10,7 +10,7 @@ index eae3ed9518ad9ce2103bb912963465c1b10ac050..ccbb04cd36fd8fd63fd8c9ebd0b51f0a
AboutHomeStartupCache: "resource:///modules/AboutHomeStartupCache.sys.mjs",
AWToolbarButton: "resource:///modules/aboutwelcome/AWToolbarUtils.sys.mjs",
ASRouter: "resource:///modules/asrouter/ASRouter.sys.mjs",
-@@ -1448,7 +1449,7 @@ BrowserGlue.prototype = {
+@@ -1458,7 +1459,7 @@ BrowserGlue.prototype = {
windowcount++;
let tabbrowser = win.gBrowser;
if (tabbrowser) {
@@ -19,7 +19,7 @@ index eae3ed9518ad9ce2103bb912963465c1b10ac050..ccbb04cd36fd8fd63fd8c9ebd0b51f0a
}
}
-@@ -1611,6 +1612,8 @@ BrowserGlue.prototype = {
+@@ -1623,6 +1624,8 @@ BrowserGlue.prototype = {
} else if (profileDataVersion < APP_DATA_VERSION) {
lazy.ProfileDataUpgrader.upgrade(profileDataVersion, APP_DATA_VERSION);
}
diff --git a/src/browser/components/controlcenter/content/identityPanel-inc-xhtml.patch b/src/browser/components/controlcenter/content/identityPanel-inc-xhtml.patch
index 5c65723d4..27546b54d 100644
--- a/src/browser/components/controlcenter/content/identityPanel-inc-xhtml.patch
+++ b/src/browser/components/controlcenter/content/identityPanel-inc-xhtml.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/controlcenter/content/identityPanel.inc.xhtml b/browser/components/controlcenter/content/identityPanel.inc.xhtml
-index 225340c698f775a321bf5f82c0156bb0e3e2aa96..59e6613638efadfd2961999bd77b388c4529314b 100644
+index 8e23aad8ca0bb686a669b11e1d78b7906f5f38d0..cf4873cc6165b5f77091c056d7e275e0f3d36769 100644
--- a/browser/components/controlcenter/content/identityPanel.inc.xhtml
+++ b/browser/components/controlcenter/content/identityPanel.inc.xhtml
@@ -28,7 +28,7 @@
diff --git a/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch b/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch
index 396dbf5a9..be5a545f9 100644
--- a/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch
+++ b/src/browser/components/customizableui/CustomizableUI-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs
-index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0ade05e3b 100644
+index d9a059f608779fea7cd8c595a432f6fe95183e0c..09a7c4045afd0b96027d0bbbad22e02e52fd7b22 100644
--- a/browser/components/customizableui/CustomizableUI.sys.mjs
+++ b/browser/components/customizableui/CustomizableUI.sys.mjs
@@ -14,6 +14,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
@@ -10,7 +10,16 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0
HomePage: "resource:///modules/HomePage.sys.mjs",
PanelMultiView:
"moz-src:///browser/components/customizableui/PanelMultiView.sys.mjs",
-@@ -333,19 +334,14 @@ var CustomizableUIInternal = {
+@@ -326,7 +327,7 @@ var CustomizableUIInternal = {
+ {
+ type: CustomizableUI.TYPE_PANEL,
+ defaultPlacements: [],
+- anchor: "unified-extensions-button",
++ anchor: "zen-site-data-icon-button",
+ },
+ false
+ );
+@@ -336,19 +337,14 @@ var CustomizableUIInternal = {
"back-button",
"forward-button",
"stop-reload-button",
@@ -31,7 +40,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0
this.registerArea(
CustomizableUI.AREA_NAVBAR,
{
-@@ -353,8 +349,6 @@ var CustomizableUIInternal = {
+@@ -356,8 +352,6 @@ var CustomizableUIInternal = {
overflowable: true,
defaultPlacements: navbarPlacements,
verticalTabsDefaultPlacements: [
@@ -40,7 +49,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0
],
defaultCollapsed: false,
},
-@@ -378,10 +372,7 @@ var CustomizableUIInternal = {
+@@ -381,10 +375,7 @@ var CustomizableUIInternal = {
{
type: CustomizableUI.TYPE_TOOLBAR,
defaultPlacements: [
@@ -51,7 +60,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0
],
verticalTabsDefaultPlacements: [],
defaultCollapsed: null,
-@@ -463,6 +454,7 @@ var CustomizableUIInternal = {
+@@ -466,6 +457,7 @@ var CustomizableUIInternal = {
CustomizableUI.AREA_NAVBAR,
CustomizableUI.AREA_BOOKMARKS,
CustomizableUI.AREA_TABSTRIP,
@@ -59,7 +68,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0
]);
if (AppConstants.platform != "macosx") {
toolbars.add(CustomizableUI.AREA_MENUBAR);
-@@ -1247,6 +1239,9 @@ var CustomizableUIInternal = {
+@@ -1250,6 +1242,9 @@ var CustomizableUIInternal = {
placements = gPlacements.get(area);
}
@@ -69,7 +78,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0
// For toolbars that need it, mark as dirty.
let defaultPlacements = areaProperties.get("defaultPlacements");
if (
-@@ -1754,7 +1749,7 @@ var CustomizableUIInternal = {
+@@ -1757,7 +1752,7 @@ var CustomizableUIInternal = {
lazy.log.info(
"Widget " + aWidgetId + " not found, unable to remove from " + aArea
);
@@ -78,7 +87,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0
}
this.notifyDOMChange(widgetNode, null, container, true, () => {
-@@ -1764,7 +1759,7 @@ var CustomizableUIInternal = {
+@@ -1767,7 +1762,7 @@ var CustomizableUIInternal = {
// We also need to remove the panel context menu if it's there:
this.ensureButtonContextMenu(widgetNode);
if (gPalette.has(aWidgetId) || this.isSpecialWidget(aWidgetId)) {
@@ -87,7 +96,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0
} else {
window.gNavToolbox.palette.appendChild(widgetNode);
}
-@@ -1932,16 +1927,16 @@ var CustomizableUIInternal = {
+@@ -1935,16 +1930,16 @@ var CustomizableUIInternal = {
elem.setAttribute("skipintoolbarset", "true");
}
}
@@ -107,7 +116,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0
// Handle initial state of vertical tabs.
if (isVerticalTabs) {
// Show the vertical tabs toolbar
-@@ -2183,6 +2178,10 @@ var CustomizableUIInternal = {
+@@ -2186,6 +2181,10 @@ var CustomizableUIInternal = {
* The identifier string of the area that aNode is being inserted into.
*/
insertWidgetBefore(aNode, aNextNode, aContainer, aAreaId) {
@@ -118,15 +127,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0
this.notifyDOMChange(aNode, aNextNode, aContainer, false, () => {
this.setLocationAttributes(aNode, aAreaId);
aContainer.insertBefore(aNode, aNextNode);
-@@ -3303,7 +3302,6 @@ var CustomizableUIInternal = {
- if (!this.isWidgetRemovable(aWidgetId)) {
- return;
- }
--
- let placements = gPlacements.get(oldPlacement.area);
- let position = placements.indexOf(aWidgetId);
- if (position != -1) {
-@@ -4538,7 +4536,7 @@ var CustomizableUIInternal = {
+@@ -4541,7 +4540,7 @@ var CustomizableUIInternal = {
* For all registered areas, builds those areas to reflect the current
* placement state of all widgets.
*/
@@ -135,7 +136,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0
for (let [areaId, areaNodes] of gBuildAreas) {
let placements = gPlacements.get(areaId);
let isFirstChangedToolbar = true;
-@@ -4549,7 +4547,7 @@ var CustomizableUIInternal = {
+@@ -4552,7 +4551,7 @@ var CustomizableUIInternal = {
if (area.get("type") == CustomizableUI.TYPE_TOOLBAR) {
let defaultCollapsed = area.get("defaultCollapsed");
let win = areaNode.ownerGlobal;
@@ -144,7 +145,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0
win.setToolbarVisibility(
areaNode,
typeof defaultCollapsed == "string"
-@@ -5840,6 +5838,7 @@ export var CustomizableUI = {
+@@ -5843,6 +5842,7 @@ export var CustomizableUI = {
unregisterArea(aName, aDestroyPlacements) {
CustomizableUIInternal.unregisterArea(aName, aDestroyPlacements);
},
@@ -152,7 +153,16 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0
/**
* Add a widget to an area.
* If the area to which you try to add is not known to CustomizableUI,
-@@ -7887,11 +7886,11 @@ class OverflowableToolbar {
+@@ -7866,7 +7866,7 @@ class OverflowableToolbar {
+ ) {
+ continue;
+ }
+- sum += parseFloat(style.marginLeft) + parseFloat(style.marginRight);
++ sum += parseFloat(style.marginLeft) + Math.max(0, parseFloat(style.marginRight));
+ if (child != aExceptChild) {
+ sum += getInlineSize(child);
+ }
+@@ -7890,11 +7890,11 @@ class OverflowableToolbar {
parseFloat(style.paddingLeft) -
parseFloat(style.paddingRight) -
toolbarChildrenWidth;
@@ -166,17 +176,30 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0
});
lazy.log.debug(
-@@ -7901,7 +7900,8 @@ class OverflowableToolbar {
- // If the target has min-width: 0, their children might actually overflow
- // it, so check for both cases explicitly.
- let targetContentWidth = Math.max(targetWidth, targetChildrenWidth);
-- let isOverflowing = Math.floor(targetContentWidth) > totalAvailWidth;
+@@ -7909,7 +7909,8 @@ class OverflowableToolbar {
+ Math.max(targetWidth, targetChildrenWidth)
+ );
+ totalAvailWidth = Math.ceil(totalAvailWidth);
+- let isOverflowing = targetContentWidth > totalAvailWidth;
+ if (win.gZenVerticalTabsManager._hasSetSingleToolbar && this.#toolbar.id == 'nav-bar') return { isOverflowing: false, targetContentWidth, totalAvailWidth };
-+ let isOverflowing = Math.floor(targetContentWidth) + (win.gZenVerticalTabsManager._hasSetSingleToolbar ? 0.1 : 0) > totalAvailWidth;
++ let isOverflowing = targetContentWidth + (win.gZenVerticalTabsManager._hasSetSingleToolbar ? 0.1 : 0) > totalAvailWidth;
return { isOverflowing, targetContentWidth, totalAvailWidth };
}
-@@ -7995,7 +7995,7 @@ class OverflowableToolbar {
+@@ -7970,7 +7971,11 @@ class OverflowableToolbar {
+ return;
+ }
+ }
+- if (totalAvailWidth <= minSize) {
++ let isLastItem = win.gZenVerticalTabsManager._hasSetSingleToolbar &&
++ this.#target.id == 'zen-sidebar-top-buttons-customization-target' &&
++ this.#overflowedInfo.size == 1 &&
++ !child.classList.contains('unified-extensions-item');
++ if (totalAvailWidth <= minSize && !isLastItem) {
+ lazy.log.debug(
+ `Need ${minSize} but width is ${totalAvailWidth} so bailing`
+ );
+@@ -8003,7 +8008,7 @@ class OverflowableToolbar {
}
}
if (!inserted) {
@@ -185,7 +208,7 @@ index 4f62449d670701c77c681ae36e00bae8bf2f636c..132c77e396cb259181ed13ca8ff784e0
}
child.removeAttribute("cui-anchorid");
child.removeAttribute("overflowedItem");
-@@ -8340,7 +8340,7 @@ class OverflowableToolbar {
+@@ -8348,7 +8353,7 @@ class OverflowableToolbar {
break;
}
case "mousedown": {
diff --git a/src/browser/components/customizableui/CustomizeMode-sys-mjs.patch b/src/browser/components/customizableui/CustomizeMode-sys-mjs.patch
index 6ceefc12b..e4a83fbfb 100644
--- a/src/browser/components/customizableui/CustomizeMode-sys-mjs.patch
+++ b/src/browser/components/customizableui/CustomizeMode-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/customizableui/CustomizeMode.sys.mjs b/browser/components/customizableui/CustomizeMode.sys.mjs
-index fd3c54a1d80f5800ffd2dcaaf594eed4bd2d300c..259af2688e5a8bca88017e5da0bfdb488ab59f59 100644
+index fd3c54a1d80f5800ffd2dcaaf594eed4bd2d300c..3178bd28affd8bd2e18c347fde6c3ec00068710c 100644
--- a/browser/components/customizableui/CustomizeMode.sys.mjs
+++ b/browser/components/customizableui/CustomizeMode.sys.mjs
@@ -503,7 +503,7 @@ export class CustomizeMode {
@@ -28,24 +28,3 @@ index fd3c54a1d80f5800ffd2dcaaf594eed4bd2d300c..259af2688e5a8bca88017e5da0bfdb48
aNode.localName == "toolbarseparator" ||
aNode.localName == "toolbarspring" ||
aNode.localName == "toolbarspacer"
-@@ -3128,6 +3129,20 @@ export class CustomizeMode {
- if (makeSpaceImmediately) {
- aDraggedOverItem.setAttribute("notransition", "true");
- }
-+ if (aItem.parentElement.id === "TabsToolbar-customization-target") {
-+ // We change the border values so we can properly implement the native vertical tabs
-+ // drag and drop behavior.
-+ aItem.style.borderColor = "transparent";
-+ if (aValue == "before") {
-+ prop = "borderTopWidth";
-+ otherProp = "borderBottomWidth";
-+ aItem.style.borderTopStyle = "solid";
-+ } else {
-+ prop = "borderBottomWidth";
-+ otherProp = "borderTopWidth";
-+ aItem.style.borderBottomStyle = "solid";
-+ }
-+ }
- aDraggedOverItem.style[prop] = borderWidth + "px";
- aDraggedOverItem.style.removeProperty(otherProp);
- if (makeSpaceImmediately) {
diff --git a/src/browser/components/extensions/parent/ext-browser-js.patch b/src/browser/components/extensions/parent/ext-browser-js.patch
index 3bace1f05..68c720930 100644
--- a/src/browser/components/extensions/parent/ext-browser-js.patch
+++ b/src/browser/components/extensions/parent/ext-browser-js.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/extensions/parent/ext-browser.js b/browser/components/extensions/parent/ext-browser.js
-index 0baa038232d7e0fd9942f392c48acf7ea5ba50ed..093e1c29c3538d18eb2162b4e4b23ba40c695739 100644
+index 89b0bb3b92c15b89499ffc6cf35dcee7ebb89e48..327afaea3821cdca8d7f58bfaa65c7ce3dbfa7a3 100644
--- a/browser/components/extensions/parent/ext-browser.js
+++ b/browser/components/extensions/parent/ext-browser.js
-@@ -351,6 +351,7 @@ class TabTracker extends TabTrackerBase {
+@@ -354,6 +354,7 @@ class TabTracker extends TabTrackerBase {
}
getId(nativeTab) {
@@ -10,7 +10,7 @@ index 0baa038232d7e0fd9942f392c48acf7ea5ba50ed..093e1c29c3538d18eb2162b4e4b23ba4
let id = this._tabs.get(nativeTab);
if (id) {
return id;
-@@ -385,6 +386,7 @@ class TabTracker extends TabTrackerBase {
+@@ -388,6 +389,7 @@ class TabTracker extends TabTrackerBase {
if (nativeTab.ownerGlobal.closed) {
throw new Error("Cannot attach ID to a tab in a closed window.");
}
@@ -18,7 +18,7 @@ index 0baa038232d7e0fd9942f392c48acf7ea5ba50ed..093e1c29c3538d18eb2162b4e4b23ba4
this._tabs.set(nativeTab, id);
if (nativeTab.linkedBrowser) {
-@@ -1268,6 +1270,10 @@ class TabManager extends TabManagerBase {
+@@ -1271,6 +1273,10 @@ class TabManager extends TabManagerBase {
}
canAccessTab(nativeTab) {
diff --git a/src/browser/components/places/content/browserPlacesViews-js.patch b/src/browser/components/places/content/browserPlacesViews-js.patch
index bf9dad21b..334efc46f 100644
--- a/src/browser/components/places/content/browserPlacesViews-js.patch
+++ b/src/browser/components/places/content/browserPlacesViews-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/places/content/browserPlacesViews.js b/browser/components/places/content/browserPlacesViews.js
-index 29fb3308dcc98d785a3345dee78050d633927db2..0ae28fa0618def4a146723b19a22280956a25371 100644
+index ee6050d411df009d8b61e49d7fdaba79f1bc5db1..0149528329dad3d48449175a35d96d3ed3a3058e 100644
--- a/browser/components/places/content/browserPlacesViews.js
+++ b/browser/components/places/content/browserPlacesViews.js
@@ -330,12 +330,23 @@ class PlacesViewBase {
diff --git a/src/browser/components/preferences/jar-mn.patch b/src/browser/components/preferences/jar-mn.patch
index 591370981..1f1b5e52a 100644
--- a/src/browser/components/preferences/jar-mn.patch
+++ b/src/browser/components/preferences/jar-mn.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/preferences/jar.mn b/browser/components/preferences/jar.mn
-index eac1fc65c01107cc7f1a3f3aeb1e8caac3c4a3f5..c3bd265acc924bcf26816e9e78f314c31af41f6d 100644
+index a786155d80a9f1f09d209f2da11437ee2d662739..2e422b48b452698275118d336d1b16af6a221577 100644
--- a/browser/components/preferences/jar.mn
+++ b/browser/components/preferences/jar.mn
-@@ -27,3 +27,5 @@ browser.jar:
+@@ -30,3 +30,5 @@ browser.jar:
content/browser/preferences/widgets/setting-control.mjs (widgets/setting-control/setting-control.mjs)
content/browser/preferences/widgets/setting-group.mjs (widgets/setting-group/setting-group.mjs)
content/browser/preferences/widgets/setting-group.css (widgets/setting-group/setting-group.css)
diff --git a/src/browser/components/preferences/main-inc-xhtml.patch b/src/browser/components/preferences/main-inc-xhtml.patch
index c3c8af6ce..de244411a 100644
--- a/src/browser/components/preferences/main-inc-xhtml.patch
+++ b/src/browser/components/preferences/main-inc-xhtml.patch
@@ -1,18 +1,20 @@
diff --git a/browser/components/preferences/main.inc.xhtml b/browser/components/preferences/main.inc.xhtml
-index 66ce978d9b022285dea67fdb75b3c005adb05d9b..db61587570ca18403a82ea6796a756d403cc207e 100644
+index 891cf7108cf4606c99a902afa420e744b9690b87..2bdbc1f0b6ac2c883dcbd706aed0615fad5e0760 100644
--- a/browser/components/preferences/main.inc.xhtml
+++ b/browser/components/preferences/main.inc.xhtml
-@@ -29,6 +29,9 @@
+@@ -29,6 +29,11 @@
-+
++
++
++
#ifdef XP_WIN
-@@ -419,6 +423,7 @@
+@@ -420,6 +426,7 @@
languages-customize-add.label,
" />
diff --git a/src/browser/components/preferences/main-js.patch b/src/browser/components/preferences/main-js.patch
index 7fe5eeb4e..fedbfaded 100644
--- a/src/browser/components/preferences/main-js.patch
+++ b/src/browser/components/preferences/main-js.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js
-index 3f578f3888684a1830d456f2a4896e8a5f6630fd..7de18a724d3953a5616577f65a8cf9a18f71893c 100644
+index 259bc260328af1b1f2b95866e7cf92dec341a4b0..3cebff51774b2542a8d4d888aa99dc10929c80be 100644
--- a/browser/components/preferences/main.js
+++ b/browser/components/preferences/main.js
-@@ -424,7 +424,7 @@ function getBundleForLocales(newLocales) {
+@@ -443,7 +443,7 @@ function getBundleForLocales(newLocales) {
])
);
return new Localization(
diff --git a/src/browser/components/preferences/preferences-js.patch b/src/browser/components/preferences/preferences-js.patch
index 9bd739668..c85a728be 100644
--- a/src/browser/components/preferences/preferences-js.patch
+++ b/src/browser/components/preferences/preferences-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/preferences/preferences.js b/browser/components/preferences/preferences.js
-index b5af9af69fd715012af5c0613e0627dd9cf9c3b7..7f86bac8cce278c5b7b7e1230230b3a27b7cf49a 100644
+index 1fb8a954f61e89736b369f5fa01bb4f89fff16ad..3030c32cb66529f14e575428654778abd312dfd8 100644
--- a/browser/components/preferences/preferences.js
+++ b/browser/components/preferences/preferences.js
@@ -117,6 +117,7 @@ ChromeUtils.defineLazyGetter(this, "gSubDialog", function () {
diff --git a/src/browser/components/preferences/preferences-xhtml.patch b/src/browser/components/preferences/preferences-xhtml.patch
index 9a6458fdd..8e8ee9e12 100644
--- a/src/browser/components/preferences/preferences-xhtml.patch
+++ b/src/browser/components/preferences/preferences-xhtml.patch
@@ -1,17 +1,17 @@
diff --git a/browser/components/preferences/preferences.xhtml b/browser/components/preferences/preferences.xhtml
-index 21d951a19df06da67a28f717b9f80f8f4ebf77d2..b1f998f2b3ed99b19666e81e61428587541b0da5 100644
+index 0081bb470c9b15b39441ff844680e5e91b05fb86..3e4e7c43cf0e4feffb80623491de6222bb88a64b 100644
--- a/browser/components/preferences/preferences.xhtml
+++ b/browser/components/preferences/preferences.xhtml
-@@ -44,6 +44,8 @@
-
+@@ -45,6 +45,8 @@
+
+#include zen-preferences-links.xhtml
+
-@@ -104,6 +106,11 @@
+@@ -106,6 +108,11 @@
@@ -23,7 +23,7 @@ index 21d951a19df06da67a28f717b9f80f8f4ebf77d2..b1f998f2b3ed99b19666e81e61428587
@@ -74,7 +74,7 @@ index 21d951a19df06da67a28f717b9f80f8f4ebf77d2..b1f998f2b3ed99b19666e81e61428587
@@ -86,7 +86,7 @@ index 21d951a19df06da67a28f717b9f80f8f4ebf77d2..b1f998f2b3ed99b19666e81e61428587
-@@ -245,6 +291,10 @@
+@@ -247,6 +293,10 @@
#include sync.inc.xhtml
#include experimental.inc.xhtml
#include moreFromMozilla.inc.xhtml
diff --git a/src/browser/components/preferences/zen-settings.js b/src/browser/components/preferences/zen-settings.js
index a93ba5b46..553ddc109 100644
--- a/src/browser/components/preferences/zen-settings.js
+++ b/src/browser/components/preferences/zen-settings.js
@@ -648,8 +648,6 @@ var gZenLooksAndFeel = {
Services.prefs.removeObserver(pref, this);
}
});
- this.setCompactModeStyle();
-
this.applySidebarLayout();
},
@@ -696,41 +694,6 @@ var gZenLooksAndFeel = {
});
}
},
-
- setCompactModeStyle() {
- const chooser = document.getElementById('zen-compact-mode-styles-form');
- const radios = [...chooser.querySelectorAll('input')];
-
- let value = '';
- if (
- Services.prefs.getBoolPref('zen.view.compact.hide-tabbar', false) &&
- Services.prefs.getBoolPref('zen.view.compact.hide-toolbar', false)
- ) {
- value = 'both';
- } else {
- value = Services.prefs.getBoolPref('zen.view.compact.hide-tabbar') ? 'left' : 'top';
- }
- chooser.querySelector(`[value='${value}']`).checked = true;
- for (let radio of radios) {
- radio.addEventListener('change', (e) => {
- let value = e.target.value;
- switch (value) {
- case 'left':
- Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true);
- Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', false);
- break;
- case 'top':
- Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', false);
- Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', true);
- break;
- default:
- Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true);
- Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', true);
- break;
- }
- });
- }
- },
};
/* eslint-disable no-unused-vars */
@@ -1010,7 +973,7 @@ var gZenCKSSettings = {
this._latestValidKey = null;
return;
} else if (shortcut == 'Escape' && !modifiersActive) {
- const hasConflicts = gZenKeyboardShortcutsManager.checkForConflicts(
+ const { hasConflicts, conflictShortcut } = gZenKeyboardShortcutsManager.checkForConflicts(
this._latestValidKey ? this._latestValidKey : shortcut,
this._latestModifier ? this._latestModifier : modifiers,
this._currentActionID
@@ -1023,12 +986,29 @@ var gZenCKSSettings = {
input.classList.add(`${ZEN_CKS_INPUT_FIELD_CLASS}-invalid`);
}
input.classList.remove(`${ZEN_CKS_INPUT_FIELD_CLASS}-unsafed`);
- if (hasConflicts && !input.nextElementSibling) {
- input.after(
- window.MozXULElement.parseXULToFragment(`
-
- `)
- );
+
+ if (hasConflicts) {
+ const shortcutL10nKey =
+ zenMissingKeyboardShortcutL10n[conflictShortcut.getID()] ??
+ conflictShortcut.getL10NID();
+
+ const [group, shortcut] = await document.l10n.formatValues([
+ { id: `${ZEN_CKS_GROUP_PREFIX}-${conflictShortcut.getGroup()}` },
+ { id: shortcutL10nKey },
+ ]);
+
+ if (!input.nextElementSibling) {
+ input.after(
+ window.MozXULElement.parseXULToFragment(`
+
+ `)
+ );
+ }
+
+ document.l10n.setAttributes(input.nextElementSibling, 'zen-key-conflict', {
+ group: group ?? '',
+ shortcut: shortcut ?? '',
+ });
}
} else {
input.classList.remove(`${ZEN_CKS_INPUT_FIELD_CLASS}-editing`);
@@ -1075,11 +1055,6 @@ var gZenCKSSettings = {
};
Preferences.addAll([
- {
- id: 'zen.view.compact.hide-toolbar',
- type: 'bool',
- default: false,
- },
{
id: 'zen.view.compact.toolbar-flash-popup',
type: 'bool',
diff --git a/src/browser/components/preferences/zenLooksAndFeel.inc.xhtml b/src/browser/components/preferences/zenLooksAndFeel.inc.xhtml
index 6af7b0a5c..068db06b6 100644
--- a/src/browser/components/preferences/zenLooksAndFeel.inc.xhtml
+++ b/src/browser/components/preferences/zenLooksAndFeel.inc.xhtml
@@ -56,43 +56,6 @@
-
-
-
#endif
-
diff --git a/src/browser/components/screenshots/overlay/overlay-css.patch b/src/browser/components/screenshots/overlay/overlay-css.patch
index 5230fd70e..9c3021460 100644
--- a/src/browser/components/screenshots/overlay/overlay-css.patch
+++ b/src/browser/components/screenshots/overlay/overlay-css.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/screenshots/overlay/overlay.css b/browser/components/screenshots/overlay/overlay.css
-index 037b060327d896e1ec0d087ade80df7548c8c1f7..7a158291c56df0e3b01bf7a37d04de71940d395f 100644
+index ee2740fc48e9b70fe17b0f27b60053209516dbbf..cc0270e0eb28c3e60216460b02d62111abb970de 100644
--- a/browser/components/screenshots/overlay/overlay.css
+++ b/browser/components/screenshots/overlay/overlay.css
-@@ -225,6 +225,9 @@
+@@ -196,6 +196,9 @@
pointer-events: none;
position: absolute;
z-index: var(--screenshots-high-layer);
@@ -12,7 +12,7 @@ index 037b060327d896e1ec0d087ade80df7548c8c1f7..7a158291c56df0e3b01bf7a37d04de71
}
#top-background {
-@@ -243,7 +246,7 @@
+@@ -214,7 +217,7 @@
}
.bghighlight {
diff --git a/src/browser/components/search/SearchUIUtils-sys-mjs.patch b/src/browser/components/search/SearchUIUtils-sys-mjs.patch
index 850fac1ff..c384b1151 100644
--- a/src/browser/components/search/SearchUIUtils-sys-mjs.patch
+++ b/src/browser/components/search/SearchUIUtils-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/search/SearchUIUtils.sys.mjs b/browser/components/search/SearchUIUtils.sys.mjs
-index 6ef224ce377cf3ff511e435f3c7a5dc1de819c60..5b4c395c222c6317fd88499a1aa5307032ea13f8 100644
+index 55f90f4e802480728bbd5ef962b507183e017997..2a83f861fe6edee2b127c8d7946abcdcdbf677f5 100644
--- a/browser/components/search/SearchUIUtils.sys.mjs
+++ b/browser/components/search/SearchUIUtils.sys.mjs
-@@ -426,7 +426,7 @@ export var SearchUIUtils = {
+@@ -430,7 +430,7 @@ export var SearchUIUtils = {
triggeringSearchEngine: engine.name,
},
});
diff --git a/src/browser/components/sessionstore/SessionStore-sys-mjs.patch b/src/browser/components/sessionstore/SessionStore-sys-mjs.patch
index 08585dd50..79c5bcfcf 100644
--- a/src/browser/components/sessionstore/SessionStore-sys-mjs.patch
+++ b/src/browser/components/sessionstore/SessionStore-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs
-index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb1077ea5c 100644
+index eb62ff3e733e43fdaa299babddea3ba0125abb06..8f20ba50b06f5b75d7de08eb4d1b27d89fb95494 100644
--- a/browser/components/sessionstore/SessionStore.sys.mjs
+++ b/browser/components/sessionstore/SessionStore.sys.mjs
@@ -126,6 +126,8 @@ const TAB_EVENTS = [
@@ -11,7 +11,7 @@ index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb
];
const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
-@@ -1898,6 +1900,8 @@ var SessionStoreInternal = {
+@@ -1904,6 +1906,8 @@ var SessionStoreInternal = {
case "TabPinned":
case "TabUnpinned":
case "SwapDocShells":
@@ -20,7 +20,7 @@ index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb
this.saveStateDelayed(win);
break;
case "TabGroupCreate":
-@@ -2133,7 +2137,6 @@ var SessionStoreInternal = {
+@@ -2139,7 +2143,6 @@ var SessionStoreInternal = {
if (closedWindowState) {
let newWindowState;
if (
@@ -28,7 +28,7 @@ index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb
!lazy.SessionStartup.willRestore()
) {
// We want to split the window up into pinned tabs and unpinned tabs.
-@@ -2366,11 +2369,9 @@ var SessionStoreInternal = {
+@@ -2372,11 +2375,9 @@ var SessionStoreInternal = {
tabbrowser.selectedTab.label;
}
@@ -40,7 +40,7 @@ index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb
// Store the window's close date to figure out when each individual tab
// was closed. This timestamp should allow re-arranging data based on how
-@@ -3355,7 +3356,7 @@ var SessionStoreInternal = {
+@@ -3361,7 +3362,7 @@ var SessionStoreInternal = {
if (!isPrivateWindow && tabState.isPrivate) {
return;
}
@@ -49,7 +49,7 @@ index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb
return;
}
-@@ -4067,6 +4068,11 @@ var SessionStoreInternal = {
+@@ -4073,6 +4074,11 @@ var SessionStoreInternal = {
Math.min(tabState.index, tabState.entries.length)
);
tabState.pinned = false;
@@ -61,7 +61,7 @@ index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb
if (inBackground === false) {
aWindow.gBrowser.selectedTab = newTab;
-@@ -4503,6 +4509,7 @@ var SessionStoreInternal = {
+@@ -4509,6 +4515,7 @@ var SessionStoreInternal = {
// Append the tab if we're opening into a different window,
tabIndex: aSource == aTargetWindow ? pos : Infinity,
pinned: state.pinned,
@@ -138,7 +138,7 @@ index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb
this._log.debug(
`restoreWindow, createTabsForSessionRestore returned ${tabs.length} tabs`
);
-@@ -6349,6 +6360,25 @@ var SessionStoreInternal = {
+@@ -6348,6 +6359,25 @@ var SessionStoreInternal = {
// Most of tabData has been restored, now continue with restoring
// attributes that may trigger external events.
@@ -164,7 +164,7 @@ index e8192ea9d8d35165fbfbb8c4fc4a96641a80cc86..cf13724d147c8b8fc35c76d7f77601eb
if (tabData.pinned) {
tabbrowser.pinTab(tab);
-@@ -7264,7 +7294,7 @@ var SessionStoreInternal = {
+@@ -7263,7 +7293,7 @@ var SessionStoreInternal = {
let groupsToSave = new Map();
for (let tIndex = 0; tIndex < window.tabs.length; ) {
diff --git a/src/browser/components/sidebar/browser-sidebar-js.patch b/src/browser/components/sidebar/browser-sidebar-js.patch
index 4f1be7371..a04592bf8 100644
--- a/src/browser/components/sidebar/browser-sidebar-js.patch
+++ b/src/browser/components/sidebar/browser-sidebar-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/sidebar/browser-sidebar.js b/browser/components/sidebar/browser-sidebar.js
-index f62decaa3f7400787b245b3e765197f4e70dffbb..329240cf434fdbefcf145a733179bd565a814280 100644
+index c4edb5442e5243b7d9fe35e1774b2fc651903601..d58076fedafe07d3401ab1723eaa837fabbae09f 100644
--- a/browser/components/sidebar/browser-sidebar.js
+++ b/browser/components/sidebar/browser-sidebar.js
@@ -779,7 +779,7 @@ var SidebarController = {
diff --git a/src/browser/components/tabbrowser/TabsList-sys-mjs.patch b/src/browser/components/tabbrowser/TabsList-sys-mjs.patch
new file mode 100644
index 000000000..5ac1788da
--- /dev/null
+++ b/src/browser/components/tabbrowser/TabsList-sys-mjs.patch
@@ -0,0 +1,13 @@
+diff --git a/browser/components/tabbrowser/TabsList.sys.mjs b/browser/components/tabbrowser/TabsList.sys.mjs
+index 20a543dede6bf4428c8af19c5d0589788ddd8eaa..27a378e70f5b280b720c95ba8dac2cc4e88985be 100644
+--- a/browser/components/tabbrowser/TabsList.sys.mjs
++++ b/browser/components/tabbrowser/TabsList.sys.mjs
+@@ -87,7 +87,7 @@ class TabsListBase {
+ /** @type {function(MozTabbrowserTab):boolean} */
+ this.filterFn = onlyHiddenTabs
+ ? tab => filterFn(tab) && tab.hidden
+- : filterFn;
++ : tab => !tab.hasAttribute("zen-empty-tab") && filterFn(tab);
+ /** @type {Element} */
+ this.containerNode = containerNode;
+ /** @type {Element|null} */
diff --git a/src/browser/components/tabbrowser/content/tab-js.patch b/src/browser/components/tabbrowser/content/tab-js.patch
index 55459a9d4..997098854 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 fd2465046407261e8c29b4cd3d56122d232e701c..108bc7eae78898bf8a84ddadbacca2d6e64a457d 100644
+index 425aaf8c8e4adf1507eb0d8ded671f8295544b04..12988986c4cf00990c1d1b2e4be362efc001afdd 100644
--- a/browser/components/tabbrowser/content/tab.js
+++ b/browser/components/tabbrowser/content/tab.js
@@ -21,6 +21,7 @@
@@ -31,7 +31,7 @@ index fd2465046407261e8c29b4cd3d56122d232e701c..108bc7eae78898bf8a84ddadbacca2d6
"fadein,pinned,busy,progress,selected=visuallyselected",
".tab-icon-pending":
@@ -93,9 +96,9 @@
- "src=image,triggeringprincipal=iconloadingprincipal,requestcontextid,fadein,pinned,selected=visuallyselected,busy,crashed,sharing,pictureinpicture,pending,discarded",
+ "src=image,requestcontextid,fadein,pinned,selected=visuallyselected,busy,crashed,sharing,pictureinpicture,pending,discarded",
".tab-sharing-icon-overlay": "sharing,selected=visuallyselected,pinned",
".tab-icon-overlay":
- "sharing,pictureinpicture,crashed,busy,soundplaying,soundplaying-scheduledremoval,pinned,muted,blocked,selected=visuallyselected,activemedia-blocked",
@@ -65,7 +65,7 @@ index fd2465046407261e8c29b4cd3d56122d232e701c..108bc7eae78898bf8a84ddadbacca2d6
+ }
+
+ // Selected tabs are always visible
-+ if ((this.selected || this.multiselected || this.hasAttribute("folder-active")) && !this.hasAttribute("was-folder-active")) return true;
++ if (this.selected || this.multiselected || this.hasAttribute("folder-active")) return true;
+ // Recursively check all parent groups
+ let currentParent = this.group;
+ while (currentParent) {
@@ -101,7 +101,7 @@ index fd2465046407261e8c29b4cd3d56122d232e701c..108bc7eae78898bf8a84ddadbacca2d6
}
return null;
}
-@@ -459,6 +475,8 @@
+@@ -468,6 +484,8 @@
this.style.MozUserFocus = "ignore";
} else if (
event.target.classList.contains("tab-close-button") ||
@@ -110,7 +110,7 @@ index fd2465046407261e8c29b4cd3d56122d232e701c..108bc7eae78898bf8a84ddadbacca2d6
event.target.classList.contains("tab-icon-overlay") ||
event.target.classList.contains("tab-audio-button")
) {
-@@ -513,6 +531,10 @@
+@@ -522,6 +540,10 @@
this.style.MozUserFocus = "";
}
@@ -121,7 +121,7 @@ index fd2465046407261e8c29b4cd3d56122d232e701c..108bc7eae78898bf8a84ddadbacca2d6
on_click(event) {
if (event.button != 0) {
return;
-@@ -561,6 +583,7 @@
+@@ -570,6 +592,7 @@
)
);
} else {
@@ -129,7 +129,7 @@ index fd2465046407261e8c29b4cd3d56122d232e701c..108bc7eae78898bf8a84ddadbacca2d6
gBrowser.removeTab(this, {
animate: true,
triggeringEvent: event,
-@@ -573,6 +596,14 @@
+@@ -582,6 +605,14 @@
// (see tabbrowser-tabs 'click' handler).
gBrowser.tabContainer._blockDblClick = true;
}
@@ -138,13 +138,13 @@ index fd2465046407261e8c29b4cd3d56122d232e701c..108bc7eae78898bf8a84ddadbacca2d6
+ gZenPinnedTabManager._onTabResetPinButton(event, this, 'reset');
+ gBrowser.tabContainer._blockDblClick = true;
+ } else if (event.target.classList.contains("tab-reset-button")) {
-+ gZenPinnedTabManager._onCloseTabShortcut(event, this);
++ gZenPinnedTabManager.onCloseTabShortcut(event, this);
+ gBrowser.tabContainer._blockDblClick = true;
+ }
}
on_dblclick(event) {
-@@ -596,6 +627,8 @@
+@@ -605,6 +636,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 6494a3137..11561149a 100644
--- a/src/browser/components/tabbrowser/content/tabbrowser-js.patch
+++ b/src/browser/components/tabbrowser/content/tabbrowser-js.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
-index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80ed9d2317a 100644
+index c099e8646b9341a3ff55bf394037c8fc2769969b..0d524a0519bbbdf304a594d1fb56c394b7dbc6a7 100644
--- a/browser/components/tabbrowser/content/tabbrowser.js
+++ b/browser/components/tabbrowser/content/tabbrowser.js
-@@ -427,15 +427,64 @@
+@@ -432,15 +432,64 @@
return this.tabContainer.visibleTabs;
}
@@ -69,7 +69,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
set selectedTab(val) {
if (
gSharedTabWarning.willShowSharedTabWarning(val) ||
-@@ -583,6 +632,7 @@
+@@ -588,6 +637,7 @@
this.tabpanels.appendChild(panel);
let tab = this.tabs[0];
@@ -77,22 +77,26 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
tab.linkedPanel = uniqueId;
this._selectedTab = tab;
this._selectedBrowser = browser;
-@@ -868,9 +918,13 @@
+@@ -873,13 +923,17 @@
}
this.showTab(aTab);
+ const handled = gZenFolders.handleTabPin(aTab);
+ if (!handled) {
+ this.ungroupTab(aTab);
- this.#handleTabMove(aTab, () =>
-- this.pinnedTabsContainer.appendChild(aTab)
+ this.#handleTabMove(aTab, () => {
+ let periphery = document.getElementById(
+ "pinned-tabs-container-periphery"
+ );
+ // If periphery is null, append to end
+- this.pinnedTabsContainer.insertBefore(aTab, periphery);
+ aTab.hasAttribute("zen-essential") ? gZenWorkspaces.getEssentialsSection(aTab).appendChild(aTab) : this.pinnedTabsContainer.insertBefore(aTab, this.pinnedTabsContainer.lastChild)
- );
+ });
+ }
aTab.setAttribute("pinned", "true");
this._updateTabBarForPinnedTabs();
-@@ -883,11 +937,15 @@
+@@ -892,11 +946,15 @@
}
this.#handleTabMove(aTab, () => {
@@ -109,7 +113,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
});
aTab.style.marginInlineStart = "";
-@@ -1065,6 +1123,8 @@
+@@ -1073,6 +1131,8 @@
let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"];
@@ -117,8 +121,8 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
+ gZenPinnedTabManager.onTabIconChanged(aTab, aIconURL);
if (
aIconURL &&
- !aLoadingPrincipal &&
-@@ -1075,6 +1135,9 @@
+ !LOCAL_PROTOCOLS.some(protocol => aIconURL.startsWith(protocol))
+@@ -1082,6 +1142,9 @@
);
return;
}
@@ -128,7 +132,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
let browser = this.getBrowserForTab(aTab);
browser.mIconURL = aIconURL;
-@@ -1333,6 +1396,7 @@
+@@ -1445,6 +1508,7 @@
if (!this._previewMode) {
newTab.recordTimeFromUnloadToReload();
newTab.updateLastAccessed();
@@ -136,7 +140,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
oldTab.updateLastAccessed();
// if this is the foreground window, update the last-seen timestamps.
if (this.ownerGlobal == BrowserWindowTracker.getTopWindow()) {
-@@ -1485,6 +1549,9 @@
+@@ -1597,6 +1661,9 @@
}
let activeEl = document.activeElement;
@@ -146,7 +150,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
// If focus is on the old tab, move it to the new tab.
if (activeEl == oldTab) {
newTab.focus();
-@@ -1808,7 +1875,8 @@
+@@ -1920,7 +1987,8 @@
}
_setTabLabel(aTab, aLabel, { beforeTabOpen, isContentTitle, isURL } = {}) {
@@ -156,7 +160,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
return false;
}
-@@ -1916,7 +1984,7 @@
+@@ -2028,7 +2096,7 @@
newIndex = this.selectedTab._tPos + 1;
}
@@ -165,7 +169,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
if (this.isTabGroupLabel(targetTab)) {
throw new Error(
"Replacing a tab group label with a tab is not supported"
-@@ -2191,6 +2259,7 @@
+@@ -2303,6 +2371,7 @@
uriIsAboutBlank,
userContextId,
skipLoad,
@@ -173,7 +177,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
} = {}) {
let b = document.createXULElement("browser");
// Use the JSM global to create the permanentKey, so that if the
-@@ -2264,8 +2333,7 @@
+@@ -2376,8 +2445,7 @@
// we use a different attribute name for this?
b.setAttribute("name", name);
}
@@ -183,7 +187,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
b.setAttribute("transparent", "true");
}
-@@ -2430,7 +2498,7 @@
+@@ -2542,7 +2610,7 @@
let panel = this.getPanel(browser);
let uniqueId = this._generateUniquePanelID();
@@ -192,7 +196,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
aTab.linkedPanel = uniqueId;
// Inject the into the DOM if necessary.
-@@ -2489,8 +2557,8 @@
+@@ -2601,8 +2669,8 @@
// If we transitioned from one browser to two browsers, we need to set
// hasSiblings=false on both the existing browser and the new browser.
if (this.tabs.length == 2) {
@@ -203,7 +207,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
} else {
aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1;
}
-@@ -2654,7 +2722,6 @@
+@@ -2779,7 +2847,6 @@
this.selectedTab = this.addTrustedTab(BROWSER_NEW_TAB_URL, {
tabIndex: tab._tPos + 1,
userContextId: tab.userContextId,
@@ -211,7 +215,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
focusUrlBar: true,
});
resolve(this.selectedBrowser);
-@@ -2734,6 +2801,8 @@
+@@ -2859,6 +2926,8 @@
schemelessInput,
hasValidUserGestureActivation = false,
textDirectiveUserActivation = false,
@@ -220,7 +224,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
} = {}
) {
// all callers of addTab that pass a params object need to pass
-@@ -2744,6 +2813,12 @@
+@@ -2869,6 +2938,12 @@
);
}
@@ -233,7 +237,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
if (!UserInteraction.running("browser.tabs.opening", window)) {
UserInteraction.start("browser.tabs.opening", "initting", window);
}
-@@ -2807,6 +2882,19 @@
+@@ -2932,6 +3007,19 @@
noInitialLabel,
skipBackgroundNotify,
});
@@ -253,7 +257,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
if (insertTab) {
// Insert the tab into the tab container in the correct position.
this.#insertTabAtIndex(t, {
-@@ -2815,6 +2903,7 @@
+@@ -2940,6 +3028,7 @@
ownerTab,
openerTab,
pinned,
@@ -261,7 +265,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
bulkOrderedOpen,
tabGroup: tabGroup ?? openerTab?.group,
});
-@@ -2833,6 +2922,7 @@
+@@ -2958,6 +3047,7 @@
openWindowInfo,
skipLoad,
triggeringRemoteType,
@@ -269,7 +273,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
}));
if (focusUrlBar) {
-@@ -2953,6 +3043,12 @@
+@@ -3078,6 +3168,12 @@
}
}
@@ -282,7 +286,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
// Additionally send pinned tab events
if (pinned) {
this.#notifyPinnedStatus(t);
-@@ -3041,10 +3137,10 @@
+@@ -3248,10 +3344,10 @@
isAdoptingGroup = false,
isUserTriggered = false,
telemetryUserCreateSource = "unknown",
@@ -294,7 +298,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
}
if (!color) {
-@@ -3065,9 +3161,14 @@
+@@ -3272,9 +3368,14 @@
label,
isAdoptingGroup
);
@@ -311,7 +315,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
);
group.addTabs(tabs);
-@@ -3188,7 +3289,7 @@
+@@ -3395,7 +3496,7 @@
}
this.#handleTabMove(tab, () =>
@@ -320,7 +324,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
);
}
-@@ -3390,6 +3491,7 @@
+@@ -3597,6 +3698,7 @@
openWindowInfo,
skipLoad,
triggeringRemoteType,
@@ -328,7 +332,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
}
) {
// If we don't have a preferred remote type (or it is `NOT_REMOTE`), and
-@@ -3459,6 +3561,7 @@
+@@ -3666,6 +3768,7 @@
openWindowInfo,
name,
skipLoad,
@@ -336,7 +340,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
});
}
-@@ -3646,7 +3749,7 @@
+@@ -3853,7 +3956,7 @@
// Add a new tab if needed.
if (!tab) {
let createLazyBrowser =
@@ -345,7 +349,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
let url = "about:blank";
if (tabData.entries?.length) {
-@@ -3683,8 +3786,10 @@
+@@ -3890,8 +3993,10 @@
insertTab: false,
skipLoad: true,
preferredRemoteType,
@@ -357,7 +361,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
if (select) {
tabToSelect = tab;
}
-@@ -3696,7 +3801,8 @@
+@@ -3903,7 +4008,8 @@
this.pinTab(tab);
// Then ensure all the tab open/pinning information is sent.
this._fireTabOpen(tab, {});
@@ -367,7 +371,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
let { groupId } = tabData;
const tabGroup = tabGroupWorkingData.get(groupId);
// if a tab refers to a tab group we don't know, skip any group
-@@ -3710,7 +3816,10 @@
+@@ -3917,7 +4023,10 @@
tabGroup.stateData.id,
tabGroup.stateData.color,
tabGroup.stateData.collapsed,
@@ -379,7 +383,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
);
tabsFragment.appendChild(tabGroup.node);
}
-@@ -3755,9 +3864,23 @@
+@@ -3962,9 +4071,23 @@
// to remove the old selected tab.
if (tabToSelect) {
let leftoverTab = this.selectedTab;
@@ -403,7 +407,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
if (tabs.length > 1 || !tabs[0].selected) {
this._updateTabsAfterInsert();
-@@ -3948,11 +4071,14 @@
+@@ -4155,11 +4278,14 @@
if (ownerTab) {
tab.owner = ownerTab;
}
@@ -419,7 +423,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
if (
!bulkOrderedOpen &&
((openerTab &&
-@@ -3964,7 +4090,7 @@
+@@ -4171,7 +4297,7 @@
let lastRelatedTab =
openerTab && this._lastRelatedTabMap.get(openerTab);
let previousTab = lastRelatedTab || openerTab || this.selectedTab;
@@ -428,7 +432,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
tabGroup = previousTab.group;
}
if (
-@@ -3975,7 +4101,7 @@
+@@ -4182,7 +4308,7 @@
) {
elementIndex = Infinity;
} else if (previousTab.visible) {
@@ -437,7 +441,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
} else if (previousTab == FirefoxViewHandler.tab) {
elementIndex = 0;
}
-@@ -4003,14 +4129,14 @@
+@@ -4210,14 +4336,14 @@
}
// Ensure index is within bounds.
if (tab.pinned) {
@@ -456,7 +460,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
if (pinned && !itemAfter?.pinned) {
itemAfter = null;
-@@ -4021,7 +4147,7 @@
+@@ -4228,7 +4354,7 @@
this.tabContainer._invalidateCachedTabs();
@@ -465,7 +469,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
if (this.isTab(itemAfter) && itemAfter.group == tabGroup) {
// Place at the front of, or between tabs in, the same tab group
this.tabContainer.insertBefore(tab, itemAfter);
-@@ -4057,6 +4183,7 @@
+@@ -4264,6 +4390,7 @@
if (pinned) {
this._updateTabBarForPinnedTabs();
}
@@ -473,7 +477,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
TabBarVisibility.update();
}
-@@ -4346,6 +4473,9 @@
+@@ -4553,6 +4680,9 @@
return;
}
@@ -483,7 +487,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
this.removeTabs(selectedTabs, { isUserTriggered, telemetrySource });
}
-@@ -4607,6 +4737,7 @@
+@@ -4814,6 +4944,7 @@
telemetrySource,
} = {}
) {
@@ -491,7 +495,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
// When 'closeWindowWithLastTab' pref is enabled, closing all tabs
// can be considered equivalent to closing the window.
if (
-@@ -4696,6 +4827,7 @@
+@@ -4903,6 +5034,7 @@
if (lastToClose) {
this.removeTab(lastToClose, aParams);
}
@@ -499,7 +503,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
} catch (e) {
console.error(e);
}
-@@ -4734,6 +4866,12 @@
+@@ -4941,6 +5073,12 @@
aTab._closeTimeNoAnimTimerId = Glean.browserTabclose.timeNoAnim.start();
}
@@ -512,7 +516,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
// Handle requests for synchronously removing an already
// asynchronously closing tab.
if (!animate && aTab.closing) {
-@@ -4748,6 +4886,9 @@
+@@ -4955,6 +5093,9 @@
// state).
let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width;
let isLastTab = this.#isLastTabInWindow(aTab);
@@ -522,7 +526,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
if (
!this._beginRemoveTab(aTab, {
closeWindowFastpath: true,
-@@ -4796,7 +4937,13 @@
+@@ -5003,7 +5144,13 @@
// We're not animating, so we can cancel the animation stopwatch.
Glean.browserTabclose.timeAnim.cancel(aTab._closeTimeAnimTimerId);
aTab._closeTimeAnimTimerId = null;
@@ -537,7 +541,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
return;
}
-@@ -4930,7 +5077,7 @@
+@@ -5137,7 +5284,7 @@
closeWindowWithLastTab != null
? closeWindowWithLastTab
: !window.toolbar.visible ||
@@ -546,7 +550,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
if (closeWindow) {
// We've already called beforeunload on all the relevant tabs if we get here,
-@@ -4954,6 +5101,7 @@
+@@ -5161,6 +5308,7 @@
newTab = true;
}
@@ -554,7 +558,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
aTab._endRemoveArgs = [closeWindow, newTab];
// swapBrowsersAndCloseOther will take care of closing the window without animation.
-@@ -4994,13 +5142,7 @@
+@@ -5201,13 +5349,7 @@
aTab._mouseleave();
if (newTab) {
@@ -569,7 +573,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
} else {
TabBarVisibility.update();
}
-@@ -5133,6 +5275,7 @@
+@@ -5340,6 +5482,7 @@
this.tabs[i]._tPos = i;
}
@@ -577,7 +581,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
if (!this._windowIsClosing) {
// update tab close buttons state
this.tabContainer._updateCloseButtons();
-@@ -5345,6 +5488,7 @@
+@@ -5552,6 +5695,7 @@
}
let excludeTabs = new Set(aExcludeTabs);
@@ -585,7 +589,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
// If this tab has a successor, it should be selectable, since
// hiding or closing a tab removes that tab as a successor.
-@@ -5357,13 +5501,13 @@
+@@ -5564,13 +5708,13 @@
!excludeTabs.has(aTab.owner) &&
Services.prefs.getBoolPref("browser.tabs.selectOwnerOnClose")
) {
@@ -601,7 +605,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
);
let tab = this.tabContainer.findNextTab(aTab, {
-@@ -5379,7 +5523,7 @@
+@@ -5586,7 +5730,7 @@
}
if (tab) {
@@ -610,7 +614,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
}
// If no qualifying visible tab was found, see if there is a tab in
-@@ -5400,7 +5544,7 @@
+@@ -5607,7 +5751,7 @@
});
}
@@ -619,7 +623,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
}
_blurTab(aTab) {
-@@ -5802,10 +5946,10 @@
+@@ -6013,10 +6157,10 @@
SessionStore.deleteCustomTabValue(aTab, "hiddenBy");
}
@@ -632,7 +636,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
aTab.selected ||
aTab.closing ||
// Tabs that are sharing the screen, microphone or camera cannot be hidden.
-@@ -5864,6 +6008,7 @@
+@@ -6075,6 +6219,7 @@
* @param {MozTabbrowserTab|MozTabbrowserTabGroup|MozTabbrowserTabGroup.labelElement} aTab
*/
replaceTabWithWindow(aTab, aOptions) {
@@ -640,7 +644,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
if (this.tabs.length == 1) {
return null;
}
-@@ -5997,7 +6142,7 @@
+@@ -6208,7 +6353,7 @@
* `true` if element is a ``
*/
isTabGroup(element) {
@@ -649,7 +653,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
}
/**
-@@ -6073,8 +6218,8 @@
+@@ -6284,8 +6429,8 @@
}
// Don't allow mixing pinned and unpinned tabs.
@@ -660,7 +664,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
} else {
tabIndex = Math.max(tabIndex, this.pinnedTabCount);
}
-@@ -6100,10 +6245,16 @@
+@@ -6311,10 +6456,16 @@
this.#handleTabMove(
element,
() => {
@@ -679,7 +683,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
if (neighbor && this.isTab(element) && tabIndex > element._tPos) {
neighbor.after(element);
} else {
-@@ -6161,23 +6312,28 @@
+@@ -6372,23 +6523,28 @@
#moveTabNextTo(element, targetElement, moveBefore = false, metricsContext) {
if (this.isTabGroupLabel(targetElement)) {
targetElement = targetElement.group;
@@ -714,7 +718,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
} 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
-@@ -6190,14 +6346,34 @@
+@@ -6401,14 +6557,34 @@
// move the tab group right before the first unpinned tab.
// 4. Moving a tab group and the first unpinned tab is grouped:
// move the tab group right before the first unpinned tab's tab group.
@@ -750,7 +754,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
element.pinned
? this.tabContainer.pinnedTabsContainer
: this.tabContainer;
-@@ -6206,7 +6382,7 @@
+@@ -6417,7 +6593,7 @@
element,
() => {
if (moveBefore) {
@@ -759,7 +763,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
} else if (targetElement) {
targetElement.after(element);
} else {
-@@ -6252,10 +6428,10 @@
+@@ -6489,10 +6665,10 @@
* @param {TabMetricsContext} [metricsContext]
*/
moveTabToGroup(aTab, aGroup, metricsContext) {
@@ -772,7 +776,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
return;
}
if (aTab.group && aTab.group.id === aGroup.id) {
-@@ -6285,6 +6461,7 @@
+@@ -6522,6 +6698,7 @@
let state = {
tabIndex: tab._tPos,
@@ -780,7 +784,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
};
if (tab.visible) {
state.elementIndex = tab.elementIndex;
-@@ -6311,7 +6488,7 @@
+@@ -6548,7 +6725,7 @@
let changedTabGroup =
previousTabState.tabGroupId != currentTabState.tabGroupId;
@@ -789,7 +793,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
tab.dispatchEvent(
new CustomEvent("TabMove", {
bubbles: true,
-@@ -6348,6 +6525,10 @@
+@@ -6585,6 +6762,10 @@
moveActionCallback();
@@ -800,7 +804,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
// Clear tabs cache after moving nodes because the order of tabs may have
// changed.
this.tabContainer._invalidateCachedTabs();
-@@ -7249,7 +7430,7 @@
+@@ -7486,7 +7667,7 @@
// preventDefault(). It will still raise the window if appropriate.
break;
}
@@ -809,7 +813,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
window.focus();
aEvent.preventDefault();
break;
-@@ -7264,7 +7445,6 @@
+@@ -7501,7 +7682,6 @@
}
case "TabGroupCollapse":
aEvent.target.tabs.forEach(tab => {
@@ -817,7 +821,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
});
break;
case "TabGroupCreateByUser":
-@@ -8199,6 +8379,7 @@
+@@ -8442,6 +8622,7 @@
aWebProgress.isTopLevel
) {
this.mTab.setAttribute("busy", "true");
@@ -825,7 +829,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
gBrowser._tabAttrModified(this.mTab, ["busy"]);
this.mTab._notselectedsinceload = !this.mTab.selected;
}
-@@ -9200,7 +9381,7 @@ var TabContextMenu = {
+@@ -9443,7 +9624,7 @@ var TabContextMenu = {
);
contextUnpinSelectedTabs.hidden =
!this.contextTab.pinned || !this.multiselected;
@@ -834,7 +838,7 @@ index 3204f253c23551650991d3385dd256d55892a012..7c30015ac4591fdb97426521ae87b80e
// Build Ask Chat items
TabContextMenu.GenAI.buildTabMenu(
document.getElementById("context_askChat"),
-@@ -9520,6 +9701,7 @@ var TabContextMenu = {
+@@ -9763,6 +9944,7 @@ var TabContextMenu = {
)
);
} else {
diff --git a/src/browser/components/tabbrowser/content/tabgroup-js.patch b/src/browser/components/tabbrowser/content/tabgroup-js.patch
index 34d48759b..2c3e80263 100644
--- a/src/browser/components/tabbrowser/content/tabgroup-js.patch
+++ b/src/browser/components/tabbrowser/content/tabgroup-js.patch
@@ -1,24 +1,23 @@
diff --git a/browser/components/tabbrowser/content/tabgroup.js b/browser/components/tabbrowser/content/tabgroup.js
-index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e8532174e2a7cf 100644
+index 1b4f6bf4ed6556492f84476d33e9103fbb1c74e9..77bd8738db6f2e65c2bfcae8347b424098ba3e7b 100644
--- a/browser/components/tabbrowser/content/tabgroup.js
+++ b/browser/components/tabbrowser/content/tabgroup.js
-@@ -13,10 +13,12 @@
-
+@@ -14,11 +14,11 @@
class MozTabbrowserTabGroup extends MozXULElement {
static markup = `
--
-+
-
--
+
+-
+
+-
+
-
-+
+
+
+
-@@ -57,20 +59,36 @@
+@@ -69,20 +69,36 @@
}
connectedCallback() {
@@ -59,10 +58,10 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321
this._initialized = true;
this.saveOnWindowClose = true;
-@@ -99,11 +117,14 @@
+@@ -114,11 +130,14 @@
- this.#labelElement.addEventListener("mouseover", this);
- this.#labelElement.addEventListener("mouseout", this);
+ this.#labelContainerElement.addEventListener("mouseover", this);
+ this.#labelContainerElement.addEventListener("mouseout", this);
- this.#labelElement.addEventListener("contextmenu", e => {
- e.preventDefault();
- gBrowser.tabGroupMenu.openEditModal(this);
@@ -79,7 +78,7 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321
this.#updateLabelAriaAttributes();
this.#updateCollapsedAriaAttributes();
-@@ -129,6 +150,8 @@
+@@ -144,6 +163,8 @@
// mounts after getting created by `Tabbrowser.adoptTabGroup`.
this.#wasCreatedByAdoption = false;
}
@@ -88,7 +87,7 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321
resetDefaultGroupName = () => {
this.#defaultGroupName = "";
-@@ -213,7 +236,10 @@
+@@ -228,7 +249,10 @@
}
});
}
@@ -100,7 +99,7 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321
}
get color() {
-@@ -307,6 +333,9 @@
+@@ -322,6 +346,9 @@
}
set collapsed(val) {
@@ -110,7 +109,7 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321
if (!!val == this.collapsed) {
return;
}
-@@ -364,7 +393,6 @@
+@@ -399,7 +426,6 @@
tabGroupName,
})
.then(result => {
@@ -118,7 +117,7 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321
});
}
-@@ -383,7 +411,57 @@
+@@ -418,7 +444,57 @@
* @returns {MozTabbrowserTab[]}
*/
get tabs() {
@@ -177,7 +176,7 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321
}
/**
-@@ -442,7 +520,6 @@
+@@ -498,7 +574,6 @@
addTabs(tabs, metricsContext) {
for (let tab of tabs) {
if (tab.pinned) {
@@ -185,7 +184,7 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321
}
let tabToMove =
this.ownerGlobal === tab.ownerGlobal
-@@ -505,7 +582,7 @@
+@@ -561,7 +636,7 @@
*/
on_click(event) {
let isToggleElement =
@@ -194,7 +193,7 @@ index c0cb11590d6dfbcf6fa49ef5e10c6d3877191d1f..cd98bd2401e4618b003c184108e85321
event.target === this.#overflowCountLabel;
if (isToggleElement && event.button === 0) {
event.preventDefault();
-@@ -570,5 +647,6 @@
+@@ -630,5 +705,6 @@
}
}
diff --git a/src/browser/components/tabbrowser/content/tabs-js.patch b/src/browser/components/tabbrowser/content/tabs-js.patch
index 3f0fd1ff9..ec1bebfc1 100644
--- a/src/browser/components/tabbrowser/content/tabs-js.patch
+++ b/src/browser/components/tabbrowser/content/tabs-js.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js
-index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536322388ea 100644
+index 1425607ef87d6c28fb676e722617edfb51ba12a1..97cdeaf7cde41f39d70bd50ac8ca78bec02d253a 100644
--- a/browser/components/tabbrowser/content/tabs.js
+++ b/browser/components/tabbrowser/content/tabs.js
@@ -44,6 +44,9 @@
@@ -12,7 +12,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
if (isTab(element)) {
return element;
}
-@@ -411,7 +414,7 @@
+@@ -423,7 +426,7 @@
// and we're not hitting the scroll buttons.
if (
event.button != 0 ||
@@ -21,7 +21,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
event.composedTarget.localName == "toolbarbutton"
) {
return;
-@@ -492,7 +495,6 @@
+@@ -504,7 +507,6 @@
});
}
} else if (isTabGroupLabel(event.target)) {
@@ -29,7 +29,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
} else if (
event.originalTarget.closest("scrollbox") &&
!Services.prefs.getBoolPref(
-@@ -528,6 +530,9 @@
+@@ -540,6 +542,9 @@
}
on_keydown(event) {
@@ -39,7 +39,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
let { altKey, shiftKey } = event;
let [accel, nonAccel] =
AppConstants.platform == "macosx"
-@@ -765,7 +770,7 @@
+@@ -777,7 +782,7 @@
if (this.#isContainerVerticalPinnedGrid(tab)) {
// In expanded vertical mode, the max number of pinned tabs per row is dynamic
// Set this before adjusting dragged tab's position
@@ -48,7 +48,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
let tabsPerRow = 0;
let position = RTL_UI
? window.windowUtils.getBoundsWithoutFlushing(
-@@ -930,7 +935,7 @@
+@@ -942,7 +947,7 @@
let dropEffect = this.getDropEffectForTabDrag(event);
let isMovingInTabStrip = !fromTabList && dropEffect == "move";
let collapseTabGroupDuringDrag =
@@ -57,7 +57,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
tab._dragData = {
offsetX: this.verticalMode
-@@ -940,7 +945,7 @@
+@@ -952,7 +957,7 @@
? event.screenY - window.screenY - tabOffset
: event.screenY - window.screenY,
scrollPos:
@@ -66,15 +66,15 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
? this.pinnedTabsContainer.scrollPosition
: this.arrowScrollbox.scrollPosition,
screenX: event.screenX,
-@@ -969,6 +974,7 @@
+@@ -981,6 +986,7 @@
if (collapseTabGroupDuringDrag) {
tab.group.collapsed = true;
-+ gZenFolders.collapseVisibleTab(tab.group);
++ gZenFolders.animateGroupMove(tab.group);
}
}
}
-@@ -1015,6 +1021,10 @@
+@@ -1027,6 +1033,10 @@
}
let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0);
@@ -85,7 +85,17 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
if (
(dropEffect == "move" || dropEffect == "copy") &&
document == draggedTab.ownerDocument &&
-@@ -1196,6 +1206,18 @@
+@@ -1154,7 +1164,8 @@
+ isTabGroupLabel(draggedTab) &&
+ draggedTab._dragData?.expandGroupOnDrop
+ ) {
+- draggedTab.group.collapsed = false;
++ draggedTab.group.collapsed = draggedTab.group.hasAttribute("has-active");
++ gZenFolders.animateGroupMove(draggedTab.group, true);
+ }
+ }
+
+@@ -1208,6 +1219,18 @@
this._tabDropIndicator.hidden = true;
event.stopPropagation();
@@ -104,7 +114,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
if (draggedTab && dropEffect == "copy") {
let duplicatedDraggedTab;
let duplicatedTabs = [];
-@@ -1220,8 +1242,9 @@
+@@ -1232,8 +1255,9 @@
let translateOffsetY = oldTranslateY % tabHeight;
let newTranslateX = oldTranslateX - translateOffsetX;
let newTranslateY = oldTranslateY - translateOffsetY;
@@ -116,7 +126,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
if (this.#isContainerVerticalPinnedGrid(draggedTab)) {
// Update both translate axis for pinned vertical expanded tabs
-@@ -1237,8 +1260,8 @@
+@@ -1249,8 +1273,8 @@
}
} else {
let tabs = this.ariaFocusableItems.slice(
@@ -127,7 +137,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
);
let size = this.verticalMode ? "height" : "width";
let screenAxis = this.verticalMode ? "screenY" : "screenX";
-@@ -1287,11 +1310,13 @@
+@@ -1299,11 +1323,13 @@
this.dragToPinPromoCard,
];
let shouldPin =
@@ -141,7 +151,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
isTab(draggedTab) &&
draggedTab.pinned &&
this.arrowScrollbox.contains(event.target);
-@@ -1309,6 +1334,7 @@
+@@ -1321,6 +1347,7 @@
(oldTranslateY && oldTranslateY != newTranslateY);
} else if (this.verticalMode) {
shouldTranslate &&= oldTranslateY && oldTranslateY != newTranslateY;
@@ -149,7 +159,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
} else {
shouldTranslate &&= oldTranslateX && oldTranslateX != newTranslateX;
}
-@@ -1503,6 +1529,7 @@
+@@ -1515,6 +1542,7 @@
let nextItem = this.ariaFocusableItems[newIndex];
let tabGroup = isTab(nextItem) && nextItem.group;
@@ -157,7 +167,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
gBrowser.loadTabs(urls, {
inBackground,
replace,
-@@ -1541,6 +1568,17 @@
+@@ -1553,6 +1581,17 @@
}
this.#resetTabsAfterDrop(draggedTab.ownerDocument);
@@ -175,7 +185,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
if (
dt.mozUserCancelled ||
dt.dropEffect != "none" ||
-@@ -1707,7 +1745,6 @@
+@@ -1719,7 +1758,6 @@
this.toggleAttribute("overflow", true);
this._updateCloseButtons();
@@ -183,7 +193,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
document
.getElementById("tab-preview-panel")
-@@ -1765,7 +1802,7 @@
+@@ -1777,7 +1815,7 @@
}
get newTabButton() {
@@ -192,7 +202,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
}
get verticalMode() {
-@@ -1781,6 +1818,7 @@
+@@ -1793,6 +1831,7 @@
}
get overflowing() {
@@ -200,28 +210,25 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
return this.hasAttribute("overflow");
}
-@@ -1789,31 +1827,51 @@
- if (this.#allTabs) {
- return this.#allTabs;
+@@ -1806,29 +1845,54 @@
+ if (pinnedChildren?.at(-1)?.id == "pinned-tabs-container-periphery") {
+ pinnedChildren.pop();
}
-- // Remove temporary periphery element added at drag start.
-- let pinnedChildren = Array.from(this.pinnedTabsContainer.children);
-- if (pinnedChildren?.at(-1)?.id == "pinned-tabs-container-periphery") {
-- pinnedChildren.pop();
-- }
- let unpinnedChildren = Array.from(this.arrowScrollbox.children);
-- // remove arrowScrollbox periphery element.
-- unpinnedChildren.pop();
--
-+ let children = gZenWorkspaces.tabboxChildren;
-+ children.pop();
- // explode tab groups
++ let unpinnedChildren = gZenWorkspaces.tabboxChildren;
+ // remove arrowScrollbox periphery element.
+ unpinnedChildren.pop();
+
+ // explode tab groups and split view wrappers
// Iterate backwards over the array to preserve indices while we modify
// things in place
- for (let i = unpinnedChildren.length - 1; i >= 0; i--) {
-- if (unpinnedChildren[i].tagName == "tab-group") {
+- if (
+- unpinnedChildren[i].tagName == "tab-group" ||
+- unpinnedChildren[i].tagName == "tab-split-view-wrapper"
+- ) {
- unpinnedChildren.splice(i, 1, ...unpinnedChildren[i].tabs);
-+ const pinnedTabs = [...gZenWorkspaces.getCurrentEssentialsContainer().children, ...this.pinnedTabsContainer.children];
++ const pinnedTabs = [...gZenWorkspaces.getCurrentEssentialsContainer().children, ...pinnedChildren];
+ const expandTabs = (tabs) => {
+ for (let i = tabs.length - 1; i >= 0; i--) {
+ const tab = tabs[i];
@@ -231,15 +238,13 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
+ // add the tabs in the group to the list
+ tabs.splice(i, 0, ...tab.tabs);
+ }
- }
- }
--
-- this.#allTabs = [...pinnedChildren, ...unpinnedChildren];
++ }
++ };
+ expandTabs(pinnedTabs);
-+ expandTabs(children);
++ expandTabs(unpinnedChildren);
+ const allTabs = [
+ ...pinnedTabs,
-+ ...children,
++ ...unpinnedChildren,
+ ];
+ const lastPinnedTabIdx = pinnedTabs.length - 1;
+ let i = 0;
@@ -254,21 +259,23 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
+ // remove the separator from the list
+ allTabs.splice(i, 1);
+ i--;
-+ }
+ }
+ i++;
-+ }
+ }
+-
+- this.#allTabs = [...pinnedChildren, ...unpinnedChildren];
+ this.#allTabs = allTabs;
return this.#allTabs;
}
get allGroups() {
-- let children = Array.from(this.arrowScrollbox.children);
+ let children = Array.from(this.arrowScrollbox.children);
- return children.filter(node => node.tagName == "tab-group");
+ return gZenWorkspaces.allTabGroups;
}
/**
-@@ -1880,29 +1938,23 @@
+@@ -1895,29 +1959,23 @@
let elementIndex = 0;
@@ -307,7 +314,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
}
}
-@@ -1914,6 +1966,7 @@
+@@ -1929,6 +1987,7 @@
_invalidateCachedTabs() {
this.#allTabs = null;
this._invalidateCachedVisibleTabs();
@@ -315,7 +322,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
}
_invalidateCachedVisibleTabs() {
-@@ -1929,8 +1982,8 @@
+@@ -1944,8 +2003,8 @@
#isContainerVerticalPinnedGrid(tab) {
return (
this.verticalMode &&
@@ -326,7 +333,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
!this.expandOnHover
);
}
-@@ -1946,7 +1999,7 @@
+@@ -1961,7 +2020,7 @@
if (node == null) {
// We have a container for non-tab elements at the end of the scrollbox.
@@ -335,7 +342,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
}
node.before(tab);
-@@ -2041,7 +2094,7 @@
+@@ -2056,7 +2115,7 @@
// There are separate "new tab" buttons for horizontal tabs toolbar, vertical tabs and
// for when the tab strip is overflowed (which is shared by vertical and horizontal tabs);
// Attach the long click popup to all of them.
@@ -344,7 +351,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
const newTab2 = this.newTabButton;
const newTabVertical = document.getElementById(
"vertical-tabs-newtab-button"
-@@ -2139,8 +2192,10 @@
+@@ -2156,8 +2215,10 @@
*/
_handleTabSelect(aInstant) {
let selectedTab = this.selectedItem;
@@ -355,16 +362,16 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
selectedTab._notselectedsinceload = false;
}
-@@ -2149,7 +2204,7 @@
+@@ -2166,7 +2227,7 @@
* @param {boolean} [shouldScrollInstantly=false]
*/
#ensureTabIsVisible(tab, shouldScrollInstantly = false) {
- let arrowScrollbox = tab.closest("arrowscrollbox");
+ let arrowScrollbox = this.arrowScrollbox;
- if (arrowScrollbox.overflowing) {
+ if (arrowScrollbox?.overflowing) {
arrowScrollbox.ensureElementIsVisible(tab, shouldScrollInstantly);
}
-@@ -2288,6 +2343,16 @@
+@@ -2305,6 +2366,16 @@
when the tab is first selected to be dragged.
*/
#updateTabStylesOnDrag(tab) {
@@ -381,7 +388,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
let isPinned = tab.pinned;
let numPinned = gBrowser.pinnedTabCount;
let allTabs = this.ariaFocusableItems;
-@@ -2540,7 +2605,7 @@
+@@ -2578,7 +2649,7 @@
return;
}
@@ -390,7 +397,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
let directionX = screenX > dragData.animLastScreenX;
let directionY = screenY > dragData.animLastScreenY;
-@@ -2549,6 +2614,8 @@
+@@ -2587,6 +2658,8 @@
let { width: tabWidth, height: tabHeight } =
draggedTab.getBoundingClientRect();
@@ -399,7 +406,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
let shiftSizeX = tabWidth * movingTabs.length;
let shiftSizeY = tabHeight;
dragData.tabWidth = tabWidth;
-@@ -2585,8 +2652,8 @@
+@@ -2623,8 +2696,8 @@
let lastBoundX =
lastTabInRow.screenX +
lastTabInRow.getBoundingClientRect().width -
@@ -410,9 +417,9 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
translateX = Math.min(Math.max(translateX, firstBoundX), lastBoundX);
translateY = Math.min(Math.max(translateY, firstBoundY), lastBoundY);
-@@ -2743,13 +2810,18 @@
-
+@@ -2782,13 +2855,18 @@
this.#clearDragOverGroupingTimer();
+ this.#clearPinnedDropIndicatorTimer();
- let isPinned = draggedTab.pinned;
- let numPinned = gBrowser.pinnedTabCount;
@@ -433,7 +440,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
if (this.#rtlMode) {
tabs.reverse();
-@@ -2760,7 +2832,7 @@
+@@ -2799,7 +2877,7 @@
let screenAxis = this.verticalMode ? "screenY" : "screenX";
let size = this.verticalMode ? "height" : "width";
let translateAxis = this.verticalMode ? "translateY" : "translateX";
@@ -442,7 +449,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
let tabSize = this.verticalMode ? tabHeight : tabWidth;
let translateX = event.screenX - dragData.screenX;
let translateY = event.screenY - dragData.screenY;
-@@ -2776,6 +2848,12 @@
+@@ -2815,6 +2893,12 @@
);
let lastMovingTab = movingTabs.at(-1);
let firstMovingTab = movingTabs[0];
@@ -455,7 +462,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
let endEdge = ele => ele[screenAxis] + bounds(ele)[size];
let lastMovingTabScreen = endEdge(lastMovingTab);
let firstMovingTabScreen = firstMovingTab[screenAxis];
-@@ -2790,6 +2868,11 @@
+@@ -2829,6 +2913,11 @@
let endBound = this.#rtlMode
? endEdge(this) - lastMovingTabScreen
: periphery[screenAxis] - 1 - lastMovingTabScreen;
@@ -467,7 +474,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
translate = Math.min(Math.max(translate, startBound), endBound);
// Center the tab under the cursor if the tab is not under the cursor while dragging
-@@ -2979,6 +3062,8 @@
+@@ -3018,6 +3107,8 @@
};
let dropElement = getOverlappedElement();
@@ -476,7 +483,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
let newDropElementIndex;
if (dropElement) {
-@@ -3060,7 +3145,7 @@
+@@ -3099,7 +3190,7 @@
? Services.prefs.getIntPref(
"browser.tabs.dragDrop.moveOverThresholdPercent"
) / 100
@@ -485,7 +492,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
moveOverThreshold = Math.min(1, Math.max(0, moveOverThreshold));
let shouldMoveOver = overlapPercent > moveOverThreshold;
if (logicalForward && shouldMoveOver) {
-@@ -3093,6 +3178,7 @@
+@@ -3132,6 +3223,7 @@
// If dragging a group over another group, don't make it look like it is
// possible to drop the dragged group inside the other group.
if (
@@ -493,7 +500,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
isTabGroupLabel(draggedTab) &&
dropElement?.group &&
(!dropElement.group.collapsed ||
-@@ -3119,20 +3205,13 @@
+@@ -3158,20 +3250,13 @@
let isOutOfBounds = isPinned
? dropElement.elementIndex >= numPinned
: dropElement.elementIndex < numPinned;
@@ -518,7 +525,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
let groupingDelay = Services.prefs.getIntPref(
"browser.tabs.dragDrop.createGroup.delayMS"
);
-@@ -3140,6 +3219,7 @@
+@@ -3179,6 +3264,7 @@
// When dragging tab(s) over an ungrouped tab, signal to the user
// that dropping the tab(s) will create a new tab group.
let shouldCreateGroupOnDrop =
@@ -526,7 +533,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
!movingTabsSet.has(dropElement) &&
isTab(dropElement) &&
!dropElement?.group &&
-@@ -3148,6 +3228,7 @@
+@@ -3187,6 +3273,7 @@
// When dragging tab(s) over a collapsed tab group label, signal to the
// user that dropping the tab(s) will add them to the group.
let shouldDropIntoCollapsedTabGroup =
@@ -534,7 +541,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
isTabGroupLabel(dropElement) &&
dropElement.group.collapsed &&
overlapPercent > dragOverGroupingThreshold;
-@@ -3192,19 +3273,14 @@
+@@ -3231,19 +3318,14 @@
dropElement = dropElementGroup;
colorCode = undefined;
} else if (isTabGroupLabel(dropElement)) {
@@ -562,7 +569,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
}
this.#setDragOverGroupColor(colorCode);
this.toggleAttribute("movingtab-addToGroup", colorCode);
-@@ -3223,11 +3299,11 @@
+@@ -3262,11 +3344,11 @@
dragData.dropElement = dropElement;
dragData.dropBefore = dropBefore;
dragData.animDropElementIndex = newDropElementIndex;
@@ -576,7 +583,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
continue;
}
-@@ -3346,12 +3422,14 @@
+@@ -3388,12 +3470,14 @@
element?.removeAttribute("dragover-groupTarget");
}
@@ -593,7 +600,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
for (let item of this.ariaFocusableItems) {
this.#resetGroupTarget(item);
-@@ -3394,16 +3472,15 @@
+@@ -3440,17 +3524,16 @@
tab.style.left = "";
tab.style.top = "";
tab.style.maxWidth = "";
@@ -607,12 +614,13 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
- label.style.height = "";
label.style.left = "";
label.style.top = "";
+ label.style.maxWidth = "";
- label.removeAttribute("dragtarget");
+ label.removeAttribute("zen-dragtarget");
}
let periphery = draggedTabDocument.getElementById(
"tabbrowser-arrowscrollbox-periphery"
-@@ -3475,7 +3552,7 @@
+@@ -3522,7 +3605,7 @@
let postTransitionCleanup = () => {
movingTab._moveTogetherSelectedTabsData.animate = false;
};
@@ -621,7 +629,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
postTransitionCleanup();
} else {
let onTransitionEnd = transitionendEvent => {
-@@ -3639,7 +3716,7 @@
+@@ -3686,7 +3769,7 @@
}
_notifyBackgroundTab(aTab) {
@@ -630,7 +638,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
return;
}
-@@ -3748,7 +3825,10 @@
+@@ -3795,7 +3878,10 @@
#getDragTarget(event, { ignoreSides = false } = {}) {
let { target } = event;
while (target) {
@@ -642,7 +650,7 @@ index c7557dad38db9ef02b981c46de9595df77cb67db..f45ecacd23179f06a436d5f3d372b536
break;
}
target = target.parentNode;
-@@ -3765,6 +3845,9 @@
+@@ -3812,6 +3898,9 @@
return null;
}
}
diff --git a/src/browser/components/urlbar/UrlbarController-sys-mjs.patch b/src/browser/components/urlbar/UrlbarController-sys-mjs.patch
index cd90f6116..8ad0e02f6 100644
--- a/src/browser/components/urlbar/UrlbarController-sys-mjs.patch
+++ b/src/browser/components/urlbar/UrlbarController-sys-mjs.patch
@@ -1,12 +1,20 @@
diff --git a/browser/components/urlbar/UrlbarController.sys.mjs b/browser/components/urlbar/UrlbarController.sys.mjs
-index 36e3ab4a5a153230bb488b66dda7e3e7c763ca23..81f2944b939ac0963c129f86aab0b55817349401 100644
+index a1faf7e4278c66865f267283515f22052769928d..297391205ab3cd96bed2e5a3e36a181c6da90098 100644
--- a/browser/components/urlbar/UrlbarController.sys.mjs
+++ b/browser/components/urlbar/UrlbarController.sys.mjs
-@@ -434,6 +434,8 @@ export class UrlbarController {
+@@ -297,7 +297,6 @@ export class UrlbarController {
+ const isMac = AppConstants.platform == "macosx";
+ // Handle readline/emacs-style navigation bindings on Mac.
+ if (
+- isMac &&
+ this.view.isOpen &&
+ event.ctrlKey &&
+ (event.key == "n" || event.key == "p")
+@@ -441,6 +440,8 @@ export class UrlbarController {
});
}
event.preventDefault();
-+ } else {
++ } else if (!this.input.value && !(event.ctrlKey || event.altKey || event.shiftKey)) {
+ this.browserWindow.gZenUIManager.enableCommandsMode(event);
}
break;
diff --git a/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch b/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch
index 91f5a08ac..eb7ef3cd2 100644
--- a/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch
+++ b/src/browser/components/urlbar/UrlbarInput-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/UrlbarInput.sys.mjs b/browser/components/urlbar/UrlbarInput.sys.mjs
-index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079774eed27 100644
+index afc7a6c6ddbf4cf5a5b27c0bd60577b833c63093..e31ad41ab28b2be67c25c2efc75e9dd1acfd896f 100644
--- a/browser/components/urlbar/UrlbarInput.sys.mjs
+++ b/browser/components/urlbar/UrlbarInput.sys.mjs
-@@ -74,6 +74,13 @@ ChromeUtils.defineLazyGetter(lazy, "logger", () =>
+@@ -76,6 +76,13 @@ ChromeUtils.defineLazyGetter(lazy, "logger", () =>
lazy.UrlbarUtils.getLogger({ prefix: "Input" })
);
@@ -16,7 +16,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
const DEFAULT_FORM_HISTORY_NAME = "searchbar-history";
const UNLIMITED_MAX_RESULTS = 99;
-@@ -355,7 +362,16 @@ export class UrlbarInput {
+@@ -437,7 +444,16 @@ export class UrlbarInput {
// See _on_select(). HTMLInputElement.select() dispatches a "select"
// event but does not set the primary selection.
this._suppressPrimaryAdjustment = true;
@@ -33,7 +33,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
this._suppressPrimaryAdjustment = false;
}
-@@ -431,6 +447,10 @@ export class UrlbarInput {
+@@ -513,6 +529,10 @@ export class UrlbarInput {
hideSearchTerms = false,
isSameDocument = false
) {
@@ -41,10 +41,10 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
+ return;
+ }
+
- // We only need to update the searchModeUI on tab switch conditionally
- // as we only persist searchMode with ScotchBonnet enabled.
- if (
-@@ -703,8 +723,16 @@ export class UrlbarInput {
+ if (!this.isAddressbar) {
+ throw new Error(
+ "Cannot set URI for UrlbarInput that is not an address bar"
+@@ -790,8 +810,16 @@ export class UrlbarInput {
return;
}
}
@@ -62,7 +62,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
}
/**
-@@ -1116,7 +1144,11 @@ export class UrlbarInput {
+@@ -1207,7 +1235,11 @@ export class UrlbarInput {
}
if (!this.#providesSearchMode(result)) {
@@ -75,11 +75,44 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
}
if (isCanonized) {
-@@ -2205,6 +2237,12 @@ export class UrlbarInput {
+@@ -2298,6 +2330,32 @@ export class UrlbarInput {
+ await this.#updateLayoutBreakoutDimensions();
+ }
+
++ zenFormatURLValue() {
++ return this.#lazy.valueFormatter._formatURL();
++ }
++
++ get zenUrlbarBehavior() {
++ if (this.document.documentElement.hasAttribute("inDOMFullscreen")) {
++ return "float";
++ }
++ return lazy.ZEN_URLBAR_BEHAVIOR;
++ }
++
++ get zenStrippedURI() {
++ let strippedURI = null;
++
++ // Error check occurs during isClipboardURIValid
++ let uri = this.window.gBrowser.currentURI;
++ try {
++ strippedURI = lazy.QueryStringStripper.stripForCopyOrShare(uri);
++ } catch (e) {
++ console.warn(`stripForCopyOrShare: ${e.message}`);
++ return [uri, lazy.ClipboardHelper];
++ }
++
++ return [strippedURI ? this.makeURIReadable(strippedURI) : uri, lazy.ClipboardHelper];
++ }
++
+ startLayoutExtend() {
+ if (!this.#allowBreakout || this.hasAttribute("breakout-extend")) {
+ // Do not expand if the Urlbar does not support being expanded or it is
+@@ -2312,6 +2370,12 @@ export class UrlbarInput {
this.setAttribute("breakout-extend", "true");
-+ if (lazy.ZEN_URLBAR_BEHAVIOR == 'float' || (lazy.ZEN_URLBAR_BEHAVIOR == 'floating-on-type' && !this.focusedViaMousedown)) {
++ if (this.zenUrlbarBehavior == 'float' || (this.zenUrlbarBehavior == 'floating-on-type' && !this.focusedViaMousedown)) {
+ this.setAttribute("zen-floating-urlbar", "true");
+ this.window.gZenUIManager.onFloatingURLBarOpen();
+ } else {
@@ -88,7 +121,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
// Enable the animation only after the first extend call to ensure it
// doesn't run when opening a new window.
if (!this.hasAttribute("breakout-extend-animate")) {
-@@ -2224,6 +2262,24 @@ export class UrlbarInput {
+@@ -2331,6 +2395,24 @@ export class UrlbarInput {
return;
}
@@ -113,7 +146,20 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
this.removeAttribute("breakout-extend");
this.#updateTextboxPosition();
}
-@@ -2553,7 +2609,7 @@ export class UrlbarInput {
+@@ -2595,10 +2677,12 @@ export class UrlbarInput {
+ return;
+ }
+ this.textbox.style.top = px(
++ this.window.gZenVerticalTabsManager._hasSetSingleToolbar ?
+ this.textbox.parentNode.getBoxQuads({
+ ignoreTransforms: true,
+ flush: false,
+ })[0].p1.y
++ : -5
+ );
+ }
+
+@@ -2660,7 +2744,7 @@ export class UrlbarInput {
this.textbox.parentNode.style.setProperty(
"--urlbar-container-height",
@@ -122,7 +168,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
);
this.textbox.style.setProperty(
"--urlbar-height",
-@@ -2986,6 +3042,7 @@ export class UrlbarInput {
+@@ -3093,6 +3177,7 @@ export class UrlbarInput {
}
_toggleActionOverride(event) {
@@ -130,24 +176,24 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
if (
event.keyCode == KeyEvent.DOM_VK_SHIFT ||
event.keyCode == KeyEvent.DOM_VK_ALT ||
-@@ -3087,7 +3144,7 @@ export class UrlbarInput {
- */
- _trimValue(val) {
+@@ -3197,7 +3282,7 @@ export class UrlbarInput {
+ return val;
+ }
let trimmedValue = lazy.UrlbarPrefs.get("trimURLs")
- ? lazy.BrowserUIUtils.trimURL(val)
+ ? this._zenTrimURL(val)
: val;
// Only trim value if the directionality doesn't change to RTL and we're not
// showing a strikeout https protocol.
-@@ -3303,6 +3360,7 @@ export class UrlbarInput {
+@@ -3501,6 +3586,7 @@ export class UrlbarInput {
resultDetails = null,
browser = this.window.gBrowser.selectedBrowser
) {
+ openUILinkWhere = this.window.gZenUIManager.getOpenUILinkWhere(url, browser, openUILinkWhere);
- // No point in setting these because we'll handleRevert() a few rows below.
- if (openUILinkWhere == "current") {
- // Make sure URL is formatted properly (don't show punycode).
-@@ -3455,6 +3513,10 @@ export class UrlbarInput {
+ if (this.isAddressbar) {
+ this.#prepareAddressbarLoad(
+ url,
+@@ -3608,6 +3694,10 @@ export class UrlbarInput {
}
reuseEmpty = true;
}
@@ -158,7 +204,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
if (
where == "tab" &&
reuseEmpty &&
-@@ -3462,6 +3524,9 @@ export class UrlbarInput {
+@@ -3615,6 +3705,9 @@ export class UrlbarInput {
) {
where = "current";
}
@@ -168,7 +214,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
return where;
}
-@@ -3719,6 +3784,7 @@ export class UrlbarInput {
+@@ -3872,6 +3965,7 @@ export class UrlbarInput {
this.setResultForCurrentValue(null);
this.handleCommand();
this.controller.clearLastQueryContextCache();
@@ -176,7 +222,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
this._suppressStartQuery = false;
});
-@@ -3726,7 +3792,6 @@ export class UrlbarInput {
+@@ -3879,7 +3973,6 @@ export class UrlbarInput {
contextMenu.addEventListener("popupshowing", () => {
// Close the results pane when the input field contextual menu is open,
// because paste and go doesn't want a result selection.
@@ -184,7 +230,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
let controller =
this.document.commandDispatcher.getControllerForCommand("cmd_paste");
-@@ -3836,7 +3901,11 @@ export class UrlbarInput {
+@@ -3991,7 +4084,11 @@ export class UrlbarInput {
if (!engineName && !source && !this.hasAttribute("searchmode")) {
return;
}
@@ -194,10 +240,10 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
+ detail: { searchMode },
+ })
+ );
- this._searchModeIndicatorTitle.textContent = "";
- this._searchModeIndicatorTitle.removeAttribute("data-l10n-id");
-
-@@ -4130,6 +4199,7 @@ export class UrlbarInput {
+ if (this._searchModeIndicatorTitle) {
+ this._searchModeIndicatorTitle.textContent = "";
+ this._searchModeIndicatorTitle.removeAttribute("data-l10n-id");
+@@ -4302,6 +4399,7 @@ export class UrlbarInput {
this.document.l10n.setAttributes(
this.inputField,
@@ -205,7 +251,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
l10nId,
l10nId == "urlbar-placeholder-with-name" ? { name } : undefined
);
-@@ -4241,6 +4311,11 @@ export class UrlbarInput {
+@@ -4413,6 +4511,11 @@ export class UrlbarInput {
}
_on_click(event) {
@@ -217,7 +263,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
if (
event.target == this.inputField ||
event.target == this._inputContainer
-@@ -4311,7 +4386,7 @@ export class UrlbarInput {
+@@ -4485,7 +4588,7 @@ export class UrlbarInput {
}
}
@@ -226,7 +272,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
this.view.autoOpen({ event });
} else {
if (this._untrimOnFocusAfterKeydown) {
-@@ -4351,9 +4426,16 @@ export class UrlbarInput {
+@@ -4525,9 +4628,16 @@ export class UrlbarInput {
}
_on_mousedown(event) {
@@ -235,16 +281,16 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
case this.textbox: {
this._mousedownOnUrlbarDescendant = true;
+ const isProbablyFloating =
-+ (lazy.ZEN_URLBAR_BEHAVIOR == "floating-on-type" &&
++ (this.zenUrlbarBehavior == "floating-on-type" &&
+ this.hasAttribute("breakout-extend") && !this.focusedViaMousedown) ||
-+ (lazy.ZEN_URLBAR_BEHAVIOR == "float") || this.window.gZenVerticalTabsManager._hasSetSingleToolbar;
++ (this.zenUrlbarBehavior == "float") || this.window.gZenVerticalTabsManager._hasSetSingleToolbar;
+ if (event.type != "click" && isProbablyFloating || event.type == "click" && !isProbablyFloating) {
+ return true;
+ }
if (
event.target != this.inputField &&
-@@ -4364,6 +4446,10 @@ export class UrlbarInput {
+@@ -4538,6 +4648,10 @@ export class UrlbarInput {
this.focusedViaMousedown = !this.focused;
this._preventClickSelectsAll = this.focused;
@@ -255,7 +301,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
// Keep the focus status, since the attribute may be changed
// upon calling this.focus().
-@@ -4399,7 +4485,7 @@ export class UrlbarInput {
+@@ -4573,7 +4687,7 @@ export class UrlbarInput {
}
// Don't close the view when clicking on a tab; we may want to keep the
// view open on tab switch, and the TabSelect event arrived earlier.
@@ -264,7 +310,7 @@ index 1c447bd31de854d1522dbcfb5d7ad557c84f1388..1dc520f63b240cccda7be074346d2079
break;
}
-@@ -4716,7 +4802,7 @@ export class UrlbarInput {
+@@ -4890,7 +5004,7 @@ export class UrlbarInput {
// When we are in actions search mode we can show more results so
// increase the limit.
let maxResults =
diff --git a/src/browser/components/urlbar/UrlbarMuxerStandard-sys-mjs.patch b/src/browser/components/urlbar/UrlbarMuxerStandard-sys-mjs.patch
index f1c290366..c737569ca 100644
--- a/src/browser/components/urlbar/UrlbarMuxerStandard-sys-mjs.patch
+++ b/src/browser/components/urlbar/UrlbarMuxerStandard-sys-mjs.patch
@@ -1,16 +1,16 @@
diff --git a/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs b/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs
-index cdc476a3eb2ee2cb6193d215513b65ed375f6153..bc66d9651e521bda75a3bb9e7f1e4b3bb325be90 100644
+index 20be2dbbb8471aeb43a9bf77888c9858a0b61186..a9f974a78c5676d1340a3543852e4126c1d32b04 100644
--- a/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs
+++ b/browser/components/urlbar/UrlbarMuxerStandard.sys.mjs
-@@ -855,6 +855,7 @@ class MuxerUnifiedComplete extends UrlbarMuxer {
+@@ -852,6 +852,7 @@ class MuxerUnifiedComplete extends UrlbarMuxer {
}
- if (result.providerName == lazy.UrlbarProviderTabToSearch.name) {
+ if (result.providerName == "UrlbarProviderTabToSearch") {
+ return false;
// Discard the result if a tab-to-search result was added already.
if (!state.canAddTabToSearch) {
return false;
-@@ -1501,7 +1502,9 @@ class MuxerUnifiedComplete extends UrlbarMuxer {
+@@ -1498,7 +1499,9 @@ class MuxerUnifiedComplete extends UrlbarMuxer {
usedLimits.maxResultCount++;
}
diff --git a/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch b/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch
index 2b93e360f..539445412 100644
--- a/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch
+++ b/src/browser/components/urlbar/UrlbarPrefs-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/UrlbarPrefs.sys.mjs b/browser/components/urlbar/UrlbarPrefs.sys.mjs
-index 3c179db3b310c43f8c6c06b1ecbcf5ed59feefe6..d9d2ce116ebcee8d403e165066c3a569bb952cd2 100644
+index 46ad55519aecd6c14034a9faa91c7ad8e5c1c422..e8d9c06499a2b273483edd21faf902c936462b59 100644
--- a/browser/components/urlbar/UrlbarPrefs.sys.mjs
+++ b/browser/components/urlbar/UrlbarPrefs.sys.mjs
-@@ -719,6 +719,7 @@ function makeResultGroups({ showSearchSuggestionsFirst }) {
+@@ -731,6 +731,7 @@ function makeResultGroups({ showSearchSuggestionsFirst }) {
*/
let rootGroup = {
children: [
diff --git a/src/browser/components/urlbar/UrlbarProviderPlaces-sys-mjs.patch b/src/browser/components/urlbar/UrlbarProviderPlaces-sys-mjs.patch
index df8854d91..7862a4a27 100644
--- a/src/browser/components/urlbar/UrlbarProviderPlaces-sys-mjs.patch
+++ b/src/browser/components/urlbar/UrlbarProviderPlaces-sys-mjs.patch
@@ -1,13 +1,13 @@
diff --git a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
-index ad971f090bdaba2865cf1fac2840b1f553d2630c..a9e676e43d35b617eebd5a67c8653397b7c0c6bf 100644
+index b2c3bfa6fbe83fceb019196c210baaa7b4881372..02f2c8be89f163e16c5fd29f9b7e145e16ea53ed 100644
--- a/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
+++ b/browser/components/urlbar/UrlbarProviderPlaces.sys.mjs
-@@ -40,11 +40,13 @@ function defaultQuery(conditions = "") {
+@@ -44,11 +44,13 @@ function defaultQuery(conditions = "") {
let query = `
SELECT h.url, h.title, ${SQL_BOOKMARK_TAGS_FRAGMENT}, h.id, t.open_count,
${lazy.PAGES_FRECENCY_FIELD} AS frecency, t.userContextId,
-- h.last_visit_date, t.groupId
-+ h.last_visit_date, t.groupId, zp.url AS pinned_url, zp.title AS pinned_title
+- h.last_visit_date, NULLIF(t.groupId, '') groupId
++ h.last_visit_date, NULLIF(t.groupId, '') groupId, zp.url AS pinned_url, zp.title AS pinned_title
FROM moz_places h
LEFT JOIN moz_openpages_temp t
ON t.url = h.url
@@ -17,7 +17,7 @@ index ad971f090bdaba2865cf1fac2840b1f553d2630c..a9e676e43d35b617eebd5a67c8653397
WHERE (
(:switchTabsEnabled AND t.open_count > 0) OR
${lazy.PAGES_FRECENCY_FIELD} <> 0
-@@ -58,7 +60,7 @@ function defaultQuery(conditions = "") {
+@@ -62,7 +64,7 @@ function defaultQuery(conditions = "") {
:matchBehavior, :searchBehavior, NULL)
ELSE
AUTOCOMPLETE_MATCH(:searchString, h.url,
@@ -26,7 +26,7 @@ index ad971f090bdaba2865cf1fac2840b1f553d2630c..a9e676e43d35b617eebd5a67c8653397
h.visit_count, h.typed,
0, t.open_count,
:matchBehavior, :searchBehavior, NULL)
-@@ -1116,11 +1118,13 @@ Search.prototype = {
+@@ -1120,11 +1122,13 @@ Search.prototype = {
? lazy.PlacesUtils.toDate(lastVisitPRTime).getTime()
: undefined;
let tabGroup = row.getResultByName("groupId");
diff --git a/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch b/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch
new file mode 100644
index 000000000..b06de00cf
--- /dev/null
+++ b/src/browser/components/urlbar/UrlbarProvidersManager-sys-mjs.patch
@@ -0,0 +1,12 @@
+diff --git a/browser/components/urlbar/UrlbarProvidersManager.sys.mjs b/browser/components/urlbar/UrlbarProvidersManager.sys.mjs
+index ece407214669009e263b507b5236ab28da33efe9..8f22426295e2b001438918f44d2c22ed7a697c2f 100644
+--- a/browser/components/urlbar/UrlbarProvidersManager.sys.mjs
++++ b/browser/components/urlbar/UrlbarProvidersManager.sys.mjs
+@@ -845,6 +845,7 @@ export class Query {
+ if (
+ result.heuristic &&
+ this.context.searchMode &&
++ !(this.context.searchMode.source === lazy.UrlbarUtils.RESULT_SOURCE.ZEN_ACTIONS && result.payload?.zenAction) &&
+ (!this.context.trimmedSearchString ||
+ (!this.context.searchMode.engineName && !result.autofill))
+ ) {
diff --git a/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch b/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch
index b477dc892..12bdd6dba 100644
--- a/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch
+++ b/src/browser/components/urlbar/UrlbarUtils-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/UrlbarUtils.sys.mjs b/browser/components/urlbar/UrlbarUtils.sys.mjs
-index 0bc15c02f56dd8f46a21fed02b4e21a741f27f41..40da868f68f21d8411107fb8a95e2d0b74337b51 100644
+index f38e860e46fa979b3e0c66ecd3eb88a64df60fc1..d130bbc7488ff3de926823974a1df13dc8e61fbc 100644
--- a/browser/components/urlbar/UrlbarUtils.sys.mjs
+++ b/browser/components/urlbar/UrlbarUtils.sys.mjs
-@@ -75,6 +75,7 @@ export var UrlbarUtils = {
+@@ -74,6 +74,7 @@ export var UrlbarUtils = {
RESTRICT_SEARCH_KEYWORD: "restrictSearchKeyword",
SUGGESTED_INDEX: "suggestedIndex",
TAIL_SUGGESTION: "tailSuggestion",
@@ -10,7 +10,7 @@ index 0bc15c02f56dd8f46a21fed02b4e21a741f27f41..40da868f68f21d8411107fb8a95e2d0b
}),
// Defines provider types.
-@@ -134,6 +135,7 @@ export var UrlbarUtils = {
+@@ -133,6 +134,7 @@ export var UrlbarUtils = {
OTHER_NETWORK: 6,
ADDON: 7,
ACTIONS: 8,
@@ -18,12 +18,12 @@ index 0bc15c02f56dd8f46a21fed02b4e21a741f27f41..40da868f68f21d8411107fb8a95e2d0b
}),
// Per-result exposure telemetry.
-@@ -553,6 +555,8 @@ export var UrlbarUtils = {
- return this.RESULT_GROUP.HEURISTIC_SEARCH_TIP;
- case "HistoryUrlHeuristic":
+@@ -544,6 +546,8 @@ export var UrlbarUtils = {
+ return this.RESULT_GROUP.HEURISTIC_FALLBACK;
+ case "UrlbarProviderHistoryUrlHeuristic":
return this.RESULT_GROUP.HEURISTIC_HISTORY_URL;
+ case "ZenUrlbarProviderGlobalActions":
+ return this.RESULT_GROUP.ZEN_ACTION;
- default:
- if (result.providerName.startsWith("TestProvider")) {
- return this.RESULT_GROUP.HEURISTIC_TEST;
+ case "UrlbarProviderOmnibox":
+ return this.RESULT_GROUP.HEURISTIC_OMNIBOX;
+ case "UrlbarProviderRestrictKeywordsAutofill":
diff --git a/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch b/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch
index fe22eed31..81ea5fc30 100644
--- a/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch
+++ b/src/browser/components/urlbar/UrlbarValueFormatter-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/browser/components/urlbar/UrlbarValueFormatter.sys.mjs b/browser/components/urlbar/UrlbarValueFormatter.sys.mjs
-index dfa91b76ad3890ceadb1b1b5d7a63b7074fbb776..6369fa1cdb242de32338bbce6debcdab2a04ca02 100644
+index 50961e4beb75012ef0ed6f261a95854712cc69d7..93bcfca9270ff34dbe6386789fdae6066457438d 100644
--- a/browser/components/urlbar/UrlbarValueFormatter.sys.mjs
+++ b/browser/components/urlbar/UrlbarValueFormatter.sys.mjs
@@ -585,6 +585,7 @@ export class UrlbarValueFormatter {
diff --git a/src/browser/components/urlbar/UrlbarView-sys-mjs.patch b/src/browser/components/urlbar/UrlbarView-sys-mjs.patch
index 0e0812bd7..26c99b0e8 100644
--- a/src/browser/components/urlbar/UrlbarView-sys-mjs.patch
+++ b/src/browser/components/urlbar/UrlbarView-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/components/urlbar/UrlbarView.sys.mjs b/browser/components/urlbar/UrlbarView.sys.mjs
-index fdbab8806fd320f4aacec46a42c8ef953580d00c..031a615ad09274c578184b129434bbd93b49353d 100644
+index b3c7c8a995226e2cbe852d82515f9bc7077980e7..4c8611556f7f71e5f8860787ed1db9b50b9fa2e8 100644
--- a/browser/components/urlbar/UrlbarView.sys.mjs
+++ b/browser/components/urlbar/UrlbarView.sys.mjs
-@@ -613,7 +613,7 @@ export class UrlbarView {
+@@ -620,7 +620,7 @@ export class UrlbarView {
!this.input.value ||
this.input.getAttribute("pageproxystate") == "valid"
) {
@@ -11,7 +11,7 @@ index fdbab8806fd320f4aacec46a42c8ef953580d00c..031a615ad09274c578184b129434bbd9
// Try to reuse the cached top-sites context. If it's not cached, then
// there will be a gap of time between when the input is focused and
// when the view opens that can be perceived as flicker.
-@@ -2706,6 +2706,8 @@ export class UrlbarView {
+@@ -2734,6 +2734,8 @@ export class UrlbarView {
if (row?.hasAttribute("row-selectable")) {
row?.toggleAttribute("selected", true);
}
@@ -20,12 +20,12 @@ index fdbab8806fd320f4aacec46a42c8ef953580d00c..031a615ad09274c578184b129434bbd9
if (element != row) {
row?.toggleAttribute("descendant-selected", true);
}
-@@ -3189,7 +3191,7 @@ export class UrlbarView {
+@@ -3215,7 +3217,7 @@ export class UrlbarView {
}
#enableOrDisableRowWrap() {
- let wrap = getBoundsWithoutFlushing(this.input.textbox).width < 650;
+ let wrap = false;
this.#rows.toggleAttribute("wrap", wrap);
- this.oneOffSearchButtons.container.toggleAttribute("wrap", wrap);
+ this.oneOffSearchButtons?.container.toggleAttribute("wrap", wrap);
}
diff --git a/src/browser/extensions/newtab/lib/ActivityStream-sys-mjs.patch b/src/browser/extensions/newtab/lib/ActivityStream-sys-mjs.patch
index 608533a1e..fb2d74187 100644
--- a/src/browser/extensions/newtab/lib/ActivityStream-sys-mjs.patch
+++ b/src/browser/extensions/newtab/lib/ActivityStream-sys-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/browser/extensions/newtab/lib/ActivityStream.sys.mjs b/browser/extensions/newtab/lib/ActivityStream.sys.mjs
-index 1a482b6de24468ccfec069586f374937d8ef68dd..8614beda3fdfc038092f31f11b2604d5cfb843a1 100644
+index 6207e6c8aa1e303ec151bc1e5c51c277ef776ee6..d3783a3c459c94880be1c95dc265a7d4887f67a1 100644
--- a/browser/extensions/newtab/lib/ActivityStream.sys.mjs
+++ b/browser/extensions/newtab/lib/ActivityStream.sys.mjs
-@@ -248,7 +248,7 @@ export const PREFS_CONFIG = new Map([
+@@ -223,7 +223,7 @@ export const PREFS_CONFIG = new Map([
"showSponsoredTopSites",
{
title: "Show sponsored top sites",
diff --git a/src/browser/installer/package-manifest-in.patch b/src/browser/installer/package-manifest-in.patch
index 7cc6a9526..2f18925ed 100644
--- a/src/browser/installer/package-manifest-in.patch
+++ b/src/browser/installer/package-manifest-in.patch
@@ -1,8 +1,8 @@
diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
-index 70f268914f1078ef45e86d295f4bb2ce179a05e0..73d8ffc4457468e8a57ad2c29e4d49f45436bf00 100644
+index b884f0167e5de87a45cf523436ceaceb710d35ae..eedc80278a5c93f81ce90c0d6198924549c07fc3 100644
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
-@@ -361,17 +361,17 @@ bin/libfreebl_64int_3.so
+@@ -362,17 +362,17 @@ bin/libfreebl_64int_3.so
; [MaintenanceService]
;
#ifdef MOZ_MAINTENANCE_SERVICE
diff --git a/src/browser/themes/BuiltInThemeConfig-sys-mjs.patch b/src/browser/themes/BuiltInThemeConfig-sys-mjs.patch
deleted file mode 100644
index ae66873e5..000000000
--- a/src/browser/themes/BuiltInThemeConfig-sys-mjs.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-diff --git a/browser/themes/BuiltInThemeConfig.sys.mjs b/browser/themes/BuiltInThemeConfig.sys.mjs
-index 28b254d5757caf35c4ba755ef4cfed44bab5af00..660f517e0e3342970c6e30837fcf4d0adf360777 100644
---- a/browser/themes/BuiltInThemeConfig.sys.mjs
-+++ b/browser/themes/BuiltInThemeConfig.sys.mjs
-@@ -33,11 +33,4 @@ export const BuiltInThemeConfig = new Map([
- path: "resource://builtin-themes/dark/",
- },
- ],
-- [
-- "firefox-alpenglow@mozilla.org",
-- {
-- version: "1.5",
-- path: "resource://builtin-themes/alpenglow/",
-- },
-- ],
- ]);
diff --git a/src/browser/themes/linux/browser-css.patch b/src/browser/themes/linux/browser-css.patch
index dfaee3e7d..d22b13b43 100644
--- a/src/browser/themes/linux/browser-css.patch
+++ b/src/browser/themes/linux/browser-css.patch
@@ -1,8 +1,16 @@
diff --git a/browser/themes/linux/browser.css b/browser/themes/linux/browser.css
-index 9723a8199cc5b8d25bb92c46992792b8c94a3565..302f5b675abd1970e64f56a5a4592bb174f9a72a 100644
+index b0ec88f361399cea255ef8fb6c7f2b87779a8e04..5b0d0bd663c309be3ddd0e946e1681b66938ee4d 100644
--- a/browser/themes/linux/browser.css
+++ b/browser/themes/linux/browser.css
-@@ -43,7 +43,8 @@
+@@ -14,7 +14,6 @@
+ @media (-moz-gtk-theme-family) {
+ --tabs-navbar-separator-style: none;
+ @media (prefers-color-scheme: light) {
+- --urlbar-box-bgcolor: #fafafa;
+ }
+ }
+ }
+@@ -43,7 +42,8 @@
-moz-default-appearance: -moz-window-decorations;
appearance: auto;
@@ -12,7 +20,7 @@ index 9723a8199cc5b8d25bb92c46992792b8c94a3565..302f5b675abd1970e64f56a5a4592bb1
dialog::backdrop {
border-top-left-radius: env(-moz-gtk-csd-titlebar-radius);
border-top-right-radius: env(-moz-gtk-csd-titlebar-radius);
-@@ -51,13 +52,11 @@
+@@ -51,13 +51,11 @@
/* stylelint-disable-next-line media-query-no-invalid */
@media -moz-pref("widget.gtk.rounded-bottom-corners.enabled") {
diff --git a/src/browser/themes/osx/browser-css.patch b/src/browser/themes/osx/browser-css.patch
index c48477643..cdaeb1877 100644
--- a/src/browser/themes/osx/browser-css.patch
+++ b/src/browser/themes/osx/browser-css.patch
@@ -1,5 +1,5 @@
diff --git a/browser/themes/osx/browser.css b/browser/themes/osx/browser.css
-index c209151370225d8efade7c51aea30ce7365e5f4f..4dd5cf4a98ea010b2d347ac0ba7314ae81320e75 100644
+index b1062108c6f6174a680e9b235ee9cb2037f94924..31aac7bdee4ebb07e9de58e7c3e5e6833c94e968 100644
--- a/browser/themes/osx/browser.css
+++ b/browser/themes/osx/browser.css
@@ -38,7 +38,7 @@
diff --git a/src/browser/themes/shared/browser-shared-css.patch b/src/browser/themes/shared/browser-shared-css.patch
index b76cd554b..780f07a9b 100644
--- a/src/browser/themes/shared/browser-shared-css.patch
+++ b/src/browser/themes/shared/browser-shared-css.patch
@@ -1,8 +1,8 @@
diff --git a/browser/themes/shared/browser-shared.css b/browser/themes/shared/browser-shared.css
-index c612e7d021122e3e4823994071cd613563d3e12e..682d7a47624460ce33e8fcb5ff9c995f3413bab2 100644
+index c77a0e6388c4061d9e6ee5f396a3e3af8867e4fe..3da164d2414e8726675ac0184310c9363365387f 100644
--- a/browser/themes/shared/browser-shared.css
+++ b/browser/themes/shared/browser-shared.css
-@@ -99,7 +99,7 @@ body {
+@@ -102,7 +102,7 @@ body {
--toolbarbutton-border-radius: 4px;
--identity-box-margin-inline: 4px;
--urlbar-min-height: max(32px, 1.4em);
@@ -11,7 +11,7 @@ index c612e7d021122e3e4823994071cd613563d3e12e..682d7a47624460ce33e8fcb5ff9c995f
/* This should be used for icons and chiclets inside the input field. It makes
the gap around them more uniform when they are close to the field edges */
-@@ -167,8 +167,6 @@ body {
+@@ -170,8 +170,6 @@ body {
*/
&.fullscreen-with-menubar {
z-index: var(--browser-area-z-index-toolbox-while-animating);
@@ -20,3 +20,19 @@ index c612e7d021122e3e4823994071cd613563d3e12e..682d7a47624460ce33e8fcb5ff9c995f
}
/* Themes define a set of toolbox foreground and background colors which we
+@@ -281,13 +279,13 @@ body {
+
+ @media (-moz-platform: macos) and (not (-moz-mac-rtl)) {
+ &:-moz-locale-dir(ltr) {
+- order: -1;
++ order: -2;
+ }
+ }
+
+ @media (-moz-mac-rtl) {
+ &:-moz-locale-dir(rtl) {
+- order: -1;
++ order: -2;
+ }
+ }
+
diff --git a/src/browser/themes/shared/identity-block/identity-block-css.patch b/src/browser/themes/shared/identity-block/identity-block-css.patch
index 32a0bd35f..13df820cf 100644
--- a/src/browser/themes/shared/identity-block/identity-block-css.patch
+++ b/src/browser/themes/shared/identity-block/identity-block-css.patch
@@ -1,17 +1,22 @@
diff --git a/browser/themes/shared/identity-block/identity-block.css b/browser/themes/shared/identity-block/identity-block.css
-index 8edca63dc52ec207475ed9965559d28c06e27971..884343473857c6b6256922d47085fac6eabe74fb 100644
+index 8edca63dc52ec207475ed9965559d28c06e27971..a5a949be1868af5d0bb04747a9f5b737c00ae49c 100644
--- a/browser/themes/shared/identity-block/identity-block.css
+++ b/browser/themes/shared/identity-block/identity-block.css
-@@ -83,7 +83,7 @@
+@@ -81,13 +81,6 @@
+ }
+ }
- #identity-box[pageproxystate="valid"]:is(.notSecureText, .chromeUI, .extensionPage) > .identity-box-button,
- #urlbar-label-box {
+-#identity-box[pageproxystate="valid"]:is(.notSecureText, .chromeUI, .extensionPage) > .identity-box-button,
+-#urlbar-label-box {
- background-color: var(--urlbar-box-bgcolor);
-+ background-color: transparent;
- color: var(--urlbar-box-text-color);
- padding-inline: 8px;
- border-radius: var(--urlbar-icon-border-radius);
-@@ -178,16 +178,17 @@
+- color: var(--urlbar-box-text-color);
+- padding-inline: 8px;
+- border-radius: var(--urlbar-icon-border-radius);
+-}
+
+ #urlbar[focused] {
+ #identity-box[pageproxystate="valid"]:is(.notSecureText, .chromeUI, .extensionPage) > .identity-box-button:not(:hover, [open]),
+@@ -178,16 +171,17 @@
}
#identity-icon {
diff --git a/src/browser/themes/shared/jar-inc-mn.patch b/src/browser/themes/shared/jar-inc-mn.patch
index 09c2b92d2..003aa4104 100644
--- a/src/browser/themes/shared/jar-inc-mn.patch
+++ b/src/browser/themes/shared/jar-inc-mn.patch
@@ -1,11 +1,11 @@
diff --git a/browser/themes/shared/jar.inc.mn b/browser/themes/shared/jar.inc.mn
-index bc47c162cd4792c7df17565014aac1c2258c6d40..21c0b7ddb04cbb828c758dad34885f91c1ddde6c 100644
+index 94036d036a64c8845c02d4ffbcf3f99b5d88576e..2ab3f060c9952f1b0c7bee3d5c3a1d7035e6736a 100644
--- a/browser/themes/shared/jar.inc.mn
+++ b/browser/themes/shared/jar.inc.mn
@@ -316,3 +316,5 @@
- skin/classic/browser/weather/night-mostly-cloudy-with-flurries.svg (../shared/weather/night-mostly-cloudy-with-flurries.svg)
skin/classic/browser/illustrations/market-opt-in.svg (../shared/illustrations/market-opt-in.svg)
+ skin/classic/browser/illustrations/yelpRealtime-opt-in.svg (../shared/illustrations/yelpRealtime-opt-in.svg)
+
+#include zen-sources.inc.mn
\ No newline at end of file
diff --git a/src/browser/themes/shared/preferences/zen-preferences.css b/src/browser/themes/shared/preferences/zen-preferences.css
index f5274d2a9..622ff2781 100644
--- a/src/browser/themes/shared/preferences/zen-preferences.css
+++ b/src/browser/themes/shared/preferences/zen-preferences.css
@@ -156,38 +156,6 @@ groupbox h2 {
margin-bottom: 15px;
}
-#zen-compact-mode-styles-form {
- display: flex;
- justify-content: space-between;
- gap: var(--space-large);
- margin-top: 5px;
-
- & .web-appearance-choice-image-container {
- display: flex;
- justify-content: center;
- align-items: center;
-
- padding: 20px 0;
-
- background: color-mix(in srgb, var(--zen-colors-tertiary) 50%, transparent 50%);
- }
-}
-
-@media -moz-pref('zen.view.use-single-toolbar') {
- #zen-compact-mode-styles-form {
- display: none;
- }
-}
-
-#zen-expand-tabbar-strat {
- display: flex;
- flex-direction: column;
-}
-
-#zen-expand-tabbar-strat > hbox {
- margin-top: 10px;
-}
-
#category-zen-looks > .category-icon {
list-style-image: url('chrome://browser/skin/customize.svg');
}
diff --git a/src/browser/themes/shared/tabbrowser/content-area-css.patch b/src/browser/themes/shared/tabbrowser/content-area-css.patch
index 9511724fd..dd1164699 100644
--- a/src/browser/themes/shared/tabbrowser/content-area-css.patch
+++ b/src/browser/themes/shared/tabbrowser/content-area-css.patch
@@ -1,5 +1,5 @@
diff --git a/browser/themes/shared/tabbrowser/content-area.css b/browser/themes/shared/tabbrowser/content-area.css
-index 44f6c942f2e4b08f784b2ff96f785e9beed01ecd..834e174186972c3297a552bbd579f0ea1261c19e 100644
+index e06addf1602dc26ff4e75a8db6251231690f3f80..86e2cd0194bb37fa140a2f93eccfdd61419a9aec 100644
--- a/browser/themes/shared/tabbrowser/content-area.css
+++ b/browser/themes/shared/tabbrowser/content-area.css
@@ -276,7 +276,7 @@
diff --git a/src/browser/themes/shared/tabbrowser/tabs-css.patch b/src/browser/themes/shared/tabbrowser/tabs-css.patch
index e00e45fc2..1e127b19f 100644
--- a/src/browser/themes/shared/tabbrowser/tabs-css.patch
+++ b/src/browser/themes/shared/tabbrowser/tabs-css.patch
@@ -1,5 +1,5 @@
diff --git a/browser/themes/shared/tabbrowser/tabs.css b/browser/themes/shared/tabbrowser/tabs.css
-index 07574cdd974f63b90355f069f0fbc3fa6cd61b50..c650da2adf0d1a53b05a09d1b43fa5f52d78a307 100644
+index 8a7499426a718a56c74daea562a50de20db706e7..7ee8d7e0bd98733341e1da0d2ff965d85fc4c91a 100644
--- a/browser/themes/shared/tabbrowser/tabs.css
+++ b/browser/themes/shared/tabbrowser/tabs.css
@@ -21,7 +21,7 @@
@@ -102,7 +102,7 @@ index 07574cdd974f63b90355f069f0fbc3fa6cd61b50..c650da2adf0d1a53b05a09d1b43fa5f5
&:is([soundplaying], [muted], [activemedia-blocked]) {
display: flex;
}
-@@ -1137,7 +1130,7 @@ tab-group {
+@@ -1226,7 +1219,7 @@ tab-group {
}
#tabbrowser-tabs[orient="vertical"][expanded] {
@@ -111,7 +111,7 @@ index 07574cdd974f63b90355f069f0fbc3fa6cd61b50..c650da2adf0d1a53b05a09d1b43fa5f5
&[movingtab][movingtab-addToGroup]:not([movingtab-group], [movingtab-ungroup]) .tabbrowser-tab:is(:active, [multiselected]) {
margin-inline-start: var(--space-medium);
}
-@@ -1567,7 +1560,7 @@ tab-group {
+@@ -1685,7 +1678,7 @@ tab-group {
}
}
@@ -120,7 +120,7 @@ index 07574cdd974f63b90355f069f0fbc3fa6cd61b50..c650da2adf0d1a53b05a09d1b43fa5f5
#vertical-tabs-newtab-button {
appearance: none;
min-height: var(--tab-min-height);
-@@ -1578,7 +1571,7 @@ tab-group {
+@@ -1696,7 +1689,7 @@ tab-group {
margin-inline: var(--tab-inner-inline-margin);
#tabbrowser-tabs[orient="vertical"]:not([expanded]) & > .toolbarbutton-text {
@@ -129,7 +129,7 @@ index 07574cdd974f63b90355f069f0fbc3fa6cd61b50..c650da2adf0d1a53b05a09d1b43fa5f5
}
&:hover {
-@@ -1602,7 +1595,7 @@ tab-group {
+@@ -1720,7 +1713,7 @@ tab-group {
* flex container. #tabs-newtab-button is a child of the arrowscrollbox where
* we don't want a gap (between tabs), so we have to add some margin.
*/
@@ -138,7 +138,7 @@ index 07574cdd974f63b90355f069f0fbc3fa6cd61b50..c650da2adf0d1a53b05a09d1b43fa5f5
margin-block: var(--tab-block-margin);
}
-@@ -1793,7 +1786,6 @@ tab-group {
+@@ -1913,7 +1906,6 @@ tab-group {
&:not([expanded]) {
.tabbrowser-tab[pinned] {
@@ -146,7 +146,7 @@ index 07574cdd974f63b90355f069f0fbc3fa6cd61b50..c650da2adf0d1a53b05a09d1b43fa5f5
}
.tab-background {
-@@ -1833,8 +1825,8 @@ tab-group {
+@@ -1953,8 +1945,8 @@ tab-group {
display: block;
position: absolute;
inset: auto;
@@ -157,7 +157,7 @@ index 07574cdd974f63b90355f069f0fbc3fa6cd61b50..c650da2adf0d1a53b05a09d1b43fa5f5
&:-moz-window-inactive {
background-image:
-@@ -1953,7 +1945,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button {
+@@ -2073,7 +2065,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button {
list-style-image: url(chrome://global/skin/icons/plus.svg);
}
diff --git a/src/browser/themes/shared/toolbarbuttons-css.patch b/src/browser/themes/shared/toolbarbuttons-css.patch
index 12714ef02..f4dd140a8 100644
--- a/src/browser/themes/shared/toolbarbuttons-css.patch
+++ b/src/browser/themes/shared/toolbarbuttons-css.patch
@@ -1,8 +1,8 @@
diff --git a/browser/themes/shared/toolbarbuttons.css b/browser/themes/shared/toolbarbuttons.css
-index e7b1c17391ffae02226015d0dd8bbe8eca29731f..938a8cb8c3d854a75fe300db2a7330d188c9ed6f 100644
+index e2b8a7cae70ed2bd3c80ee4214a09dbdb68a0d01..71320c7268d92aaa06bfa15c74bdbf02f1442745 100644
--- a/browser/themes/shared/toolbarbuttons.css
+++ b/browser/themes/shared/toolbarbuttons.css
-@@ -256,7 +256,7 @@ toolbar .toolbaritem-combined-buttons > separator {
+@@ -279,7 +279,7 @@ toolbar .toolbaritem-combined-buttons {
#nav-bar-overflow-button {
list-style-image: url("chrome://global/skin/icons/chevron.svg");
@@ -11,7 +11,7 @@ index e7b1c17391ffae02226015d0dd8bbe8eca29731f..938a8cb8c3d854a75fe300db2a7330d1
display: none;
}
-@@ -466,7 +466,7 @@ toolbarbutton.bookmark-item:not(.subviewbutton) {
+@@ -489,7 +489,7 @@ toolbarbutton.bookmark-item:not(.subviewbutton) {
*/
align-items: stretch;
> .toolbarbutton-icon {
diff --git a/src/browser/themes/shared/urlbar-searchbar-css.patch b/src/browser/themes/shared/urlbar-searchbar-css.patch
index f0608a0f6..2d75c52f7 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 11636a976736ba56dcc5a58081cee998bbdf58d4..0a6ca26f25511c799d8b40484b6bd1c81ceeb4e0 100644
+index 1744e627bbcfc69ccccb207ad1cbf0c262afb9be..50cc9da2076d946771fb5aca1402f1cbe6a531c8 100644
--- a/browser/themes/shared/urlbar-searchbar.css
+++ b/browser/themes/shared/urlbar-searchbar.css
@@ -6,7 +6,7 @@
@@ -11,7 +11,7 @@ index 11636a976736ba56dcc5a58081cee998bbdf58d4..0a6ca26f25511c799d8b40484b6bd1c8
--urlbar-margin-inline: 5px;
--urlbar-padding-block: 4px;
-@@ -33,7 +33,7 @@
+@@ -48,7 +48,7 @@
#urlbar[usertyping] > .urlbar-input-container > #page-action-buttons > #urlbar-zoom-button,
.urlbar:is(:not([usertyping]), :not([focused])) > .urlbar-input-container > .urlbar-go-button,
.urlbar-revert-button-container {
@@ -20,7 +20,7 @@ index 11636a976736ba56dcc5a58081cee998bbdf58d4..0a6ca26f25511c799d8b40484b6bd1c8
}
/* When rich suggestions are enabled the urlbar identity icon is given extra padding to
-@@ -307,10 +307,14 @@
+@@ -321,10 +321,14 @@
.urlbar[breakout][breakout-extend] {
height: auto;
diff --git a/src/browser/themes/shared/urlbarView-css.patch b/src/browser/themes/shared/urlbarView-css.patch
index bba5d89a9..9e692c3be 100644
--- a/src/browser/themes/shared/urlbarView-css.patch
+++ b/src/browser/themes/shared/urlbarView-css.patch
@@ -1,5 +1,5 @@
diff --git a/browser/themes/shared/urlbarView.css b/browser/themes/shared/urlbarView.css
-index 743b1bc81474378ac994ca9cfeb8f4cc6b434581..3486cebd74efa2df481d2a112e89b219bd6bb8a2 100644
+index ec849fc792572e75d12b9e7cd7e6b7f32c799fa9..17c7d442854b774817ef5b3b96e732c19bebef9d 100644
--- a/browser/themes/shared/urlbarView.css
+++ b/browser/themes/shared/urlbarView.css
@@ -20,7 +20,7 @@
diff --git a/src/browser/themes/shared/zen-icons/icons.css b/src/browser/themes/shared/zen-icons/icons.css
index fec5a4d24..9cddd5e1f 100644
--- a/src/browser/themes/shared/zen-icons/icons.css
+++ b/src/browser/themes/shared/zen-icons/icons.css
@@ -40,22 +40,30 @@
list-style-image: url('trash.svg');
}
-.reset-icon {
- list-style-image: url('reload.svg') !important;
-}
-
-.tab-reset-button,
#PanelUI-zen-gradient-generator-color-remove {
list-style-image: url('unpin.svg') !important;
}
+.tab-reset-button {
+ list-style-image: url('unpin.svg');
+
+ @media (-moz-pref('zen.pinned-tab-manager.close-shortcut-behavior', 'close')) {
+ list-style-image: url('close.svg');
+ }
+}
+
#sidebar-button {
list-style-image: url('sidebars-right.svg') !important;
}
#sidebar-button:-moz-locale-dir(ltr):not([positionend]),
-#sidebar-button:-moz-locale-dir(rtl)[positionend] {
- list-style-image: url('chrome://browser/skin/sidebars.svg') !important;
+#sidebar-button:-moz-locale-dir(rtl)[positionend],
+#zen-toggle-compact-mode {
+ list-style-image: url('sidebar.svg') !important;
+
+ :root[zen-right-side='true'] & {
+ list-style-image: url('sidebar-right.svg') !important;
+ }
}
#downloads-button,
@@ -74,7 +82,8 @@
}
#appMenu-zoom-controls,
-#PanelUI-zen-gradient-generator-color-add {
+#PanelUI-zen-gradient-generator-color-add,
+#zen-site-data-new-addon-button {
list-style-image: url('plus.svg') !important;
}
@@ -96,6 +105,14 @@
#nav-bar-overflow-button {
list-style-image: url('chevron.svg') !important;
+
+ /* On macos, we don't display the app menu, meaning
+ * we can re-use the menu icon for the overflow button.
+ * Which is more intuitive for users and looks better.
+ */
+ @media (-moz-platform: macos) {
+ list-style-image: url('menu.svg') !important;
+ }
}
#zen-rice-share-options .options-header,
@@ -116,7 +133,8 @@
#sync-button,
.urlbarView-row[source='tabs'] > .urlbarView-row-inner > .urlbarView-no-wrap > .urlbarView-favicon,
-#urlbar-engine-one-off-item-tabs {
+#urlbar-engine-one-off-item-tabs,
+#zen-open-background-tab-button {
list-style-image: url('tab.svg') !important;
}
@@ -160,8 +178,7 @@
list-style-image: url('search-page.svg') !important;
}
-#open-file-button,
-#zen-open-background-tab-button {
+#open-file-button {
list-style-image: url('open.svg') !important;
}
@@ -402,12 +419,12 @@
list-style-image: url('arrow-left.svg') !important;
}
-#overflowMenu-customize-button,
#appmenu-moreTools-button {
list-style-image: url('customize.svg') !important;
}
-#zen-copy-current-url-button {
+#zen-copy-current-url-button,
+#zen-site-data-header-share {
list-style-image: url('share.svg');
}
@@ -415,12 +432,14 @@
list-style-image: url('folder.svg') !important;
}
+#zen-site-data-header-bookmark,
#pageAction-panel-bookmark,
#star-button,
#zen-bookmark-button {
list-style-image: url('bookmark-hollow.svg') !important;
}
+#zen-site-data-header-bookmark.active,
#pageAction-panel-bookmark[starred],
#star-button[starred] {
list-style-image: url('bookmark.svg') !important;
@@ -466,8 +485,28 @@
}
/* permissions */
-#permissions-granted-icon {
- list-style-image: url('permissions.svg') !important;
+
+#zen-site-data-icon-button {
+ display: flex !important;
+}
+
+#identity-permission-box,
+#identity-box:not([pageproxystate='invalid']) #identity-icon-box:not([open]),
+#identity-box[pageproxystate='invalid'] #zen-site-data-icon-button {
+ display: none !important;
+}
+
+#zen-site-data-icon-button {
+ padding: 0 6px;
+
+ & image {
+ list-style-image: url('permissions.svg');
+ -moz-context-properties: fill, fill-opacity;
+ pointer-events: none;
+ }
+ &[open] image {
+ list-style-image: url('permissions-fill.svg');
+ }
}
.geo-icon {
@@ -495,7 +534,8 @@
list-style-image: url('desktop-notification-blocked.svg') !important;
}
-.camera-icon {
+.camera-icon,
+#zen-site-data-header-screenshot {
list-style-image: url('camera.svg') !important;
}
@@ -569,6 +609,46 @@
list-style-image: url('extension-blocked.svg') !important;
}
+.permission-popup-permission-item {
+ list-style-image: url('settings-fill.svg') !important;
+}
+.permission-popup-permission-item-geo {
+ list-style-image: url('geo-fill.svg') !important;
+}
+.permission-popup-permission-item-xr {
+ list-style-image: url('xr-fill.svg') !important;
+}
+.permission-popup-permission-item-desktop-notification {
+ list-style-image: url('desktop-notification-fill.svg') !important;
+}
+.permission-popup-permission-item-camera {
+ list-style-image: url('camera-fill.svg') !important;
+}
+.permission-popup-permission-item-microphone {
+ list-style-image: url('microphone-fill.svg') !important;
+}
+.permission-popup-permission-item-screen {
+ list-style-image: url('screen.svg') !important;
+}
+.permission-popup-permission-item-persistent-storage {
+ list-style-image: url('persistent-storage-fill.svg') !important;
+}
+.permission-popup-permission-item-popup {
+ list-style-image: url('popup-fill.svg') !important;
+}
+.permission-popup-permission-item-autoplay-media {
+ list-style-image: url('autoplay-media-fill.svg') !important;
+}
+.zen-permission-shield-icon {
+ list-style-image: url('tracking-protection-fill.svg');
+}
+.zen-permission-extension-icon {
+ list-style-image: url('extension-fill.svg');
+}
+.zen-permission-cookie-icon {
+ list-style-image: url('cookies-fill.svg');
+}
+
/* tab sound icons */
.tab-icon-overlay[soundplaying] {
list-style-image: url('tab-audio-playing-small.svg') !important;
@@ -582,23 +662,8 @@
list-style-image: url('tab-audio-blocked-small.svg') !important;
}
-/* reload/stop animation */
-#stop-reload-button[animate]
- > #reload-button[displaystop]
- + #stop-button
- > .toolbarbutton-animatable-box
- > .toolbarbutton-animatable-image {
- background-image: url('reload-to-stop.svg') !important;
-}
-
-#stop-reload-button[animate]
- > #reload-button
- > .toolbarbutton-animatable-box
- > .toolbarbutton-animatable-image {
- background-image: url('stop-to-reload.svg') !important;
-}
-
-#reader-mode-button > .urlbar-icon {
+#reader-mode-button > .urlbar-icon,
+#zen-site-data-header-reader-mode {
list-style-image: url('reader-mode.svg') !important;
}
@@ -811,3 +876,63 @@
-moz-context-properties: fill;
fill: currentColor;
}
+
+#zen-site-data-security-info {
+ -moz-context-properties: fill, fill-opacity;
+ fill: currentColor;
+ appearance: none;
+ border-radius: 6px;
+ padding: 6px 10px 6px 8px;
+
+ &[identity='secure'] {
+ list-style-image: url('security.svg');
+ }
+
+ &[identity='not-secure'] {
+ list-style-image: url('security-broken.svg');
+ }
+
+ &[identity='extension'] {
+ list-style-image: url('extension.svg');
+ }
+
+ &:not([identity='secure']) * {
+ color: light-dark(var(--color-red-70), var(--color-red-30));
+ }
+
+ & .toolbarbutton-text {
+ font-weight: 600;
+ padding-inline-start: 4px !important;
+ }
+
+ & .toolbarbutton-icon {
+ width: 16px;
+ }
+
+ & > * {
+ opacity: 0.8;
+ }
+}
+
+#zen-site-data-actions {
+ -moz-context-properties: fill, fill-opacity;
+ fill: currentColor;
+ appearance: none;
+ width: 30px;
+ height: 30px;
+ border-radius: 99px;
+ margin-left: auto !important;
+ list-style-image: url('menu.svg');
+ justify-content: center;
+ align-items: center;
+ padding: 0;
+
+ & label {
+ display: none;
+ }
+}
+
+#zen-copy-url-button image {
+ list-style-image: url('link.svg');
+ fill-opacity: 0.7;
+}
diff --git a/src/browser/themes/shared/zen-icons/jar.inc.mn b/src/browser/themes/shared/zen-icons/jar.inc.mn
index f9e705850..b97b3837b 100644
--- a/src/browser/themes/shared/zen-icons/jar.inc.mn
+++ b/src/browser/themes/shared/zen-icons/jar.inc.mn
@@ -11,12 +11,14 @@
* skin/classic/browser/zen-icons/arrow-up.svg (../shared/zen-icons/lin/arrow-up.svg)
* skin/classic/browser/zen-icons/audio-save.svg (../shared/zen-icons/lin/audio-save.svg)
* skin/classic/browser/zen-icons/autoplay-media-blocked.svg (../shared/zen-icons/lin/autoplay-media-blocked.svg)
+* skin/classic/browser/zen-icons/autoplay-media-fill.svg (../shared/zen-icons/lin/autoplay-media-fill.svg)
* skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/lin/autoplay-media.svg)
* skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/lin/back.svg)
* skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/lin/bookmark-hollow.svg)
* skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/lin/bookmark-star-on-tray.svg)
* skin/classic/browser/zen-icons/bookmark.svg (../shared/zen-icons/lin/bookmark.svg)
* skin/classic/browser/zen-icons/camera-blocked.svg (../shared/zen-icons/lin/camera-blocked.svg)
+* skin/classic/browser/zen-icons/camera-fill.svg (../shared/zen-icons/lin/camera-fill.svg)
* skin/classic/browser/zen-icons/camera.svg (../shared/zen-icons/lin/camera.svg)
* skin/classic/browser/zen-icons/canvas-blocked.svg (../shared/zen-icons/lin/canvas-blocked.svg)
* skin/classic/browser/zen-icons/canvas.svg (../shared/zen-icons/lin/canvas.svg)
@@ -25,8 +27,10 @@
* skin/classic/browser/zen-icons/close-all.svg (../shared/zen-icons/lin/close-all.svg)
* skin/classic/browser/zen-icons/close.svg (../shared/zen-icons/lin/close.svg)
* skin/classic/browser/zen-icons/container-tab.svg (../shared/zen-icons/lin/container-tab.svg)
+* skin/classic/browser/zen-icons/cookies-fill.svg (../shared/zen-icons/lin/cookies-fill.svg)
* skin/classic/browser/zen-icons/customize.svg (../shared/zen-icons/lin/customize.svg)
* skin/classic/browser/zen-icons/desktop-notification-blocked.svg (../shared/zen-icons/lin/desktop-notification-blocked.svg)
+* skin/classic/browser/zen-icons/desktop-notification-fill.svg (../shared/zen-icons/lin/desktop-notification-fill.svg)
* skin/classic/browser/zen-icons/desktop-notification.svg (../shared/zen-icons/lin/desktop-notification.svg)
* skin/classic/browser/zen-icons/developer.svg (../shared/zen-icons/lin/developer.svg)
* skin/classic/browser/zen-icons/downloads.svg (../shared/zen-icons/lin/downloads.svg)
@@ -38,15 +42,16 @@
* skin/classic/browser/zen-icons/edit-paste.svg (../shared/zen-icons/lin/edit-paste.svg)
* skin/classic/browser/zen-icons/edit-redo.svg (../shared/zen-icons/lin/edit-redo.svg)
* skin/classic/browser/zen-icons/edit-select-all.svg (../shared/zen-icons/lin/edit-select-all.svg)
-* skin/classic/browser/zen-icons/edit.svg (../shared/zen-icons/lin/edit.svg)
* skin/classic/browser/zen-icons/edit-theme.svg (../shared/zen-icons/lin/edit-theme.svg)
* skin/classic/browser/zen-icons/edit-undo.svg (../shared/zen-icons/lin/edit-undo.svg)
+* skin/classic/browser/zen-icons/edit.svg (../shared/zen-icons/lin/edit.svg)
* skin/classic/browser/zen-icons/essential-add.svg (../shared/zen-icons/lin/essential-add.svg)
* skin/classic/browser/zen-icons/essential-remove.svg (../shared/zen-icons/lin/essential-remove.svg)
* skin/classic/browser/zen-icons/expand-sidebar.svg (../shared/zen-icons/lin/expand-sidebar.svg)
-* skin/classic/browser/zen-icons/extension-blocked.svg (../shared/zen-icons/lin/extension-blocked.svg)
-* skin/classic/browser/zen-icons/extension.svg (../shared/zen-icons/lin/extension.svg)
* skin/classic/browser/zen-icons/ext-link.svg (../shared/zen-icons/lin/ext-link.svg)
+* skin/classic/browser/zen-icons/extension-blocked.svg (../shared/zen-icons/lin/extension-blocked.svg)
+* skin/classic/browser/zen-icons/extension-fill.svg (../shared/zen-icons/lin/extension-fill.svg)
+* skin/classic/browser/zen-icons/extension.svg (../shared/zen-icons/lin/extension.svg)
* skin/classic/browser/zen-icons/face-sun.svg (../shared/zen-icons/lin/face-sun.svg)
* skin/classic/browser/zen-icons/firefox.svg (../shared/zen-icons/lin/firefox.svg)
* skin/classic/browser/zen-icons/folder.svg (../shared/zen-icons/lin/folder.svg)
@@ -55,6 +60,7 @@
* skin/classic/browser/zen-icons/fullscreen-exit.svg (../shared/zen-icons/lin/fullscreen-exit.svg)
* skin/classic/browser/zen-icons/fullscreen.svg (../shared/zen-icons/lin/fullscreen.svg)
* skin/classic/browser/zen-icons/geo-blocked.svg (../shared/zen-icons/lin/geo-blocked.svg)
+* skin/classic/browser/zen-icons/geo-fill.svg (../shared/zen-icons/lin/geo-fill.svg)
* skin/classic/browser/zen-icons/geo.svg (../shared/zen-icons/lin/geo.svg)
* skin/classic/browser/zen-icons/help.svg (../shared/zen-icons/lin/help.svg)
* skin/classic/browser/zen-icons/history.svg (../shared/zen-icons/lin/history.svg)
@@ -92,43 +98,47 @@
* skin/classic/browser/zen-icons/palette.svg (../shared/zen-icons/lin/palette.svg)
* skin/classic/browser/zen-icons/passwords.svg (../shared/zen-icons/lin/passwords.svg)
* skin/classic/browser/zen-icons/paste-and-go.svg (../shared/zen-icons/lin/paste-and-go.svg)
+* skin/classic/browser/zen-icons/permissions-fill.svg (../shared/zen-icons/lin/permissions-fill.svg)
* skin/classic/browser/zen-icons/permissions.svg (../shared/zen-icons/lin/permissions.svg)
* skin/classic/browser/zen-icons/persistent-storage-blocked.svg (../shared/zen-icons/lin/persistent-storage-blocked.svg)
+* skin/classic/browser/zen-icons/persistent-storage-fill.svg (../shared/zen-icons/lin/persistent-storage-fill.svg)
* skin/classic/browser/zen-icons/persistent-storage.svg (../shared/zen-icons/lin/persistent-storage.svg)
* skin/classic/browser/zen-icons/pin.svg (../shared/zen-icons/lin/pin.svg)
* skin/classic/browser/zen-icons/plus.svg (../shared/zen-icons/lin/plus.svg)
+* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/lin/popup-fill.svg)
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/lin/popup.svg)
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/lin/print.svg)
-* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/lin/privateBrowsing.svg)
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/lin/private-window.svg)
+* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/lin/privateBrowsing.svg)
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/lin/reader-mode.svg)
* skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/lin/reload.svg)
-* skin/classic/browser/zen-icons/reload-to-stop.svg (../shared/zen-icons/lin/reload-to-stop.svg)
* skin/classic/browser/zen-icons/report.svg (../shared/zen-icons/lin/report.svg)
* skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/lin/save.svg)
* skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/lin/screen-blocked.svg)
-* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/lin/screenshot.svg)
* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/lin/screen.svg)
+* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/lin/screenshot.svg)
* skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/lin/search-glass.svg)
* skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/lin/search-page.svg)
* skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/lin/security-broken.svg)
-* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/lin/security.svg)
* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/lin/security-warning.svg)
+* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/lin/security.svg)
* skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/lin/send-to-device.svg)
+* skin/classic/browser/zen-icons/settings-fill.svg (../shared/zen-icons/lin/settings-fill.svg)
* skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/lin/settings.svg)
* skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/lin/share.svg)
-* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/lin/sidebars-right.svg)
+* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/lin/sidebar-right.svg)
* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/lin/sidebar.svg)
+* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/lin/sidebars-right.svg)
* skin/classic/browser/zen-icons/source-code.svg (../shared/zen-icons/lin/source-code.svg)
* skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/lin/sparkles.svg)
* skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/lin/spell-check.svg)
* skin/classic/browser/zen-icons/split.svg (../shared/zen-icons/lin/split.svg)
-* skin/classic/browser/zen-icons/stop-to-reload.svg (../shared/zen-icons/lin/stop-to-reload.svg)
* skin/classic/browser/zen-icons/tab-audio-blocked-small.svg (../shared/zen-icons/lin/tab-audio-blocked-small.svg)
* skin/classic/browser/zen-icons/tab-audio-muted-small.svg (../shared/zen-icons/lin/tab-audio-muted-small.svg)
* skin/classic/browser/zen-icons/tab-audio-playing-small.svg (../shared/zen-icons/lin/tab-audio-playing-small.svg)
* skin/classic/browser/zen-icons/tab.svg (../shared/zen-icons/lin/tab.svg)
* skin/classic/browser/zen-icons/tool-profiler.svg (../shared/zen-icons/lin/tool-profiler.svg)
+* skin/classic/browser/zen-icons/tracking-protection-fill.svg (../shared/zen-icons/lin/tracking-protection-fill.svg)
* skin/classic/browser/zen-icons/tracking-protection.svg (../shared/zen-icons/lin/tracking-protection.svg)
* skin/classic/browser/zen-icons/translations.svg (../shared/zen-icons/lin/translations.svg)
* skin/classic/browser/zen-icons/trash.svg (../shared/zen-icons/lin/trash.svg)
@@ -139,6 +149,7 @@
* skin/classic/browser/zen-icons/video-save.svg (../shared/zen-icons/lin/video-save.svg)
* skin/classic/browser/zen-icons/window.svg (../shared/zen-icons/lin/window.svg)
* skin/classic/browser/zen-icons/xr-blocked.svg (../shared/zen-icons/lin/xr-blocked.svg)
+* skin/classic/browser/zen-icons/xr-fill.svg (../shared/zen-icons/lin/xr-fill.svg)
* skin/classic/browser/zen-icons/xr.svg (../shared/zen-icons/lin/xr.svg)
* skin/classic/browser/zen-icons/zoom-control.svg (../shared/zen-icons/lin/zoom-control.svg)
* skin/classic/browser/zen-icons/zoom-out.svg (../shared/zen-icons/lin/zoom-out.svg)
@@ -152,12 +163,14 @@
* skin/classic/browser/zen-icons/arrow-up.svg (../shared/zen-icons/lin/arrow-up.svg)
* skin/classic/browser/zen-icons/audio-save.svg (../shared/zen-icons/lin/audio-save.svg)
* skin/classic/browser/zen-icons/autoplay-media-blocked.svg (../shared/zen-icons/lin/autoplay-media-blocked.svg)
+* skin/classic/browser/zen-icons/autoplay-media-fill.svg (../shared/zen-icons/lin/autoplay-media-fill.svg)
* skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/lin/autoplay-media.svg)
* skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/lin/back.svg)
* skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/lin/bookmark-hollow.svg)
* skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/lin/bookmark-star-on-tray.svg)
* skin/classic/browser/zen-icons/bookmark.svg (../shared/zen-icons/lin/bookmark.svg)
* skin/classic/browser/zen-icons/camera-blocked.svg (../shared/zen-icons/lin/camera-blocked.svg)
+* skin/classic/browser/zen-icons/camera-fill.svg (../shared/zen-icons/lin/camera-fill.svg)
* skin/classic/browser/zen-icons/camera.svg (../shared/zen-icons/lin/camera.svg)
* skin/classic/browser/zen-icons/canvas-blocked.svg (../shared/zen-icons/lin/canvas-blocked.svg)
* skin/classic/browser/zen-icons/canvas.svg (../shared/zen-icons/lin/canvas.svg)
@@ -166,8 +179,10 @@
* skin/classic/browser/zen-icons/close-all.svg (../shared/zen-icons/lin/close-all.svg)
* skin/classic/browser/zen-icons/close.svg (../shared/zen-icons/lin/close.svg)
* skin/classic/browser/zen-icons/container-tab.svg (../shared/zen-icons/lin/container-tab.svg)
+* skin/classic/browser/zen-icons/cookies-fill.svg (../shared/zen-icons/lin/cookies-fill.svg)
* skin/classic/browser/zen-icons/customize.svg (../shared/zen-icons/lin/customize.svg)
* skin/classic/browser/zen-icons/desktop-notification-blocked.svg (../shared/zen-icons/lin/desktop-notification-blocked.svg)
+* skin/classic/browser/zen-icons/desktop-notification-fill.svg (../shared/zen-icons/lin/desktop-notification-fill.svg)
* skin/classic/browser/zen-icons/desktop-notification.svg (../shared/zen-icons/lin/desktop-notification.svg)
* skin/classic/browser/zen-icons/developer.svg (../shared/zen-icons/lin/developer.svg)
* skin/classic/browser/zen-icons/downloads.svg (../shared/zen-icons/lin/downloads.svg)
@@ -179,15 +194,16 @@
* skin/classic/browser/zen-icons/edit-paste.svg (../shared/zen-icons/lin/edit-paste.svg)
* skin/classic/browser/zen-icons/edit-redo.svg (../shared/zen-icons/lin/edit-redo.svg)
* skin/classic/browser/zen-icons/edit-select-all.svg (../shared/zen-icons/lin/edit-select-all.svg)
-* skin/classic/browser/zen-icons/edit.svg (../shared/zen-icons/lin/edit.svg)
* skin/classic/browser/zen-icons/edit-theme.svg (../shared/zen-icons/lin/edit-theme.svg)
* skin/classic/browser/zen-icons/edit-undo.svg (../shared/zen-icons/lin/edit-undo.svg)
+* skin/classic/browser/zen-icons/edit.svg (../shared/zen-icons/lin/edit.svg)
* skin/classic/browser/zen-icons/essential-add.svg (../shared/zen-icons/lin/essential-add.svg)
* skin/classic/browser/zen-icons/essential-remove.svg (../shared/zen-icons/lin/essential-remove.svg)
* skin/classic/browser/zen-icons/expand-sidebar.svg (../shared/zen-icons/lin/expand-sidebar.svg)
-* skin/classic/browser/zen-icons/extension-blocked.svg (../shared/zen-icons/lin/extension-blocked.svg)
-* skin/classic/browser/zen-icons/extension.svg (../shared/zen-icons/lin/extension.svg)
* skin/classic/browser/zen-icons/ext-link.svg (../shared/zen-icons/lin/ext-link.svg)
+* skin/classic/browser/zen-icons/extension-blocked.svg (../shared/zen-icons/lin/extension-blocked.svg)
+* skin/classic/browser/zen-icons/extension-fill.svg (../shared/zen-icons/lin/extension-fill.svg)
+* skin/classic/browser/zen-icons/extension.svg (../shared/zen-icons/lin/extension.svg)
* skin/classic/browser/zen-icons/face-sun.svg (../shared/zen-icons/lin/face-sun.svg)
* skin/classic/browser/zen-icons/firefox.svg (../shared/zen-icons/lin/firefox.svg)
* skin/classic/browser/zen-icons/folder.svg (../shared/zen-icons/lin/folder.svg)
@@ -196,6 +212,7 @@
* skin/classic/browser/zen-icons/fullscreen-exit.svg (../shared/zen-icons/lin/fullscreen-exit.svg)
* skin/classic/browser/zen-icons/fullscreen.svg (../shared/zen-icons/lin/fullscreen.svg)
* skin/classic/browser/zen-icons/geo-blocked.svg (../shared/zen-icons/lin/geo-blocked.svg)
+* skin/classic/browser/zen-icons/geo-fill.svg (../shared/zen-icons/lin/geo-fill.svg)
* skin/classic/browser/zen-icons/geo.svg (../shared/zen-icons/lin/geo.svg)
* skin/classic/browser/zen-icons/help.svg (../shared/zen-icons/lin/help.svg)
* skin/classic/browser/zen-icons/history.svg (../shared/zen-icons/lin/history.svg)
@@ -233,43 +250,47 @@
* skin/classic/browser/zen-icons/palette.svg (../shared/zen-icons/lin/palette.svg)
* skin/classic/browser/zen-icons/passwords.svg (../shared/zen-icons/lin/passwords.svg)
* skin/classic/browser/zen-icons/paste-and-go.svg (../shared/zen-icons/lin/paste-and-go.svg)
+* skin/classic/browser/zen-icons/permissions-fill.svg (../shared/zen-icons/lin/permissions-fill.svg)
* skin/classic/browser/zen-icons/permissions.svg (../shared/zen-icons/lin/permissions.svg)
* skin/classic/browser/zen-icons/persistent-storage-blocked.svg (../shared/zen-icons/lin/persistent-storage-blocked.svg)
+* skin/classic/browser/zen-icons/persistent-storage-fill.svg (../shared/zen-icons/lin/persistent-storage-fill.svg)
* skin/classic/browser/zen-icons/persistent-storage.svg (../shared/zen-icons/lin/persistent-storage.svg)
* skin/classic/browser/zen-icons/pin.svg (../shared/zen-icons/lin/pin.svg)
* skin/classic/browser/zen-icons/plus.svg (../shared/zen-icons/lin/plus.svg)
+* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/lin/popup-fill.svg)
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/lin/popup.svg)
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/lin/print.svg)
-* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/lin/privateBrowsing.svg)
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/lin/private-window.svg)
+* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/lin/privateBrowsing.svg)
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/lin/reader-mode.svg)
* skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/lin/reload.svg)
-* skin/classic/browser/zen-icons/reload-to-stop.svg (../shared/zen-icons/lin/reload-to-stop.svg)
* skin/classic/browser/zen-icons/report.svg (../shared/zen-icons/lin/report.svg)
* skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/lin/save.svg)
* skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/lin/screen-blocked.svg)
-* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/lin/screenshot.svg)
* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/lin/screen.svg)
+* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/lin/screenshot.svg)
* skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/lin/search-glass.svg)
* skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/lin/search-page.svg)
* skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/lin/security-broken.svg)
-* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/lin/security.svg)
* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/lin/security-warning.svg)
+* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/lin/security.svg)
* skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/lin/send-to-device.svg)
+* skin/classic/browser/zen-icons/settings-fill.svg (../shared/zen-icons/lin/settings-fill.svg)
* skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/lin/settings.svg)
* skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/lin/share.svg)
-* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/lin/sidebars-right.svg)
+* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/lin/sidebar-right.svg)
* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/lin/sidebar.svg)
+* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/lin/sidebars-right.svg)
* skin/classic/browser/zen-icons/source-code.svg (../shared/zen-icons/lin/source-code.svg)
* skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/lin/sparkles.svg)
* skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/lin/spell-check.svg)
* skin/classic/browser/zen-icons/split.svg (../shared/zen-icons/lin/split.svg)
-* skin/classic/browser/zen-icons/stop-to-reload.svg (../shared/zen-icons/lin/stop-to-reload.svg)
* skin/classic/browser/zen-icons/tab-audio-blocked-small.svg (../shared/zen-icons/lin/tab-audio-blocked-small.svg)
* skin/classic/browser/zen-icons/tab-audio-muted-small.svg (../shared/zen-icons/lin/tab-audio-muted-small.svg)
* skin/classic/browser/zen-icons/tab-audio-playing-small.svg (../shared/zen-icons/lin/tab-audio-playing-small.svg)
* skin/classic/browser/zen-icons/tab.svg (../shared/zen-icons/lin/tab.svg)
* skin/classic/browser/zen-icons/tool-profiler.svg (../shared/zen-icons/lin/tool-profiler.svg)
+* skin/classic/browser/zen-icons/tracking-protection-fill.svg (../shared/zen-icons/lin/tracking-protection-fill.svg)
* skin/classic/browser/zen-icons/tracking-protection.svg (../shared/zen-icons/lin/tracking-protection.svg)
* skin/classic/browser/zen-icons/translations.svg (../shared/zen-icons/lin/translations.svg)
* skin/classic/browser/zen-icons/trash.svg (../shared/zen-icons/lin/trash.svg)
@@ -280,6 +301,7 @@
* skin/classic/browser/zen-icons/video-save.svg (../shared/zen-icons/lin/video-save.svg)
* skin/classic/browser/zen-icons/window.svg (../shared/zen-icons/lin/window.svg)
* skin/classic/browser/zen-icons/xr-blocked.svg (../shared/zen-icons/lin/xr-blocked.svg)
+* skin/classic/browser/zen-icons/xr-fill.svg (../shared/zen-icons/lin/xr-fill.svg)
* skin/classic/browser/zen-icons/xr.svg (../shared/zen-icons/lin/xr.svg)
* skin/classic/browser/zen-icons/zoom-control.svg (../shared/zen-icons/lin/zoom-control.svg)
* skin/classic/browser/zen-icons/zoom-out.svg (../shared/zen-icons/lin/zoom-out.svg)
@@ -293,12 +315,14 @@
* skin/classic/browser/zen-icons/arrow-up.svg (../shared/zen-icons/lin/arrow-up.svg)
* skin/classic/browser/zen-icons/audio-save.svg (../shared/zen-icons/lin/audio-save.svg)
* skin/classic/browser/zen-icons/autoplay-media-blocked.svg (../shared/zen-icons/lin/autoplay-media-blocked.svg)
+* skin/classic/browser/zen-icons/autoplay-media-fill.svg (../shared/zen-icons/lin/autoplay-media-fill.svg)
* skin/classic/browser/zen-icons/autoplay-media.svg (../shared/zen-icons/lin/autoplay-media.svg)
* skin/classic/browser/zen-icons/back.svg (../shared/zen-icons/lin/back.svg)
* skin/classic/browser/zen-icons/bookmark-hollow.svg (../shared/zen-icons/lin/bookmark-hollow.svg)
* skin/classic/browser/zen-icons/bookmark-star-on-tray.svg (../shared/zen-icons/lin/bookmark-star-on-tray.svg)
* skin/classic/browser/zen-icons/bookmark.svg (../shared/zen-icons/lin/bookmark.svg)
* skin/classic/browser/zen-icons/camera-blocked.svg (../shared/zen-icons/lin/camera-blocked.svg)
+* skin/classic/browser/zen-icons/camera-fill.svg (../shared/zen-icons/lin/camera-fill.svg)
* skin/classic/browser/zen-icons/camera.svg (../shared/zen-icons/lin/camera.svg)
* skin/classic/browser/zen-icons/canvas-blocked.svg (../shared/zen-icons/lin/canvas-blocked.svg)
* skin/classic/browser/zen-icons/canvas.svg (../shared/zen-icons/lin/canvas.svg)
@@ -307,8 +331,10 @@
* skin/classic/browser/zen-icons/close-all.svg (../shared/zen-icons/lin/close-all.svg)
* skin/classic/browser/zen-icons/close.svg (../shared/zen-icons/lin/close.svg)
* skin/classic/browser/zen-icons/container-tab.svg (../shared/zen-icons/lin/container-tab.svg)
+* skin/classic/browser/zen-icons/cookies-fill.svg (../shared/zen-icons/lin/cookies-fill.svg)
* skin/classic/browser/zen-icons/customize.svg (../shared/zen-icons/lin/customize.svg)
* skin/classic/browser/zen-icons/desktop-notification-blocked.svg (../shared/zen-icons/lin/desktop-notification-blocked.svg)
+* skin/classic/browser/zen-icons/desktop-notification-fill.svg (../shared/zen-icons/lin/desktop-notification-fill.svg)
* skin/classic/browser/zen-icons/desktop-notification.svg (../shared/zen-icons/lin/desktop-notification.svg)
* skin/classic/browser/zen-icons/developer.svg (../shared/zen-icons/lin/developer.svg)
* skin/classic/browser/zen-icons/downloads.svg (../shared/zen-icons/lin/downloads.svg)
@@ -320,15 +346,16 @@
* skin/classic/browser/zen-icons/edit-paste.svg (../shared/zen-icons/lin/edit-paste.svg)
* skin/classic/browser/zen-icons/edit-redo.svg (../shared/zen-icons/lin/edit-redo.svg)
* skin/classic/browser/zen-icons/edit-select-all.svg (../shared/zen-icons/lin/edit-select-all.svg)
-* skin/classic/browser/zen-icons/edit.svg (../shared/zen-icons/lin/edit.svg)
* skin/classic/browser/zen-icons/edit-theme.svg (../shared/zen-icons/lin/edit-theme.svg)
* skin/classic/browser/zen-icons/edit-undo.svg (../shared/zen-icons/lin/edit-undo.svg)
+* skin/classic/browser/zen-icons/edit.svg (../shared/zen-icons/lin/edit.svg)
* skin/classic/browser/zen-icons/essential-add.svg (../shared/zen-icons/lin/essential-add.svg)
* skin/classic/browser/zen-icons/essential-remove.svg (../shared/zen-icons/lin/essential-remove.svg)
* skin/classic/browser/zen-icons/expand-sidebar.svg (../shared/zen-icons/lin/expand-sidebar.svg)
-* skin/classic/browser/zen-icons/extension-blocked.svg (../shared/zen-icons/lin/extension-blocked.svg)
-* skin/classic/browser/zen-icons/extension.svg (../shared/zen-icons/lin/extension.svg)
* skin/classic/browser/zen-icons/ext-link.svg (../shared/zen-icons/lin/ext-link.svg)
+* skin/classic/browser/zen-icons/extension-blocked.svg (../shared/zen-icons/lin/extension-blocked.svg)
+* skin/classic/browser/zen-icons/extension-fill.svg (../shared/zen-icons/lin/extension-fill.svg)
+* skin/classic/browser/zen-icons/extension.svg (../shared/zen-icons/lin/extension.svg)
* skin/classic/browser/zen-icons/face-sun.svg (../shared/zen-icons/lin/face-sun.svg)
* skin/classic/browser/zen-icons/firefox.svg (../shared/zen-icons/lin/firefox.svg)
* skin/classic/browser/zen-icons/folder.svg (../shared/zen-icons/lin/folder.svg)
@@ -337,6 +364,7 @@
* skin/classic/browser/zen-icons/fullscreen-exit.svg (../shared/zen-icons/lin/fullscreen-exit.svg)
* skin/classic/browser/zen-icons/fullscreen.svg (../shared/zen-icons/lin/fullscreen.svg)
* skin/classic/browser/zen-icons/geo-blocked.svg (../shared/zen-icons/lin/geo-blocked.svg)
+* skin/classic/browser/zen-icons/geo-fill.svg (../shared/zen-icons/lin/geo-fill.svg)
* skin/classic/browser/zen-icons/geo.svg (../shared/zen-icons/lin/geo.svg)
* skin/classic/browser/zen-icons/help.svg (../shared/zen-icons/lin/help.svg)
* skin/classic/browser/zen-icons/history.svg (../shared/zen-icons/lin/history.svg)
@@ -374,43 +402,47 @@
* skin/classic/browser/zen-icons/palette.svg (../shared/zen-icons/lin/palette.svg)
* skin/classic/browser/zen-icons/passwords.svg (../shared/zen-icons/lin/passwords.svg)
* skin/classic/browser/zen-icons/paste-and-go.svg (../shared/zen-icons/lin/paste-and-go.svg)
+* skin/classic/browser/zen-icons/permissions-fill.svg (../shared/zen-icons/lin/permissions-fill.svg)
* skin/classic/browser/zen-icons/permissions.svg (../shared/zen-icons/lin/permissions.svg)
* skin/classic/browser/zen-icons/persistent-storage-blocked.svg (../shared/zen-icons/lin/persistent-storage-blocked.svg)
+* skin/classic/browser/zen-icons/persistent-storage-fill.svg (../shared/zen-icons/lin/persistent-storage-fill.svg)
* skin/classic/browser/zen-icons/persistent-storage.svg (../shared/zen-icons/lin/persistent-storage.svg)
* skin/classic/browser/zen-icons/pin.svg (../shared/zen-icons/lin/pin.svg)
* skin/classic/browser/zen-icons/plus.svg (../shared/zen-icons/lin/plus.svg)
+* skin/classic/browser/zen-icons/popup-fill.svg (../shared/zen-icons/lin/popup-fill.svg)
* skin/classic/browser/zen-icons/popup.svg (../shared/zen-icons/lin/popup.svg)
* skin/classic/browser/zen-icons/print.svg (../shared/zen-icons/lin/print.svg)
-* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/lin/privateBrowsing.svg)
* skin/classic/browser/zen-icons/private-window.svg (../shared/zen-icons/lin/private-window.svg)
+* skin/classic/browser/zen-icons/privateBrowsing.svg (../shared/zen-icons/lin/privateBrowsing.svg)
* skin/classic/browser/zen-icons/reader-mode.svg (../shared/zen-icons/lin/reader-mode.svg)
* skin/classic/browser/zen-icons/reload.svg (../shared/zen-icons/lin/reload.svg)
-* skin/classic/browser/zen-icons/reload-to-stop.svg (../shared/zen-icons/lin/reload-to-stop.svg)
* skin/classic/browser/zen-icons/report.svg (../shared/zen-icons/lin/report.svg)
* skin/classic/browser/zen-icons/save.svg (../shared/zen-icons/lin/save.svg)
* skin/classic/browser/zen-icons/screen-blocked.svg (../shared/zen-icons/lin/screen-blocked.svg)
-* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/lin/screenshot.svg)
* skin/classic/browser/zen-icons/screen.svg (../shared/zen-icons/lin/screen.svg)
+* skin/classic/browser/zen-icons/screenshot.svg (../shared/zen-icons/lin/screenshot.svg)
* skin/classic/browser/zen-icons/search-glass.svg (../shared/zen-icons/lin/search-glass.svg)
* skin/classic/browser/zen-icons/search-page.svg (../shared/zen-icons/lin/search-page.svg)
* skin/classic/browser/zen-icons/security-broken.svg (../shared/zen-icons/lin/security-broken.svg)
-* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/lin/security.svg)
* skin/classic/browser/zen-icons/security-warning.svg (../shared/zen-icons/lin/security-warning.svg)
+* skin/classic/browser/zen-icons/security.svg (../shared/zen-icons/lin/security.svg)
* skin/classic/browser/zen-icons/send-to-device.svg (../shared/zen-icons/lin/send-to-device.svg)
+* skin/classic/browser/zen-icons/settings-fill.svg (../shared/zen-icons/lin/settings-fill.svg)
* skin/classic/browser/zen-icons/settings.svg (../shared/zen-icons/lin/settings.svg)
* skin/classic/browser/zen-icons/share.svg (../shared/zen-icons/lin/share.svg)
-* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/lin/sidebars-right.svg)
+* skin/classic/browser/zen-icons/sidebar-right.svg (../shared/zen-icons/lin/sidebar-right.svg)
* skin/classic/browser/zen-icons/sidebar.svg (../shared/zen-icons/lin/sidebar.svg)
+* skin/classic/browser/zen-icons/sidebars-right.svg (../shared/zen-icons/lin/sidebars-right.svg)
* skin/classic/browser/zen-icons/source-code.svg (../shared/zen-icons/lin/source-code.svg)
* skin/classic/browser/zen-icons/sparkles.svg (../shared/zen-icons/lin/sparkles.svg)
* skin/classic/browser/zen-icons/spell-check.svg (../shared/zen-icons/lin/spell-check.svg)
* skin/classic/browser/zen-icons/split.svg (../shared/zen-icons/lin/split.svg)
-* skin/classic/browser/zen-icons/stop-to-reload.svg (../shared/zen-icons/lin/stop-to-reload.svg)
* skin/classic/browser/zen-icons/tab-audio-blocked-small.svg (../shared/zen-icons/lin/tab-audio-blocked-small.svg)
* skin/classic/browser/zen-icons/tab-audio-muted-small.svg (../shared/zen-icons/lin/tab-audio-muted-small.svg)
* skin/classic/browser/zen-icons/tab-audio-playing-small.svg (../shared/zen-icons/lin/tab-audio-playing-small.svg)
* skin/classic/browser/zen-icons/tab.svg (../shared/zen-icons/lin/tab.svg)
* skin/classic/browser/zen-icons/tool-profiler.svg (../shared/zen-icons/lin/tool-profiler.svg)
+* skin/classic/browser/zen-icons/tracking-protection-fill.svg (../shared/zen-icons/lin/tracking-protection-fill.svg)
* skin/classic/browser/zen-icons/tracking-protection.svg (../shared/zen-icons/lin/tracking-protection.svg)
* skin/classic/browser/zen-icons/translations.svg (../shared/zen-icons/lin/translations.svg)
* skin/classic/browser/zen-icons/trash.svg (../shared/zen-icons/lin/trash.svg)
@@ -421,95 +453,96 @@
* skin/classic/browser/zen-icons/video-save.svg (../shared/zen-icons/lin/video-save.svg)
* skin/classic/browser/zen-icons/window.svg (../shared/zen-icons/lin/window.svg)
* skin/classic/browser/zen-icons/xr-blocked.svg (../shared/zen-icons/lin/xr-blocked.svg)
+* skin/classic/browser/zen-icons/xr-fill.svg (../shared/zen-icons/lin/xr-fill.svg)
* skin/classic/browser/zen-icons/xr.svg (../shared/zen-icons/lin/xr.svg)
* skin/classic/browser/zen-icons/zoom-control.svg (../shared/zen-icons/lin/zoom-control.svg)
* skin/classic/browser/zen-icons/zoom-out.svg (../shared/zen-icons/lin/zoom-out.svg)
#endif
* skin/classic/browser/zen-icons/urlbar-arrow.svg (../shared/zen-icons/common/urlbar-arrow.svg)
-* skin/classic/browser/zen-icons/selectable/airplane.svg (../shared/zen-icons/common/selectable/airplane.svg)
-* skin/classic/browser/zen-icons/selectable/american-football.svg (../shared/zen-icons/common/selectable/american-football.svg)
-* skin/classic/browser/zen-icons/selectable/baseball.svg (../shared/zen-icons/common/selectable/baseball.svg)
-* skin/classic/browser/zen-icons/selectable/basket.svg (../shared/zen-icons/common/selectable/basket.svg)
-* skin/classic/browser/zen-icons/selectable/bed.svg (../shared/zen-icons/common/selectable/bed.svg)
-* skin/classic/browser/zen-icons/selectable/bell.svg (../shared/zen-icons/common/selectable/bell.svg)
-* skin/classic/browser/zen-icons/selectable/bookmark.svg (../shared/zen-icons/common/selectable/bookmark.svg)
-* skin/classic/browser/zen-icons/selectable/book.svg (../shared/zen-icons/common/selectable/book.svg)
-* skin/classic/browser/zen-icons/selectable/briefcase.svg (../shared/zen-icons/common/selectable/briefcase.svg)
-* skin/classic/browser/zen-icons/selectable/brush.svg (../shared/zen-icons/common/selectable/brush.svg)
-* skin/classic/browser/zen-icons/selectable/bug.svg (../shared/zen-icons/common/selectable/bug.svg)
-* skin/classic/browser/zen-icons/selectable/build.svg (../shared/zen-icons/common/selectable/build.svg)
-* skin/classic/browser/zen-icons/selectable/cafe.svg (../shared/zen-icons/common/selectable/cafe.svg)
-* skin/classic/browser/zen-icons/selectable/call.svg (../shared/zen-icons/common/selectable/call.svg)
-* skin/classic/browser/zen-icons/selectable/card.svg (../shared/zen-icons/common/selectable/card.svg)
-* skin/classic/browser/zen-icons/selectable/chat.svg (../shared/zen-icons/common/selectable/chat.svg)
-* skin/classic/browser/zen-icons/selectable/checkbox.svg (../shared/zen-icons/common/selectable/checkbox.svg)
-* skin/classic/browser/zen-icons/selectable/circle.svg (../shared/zen-icons/common/selectable/circle.svg)
-* skin/classic/browser/zen-icons/selectable/cloud.svg (../shared/zen-icons/common/selectable/cloud.svg)
-* skin/classic/browser/zen-icons/selectable/code.svg (../shared/zen-icons/common/selectable/code.svg)
-* skin/classic/browser/zen-icons/selectable/coins.svg (../shared/zen-icons/common/selectable/coins.svg)
-* skin/classic/browser/zen-icons/selectable/construct.svg (../shared/zen-icons/common/selectable/construct.svg)
-* skin/classic/browser/zen-icons/selectable/cutlery.svg (../shared/zen-icons/common/selectable/cutlery.svg)
-* skin/classic/browser/zen-icons/selectable/egg.svg (../shared/zen-icons/common/selectable/egg.svg)
-* skin/classic/browser/zen-icons/selectable/extension-puzzle.svg (../shared/zen-icons/common/selectable/extension-puzzle.svg)
-* skin/classic/browser/zen-icons/selectable/eye.svg (../shared/zen-icons/common/selectable/eye.svg)
-* skin/classic/browser/zen-icons/selectable/fast-food.svg (../shared/zen-icons/common/selectable/fast-food.svg)
-* skin/classic/browser/zen-icons/selectable/fish.svg (../shared/zen-icons/common/selectable/fish.svg)
-* skin/classic/browser/zen-icons/selectable/flag.svg (../shared/zen-icons/common/selectable/flag.svg)
-* skin/classic/browser/zen-icons/selectable/flame.svg (../shared/zen-icons/common/selectable/flame.svg)
-* skin/classic/browser/zen-icons/selectable/flask.svg (../shared/zen-icons/common/selectable/flask.svg)
-* skin/classic/browser/zen-icons/selectable/folder.svg (../shared/zen-icons/common/selectable/folder.svg)
-* skin/classic/browser/zen-icons/selectable/game-controller.svg (../shared/zen-icons/common/selectable/game-controller.svg)
-* skin/classic/browser/zen-icons/selectable/globe-1.svg (../shared/zen-icons/common/selectable/globe-1.svg)
-* skin/classic/browser/zen-icons/selectable/globe.svg (../shared/zen-icons/common/selectable/globe.svg)
-* skin/classic/browser/zen-icons/selectable/grid-2x2.svg (../shared/zen-icons/common/selectable/grid-2x2.svg)
-* skin/classic/browser/zen-icons/selectable/grid-3x3.svg (../shared/zen-icons/common/selectable/grid-3x3.svg)
-* skin/classic/browser/zen-icons/selectable/heart.svg (../shared/zen-icons/common/selectable/heart.svg)
-* skin/classic/browser/zen-icons/selectable/ice-cream.svg (../shared/zen-icons/common/selectable/ice-cream.svg)
-* skin/classic/browser/zen-icons/selectable/image.svg (../shared/zen-icons/common/selectable/image.svg)
-* skin/classic/browser/zen-icons/selectable/inbox.svg (../shared/zen-icons/common/selectable/inbox.svg)
-* skin/classic/browser/zen-icons/selectable/key.svg (../shared/zen-icons/common/selectable/key.svg)
-* skin/classic/browser/zen-icons/selectable/layers.svg (../shared/zen-icons/common/selectable/layers.svg)
-* skin/classic/browser/zen-icons/selectable/leaf.svg (../shared/zen-icons/common/selectable/leaf.svg)
-* skin/classic/browser/zen-icons/selectable/lightning.svg (../shared/zen-icons/common/selectable/lightning.svg)
-* skin/classic/browser/zen-icons/selectable/location.svg (../shared/zen-icons/common/selectable/location.svg)
-* skin/classic/browser/zen-icons/selectable/lock-closed.svg (../shared/zen-icons/common/selectable/lock-closed.svg)
-* skin/classic/browser/zen-icons/selectable/logo-rss.svg (../shared/zen-icons/common/selectable/logo-rss.svg)
-* skin/classic/browser/zen-icons/selectable/logo-usd.svg (../shared/zen-icons/common/selectable/logo-usd.svg)
-* skin/classic/browser/zen-icons/selectable/mail.svg (../shared/zen-icons/common/selectable/mail.svg)
-* skin/classic/browser/zen-icons/selectable/map.svg (../shared/zen-icons/common/selectable/map.svg)
-* skin/classic/browser/zen-icons/selectable/megaphone.svg (../shared/zen-icons/common/selectable/megaphone.svg)
-* skin/classic/browser/zen-icons/selectable/moon.svg (../shared/zen-icons/common/selectable/moon.svg)
-* skin/classic/browser/zen-icons/selectable/music.svg (../shared/zen-icons/common/selectable/music.svg)
-* skin/classic/browser/zen-icons/selectable/navigate.svg (../shared/zen-icons/common/selectable/navigate.svg)
-* skin/classic/browser/zen-icons/selectable/nuclear.svg (../shared/zen-icons/common/selectable/nuclear.svg)
-* skin/classic/browser/zen-icons/selectable/page.svg (../shared/zen-icons/common/selectable/page.svg)
-* skin/classic/browser/zen-icons/selectable/palette.svg (../shared/zen-icons/common/selectable/palette.svg)
-* skin/classic/browser/zen-icons/selectable/paw.svg (../shared/zen-icons/common/selectable/paw.svg)
-* skin/classic/browser/zen-icons/selectable/people.svg (../shared/zen-icons/common/selectable/people.svg)
-* skin/classic/browser/zen-icons/selectable/pizza.svg (../shared/zen-icons/common/selectable/pizza.svg)
-* skin/classic/browser/zen-icons/selectable/planet.svg (../shared/zen-icons/common/selectable/planet.svg)
-* skin/classic/browser/zen-icons/selectable/present.svg (../shared/zen-icons/common/selectable/present.svg)
-* skin/classic/browser/zen-icons/selectable/rocket.svg (../shared/zen-icons/common/selectable/rocket.svg)
-* skin/classic/browser/zen-icons/selectable/school.svg (../shared/zen-icons/common/selectable/school.svg)
-* skin/classic/browser/zen-icons/selectable/shapes.svg (../shared/zen-icons/common/selectable/shapes.svg)
-* skin/classic/browser/zen-icons/selectable/shirt.svg (../shared/zen-icons/common/selectable/shirt.svg)
-* skin/classic/browser/zen-icons/selectable/skull.svg (../shared/zen-icons/common/selectable/skull.svg)
-* skin/classic/browser/zen-icons/selectable/squares.svg (../shared/zen-icons/common/selectable/squares.svg)
-* skin/classic/browser/zen-icons/selectable/square.svg (../shared/zen-icons/common/selectable/square.svg)
-* skin/classic/browser/zen-icons/selectable/star-1.svg (../shared/zen-icons/common/selectable/star-1.svg)
-* skin/classic/browser/zen-icons/selectable/star.svg (../shared/zen-icons/common/selectable/star.svg)
-* skin/classic/browser/zen-icons/selectable/stats-chart.svg (../shared/zen-icons/common/selectable/stats-chart.svg)
-* skin/classic/browser/zen-icons/selectable/sun.svg (../shared/zen-icons/common/selectable/sun.svg)
-* skin/classic/browser/zen-icons/selectable/tada.svg (../shared/zen-icons/common/selectable/tada.svg)
-* skin/classic/browser/zen-icons/selectable/terminal.svg (../shared/zen-icons/common/selectable/terminal.svg)
-* skin/classic/browser/zen-icons/selectable/ticket.svg (../shared/zen-icons/common/selectable/ticket.svg)
-* skin/classic/browser/zen-icons/selectable/time.svg (../shared/zen-icons/common/selectable/time.svg)
-* skin/classic/browser/zen-icons/selectable/trash.svg (../shared/zen-icons/common/selectable/trash.svg)
-* skin/classic/browser/zen-icons/selectable/triangle.svg (../shared/zen-icons/common/selectable/triangle.svg)
-* skin/classic/browser/zen-icons/selectable/video.svg (../shared/zen-icons/common/selectable/video.svg)
-* skin/classic/browser/zen-icons/selectable/volume-high.svg (../shared/zen-icons/common/selectable/volume-high.svg)
-* skin/classic/browser/zen-icons/selectable/wallet.svg (../shared/zen-icons/common/selectable/wallet.svg)
-* skin/classic/browser/zen-icons/selectable/warning.svg (../shared/zen-icons/common/selectable/warning.svg)
-* skin/classic/browser/zen-icons/selectable/water.svg (../shared/zen-icons/common/selectable/water.svg)
-* skin/classic/browser/zen-icons/selectable/weight.svg (../shared/zen-icons/common/selectable/weight.svg)
+* skin/classic/browser/zen-icons/selectable/airplane.svg (../shared/zen-icons/common/selectable/airplane.svg)
+* skin/classic/browser/zen-icons/selectable/american-football.svg (../shared/zen-icons/common/selectable/american-football.svg)
+* skin/classic/browser/zen-icons/selectable/baseball.svg (../shared/zen-icons/common/selectable/baseball.svg)
+* skin/classic/browser/zen-icons/selectable/basket.svg (../shared/zen-icons/common/selectable/basket.svg)
+* skin/classic/browser/zen-icons/selectable/bed.svg (../shared/zen-icons/common/selectable/bed.svg)
+* skin/classic/browser/zen-icons/selectable/bell.svg (../shared/zen-icons/common/selectable/bell.svg)
+* skin/classic/browser/zen-icons/selectable/book.svg (../shared/zen-icons/common/selectable/book.svg)
+* skin/classic/browser/zen-icons/selectable/bookmark.svg (../shared/zen-icons/common/selectable/bookmark.svg)
+* skin/classic/browser/zen-icons/selectable/briefcase.svg (../shared/zen-icons/common/selectable/briefcase.svg)
+* skin/classic/browser/zen-icons/selectable/brush.svg (../shared/zen-icons/common/selectable/brush.svg)
+* skin/classic/browser/zen-icons/selectable/bug.svg (../shared/zen-icons/common/selectable/bug.svg)
+* skin/classic/browser/zen-icons/selectable/build.svg (../shared/zen-icons/common/selectable/build.svg)
+* skin/classic/browser/zen-icons/selectable/cafe.svg (../shared/zen-icons/common/selectable/cafe.svg)
+* skin/classic/browser/zen-icons/selectable/call.svg (../shared/zen-icons/common/selectable/call.svg)
+* skin/classic/browser/zen-icons/selectable/card.svg (../shared/zen-icons/common/selectable/card.svg)
+* skin/classic/browser/zen-icons/selectable/chat.svg (../shared/zen-icons/common/selectable/chat.svg)
+* skin/classic/browser/zen-icons/selectable/checkbox.svg (../shared/zen-icons/common/selectable/checkbox.svg)
+* skin/classic/browser/zen-icons/selectable/circle.svg (../shared/zen-icons/common/selectable/circle.svg)
+* skin/classic/browser/zen-icons/selectable/cloud.svg (../shared/zen-icons/common/selectable/cloud.svg)
+* skin/classic/browser/zen-icons/selectable/code.svg (../shared/zen-icons/common/selectable/code.svg)
+* skin/classic/browser/zen-icons/selectable/coins.svg (../shared/zen-icons/common/selectable/coins.svg)
+* skin/classic/browser/zen-icons/selectable/construct.svg (../shared/zen-icons/common/selectable/construct.svg)
+* skin/classic/browser/zen-icons/selectable/cutlery.svg (../shared/zen-icons/common/selectable/cutlery.svg)
+* skin/classic/browser/zen-icons/selectable/egg.svg (../shared/zen-icons/common/selectable/egg.svg)
+* skin/classic/browser/zen-icons/selectable/extension-puzzle.svg (../shared/zen-icons/common/selectable/extension-puzzle.svg)
+* skin/classic/browser/zen-icons/selectable/eye.svg (../shared/zen-icons/common/selectable/eye.svg)
+* skin/classic/browser/zen-icons/selectable/fast-food.svg (../shared/zen-icons/common/selectable/fast-food.svg)
+* skin/classic/browser/zen-icons/selectable/fish.svg (../shared/zen-icons/common/selectable/fish.svg)
+* skin/classic/browser/zen-icons/selectable/flag.svg (../shared/zen-icons/common/selectable/flag.svg)
+* skin/classic/browser/zen-icons/selectable/flame.svg (../shared/zen-icons/common/selectable/flame.svg)
+* skin/classic/browser/zen-icons/selectable/flask.svg (../shared/zen-icons/common/selectable/flask.svg)
+* skin/classic/browser/zen-icons/selectable/folder.svg (../shared/zen-icons/common/selectable/folder.svg)
+* skin/classic/browser/zen-icons/selectable/game-controller.svg (../shared/zen-icons/common/selectable/game-controller.svg)
+* skin/classic/browser/zen-icons/selectable/globe-1.svg (../shared/zen-icons/common/selectable/globe-1.svg)
+* skin/classic/browser/zen-icons/selectable/globe.svg (../shared/zen-icons/common/selectable/globe.svg)
+* skin/classic/browser/zen-icons/selectable/grid-2x2.svg (../shared/zen-icons/common/selectable/grid-2x2.svg)
+* skin/classic/browser/zen-icons/selectable/grid-3x3.svg (../shared/zen-icons/common/selectable/grid-3x3.svg)
+* skin/classic/browser/zen-icons/selectable/heart.svg (../shared/zen-icons/common/selectable/heart.svg)
+* skin/classic/browser/zen-icons/selectable/ice-cream.svg (../shared/zen-icons/common/selectable/ice-cream.svg)
+* skin/classic/browser/zen-icons/selectable/image.svg (../shared/zen-icons/common/selectable/image.svg)
+* skin/classic/browser/zen-icons/selectable/inbox.svg (../shared/zen-icons/common/selectable/inbox.svg)
+* skin/classic/browser/zen-icons/selectable/key.svg (../shared/zen-icons/common/selectable/key.svg)
+* skin/classic/browser/zen-icons/selectable/layers.svg (../shared/zen-icons/common/selectable/layers.svg)
+* skin/classic/browser/zen-icons/selectable/leaf.svg (../shared/zen-icons/common/selectable/leaf.svg)
+* skin/classic/browser/zen-icons/selectable/lightning.svg (../shared/zen-icons/common/selectable/lightning.svg)
+* skin/classic/browser/zen-icons/selectable/location.svg (../shared/zen-icons/common/selectable/location.svg)
+* skin/classic/browser/zen-icons/selectable/lock-closed.svg (../shared/zen-icons/common/selectable/lock-closed.svg)
+* skin/classic/browser/zen-icons/selectable/logo-rss.svg (../shared/zen-icons/common/selectable/logo-rss.svg)
+* skin/classic/browser/zen-icons/selectable/logo-usd.svg (../shared/zen-icons/common/selectable/logo-usd.svg)
+* skin/classic/browser/zen-icons/selectable/mail.svg (../shared/zen-icons/common/selectable/mail.svg)
+* skin/classic/browser/zen-icons/selectable/map.svg (../shared/zen-icons/common/selectable/map.svg)
+* skin/classic/browser/zen-icons/selectable/megaphone.svg (../shared/zen-icons/common/selectable/megaphone.svg)
+* skin/classic/browser/zen-icons/selectable/moon.svg (../shared/zen-icons/common/selectable/moon.svg)
+* skin/classic/browser/zen-icons/selectable/music.svg (../shared/zen-icons/common/selectable/music.svg)
+* skin/classic/browser/zen-icons/selectable/navigate.svg (../shared/zen-icons/common/selectable/navigate.svg)
+* skin/classic/browser/zen-icons/selectable/nuclear.svg (../shared/zen-icons/common/selectable/nuclear.svg)
+* skin/classic/browser/zen-icons/selectable/page.svg (../shared/zen-icons/common/selectable/page.svg)
+* skin/classic/browser/zen-icons/selectable/palette.svg (../shared/zen-icons/common/selectable/palette.svg)
+* skin/classic/browser/zen-icons/selectable/paw.svg (../shared/zen-icons/common/selectable/paw.svg)
+* skin/classic/browser/zen-icons/selectable/people.svg (../shared/zen-icons/common/selectable/people.svg)
+* skin/classic/browser/zen-icons/selectable/pizza.svg (../shared/zen-icons/common/selectable/pizza.svg)
+* skin/classic/browser/zen-icons/selectable/planet.svg (../shared/zen-icons/common/selectable/planet.svg)
+* skin/classic/browser/zen-icons/selectable/present.svg (../shared/zen-icons/common/selectable/present.svg)
+* skin/classic/browser/zen-icons/selectable/rocket.svg (../shared/zen-icons/common/selectable/rocket.svg)
+* skin/classic/browser/zen-icons/selectable/school.svg (../shared/zen-icons/common/selectable/school.svg)
+* skin/classic/browser/zen-icons/selectable/shapes.svg (../shared/zen-icons/common/selectable/shapes.svg)
+* skin/classic/browser/zen-icons/selectable/shirt.svg (../shared/zen-icons/common/selectable/shirt.svg)
+* skin/classic/browser/zen-icons/selectable/skull.svg (../shared/zen-icons/common/selectable/skull.svg)
+* skin/classic/browser/zen-icons/selectable/square.svg (../shared/zen-icons/common/selectable/square.svg)
+* skin/classic/browser/zen-icons/selectable/squares.svg (../shared/zen-icons/common/selectable/squares.svg)
+* skin/classic/browser/zen-icons/selectable/star-1.svg (../shared/zen-icons/common/selectable/star-1.svg)
+* skin/classic/browser/zen-icons/selectable/star.svg (../shared/zen-icons/common/selectable/star.svg)
+* skin/classic/browser/zen-icons/selectable/stats-chart.svg (../shared/zen-icons/common/selectable/stats-chart.svg)
+* skin/classic/browser/zen-icons/selectable/sun.svg (../shared/zen-icons/common/selectable/sun.svg)
+* skin/classic/browser/zen-icons/selectable/tada.svg (../shared/zen-icons/common/selectable/tada.svg)
+* skin/classic/browser/zen-icons/selectable/terminal.svg (../shared/zen-icons/common/selectable/terminal.svg)
+* skin/classic/browser/zen-icons/selectable/ticket.svg (../shared/zen-icons/common/selectable/ticket.svg)
+* skin/classic/browser/zen-icons/selectable/time.svg (../shared/zen-icons/common/selectable/time.svg)
+* skin/classic/browser/zen-icons/selectable/trash.svg (../shared/zen-icons/common/selectable/trash.svg)
+* skin/classic/browser/zen-icons/selectable/triangle.svg (../shared/zen-icons/common/selectable/triangle.svg)
+* skin/classic/browser/zen-icons/selectable/video.svg (../shared/zen-icons/common/selectable/video.svg)
+* skin/classic/browser/zen-icons/selectable/volume-high.svg (../shared/zen-icons/common/selectable/volume-high.svg)
+* skin/classic/browser/zen-icons/selectable/wallet.svg (../shared/zen-icons/common/selectable/wallet.svg)
+* skin/classic/browser/zen-icons/selectable/warning.svg (../shared/zen-icons/common/selectable/warning.svg)
+* skin/classic/browser/zen-icons/selectable/water.svg (../shared/zen-icons/common/selectable/water.svg)
+* skin/classic/browser/zen-icons/selectable/weight.svg (../shared/zen-icons/common/selectable/weight.svg)
skin/classic/browser/zen-icons/icons.css (../shared/zen-icons/icons.css)
diff --git a/src/browser/themes/shared/zen-icons/lin/autoplay-media-fill.svg b/src/browser/themes/shared/zen-icons/lin/autoplay-media-fill.svg
new file mode 100644
index 000000000..d16ce98cf
--- /dev/null
+++ b/src/browser/themes/shared/zen-icons/lin/autoplay-media-fill.svg
@@ -0,0 +1,5 @@
+#filter dumbComments emptyLines substitution
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
diff --git a/src/browser/themes/shared/zen-icons/lin/bookmark.svg b/src/browser/themes/shared/zen-icons/lin/bookmark.svg
index 506c02cc1..278b3fa90 100644
--- a/src/browser/themes/shared/zen-icons/lin/bookmark.svg
+++ b/src/browser/themes/shared/zen-icons/lin/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/.
-
+
diff --git a/src/browser/themes/shared/zen-icons/lin/camera-fill.svg b/src/browser/themes/shared/zen-icons/lin/camera-fill.svg
new file mode 100644
index 000000000..60b32e501
--- /dev/null
+++ b/src/browser/themes/shared/zen-icons/lin/camera-fill.svg
@@ -0,0 +1,5 @@
+#filter dumbComments emptyLines substitution
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
diff --git a/src/browser/themes/shared/zen-icons/lin/camera.svg b/src/browser/themes/shared/zen-icons/lin/camera.svg
index 310a865d6..232a55ab9 100644
--- a/src/browser/themes/shared/zen-icons/lin/camera.svg
+++ b/src/browser/themes/shared/zen-icons/lin/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/.
-
+
diff --git a/src/browser/themes/shared/zen-icons/lin/cookies-fill.svg b/src/browser/themes/shared/zen-icons/lin/cookies-fill.svg
new file mode 100644
index 000000000..384076dc0
--- /dev/null
+++ b/src/browser/themes/shared/zen-icons/lin/cookies-fill.svg
@@ -0,0 +1,5 @@
+#filter dumbComments emptyLines substitution
+# 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/lin/desktop-notification-fill.svg b/src/browser/themes/shared/zen-icons/lin/desktop-notification-fill.svg
new file mode 100644
index 000000000..c94bb578c
--- /dev/null
+++ b/src/browser/themes/shared/zen-icons/lin/desktop-notification-fill.svg
@@ -0,0 +1,5 @@
+#filter dumbComments emptyLines substitution
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
diff --git a/src/browser/themes/shared/zen-icons/lin/desktop-notification.svg b/src/browser/themes/shared/zen-icons/lin/desktop-notification.svg
index 0620eabbf..fe56121b8 100644
--- a/src/browser/themes/shared/zen-icons/lin/desktop-notification.svg
+++ b/src/browser/themes/shared/zen-icons/lin/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/.
-
+
diff --git a/src/browser/themes/shared/zen-icons/lin/extension-fill.svg b/src/browser/themes/shared/zen-icons/lin/extension-fill.svg
new file mode 100644
index 000000000..bd54d8d8c
--- /dev/null
+++ b/src/browser/themes/shared/zen-icons/lin/extension-fill.svg
@@ -0,0 +1,5 @@
+#filter dumbComments emptyLines substitution
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
diff --git a/src/browser/themes/shared/zen-icons/lin/geo-fill.svg b/src/browser/themes/shared/zen-icons/lin/geo-fill.svg
new file mode 100644
index 000000000..c97eaf78d
--- /dev/null
+++ b/src/browser/themes/shared/zen-icons/lin/geo-fill.svg
@@ -0,0 +1,5 @@
+#filter dumbComments emptyLines substitution
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
diff --git a/src/browser/themes/shared/zen-icons/lin/permissions-fill.svg b/src/browser/themes/shared/zen-icons/lin/permissions-fill.svg
new file mode 100644
index 000000000..3d38645aa
--- /dev/null
+++ b/src/browser/themes/shared/zen-icons/lin/permissions-fill.svg
@@ -0,0 +1,5 @@
+#filter dumbComments emptyLines substitution
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
diff --git a/src/browser/themes/shared/zen-icons/lin/persistent-storage-fill.svg b/src/browser/themes/shared/zen-icons/lin/persistent-storage-fill.svg
new file mode 100644
index 000000000..1c5e3099d
--- /dev/null
+++ b/src/browser/themes/shared/zen-icons/lin/persistent-storage-fill.svg
@@ -0,0 +1,5 @@
+#filter dumbComments emptyLines substitution
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
diff --git a/src/browser/themes/shared/zen-icons/lin/popup-fill.svg b/src/browser/themes/shared/zen-icons/lin/popup-fill.svg
new file mode 100644
index 000000000..958aed3f2
--- /dev/null
+++ b/src/browser/themes/shared/zen-icons/lin/popup-fill.svg
@@ -0,0 +1,5 @@
+#filter dumbComments emptyLines substitution
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
diff --git a/src/browser/themes/shared/zen-icons/lin/popup.svg b/src/browser/themes/shared/zen-icons/lin/popup.svg
index 4b1f1eb4b..66f513bfd 100644
--- a/src/browser/themes/shared/zen-icons/lin/popup.svg
+++ b/src/browser/themes/shared/zen-icons/lin/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/.
-
+
diff --git a/src/browser/themes/shared/zen-icons/lin/reader-mode.svg b/src/browser/themes/shared/zen-icons/lin/reader-mode.svg
index 22b11f430..be854bc27 100644
--- a/src/browser/themes/shared/zen-icons/lin/reader-mode.svg
+++ b/src/browser/themes/shared/zen-icons/lin/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/.
-
+
diff --git a/src/browser/themes/shared/zen-icons/lin/reload-to-stop.svg b/src/browser/themes/shared/zen-icons/lin/reload-to-stop.svg
deleted file mode 100644
index e4c0f09cc..000000000
--- a/src/browser/themes/shared/zen-icons/lin/reload-to-stop.svg
+++ /dev/null
@@ -1,32 +0,0 @@
-#filter dumbComments emptyLines substitution
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-
diff --git a/src/browser/themes/shared/zen-icons/lin/screenshot.svg b/src/browser/themes/shared/zen-icons/lin/screenshot.svg
index 1ade98c05..2d1224924 100644
--- a/src/browser/themes/shared/zen-icons/lin/screenshot.svg
+++ b/src/browser/themes/shared/zen-icons/lin/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/.
-
+
diff --git a/src/browser/themes/shared/zen-icons/lin/security-broken.svg b/src/browser/themes/shared/zen-icons/lin/security-broken.svg
index 06097d2ea..86396585e 100644
--- a/src/browser/themes/shared/zen-icons/lin/security-broken.svg
+++ b/src/browser/themes/shared/zen-icons/lin/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/.
-
+
diff --git a/src/browser/themes/shared/zen-icons/lin/settings-fill.svg b/src/browser/themes/shared/zen-icons/lin/settings-fill.svg
new file mode 100644
index 000000000..749d47eba
--- /dev/null
+++ b/src/browser/themes/shared/zen-icons/lin/settings-fill.svg
@@ -0,0 +1,5 @@
+#filter dumbComments emptyLines substitution
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
diff --git a/src/browser/themes/shared/zen-icons/lin/share.svg b/src/browser/themes/shared/zen-icons/lin/share.svg
index 8fbd2bd81..a4eb9e169 100644
--- a/src/browser/themes/shared/zen-icons/lin/share.svg
+++ b/src/browser/themes/shared/zen-icons/lin/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/.
-
+
diff --git a/src/browser/themes/shared/zen-icons/lin/sidebar-right.svg b/src/browser/themes/shared/zen-icons/lin/sidebar-right.svg
new file mode 100644
index 000000000..d25f84075
--- /dev/null
+++ b/src/browser/themes/shared/zen-icons/lin/sidebar-right.svg
@@ -0,0 +1,5 @@
+#filter dumbComments emptyLines substitution
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
diff --git a/src/browser/themes/shared/zen-icons/lin/sidebar.svg b/src/browser/themes/shared/zen-icons/lin/sidebar.svg
index bd468826a..9f0aa3571 100644
--- a/src/browser/themes/shared/zen-icons/lin/sidebar.svg
+++ b/src/browser/themes/shared/zen-icons/lin/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/.
-
+
diff --git a/src/browser/themes/shared/zen-icons/lin/stop-to-reload.svg b/src/browser/themes/shared/zen-icons/lin/stop-to-reload.svg
deleted file mode 100644
index ac36f0afa..000000000
--- a/src/browser/themes/shared/zen-icons/lin/stop-to-reload.svg
+++ /dev/null
@@ -1,39 +0,0 @@
-#filter dumbComments emptyLines substitution
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/lin/tracking-protection-fill.svg b/src/browser/themes/shared/zen-icons/lin/tracking-protection-fill.svg
new file mode 100644
index 000000000..8a9ef1f1f
--- /dev/null
+++ b/src/browser/themes/shared/zen-icons/lin/tracking-protection-fill.svg
@@ -0,0 +1,5 @@
+#filter dumbComments emptyLines substitution
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
diff --git a/src/browser/themes/shared/zen-icons/lin/xr-fill.svg b/src/browser/themes/shared/zen-icons/lin/xr-fill.svg
new file mode 100644
index 000000000..bd387cd56
--- /dev/null
+++ b/src/browser/themes/shared/zen-icons/lin/xr-fill.svg
@@ -0,0 +1,5 @@
+#filter dumbComments emptyLines substitution
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
diff --git a/src/browser/themes/shared/zen-icons/win/NOTE.md b/src/browser/themes/shared/zen-icons/win/NOTE.md
new file mode 100644
index 000000000..7c04449e8
--- /dev/null
+++ b/src/browser/themes/shared/zen-icons/win/NOTE.md
@@ -0,0 +1,3 @@
+# Notice
+
+MacOS icons are using Nucleo icons. This until we figure out how sizing works with Fluent icons.
diff --git a/src/browser/themes/shared/zen-icons/win/accessibility.svg b/src/browser/themes/shared/zen-icons/win/accessibility.svg
deleted file mode 100644
index da974a8e9..000000000
--- a/src/browser/themes/shared/zen-icons/win/accessibility.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/add-to-dictionary.svg b/src/browser/themes/shared/zen-icons/win/add-to-dictionary.svg
deleted file mode 100644
index 49cd0844a..000000000
--- a/src/browser/themes/shared/zen-icons/win/add-to-dictionary.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/arrow-down.svg b/src/browser/themes/shared/zen-icons/win/arrow-down.svg
deleted file mode 100644
index 8704d0cf6..000000000
--- a/src/browser/themes/shared/zen-icons/win/arrow-down.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/arrow-left.svg b/src/browser/themes/shared/zen-icons/win/arrow-left.svg
deleted file mode 100644
index caba961b9..000000000
--- a/src/browser/themes/shared/zen-icons/win/arrow-left.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/arrow-right.svg b/src/browser/themes/shared/zen-icons/win/arrow-right.svg
deleted file mode 100644
index f9f1f57ef..000000000
--- a/src/browser/themes/shared/zen-icons/win/arrow-right.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/arrow-up.svg b/src/browser/themes/shared/zen-icons/win/arrow-up.svg
deleted file mode 100644
index f577628c6..000000000
--- a/src/browser/themes/shared/zen-icons/win/arrow-up.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/audio-save.svg b/src/browser/themes/shared/zen-icons/win/audio-save.svg
deleted file mode 100644
index c43d00a7e..000000000
--- a/src/browser/themes/shared/zen-icons/win/audio-save.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/autoplay-media-blocked.svg b/src/browser/themes/shared/zen-icons/win/autoplay-media-blocked.svg
deleted file mode 100644
index 8b524b130..000000000
--- a/src/browser/themes/shared/zen-icons/win/autoplay-media-blocked.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/autoplay-media.svg b/src/browser/themes/shared/zen-icons/win/autoplay-media.svg
deleted file mode 100644
index 2f16958a1..000000000
--- a/src/browser/themes/shared/zen-icons/win/autoplay-media.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/back.svg b/src/browser/themes/shared/zen-icons/win/back.svg
deleted file mode 100644
index caba961b9..000000000
--- a/src/browser/themes/shared/zen-icons/win/back.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/bookmark-hollow.svg b/src/browser/themes/shared/zen-icons/win/bookmark-hollow.svg
deleted file mode 100644
index 97d4fd562..000000000
--- a/src/browser/themes/shared/zen-icons/win/bookmark-hollow.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/bookmark-star-on-tray.svg b/src/browser/themes/shared/zen-icons/win/bookmark-star-on-tray.svg
deleted file mode 100644
index 874eeeb91..000000000
--- a/src/browser/themes/shared/zen-icons/win/bookmark-star-on-tray.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/bookmark.svg b/src/browser/themes/shared/zen-icons/win/bookmark.svg
deleted file mode 100644
index 39d18ddc9..000000000
--- a/src/browser/themes/shared/zen-icons/win/bookmark.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/camera-blocked.svg b/src/browser/themes/shared/zen-icons/win/camera-blocked.svg
deleted file mode 100644
index 5a534884a..000000000
--- a/src/browser/themes/shared/zen-icons/win/camera-blocked.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/camera.svg b/src/browser/themes/shared/zen-icons/win/camera.svg
deleted file mode 100644
index 23fa82b5c..000000000
--- a/src/browser/themes/shared/zen-icons/win/camera.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/canvas-blocked.svg b/src/browser/themes/shared/zen-icons/win/canvas-blocked.svg
deleted file mode 100644
index 610701ad9..000000000
--- a/src/browser/themes/shared/zen-icons/win/canvas-blocked.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/canvas.svg b/src/browser/themes/shared/zen-icons/win/canvas.svg
deleted file mode 100644
index c4cb3d062..000000000
--- a/src/browser/themes/shared/zen-icons/win/canvas.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/checkmark.svg b/src/browser/themes/shared/zen-icons/win/checkmark.svg
deleted file mode 100644
index b93b71eef..000000000
--- a/src/browser/themes/shared/zen-icons/win/checkmark.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/chevron.svg b/src/browser/themes/shared/zen-icons/win/chevron.svg
deleted file mode 100644
index 54b5ccee5..000000000
--- a/src/browser/themes/shared/zen-icons/win/chevron.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/close-all.svg b/src/browser/themes/shared/zen-icons/win/close-all.svg
deleted file mode 100644
index 610701ad9..000000000
--- a/src/browser/themes/shared/zen-icons/win/close-all.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/close.svg b/src/browser/themes/shared/zen-icons/win/close.svg
deleted file mode 100644
index 610701ad9..000000000
--- a/src/browser/themes/shared/zen-icons/win/close.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/container-tab.svg b/src/browser/themes/shared/zen-icons/win/container-tab.svg
deleted file mode 100644
index 10ad36eb4..000000000
--- a/src/browser/themes/shared/zen-icons/win/container-tab.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/customize.svg b/src/browser/themes/shared/zen-icons/win/customize.svg
deleted file mode 100644
index 9afdcfad5..000000000
--- a/src/browser/themes/shared/zen-icons/win/customize.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/desktop-notification-blocked.svg b/src/browser/themes/shared/zen-icons/win/desktop-notification-blocked.svg
deleted file mode 100644
index fcde94f09..000000000
--- a/src/browser/themes/shared/zen-icons/win/desktop-notification-blocked.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/desktop-notification.svg b/src/browser/themes/shared/zen-icons/win/desktop-notification.svg
deleted file mode 100644
index 1cb4892a2..000000000
--- a/src/browser/themes/shared/zen-icons/win/desktop-notification.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/developer.svg b/src/browser/themes/shared/zen-icons/win/developer.svg
deleted file mode 100644
index 754c7127a..000000000
--- a/src/browser/themes/shared/zen-icons/win/developer.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/downloads.svg b/src/browser/themes/shared/zen-icons/win/downloads.svg
deleted file mode 100644
index 7395f44d4..000000000
--- a/src/browser/themes/shared/zen-icons/win/downloads.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/drag-indicator.svg b/src/browser/themes/shared/zen-icons/win/drag-indicator.svg
deleted file mode 100644
index cfa50fb6c..000000000
--- a/src/browser/themes/shared/zen-icons/win/drag-indicator.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/duplicate-tab.svg b/src/browser/themes/shared/zen-icons/win/duplicate-tab.svg
deleted file mode 100644
index 0d19e1ea6..000000000
--- a/src/browser/themes/shared/zen-icons/win/duplicate-tab.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/edit-copy.svg b/src/browser/themes/shared/zen-icons/win/edit-copy.svg
deleted file mode 100644
index fe5b95f0c..000000000
--- a/src/browser/themes/shared/zen-icons/win/edit-copy.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/edit-cut.svg b/src/browser/themes/shared/zen-icons/win/edit-cut.svg
deleted file mode 100644
index 207bf8c2d..000000000
--- a/src/browser/themes/shared/zen-icons/win/edit-cut.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/edit-delete.svg b/src/browser/themes/shared/zen-icons/win/edit-delete.svg
deleted file mode 100644
index 5b2514d5a..000000000
--- a/src/browser/themes/shared/zen-icons/win/edit-delete.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/edit-paste.svg b/src/browser/themes/shared/zen-icons/win/edit-paste.svg
deleted file mode 100644
index 9d6e28cb9..000000000
--- a/src/browser/themes/shared/zen-icons/win/edit-paste.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/edit-redo.svg b/src/browser/themes/shared/zen-icons/win/edit-redo.svg
deleted file mode 100644
index 941b5532c..000000000
--- a/src/browser/themes/shared/zen-icons/win/edit-redo.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/edit-select-all.svg b/src/browser/themes/shared/zen-icons/win/edit-select-all.svg
deleted file mode 100644
index 44fc0323d..000000000
--- a/src/browser/themes/shared/zen-icons/win/edit-select-all.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/edit-theme.svg b/src/browser/themes/shared/zen-icons/win/edit-theme.svg
deleted file mode 100644
index bc2deff2c..000000000
--- a/src/browser/themes/shared/zen-icons/win/edit-theme.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/edit-undo.svg b/src/browser/themes/shared/zen-icons/win/edit-undo.svg
deleted file mode 100644
index 185390167..000000000
--- a/src/browser/themes/shared/zen-icons/win/edit-undo.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/edit.svg b/src/browser/themes/shared/zen-icons/win/edit.svg
deleted file mode 100644
index 3f61408de..000000000
--- a/src/browser/themes/shared/zen-icons/win/edit.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/essential-add.svg b/src/browser/themes/shared/zen-icons/win/essential-add.svg
deleted file mode 100644
index 85bf28ce4..000000000
--- a/src/browser/themes/shared/zen-icons/win/essential-add.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/essential-remove.svg b/src/browser/themes/shared/zen-icons/win/essential-remove.svg
deleted file mode 100644
index 22056e100..000000000
--- a/src/browser/themes/shared/zen-icons/win/essential-remove.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/expand-sidebar.svg b/src/browser/themes/shared/zen-icons/win/expand-sidebar.svg
deleted file mode 100644
index a0b557ac9..000000000
--- a/src/browser/themes/shared/zen-icons/win/expand-sidebar.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/ext-link.svg b/src/browser/themes/shared/zen-icons/win/ext-link.svg
deleted file mode 100644
index 97d1d7a58..000000000
--- a/src/browser/themes/shared/zen-icons/win/ext-link.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/extension-blocked.svg b/src/browser/themes/shared/zen-icons/win/extension-blocked.svg
deleted file mode 100644
index 1b113373b..000000000
--- a/src/browser/themes/shared/zen-icons/win/extension-blocked.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/extension.svg b/src/browser/themes/shared/zen-icons/win/extension.svg
deleted file mode 100644
index a2a1ed1b3..000000000
--- a/src/browser/themes/shared/zen-icons/win/extension.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/folder.svg b/src/browser/themes/shared/zen-icons/win/folder.svg
deleted file mode 100644
index d0d746da5..000000000
--- a/src/browser/themes/shared/zen-icons/win/folder.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/forget.svg b/src/browser/themes/shared/zen-icons/win/forget.svg
deleted file mode 100644
index e8d85efba..000000000
--- a/src/browser/themes/shared/zen-icons/win/forget.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/forward.svg b/src/browser/themes/shared/zen-icons/win/forward.svg
deleted file mode 100644
index f9f1f57ef..000000000
--- a/src/browser/themes/shared/zen-icons/win/forward.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/fullscreen-exit.svg b/src/browser/themes/shared/zen-icons/win/fullscreen-exit.svg
deleted file mode 100644
index 1620641e8..000000000
--- a/src/browser/themes/shared/zen-icons/win/fullscreen-exit.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/fullscreen.svg b/src/browser/themes/shared/zen-icons/win/fullscreen.svg
deleted file mode 100644
index 6079f4ffc..000000000
--- a/src/browser/themes/shared/zen-icons/win/fullscreen.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/geo-blocked.svg b/src/browser/themes/shared/zen-icons/win/geo-blocked.svg
deleted file mode 100644
index ed3e8d83d..000000000
--- a/src/browser/themes/shared/zen-icons/win/geo-blocked.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/geo.svg b/src/browser/themes/shared/zen-icons/win/geo.svg
deleted file mode 100644
index 624ae44eb..000000000
--- a/src/browser/themes/shared/zen-icons/win/geo.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/help.svg b/src/browser/themes/shared/zen-icons/win/help.svg
deleted file mode 100644
index 34881278a..000000000
--- a/src/browser/themes/shared/zen-icons/win/help.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/history.svg b/src/browser/themes/shared/zen-icons/win/history.svg
deleted file mode 100644
index 01c6dde38..000000000
--- a/src/browser/themes/shared/zen-icons/win/history.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/home.svg b/src/browser/themes/shared/zen-icons/win/home.svg
deleted file mode 100644
index f59c8c4f3..000000000
--- a/src/browser/themes/shared/zen-icons/win/home.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/image-copy.svg b/src/browser/themes/shared/zen-icons/win/image-copy.svg
deleted file mode 100644
index 1a40f3c9f..000000000
--- a/src/browser/themes/shared/zen-icons/win/image-copy.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/image-open.svg b/src/browser/themes/shared/zen-icons/win/image-open.svg
deleted file mode 100644
index 18c8d8c5b..000000000
--- a/src/browser/themes/shared/zen-icons/win/image-open.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/image-save.svg b/src/browser/themes/shared/zen-icons/win/image-save.svg
deleted file mode 100644
index dcc543496..000000000
--- a/src/browser/themes/shared/zen-icons/win/image-save.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/info.svg b/src/browser/themes/shared/zen-icons/win/info.svg
deleted file mode 100644
index 0b6e91f1d..000000000
--- a/src/browser/themes/shared/zen-icons/win/info.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/inspect.svg b/src/browser/themes/shared/zen-icons/win/inspect.svg
deleted file mode 100644
index 0b2d1b13f..000000000
--- a/src/browser/themes/shared/zen-icons/win/inspect.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/library.svg b/src/browser/themes/shared/zen-icons/win/library.svg
deleted file mode 100644
index 0b6529f24..000000000
--- a/src/browser/themes/shared/zen-icons/win/library.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/link.svg b/src/browser/themes/shared/zen-icons/win/link.svg
deleted file mode 100644
index 97d1d7a58..000000000
--- a/src/browser/themes/shared/zen-icons/win/link.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/mail.svg b/src/browser/themes/shared/zen-icons/win/mail.svg
deleted file mode 100644
index 2e81d135a..000000000
--- a/src/browser/themes/shared/zen-icons/win/mail.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/manage.svg b/src/browser/themes/shared/zen-icons/win/manage.svg
deleted file mode 100644
index 3f61408de..000000000
--- a/src/browser/themes/shared/zen-icons/win/manage.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/media-loop.svg b/src/browser/themes/shared/zen-icons/win/media-loop.svg
deleted file mode 100644
index 61c564724..000000000
--- a/src/browser/themes/shared/zen-icons/win/media-loop.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/media-mute.svg b/src/browser/themes/shared/zen-icons/win/media-mute.svg
deleted file mode 100644
index 0d36ee1a3..000000000
--- a/src/browser/themes/shared/zen-icons/win/media-mute.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/media-pause.svg b/src/browser/themes/shared/zen-icons/win/media-pause.svg
deleted file mode 100644
index 0821baf41..000000000
--- a/src/browser/themes/shared/zen-icons/win/media-pause.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/media-pip.svg b/src/browser/themes/shared/zen-icons/win/media-pip.svg
deleted file mode 100644
index 6706a9905..000000000
--- a/src/browser/themes/shared/zen-icons/win/media-pip.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/media-play.svg b/src/browser/themes/shared/zen-icons/win/media-play.svg
deleted file mode 100644
index 56e3247d9..000000000
--- a/src/browser/themes/shared/zen-icons/win/media-play.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/media-speed.svg b/src/browser/themes/shared/zen-icons/win/media-speed.svg
deleted file mode 100644
index 043e248be..000000000
--- a/src/browser/themes/shared/zen-icons/win/media-speed.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/media-unmute.svg b/src/browser/themes/shared/zen-icons/win/media-unmute.svg
deleted file mode 100644
index 892a7b8c9..000000000
--- a/src/browser/themes/shared/zen-icons/win/media-unmute.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/menu-bar.svg b/src/browser/themes/shared/zen-icons/win/menu-bar.svg
deleted file mode 100644
index 8d1b46478..000000000
--- a/src/browser/themes/shared/zen-icons/win/menu-bar.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/menu.svg b/src/browser/themes/shared/zen-icons/win/menu.svg
deleted file mode 100644
index 239e4fd6b..000000000
--- a/src/browser/themes/shared/zen-icons/win/menu.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/microphone-blocked.svg b/src/browser/themes/shared/zen-icons/win/microphone-blocked.svg
deleted file mode 100644
index ae310434a..000000000
--- a/src/browser/themes/shared/zen-icons/win/microphone-blocked.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/microphone.svg b/src/browser/themes/shared/zen-icons/win/microphone.svg
deleted file mode 100644
index 2e070f6c6..000000000
--- a/src/browser/themes/shared/zen-icons/win/microphone.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/midi.svg b/src/browser/themes/shared/zen-icons/win/midi.svg
deleted file mode 100644
index 83926d7b1..000000000
--- a/src/browser/themes/shared/zen-icons/win/midi.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/move-tab.svg b/src/browser/themes/shared/zen-icons/win/move-tab.svg
deleted file mode 100644
index 18c3ce5cf..000000000
--- a/src/browser/themes/shared/zen-icons/win/move-tab.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/new-tab-image.svg b/src/browser/themes/shared/zen-icons/win/new-tab-image.svg
deleted file mode 100644
index 3c51d9ce1..000000000
--- a/src/browser/themes/shared/zen-icons/win/new-tab-image.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/open.svg b/src/browser/themes/shared/zen-icons/win/open.svg
deleted file mode 100644
index ca73b622b..000000000
--- a/src/browser/themes/shared/zen-icons/win/open.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/page-portrait.svg b/src/browser/themes/shared/zen-icons/win/page-portrait.svg
deleted file mode 100644
index e4671ddfc..000000000
--- a/src/browser/themes/shared/zen-icons/win/page-portrait.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/palette.svg b/src/browser/themes/shared/zen-icons/win/palette.svg
deleted file mode 100644
index ccefad575..000000000
--- a/src/browser/themes/shared/zen-icons/win/palette.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/passwords.svg b/src/browser/themes/shared/zen-icons/win/passwords.svg
deleted file mode 100644
index 91c6abd01..000000000
--- a/src/browser/themes/shared/zen-icons/win/passwords.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/paste-and-go.svg b/src/browser/themes/shared/zen-icons/win/paste-and-go.svg
deleted file mode 100644
index 0557af7b6..000000000
--- a/src/browser/themes/shared/zen-icons/win/paste-and-go.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/permissions.svg b/src/browser/themes/shared/zen-icons/win/permissions.svg
deleted file mode 100644
index 8127d5fd0..000000000
--- a/src/browser/themes/shared/zen-icons/win/permissions.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/persistent-storage-blocked.svg b/src/browser/themes/shared/zen-icons/win/persistent-storage-blocked.svg
deleted file mode 100644
index e916240ae..000000000
--- a/src/browser/themes/shared/zen-icons/win/persistent-storage-blocked.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/persistent-storage.svg b/src/browser/themes/shared/zen-icons/win/persistent-storage.svg
deleted file mode 100644
index e916240ae..000000000
--- a/src/browser/themes/shared/zen-icons/win/persistent-storage.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/pin.svg b/src/browser/themes/shared/zen-icons/win/pin.svg
deleted file mode 100644
index 521dc77a8..000000000
--- a/src/browser/themes/shared/zen-icons/win/pin.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/plus.svg b/src/browser/themes/shared/zen-icons/win/plus.svg
deleted file mode 100644
index 9c8388c67..000000000
--- a/src/browser/themes/shared/zen-icons/win/plus.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/popup.svg b/src/browser/themes/shared/zen-icons/win/popup.svg
deleted file mode 100644
index 5eeccf131..000000000
--- a/src/browser/themes/shared/zen-icons/win/popup.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/print.svg b/src/browser/themes/shared/zen-icons/win/print.svg
deleted file mode 100644
index b052dc728..000000000
--- a/src/browser/themes/shared/zen-icons/win/print.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/private-window.svg b/src/browser/themes/shared/zen-icons/win/private-window.svg
deleted file mode 100644
index 4b6d4a841..000000000
--- a/src/browser/themes/shared/zen-icons/win/private-window.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/privateBrowsing.svg b/src/browser/themes/shared/zen-icons/win/privateBrowsing.svg
deleted file mode 100644
index 4b6d4a841..000000000
--- a/src/browser/themes/shared/zen-icons/win/privateBrowsing.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/reader-mode.svg b/src/browser/themes/shared/zen-icons/win/reader-mode.svg
deleted file mode 100644
index 9b5bd9e2f..000000000
--- a/src/browser/themes/shared/zen-icons/win/reader-mode.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/reload-to-stop.svg b/src/browser/themes/shared/zen-icons/win/reload-to-stop.svg
deleted file mode 100644
index 610701ad9..000000000
--- a/src/browser/themes/shared/zen-icons/win/reload-to-stop.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/reload.svg b/src/browser/themes/shared/zen-icons/win/reload.svg
deleted file mode 100644
index 5fb5b4ae8..000000000
--- a/src/browser/themes/shared/zen-icons/win/reload.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/report.svg b/src/browser/themes/shared/zen-icons/win/report.svg
deleted file mode 100644
index 6bbc3ba0b..000000000
--- a/src/browser/themes/shared/zen-icons/win/report.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/save.svg b/src/browser/themes/shared/zen-icons/win/save.svg
deleted file mode 100644
index 98cdb9736..000000000
--- a/src/browser/themes/shared/zen-icons/win/save.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/screen-blocked.svg b/src/browser/themes/shared/zen-icons/win/screen-blocked.svg
deleted file mode 100644
index 1b113373b..000000000
--- a/src/browser/themes/shared/zen-icons/win/screen-blocked.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/screen.svg b/src/browser/themes/shared/zen-icons/win/screen.svg
deleted file mode 100644
index 0fd4a1d5b..000000000
--- a/src/browser/themes/shared/zen-icons/win/screen.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/screenshot.svg b/src/browser/themes/shared/zen-icons/win/screenshot.svg
deleted file mode 100644
index 57beb3728..000000000
--- a/src/browser/themes/shared/zen-icons/win/screenshot.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/search-glass.svg b/src/browser/themes/shared/zen-icons/win/search-glass.svg
deleted file mode 100644
index 0276bf0f6..000000000
--- a/src/browser/themes/shared/zen-icons/win/search-glass.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/search-page.svg b/src/browser/themes/shared/zen-icons/win/search-page.svg
deleted file mode 100644
index 56f962ce1..000000000
--- a/src/browser/themes/shared/zen-icons/win/search-page.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/security-broken.svg b/src/browser/themes/shared/zen-icons/win/security-broken.svg
deleted file mode 100644
index 05db52f90..000000000
--- a/src/browser/themes/shared/zen-icons/win/security-broken.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/security-warning.svg b/src/browser/themes/shared/zen-icons/win/security-warning.svg
deleted file mode 100644
index 4526702e3..000000000
--- a/src/browser/themes/shared/zen-icons/win/security-warning.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/security.svg b/src/browser/themes/shared/zen-icons/win/security.svg
deleted file mode 100644
index 1b0ad62aa..000000000
--- a/src/browser/themes/shared/zen-icons/win/security.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/send-to-device.svg b/src/browser/themes/shared/zen-icons/win/send-to-device.svg
deleted file mode 100644
index bf1d8760b..000000000
--- a/src/browser/themes/shared/zen-icons/win/send-to-device.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/settings.svg b/src/browser/themes/shared/zen-icons/win/settings.svg
deleted file mode 100644
index 7a33ac655..000000000
--- a/src/browser/themes/shared/zen-icons/win/settings.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/share.svg b/src/browser/themes/shared/zen-icons/win/share.svg
deleted file mode 100644
index 145a304fa..000000000
--- a/src/browser/themes/shared/zen-icons/win/share.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/sidebar.svg b/src/browser/themes/shared/zen-icons/win/sidebar.svg
deleted file mode 100644
index 30ae938f9..000000000
--- a/src/browser/themes/shared/zen-icons/win/sidebar.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/sidebars-right.svg b/src/browser/themes/shared/zen-icons/win/sidebars-right.svg
deleted file mode 100644
index b9b6776d6..000000000
--- a/src/browser/themes/shared/zen-icons/win/sidebars-right.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/source-code.svg b/src/browser/themes/shared/zen-icons/win/source-code.svg
deleted file mode 100644
index f7d10c8f3..000000000
--- a/src/browser/themes/shared/zen-icons/win/source-code.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/spell-check.svg b/src/browser/themes/shared/zen-icons/win/spell-check.svg
deleted file mode 100644
index 2b5aa112b..000000000
--- a/src/browser/themes/shared/zen-icons/win/spell-check.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/split.svg b/src/browser/themes/shared/zen-icons/win/split.svg
deleted file mode 100644
index 35301d829..000000000
--- a/src/browser/themes/shared/zen-icons/win/split.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/stop-to-reload.svg b/src/browser/themes/shared/zen-icons/win/stop-to-reload.svg
deleted file mode 100644
index 610701ad9..000000000
--- a/src/browser/themes/shared/zen-icons/win/stop-to-reload.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/tab-audio-blocked-small.svg b/src/browser/themes/shared/zen-icons/win/tab-audio-blocked-small.svg
deleted file mode 100644
index e3aef5a93..000000000
--- a/src/browser/themes/shared/zen-icons/win/tab-audio-blocked-small.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/tab-audio-muted-small.svg b/src/browser/themes/shared/zen-icons/win/tab-audio-muted-small.svg
deleted file mode 100644
index 46aa4baf8..000000000
--- a/src/browser/themes/shared/zen-icons/win/tab-audio-muted-small.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/tab-audio-playing-small.svg b/src/browser/themes/shared/zen-icons/win/tab-audio-playing-small.svg
deleted file mode 100644
index 2c335ca32..000000000
--- a/src/browser/themes/shared/zen-icons/win/tab-audio-playing-small.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/tab.svg b/src/browser/themes/shared/zen-icons/win/tab.svg
deleted file mode 100644
index 33910b1c5..000000000
--- a/src/browser/themes/shared/zen-icons/win/tab.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/tracking-protection.svg b/src/browser/themes/shared/zen-icons/win/tracking-protection.svg
deleted file mode 100644
index 1b0ad62aa..000000000
--- a/src/browser/themes/shared/zen-icons/win/tracking-protection.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/translations.svg b/src/browser/themes/shared/zen-icons/win/translations.svg
deleted file mode 100644
index 1f1250aee..000000000
--- a/src/browser/themes/shared/zen-icons/win/translations.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/unpin.svg b/src/browser/themes/shared/zen-icons/win/unpin.svg
deleted file mode 100644
index eaecf42c2..000000000
--- a/src/browser/themes/shared/zen-icons/win/unpin.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/video-open.svg b/src/browser/themes/shared/zen-icons/win/video-open.svg
deleted file mode 100644
index 098a3c6fd..000000000
--- a/src/browser/themes/shared/zen-icons/win/video-open.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/video-save.svg b/src/browser/themes/shared/zen-icons/win/video-save.svg
deleted file mode 100644
index dac667cf2..000000000
--- a/src/browser/themes/shared/zen-icons/win/video-save.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/window.svg b/src/browser/themes/shared/zen-icons/win/window.svg
deleted file mode 100644
index 8d1b46478..000000000
--- a/src/browser/themes/shared/zen-icons/win/window.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/xr-blocked.svg b/src/browser/themes/shared/zen-icons/win/xr-blocked.svg
deleted file mode 100644
index 20ec5003d..000000000
--- a/src/browser/themes/shared/zen-icons/win/xr-blocked.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/xr.svg b/src/browser/themes/shared/zen-icons/win/xr.svg
deleted file mode 100644
index 20ec5003d..000000000
--- a/src/browser/themes/shared/zen-icons/win/xr.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/zoom-control.svg b/src/browser/themes/shared/zen-icons/win/zoom-control.svg
deleted file mode 100644
index d20186926..000000000
--- a/src/browser/themes/shared/zen-icons/win/zoom-control.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/shared/zen-icons/win/zoom-out.svg b/src/browser/themes/shared/zen-icons/win/zoom-out.svg
deleted file mode 100644
index 494e71dd1..000000000
--- a/src/browser/themes/shared/zen-icons/win/zoom-out.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
diff --git a/src/browser/themes/windows/browser-css.patch b/src/browser/themes/windows/browser-css.patch
index 098bd9c63..c8e03bdee 100644
--- a/src/browser/themes/windows/browser-css.patch
+++ b/src/browser/themes/windows/browser-css.patch
@@ -1,5 +1,5 @@
diff --git a/browser/themes/windows/browser.css b/browser/themes/windows/browser.css
-index 4485369284ee762bc8b35afb84fec0874a831fff..7096e2e5d50cda99b62a2aa7118fea6371e76b85 100644
+index e1a79cd22180738d2ca16e9a6c5591499d337325..d36996359bfa4dd7d98c4f5aeb192c7b144339bb 100644
--- a/browser/themes/windows/browser.css
+++ b/browser/themes/windows/browser.css
@@ -31,7 +31,6 @@
@@ -10,13 +10,14 @@ index 4485369284ee762bc8b35afb84fec0874a831fff..7096e2e5d50cda99b62a2aa7118fea63
}
/* Using a semitransparent background preserves the tinting from the backdrop.
-@@ -60,14 +59,12 @@
+@@ -60,14 +59,13 @@
}
/* This is needed for Windows 10, see bug 1961257 */
-@media (-moz-windows-accent-color-in-titlebar) {
- :root[customtitlebar][sizemode="normal"] #navigator-toolbox {
+ :root[customtitlebar][sizemode="normal"] #browser {
++ --zen-sidebar-compact-top-offset: 1px;
border-top: 0.5px solid ActiveBorder;
&:-moz-window-inactive {
border-top-color: InactiveBorder;
diff --git a/src/build/moz-build.patch b/src/build/moz-build.patch
index 596a09b20..7ccf4194c 100644
--- a/src/build/moz-build.patch
+++ b/src/build/moz-build.patch
@@ -1,8 +1,8 @@
diff --git a/build/moz.build b/build/moz.build
-index f7a912ec35dd089ea9a7e712765e954854f55cb3..a84534efbc7662f81573a4a80bc045e0a6d2ed3e 100644
+index 720fb1235f418fb063e88d8bbcd2eb444e84870b..ed831a4d35e006bc03aa514a6c00968a4dd19624 100644
--- a/build/moz.build
+++ b/build/moz.build
-@@ -89,7 +89,7 @@ if CONFIG["MOZ_APP_BASENAME"]:
+@@ -93,7 +93,7 @@ if CONFIG["MOZ_APP_BASENAME"]:
if CONFIG[var]:
appini_defines[var] = True
diff --git a/src/devtools/server/actors/animation-type-longhand-js.patch b/src/devtools/server/actors/animation-type-longhand-js.patch
index d9872df5a..29e44807d 100644
--- a/src/devtools/server/actors/animation-type-longhand-js.patch
+++ b/src/devtools/server/actors/animation-type-longhand-js.patch
@@ -1,8 +1,8 @@
diff --git a/devtools/server/actors/animation-type-longhand.js b/devtools/server/actors/animation-type-longhand.js
-index 17960549c60ebab9ac7c50a70cb69a6b1f8c37dd..9a9ec4539d39f20dccf449cbdcd066efee145b50 100644
+index ea27f1209ddb9b33ae044186c2b795685a0bde67..6d808a760885f0e26ff307a39d6977228359fe71 100644
--- a/devtools/server/actors/animation-type-longhand.js
+++ b/devtools/server/actors/animation-type-longhand.js
-@@ -343,6 +343,7 @@ exports.ANIMATION_TYPE_FOR_LONGHANDS = [
+@@ -344,6 +344,7 @@ exports.ANIMATION_TYPE_FOR_LONGHANDS = [
"transform-origin",
"translate",
"-moz-window-transform",
diff --git a/src/devtools/startup/DevToolsStartup-sys-mjs.patch b/src/devtools/startup/DevToolsStartup-sys-mjs.patch
index b9c5e983d..9f7ea1c66 100644
--- a/src/devtools/startup/DevToolsStartup-sys-mjs.patch
+++ b/src/devtools/startup/DevToolsStartup-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/devtools/startup/DevToolsStartup.sys.mjs b/devtools/startup/DevToolsStartup.sys.mjs
-index 175edde2720f31c796e8ae8823e2aff17944f423..d9d4f7f5e53064b1ba07870dced2e1452fdde6b1 100644
+index 95de0614e392e00036500a5b3ef9976041f37ec6..2c842055ce1d7ffd94c8f21a82305a3a13d493e0 100644
--- a/devtools/startup/DevToolsStartup.sys.mjs
+++ b/devtools/startup/DevToolsStartup.sys.mjs
@@ -816,6 +816,7 @@ DevToolsStartup.prototype = {
diff --git a/src/dom/base/Document-cpp.patch b/src/dom/base/Document-cpp.patch
index 022968aaa..37f0f667b 100644
--- a/src/dom/base/Document-cpp.patch
+++ b/src/dom/base/Document-cpp.patch
@@ -1,8 +1,8 @@
diff --git a/dom/base/Document.cpp b/dom/base/Document.cpp
-index 7d7a93e9e76b4957e3ac5860dfc730b7c4e6ad1d..c7c689b73c6599e9e736f73a67bb402d083964a0 100644
+index 0c2ef36f9765b6904659ac0ed4329468ca89225f..d06552e8d4ac102dd50a1afea10938ca32aeb788 100644
--- a/dom/base/Document.cpp
+++ b/dom/base/Document.cpp
-@@ -467,6 +467,7 @@
+@@ -466,6 +466,7 @@
#include "prtime.h"
#include "prtypes.h"
#include "xpcpublic.h"
@@ -10,7 +10,7 @@ index 7d7a93e9e76b4957e3ac5860dfc730b7c4e6ad1d..c7c689b73c6599e9e736f73a67bb402d
// clang-format off
#include "mozilla/Encoding.h"
-@@ -3345,6 +3346,10 @@ void Document::FillStyleSetUserAndUASheets() {
+@@ -3428,6 +3429,10 @@ void Document::FillStyleSetUserAndUASheets() {
for (StyleSheet* sheet : *sheetService->UserStyleSheets()) {
styleSet.AppendStyleSheet(*sheet);
}
diff --git a/src/dom/base/use_counter_metrics-yaml.patch b/src/dom/base/use_counter_metrics-yaml.patch
index e8f250c47..eeac251f7 100644
--- a/src/dom/base/use_counter_metrics-yaml.patch
+++ b/src/dom/base/use_counter_metrics-yaml.patch
@@ -1,8 +1,8 @@
diff --git a/dom/base/use_counter_metrics.yaml b/dom/base/use_counter_metrics.yaml
-index adf8d1ed451a54426d92e65557801cffa2f64281..0bf810d3544e42689ad530468bfce5380a51e274 100644
+index 157d46c37d0a465f02f794eda4323f7e344c5e63..aec8b819dbcf853c2e6d5513000149449fae36fd 100644
--- a/dom/base/use_counter_metrics.yaml
+++ b/dom/base/use_counter_metrics.yaml
-@@ -21477,6 +21477,22 @@ use.counter.css.page:
+@@ -21154,6 +21154,22 @@ use.counter.css.page:
send_in_pings:
- use-counters
@@ -25,7 +25,7 @@ index adf8d1ed451a54426d92e65557801cffa2f64281..0bf810d3544e42689ad530468bfce538
css_transform_origin:
type: counter
description: >
-@@ -33481,6 +33497,22 @@ use.counter.css.doc:
+@@ -33175,6 +33191,22 @@ use.counter.css.doc:
send_in_pings:
- use-counters
diff --git a/src/dom/media/mediacontrol/MediaStatusManager-cpp.patch b/src/dom/media/mediacontrol/MediaStatusManager-cpp.patch
new file mode 100644
index 000000000..9e005e88c
--- /dev/null
+++ b/src/dom/media/mediacontrol/MediaStatusManager-cpp.patch
@@ -0,0 +1,14 @@
+diff --git a/dom/media/mediacontrol/MediaStatusManager.cpp b/dom/media/mediacontrol/MediaStatusManager.cpp
+index 9d62b302fb519df9c00e26e8876dc6adcbc0b448..ece3509d2a99dee1cf7c22749b38959340c85976 100644
+--- a/dom/media/mediacontrol/MediaStatusManager.cpp
++++ b/dom/media/mediacontrol/MediaStatusManager.cpp
+@@ -427,7 +427,8 @@ void MediaStatusManager::UpdateGuessedPositionState(
+ return;
+ }
+
+- mPositionStateChangedEvent.Notify(GetCurrentPositionState());
++ // Workaround to position state getting stuck after seek
++ mPositionStateChangedEvent.Notify(aGuessedState);
+ }
+
+ void MediaStatusManager::NotifySupportedKeysChangedIfNeeded(
diff --git a/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch b/src/dom/media/mediaelement/HTMLMediaElement-cpp.patch
index 60236c198..da62b610d 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 d46d5edc1d66c1eee8780abad444289fdc36a518..0e0d69819d9eee82add726792ec829c05551a076 100644
+index 741a8f1744f48e7db4dbda64c856efaf9f3564b0..f9a2c0878f8a923903ed8eb65cbd355d40b41715 100644
--- a/dom/media/mediaelement/HTMLMediaElement.cpp
+++ b/dom/media/mediaelement/HTMLMediaElement.cpp
@@ -453,6 +453,7 @@ class HTMLMediaElement::MediaControlKeyListener final
@@ -10,7 +10,7 @@ index d46d5edc1d66c1eee8780abad444289fdc36a518..0e0d69819d9eee82add726792ec829c0
NotifyAudibleStateChanged(mIsOwnerAudible
? MediaAudibleState::eAudible
: MediaAudibleState::eInaudible);
-@@ -7034,6 +7035,9 @@ void HTMLMediaElement::FireTimeUpdate(TimeupdateType aType) {
+@@ -7191,6 +7192,9 @@ void HTMLMediaElement::FireTimeUpdate(TimeupdateType aType) {
QueueTask(std::move(runner));
mQueueTimeUpdateRunnerTime = TimeStamp::Now();
mLastCurrentTime = CurrentTime();
diff --git a/src/firefox-patches/ff-145-tahoe-upgrade.patch b/src/firefox-patches/ff-145-tahoe-upgrade.patch
new file mode 100644
index 000000000..9caa99615
--- /dev/null
+++ b/src/firefox-patches/ff-145-tahoe-upgrade.patch
@@ -0,0 +1,372 @@
+diff --git a/mfbt/tests/TestUniquePtr.cpp b/mfbt/tests/TestUniquePtr.cpp
+--- a/mfbt/tests/TestUniquePtr.cpp
++++ b/mfbt/tests/TestUniquePtr.cpp
+@@ -314,43 +314,45 @@
+ gADestructorCalls = 0;
+ gBDestructorCalls = 0;
+ return true;
+ }
+
+-typedef void (&FreeSignature)(void*);
++struct Free {
++ void operator()(void* aPtr) { free(aPtr); }
++};
+
+ static size_t DeleteIntFunctionCallCount = 0;
++struct DeleteIntFunction {
++ void operator()(void* aPtr) {
++ DeleteIntFunctionCallCount++;
++ delete[] static_cast(aPtr);
++ }
++};
+
+-static void DeleteIntFunction(void* aPtr) {
+- DeleteIntFunctionCallCount++;
+- delete[] static_cast(aPtr);
+-}
+-
+-static void SetMallocedInt(UniquePtr& aPtr, int aI) {
++static void SetMallocedInt(UniquePtr& aPtr, int aI) {
+ int* newPtr = static_cast(malloc(sizeof(int)));
+ *newPtr = aI;
+ aPtr.reset(newPtr);
+ }
+
+-static UniquePtr MallocedInt(int aI) {
+- UniquePtr ptr(static_cast(malloc(sizeof(int))),
+- free);
++static UniquePtr MallocedInt(int aI) {
++ UniquePtr ptr(static_cast(malloc(sizeof(int))), Free{});
+ *ptr = aI;
+ return ptr;
+ }
+ static bool TestFunctionReferenceDeleter() {
+ // Look for allocator mismatches and leaks to verify these bits
+- UniquePtr i1(MallocedInt(17));
++ UniquePtr i1(MallocedInt(17));
+ CHECK(*i1 == 17);
+
+ SetMallocedInt(i1, 42);
+ CHECK(*i1 == 42);
+
+ // These bits use a custom deleter so we can instrument deletion.
+ {
+- UniquePtr i2 =
+- UniquePtr(new int[42], DeleteIntFunction);
++ UniquePtr i2 =
++ UniquePtr(new int[42], DeleteIntFunction{});
+ CHECK(DeleteIntFunctionCallCount == 0);
+
+ i2.reset(new int[76]);
+ CHECK(DeleteIntFunctionCallCount == 1);
+ }
+
+diff --git a/build/moz.configure/toolchain.configure b/build/moz.configure/toolchain.configure
+--- a/build/moz.configure/toolchain.configure
++++ b/build/moz.configure/toolchain.configure
+@@ -231,11 +231,11 @@
+ nargs=1,
+ help="Location of platform SDK to use",
+ )
+
+ def mac_sdk_min_version():
+- return "15.5"
++ return "26.0"
+
+ @depends(
+ "--with-macos-sdk",
+ host,
+ bootstrap_path(
+diff --git a/browser/themes/osx/places/organizer.css b/browser/themes/osx/places/organizer.css
+index 60e3d65d9ea5..730aa23aed6c 100644
+--- a/browser/themes/osx/places/organizer.css
++++ b/browser/themes/osx/places/organizer.css
+@@ -11,13 +11,15 @@
+ padding: 4px 4px 3px;
+ border-bottom: 1px solid ThreeDShadow;
+
+- &::after {
+- content: "";
+- position: absolute;
+- inset: 0;
+- appearance: auto;
+- -moz-default-appearance: -moz-window-titlebar;
+- z-index: -1;
++ @media not (-moz-mac-tahoe-theme) {
++ &::after {
++ content: "";
++ position: absolute;
++ inset: 0;
++ appearance: auto;
++ -moz-default-appearance: -moz-window-titlebar;
++ z-index: -1;
++ }
+ }
+ }
+
+diff --git a/browser/themes/shared/pageInfo.css b/browser/themes/shared/pageInfo.css
+index 92259765b92f..e7bf5a299abe 100644
+--- a/browser/themes/shared/pageInfo.css
++++ b/browser/themes/shared/pageInfo.css
+@@ -14,13 +14,15 @@
+ align-items: center;
+ justify-content: center;
+
+- &::after {
+- content: "";
+- position: absolute;
+- inset: 0;
+- appearance: auto;
+- -moz-default-appearance: -moz-window-titlebar;
+- z-index: -1;
++ @media not (-moz-mac-tahoe-theme) {
++ &::after {
++ content: "";
++ position: absolute;
++ inset: 0;
++ appearance: auto;
++ -moz-default-appearance: -moz-window-titlebar;
++ z-index: -1;
++ }
+ }
+ }
+ }
+diff --git a/layout/style/test/chrome/chrome-only-media-queries.js b/layout/style/test/chrome/chrome-only-media-queries.js
+index e200152ba41b..88ba56525e99 100644
+--- a/layout/style/test/chrome/chrome-only-media-queries.js
++++ b/layout/style/test/chrome/chrome-only-media-queries.js
+@@ -4,6 +4,7 @@ const CHROME_ONLY_TOGGLES = [
+ "-moz-print-preview",
+ "-moz-overlay-scrollbars",
+ "-moz-mac-big-sur-theme",
++ "-moz-mac-tahoe-theme",
+ "-moz-menubar-drag",
+ "-moz-windows-accent-color-in-titlebar",
+ "-moz-swipe-animation-enabled",
+diff --git a/servo/components/style/gecko/media_features.rs b/servo/components/style/gecko/media_features.rs
+index b0082951254a..ddbcd495260b 100644
+--- a/servo/components/style/gecko/media_features.rs
++++ b/servo/components/style/gecko/media_features.rs
+@@ -645,7 +645,7 @@ macro_rules! lnf_int_feature {
+ /// to support new types in these entries and (2) ensuring that either
+ /// nsPresContext::MediaFeatureValuesChanged is called when the value that
+ /// would be returned by the evaluator function could change.
+-pub static MEDIA_FEATURES: [QueryFeatureDescription; 58] = [
++pub static MEDIA_FEATURES: [QueryFeatureDescription; 59] = [
+ feature!(
+ atom!("width"),
+ AllowsRanges::Yes,
+@@ -918,6 +918,7 @@ pub static MEDIA_FEATURES: [QueryFeatureDescription; 58] = [
+ ),
+ lnf_int_feature!(atom!("-moz-menubar-drag"), MenuBarDrag),
+ lnf_int_feature!(atom!("-moz-mac-big-sur-theme"), MacBigSurTheme),
++ lnf_int_feature!(atom!("-moz-mac-tahoe-theme"), MacTahoeTheme),
+ feature!(
+ atom!("-moz-mac-rtl"),
+ AllowsRanges::No,
+diff --git a/toolkit/themes/shared/menu.css b/toolkit/themes/shared/menu.css
+index f1330e7dd7a3..23c04a931ae0 100644
+--- a/toolkit/themes/shared/menu.css
++++ b/toolkit/themes/shared/menu.css
+@@ -31,6 +31,11 @@ panel {
+ }
+ @media (-moz-platform: macos) {
+ --menuitem-padding: 3px 9px;
++
++ @media (-moz-mac-tahoe-theme) {
++ --menuitem-padding: 4px 11px;
++ --menuitem-border-radius: 7px;
++ }
+ }
+
+ @media (-moz-platform: windows) {
+diff --git a/widget/LookAndFeel.h b/widget/LookAndFeel.h
+index fc1e28206ac2..1661476a75f0 100644
+--- a/widget/LookAndFeel.h
++++ b/widget/LookAndFeel.h
+@@ -117,6 +117,12 @@ class LookAndFeel {
+ */
+ MacBigSurTheme,
+
++ /*
++ * A Boolean value to determine whether the macOS Tahoe-specific
++ * theming should be used.
++ */
++ MacTahoeTheme,
++
+ /*
+ * AlertNotificationOrigin indicates from which corner of the
+ * screen alerts slide in, and from which direction (horizontal/vertical).
+diff --git a/widget/cocoa/nsCocoaFeatures.h b/widget/cocoa/nsCocoaFeatures.h
+index dfad59dfe676..1a2389fda02c 100644
+--- a/widget/cocoa/nsCocoaFeatures.h
++++ b/widget/cocoa/nsCocoaFeatures.h
+@@ -22,6 +22,7 @@ class nsCocoaFeatures {
+ static bool OnMontereyOrLater();
+ static bool OnVenturaOrLater();
+ static bool OnSonomaOrLater();
++ static bool OnTahoeOrLater();
+
+ static bool IsAtLeastVersion(int32_t aMajor, int32_t aMinor,
+ int32_t aBugFix = 0);
+diff --git a/widget/cocoa/nsCocoaFeatures.mm b/widget/cocoa/nsCocoaFeatures.mm
+index 509bdbd3fbe3..b70b9c6bbed3 100644
+--- a/widget/cocoa/nsCocoaFeatures.mm
++++ b/widget/cocoa/nsCocoaFeatures.mm
+@@ -27,6 +27,7 @@
+ #define MACOS_VERSION_12_0_HEX 0x000C0000
+ #define MACOS_VERSION_13_0_HEX 0x000D0000
+ #define MACOS_VERSION_14_0_HEX 0x000E0000
++#define MACOS_VERSION_26_0_HEX 0x001A0000
+
+ #include "nsCocoaFeatures.h"
+ #include "nsCocoaUtils.h"
+@@ -186,6 +187,11 @@ static int intAtStringIndex(NSArray* array, int index) {
+ return (macOSVersion() >= MACOS_VERSION_14_0_HEX);
+ }
+
++/* static */ bool nsCocoaFeatures::OnTahoeOrLater() {
++ // See comments above regarding SYSTEM_VERSION_COMPAT.
++ return (macOSVersion() >= MACOS_VERSION_26_0_HEX);
++}
++
+ /* static */ bool nsCocoaFeatures::IsAtLeastVersion(int32_t aMajor,
+ int32_t aMinor,
+ int32_t aBugFix) {
+diff --git a/widget/cocoa/nsCocoaWindow.h b/widget/cocoa/nsCocoaWindow.h
+index 38aca9f32590..9484ef078900 100644
+--- a/widget/cocoa/nsCocoaWindow.h
++++ b/widget/cocoa/nsCocoaWindow.h
+@@ -111,6 +111,9 @@ class TextInputHandler;
+ - (void)setEffectViewWrapperForStyle:(mozilla::WindowShadow)aStyle;
+ @property(nonatomic) mozilla::WindowShadow shadowStyle;
+
++- (void)updateTitlebarTransparency;
++- (void)setTitlebarSeparatorStyle:(NSTitlebarSeparatorStyle)aStyle API_AVAILABLE(macos(11.0));
++
+ - (void)releaseJSObjects;
+
+ @end
+diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
+index c9991df86dc6..c746a78b8440 100644
+--- a/widget/cocoa/nsCocoaWindow.mm
++++ b/widget/cocoa/nsCocoaWindow.mm
+@@ -7611,6 +7611,15 @@ - (id)initWithContentRect:(NSRect)aContentRect
+ // vibrancy effect and window border.
+ - (void)setEffectViewWrapperForStyle:(WindowShadow)aStyle {
+ NSView* wrapper = [&]() -> NSView* {
++ if (@available(macOS 26.0, *)) {
++ if (aStyle == WindowShadow::Menu) {
++ // Menus on macOS 26 use glass instead of vibrancy.
++ auto* effectView =
++ [[NSGlassEffectView alloc] initWithFrame:self.contentView.frame];
++ effectView.cornerRadius = 12.0f;
++ return effectView;
++ }
++ }
+ if (aStyle == WindowShadow::Menu || aStyle == WindowShadow::Tooltip) {
+ const bool isMenu = aStyle == WindowShadow::Menu;
+ auto* effectView =
+@@ -7721,6 +7730,7 @@ - (void)setDrawsContentsIntoWindowFrame:(BOOL)aState {
+ mDrawsIntoWindowFrame = aState;
+ if (changed) {
+ [self reflowTitlebarElements];
++ [self updateTitlebarTransparency];
+ }
+ }
+
+@@ -7850,6 +7860,32 @@ - (void)reflowTitlebarElements {
+ }
+ }
+
++- (void)updateTitlebarTransparency {
++ if (self.drawsContentsIntoWindowFrame) {
++ // Hide the titlebar if we are drawing into it
++ self.titlebarAppearsTransparent = true;
++ return;
++ }
++
++ if (@available(macOS 26.0, *)) {
++ // On macOS 26, the titlebar must be transparent to hide the separator.
++ // This does not affect the titlebar background on macOS 26, as it
++ // already matches the window background even when not transparent.
++ if (self.titlebarSeparatorStyle == NSTitlebarSeparatorStyleNone) {
++ self.titlebarAppearsTransparent = true;
++ return;
++ }
++ }
++
++ // Show the titlebar otherwise.
++ self.titlebarAppearsTransparent = false;
++}
++
++- (void)setTitlebarSeparatorStyle:(NSTitlebarSeparatorStyle)aStyle {
++ [super setTitlebarSeparatorStyle:aStyle];
++ [self updateTitlebarTransparency];
++}
++
+ - (BOOL)respondsToSelector:(SEL)aSelector {
+ // Claim the window doesn't respond to this so that the system
+ // doesn't steal keyboard equivalents for it. Bug 613710.
+@@ -8166,8 +8202,6 @@ - (void)setDrawsContentsIntoWindowFrame:(BOOL)aState {
+ BOOL stateChanged = self.drawsContentsIntoWindowFrame != aState;
+ [super setDrawsContentsIntoWindowFrame:aState];
+ if (stateChanged && [self.delegate isKindOfClass:[WindowDelegate class]]) {
+- // Hide the titlebar if we are drawing into it
+- self.titlebarAppearsTransparent = aState;
+ self.titleVisibility = aState ? NSWindowTitleHidden : NSWindowTitleVisible;
+
+ // Here we extend / shrink our mainChildView.
+diff --git a/widget/cocoa/nsLookAndFeel.mm b/widget/cocoa/nsLookAndFeel.mm
+index 16cf2ed9b0ea..579b2445adfe 100644
+--- a/widget/cocoa/nsLookAndFeel.mm
++++ b/widget/cocoa/nsLookAndFeel.mm
+@@ -458,6 +458,9 @@ static bool PrefersNonBlinkingTextInsertionIndicator() {
+ case IntID::MacBigSurTheme:
+ aResult = nsCocoaFeatures::OnBigSurOrLater();
+ break;
++ case IntID::MacTahoeTheme:
++ aResult = nsCocoaFeatures::OnTahoeOrLater();
++ break;
+ case IntID::AlertNotificationOrigin:
+ aResult = NS_ALERT_TOP;
+ break;
+diff --git a/widget/cocoa/nsNativeThemeCocoa.mm b/widget/cocoa/nsNativeThemeCocoa.mm
+index 6ddd495b73f9..b94b8331be87 100644
+--- a/widget/cocoa/nsNativeThemeCocoa.mm
++++ b/widget/cocoa/nsNativeThemeCocoa.mm
+@@ -191,6 +191,10 @@ static NSControlSize ControlSizeForEnum(CocoaSize enumControlSize) {
+
+ static void InflateControlRect(NSRect* rect, NSControlSize cocoaControlSize,
+ const CellMarginArray& marginSet) {
++ if (nsCocoaFeatures::OnTahoeOrLater()) {
++ // Controls on macOS 26 fill the entire frame and do not require inflation.
++ return;
++ }
+ auto controlSize = EnumSizeForCocoaSize(cocoaControlSize);
+ const IntMargin& buttonMargins = marginSet[controlSize];
+ rect->origin.x -= buttonMargins.left;
+diff --git a/widget/nsXPLookAndFeel.cpp b/widget/nsXPLookAndFeel.cpp
+index c0dde6e1c04a..24b6f83930a7 100644
+--- a/widget/nsXPLookAndFeel.cpp
++++ b/widget/nsXPLookAndFeel.cpp
+@@ -121,6 +121,7 @@ static const char sIntPrefs[][45] = {
+ "ui.windowsMica",
+ "ui.windowsMicaPopups",
+ "ui.macBigSurTheme",
++ "ui.macTahoeTheme",
+ "ui.alertNotificationOrigin",
+ "ui.scrollToClick",
+ "ui.IMERawInputUnderlineStyle",
+diff --git a/xpcom/ds/StaticAtoms.py b/xpcom/ds/StaticAtoms.py
+index e1a0497dc0b9..ec88f0496378 100644
+--- a/xpcom/ds/StaticAtoms.py
++++ b/xpcom/ds/StaticAtoms.py
+@@ -2283,6 +2283,7 @@ STATIC_ATOMS = [
+ Atom("_moz_windows_mica", "-moz-windows-mica"),
+ Atom("_moz_windows_mica_popups", "-moz-windows-mica-popups"),
+ Atom("_moz_mac_big_sur_theme", "-moz-mac-big-sur-theme"),
++ Atom("_moz_mac_tahoe_theme", "-moz-mac-tahoe-theme"),
+ Atom("_moz_mac_rtl", "-moz-mac-rtl"),
+ Atom("_moz_mac_titlebar_height", "-moz-mac-titlebar-height"),
+ Atom("_moz_platform", "-moz-platform"),
diff --git a/src/firefox-patches/ff142-gradient-dithering.patch b/src/firefox-patches/ff142-gradient-dithering.patch
deleted file mode 100644
index 26a1dbf86..000000000
--- a/src/firefox-patches/ff142-gradient-dithering.patch
+++ /dev/null
@@ -1,545 +0,0 @@
-diff --git a/gfx/webrender_bindings/src/bindings.rs b/gfx/webrender_bindings/src/bindings.rs
-index 578c2f80a9db..08823b7fea22 100644
---- a/gfx/webrender_bindings/src/bindings.rs
-+++ b/gfx/webrender_bindings/src/bindings.rs
-@@ -2144,12 +2144,6 @@ pub extern "C" fn wr_window_new(
- }
- };
-
-- let enable_dithering = if !software && static_prefs::pref!("gfx.webrender.dithering") {
-- true
-- } else {
-- false
-- };
--
- let opts = WebRenderOptions {
- enable_aa: true,
- enable_subpixel_aa,
-@@ -2204,7 +2198,6 @@ pub extern "C" fn wr_window_new(
- reject_software_rasterizer,
- low_quality_pinch_zoom,
- max_shared_surface_size,
-- enable_dithering,
- ..Default::default()
- };
-
-@@ -4615,11 +4608,8 @@ pub extern "C" fn wr_shaders_new(
-
- device.begin_frame();
-
-- let mut options = WebRenderOptions::default();
-- options.enable_dithering = static_prefs::pref!("gfx.webrender.dithering");
--
- let gl_type = device.gl().get_type();
-- let mut shaders = match Shaders::new(&mut device, gl_type, &options) {
-+ let mut shaders = match Shaders::new(&mut device, gl_type, &WebRenderOptions::default()) {
- Ok(shaders) => shaders,
- Err(e) => {
- warn!(" Failed to create a Shaders: {:?}", e);
-diff --git a/gfx/wr/glsl-to-cxx/src/hir.rs b/gfx/wr/glsl-to-cxx/src/hir.rs
-index 626a3643e6ee..f0bb95d1df38 100644
---- a/gfx/wr/glsl-to-cxx/src/hir.rs
-+++ b/gfx/wr/glsl-to-cxx/src/hir.rs
-@@ -3964,6 +3964,14 @@ pub fn ast_to_hir(state: &mut State, tu: &syntax::TranslationUnit) -> Translatio
- vec![Type::new(Sampler2D), Type::new(Int), Type::new(Float), Type::new(Bool), Type::new(Bool),
- Type::new(Vec2), Type::new(Vec2), Type::new(Float)],
- );
-+ declare_function(
-+ state,
-+ "swgl_commitDitheredLinearGradientRGBA8",
-+ None,
-+ Type::new(Void),
-+ vec![Type::new(Sampler2D), Type::new(Int), Type::new(Float), Type::new(Bool), Type::new(Bool),
-+ Type::new(Vec2), Type::new(Vec2), Type::new(Float), Type::new(Vec4)],
-+ );
- declare_function(
- state,
- "swgl_commitRadialGradientRGBA8",
-@@ -3972,6 +3980,14 @@ pub fn ast_to_hir(state: &mut State, tu: &syntax::TranslationUnit) -> Translatio
- vec![Type::new(Sampler2D), Type::new(Int), Type::new(Float), Type::new(Bool), Type::new(Vec2),
- Type::new(Float)],
- );
-+ declare_function(
-+ state,
-+ "swgl_commitDitheredRadialGradientRGBA8",
-+ None,
-+ Type::new(Void),
-+ vec![Type::new(Sampler2D), Type::new(Int), Type::new(Float), Type::new(Bool), Type::new(Vec2),
-+ Type::new(Float), Type::new(Vec4)],
-+ );
- declare_function(
- state,
- "swgl_commitGradientRGBA8",
-diff --git a/gfx/wr/swgl/build.rs b/gfx/wr/swgl/build.rs
-index fd6ec3fc4726..b8c9ad2ec174 100644
---- a/gfx/wr/swgl/build.rs
-+++ b/gfx/wr/swgl/build.rs
-@@ -142,6 +142,7 @@ fn main() {
- let shader_flags = ShaderFeatureFlags::GL
- | ShaderFeatureFlags::DUAL_SOURCE_BLENDING
- | ShaderFeatureFlags::ADVANCED_BLEND_EQUATION
-+ | ShaderFeatureFlags::DITHERING
- | ShaderFeatureFlags::DEBUG;
- let mut shaders: Vec = Vec::new();
- for (name, features) in get_shader_features(shader_flags) {
-diff --git a/gfx/wr/swgl/src/swgl_ext.h b/gfx/wr/swgl/src/swgl_ext.h
-index 36b66843f63a..5a517afbe25c 100644
---- a/gfx/wr/swgl/src/swgl_ext.h
-+++ b/gfx/wr/swgl/src/swgl_ext.h
-@@ -1383,14 +1383,63 @@ static inline WideRGBA8 sampleGradient(sampler2D sampler, int address,
- swgl_commitChunk(RGBA8, applyColor(sampleGradient(sampler, address, entry), \
- packColor(swgl_OutRGBA, color)))
-
-+static const int8_t ditherNoiseMatrix[] = {
-+ -126, 66, -78, 114, -114, 78, -66, 126, 2, -62, 50, -14, 14,
-+ -50, 62, -2, -94, 98, -110, 82, -82, 110, -98, 94, 34, -30,
-+ 18, -46, 46, -18, 30, -34, -118, 74, -70, 122, -122, 70, -74,
-+ 118, 10, -54, 58, -6, 6, -58, 54, -10, -86, 106, -102, 90,
-+ -90, 102, -106, 86, 42, -22, 26, -38, 38, -26, 22, -42,
-+};
-+
-+// Values in color should be in the 0..0xFF00 range so that dithering has enough
-+// overhead to avoid overflow.
-+static inline VectorType dither(
-+ const VectorType* color, ivec4_scalar fragCoord) {
-+ VectorType ret = *color;
-+
-+ // This isn't technically proper behaviour, but it's fast. Proper
-+ // behaviour would be to do a bounds check on every addition, or to otherwise
-+ // recreate that behaviour. Instead, we refuse to dither all 4
-+ // pixels if any channel from any one of them would underflow.
-+ auto boundsCheck = ret < 126;
-+
-+ // This is a vectorized or operation on all RGB values (ignores A)
-+ auto boundsCheckRGB = SHUFFLE(boundsCheck, boundsCheck, 0, 1, 2, 4, 5, 6, 8,
-+ 9, 10, 12, 13, 14, 0, 0, 0, 0);
-+ auto boundsCheckRGBReducedV8 =
-+ lowHalf(boundsCheckRGB) | highHalf(boundsCheckRGB);
-+ auto boundsCheckRGBReducedV4 =
-+ lowHalf(boundsCheckRGBReducedV8) | highHalf(boundsCheckRGBReducedV8);
-+ auto boundsCheckRGBReducedV2 =
-+ lowHalf(boundsCheckRGBReducedV4) | highHalf(boundsCheckRGBReducedV4);
-+ if (bit_cast(boundsCheckRGBReducedV2) != 0) {
-+ return ret;
-+ }
-+
-+ const int row = (fragCoord.y & 7) * 8;
-+ int8_t n0 = ditherNoiseMatrix[row + ((fragCoord.x + 0) & 7)];
-+ int8_t n1 = ditherNoiseMatrix[row + ((fragCoord.x + 1) & 7)];
-+ int8_t n2 = ditherNoiseMatrix[row + ((fragCoord.x + 2) & 7)];
-+ int8_t n3 = ditherNoiseMatrix[row + ((fragCoord.x + 3) & 7)];
-+
-+ VectorType noiseVector = {
-+ uint16_t(n0), uint16_t(n0), uint16_t(n0), 0,
-+ uint16_t(n1), uint16_t(n1), uint16_t(n1), 0,
-+ uint16_t(n2), uint16_t(n2), uint16_t(n2), 0,
-+ uint16_t(n3), uint16_t(n3), uint16_t(n3), 0};
-+
-+ ret += noiseVector;
-+ return ret;
-+}
-+
- // Samples an entire span of a linear gradient by crawling the gradient table
- // and looking for consecutive stops that can be merged into a single larger
- // gradient, then interpolating between those larger gradients within the span.
--template
-+template
- static bool commitLinearGradient(sampler2D sampler, int address, float size,
- bool tileRepeat, bool gradientRepeat, vec2 pos,
- const vec2_scalar& scaleDir, float startOffset,
-- uint32_t* buf, int span) {
-+ uint32_t* buf, int span, vec4 fragCoord) {
- assert(sampler->format == TextureFormat::RGBA32F);
- assert(address >= 0 && address < int(sampler->height * sampler->stride));
- GradientStops* stops = (GradientStops*)&sampler->buf[address];
-@@ -1402,6 +1451,11 @@ static bool commitLinearGradient(sampler2D sampler, int address, float size,
- if (!isfinite(delta)) {
- return false;
- }
-+
-+ // Only incremented in the case of dithering
-+ ivec4_scalar currentFragCoord =
-+ ivec4_scalar(fragCoord.x.x, fragCoord.y.x, fragCoord.z.x, fragCoord.w.x);
-+
- // If we have a repeating brush, then the position will be modulo the [0,1)
- // interval. Compute coefficients that can be used to quickly evaluate the
- // distance to the interval boundary where the offset will wrap.
-@@ -1536,7 +1590,14 @@ static bool commitLinearGradient(sampler2D sampler, int address, float size,
- // deltas.
- int segment = min(remaining, 256 / 4);
- for (auto* end = buf + segment * 4; buf < end; buf += 4) {
-- commit_blend_span(buf, bit_cast(color >> 8));
-+ if (DITHER) {
-+ commit_blend_span(
-+ buf,
-+ bit_cast(dither(&color, currentFragCoord) >> 8));
-+ currentFragCoord.x += 4;
-+ } else {
-+ commit_blend_span(buf, bit_cast(color >> 8));
-+ }
- color += deltaColor;
- }
- remaining -= segment;
-@@ -1569,7 +1630,20 @@ static bool commitLinearGradient(sampler2D sampler, int address, float size,
- // will calculate a table entry for each sample, assuming the samples may
- // have different table entries.
- Float entry = clamp(offset * size + 1.0f, 0.0f, 1.0f + size);
-- commit_blend_span(buf, sampleGradient(sampler, address, entry));
-+
-+ if (DITHER) {
-+ auto gradientSample = static_cast>(
-+ sampleGradient(sampler, address, entry))
-+ << 8;
-+ commit_blend_span(
-+ buf,
-+ static_cast(
-+ dither(&gradientSample, currentFragCoord) >> 8));
-+ currentFragCoord.x += 4;
-+ } else {
-+ commit_blend_span(
-+ buf, static_cast(sampleGradient(sampler, address, entry)));
-+ }
- span -= 4;
- buf += 4;
- pos += posStep;
-@@ -1589,13 +1663,35 @@ static bool commitLinearGradient(sampler2D sampler, int address, float size,
- do { \
- bool drawn = false; \
- if (blend_key) { \
-- drawn = commitLinearGradient( \
-+ drawn = commitLinearGradient( \
-+ sampler, address, size, tileRepeat, gradientRepeat, pos, scaleDir, \
-+ startOffset, swgl_OutRGBA8, swgl_SpanLength, \
-+ static_cast(0x0)); \
-+ } else { \
-+ drawn = commitLinearGradient( \
-+ sampler, address, size, tileRepeat, gradientRepeat, pos, scaleDir, \
-+ startOffset, swgl_OutRGBA8, swgl_SpanLength, \
-+ static_cast(0x0)); \
-+ } \
-+ if (drawn) { \
-+ swgl_OutRGBA8 += swgl_SpanLength; \
-+ swgl_SpanLength = 0; \
-+ } \
-+ } while (0)
-+
-+#define swgl_commitDitheredLinearGradientRGBA8( \
-+ sampler, address, size, tileRepeat, gradientRepeat, pos, scaleDir, \
-+ startOffset, fragCoord) \
-+ do { \
-+ bool drawn = false; \
-+ if (blend_key) { \
-+ drawn = commitLinearGradient( \
- sampler, address, size, tileRepeat, gradientRepeat, pos, scaleDir, \
-- startOffset, swgl_OutRGBA8, swgl_SpanLength); \
-+ startOffset, swgl_OutRGBA8, swgl_SpanLength, fragCoord); \
- } else { \
-- drawn = commitLinearGradient( \
-+ drawn = commitLinearGradient( \
- sampler, address, size, tileRepeat, gradientRepeat, pos, scaleDir, \
-- startOffset, swgl_OutRGBA8, swgl_SpanLength); \
-+ startOffset, swgl_OutRGBA8, swgl_SpanLength, fragCoord); \
- } \
- if (drawn) { \
- swgl_OutRGBA8 += swgl_SpanLength; \
-@@ -1625,10 +1721,10 @@ static ALWAYS_INLINE auto fastLength(V v) {
- // and looking for consecutive stops that can be merged into a single larger
- // gradient, then interpolating between those larger gradients within the span
- // based on the computed position relative to a radius.
--template
-+template
- static bool commitRadialGradient(sampler2D sampler, int address, float size,
- bool repeat, vec2 pos, float radius,
-- uint32_t* buf, int span) {
-+ uint32_t* buf, int span, vec4 fragCoord) {
- assert(sampler->format == TextureFormat::RGBA32F);
- assert(address >= 0 && address < int(sampler->height * sampler->stride));
- GradientStops* stops = (GradientStops*)&sampler->buf[address];
-@@ -1658,6 +1754,11 @@ static bool commitRadialGradient(sampler2D sampler, int address, float size,
- if (!isfinite(deltaDelta) || !isfinite(radius)) {
- return false;
- }
-+
-+ // Only incremented in the case of dithering
-+ ivec4_scalar currentFragCoord =
-+ ivec4_scalar(fragCoord.x.x, fragCoord.y.x, fragCoord.z.x, fragCoord.w.x);
-+
- float invDelta, middleT, middleB;
- if (deltaDelta > 0) {
- invDelta = 1.0f / deltaDelta;
-@@ -1778,9 +1879,12 @@ static bool commitRadialGradient(sampler2D sampler, int address, float size,
- // Figure out how many chunks are actually inside the merged gradient.
- if (t + 4.0f <= endT) {
- int inside = int(endT - t) & ~3;
-- // Convert start and end colors to BGRA and scale to 0..255 range later.
-- auto minColorF = stops[minIndex].startColor.zyxw * 255.0f;
-- auto maxColorF = stops[maxIndex].end_color().zyxw * 255.0f;
-+ // Convert start and end colors to BGRA and scale to 0..0xFF00 range (for
-+ // dithered) and 0..255 range (for non-dithered).
-+ auto minColorF =
-+ stops[minIndex].startColor.zyxw * (DITHER ? float(0xFF00) : 255.0f);
-+ auto maxColorF =
-+ stops[maxIndex].end_color().zyxw * (DITHER ? float(0xFF00) : 255.0f);
- // Compute the change in color per change in gradient offset.
- auto deltaColorF =
- (maxColorF - minColorF) * (size / (maxIndex + 1 - minIndex));
-@@ -1789,18 +1893,29 @@ static bool commitRadialGradient(sampler2D sampler, int address, float size,
- Float colorF =
- minColorF - deltaColorF * (startRadius + (minIndex - 1) / size);
- // Finally, walk over the span accumulating the position dot product and
-- // getting its sqrt as an offset into the color ramp. Since we're already
-- // in BGRA format and scaled to 255, we just need to round to an integer
-- // and pack down to pixel format.
-+ // getting its sqrt as an offset into the color ramp. At this point we
-+ // just need to round to an integer and pack down to an 8-bit pixel
-+ // format.
- for (auto* end = buf + inside; buf < end; buf += 4) {
- Float offsetG = fastSqrt(dotPos);
-- commit_blend_span(
-- buf,
-- combine(
-- packRGBA8(round_pixel(colorF + deltaColorF * offsetG.x, 1),
-- round_pixel(colorF + deltaColorF * offsetG.y, 1)),
-- packRGBA8(round_pixel(colorF + deltaColorF * offsetG.z, 1),
-- round_pixel(colorF + deltaColorF * offsetG.w, 1))));
-+ if (DITHER) {
-+ auto color = combine(
-+ CONVERT(round_pixel(colorF + deltaColorF * offsetG.x, 1), U16),
-+ CONVERT(round_pixel(colorF + deltaColorF * offsetG.y, 1), U16),
-+ CONVERT(round_pixel(colorF + deltaColorF * offsetG.z, 1), U16),
-+ CONVERT(round_pixel(colorF + deltaColorF * offsetG.w, 1), U16));
-+ commit_blend_span(
-+ buf, static_cast(
-+ dither(&color, currentFragCoord) >> 8));
-+ currentFragCoord.x += 4;
-+ } else {
-+ auto color = combine(
-+ packRGBA8(round_pixel(colorF + deltaColorF * offsetG.x, 1),
-+ round_pixel(colorF + deltaColorF * offsetG.y, 1)),
-+ packRGBA8(round_pixel(colorF + deltaColorF * offsetG.z, 1),
-+ round_pixel(colorF + deltaColorF * offsetG.w, 1)));
-+ commit_blend_span(buf, color);
-+ }
- dotPos += dotPosDelta;
- dotPosDelta += deltaDelta2;
- }
-@@ -1837,25 +1952,45 @@ static bool commitRadialGradient(sampler2D sampler, int address, float size,
- // swglcommitLinearGradient, but given a varying 2D position scaled to
- // gradient-space and a radius at which the distance from the origin maps to the
- // start of the gradient table.
--#define swgl_commitRadialGradientRGBA8(sampler, address, size, repeat, pos, \
-- radius) \
-- do { \
-- bool drawn = false; \
-- if (blend_key) { \
-- drawn = \
-- commitRadialGradient(sampler, address, size, repeat, pos, \
-- radius, swgl_OutRGBA8, swgl_SpanLength); \
-- } else { \
-- drawn = \
-- commitRadialGradient(sampler, address, size, repeat, pos, \
-- radius, swgl_OutRGBA8, swgl_SpanLength); \
-- } \
-- if (drawn) { \
-- swgl_OutRGBA8 += swgl_SpanLength; \
-- swgl_SpanLength = 0; \
-- } \
-+#define swgl_commitRadialGradientRGBA8(sampler, address, size, repeat, pos, \
-+ radius) \
-+ do { \
-+ bool drawn = false; \
-+ if (blend_key) { \
-+ drawn = commitRadialGradient( \
-+ sampler, address, size, repeat, pos, radius, swgl_OutRGBA8, \
-+ swgl_SpanLength, \
-+ static_cast(0x0)); \
-+ } else { \
-+ drawn = commitRadialGradient( \
-+ sampler, address, size, repeat, pos, radius, swgl_OutRGBA8, \
-+ swgl_SpanLength, \
-+ static_cast(0x0)); \
-+ } \
-+ if (drawn) { \
-+ swgl_OutRGBA8 += swgl_SpanLength; \
-+ swgl_SpanLength = 0; \
-+ } \
- } while (0)
-
-+#define swgl_commitDitheredRadialGradientRGBA8( \
-+ sampler, address, size, repeat, pos, radius, fragCoord) \
-+ do { \
-+ bool drawn = false; \
-+ if (blend_key) { \
-+ drawn = commitRadialGradient( \
-+ sampler, address, size, repeat, pos, radius, swgl_OutRGBA8, \
-+ swgl_SpanLength, fragCoord); \
-+ } else { \
-+ drawn = commitRadialGradient( \
-+ sampler, address, size, repeat, pos, radius, swgl_OutRGBA8, \
-+ swgl_SpanLength, fragCoord); \
-+ } \
-+ if (drawn) { \
-+ swgl_OutRGBA8 += swgl_SpanLength; \
-+ swgl_SpanLength = 0; \
-+ } \
-+ } while (0)
- // Extension to set a clip mask image to be sampled during blending. The offset
- // specifies the positioning of the clip mask image relative to the viewport
- // origin. The bounding box specifies the rectangle relative to the clip mask's
-diff --git a/gfx/wr/webrender/res/brush_linear_gradient.glsl b/gfx/wr/webrender/res/brush_linear_gradient.glsl
-index 235be4b24be8..6f923052ffb1 100644
---- a/gfx/wr/webrender/res/brush_linear_gradient.glsl
-+++ b/gfx/wr/webrender/res/brush_linear_gradient.glsl
-@@ -87,8 +87,13 @@ void swgl_drawSpanRGBA8() {
- return;
- }
-
-+#ifdef WR_FEATURE_DITHERING
-+ swgl_commitDitheredLinearGradientRGBA8(sGpuBufferF, address, GRADIENT_ENTRIES, true, v_gradient_repeat.x != 0.0,
-+ v_pos, v_scale_dir, v_start_offset.x, gl_FragCoord);
-+#else
- swgl_commitLinearGradientRGBA8(sGpuBufferF, address, GRADIENT_ENTRIES, true, v_gradient_repeat.x != 0.0,
- v_pos, v_scale_dir, v_start_offset.x);
-+#endif
- }
- #endif
-
-diff --git a/gfx/wr/webrender/res/cs_radial_gradient.glsl b/gfx/wr/webrender/res/cs_radial_gradient.glsl
-index 10919ac6283e..8084d8d47be1 100644
---- a/gfx/wr/webrender/res/cs_radial_gradient.glsl
-+++ b/gfx/wr/webrender/res/cs_radial_gradient.glsl
-@@ -63,8 +63,14 @@ void swgl_drawSpanRGBA8() {
- if (address < 0) {
- return;
- }
-+
-+#ifdef WR_FEATURE_DITHERING
-+ swgl_commitDitheredRadialGradientRGBA8(sGpuBufferF, address, GRADIENT_ENTRIES, v_gradient_repeat.x != 0.0,
-+ v_pos, v_start_radius.x, gl_FragCoord);
-+#else
- swgl_commitRadialGradientRGBA8(sGpuBufferF, address, GRADIENT_ENTRIES, v_gradient_repeat.x != 0.0,
- v_pos, v_start_radius.x);
-+#endif
- }
- #endif
-
-diff --git a/gfx/wr/webrender/res/ps_quad_radial_gradient.glsl b/gfx/wr/webrender/res/ps_quad_radial_gradient.glsl
-index 05b4dd2aa8c6..dc83f3c27742 100644
---- a/gfx/wr/webrender/res/ps_quad_radial_gradient.glsl
-+++ b/gfx/wr/webrender/res/ps_quad_radial_gradient.glsl
-@@ -73,8 +73,14 @@ void swgl_drawSpanRGBA8() {
- if (address < 0) {
- return;
- }
-+
-+#ifdef WR_FEATURE_DITHERING
-+ swgl_commitDitheredRadialGradientRGBA8(sGpuBufferF, address, GRADIENT_ENTRIES, v_gradient_repeat.x != 0.0,
-+ v_pos, v_start_radius.x, gl_FragCoord);
-+#else
- swgl_commitRadialGradientRGBA8(sGpuBufferF, address, GRADIENT_ENTRIES, v_gradient_repeat.x != 0.0,
- v_pos, v_start_radius.x);
-+#endif
- }
- #endif
-
-diff --git a/gfx/wr/webrender/src/renderer/init.rs b/gfx/wr/webrender/src/renderer/init.rs
-index 7c63798bc644..169d4c7a4437 100644
---- a/gfx/wr/webrender/src/renderer/init.rs
-+++ b/gfx/wr/webrender/src/renderer/init.rs
-@@ -224,7 +224,7 @@ impl Default for WebRenderOptions {
- resource_override_path: None,
- use_optimized_shaders: false,
- enable_aa: true,
-- enable_dithering: false,
-+ enable_dithering: true,
- debug_flags: DebugFlags::empty(),
- max_recorded_profiles: 0,
- precache_flags: ShaderPrecacheFlags::empty(),
-diff --git a/gfx/wr/webrender/src/renderer/shade.rs b/gfx/wr/webrender/src/renderer/shade.rs
-index ed38e7aa24e3..0171cb4092e1 100644
---- a/gfx/wr/webrender/src/renderer/shade.rs
-+++ b/gfx/wr/webrender/src/renderer/shade.rs
-@@ -873,14 +873,22 @@ impl Shaders {
- let ps_quad_radial_gradient = loader.create_shader(
- ShaderKind::Primitive,
- "ps_quad_radial_gradient",
-- &[],
-+ if options.enable_dithering {
-+ &[DITHERING_FEATURE]
-+ } else {
-+ &[]
-+ },
- &shader_list,
- )?;
-
- let ps_quad_conic_gradient = loader.create_shader(
- ShaderKind::Primitive,
- "ps_quad_conic_gradient",
-- &[],
-+ if options.enable_dithering {
-+ &[DITHERING_FEATURE]
-+ } else {
-+ &[]
-+ },
- &shader_list,
- )?;
-
-@@ -1032,14 +1040,22 @@ impl Shaders {
- let cs_radial_gradient = loader.create_shader(
- ShaderKind::Cache(VertexArrayKind::RadialGradient),
- "cs_radial_gradient",
-- &[],
-+ if options.enable_dithering {
-+ &[DITHERING_FEATURE]
-+ } else {
-+ &[]
-+ },
- &shader_list,
- )?;
-
- let cs_conic_gradient = loader.create_shader(
- ShaderKind::Cache(VertexArrayKind::ConicGradient),
- "cs_conic_gradient",
-- &[],
-+ if options.enable_dithering {
-+ &[DITHERING_FEATURE]
-+ } else {
-+ &[]
-+ },
- &shader_list,
- )?;
-
-diff --git a/gfx/wr/webrender_build/src/shader_features.rs b/gfx/wr/webrender_build/src/shader_features.rs
-index 72b82df00228..97247c929609 100644
---- a/gfx/wr/webrender_build/src/shader_features.rs
-+++ b/gfx/wr/webrender_build/src/shader_features.rs
-@@ -242,9 +242,9 @@ pub fn get_shader_features(flags: ShaderFeatureFlags) -> ShaderFeatures {
-
- shaders.insert("ps_quad_textured", vec![base_prim_features.finish()]);
-
-- shaders.insert("ps_quad_radial_gradient", vec![base_prim_features.finish()]);
-+ shaders.insert("ps_quad_radial_gradient", vec![base_prim_features.finish(), if flags.contains(ShaderFeatureFlags::DITHERING) { "DITHERING".to_string() } else { String::new() }]);
-
-- shaders.insert("ps_quad_conic_gradient", vec![base_prim_features.finish()]);
-+ shaders.insert("ps_quad_conic_gradient", vec![base_prim_features.finish(), if flags.contains(ShaderFeatureFlags::DITHERING) { "DITHERING".to_string() } else { String::new() }]);
-
- shaders.insert("ps_clear", vec![base_prim_features.finish()]);
-
-diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml
-index e21849fa3db4..258e12665ca8 100644
---- a/modules/libpref/init/StaticPrefList.yaml
-+++ b/modules/libpref/init/StaticPrefList.yaml
-@@ -8007,13 +8007,6 @@
- value: true
- mirror: once
-
--# Enable dithering in hardware WebRender
--- name: gfx.webrender.dithering
-- type: bool
-- rust: true
-- value: false
-- mirror: once
--
- # Use vsync events generated by hardware
- - name: gfx.work-around-driver-bugs
- type: bool
diff --git a/src/image/DecoderFactory-cpp.patch b/src/image/DecoderFactory-cpp.patch
deleted file mode 100644
index 63e321437..000000000
--- a/src/image/DecoderFactory-cpp.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-diff --git a/image/DecoderFactory.cpp b/image/DecoderFactory.cpp
-index 21c94898cbbce9bdc9dec87c7e3e05fec77fb7c1..83a8fcc3aca34c61ac7334eb4b4ef3f3ea21c7ab 100644
---- a/image/DecoderFactory.cpp
-+++ b/image/DecoderFactory.cpp
-@@ -249,7 +249,12 @@ nsresult DecoderFactory::CreateAnimationDecoder(
- }
-
- MOZ_ASSERT(aType == DecoderType::GIF || aType == DecoderType::PNG ||
-- aType == DecoderType::WEBP || aType == DecoderType::AVIF,
-+ aType == DecoderType::WEBP || aType == DecoderType::AVIF
-+#ifdef MOZ_JXL
-+ || aType == DecoderType::JXL,
-+#else
-+ ,
-+#endif
- "Calling CreateAnimationDecoder for non-animating DecoderType");
-
- // Create an anonymous decoder. Interaction with the SurfaceCache and the
-@@ -304,7 +309,12 @@ already_AddRefed DecoderFactory::CloneAnimationDecoder(
- // rediscover it is animated).
- DecoderType type = aDecoder->GetType();
- MOZ_ASSERT(type == DecoderType::GIF || type == DecoderType::PNG ||
-- type == DecoderType::WEBP || type == DecoderType::AVIF,
-+ type == DecoderType::WEBP || type == DecoderType::AVIF
-+#ifdef MOZ_JXL
-+ || aType == DecoderType::JXL,
-+#else
-+ ,
-+#endif
- "Calling CloneAnimationDecoder for non-animating DecoderType");
-
- RefPtr decoder = GetDecoder(type, nullptr, /* aIsRedecode = */ true);
diff --git a/src/layout/generic/nsIFrame-cpp.patch b/src/layout/generic/nsIFrame-cpp.patch
index 66f1b822d..3a9042a12 100644
--- a/src/layout/generic/nsIFrame-cpp.patch
+++ b/src/layout/generic/nsIFrame-cpp.patch
@@ -1,8 +1,8 @@
diff --git a/layout/generic/nsIFrame.cpp b/layout/generic/nsIFrame.cpp
-index 0fca54d43aed64e711c3470a5745a94baaed8886..17097bc8f39e7d5140afa4d91811bca2071a8ad1 100644
+index 7c8f9c8c8ea4cc43825b388e7dd655a2ef34e75f..da5f48bb2d55ae306c72b062169a9758ad10c014 100644
--- a/layout/generic/nsIFrame.cpp
+++ b/layout/generic/nsIFrame.cpp
-@@ -11933,6 +11933,11 @@ gfx::Matrix nsIFrame::ComputeWidgetTransform() const {
+@@ -11912,6 +11912,11 @@ gfx::Matrix nsIFrame::ComputeWidgetTransform() const {
gfx::Matrix4x4 matrix = nsStyleTransformMatrix::ReadTransforms(
uiReset->mMozWindowTransform, refBox, float(appUnitsPerDevPixel));
diff --git a/src/layout/style/nsStyleStruct-cpp.patch b/src/layout/style/nsStyleStruct-cpp.patch
index 677018f5d..f3c81c9a9 100644
--- a/src/layout/style/nsStyleStruct-cpp.patch
+++ b/src/layout/style/nsStyleStruct-cpp.patch
@@ -1,8 +1,8 @@
diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp
-index 3fc58a635189d2160be84c3c8083e63abce611f0..7aac552365a4414229879e2dd9586f7fbd98816d 100644
+index 2413696f643246a825e184732bfba6eb33f606fd..932d3c316ee60c59b5f999e5ddd65c6acee3129d 100644
--- a/layout/style/nsStyleStruct.cpp
+++ b/layout/style/nsStyleStruct.cpp
-@@ -3266,6 +3266,9 @@ nsStyleUIReset::nsStyleUIReset()
+@@ -3273,6 +3273,9 @@ nsStyleUIReset::nsStyleUIReset()
mWindowShadow(StyleWindowShadow::Auto),
mWindowOpacity(1.0),
mMozWindowInputRegionMargin(StyleLength::Zero()),
@@ -12,7 +12,7 @@ index 3fc58a635189d2160be84c3c8083e63abce611f0..7aac552365a4414229879e2dd9586f7f
mTransitions(
nsStyleAutoArray::WITH_SINGLE_INITIAL_ELEMENT),
mTransitionTimingFunctionCount(1),
-@@ -3310,6 +3313,7 @@ nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource)
+@@ -3317,6 +3320,7 @@ nsStyleUIReset::nsStyleUIReset(const nsStyleUIReset& aSource)
mWindowOpacity(aSource.mWindowOpacity),
mMozWindowInputRegionMargin(aSource.mMozWindowInputRegionMargin),
mMozWindowTransform(aSource.mMozWindowTransform),
diff --git a/src/layout/style/nsStyleStruct-h.patch b/src/layout/style/nsStyleStruct-h.patch
index 0eeede686..1e0c4aee3 100644
--- a/src/layout/style/nsStyleStruct-h.patch
+++ b/src/layout/style/nsStyleStruct-h.patch
@@ -1,8 +1,8 @@
diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h
-index 9db1b385ac12e0142921c49e6b6c2ba0fadccf95..919089fd9bc278b0c2fede4b2babe133acd4632e 100644
+index f40f005606946b1149bfb7b67d1df9be04ddaf07..64da397ceb4192aacd24c4cd9fb0efbad2d363ed 100644
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
-@@ -2075,6 +2075,7 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleUIReset {
+@@ -2094,6 +2094,7 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleUIReset {
// The margin of the window region that should be transparent to events.
mozilla::StyleLength mMozWindowInputRegionMargin;
mozilla::StyleTransform mMozWindowTransform;
diff --git a/src/modules/libpref/init/StaticPrefList-yaml.patch b/src/modules/libpref/init/StaticPrefList-yaml.patch
index d46f3b54a..4156b2b27 100644
--- a/src/modules/libpref/init/StaticPrefList-yaml.patch
+++ b/src/modules/libpref/init/StaticPrefList-yaml.patch
@@ -1,8 +1,8 @@
diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml
-index a6c49438aaf3464e70bf9c75c2849a6062bd096a..2ee33493ed541b36a29f29c104d1275b80e5a20a 100644
+index 86dc55502b05eed6e4bb0a2ed489e1e8e76840cb..2c2918b2d3c76063662fe59d7fde745a36a92ab6 100644
--- a/modules/libpref/init/StaticPrefList.yaml
+++ b/modules/libpref/init/StaticPrefList.yaml
-@@ -19222,6 +19215,7 @@
+@@ -19316,6 +19316,7 @@
mirror: always
#endif
diff --git a/src/modules/libpref/moz-build.patch b/src/modules/libpref/moz-build.patch
index d5fd7d0c8..f91740056 100644
--- a/src/modules/libpref/moz-build.patch
+++ b/src/modules/libpref/moz-build.patch
@@ -1,5 +1,5 @@
diff --git a/modules/libpref/moz.build b/modules/libpref/moz.build
-index 68a0bd6b50b804745b052e1921f4f6120354443e..23e7d03a6796af39dc2d39733b16548e73f8b10f 100644
+index 46034d8d99ba227f85824d472933ec556f54ba81..42f7f68aba60ca9c8f85f5fe13ffb56fa542e344 100644
--- a/modules/libpref/moz.build
+++ b/modules/libpref/moz.build
@@ -93,6 +93,7 @@ pref_groups = [
diff --git a/src/servo/components/style/gecko/media_features-rs.patch b/src/servo/components/style/gecko/media_features-rs.patch
index fd2ce91cd..5763b5101 100644
--- a/src/servo/components/style/gecko/media_features-rs.patch
+++ b/src/servo/components/style/gecko/media_features-rs.patch
@@ -1,5 +1,5 @@
diff --git a/servo/components/style/gecko/media_features.rs b/servo/components/style/gecko/media_features.rs
-index 3d4630e2250476729d21cdcb1726a7af93f9fd75..489d1dc624bb1e7b3f7ed22a0073d3ada29846e4 100644
+index b0082951254ad592c73caaa16c5b5c57127831a9..9b3566b08aacfcf2cfbf9941b2b3ca91a31ade59 100644
--- a/servo/components/style/gecko/media_features.rs
+++ b/servo/components/style/gecko/media_features.rs
@@ -13,6 +13,9 @@ use crate::values::computed::{CSSPixelLength, Context, Ratio, Resolution};
@@ -24,14 +24,14 @@ index 3d4630e2250476729d21cdcb1726a7af93f9fd75..489d1dc624bb1e7b3f7ed22a0073d3ad
+ KleeneValue::from(unsafe { bindings::Gecko_EvalMozPrefFeature(pref.as_ptr(), &MozPrefFeatureValue::::None) })
+}
- fn get_lnf_int(int_id: i32) -> i32 {
- unsafe { bindings::Gecko_GetLookAndFeelInt(int_id) }
-@@ -641,7 +651,13 @@ macro_rules! lnf_int_feature {
+ fn eval_moz_mac_rtl(context: &Context) -> bool {
+ unsafe { bindings::Gecko_MediaFeatures_MacRTL(context.device().document()) }
+@@ -645,7 +655,13 @@ macro_rules! lnf_int_feature {
/// to support new types in these entries and (2) ensuring that either
/// nsPresContext::MediaFeatureValuesChanged is called when the value that
/// would be returned by the evaluator function could change.
--pub static MEDIA_FEATURES: [QueryFeatureDescription; 58] = [
-+pub static MEDIA_FEATURES: [QueryFeatureDescription; 59] = [
+-pub static MEDIA_FEATURES: [QueryFeatureDescription; 59] = [
++pub static MEDIA_FEATURES: [QueryFeatureDescription; 60] = [
+ feature!(
+ atom!("-moz-bool-pref"),
+ AllowsRanges::No,
diff --git a/src/servo/components/style/queries/feature-rs.patch b/src/servo/components/style/queries/feature-rs.patch
index f9f6ae27e..18cb4aa09 100644
--- a/src/servo/components/style/queries/feature-rs.patch
+++ b/src/servo/components/style/queries/feature-rs.patch
@@ -1,5 +1,5 @@
diff --git a/servo/components/style/queries/feature.rs b/servo/components/style/queries/feature.rs
-index a9a4decb178234037a6d285ddd3206bd52f214e5..18ea220a14cbb59ef3c9809cb679f8fdb5352f98 100644
+index 1414dd624e0761d269f7e3b1c64ed4bb6576a6e3..f0204c2ee3e8c3527750a26788b5fb7cdf8dfc67 100644
--- a/servo/components/style/queries/feature.rs
+++ b/servo/components/style/queries/feature.rs
@@ -6,6 +6,7 @@
diff --git a/src/servo/components/style/queries/feature_expression-rs.patch b/src/servo/components/style/queries/feature_expression-rs.patch
index 1ec0d6303..8265a0588 100644
--- a/src/servo/components/style/queries/feature_expression-rs.patch
+++ b/src/servo/components/style/queries/feature_expression-rs.patch
@@ -1,5 +1,5 @@
diff --git a/servo/components/style/queries/feature_expression.rs b/servo/components/style/queries/feature_expression.rs
-index 31ba4839aacf740eae4a753c17ee34d9e13562eb..e59bea9cd82d85ff6b195051fef595a45dff520c 100644
+index 91e1d1572cbd3682ec977f21751e067968ed8884..6e618ac765f698bf3d9ce120167a6906ae3ce5ff 100644
--- a/servo/components/style/queries/feature_expression.rs
+++ b/servo/components/style/queries/feature_expression.rs
@@ -11,7 +11,7 @@ use crate::parser::{Parse, ParserContext};
diff --git a/src/testing/mochitest/browser-test-js.patch b/src/testing/mochitest/browser-test-js.patch
index 474a8f07c..ff99dd955 100644
--- a/src/testing/mochitest/browser-test-js.patch
+++ b/src/testing/mochitest/browser-test-js.patch
@@ -1,5 +1,5 @@
diff --git a/testing/mochitest/browser-test.js b/testing/mochitest/browser-test.js
-index 11217c210dd8dc5f7c4bdc6043df9aeb361529c6..18c3c4d658170d0646483cd289fe8ad1f21ffae0 100644
+index 979c6a0960cb8c490b612649d0fac55cd7b7d0f7..f149f248f705484b3572ca462660932dd792e312 100644
--- a/testing/mochitest/browser-test.js
+++ b/testing/mochitest/browser-test.js
@@ -440,11 +440,11 @@ Tester.prototype = {
diff --git a/src/toolkit/components/downloads/DownloadList-sys-mjs.patch b/src/toolkit/components/downloads/DownloadList-sys-mjs.patch
index ceff5a646..3a2c53041 100644
--- a/src/toolkit/components/downloads/DownloadList-sys-mjs.patch
+++ b/src/toolkit/components/downloads/DownloadList-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/toolkit/components/downloads/DownloadList.sys.mjs b/toolkit/components/downloads/DownloadList.sys.mjs
-index 9ffdcd97edb31c35168a88303474fc4f5dc7c9d4..3c361101190d7f6123568535c68781c0e46fe2a9 100644
+index ef84be4cfd8194a99e2b2019360b780c700d8d42..3979c03670902ea3ae8bd344612612b20bec6176 100644
--- a/toolkit/components/downloads/DownloadList.sys.mjs
+++ b/toolkit/components/downloads/DownloadList.sys.mjs
@@ -50,6 +50,7 @@ const FILE_EXTENSIONS = [
diff --git a/src/toolkit/components/extensions/parent/ext-downloads-js.patch b/src/toolkit/components/extensions/parent/ext-downloads-js.patch
index 5fdf9dbaf..81377918d 100644
--- a/src/toolkit/components/extensions/parent/ext-downloads-js.patch
+++ b/src/toolkit/components/extensions/parent/ext-downloads-js.patch
@@ -1,5 +1,5 @@
diff --git a/toolkit/components/extensions/parent/ext-downloads.js b/toolkit/components/extensions/parent/ext-downloads.js
-index 3b81d5e60a5e3006b80a2acec0b6720ccb7e5b33..5b6272986e13b48047f3bae1ec4205fc3e8012ef 100644
+index 4665c05116908133382be99ebeefd3546205750d..ba7cee3800e72f0fbd9b735c064cb6e61b4b4d28 100644
--- a/toolkit/components/extensions/parent/ext-downloads.js
+++ b/toolkit/components/extensions/parent/ext-downloads.js
@@ -87,6 +87,7 @@ const FILTER_IMAGES_EXTENSIONS = [
diff --git a/src/toolkit/components/pictureinpicture/content/player-js.patch b/src/toolkit/components/pictureinpicture/content/player-js.patch
index 7ae87824f..6e461b23b 100644
--- a/src/toolkit/components/pictureinpicture/content/player-js.patch
+++ b/src/toolkit/components/pictureinpicture/content/player-js.patch
@@ -1,8 +1,8 @@
diff --git a/toolkit/components/pictureinpicture/content/player.js b/toolkit/components/pictureinpicture/content/player.js
-index 3be55670e18ed2ae1e02307304a3699d16d89aa5..477933646c3623432164be06c31ef5328f86bba6 100644
+index 8a1088b318dfd321b4e5f34819c689a10e7f87b2..8d1816b27a0c88ab41b654249ae52111129edbf5 100644
--- a/toolkit/components/pictureinpicture/content/player.js
+++ b/toolkit/components/pictureinpicture/content/player.js
-@@ -755,6 +755,11 @@ let Player = {
+@@ -760,6 +760,11 @@ let Player = {
document.getElementById("large").click();
break;
}
diff --git a/src/toolkit/components/pictureinpicture/content/player-xhtml.patch b/src/toolkit/components/pictureinpicture/content/player-xhtml.patch
index ef89eff98..802143144 100644
--- a/src/toolkit/components/pictureinpicture/content/player-xhtml.patch
+++ b/src/toolkit/components/pictureinpicture/content/player-xhtml.patch
@@ -1,5 +1,5 @@
diff --git a/toolkit/components/pictureinpicture/content/player.xhtml b/toolkit/components/pictureinpicture/content/player.xhtml
-index b38789882149c97a3263c405b783999bc60a5c71..009b7b7aa2ded0d88247c62171bfff59222a8e28 100644
+index 09c9c5000de96fcd4a9d26328408996540c2cbda..b6d93850bbfe63a4e21756c97415a6c1908dae25 100644
--- a/toolkit/components/pictureinpicture/content/player.xhtml
+++ b/toolkit/components/pictureinpicture/content/player.xhtml
@@ -18,6 +18,7 @@
diff --git a/src/toolkit/content/widgets/browser-custom-element-mjs.patch b/src/toolkit/content/widgets/browser-custom-element-mjs.patch
index cb7820fe0..52362b570 100644
--- a/src/toolkit/content/widgets/browser-custom-element-mjs.patch
+++ b/src/toolkit/content/widgets/browser-custom-element-mjs.patch
@@ -1,8 +1,8 @@
diff --git a/toolkit/content/widgets/browser-custom-element.mjs b/toolkit/content/widgets/browser-custom-element.mjs
-index ef01902583d6ff1c563e9b2886f3048b127fe383..01f353f5eb4c67b2cf01a14e337a81e93358586f 100644
+index b5eb24e15cc97b004f182c35901505cb740e8571..f2dd435ba072affff3b4fdada6c360a575c22910 100644
--- a/toolkit/content/widgets/browser-custom-element.mjs
+++ b/toolkit/content/widgets/browser-custom-element.mjs
-@@ -482,11 +482,11 @@ class MozBrowser extends MozElements.MozElementMixin(XULFrameElement) {
+@@ -483,11 +483,11 @@ class MozBrowser extends MozElements.MozElementMixin(XULFrameElement) {
if (!this.browsingContext) {
return;
}
diff --git a/src/toolkit/content/widgets/moz-toggle/moz-toggle-css.patch b/src/toolkit/content/widgets/moz-toggle/moz-toggle-css.patch
index 766f3435b..305ba49e4 100644
--- a/src/toolkit/content/widgets/moz-toggle/moz-toggle-css.patch
+++ b/src/toolkit/content/widgets/moz-toggle/moz-toggle-css.patch
@@ -1,5 +1,5 @@
diff --git a/toolkit/content/widgets/moz-toggle/moz-toggle.css b/toolkit/content/widgets/moz-toggle/moz-toggle.css
-index 7b9ec91bf0cfd8fda6a161995c9de57270557f6c..b1049bd2b2c03104e5b35978a9b81674d6920d53 100644
+index 49f04a3a8eedf580e9854f04014c637894181300..4e1336b4a58afaba182de87b4e670b0f0b3d607e 100644
--- a/toolkit/content/widgets/moz-toggle/moz-toggle.css
+++ b/toolkit/content/widgets/moz-toggle/moz-toggle.css
@@ -6,8 +6,8 @@
diff --git a/src/toolkit/modules/moz-build.patch b/src/toolkit/modules/moz-build.patch
index a384e5c2e..f7c21aa5f 100644
--- a/src/toolkit/modules/moz-build.patch
+++ b/src/toolkit/modules/moz-build.patch
@@ -1,8 +1,8 @@
diff --git a/toolkit/modules/moz.build b/toolkit/modules/moz.build
-index 990244af276576d0af0b371a370287aa780f42c1..cd43715aea607fc7dbafda589e14e1462568dd61 100644
+index e43870b10c5b35165fd21b48065980060104dc52..71e3db5618c834bc4ff9d481b1e667f2b02b183e 100644
--- a/toolkit/modules/moz.build
+++ b/toolkit/modules/moz.build
-@@ -281,6 +281,7 @@ for var in (
+@@ -280,6 +280,7 @@ for var in (
"DLL_SUFFIX",
"DEBUG_JS_MODULES",
"OMNIJAR_NAME",
diff --git a/src/toolkit/moz-configure.patch b/src/toolkit/moz-configure.patch
index 2b4335893..7cbc4274e 100644
--- a/src/toolkit/moz-configure.patch
+++ b/src/toolkit/moz-configure.patch
@@ -1,5 +1,5 @@
diff --git a/toolkit/moz.configure b/toolkit/moz.configure
-index 44b91b7bb3e0196b7f1f923c43fb8967f569cd28..907f7059cb44b990b5eb3a90d5df523075cd6ae1 100644
+index 2fdcf62bde7805e52737cb06ec67908fa40524c9..b9f9e3abeb5cf770b29e1354615184fce2162ec7 100644
--- a/toolkit/moz.configure
+++ b/toolkit/moz.configure
@@ -22,6 +22,7 @@ def check_moz_app_id(moz_app_id, build_project):
diff --git a/src/toolkit/mozapps/extensions/AddonManager-sys-mjs.patch b/src/toolkit/mozapps/extensions/AddonManager-sys-mjs.patch
index 6ed13c08c..3fd64f2b3 100644
--- a/src/toolkit/mozapps/extensions/AddonManager-sys-mjs.patch
+++ b/src/toolkit/mozapps/extensions/AddonManager-sys-mjs.patch
@@ -1,5 +1,5 @@
diff --git a/toolkit/mozapps/extensions/AddonManager.sys.mjs b/toolkit/mozapps/extensions/AddonManager.sys.mjs
-index f544f44cf7a73858213ddfc07c0ad693e2f56504..01293cb38ad53ff36c545ccb392071e20fe1d62b 100644
+index 2c1e187d14bae0dcc17a1fa2de768e7c949b3776..c322b770bdc1a0786d8e3bf1af618e3d3d3dd26e 100644
--- a/toolkit/mozapps/extensions/AddonManager.sys.mjs
+++ b/toolkit/mozapps/extensions/AddonManager.sys.mjs
@@ -1227,12 +1227,12 @@ var AddonManagerInternal = {
diff --git a/src/toolkit/mozapps/extensions/content/aboutaddons-css.patch b/src/toolkit/mozapps/extensions/content/aboutaddons-css.patch
index d35981b3b..f0290fa86 100644
--- a/src/toolkit/mozapps/extensions/content/aboutaddons-css.patch
+++ b/src/toolkit/mozapps/extensions/content/aboutaddons-css.patch
@@ -1,5 +1,5 @@
diff --git a/toolkit/mozapps/extensions/content/aboutaddons.css b/toolkit/mozapps/extensions/content/aboutaddons.css
-index 733396c68be4f1dd9de99bd602c9f8cde8843957..e0d9489a89e366e3f6dab2a6f472c6752a8815b3 100644
+index 232fca6975de67bc0d84969204e75bad358b6bc7..4bbfb2abb9ea4812005734eb95a0bd7b8bbab7ce 100644
--- a/toolkit/mozapps/extensions/content/aboutaddons.css
+++ b/toolkit/mozapps/extensions/content/aboutaddons.css
@@ -105,6 +105,13 @@ h2 {
diff --git a/src/toolkit/profile/nsToolkitProfileService-cpp.patch b/src/toolkit/profile/nsToolkitProfileService-cpp.patch
index 3df221797..c796e9ba9 100644
--- a/src/toolkit/profile/nsToolkitProfileService-cpp.patch
+++ b/src/toolkit/profile/nsToolkitProfileService-cpp.patch
@@ -1,8 +1,8 @@
diff --git a/toolkit/profile/nsToolkitProfileService.cpp b/toolkit/profile/nsToolkitProfileService.cpp
-index befc1def42c9fdd33438f0485cea6d36520adf28..1d3dd61fd3dd1769a9523c95993bb31cfde7b7ab 100644
+index 1d8c95cc10d158e86254f45d8f955c8f8ce50394..3708da5d0780298589b89dbb4a03152749911dee 100644
--- a/toolkit/profile/nsToolkitProfileService.cpp
+++ b/toolkit/profile/nsToolkitProfileService.cpp
-@@ -82,6 +82,8 @@ using namespace mozilla;
+@@ -84,6 +84,8 @@ using namespace mozilla;
#define INSTALL_PREFIX_LENGTH 7
#define STORE_ID_PREF "toolkit.profiles.storeID"
@@ -11,7 +11,7 @@ index befc1def42c9fdd33438f0485cea6d36520adf28..1d3dd61fd3dd1769a9523c95993bb31c
struct KeyValue {
KeyValue(const char* aKey, const char* aValue) : key(aKey), value(aValue) {}
-@@ -1364,7 +1366,7 @@ nsresult nsToolkitProfileService::CreateDefaultProfile(
+@@ -1370,7 +1372,7 @@ nsresult nsToolkitProfileService::CreateDefaultProfile(
if (mUseDevEditionProfile) {
name.AssignLiteral(DEV_EDITION_NAME);
} else if (mUseDedicatedProfile) {
diff --git a/src/toolkit/themes/shared/aboutReader-css.patch b/src/toolkit/themes/shared/aboutReader-css.patch
index 5b830814d..6ea618c2e 100644
--- a/src/toolkit/themes/shared/aboutReader-css.patch
+++ b/src/toolkit/themes/shared/aboutReader-css.patch
@@ -1,8 +1,8 @@
diff --git a/toolkit/themes/shared/aboutReader.css b/toolkit/themes/shared/aboutReader.css
-index bf425379af81f442fb0b4ad7d2921c3f06196f26..6c2cc0faade92de995b675eea2696f061dfda571 100644
+index 1eb2c44694bb4970134fb5d290e32c7053103461..8d8237029976960048cb9aceede918c9e20c523b 100644
--- a/toolkit/themes/shared/aboutReader.css
+++ b/toolkit/themes/shared/aboutReader.css
-@@ -1189,3 +1189,43 @@ pre code {
+@@ -1181,3 +1181,43 @@ pre code {
display: block;
overflow: auto;
}
diff --git a/src/toolkit/themes/shared/in-content/common-shared-css.patch b/src/toolkit/themes/shared/in-content/common-shared-css.patch
index 70b644c55..615b9a4e5 100644
--- a/src/toolkit/themes/shared/in-content/common-shared-css.patch
+++ b/src/toolkit/themes/shared/in-content/common-shared-css.patch
@@ -1,5 +1,5 @@
diff --git a/toolkit/themes/shared/in-content/common-shared.css b/toolkit/themes/shared/in-content/common-shared.css
-index c45d48dc3106a2dc36f6dd704ebb2721817f016e..71291ab50b73872473190537fe2ce7a95a57aa12 100644
+index 96129498de63153704711bf7a21fb10922e80917..83f7b5ee2f15197dc42ec02ec1a73cc2bfc19a4d 100644
--- a/toolkit/themes/shared/in-content/common-shared.css
+++ b/toolkit/themes/shared/in-content/common-shared.css
@@ -4,7 +4,7 @@
@@ -11,7 +11,7 @@ index c45d48dc3106a2dc36f6dd704ebb2721817f016e..71291ab50b73872473190537fe2ce7a9
@namespace html "http://www.w3.org/1999/xhtml";
@namespace xul "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
-@@ -69,7 +69,7 @@
+@@ -68,7 +68,7 @@
* this in forced colors mode, as we should be using system colours then.
*/
:root[dialogroot] {
@@ -20,7 +20,7 @@ index c45d48dc3106a2dc36f6dd704ebb2721817f016e..71291ab50b73872473190537fe2ce7a9
}
}
-@@ -708,7 +708,7 @@ html|*#categories[last-input-type="mouse"] > html|button.category:focus-visible
+@@ -706,7 +706,7 @@ html|*#categories[last-input-type="mouse"] > html|button.category:focus-visible
fill-opacity: 1;
}
@@ -29,7 +29,7 @@ index c45d48dc3106a2dc36f6dd704ebb2721817f016e..71291ab50b73872473190537fe2ce7a9
:root {
--in-content-sidebar-width: 118px;
}
-@@ -1098,7 +1098,7 @@ xul|*.sidebar-footer-link {
+@@ -1096,7 +1096,7 @@ xul|*.sidebar-footer-link {
user-select: none;
}
diff --git a/src/toolkit/themes/shared/menulist-css.patch b/src/toolkit/themes/shared/menulist-css.patch
index 5fa88cb37..a8cd61158 100644
--- a/src/toolkit/themes/shared/menulist-css.patch
+++ b/src/toolkit/themes/shared/menulist-css.patch
@@ -1,5 +1,5 @@
diff --git a/toolkit/themes/shared/menulist.css b/toolkit/themes/shared/menulist.css
-index e5ac973b1ee2595e8547680465e25d537685a9e7..20f85152d783c81be5e29846353daca9ccd0c67d 100644
+index 8f9c006945e67f668075bd36ce83d5a772a9a796..08d68c015b001233548cd6c7babad17f3a638702 100644
--- a/toolkit/themes/shared/menulist.css
+++ b/toolkit/themes/shared/menulist.css
@@ -53,7 +53,7 @@
@@ -9,5 +9,5 @@ index e5ac973b1ee2595e8547680465e25d537685a9e7..20f85152d783c81be5e29846353daca9
- background-color: var(--button-background-color);
+ background-color: light-dark(rgba(0,0,0,.1), rgba(255,255,255,.1));
color: var(--button-text-color);
- border-radius: 4px;
+ border-radius: var(--border-radius-small);
padding-block: 4px;
diff --git a/src/toolkit/themes/shared/pictureinpicture/player-css.patch b/src/toolkit/themes/shared/pictureinpicture/player-css.patch
index 475bb4de0..798902248 100644
--- a/src/toolkit/themes/shared/pictureinpicture/player-css.patch
+++ b/src/toolkit/themes/shared/pictureinpicture/player-css.patch
@@ -1,8 +1,8 @@
diff --git a/toolkit/themes/shared/pictureinpicture/player.css b/toolkit/themes/shared/pictureinpicture/player.css
-index 4a4ab15f9801d9443f3dbc131a533823be423bd9..ed487012d172c278f7d5a59ee953de4a05456019 100644
+index 33b10bebcdfe636d7ff0f61a11d5fa4664a31f78..83b53817c53f43cca3be40b490300109b4949f5b 100644
--- a/toolkit/themes/shared/pictureinpicture/player.css
+++ b/toolkit/themes/shared/pictureinpicture/player.css
-@@ -736,3 +736,17 @@ input:checked + .slider::before {
+@@ -738,3 +738,17 @@ input:checked + .slider::before {
justify-self: center;
}
}
diff --git a/src/tools/signing/macos/mach_commands-py.patch b/src/tools/signing/macos/mach_commands-py.patch
index 73169aa91..be02e1b77 100644
--- a/src/tools/signing/macos/mach_commands-py.patch
+++ b/src/tools/signing/macos/mach_commands-py.patch
@@ -1,5 +1,5 @@
diff --git a/tools/signing/macos/mach_commands.py b/tools/signing/macos/mach_commands.py
-index 454a9bbc35802fbf811065e8e1ca592674016bb3..d6b0cf119664e0534a3898f72ffbcd3aade9c89d 100644
+index 721790b0d067ea1cdc6ddc9d220e423de9206d53..ca80e6f2c8bcd82eda24d03720a37a2bfdc50cfe 100644
--- a/tools/signing/macos/mach_commands.py
+++ b/tools/signing/macos/mach_commands.py
@@ -37,7 +37,6 @@ from mozbuild.base import MachCommandConditions as conditions
@@ -21,7 +21,7 @@ index 454a9bbc35802fbf811065e8e1ca592674016bb3..d6b0cf119664e0534a3898f72ffbcd3a
if use_rcodesign_arg is True:
sign_with_rcodesign(
command_context,
-@@ -567,7 +570,7 @@ def sign_with_rcodesign(
+@@ -608,7 +611,7 @@ def sign_with_rcodesign(
# input path and its options are specified as standard arguments.
ctx.log(logging.INFO, "macos-sign", {}, "Signing with rcodesign")
diff --git a/src/widget/cocoa/nsCocoaWindow-mm.patch b/src/widget/cocoa/nsCocoaWindow-mm.patch
index ecbe7de1e..ee8b3bc7a 100644
--- a/src/widget/cocoa/nsCocoaWindow-mm.patch
+++ b/src/widget/cocoa/nsCocoaWindow-mm.patch
@@ -1,8 +1,8 @@
diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
-index 827dc774a429d0595028314a522722078a202edc..11ba33c2c316c0fc53053f6f8d0feab97c93bc72 100644
+index 6c80f33454503af0840af18cb88af44a006727ee..47b318814ddd57b1e73c66b576884b8e62093906 100644
--- a/widget/cocoa/nsCocoaWindow.mm
+++ b/widget/cocoa/nsCocoaWindow.mm
-@@ -7540,7 +7540,7 @@ static NSMutableSet* gSwizzledFrameViewClasses = nil;
+@@ -7588,7 +7588,7 @@ static NSMutableSet* gSwizzledFrameViewClasses = nil;
// Returns an autoreleased NSImage.
static NSImage* GetMenuMaskImage() {
diff --git a/src/xpfe/appshell/AppWindow-cpp.patch b/src/xpfe/appshell/AppWindow-cpp.patch
index 70df53122..61deb9ea7 100644
--- a/src/xpfe/appshell/AppWindow-cpp.patch
+++ b/src/xpfe/appshell/AppWindow-cpp.patch
@@ -1,8 +1,8 @@
diff --git a/xpfe/appshell/AppWindow.cpp b/xpfe/appshell/AppWindow.cpp
-index 0b7788ec179d1c1021d2e5692c652b367646d33b..f5d48ca47a899b82f9d9cb7823eeb096f542c0ea 100644
+index 64f18c991b0b9a8bf3690a54624b447f347a210e..0b00a29956cd6a750d5feadd4b2a4ceb8338410b 100644
--- a/xpfe/appshell/AppWindow.cpp
+++ b/xpfe/appshell/AppWindow.cpp
-@@ -1873,7 +1873,7 @@ nsresult AppWindow::MaybeSaveEarlyWindowPersistentValues(
+@@ -1874,7 +1874,7 @@ nsresult AppWindow::MaybeSaveEarlyWindowPersistentValues(
}
}
diff --git a/src/zen/common/ZenCommonUtils.mjs b/src/zen/common/ZenCommonUtils.mjs
index e35178936..4f2058fc9 100644
--- a/src/zen/common/ZenCommonUtils.mjs
+++ b/src/zen/common/ZenCommonUtils.mjs
@@ -68,58 +68,36 @@ class nsZenPreloadedFeature {
var gZenCommonActions = {
copyCurrentURLToClipboard() {
- const currentUrl = gBrowser.currentURI.spec;
- if (currentUrl) {
- let str = Cc['@mozilla.org/supports-string;1'].createInstance(Ci.nsISupportsString);
- str.data = currentUrl;
- let transferable = Cc['@mozilla.org/widget/transferable;1'].createInstance(
- Ci.nsITransferable
- );
- transferable.init(window.docShell.QueryInterface(Ci.nsILoadContext));
- transferable.addDataFlavor('text/plain');
- transferable.setTransferData('text/plain', str);
- Services.clipboard.setData(transferable, null, Ci.nsIClipboard.kGlobalClipboard);
- let button;
- if (
- Services.zen.canShare() &&
- (currentUrl.startsWith('http://') || currentUrl.startsWith('https://'))
- ) {
- button = {
- id: 'zen-copy-current-url-button',
- command: (event) => {
- const buttonRect = event.target.getBoundingClientRect();
- Services.zen.share(
- Services.io.newURI(currentUrl),
- '',
- '',
- buttonRect.left,
- window.innerHeight - buttonRect.bottom,
- buttonRect.width,
- buttonRect.height
- );
- },
- };
- }
- gZenUIManager.showToast('zen-copy-current-url-confirmation', { button, timeout: 3000 });
+ const [currentUrl, ClipboardHelper] = gURLBar.zenStrippedURI;
+ const displaySpec = currentUrl.displaySpec;
+ ClipboardHelper.copyString(displaySpec);
+ let button;
+ if (Services.zen.canShare() && displaySpec.startsWith('http')) {
+ button = {
+ id: 'zen-copy-current-url-button',
+ command: (event) => {
+ const buttonRect = event.target.getBoundingClientRect();
+ Services.zen.share(
+ currentUrl,
+ '',
+ '',
+ buttonRect.left,
+ window.innerHeight - buttonRect.bottom,
+ buttonRect.width,
+ buttonRect.height
+ );
+ },
+ };
}
+ gZenUIManager.showToast('zen-copy-current-url-confirmation', { button, timeout: 3000 });
},
copyCurrentURLAsMarkdownToClipboard() {
- const currentUrl = gBrowser.currentURI.spec;
+ const [currentUrl, ClipboardHelper] = gURLBar.zenStrippedURI;
const tabTitle = gBrowser.selectedTab.label;
- if (currentUrl && tabTitle) {
- const markdownLink = `[${tabTitle}](${currentUrl})`;
- let str = Cc['@mozilla.org/supports-string;1'].createInstance(Ci.nsISupportsString);
- str.data = markdownLink;
- let transferable = Cc['@mozilla.org/widget/transferable;1'].createInstance(
- Ci.nsITransferable
- );
- transferable.init(window.docShell.QueryInterface(Ci.nsILoadContext));
- transferable.addDataFlavor('text/plain');
- transferable.setTransferData('text/plain', str);
- Services.clipboard.setData(transferable, null, Ci.nsIClipboard.kGlobalClipboard);
- gZenUIManager.showToast('zen-copy-current-url-confirmation');
- }
+ const markdownLink = `[${tabTitle}](${currentUrl.displaySpec})`;
+ ClipboardHelper.copyString(markdownLink);
+ gZenUIManager.showToast('zen-copy-current-url-confirmation', { timeout: 3000 });
},
throttle(f, delay) {
diff --git a/src/zen/common/ZenCustomizableUI.sys.mjs b/src/zen/common/ZenCustomizableUI.sys.mjs
index 04304dec0..e748b5b71 100644
--- a/src/zen/common/ZenCustomizableUI.sys.mjs
+++ b/src/zen/common/ZenCustomizableUI.sys.mjs
@@ -13,7 +13,7 @@ export var ZenCustomizableUI = new (class {
'zen-sidebar-top-buttons',
{
type: this.TYPE_TOOLBAR,
- defaultPlacements: [],
+ defaultPlacements: ['zen-toggle-compact-mode'],
defaultCollapsed: null,
overflowable: true,
},
@@ -32,12 +32,12 @@ export var ZenCustomizableUI = new (class {
// We do not have access to the window object here
init(window) {
- this._addSidebarButtons(window);
- this._hideToolbarButtons(window);
+ this.#addSidebarButtons(window);
+ this.#modifyToolbarButtons(window);
}
- _addSidebarButtons(window) {
- const kDefaultSidebarWidth = '210px';
+ #addSidebarButtons(window) {
+ const kDefaultSidebarWidth = '215px';
const toolbox = window.gNavToolbox;
// Set a splitter to navigator-toolbox
@@ -63,10 +63,17 @@ export var ZenCustomizableUI = new (class {
default-overflowbutton="nav-bar-overflow-button"
default-overflowtarget="widget-overflow-list"
default-overflowpanel="widget-overflow"
- addon-webext-overflowbutton="unified-extensions-button"
+ addon-webext-overflowbutton="zen-site-data-icon-button"
addon-webext-overflowtarget="overflowed-extensions-list"
mode="icons">
@@ -100,22 +107,30 @@ export var ZenCustomizableUI = new (class {
elem.setAttribute('removable', 'true');
}
- this._initCreateNewButton(window);
- this._moveWindowButtons(window);
+ this.#initCreateNewButton(window);
+ this.#moveWindowButtons(window);
}
- _initCreateNewButton(window) {
+ #initCreateNewButton(window) {
const button = window.document.getElementById('zen-create-new-button');
- button.addEventListener('command', () => {
+ button.addEventListener('command', (event) => {
if (button.hasAttribute('open')) {
return;
}
const popup = window.document.getElementById('zenCreateNewPopup');
- popup.openPopup(button, 'before_start');
+ popup.openPopup(
+ button,
+ 'before_start',
+ 0,
+ 0,
+ true /* isContextMenu */,
+ false /* attributesOverride */,
+ event
+ );
});
}
- _moveWindowButtons(window) {
+ #moveWindowButtons(window) {
const windowControls = window.document.getElementsByClassName('titlebar-buttonbox-container');
const toolboxIcons = window.document.getElementById(
'zen-sidebar-top-buttons-customization-target'
@@ -134,7 +149,7 @@ export var ZenCustomizableUI = new (class {
}
}
- _hideToolbarButtons(window) {
+ #modifyToolbarButtons(window) {
const wrapper = window.document.getElementById('zen-sidebar-foot-buttons');
const elementsToHide = ['new-tab-button'];
for (let id of elementsToHide) {
@@ -143,6 +158,7 @@ export var ZenCustomizableUI = new (class {
wrapper.prepend(elem);
}
}
+ window.document.getElementById('stop-reload-button').removeAttribute('overflows');
}
_dispatchResizeEvent(window) {
diff --git a/src/zen/common/ZenHasPolyfill.mjs b/src/zen/common/ZenHasPolyfill.mjs
index b7e6b2c60..1f50dc4f2 100644
--- a/src/zen/common/ZenHasPolyfill.mjs
+++ b/src/zen/common/ZenHasPolyfill.mjs
@@ -15,7 +15,11 @@
observeSelectorExistence(element, descendantSelectors, stateAttribute, attributeFilter = []) {
const updateState = () => {
const exists = descendantSelectors.some(({ selector }) => {
- return element.querySelector(selector);
+ let selected = element.querySelector(selector);
+ if (selected?.tagName?.toLowerCase() === 'menu') {
+ return null;
+ }
+ return selected;
});
const { exists: shouldExist = true } = descendantSelectors;
if (exists === shouldExist) {
diff --git a/src/zen/common/ZenStartup.mjs b/src/zen/common/ZenStartup.mjs
index 3fa3d061c..f1b6c5a0f 100644
--- a/src/zen/common/ZenStartup.mjs
+++ b/src/zen/common/ZenStartup.mjs
@@ -32,9 +32,6 @@
toolbarBackground.removeAttribute('id');
toolbarBackground.classList.add('zen-toolbar-background');
document.getElementById('titlebar').prepend(toolbarBackground);
- document
- .getElementById('zen-appcontent-navbar-container')
- .prepend(toolbarBackground.cloneNode(true));
}
#zenInitBrowserLayout() {
@@ -61,11 +58,6 @@
setTimeout(() => {
gZenUIManager.init();
this.#checkForWelcomePage();
-
- document.l10n.setAttributes(
- document.getElementById('tabs-newtab-button'),
- 'tabs-toolbar-new-tab'
- );
}, 0);
} catch (e) {
console.error('ZenThemeModifier: Error initializing browser layout', e);
diff --git a/src/zen/common/ZenUIManager.mjs b/src/zen/common/ZenUIManager.mjs
index cf6e04202..9ae4d45fa 100644
--- a/src/zen/common/ZenUIManager.mjs
+++ b/src/zen/common/ZenUIManager.mjs
@@ -1,6 +1,7 @@
// 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/.
+
var gZenUIManager = {
_popupTrackingElements: [],
_hoverPausedForExpand: false,
@@ -14,19 +15,6 @@ var gZenUIManager = {
init() {
document.addEventListener('popupshowing', this.onPopupShowing.bind(this));
document.addEventListener('popuphidden', this.onPopupHidden.bind(this));
- XPCOMUtils.defineLazyPreferenceGetter(
- this,
- 'contentElementSeparation',
- 'zen.theme.content-element-separation',
- 0
- );
- XPCOMUtils.defineLazyPreferenceGetter(this, 'urlbarWaitToClear', 'zen.urlbar.wait-to-clear', 0);
- XPCOMUtils.defineLazyPreferenceGetter(
- this,
- 'urlbarShowDomainOnly',
- 'zen.urlbar.show-domain-only-in-sidebar',
- true
- );
document.addEventListener('mousedown', this.handleMouseDown.bind(this), true);
@@ -44,8 +32,6 @@ var gZenUIManager = {
return document.getElementById('zen-toast-container');
});
- gURLBar._zenTrimURL = this.urlbarTrim.bind(this);
-
new ResizeObserver(
gZenCommonActions.throttle(
gZenCompactModeManager.getAndApplySidebarWidth.bind(gZenCompactModeManager),
@@ -69,14 +55,54 @@ var gZenUIManager = {
this._initCreateNewPopup();
this._debloatContextMenus();
- this._initOmniboxCommands();
+ this._addNewCustomizableButtonsIfNeeded();
+ this._initOmnibox();
+ this._initBookmarkCollapseListener();
},
- _initOmniboxCommands() {
+ _addNewCustomizableButtonsIfNeeded() {
+ const kPref = 'zen.ui.migration.compact-mode-button-added';
+ let navbarPlacements = CustomizableUI.getWidgetIdsInArea('zen-sidebar-top-buttons');
+ try {
+ if (!navbarPlacements.length && !Services.prefs.getBoolPref(kPref, false)) {
+ CustomizableUI.addWidgetToArea('zen-toggle-compact-mode', 'zen-sidebar-top-buttons', 0);
+ gZenVerticalTabsManager._topButtonsSeparatorElement.before(
+ document.getElementById('zen-toggle-compact-mode')
+ );
+ }
+ } catch (e) {
+ console.error('Error adding compact mode button to sidebar:', e);
+ }
+ Services.prefs.setBoolPref(kPref, true);
+ },
+
+ _initBookmarkCollapseListener() {
+ const toolbar = document.getElementById('PersonalToolbar');
+ if (!toolbar.hasAttribute('collapsed')) {
+ // Set it initially if bookmarks toolbar is visible, customizable UI
+ // is ran before this function.
+ document.documentElement.setAttribute('zen-has-bookmarks', 'true');
+ }
+ toolbar.addEventListener('toolbarvisibilitychange', (event) => {
+ const visible = event.detail.visible;
+ if (visible) {
+ document.documentElement.setAttribute('zen-has-bookmarks', 'true');
+ } else {
+ document.documentElement.removeAttribute('zen-has-bookmarks');
+ }
+ });
+ },
+
+ _initOmnibox() {
const { registerZenUrlbarProviders } = ChromeUtils.importESModule(
'resource:///modules/ZenUBProvider.sys.mjs'
);
+ const { nsZenSiteDataPanel } = ChromeUtils.importESModule(
+ 'resource:///modules/ZenSiteDataPanel.sys.mjs'
+ );
registerZenUrlbarProviders();
+ window.gZenSiteDataPanel = new nsZenSiteDataPanel(window);
+ gURLBar._zenTrimURL = this.urlbarTrim.bind(this);
},
_debloatContextMenus() {
@@ -215,13 +241,15 @@ var gZenUIManager = {
!el.contains(showEvent.explicitOriginalTarget) ||
(showEvent.explicitOriginalTarget instanceof Element &&
showEvent.explicitOriginalTarget?.closest('panel')) ||
- // See bug #7590: Ignore menupopup elements opening
- showEvent.explicitOriginalTarget.tagName === 'menupopup'
+ // See bug #7590: Ignore menupopup elements opening.
+ // Also see #10612 for the exclusion of the zen-appcontent-navbar-wrapper
+ (showEvent.explicitOriginalTarget.tagName === 'menupopup' &&
+ el.id !== 'zen-appcontent-navbar-wrapper')
) {
continue;
}
document.removeEventListener('mousemove', this.__removeHasPopupAttribute);
- el.setAttribute('has-popup-menu', '');
+ gZenCompactModeManager._setElementExpandAttribute(el, true, 'has-popup-menu');
this.__currentPopup = showEvent.target;
this.__currentPopupTrackElement = el;
break;
@@ -234,9 +262,10 @@ var gZenUIManager = {
}
const element = this.__currentPopupTrackElement;
if (document.getElementById('main-window').matches(':hover')) {
- element.removeAttribute('has-popup-menu');
+ gZenCompactModeManager._setElementExpandAttribute(element, false, 'has-popup-menu');
} else {
- this.__removeHasPopupAttribute = () => element.removeAttribute('has-popup-menu');
+ this.__removeHasPopupAttribute = () =>
+ gZenCompactModeManager._setElementExpandAttribute(element, false, 'has-popup-menu');
document.addEventListener('mousemove', this.__removeHasPopupAttribute, { once: true });
}
this.__currentPopup = null;
@@ -260,7 +289,7 @@ var gZenUIManager = {
gURLBar.removeAttribute('animate-searchmode');
delete this._animatingSearchModeTimeout;
});
- }, 700);
+ }, 1000);
}
}
},
@@ -529,6 +558,9 @@ var gZenUIManager = {
this._toastContainer.removeAttribute('hidden');
this._toastContainer.appendChild(toast);
const timeoutFunction = () => {
+ if (Services.prefs.getBoolPref('ui.popup.disable_autohide')) {
+ return;
+ }
this.motion
.animate(toast, { opacity: [1, 0], scale: [1, 0.5] }, { duration: 0.2, bounce: 0 })
.then(() => {
@@ -594,6 +626,26 @@ var gZenUIManager = {
},
};
+XPCOMUtils.defineLazyPreferenceGetter(
+ gZenUIManager,
+ 'contentElementSeparation',
+ 'zen.theme.content-element-separation',
+ 0
+);
+
+XPCOMUtils.defineLazyPreferenceGetter(
+ gZenUIManager,
+ 'urlbarWaitToClear',
+ 'zen.urlbar.wait-to-clear',
+ 0
+);
+XPCOMUtils.defineLazyPreferenceGetter(
+ gZenUIManager,
+ 'urlbarShowDomainOnly',
+ 'zen.urlbar.show-domain-only-in-sidebar',
+ true
+);
+
var gZenVerticalTabsManager = {
init() {
this._multiWindowFeature = new nsZenMultiWindowFeature();
@@ -863,17 +915,19 @@ var gZenVerticalTabsManager = {
recalculateURLBarHeight() {
requestAnimationFrame(() => {
- document.getElementById('urlbar').removeAttribute('--urlbar-height');
- let height;
- if (!this._hasSetSingleToolbar) {
- height = 32;
- } else if (gURLBar.getAttribute('breakout-extend') !== 'true') {
- height = 40;
- }
- if (typeof height !== 'undefined') {
- document.getElementById('urlbar').style.setProperty('--urlbar-height', `${height}px`);
- }
- gURLBar.valueFormatter._formatURL();
+ requestAnimationFrame(() => {
+ gURLBar.textbox.removeAttribute('--urlbar-height');
+ let height;
+ if (!this._hasSetSingleToolbar) {
+ height = 32;
+ } else if (gURLBar.getAttribute('breakout-extend') !== 'true') {
+ height = 40;
+ }
+ if (typeof height !== 'undefined') {
+ gURLBar.textbox.style.setProperty('--urlbar-height', `${height}px`);
+ }
+ gURLBar.zenFormatURLValue();
+ });
});
},
@@ -945,7 +999,7 @@ var gZenVerticalTabsManager = {
(isCompactMode && isSingleToolbar && this.isWindowsStyledButtons)) &&
isSingleToolbar
) {
- appContentNavbarWrapper.setAttribute('should-hide', 'true');
+ appContentNavbarWrapper.setAttribute('should-hide', true);
shouldHide = true;
} else {
appContentNavbarWrapper.removeAttribute('should-hide');
@@ -1032,6 +1086,19 @@ var gZenVerticalTabsManager = {
) {
topButtons.prepend(windowButtons);
}
+
+ const canHideTabBarPref = Services.prefs.getBoolPref('zen.view.compact.hide-tabbar');
+ const captionsShouldStayOnSidebar =
+ !canHideTabBarPref &&
+ ((!this.isWindowsStyledButtons && !isRightSide) ||
+ (this.isWindowsStyledButtons && isRightSide));
+ if (
+ (!isSingleToolbar && isCompactMode && !captionsShouldStayOnSidebar) ||
+ !isSidebarExpanded
+ ) {
+ navBar.prepend(topButtons);
+ }
+
// Case: single toolbar, compact mode, right side and windows styled buttons
if (isSingleToolbar && isCompactMode && isRightSide && this.isWindowsStyledButtons) {
topButtons.prepend(windowButtons);
@@ -1059,7 +1126,11 @@ var gZenVerticalTabsManager = {
}
}
} else if (!isSingleToolbar && isCompactMode) {
- navBar.appendChild(windowButtons);
+ if (captionsShouldStayOnSidebar) {
+ topButtons.prepend(windowButtons);
+ } else {
+ navBar.appendChild(windowButtons);
+ }
} else if (isSingleToolbar && isCompactMode) {
if (!isRightSide && !this.isWindowsStyledButtons) {
topButtons.prepend(windowButtons);
@@ -1071,7 +1142,6 @@ var gZenVerticalTabsManager = {
}
gZenCompactModeManager.updateCompactModeContext(isSingleToolbar);
- this.recalculateURLBarHeight();
// Always move the splitter next to the sidebar
const splitter = document.getElementById('zen-sidebar-splitter');
diff --git a/src/zen/common/ZenUIMigration.sys.mjs b/src/zen/common/ZenUIMigration.sys.mjs
index 18c3f6ca5..7b7457012 100644
--- a/src/zen/common/ZenUIMigration.sys.mjs
+++ b/src/zen/common/ZenUIMigration.sys.mjs
@@ -2,11 +2,11 @@
// 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/.
-const { AppConstants } = ChromeUtils.importESModule('resource://gre/modules/AppConstants.sys.mjs');
+import { AppConstants } from 'resource://gre/modules/AppConstants.sys.mjs';
class nsZenUIMigration {
PREF_NAME = 'zen.ui.migration.version';
- MIGRATION_VERSION = 3;
+ MIGRATION_VERSION = 5;
init(isNewProfile) {
if (!isNewProfile) {
@@ -74,9 +74,21 @@ class nsZenUIMigration {
_migrateV3() {
if (Services.prefs.getStringPref('zen.theme.accent-color', '').startsWith('system')) {
- Services.prefs.setStringPref('zen.theme.accent-color', '#ffb787');
+ Services.prefs.setStringPref('zen.theme.accent-color', 'AccentColor');
}
}
+
+ _migrateV4() {
+ // Fix spelling mistake in preference name
+ Services.prefs.setBoolPref(
+ 'zen.theme.use-system-colors',
+ Services.prefs.getBoolPref('zen.theme.use-sysyem-colors', false)
+ );
+ }
+
+ _migrateV5() {
+ Services.prefs.setBoolPref('zen.site-data-panel.show-callout', true);
+ }
}
export var gZenUIMigration = new nsZenUIMigration();
diff --git a/src/zen/common/styles/zen-animations.css b/src/zen/common/styles/zen-animations.css
index 5d3c6d091..ae77e9502 100644
--- a/src/zen/common/styles/zen-animations.css
+++ b/src/zen/common/styles/zen-animations.css
@@ -3,20 +3,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/.
*/
-@keyframes zen-jello-animation {
- 0% {
- transform: scale3d(0.8, 0.8, 0.8);
- }
-
- 60% {
- transform: scale3d(1.02, 1.02, 1.02);
- }
-
- to {
- opacity: 1;
- transform: scale3d(1, 1, 1);
- }
-}
@keyframes zen-jello-animation-macos {
0% {
@@ -30,21 +16,6 @@
}
}
-@keyframes zen-jello-animation-large {
- 0% {
- transform: scale3d(0.8, 0.8, 0.8);
- }
-
- 60% {
- transform: scale3d(1.02, 1.02, 1.02);
- }
-
- to {
- opacity: 1;
- transform: scale3d(1, 1, 1);
- }
-}
-
@keyframes zen-theme-picker-dot-animation {
from {
transform: scale(0.8) translate(-50%, -50%);
@@ -103,10 +74,15 @@
/* Mark: URL Bar */
@keyframes zen-urlbar-searchmode {
0% {
- box-shadow: 0 0 20px color-mix(in srgb, var(--zen-primary-color), var(--toolbox-textcolor) 20%);
+ box-shadow: 0 0 20px
+ color-mix(
+ in srgb,
+ color-mix(in srgb, var(--zen-primary-color), var(--toolbox-textcolor) 20%),
+ light-dark(rgba(0, 0, 0, 0.3), transparent) 50%
+ );
}
100% {
- box-shadow: 0 0 300px color-mix(in srgb, var(--zen-primary-color), transparent 100%);
+ box-shadow: 0 0 250px color-mix(in srgb, var(--zen-primary-color), transparent 100%);
}
}
diff --git a/src/zen/common/styles/zen-browser-container.css b/src/zen/common/styles/zen-browser-container.css
index 1407dbe83..db466d89c 100644
--- a/src/zen/common/styles/zen-browser-container.css
+++ b/src/zen/common/styles/zen-browser-container.css
@@ -8,16 +8,23 @@
#tabbrowser-tabpanels[dragging-split='true'] {
width: -moz-available;
position: relative;
- overflow: clip;
&.browserSidebarContainer {
- :root:not([zen-no-padding='true']) & {
+ overflow: clip;
+
+ :root:not([zen-no-padding='true']) &:not(.zen-glance-overlay) {
border-radius: var(--zen-native-inner-radius);
box-shadow: var(--zen-big-shadow);
}
& browser[type='content'] {
- background: light-dark(rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.1));
+ &:not([transparent='true']) {
+ background: light-dark(rgb(255, 255, 255), rgb(32, 32, 32));
+ }
+
+ &[transparent='true'] {
+ background: light-dark(rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.1));
+ }
}
@media not -moz-pref('layout.css.prefers-color-scheme.content-override', 2) {
@@ -35,4 +42,27 @@
}
}
}
+
+ @media not ((-moz-pref('zen.view.experimental-no-window-controls') or (not -moz-pref('zen.view.hide-window-controls'))) and -moz-pref('zen.view.use-single-toolbar')) {
+ .browserSidebarContainer:is(.deck-selected, [zen-split='true']) .browserContainer {
+ transition: margin var(--zen-hidden-toolbar-transition);
+
+ :root[zen-single-toolbar='true'] & {
+ transition-delay: 0.2s;
+ --zen-toolbar-height: 34px;
+ }
+
+ #tabbrowser-tabpanels[has-toolbar-hovered] & {
+ --margin-top-fix: calc(-1 * var(--zen-toolbar-height) + var(--zen-element-separation));
+
+ :root:not([zen-single-toolbar='true']) & {
+ --margin-top-fix: calc(
+ -1 * var(--zen-toolbar-height-with-bookmarks) + var(--zen-element-separation)
+ );
+ }
+
+ margin-top: var(--margin-top-fix);
+ }
+ }
+ }
}
diff --git a/src/zen/common/styles/zen-browser-ui.css b/src/zen/common/styles/zen-browser-ui.css
index c542eccd4..2ecf54fab 100644
--- a/src/zen/common/styles/zen-browser-ui.css
+++ b/src/zen/common/styles/zen-browser-ui.css
@@ -37,11 +37,8 @@
}
.zen-browser-generic-background {
- width: 100%;
- height: 100%;
position: absolute;
- top: 0;
- left: 0;
+ inset: 0;
z-index: 0;
pointer-events: none;
overflow: clip;
@@ -112,17 +109,29 @@
}
}
+#zen-browser-background {
+ /* This is conceptually a background, but putting this on a pseudo-element
+ * avoids it from suppressing the chrome-content separator border, etc.
+ *
+ * See bugzilla's 1949528 and bug 1476281 (which would make this unnecessary). */
+ @media (-moz-platform: macos) {
+ -moz-default-appearance: -moz-sidebar;
+ appearance: auto;
+ }
+
+ /*
+ * Important: We set the color to `AccentColor` so we can
+ * Compute the stylings and get the native accent color.
+ * Please, do not remove this.
+ */
+ color: AccentColor;
+}
+
#sidebar-box {
/** Sidebar is already hidden in full screen mode */
border: none;
}
-@media (-moz-platform: macos) {
- #zen-main-app-wrapper {
- appearance: -moz-sidebar !important;
- }
-}
-
:root:not([zen-single-toolbar='true']) #zen-appcontent-wrapper {
z-index: 2;
}
@@ -202,16 +211,28 @@
@media -moz-pref('zen.widget.mac.mono-window-controls') {
.titlebar-buttonbox-container {
color: var(--toolbox-textcolor);
+
+ --zen-traffic-light-size: 6px;
+
+ @media (-moz-mac-tahoe-theme) {
+ --zen-traffic-light-size: 7px;
+ }
+
/* Draw 3 dots as background to represent the window controls,
all with the same cololr as the titlebar */
background-image: radial-gradient(
circle,
- var(--zen-toolbar-element-bg) 6px,
+ var(--zen-toolbar-element-bg) var(--zen-traffic-light-size),
transparent 0.5px
);
background-size: 20px 22px;
background-position: 53% 50%;
+ @media (-moz-mac-tahoe-theme) {
+ background-size: 23px 22px;
+ background-position: 52% 50%;
+ }
+
&:not([zen-has-hover='true']) > .titlebar-buttonbox {
opacity: 0;
}
@@ -311,3 +332,14 @@
opacity: 1;
}
}
+
+#zen-appcontent-navbar-wrapper #zen-sidebar-top-buttons {
+ max-width: fit-content;
+ :root[zen-right-side='true'] & {
+ order: 1;
+ }
+}
+
+:root[zen-right-side='true'] #zen-appcontent-navbar-wrapper #PanelUI-button {
+ order: 2;
+}
diff --git a/src/zen/common/styles/zen-omnibox.css b/src/zen/common/styles/zen-omnibox.css
index 1b6db9023..3cefc3856 100644
--- a/src/zen/common/styles/zen-omnibox.css
+++ b/src/zen/common/styles/zen-omnibox.css
@@ -31,6 +31,11 @@
--urlbar-container-padding: 0px;
}
+ :root[inDOMFullscreen] & {
+ /* See issue https://github.com/zen-browser/desktop/issues/5229 */
+ visibility: visible;
+ }
+
:root[zen-single-toolbar='true'] &[breakout-extend='true'],
&[zen-floating-urlbar='true'] {
--urlbar-container-padding: 3px;
@@ -109,6 +114,10 @@
border-radius: 0px !important;
}
+#urlbar .urlbar-input-box {
+ font-weight: 500;
+}
+
:root[zen-single-toolbar='true'] #urlbar:not([breakout-extend='true']) {
& #urlbar-input {
cursor: default;
@@ -120,6 +129,55 @@
border-radius: 10px !important;
}
}
+
+ .identity-box-button,
+ #zen-copy-url-button {
+ opacity: 0;
+ transition:
+ opacity 0.15s,
+ visibility 0.15s;
+ visibility: collapse;
+ height: 100%; /* To still be able to open popups */
+
+ #navigator-toolbox:hover &,
+ &[open],
+ #identity-box[pageproxystate='invalid'] & {
+ opacity: 1;
+ visibility: visible;
+ }
+ }
+}
+
+:root:not([zen-single-toolbar='true'])
+ #urlbar:not([breakout-extend='true'])
+ .urlbar-input-container:not([pageproxystate='invalid']) {
+ padding: 2px 3px;
+ gap: 2px;
+
+ & .urlbar-page-action {
+ height: 100%;
+ }
+
+ & #zen-copy-url-button {
+ order: -1;
+ }
+
+ & #identity-box {
+ order: 999;
+ margin: 0px !important;
+ }
+}
+
+#zen-copy-url-button[disabled] {
+ opacity: 0.3;
+ background: transparent !important;
+}
+
+:root[zen-single-toolbar='true'],
+#urlbar:is([breakout-extend='true'], [pageproxystate='invalid']) {
+ #zen-copy-url-button[disabled] {
+ display: none !important;
+ }
}
.urlbar-page-action,
@@ -155,11 +213,15 @@
order: 2 !important;
}
-#urlbar[breakout-extend='true'] {
+#urlbar[breakout] {
position: fixed;
+}
+
+#urlbar[breakout-extend='true'] {
z-index: 2;
- & .urlbar-input-container {
+ :root[zen-single-toolbar='true'] & .urlbar-input-box,
+ &[zen-floating-urlbar='true'] .urlbar-input-box {
font-weight: 400;
@media (-moz-platform: windows) {
font-weight: 500;
@@ -167,13 +229,19 @@
}
& #identity-box {
- margin-right: calc(var(--urlbar-margin-inline) - 1px);
+ height: 100%;
+ }
+
+ :root:not([zen-single-toolbar='true'])
+ &:not([zen-floating-urlbar='true'])
+ #identity-box:not([pageproxystate='invalid']) {
+ margin-inline-end: 0;
}
& .urlbar-background {
--zen-urlbar-background-base: light-dark(
- white,
- color-mix(in srgb, hsl(0, 0%, 1%), var(--zen-colors-primary) 25%)
+ #fbfbfb,
+ color-mix(in srgb, hsl(0, 0%, 1%), var(--zen-colors-primary) 30%)
);
@media -moz-pref('zen.theme.acrylic-elements') {
--zen-urlbar-background-transparent: color-mix(
@@ -186,7 +254,7 @@
--zen-urlbar-background-transparent,
var(--zen-urlbar-background-base)
) !important;
- box-shadow: 0px 0px 90px -10px light-dark(rgba(0, 0, 0, 0.8), rgba(0, 0, 0, 0.75)) !important;
+ box-shadow: 0px 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-offset: var(--zen-urlbar-outline-offset) !important;
@@ -208,7 +276,11 @@
height: 100%;
border-radius: inherit;
pointer-events: none;
- animation: zen-urlbar-searchmode ease-out 0.7s forwards;
+ animation: zen-urlbar-searchmode ease-out 1s forwards;
+ }
+
+ & #zen-copy-url-button {
+ display: none;
}
}
@@ -217,24 +289,16 @@
}
:root[zen-single-toolbar='true'] {
- --urlbar-icon-border-radius: 10px !important;
+ --urlbar-icon-border-radius: 8px !important;
- .urlbar-page-action:not([open]):not(#identity-permission-box),
+ .urlbar-page-action:not([open]):not([showing]):not(
+ :is(#zen-copy-url-button, #identity-permission-box)
+ ),
#tracking-protection-icon-container {
display: none;
}
- #identity-box:not([pageproxystate='invalid']):not(.notSecure) #identity-icon-box:not([open]) {
- margin-inline-start: calc(-8px - 2 * var(--urlbar-icon-padding));
- transform: translateX(100%);
- opacity: 0;
-
- :root:not([supress-primary-adjustment]) & {
- transition: all 0.1s ease;
- }
- }
-
- #identity-permission-box > *:not(#permissions-granted-icon) {
+ #identity-permission-box > *:not(#zen-site-data-icon-button) {
visibility: collapse;
}
@@ -242,27 +306,9 @@
display: none;
}
- #urlbar[open]
- :is(#tracking-protection-icon-container, .urlbar-page-action, .identity-box-button):not(
- [hidden]
- ):not(#identity-permission-box),
- #urlbar:hover #identity-icon-box {
- opacity: 1 !important;
- margin-inline-start: 0 !important;
- transform: none !important;
- display: flex;
- #urlbar:not(:hover) & {
- transition: none;
- }
- }
-
- #urlbar:not([open]) #userContext-icons {
- margin-inline: 0;
- }
-
- #urlbar:not([open]) {
+ #urlbar:not([breakout-extend='true']) {
#identity-box:not([pageproxystate='invalid']) {
- order: 2;
+ order: 9;
}
}
@@ -332,10 +378,6 @@
}
@container urlbar-container (width < 350px) {
- #userContext-icons {
- transition: all 0.1s ease;
- }
-
#userContext-label {
display: none;
}
@@ -343,12 +385,6 @@
#userContext-indicator {
margin-inline-end: 4px;
}
-
- #urlbar:hover:not([breakout-extend='true']) #userContext-icons {
- margin-inline-end: calc(-16px - 2 * var(--urlbar-icon-padding)) !important;
- opacity: 0;
- pointer-events: none;
- }
}
#notification-popup-box {
@@ -678,4 +714,20 @@
#urlbar-search-mode-indicator-title {
font-weight: 600;
+ padding: 0px;
+}
+
+/* These are buttons that we dont need to be
+ * displayed anymore, since now zen displays
+ * them into a single, unified button */
+#reader-mode-button,
+#urlbar-go-button,
+#star-button-box {
+ display: none !important;
+}
+
+@media not -moz-pref('zen.urlbar.show-contextual-id') {
+ #userContext-icons {
+ display: none !important;
+ }
}
diff --git a/src/zen/common/styles/zen-panel-ui.css b/src/zen/common/styles/zen-panel-ui.css
index d44106e95..8c42b9803 100644
--- a/src/zen/common/styles/zen-panel-ui.css
+++ b/src/zen/common/styles/zen-panel-ui.css
@@ -23,28 +23,29 @@ panel[type='arrow'] {
animation: zen-jello-animation-macos 0.2s ease-in-out forwards !important;
}
}
- @media (-moz-platform: linux) or ((-moz-platform: windows) and (not (-moz-windows-mica-popups))) and (-moz-panel-animations) {
- /* Mica popups have a weird background while the animation is running */
- &::part(content) {
- animation: zen-jello-animation 0.35s ease;
- }
- }
}
menupopup,
-panel[type='arrow'] {
+panel[type='arrow']:not(#feature-callout) {
@media (-moz-windows-mica-popups) {
appearance: auto !important;
-moz-default-appearance: menupopup;
/* The blur behind doesn't blur all that much, add a semi-transparent
* background to improve contrast */
--panel-background: light-dark(rgba(255, 255, 255, 0.5), rgba(0, 0, 0, 0.5)) !important;
- --panel-border-color: transparent !important;
+
+ /* The mica rendering already adds a shadow and a border, so we
+ * remove the one we add via CSS */
--panel-shadow-margin: 0px !important;
+ --panel-border-color: transparent !important;
+ border: none !important;
transition-duration: 0s !important;
&::part(content) {
+ /* Refrain from animating for now as we haven't found a
+ * way to properly animate the popup without having the mica
+ * backdrop staying still while the popup animates */
animation: none !important;
}
}
@@ -60,7 +61,15 @@ panel[type='arrow'] {
--panel-background: transparent !important;
--panel-border-color: transparent;
+ /* Remove the shadow for the native panels, as macos already
+ * adds the shadows to the window. This is specially important
+ * on Tahoe, where we *dont* apply an image mask, meaning that
+ * trying to render a shadow would end up in having weird borders
+ * around the panel */
+ --panel-shadow: none;
+
&::part(content) {
+ /* This shoudn't really be needed, but just in case */
background-color: transparent !important;
}
}
diff --git a/src/zen/common/styles/zen-popup.css b/src/zen/common/styles/zen-popup.css
index 5eceee4eb..55f3ac798 100644
--- a/src/zen/common/styles/zen-popup.css
+++ b/src/zen/common/styles/zen-popup.css
@@ -31,7 +31,6 @@
--uc-autocomplete-panel-separator-margin-vertical: 4px;
--uc-permission-itemcontainer-padding-block: 8px;
- --uc-permission-item-margin-block: 4px;
--uc-permission-item-padding-inline: 16px;
--zen-panel-separator-width: 1px;
}
@@ -42,9 +41,13 @@ panel {
--menuitem-padding: 6px !important;
--panel-shadow-margin: 10px;
- /* This should match GetMenuMaskImage() on macOS, or be overridden below */
+ /* This should match GetMenuCornerRadius() on macOS, or be overridden below */
@media (-moz-platform: macos) {
--panel-border-radius: 10px;
+
+ @media (-moz-mac-tahoe-theme) {
+ --panel-border-radius: 12px;
+ }
}
}
@@ -177,10 +180,6 @@ panel {
opacity: 0.7;
}
-#widget-overflow-mainView .panel-subview-body {
- padding-bottom: 0;
-}
-
.PanelUI-subView > .panel-header + toolbarseparator {
margin-bottom: 0;
}
@@ -228,12 +227,8 @@ panel {
.permission-popup-permission-item,
#permission-popup-storage-access-permission-list-header {
- margin-block: var(--uc-permission-item-margin-block);
-}
-
-.permission-popup-permission-label,
-.permission-popup-permission-header-label {
- margin-inline-start: var(--uc-arrowpanel-menuicon-margin-inline);
+ padding-block: 4px;
+ margin-block: 0px;
}
#editBookmarkPanel > #editBookmarkHeaderSeparator,
@@ -241,12 +236,6 @@ panel {
margin-inline: 0;
}
-#identity-popup-mainView > toolbarseparator:first-child,
-#unified-extensions-view > toolbarseparator:first-child {
- display: none;
- opacity: 0;
-}
-
menupopup,
panel {
box-shadow: none;
@@ -358,23 +347,23 @@ menuseparator {
}
--zen-toast-padding: 6px;
- --zen-toast-max-height: 46px;
+ --zen-toast-max-height: 42px;
@media (-moz-platform: macos) {
- --zen-toast-padding: 10px;
- --zen-toast-max-height: 52px;
+ --zen-toast-padding: 8px;
+ --zen-toast-max-height: 48px;
}
- gap: 10px;
+ gap: 8px;
z-index: 1000;
padding: var(--zen-toast-padding);
- border-radius: calc(var(--zen-native-inner-radius) + 6px);
+ border-radius: 10px;
background: linear-gradient(
- 170deg,
+ to bottom,
var(--zen-primary-color) -40%,
- color-mix(in srgb, var(--zen-primary-color) 85%, #0f0f0f 15%)
+ color-mix(in srgb, var(--zen-primary-color), #0f0f0f 20%)
);
- box-shadow: 0 0 14px 3px rgba(0, 0, 0, 0.05);
- border: 1px solid rgba(0, 0, 0, 0.2);
+ box-shadow: light-dark(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.4)) 0px 0px 22px 2px;
+ border: none;
display: flex;
font-weight: 600;
align-items: center;
@@ -391,23 +380,35 @@ menuseparator {
}
& label {
- margin-top: 0;
- margin-bottom: 0;
+ margin: 0 4px;
}
& button {
width: min-content;
- padding: 0 10px !important;
+ padding: 0px 8px !important;
min-width: unset !important;
+ min-height: 28px;
margin: 0px !important;
- border-radius: calc(var(--zen-native-inner-radius) + 2px) !important;
- background: light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1)) !important;
- border: 1px solid light-dark(rgba(0, 0, 0, 0.15), rgba(255, 255, 255, 0.15)) !important;
+ border-radius: 6px !important;
+ background: light-dark(rgba(255, 255, 255, 0.5), rgba(255, 255, 255, 0.1)) !important;
+ border-top: 2px solid light-dark(transparent, rgba(255, 255, 255, 0.1));
color: light-dark(rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0.8)) !important;
+ outline: 0.5px solid light-dark(rgba(0, 0, 0, 0.3), rgba(255, 255, 255, 0.02));
+ outline-offset: -0.5px;
+
:root[zen-right-side='true'] & {
order: -1;
}
+
+ & .button-text {
+ display: none;
+ }
+
+ & .button-icon {
+ width: 14px;
+ opacity: 0.6;
+ }
}
}
}
diff --git a/src/zen/common/styles/zen-single-components.css b/src/zen/common/styles/zen-single-components.css
index 43b149493..b837c0fd2 100644
--- a/src/zen/common/styles/zen-single-components.css
+++ b/src/zen/common/styles/zen-single-components.css
@@ -43,7 +43,8 @@ body > #confetti {
}
/* Firefox View */
-#firefox-view-button {
+#firefox-view-button,
+#wrapper-firefox-view-button {
display: none !important;
}
@@ -169,22 +170,37 @@ body > #confetti {
}
}
-.toolbarbutton-1 {
- :root:is([zen-single-toolbar='true'], :not([zen-sidebar-expanded='true']))
- #zen-sidebar-top-buttons-customization-target
- &,
- #zen-sidebar-foot-buttons & {
- --tab-border-radius: 6px;
- --toolbarbutton-border-radius: var(--tab-border-radius);
- --toolbarbutton-inner-padding: 5px;
- --toolbarbutton-outer-padding: 2px;
- }
+.toolbarbutton-1:not(#tabs-newtab-button) {
+ --tab-border-radius: 6px;
+ --toolbarbutton-border-radius: var(--tab-border-radius);
+ --toolbarbutton-inner-padding: 7px;
+ --toolbarbutton-outer-padding: 2px;
transition:
background-color 0.1s,
- scale 0.2s;
- &:active {
- transform: scale(0.98);
+ transform 0.2s;
+
+ &[open='true'] {
+ transition: background-color 0.1s;
+ }
+
+ &:not([open='true']):active:hover {
+ transform: scale(0.95);
+ }
+}
+
+.zen-interactive-button {
+ background: color-mix(in srgb, currentColor 6%, transparent) !important;
+ transition:
+ background-color 0.12s ease-in-out,
+ transform 0.12s ease-in-out;
+
+ &:hover {
+ background-color: color-mix(in srgb, currentColor 10%, transparent) !important;
+ }
+
+ &:active:hover {
+ transform: scale(0.95);
}
}
@@ -260,3 +276,298 @@ body > #confetti {
#customization-container {
--toolbar-bgcolor: var(--zen-dialog-background);
}
+
+/* Site Data popup */
+
+#zen-unified-site-data-panel {
+ --panel-padding: 0px;
+ --panel-width: 234px;
+ --menu-panel-width-wide: calc(var(--panel-width) - var(--panel-padding) * 2);
+ --uei-icon-size: 16px;
+ --arrowpanel-menuitem-border-radius: 10px;
+}
+
+#unified-extensions-messages-container {
+ display: none;
+}
+
+#zen-site-data-addons {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ overflow: visible;
+
+ .unified-extensions-item-name,
+ .unified-extensions-item-message,
+ .unified-extensions-item-message-hover,
+ .unified-extensions-item-message-hover-menu-button,
+ .unified-extensions-item-menu-button {
+ display: none;
+ }
+
+ #overflowed-extensions-list,
+ #unified-extensions-area,
+ .unified-extensions-list,
+ #zen-site-data-new-addon-button-container {
+ display: contents;
+
+ &:empty {
+ display: none;
+ }
+
+ & > * {
+ background-color: color-mix(in srgb, currentcolor 6%, transparent);
+ width: 48px;
+ height: 32px;
+ margin: 0;
+ justify-content: center;
+ align-items: center;
+ border-radius: 6px;
+ transition:
+ background-color 0.1s ease-in-out,
+ transform 0.12s ease-in-out;
+
+ & toolbarbutton {
+ background: transparent !important;
+ }
+
+ & .toolbarbutton-badge-stack {
+ margin: 0;
+ }
+
+ &:hover {
+ transform: scale(1.05);
+ }
+
+ &:active:hover {
+ transform: scale(0.95);
+ background-color: color-mix(in srgb, currentcolor 10%, transparent);
+ }
+ }
+ }
+}
+
+.zen-site-data-section {
+ gap: 6px;
+ padding: 8px;
+}
+
+.zen-site-data-section-header {
+ font-weight: 600;
+
+ & label {
+ margin: 0;
+ }
+
+ & > label:nth-child(2) {
+ font-weight: 500;
+ font-size: smaller;
+ transition: opacity 0.15s ease-in-out;
+ opacity: 0;
+ border-radius: 6px;
+ padding: 2px 6px;
+
+ &:hover {
+ background-color: color-mix(in srgb, currentColor 10%, transparent);
+ }
+ .zen-site-data-section:hover & {
+ opacity: 0.5;
+ }
+ }
+}
+
+#zen-site-data-new-addon-button .toolbarbutton-text {
+ display: none;
+}
+
+.permission-popup-permission-item {
+ gap: 8px;
+ overflow: hidden;
+ align-items: center;
+}
+
+.permission-popup-permission-label-container {
+ min-width: 1px;
+}
+
+.permission-popup-permission-label {
+ margin: 0px;
+ font-weight: 500;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ max-width: 100%;
+}
+
+.permission-popup-permission-icon {
+ fill: var(--button-primary-color);
+ padding: 8px;
+ width: 34px;
+ height: 34px;
+ overflow: visible;
+ position: relative;
+ appearance: none;
+
+ & label {
+ display: none;
+ }
+
+ & image {
+ -moz-context-properties: fill;
+ z-index: 1;
+ }
+
+ &::before {
+ content: '';
+ position: absolute;
+ inset: 1px;
+ border-radius: 99px;
+ width: 32px;
+ height: 32px;
+ background: var(--button-primary-bgcolor);
+ opacity: 0.6;
+ transition:
+ transform 0.12s ease-in-out,
+ opacity 0.12s ease-in-out;
+ }
+
+ .permission-popup-permission-item:hover &::before {
+ transform: scale(1.05);
+ }
+
+ .permission-popup-permission-item:active:hover &::before {
+ transform: scale(0.95);
+ }
+
+ .permission-popup-permission-item[state='allow'] &::before {
+ opacity: 1;
+ }
+}
+
+.zen-permission-popup-permission-state-label {
+ opacity: 0.6;
+ font-size: smaller;
+ font-weight: 400;
+ margin: 0;
+}
+
+#identity-box,
+#page-action-buttons {
+ opacity: 0.6;
+}
+
+#zen-site-data-footer {
+ border-top: 1px solid color-mix(in srgb, currentColor 6%, transparent);
+ padding-top: 8px;
+ margin: 2px 8px 8px 8px;
+
+ & toolbarbutton {
+ margin: 0;
+ }
+}
+
+@media (-moz-pref('zen.theme.hide-unified-extensions-button')) {
+ #unified-extensions-button {
+ display: none !important;
+ }
+}
+
+#unified-extensions-button:not([showing]) {
+ display: none !important;
+}
+
+#zen-site-data-header {
+ gap: 8px;
+ align-items: center;
+ padding: 8px;
+ padding-bottom: 0;
+
+ & toolbarbutton {
+ margin: 0;
+ appearance: none;
+ -moz-context-properties: fill;
+ fill: currentColor;
+ color: light-dark(rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0.8));
+ max-width: 48px;
+ height: 32px;
+ position: relative;
+
+ &[disabled] {
+ opacity: 0.5;
+ pointer-events: none;
+ }
+
+ & .toolbarbutton-text {
+ display: none;
+ }
+
+ & image {
+ width: 18px;
+ pointer-events: none;
+ z-index: 1;
+ }
+
+ &::before {
+ content: '';
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ background: linear-gradient(
+ to bottom,
+ light-dark(rgb(255, 255, 255), rgb(34, 34, 34)),
+ light-dark(rgb(246, 246, 246), rgb(21, 21, 21))
+ );
+ transition: transform 0.12s ease-in-out;
+ box-shadow:
+ 0px 2px 4px rgba(0, 0, 0, 0.075),
+ inset 0px 1px 0px light-dark(transparent, rgba(255, 255, 255, 0.15));
+ border-radius: 6px;
+ --base-border-color: light-dark(rgba(0, 0, 0, 0.175), rgba(255, 255, 255, 0.1));
+ border: 1px solid light-dark(var(--base-border-color), rgb(21, 21, 21));
+ box-sizing: border-box;
+ will-change: transform;
+ }
+
+ &.active {
+ color: var(--button-primary-color);
+
+ &::before {
+ background: var(--button-primary-bgcolor);
+ }
+ }
+
+ &:hover::before {
+ transform: scale(1.03);
+ }
+
+ &:active:hover::before {
+ transform: scale(0.97);
+ }
+ }
+}
+
+#zen-site-data-settings-list toolbarseparator {
+ margin: 6px 0;
+}
+
+/* Overflow panel */
+#widget-overflow-mainView {
+ --menu-panel-width-wide: 200px;
+
+ & toolbarbutton {
+ scale: 1 !important;
+ }
+
+ & .panel-subview-body {
+ padding: var(--panel-subview-body-padding) !important;
+ }
+}
+
+#widget-overflow-mainView > toolbarseparator,
+#overflowMenu-customize-button {
+ display: none;
+}
+
+#widget-overflow-list {
+ flex-direction: column-reverse;
+}
diff --git a/src/zen/common/styles/zen-theme.css b/src/zen/common/styles/zen-theme.css
index dbae226d9..0baacf3c9 100644
--- a/src/zen/common/styles/zen-theme.css
+++ b/src/zen/common/styles/zen-theme.css
@@ -12,13 +12,12 @@
:root {
/* Default values */
--zen-border-radius: 7px;
- --zen-primary-color: #ffb787;
+ --zen-primary-color: AccentColor;
--zen-background-opacity: 1;
/* Branding */
--zen-branding-dark: #1d1d1d;
- --zen-branding-coral: #f76f53;
--zen-branding-paper: #ebebeb;
--zen-branding-bg: light-dark(var(--zen-branding-paper), var(--zen-branding-dark));
@@ -98,8 +97,8 @@
--in-content-button-text-color: var(--zen-secondary-btn-color) !important;
--in-content-button-background-hover: color-mix(
in srgb,
- currentColor 3%,
- transparent 97%
+ currentColor,
+ transparent 85%
) !important;
--button-bgcolor: var(--in-content-button-background) !important;
--button-hover-bgcolor: var(--in-content-button-background-hover) !important;
@@ -156,8 +155,11 @@
--zen-toolbar-height: 38px;
--zen-toolbar-button-inner-padding: 6px;
--toolbarbutton-outer-padding: 4px;
-
- --toolbarbutton-inner-padding: 5px !important;
+ --zen-toolbar-height-with-bookmarks: var(--zen-toolbar-height);
+ &[zen-has-bookmarks='true'] {
+ /* Make sure `30px` matches the bookmarks toolbar height */
+ --zen-toolbar-height-with-bookmarks: calc(var(--zen-toolbar-height) + 30px);
+ }
--toolbarbutton-hover-background: var(--zen-toolbar-element-bg-hover) !important;
@@ -189,6 +191,7 @@
/* Transitions */
--zen-tabbox-element-indent-transition: margin-inline-start 0.1s ease-in-out;
+ --zen-hidden-toolbar-transition: 0.15s ease-in-out;
/* XUL */
--zen-main-browser-background: light-dark(rgb(235, 235, 235), #1b1b1b);
@@ -210,6 +213,10 @@
--zen-workspace-indicator-height: 46px;
+ &:not([zen-sidebar-expanded='true']) {
+ --zen-workspace-indicator-height: 38px;
+ }
+
--toolbar-field-color: var(--toolbox-textcolor) !important;
&[zen-private-window='true'] {
@@ -235,6 +242,9 @@
@media (-moz-platform: linux) {
--zen-native-content-radius: env(-moz-gtk-csd-titlebar-radius);
}
+ @media (-moz-mac-tahoe-theme) {
+ --zen-native-content-radius: 15px;
+ }
--zen-native-inner-radius: var(
--zen-webview-border-radius,
/* Inner radius calculation:
diff --git a/src/zen/common/zen-sets.js b/src/zen/common/zen-sets.js
index 5d8316589..e9ca4b8bc 100644
--- a/src/zen/common/zen-sets.js
+++ b/src/zen/common/zen-sets.js
@@ -17,17 +17,8 @@ document.addEventListener(
case 'cmd_zenCompactModeShowSidebar':
gZenCompactModeManager.toggleSidebar();
break;
- case 'cmd_zenCompactModeHideSidebar':
- gZenCompactModeManager.hideSidebar();
- break;
- case 'cmd_zenCompactModeHideToolbar':
- gZenCompactModeManager.hideToolbar();
- break;
- case 'cmd_zenCompactModeHideBoth':
- gZenCompactModeManager.hideBoth();
- break;
- case 'cmd_zenCompactModeShowToolbar':
- gZenCompactModeManager.toggleToolbar();
+ case 'cmd_toggleCompactModeIgnoreHover':
+ gZenCompactModeManager.toggle(true);
break;
case 'cmd_zenWorkspaceForward':
gZenWorkspaces.changeWorkspaceShortcut();
@@ -131,6 +122,10 @@ document.addEventListener(
}
break;
}
+ case 'cmd_zenUnloadWorkspace': {
+ gZenWorkspaces.unloadWorkspace();
+ 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 4c940536d..fb736d733 100644
--- a/src/zen/common/zenThemeModifier.js
+++ b/src/zen/common/zenThemeModifier.js
@@ -92,16 +92,20 @@ var ZenThemeModifier = {
},
updateElementSeparation() {
+ const kMinElementSeparation = 0.1; // in px
let separation = this.elementSeparation;
if (
window.fullScreen &&
window.gZenCompactModeManager?.preference &&
- !document.getElementById('tabbrowser-tabbox')?.hasAttribute('zen-split-view')
+ !document.getElementById('tabbrowser-tabbox')?.hasAttribute('zen-split-view') &&
+ Services.prefs.getBoolPref('zen.view.borderless-fullscreen', true)
) {
separation = 0;
}
+ // In order to still use it on fullscreen, even if it's 0px, add .1px (almost invisible)
+ separation = Math.max(kMinElementSeparation, separation);
document.documentElement.style.setProperty('--zen-element-separation', separation + 'px');
- if (separation == 0) {
+ if (separation == kMinElementSeparation) {
document.documentElement.setAttribute('zen-no-padding', true);
} else {
document.documentElement.removeAttribute('zen-no-padding');
diff --git a/src/zen/compact-mode/ZenCompactMode.mjs b/src/zen/compact-mode/ZenCompactMode.mjs
index e0b76019a..6e691f507 100644
--- a/src/zen/compact-mode/ZenCompactMode.mjs
+++ b/src/zen/compact-mode/ZenCompactMode.mjs
@@ -30,7 +30,7 @@ ChromeUtils.defineLazyGetter(lazyCompactMode, 'mainAppWrapper', () =>
var gZenCompactModeManager = {
_flashTimeouts: {},
- _evenListeners: [],
+ _eventListeners: [],
_removeHoverFrames: {},
// Delay to avoid flickering when hovering over the sidebar
@@ -79,7 +79,7 @@ var gZenCompactModeManager = {
window.addEventListener('mouseover', (event) => {
const buttons = gZenVerticalTabsManager.actualWindowButtons;
if (event.target.closest('.titlebar-buttonbox-container') === buttons) return;
- buttons.removeAttribute('zen-has-hover');
+ this._setElementExpandAttribute(buttons, false);
});
}
@@ -115,6 +115,7 @@ var gZenCompactModeManager = {
// We wont do anything with it anyway, so we remove it
delete this._wasInCompactMode;
}
+ delete this._ignoreNextHover;
// We dont want the user to be able to spam the button
return;
}
@@ -177,17 +178,31 @@ var gZenCompactModeManager = {
-
-
-
+
+
+
`);
+
+ const idToAction = {
+ 'zen-context-menu-compact-mode-hide-sidebar': this.hideSidebar.bind(this),
+ 'zen-context-menu-compact-mode-hide-toolbar': this.hideToolbar.bind(this),
+ 'zen-context-menu-compact-mode-hide-both': this.hideBoth.bind(this),
+ };
+
+ for (let menuitem of fragment.querySelectorAll('menuitem')) {
+ if (menuitem.id in idToAction) {
+ menuitem.addEventListener('command', idToAction[menuitem.id]);
+ }
+ }
+
document.getElementById('viewToolbarsMenuSeparator').before(fragment);
this.updateContextMenu();
},
updateCompactModeContext(isSingleToolbar) {
+ isSingleToolbar ||= this.checkIfIllegalState();
const menuitem = document.getElementById('zen-context-menu-compact-mode-toggle');
const menu = document.getElementById('zen-context-menu-compact-mode');
if (isSingleToolbar) {
@@ -202,26 +217,64 @@ var gZenCompactModeManager = {
hideSidebar() {
Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true);
Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', false);
+ this.callAllEventListeners();
},
hideToolbar() {
Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', true);
Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', false);
+ this.callAllEventListeners();
},
hideBoth() {
Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true);
Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', true);
+ this.callAllEventListeners();
+ },
+
+ /* Check for illegal states and fix them
+ * @returns {boolean} If the context menu should just show the "toggle" item
+ * instead of a submenu with hide options
+ */
+ checkIfIllegalState() {
+ // Due to how we layout the sidebar and toolbar, there are some states
+ // that are not allowed mainly due to the caption buttons not being accessible
+ // at the top left/right of the window.
+ const isSidebarExpanded = gZenVerticalTabsManager._prefsSidebarExpanded;
+ if (isSidebarExpanded) {
+ // Fast exit if the sidebar is expanded, as we dont have illegal states then
+ return false;
+ }
+ const canHideSidebar = this.canHideSidebar;
+ const canHideToolbar = this.canHideToolbar;
+ const isLeftSideButtons = !gZenVerticalTabsManager.isWindowsStyledButtons;
+ const isRightSidebar = gZenVerticalTabsManager._prefsRightSide;
+ // on macos: collapsed + left side + only toolbar
+ // on windows: collapsed + right side + only toolbar
+ const closelyIllegalState =
+ (isLeftSideButtons && !isRightSidebar) || (!isLeftSideButtons && isRightSidebar);
+ if (closelyIllegalState && canHideToolbar && !canHideSidebar) {
+ // This state is illegal
+ Services.prefs.setBoolPref('zen.view.compact.hide-tabbar', true);
+ Services.prefs.setBoolPref('zen.view.compact.hide-toolbar', false);
+ this.callAllEventListeners();
+ return true;
+ }
+ return closelyIllegalState;
+ },
+
+ callAllEventListeners() {
+ this._eventListeners.forEach((callback) => callback());
},
addEventListener(callback) {
- this._evenListeners.push(callback);
+ this._eventListeners.push(callback);
},
removeEventListener(callback) {
- const index = this._evenListeners.indexOf(callback);
+ const index = this._eventListeners.indexOf(callback);
if (index !== -1) {
- this._evenListeners.splice(index, 1);
+ this._eventListeners.splice(index, 1);
}
},
@@ -231,11 +284,11 @@ var gZenCompactModeManager = {
// once the window buttons are shown
this.updateContextMenu();
if (!this.preference) {
- this._evenListeners.forEach((callback) => callback());
+ this.callAllEventListeners();
await this.animateCompactMode();
} else {
await this.animateCompactMode();
- this._evenListeners.forEach((callback) => callback());
+ this.callAllEventListeners();
}
gZenUIManager.updateTabsToolbar();
if (isUrlbarFocused) {
@@ -288,6 +341,13 @@ var gZenCompactModeManager = {
);
},
+ get canHideToolbar() {
+ return (
+ Services.prefs.getBoolPref('zen.view.compact.hide-toolbar') &&
+ !gZenVerticalTabsManager._hasSetSingleToolbar
+ );
+ },
+
animateCompactMode() {
// Get the splitter width before hiding it (we need to hide it before animating on right)
document.documentElement.setAttribute('zen-compact-animating', 'true');
@@ -308,6 +368,9 @@ var gZenCompactModeManager = {
if (canAnimate) {
this.sidebar.setAttribute('animate', 'true');
}
+ if (this._ignoreNextHover) {
+ this._setElementExpandAttribute(this.sidebar, false);
+ }
this.sidebar.style.removeProperty('margin-right');
this.sidebar.style.removeProperty('margin-left');
this.sidebar.style.removeProperty('transform');
@@ -322,6 +385,8 @@ var gZenCompactModeManager = {
this.getAndApplySidebarWidth({});
this._ignoreNextResize = true;
+ delete this._ignoreNextHover;
+
resolve();
return;
}
@@ -335,20 +400,19 @@ var gZenCompactModeManager = {
} else {
sidebarWidth -= elementSeparation;
}
- this.sidebar.style.marginRight = '0px';
- this.sidebar.style.marginLeft = '0px';
+ this._setElementExpandAttribute(this.sidebar, false);
gZenUIManager.motion
.animate(
this.sidebar,
{
- marginRight: this.sidebarIsOnRight ? `-${sidebarWidth}px` : 0,
- marginLeft: this.sidebarIsOnRight ? 0 : `-${sidebarWidth}px`,
+ marginRight: [0, this.sidebarIsOnRight ? `-${sidebarWidth}px` : 0],
+ marginLeft: [0, this.sidebarIsOnRight ? 0 : `-${sidebarWidth}px`],
},
{
ease: 'easeIn',
type: 'spring',
bounce: 0,
- duration: 0.15,
+ duration: 0.12,
}
)
.then(() => {
@@ -365,6 +429,12 @@ var gZenCompactModeManager = {
this._ignoreNextResize = true;
setTimeout(() => {
+ if (this._ignoreNextHover) {
+ setTimeout(() => {
+ delete this._ignoreNextHover;
+ });
+ }
+
this.sidebar.style.removeProperty('margin-right');
this.sidebar.style.removeProperty('margin-left');
this.sidebar.style.removeProperty('transition');
@@ -375,11 +445,14 @@ var gZenCompactModeManager = {
titlebar.style.removeProperty('transition');
gURLBar.textbox.style.removeProperty('visibility');
+
resolve();
});
});
});
} else if (canHideSidebar && !isCompactMode) {
+ // Shouldn't be ever true, but just in case
+ delete this._ignoreNextHover;
document.getElementById('browser').style.overflow = 'clip';
if (this.sidebarIsOnRight) {
this.sidebar.style.marginRight = `-${sidebarWidth}px`;
@@ -399,7 +472,7 @@ var gZenCompactModeManager = {
ease: 'easeOut',
type: 'spring',
bounce: 0,
- duration: 0.15,
+ duration: 0.12,
}
)
.then(() => {
@@ -418,6 +491,8 @@ var gZenCompactModeManager = {
} else {
this.sidebar.removeAttribute('animate'); // remove the attribute if we are not animating
document.documentElement.removeAttribute('zen-compact-animating');
+ delete this._ignoreNextHover;
+ resolve();
}
});
});
@@ -428,14 +503,17 @@ var gZenCompactModeManager = {
.getElementById('zen-context-menu-compact-mode-toggle')
.setAttribute('checked', this.preference);
- const hideTabBar = Services.prefs.getBoolPref('zen.view.compact.hide-tabbar', false);
- const hideToolbar = Services.prefs.getBoolPref('zen.view.compact.hide-toolbar', false);
+ const hideTabBar = this.canHideSidebar;
+ const hideToolbar = this.canHideToolbar;
const hideBoth = hideTabBar && hideToolbar;
const idName = 'zen-context-menu-compact-mode-hide-';
- document.getElementById(idName + 'sidebar').setAttribute('checked', !hideBoth && hideTabBar);
- document.getElementById(idName + 'toolbar').setAttribute('checked', !hideBoth && hideToolbar);
- document.getElementById(idName + 'both').setAttribute('checked', hideBoth);
+ 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);
},
_removeOpenStateOnUnifiedExtensions() {
@@ -448,7 +526,9 @@ var gZenCompactModeManager = {
}
},
- toggle() {
+ toggle(ignoreHover = false) {
+ // Only ignore the next hover when we are enabling compact mode
+ this._ignoreNextHover = ignoreHover && !this.preference;
return (this.preference = !this.preference);
},
@@ -502,17 +582,14 @@ var gZenCompactModeManager = {
},
flashElement(element, duration, id, attrName = 'flash-popup') {
- //if (element.matches(':hover')) {
- // return;
- //}
if (this._flashTimeouts[id]) {
clearTimeout(this._flashTimeouts[id]);
} else {
- requestAnimationFrame(() => element.setAttribute(attrName, 'true'));
+ requestAnimationFrame(() => this._setElementExpandAttribute(element, true, attrName));
}
this._flashTimeouts[id] = setTimeout(() => {
window.requestAnimationFrame(() => {
- element.removeAttribute(attrName);
+ this._setElementExpandAttribute(element, false, attrName);
this._flashTimeouts[id] = null;
});
}, duration);
@@ -523,11 +600,37 @@ var gZenCompactModeManager = {
this._flashTimeouts[id] = null;
},
+ _setElementExpandAttribute(element, value, attr = 'zen-has-hover') {
+ const kVerifiedAttributes = ['zen-has-hover', 'has-popup-menu'];
+ const isToolbar = element.id === 'zen-appcontent-navbar-wrapper';
+ if (value) {
+ element.setAttribute(attr, 'true');
+ if (
+ isToolbar &&
+ ((gZenVerticalTabsManager._hasSetSingleToolbar &&
+ (element.hasAttribute('should-hide') ||
+ document.documentElement.hasAttribute('zen-has-bookmarks'))) ||
+ (this.preference &&
+ Services.prefs.getBoolPref('zen.view.compact.hide-toolbar') &&
+ !gZenVerticalTabsManager._hasSetSingleToolbar &&
+ !gURLBar.hasAttribute('breakout-extend')))
+ ) {
+ gBrowser.tabpanels.setAttribute('has-toolbar-hovered', 'true');
+ }
+ } else {
+ element.removeAttribute(attr);
+ // Only remove if none of the verified attributes are present
+ if (isToolbar && !kVerifiedAttributes.some((attr) => element.hasAttribute(attr))) {
+ gBrowser.tabpanels.removeAttribute('has-toolbar-hovered');
+ }
+ }
+ },
+
addMouseActions() {
gURLBar.textbox.addEventListener('mouseenter', (event) => {
if (event.target.closest('#urlbar[zen-floating-urlbar]')) {
window.requestAnimationFrame(() => {
- this.sidebar.removeAttribute('zen-has-hover');
+ this._setElementExpandAttribute(gZenVerticalTabsManager.actualWindowButtons, false);
});
this._hasHoveredUrlbar = true;
return;
@@ -539,7 +642,7 @@ var gZenCompactModeManager = {
// Add the attribute on startup if the mouse is already over the element
if (target.matches(':hover')) {
- target.setAttribute('zen-has-hover', 'true');
+ this._setElementExpandAttribute(target, true);
}
const onEnter = (event) => {
@@ -551,11 +654,13 @@ var gZenCompactModeManager = {
window.requestAnimationFrame(() => {
if (
document.documentElement.getAttribute('supress-primary-adjustment') === 'true' ||
- this._hasHoveredUrlbar
+ this._hasHoveredUrlbar ||
+ this._ignoreNextHover ||
+ target.hasAttribute('zen-has-hover')
) {
return;
}
- target.setAttribute('zen-has-hover', 'true');
+ this._setElementExpandAttribute(target, true);
});
}, this.HOVER_HACK_DELAY);
};
@@ -575,14 +680,6 @@ var gZenCompactModeManager = {
}
}
- // If it's a child element but not the target, ignore the event
- if (
- target.contains(event.explicitOriginalTarget) &&
- event.explicitOriginalTarget !== target
- ) {
- return;
- }
-
// See bug https://bugzilla.mozilla.org/show_bug.cgi?id=1979340 and issue https://github.com/zen-browser/desktop/issues/7746.
// If we want the toolbars to be draggable, we need to make sure to check the hover state after a short delay.
// This is because the mouse is left to be handled natively so firefox thinks the mouse left the window for a split second.
@@ -593,10 +690,11 @@ var gZenCompactModeManager = {
}
if (
- event.explicitOriginalTarget.closest('#urlbar[zen-floating-urlbar]') ||
+ event.explicitOriginalTarget?.closest?.('#urlbar[zen-floating-urlbar]') ||
(document.documentElement.getAttribute('supress-primary-adjustment') === 'true' &&
gZenVerticalTabsManager._hasSetSingleToolbar) ||
- this._hasHoveredUrlbar
+ this._hasHoveredUrlbar ||
+ this._ignoreNextHover
) {
return;
}
@@ -610,7 +708,7 @@ var gZenCompactModeManager = {
);
} else {
this._removeHoverFrames[target.id] = window.requestAnimationFrame(() =>
- target.removeAttribute('zen-has-hover')
+ this._setElementExpandAttribute(target, false)
);
}
}, this.HOVER_HACK_DELAY);
@@ -646,7 +744,7 @@ var gZenCompactModeManager = {
'mousemove',
() => {
if (target.matches(':hover')) return;
- target.removeAttribute('zen-has-hover');
+ this._setElementExpandAttribute(target, false);
this.clearFlashTimeout('has-hover' + target.id);
},
{ once: true }
@@ -661,7 +759,7 @@ var gZenCompactModeManager = {
requestAnimationFrame(() => {
delete this._hasHoveredUrlbar;
});
- }, 0);
+ }, 10);
}, 0);
});
},
@@ -682,23 +780,21 @@ var gZenCompactModeManager = {
else return bBox.left - error < x && x < bBox.right + error;
},
- toggleToolbar() {
- let toolbar = document.getElementById('zen-appcontent-navbar-wrapper');
- toolbar.toggleAttribute('zen-user-show');
- },
-
_clearAllHoverStates() {
// Clear hover attributes from all hoverable elements
for (let entry of this.hoverableElements) {
const target = entry.element;
if (target && !target.matches(':hover') && target.hasAttribute('zen-has-hover')) {
- target.removeAttribute('zen-has-hover');
+ this._setElementExpandAttribute(target, false);
this.clearFlashTimeout('has-hover' + target.id);
}
}
},
isSidebarPotentiallyOpen() {
+ if (this._ignoreNextHover) {
+ this._setElementExpandAttribute(this.sidebar, false);
+ }
return (
this.sidebar.hasAttribute('zen-user-show') ||
this.sidebar.hasAttribute('zen-has-hover') ||
@@ -713,8 +809,7 @@ var gZenCompactModeManager = {
!this.isSidebarPotentiallyOpen() &&
this._canShowBackgroundTabToast &&
!gZenGlanceManager._animating &&
- !this._nextTimeWillBeActive &&
- this.canHideSidebar
+ !this._nextTimeWillBeActive
) {
gZenUIManager.showToast('zen-background-tab-opened-toast', {
button: {
diff --git a/src/zen/compact-mode/sidebar.inc.css b/src/zen/compact-mode/sidebar.inc.css
new file mode 100644
index 000000000..b93f6f174
--- /dev/null
+++ b/src/zen/compact-mode/sidebar.inc.css
@@ -0,0 +1,266 @@
+/*
+ * 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/.
+ */
+
+&:not([zen-compact-animating]) {
+ & #zen-sidebar-splitter {
+ display: none !important;
+ }
+
+ #zen-tabbox-wrapper {
+ /* Remove extra 1px of margine we have to add to the tabbox */
+ margin-left: var(--zen-element-separation) !important;
+ margin-right: var(--zen-element-separation) !important;
+ }
+
+ #zen-appcontent-wrapper {
+ & #tabbrowser-tabbox {
+ margin-left: 0 !important;
+ }
+ }
+
+ #zen-sidebar-splitter {
+ display: none !important;
+ }
+
+ #zen-sidebar-top-buttons-customization-target {
+ padding-inline-start: calc(
+ var(--zen-toolbox-padding) - var(--toolbarbutton-outer-padding)
+ ) !important;
+ }
+
+ &[zen-window-buttons-reversed='true'] #zen-appcontent-navbar-wrapper #nav-bar {
+ margin-right: var(--zen-element-separation) !important;
+ margin-left: calc(var(--zen-element-separation) - 3px) !important;
+ }
+
+ #navigator-toolbox {
+ --zen-toolbox-max-width: 74px !important;
+ --zen-compact-float: var(--zen-element-separation);
+
+ :root[zen-no-padding='true'] & {
+ --zen-compact-float: 10px;
+ --zen-compact-mode-no-padding-radius-fix: 2px;
+ }
+
+ /* Initial padding for when we are animating */
+ padding: 0 0 0 var(--zen-toolbox-padding) !important;
+
+ &:not([animate='true']) {
+ position: fixed;
+ z-index: 10;
+ transition:
+ left 0.15s ease,
+ right 0.15s ease,
+ visibility 0.15s ease;
+ bottom: var(--zen-compact-float);
+ padding: 0 var(--zen-compact-float) !important;
+ :root[zen-single-toolbar='true'] & {
+ /* We add an extra offset since windows users have a border top
+ * in the window in order to compensate how windows renders the
+ * titlebar */
+ top: calc(var(--zen-compact-float) / 2 + var(--zen-sidebar-compact-top-offset, 0px));
+ height: calc(100% - var(--zen-compact-float));
+ }
+ :root:not([zen-single-toolbar='true']) & {
+ bottom: calc(var(--zen-compact-float) / 2);
+ height: calc(100% - var(--zen-toolbar-height-with-bookmarks));
+ @media -moz-pref('zen.view.compact.hide-toolbar') {
+ height: 100%;
+ }
+ }
+ & #zen-sidebar-top-buttons {
+ margin: 0 0 calc(var(--zen-toolbox-padding) / 2) 0;
+ }
+ }
+
+ &:not([zen-right-side='true']) #nav-bar {
+ margin-left: 0 !important;
+ }
+ }
+
+ &:not([zen-right-side='true']) #navigator-toolbox {
+ left: calc(-1 * var(--actual-zen-sidebar-width) + var(--zen-element-separation) / 2 + 1px);
+ }
+
+ /* When we have multiple toolbars and the top-toolbar is NOT being hidden,
+ * we need to adjust the top-padding of the toolbox to account for the
+ * extra toolbar height. */
+ @media not -moz-pref('zen.view.compact.hide-toolbar') {
+ &:not([zen-single-toolbar='true']) {
+ #navigator-toolbox:not([animate='true']) {
+ margin-top: var(--zen-toolbar-height-with-bookmarks) !important;
+ }
+ }
+ }
+
+ &:not([zen-sidebar-expanded='true']) .zen-essentials-container {
+ padding: 0;
+ }
+
+ &[zen-right-side='true'] {
+ & #navigator-toolbox:not([animate='true']) {
+ right: calc(-1 * var(--actual-zen-sidebar-width) + var(--zen-element-separation) / 2 + 1px);
+ }
+
+ & .browserSidebarContainer {
+ margin-left: 0 !important;
+ margin-right: 0 !important;
+ }
+ }
+
+ #navigator-toolbox:not([animate='true']) #titlebar {
+ padding: var(--zen-toolbox-padding) !important;
+ :root:not([zen-sidebar-expanded='true']) & {
+ padding: var(--zen-toolbox-padding) 0 !important;
+ max-width: calc(var(--zen-sidebar-width) - var(--zen-toolbox-padding) * 2);
+ width: var(--zen-sidebar-width);
+ }
+ position: relative;
+ min-width: var(--zen-toolbox-min-width);
+ transition: visibility 0.15s; /* Same as the toolbox */
+ visibility: hidden;
+
+ :root[zen-sidebar-expanded='true'] & {
+ width: calc(var(--zen-sidebar-width) + var(--zen-toolbox-padding));
+ }
+
+ & .zen-toolbar-background {
+ display: flex;
+ }
+ }
+
+ #navigator-toolbox[zen-has-hover]:not(:has(#urlbar[zen-floating-urlbar='true']:hover)),
+ #navigator-toolbox[zen-user-show],
+ #navigator-toolbox[zen-has-empty-tab],
+ #navigator-toolbox[flash-popup],
+ #navigator-toolbox[has-popup-menu],
+ #navigator-toolbox[movingtab],
+ &[zen-renaming-tab='true'] #navigator-toolbox,
+ #navigator-toolbox[zen-compact-mode-active] {
+ &:not([animate='true']) {
+ --zen-compact-mode-func: linear(
+ 0 0%,
+ 0.002748 1%,
+ 0.010544 2%,
+ 0.022757 3%,
+ 0.038804 4%,
+ 0.058151 5%,
+ 0.080308 6%,
+ 0.104828 7.000000000000001%,
+ 0.131301 8%,
+ 0.159358 9%,
+ 0.188662 10%,
+ 0.21891 11%,
+ 0.249828 12%,
+ 0.281172 13%,
+ 0.312724 14.000000000000002%,
+ 0.344288 15%,
+ 0.375693 16%,
+ 0.40679 17%,
+ 0.437447 18%,
+ 0.467549 19%,
+ 0.497 20%,
+ 0.525718 21%,
+ 0.553633 22%,
+ 0.580688 23%,
+ 0.60684 24%,
+ 0.632052 25%,
+ 0.656298 26%,
+ 0.679562 27%,
+ 0.701831 28.000000000000004%,
+ 0.723104 28.999999999999996%,
+ 0.743381 30%,
+ 0.76267 31%,
+ 0.780983 32%,
+ 0.798335 33%,
+ 0.814744 34%,
+ 0.830233 35%,
+ 0.844826 36%,
+ 0.858549 37%,
+ 0.87143 38%,
+ 0.883498 39%,
+ 0.894782 40%,
+ 0.905314 41%,
+ 0.915125 42%,
+ 0.924247 43%,
+ 0.93271 44%,
+ 0.940547 45%,
+ 0.947787 46%,
+ 0.954463 47%,
+ 0.960603 48%,
+ 0.966239 49%,
+ 0.971397 50%,
+ 0.976106 51%,
+ 0.980394 52%,
+ 0.984286 53%,
+ 0.987808 54%,
+ 0.990984 55.00000000000001%,
+ 0.993837 56.00000000000001%,
+ 0.99639 56.99999999999999%,
+ 0.998664 57.99999999999999%,
+ 1.000679 59%,
+ 1.002456 60%,
+ 1.004011 61%,
+ 1.005363 62%,
+ 1.006528 63%,
+ 1.007522 64%,
+ 1.008359 65%,
+ 1.009054 66%,
+ 1.009618 67%,
+ 1.010065 68%,
+ 1.010405 69%,
+ 1.010649 70%,
+ 1.010808 71%,
+ 1.01089 72%,
+ 1.010904 73%,
+ 1.010857 74%,
+ 1.010757 75%,
+ 1.010611 76%,
+ 1.010425 77%,
+ 1.010205 78%,
+ 1.009955 79%,
+ 1.009681 80%,
+ 1.009387 81%,
+ 1.009077 82%,
+ 1.008754 83%,
+ 1.008422 84%,
+ 1.008083 85%,
+ 1.00774 86%,
+ 1.007396 87%,
+ 1.007052 88%,
+ 1.00671 89%,
+ 1.006372 90%,
+ 1.00604 91%,
+ 1.005713 92%,
+ 1.005394 93%,
+ 1.005083 94%,
+ 1.004782 95%,
+ 1.004489 96%,
+ 1.004207 97%,
+ 1.003935 98%,
+ 1.003674 99%,
+ 1.003423 100%
+ );
+ --zen-compact-mode-time: 0.25s;
+ transition:
+ left var(--zen-compact-mode-time) var(--zen-compact-mode-func),
+ right var(--zen-compact-mode-time) var(--zen-compact-mode-func);
+
+ :root:not([supress-primary-adjustment='true']) & {
+ & #titlebar {
+ transition: none;
+ visibility: visible;
+ }
+
+ left: calc(var(--zen-compact-float) / -2);
+ :root[zen-right-side='true'] & {
+ right: calc(var(--zen-compact-float) / -2);
+ left: auto;
+ }
+ }
+ }
+ }
+}
diff --git a/src/zen/compact-mode/toolbar.inc.css b/src/zen/compact-mode/toolbar.inc.css
new file mode 100644
index 000000000..8cd55c910
--- /dev/null
+++ b/src/zen/compact-mode/toolbar.inc.css
@@ -0,0 +1,75 @@
+/*
+ * 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/.
+ */
+
+&:not([zen-single-toolbar='true']) {
+ & #navigator-toolbox {
+ --zen-toolbox-top-align: var(--zen-element-separation);
+ }
+
+ @media -moz-pref('zen.view.compact.hide-tabbar') {
+ & #titlebar {
+ margin-top: var(--zen-element-separation) !important;
+ }
+ }
+
+ &[zen-right-side='true'][zen-window-buttons-reversed='true'] #titlebar,
+ &:not([zen-right-side='true']):not([zen-window-buttons-reversed='true']) #titlebar {
+ /* The same as the expression above */
+ margin-top: var(--zen-element-separation) !important;
+ }
+
+ & #zen-appcontent-wrapper {
+ z-index: 3 !important;
+ }
+
+ & #zen-appcontent-navbar-wrapper {
+ & .zen-toolbar-background {
+ display: flex;
+ }
+ transition: height var(--zen-hidden-toolbar-transition);
+
+ height: var(--zen-element-separation);
+ overflow: clip;
+
+ & #urlbar:not([breakout-extend='true']) {
+ opacity: 0;
+ pointer-events: none;
+ transition: opacity var(--zen-hidden-toolbar-transition);
+ }
+
+%include windows-captions-fix-default.inc.css
+
+ & #zen-appcontent-navbar-container {
+ opacity: 0;
+ transition: opacity var(--zen-hidden-toolbar-transition);
+ }
+ }
+
+ &
+ #zen-appcontent-navbar-wrapper[zen-has-hover]:not(
+ :has(#urlbar[zen-floating-urlbar='true']:hover)
+ ),
+ & #zen-appcontent-navbar-wrapper[has-popup-menu],
+ &
+ #zen-appcontent-navbar-wrapper:has(
+ *:is([panelopen='true'], [open='true'], #urlbar:focus-within, [breakout-extend='true']):not(.zen-compact-mode-ignore)
+ ) {
+
+ height: var(--zen-toolbar-height-with-bookmarks);
+ overflow: inherit;
+
+%include windows-captions-fix-active.inc.css
+
+ & #urlbar {
+ opacity: 1;
+ pointer-events: auto;
+ }
+
+ & #zen-appcontent-navbar-container {
+ opacity: 1;
+ }
+ }
+}
diff --git a/src/zen/compact-mode/windows-captions-fix-active.inc.css b/src/zen/compact-mode/windows-captions-fix-active.inc.css
new file mode 100644
index 000000000..252de7bf4
--- /dev/null
+++ b/src/zen/compact-mode/windows-captions-fix-active.inc.css
@@ -0,0 +1,10 @@
+/*
+ * 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/.
+ */
+
+& .titlebar-buttonbox-container {
+ visibility: visible;
+ transition: none;
+}
diff --git a/src/zen/compact-mode/windows-captions-fix-default.inc.css b/src/zen/compact-mode/windows-captions-fix-default.inc.css
new file mode 100644
index 000000000..586949124
--- /dev/null
+++ b/src/zen/compact-mode/windows-captions-fix-default.inc.css
@@ -0,0 +1,13 @@
+/*
+ * 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/.
+ */
+
+& .titlebar-buttonbox-container {
+ display: collapse;
+ /* We need to hide them since on Windows the native
+ * panels when hovering over them can interfere with the
+ * web content */
+ transition: visibility var(--zen-hidden-toolbar-transition);
+}
diff --git a/src/zen/compact-mode/zen-compact-mode.css b/src/zen/compact-mode/zen-compact-mode.css
index 4f8f6aaa4..342514d03 100644
--- a/src/zen/compact-mode/zen-compact-mode.css
+++ b/src/zen/compact-mode/zen-compact-mode.css
@@ -29,11 +29,12 @@
&,
&::before,
&::after {
- border-radius: calc(var(--zen-native-inner-radius) + var(--zen-element-separation) / 4 - var(--zen-compact-mode-no-padding-radius-fix, 0px));
+ border-radius: calc(var(--zen-native-inner-radius) - var(--zen-compact-mode-no-padding-radius-fix, 0px));
}
}
:root[zen-compact-mode='true']:not([customizing]):not([inDOMFullscreen='true']) {
+
%include ../tabs/zen-tabs/vertical-tabs-topbuttons-fix.css
& #urlbar {
@@ -41,345 +42,11 @@
}
@media -moz-pref('zen.view.compact.hide-tabbar') or -moz-pref('zen.view.use-single-toolbar') {
- &:not([zen-compact-animating]) {
- & #zen-sidebar-splitter {
- display: none !important;
- }
-
- #zen-tabbox-wrapper {
- /* Remove extra 1px of margine we have to add to the tabbox */
- margin-left: var(--zen-element-separation) !important;
- margin-right: var(--zen-element-separation) !important;
- }
-
- #zen-appcontent-wrapper {
- & #tabbrowser-tabbox {
- margin-left: 0 !important;
- }
- }
-
- #zen-sidebar-splitter {
- display: none !important;
- }
-
- #zen-sidebar-top-buttons-customization-target {
- padding-inline-start: calc(var(--zen-toolbox-padding) - var(--toolbarbutton-outer-padding)) !important;
- }
-
- &:not([zen-window-buttons-reversed='true']) #zen-appcontent-navbar-wrapper #nav-bar {
- margin-left: var(--zen-element-separation) !important;
- }
-
- &[zen-window-buttons-reversed='true'] #zen-appcontent-navbar-wrapper #nav-bar {
- margin-right: var(--zen-element-separation) !important;
- margin-left: calc(var(--zen-element-separation) - 3px) !important;
- }
-
- #navigator-toolbox {
- --zen-toolbox-max-width: 74px !important;
- --zen-compact-float: var(--zen-element-separation);
- :root[zen-no-padding='true'] & {
- --zen-compact-float: 10px;
- --zen-compact-mode-no-padding-radius-fix: 2px;
- }
-
- /* Initial padding for when we are animating */
- padding: 0 0 0 var(--zen-toolbox-padding) !important;
-
- &:not([animate='true']) {
- position: fixed;
- z-index: 10;
- transition:
- left 0.15s ease,
- right 0.15s ease,
- visibility 0.15s ease;
- top: 0;
- bottom: var(--zen-compact-float);
- padding: 0 var(--zen-compact-float) !important;
- :root[zen-single-toolbar='true'] & {
- top: calc(var(--zen-compact-float) / 2);
- height: calc(100% - var(--zen-compact-float));
- }
- :root:not([zen-single-toolbar='true']) & {
- top: calc(var(--zen-compact-float) / -2);
- height: calc(100% - var(--zen-toolbar-height));
- @media -moz-pref('zen.view.compact.hide-toolbar') {
- height: 100%;
- }
- }
- & #zen-sidebar-top-buttons {
- margin: 0 0 calc(var(--zen-toolbox-padding) / 2) 0;
- }
- }
-
- &:not([zen-right-side='true']) #nav-bar {
- margin-left: 0 !important;
- }
- }
-
- &:not([zen-right-side='true']) #navigator-toolbox {
- left: calc(-1 * var(--actual-zen-sidebar-width) + var(--zen-element-separation) / 2 + 1px);
- }
-
- /* When we have multiple toolbars and the top-toolbar is NOT being hidden,
- * we need to adjust the top-padding of the toolbox to account for the
- * extra toolbar height. */
- @media not -moz-pref('zen.view.compact.hide-toolbar') {
- &:not([zen-single-toolbar='true']) {
- #navigator-toolbox:not([animate='true']) {
- margin-top: var(--zen-toolbar-height) !important;
- }
- }
- }
-
- &:not([zen-sidebar-expanded='true']) .zen-essentials-container {
- padding: 0;
- }
-
- &[zen-right-side='true'] {
- & #navigator-toolbox:not([animate='true']) {
- right: calc(-1 * var(--actual-zen-sidebar-width) + var(--zen-element-separation) / 2 + 1px);
- }
-
- & .browserSidebarContainer {
- margin-left: 0 !important;
- margin-right: 0 !important;
- }
- }
-
- #navigator-toolbox:not([animate='true']) #titlebar {
- padding: var(--zen-toolbox-padding) !important;
- :root:not([zen-sidebar-expanded='true']) & {
- padding: var(--zen-toolbox-padding) 0 !important;
- max-width: calc(var(--zen-sidebar-width) - var(--zen-toolbox-padding) * 2);
- width: var(--zen-sidebar-width);
- }
- position: relative;
- min-width: var(--zen-toolbox-min-width);
- transition: visibility 0.15s; /* Same as the toolbox */
- visibility: hidden;
-
- :root[zen-sidebar-expanded='true'] & {
- width: calc(var(--zen-sidebar-width) + var(--zen-toolbox-padding));
- }
-
- & .zen-toolbar-background {
- display: flex;
- }
- }
-
- #navigator-toolbox[zen-has-hover]:not(:has(#urlbar[zen-floating-urlbar='true']:hover)),
- #navigator-toolbox[zen-user-show],
- #navigator-toolbox[zen-has-empty-tab],
- #navigator-toolbox[flash-popup],
- #navigator-toolbox[has-popup-menu],
- #navigator-toolbox[movingtab],
- &[zen-renaming-tab='true'] #navigator-toolbox,
- #navigator-toolbox[zen-compact-mode-active] {
- &:not([animate='true']) {
- --zen-compact-mode-func: linear(
- 0 0%,
- 0.002748 1%,
- 0.010544 2%,
- 0.022757 3%,
- 0.038804 4%,
- 0.058151 5%,
- 0.080308 6%,
- 0.104828 7.000000000000001%,
- 0.131301 8%,
- 0.159358 9%,
- 0.188662 10%,
- 0.21891 11%,
- 0.249828 12%,
- 0.281172 13%,
- 0.312724 14.000000000000002%,
- 0.344288 15%,
- 0.375693 16%,
- 0.40679 17%,
- 0.437447 18%,
- 0.467549 19%,
- 0.497 20%,
- 0.525718 21%,
- 0.553633 22%,
- 0.580688 23%,
- 0.60684 24%,
- 0.632052 25%,
- 0.656298 26%,
- 0.679562 27%,
- 0.701831 28.000000000000004%,
- 0.723104 28.999999999999996%,
- 0.743381 30%,
- 0.76267 31%,
- 0.780983 32%,
- 0.798335 33%,
- 0.814744 34%,
- 0.830233 35%,
- 0.844826 36%,
- 0.858549 37%,
- 0.87143 38%,
- 0.883498 39%,
- 0.894782 40%,
- 0.905314 41%,
- 0.915125 42%,
- 0.924247 43%,
- 0.93271 44%,
- 0.940547 45%,
- 0.947787 46%,
- 0.954463 47%,
- 0.960603 48%,
- 0.966239 49%,
- 0.971397 50%,
- 0.976106 51%,
- 0.980394 52%,
- 0.984286 53%,
- 0.987808 54%,
- 0.990984 55.00000000000001%,
- 0.993837 56.00000000000001%,
- 0.99639 56.99999999999999%,
- 0.998664 57.99999999999999%,
- 1.000679 59%,
- 1.002456 60%,
- 1.004011 61%,
- 1.005363 62%,
- 1.006528 63%,
- 1.007522 64%,
- 1.008359 65%,
- 1.009054 66%,
- 1.009618 67%,
- 1.010065 68%,
- 1.010405 69%,
- 1.010649 70%,
- 1.010808 71%,
- 1.01089 72%,
- 1.010904 73%,
- 1.010857 74%,
- 1.010757 75%,
- 1.010611 76%,
- 1.010425 77%,
- 1.010205 78%,
- 1.009955 79%,
- 1.009681 80%,
- 1.009387 81%,
- 1.009077 82%,
- 1.008754 83%,
- 1.008422 84%,
- 1.008083 85%,
- 1.00774 86%,
- 1.007396 87%,
- 1.007052 88%,
- 1.00671 89%,
- 1.006372 90%,
- 1.00604 91%,
- 1.005713 92%,
- 1.005394 93%,
- 1.005083 94%,
- 1.004782 95%,
- 1.004489 96%,
- 1.004207 97%,
- 1.003935 98%,
- 1.003674 99%,
- 1.003423 100%
- );
- --zen-compact-mode-time: 0.25s;
- transition:
- left var(--zen-compact-mode-time) var(--zen-compact-mode-func),
- right var(--zen-compact-mode-time) var(--zen-compact-mode-func);
-
- :root:not([supress-primary-adjustment='true']) & {
- & #titlebar {
- transition: none;
- visibility: visible;
- }
-
- left: calc(var(--zen-compact-float) / -2);
- :root[zen-right-side='true'] & {
- right: calc(var(--zen-compact-float) / -2);
- left: auto;
- }
- }
- }
- }
- }
+%include sidebar.inc.css
}
@media -moz-pref('zen.view.compact.hide-toolbar') {
- &:not([zen-single-toolbar='true']) {
- & #navigator-toolbox {
- top: 0;
- }
-
- & #navigator-toolbox {
- --zen-toolbox-top-align: var(--zen-element-separation);
- }
-
- & #titlebar,
- & #zen-appcontent-wrapper {
- margin-top: var(--zen-element-separation) !important;
- }
-
- & #zen-appcontent-wrapper {
- z-index: 3 !important;
- }
-
- & #zen-appcontent-navbar-wrapper {
- --zen-compact-toolbar-offset: 5px;
- position: absolute;
- top: calc(-1 * var(--zen-toolbar-height) + 1px);
- left: 0;
- z-index: 20;
- transition: all 0.15s ease;
- width: 100%;
-
- max-height: var(--zen-toolbar-height);
- overflow: hidden;
-
- & #urlbar:not([breakout-extend='true']) {
- opacity: 0 !important;
- }
-
- & #zen-appcontent-navbar-container {
- visibility: hidden;
-
- box-shadow: var(--zen-big-shadow);
- border-bottom-left-radius: var(--zen-border-radius);
- border-bottom-right-radius: var(--zen-border-radius);
- :root:not([sizemode='maximized']) & {
- border-top-left-radius: env(-moz-gtk-csd-titlebar-radius);
- border-top-right-radius: env(-moz-gtk-csd-titlebar-radius);
- }
- transition: all 0.15s ease;
- width: 100%;
- }
- }
-
- & #zen-appcontent-navbar-wrapper[zen-has-hover]:not(:has(#urlbar[zen-floating-urlbar='true']:hover)),
- & #zen-appcontent-navbar-wrapper[zen-user-show],
- & #zen-appcontent-navbar-wrapper[has-popup-menu],
- & #zen-appcontent-navbar-wrapper:has(
- *:is([panelopen='true'], [open='true'], #urlbar:focus-within, [breakout-extend='true']):not(#urlbar[zen-floating-urlbar='true']):not(.zen-compact-mode-ignore)
- ) {
- & #zen-appcontent-navbar-container {
- visibility: visible !important;
- & .zen-toolbar-background {
- display: flex;
- }
- }
- border-top-width: 0px;
-
- top: -1px;
- overflow: initial;
- max-height: unset;
-
- & #urlbar {
- opacity: 1 !important;
- }
-
- & #urlbar[breakout-extend='true']:not([zen-floating-urlbar='true']) {
- top: 2px !important;
- opacity: 1;
- }
- }
- }
+%include toolbar.inc.css
}
}
diff --git a/src/zen/downloads/zen-download-arc-animation.css b/src/zen/downloads/zen-download-arc-animation.css
index 0ce56f287..ea3bd2f97 100644
--- a/src/zen/downloads/zen-download-arc-animation.css
+++ b/src/zen/downloads/zen-download-arc-animation.css
@@ -31,7 +31,7 @@
width: 100%;
height: 100%;
border-radius: 50%;
- background-color: var(--zen-colors-secondary);
+ background-color: var(--toolbar-color);
}
.zen-download-arc-animation-icon {
diff --git a/src/zen/downloads/zen-download-box-animation.css b/src/zen/downloads/zen-download-box-animation.css
index 54634ea9b..211a8091e 100644
--- a/src/zen/downloads/zen-download-box-animation.css
+++ b/src/zen/downloads/zen-download-box-animation.css
@@ -10,7 +10,7 @@
display: flex;
align-items: center;
justify-content: center;
- background-color: var(--zen-colors-primary);
+ background-color: var(--toolbar-color);
border-radius: var(--zen-native-content-radius);
box-shadow: var(--zen-big-shadow);
pointer-events: none;
diff --git a/src/zen/folders/ZenFolder.mjs b/src/zen/folders/ZenFolder.mjs
index 470cc6127..f6ac00a86 100644
--- a/src/zen/folders/ZenFolder.mjs
+++ b/src/zen/folders/ZenFolder.mjs
@@ -117,6 +117,10 @@
return activeGroups;
}
+ get childActiveGroups() {
+ return Array.from(this.querySelectorAll('zen-folder[has-active]'));
+ }
+
rename() {
if (!document.documentElement.hasAttribute('zen-sidebar-expanded')) {
return;
@@ -240,16 +244,18 @@
}
async #unloadAllActiveTabs(event, noClose = false) {
- for (const tab of this.tabs) {
- await gZenPinnedTabManager._onCloseTabShortcut(event, tab, { noClose });
- }
+ await gZenPinnedTabManager.onCloseTabShortcut(event, this.tabs, {
+ noClose,
+ alwaysUnload: true,
+ folderToUnload: this,
+ });
this.activeTabs = [];
}
on_click(event) {
if (event.target === this.resetButton) {
event.stopPropagation();
- this.#unloadAllActiveTabs(event);
+ this.unloadAllTabs(event);
return;
}
super.on_click(event);
diff --git a/src/zen/folders/ZenFolders.mjs b/src/zen/folders/ZenFolders.mjs
index ba57639df..3d181132b 100644
--- a/src/zen/folders/ZenFolders.mjs
+++ b/src/zen/folders/ZenFolders.mjs
@@ -194,6 +194,7 @@
window.addEventListener('TabGroupExpand', this);
window.addEventListener('TabGroupCollapse', this);
window.addEventListener('FolderGrouped', this);
+ window.addEventListener('FolderUngrouped', this);
window.addEventListener('TabSelect', this);
window.addEventListener('TabOpen', this);
const onNewFolder = this.#onNewFolder.bind(this);
@@ -255,6 +256,15 @@
parentFolder.collapsed = isActiveFolder;
}
+ on_FolderUngrouped(event) {
+ if (this._sessionRestoring) return;
+ const parentFolder = event.target;
+ const folder = event.detail;
+ for (const tab of folder.tabs) {
+ this.animateUnload(parentFolder, tab, true);
+ }
+ }
+
async on_TabSelect(event) {
const tab = gZenGlanceManager.getTabOrGlanceParent(event.target);
let group = tab?.group;
@@ -269,7 +279,7 @@
}
collapsedRoot.setAttribute('has-active', 'true');
- await this.expandToSelected(collapsedRoot);
+ await this.animateSelect(collapsedRoot);
gBrowser.tabContainer._invalidateCachedTabs();
}
@@ -286,26 +296,15 @@
}
}
- on_TabUngrouped(event) {
+ async on_TabUngrouped(event) {
const tab = event.detail;
const group = event.target;
- tab.removeAttribute('folder-active');
if (group.hasAttribute('split-view-group') && tab.hasAttribute('had-zen-pinned-changed')) {
tab.setAttribute('zen-pinned-changed', true);
tab.removeAttribute('had-zen-pinned-changed');
}
- const activeGroup = group.activeGroups;
- if (activeGroup?.length > 0) {
- for (const folder of activeGroup) {
- folder.activeTabs = folder.activeTabs.filter((tab) => tab.hasAttribute('folder-active'));
- if (!folder.activeTabs.length) {
- folder.removeAttribute('has-active');
- }
- this.collapseVisibleTab(folder, true);
- this.updateFolderIcon(folder, 'close');
- }
- }
+ await this.animateUnload(group, tab, true);
}
on_TabGroupCreate(event) {
@@ -352,336 +351,14 @@
const group = event.target;
if (!group.isZenFolder) return;
- this.cancelPopupTimer();
- const isForCollapseVisible = event.forCollapseVisible;
- const canInheritMarginTop = event.canInheritMarginTop;
-
- const tabsContainer = group.querySelector('.tab-group-container');
- const animations = [];
- const groupStart = group.querySelector('.zen-tab-group-start');
- let selectedItems = [];
- let selectedGroupIds = new Set();
- let activeGroupIds = new Set();
- let itemsToHide = [];
-
- const items = group.childGroupsAndTabs
- .filter((item) => !item.hasAttribute('zen-empty-tab'))
- .map((item) => {
- const isSplitView = item.group?.hasAttribute?.('split-view-group');
- const lastActiveGroup = !isSplitView
- ? item?.group?.activeGroups?.at(-1)
- : item?.group?.group?.activeGroups?.at(-1);
- const activeGroupId = lastActiveGroup?.id;
- const splitGroupId = isSplitView ? item.group.id : null;
- if (gBrowser.isTabGroupLabel(item) && !isSplitView) item = item.parentNode;
-
- if (
- isForCollapseVisible
- ? group.activeTabs.includes(item)
- : item.multiselected || item.selected
- ) {
- selectedItems.push(item);
- if (splitGroupId) selectedGroupIds.add(splitGroupId);
- if (activeGroupId) activeGroupIds.add(activeGroupId);
- }
-
- return { item, splitGroupId, activeGroupId };
- });
-
- // Calculate the height we need to hide until we reach the selected item.
- let heightUntilSelected = groupStart.style.marginTop
- ? Math.abs(parseInt(groupStart.style.marginTop.slice(0, -2)))
- : 0;
- if (!isForCollapseVisible) {
- if (selectedItems.length) {
- if (!canInheritMarginTop) {
- heightUntilSelected = 0;
- }
- const selectedItem = selectedItems[0];
- const isSplitView = selectedItem.group?.hasAttribute('split-view-group');
- const selectedContainer = isSplitView ? selectedItem.group : selectedItem;
- heightUntilSelected +=
- window.windowUtils.getBoundsWithoutFlushing(selectedContainer).top -
- window.windowUtils.getBoundsWithoutFlushing(groupStart).bottom;
- if (isSplitView) {
- heightUntilSelected -= 2;
- }
- } else {
- heightUntilSelected += window.windowUtils.getBoundsWithoutFlushing(tabsContainer).height;
- }
- }
-
- let selectedIdx = items.length;
- if (selectedItems.length) {
- for (let i = 0; i < items.length; i++) {
- if (selectedItems.includes(items[i].item)) {
- selectedIdx = i;
- break;
- }
- }
- }
-
- for (let i = 0; i < items.length; i++) {
- const { item, splitGroupId, activeGroupId } = items[i];
-
- // Dont hide items before the first selected tab
- if (selectedIdx >= 0 && i < selectedIdx && !isForCollapseVisible) continue;
-
- // Skip selected items
- if (selectedItems.includes(item)) continue;
-
- // Skip items from selected split-view groups
- if (splitGroupId && selectedGroupIds.has(splitGroupId)) continue;
-
- // Skip items from selected active groups
- if (activeGroupId && activeGroupIds.has(activeGroupId)) {
- // If item is tab-group-label-container we should hide it.
- // Other items between tab-group-labe-container and folder-active tab should be visible cuz they are hidden by margin-top
- if (
- item.parentElement.id !== activeGroupId &&
- !item.hasAttribute('folder-active') &&
- !isForCollapseVisible
- ) {
- continue;
- }
- }
-
- const itemToHide = splitGroupId ? item.group : item;
- if (!itemsToHide.includes(itemToHide)) {
- itemsToHide.push(itemToHide);
- }
- }
-
- if (selectedItems.length) {
- group.setAttribute('has-active', 'true');
- group.activeTabs = selectedItems;
-
- selectedItems.forEach((item) => {
- this.setFolderIndentation([item], group, /* for collapse = */ true);
- });
- }
-
- itemsToHide.map((item) => {
- animations.push(
- gZenUIManager.motion.animate(
- item,
- {
- opacity: 0,
- height: 0,
- },
- { duration: 0.12, ease: 'easeInOut' }
- )
- );
- });
-
- animations.push(...this.updateFolderIcon(group));
- const startMargin = -(heightUntilSelected + 4 * (selectedItems.length === 0 ? 1 : 0));
- animations.push(
- gZenUIManager.motion.animate(
- groupStart,
- {
- marginTop: startMargin,
- },
- { duration: 0.12, ease: 'easeInOut' }
- )
- );
-
- gBrowser.tabContainer._invalidateCachedVisibleTabs();
- this.#animationCount += 1;
- await Promise.all(animations);
- // Prevent hiding if we spam the group animations
- this.#animationCount -= 1;
- if (selectedItems.length === 0 && !this.#animationCount) {
- tabsContainer.setAttribute('hidden', true);
- }
+ await this.animateCollapse(group);
}
async on_TabGroupExpand(event) {
const group = event.target;
if (!group.isZenFolder) return;
- this.cancelPopupTimer();
-
- const tabsContainer = group.querySelector('.tab-group-container');
- tabsContainer.removeAttribute('hidden');
-
- const groupStart = group.querySelector('.zen-tab-group-start');
- const animations = [];
- tabsContainer.style.overflow = 'hidden';
-
- const normalizeGroupItems = (items) => {
- const processed = [];
- items
- .filter((item) => !item.hasAttribute('zen-empty-tab'))
- .forEach((item) => {
- if (gBrowser.isTabGroupLabel(item)) {
- if (item?.group?.hasAttribute('split-view-group')) {
- item = item.group;
- } else {
- item = item.parentElement;
- }
- }
- processed.push(item);
- });
- return processed;
- };
-
- const activeGroups = group.querySelectorAll('zen-folder[has-active]');
- const groupItems = normalizeGroupItems(group.childGroupsAndTabs);
- const itemsToHide = [];
-
- // TODO: It is necessary to correctly set marginTop for groups with has-active
- for (const activeGroup of activeGroups) {
- const activeGroupItems = activeGroup.childGroupsAndTabs;
- let selectedTabs = activeGroup.activeTabs;
- let selectedGroupIds = new Set();
-
- selectedTabs.forEach((tab) => {
- if (tab?.group?.hasAttribute('split-view-group')) {
- selectedGroupIds.add(tab.group.id);
- }
- });
-
- if (selectedTabs.length) {
- let selectedIdx = -1;
- for (let i = 0; i < activeGroupItems.length; i++) {
- const item = activeGroup.childGroupsAndTabs[i];
- let selectedTab = item;
-
- // If the item is in a split view group, we need to get the last tab
- if (selectedTab?.group?.hasAttribute('split-view-group')) {
- selectedTab = selectedTab.group.tabs.at(-1);
- }
-
- if (selectedTabs.includes(selectedTab) || selectedTabs.includes(item)) {
- selectedIdx = i;
- break;
- }
- }
-
- if (selectedIdx >= 0) {
- for (let i = selectedIdx; i < activeGroupItems.length; i++) {
- const item = activeGroup.childGroupsAndTabs[i];
-
- if (selectedTabs.includes(item)) continue;
-
- const isSplitView = item.group?.hasAttribute?.('split-view-group');
- const splitGroupId = isSplitView ? item.group.id : null;
- if (splitGroupId && selectedGroupIds.has(splitGroupId)) continue;
-
- itemsToHide.push(...normalizeGroupItems([item]));
- }
- }
- }
- }
-
- groupItems.map((item) => {
- animations.push(
- gZenUIManager.motion.animate(
- item,
- {
- opacity: 1,
- height: '',
- },
- { duration: 0.12, ease: 'easeInOut' }
- )
- );
- });
-
- itemsToHide.map((item) => {
- animations.push(
- gZenUIManager.motion.animate(
- item,
- {
- opacity: 0,
- height: 0,
- },
- { duration: 0.12, ease: 'easeInOut' }
- )
- );
- });
-
- animations.push(...this.updateFolderIcon(group));
- animations.push(
- gZenUIManager.motion
- .animate(
- groupStart,
- {
- marginTop: 0,
- },
- {
- duration: 0.12,
- ease: 'easeInOut',
- }
- )
- .then(() => {
- tabsContainer.style.overflow = '';
- if (group.hasAttribute('has-active')) {
- const activeTabs = group.activeTabs;
- const folders = new Map();
- group.removeAttribute('has-active');
- for (let tab of activeTabs) {
- const group = tab?.group?.hasAttribute('split-view-group')
- ? tab?.group?.group
- : tab?.group;
- if (!folders.has(group?.id)) {
- folders.set(group?.id, group?.activeGroups?.at(-1));
- }
- let activeGroup = folders.get(group?.id);
- // If group has active tabs, we need to update the indentation
- if (activeGroup) {
- const activeGroupStart = activeGroup.querySelector('.zen-tab-group-start');
- const selectedTabs = activeGroup.activeTabs;
- if (selectedTabs.length > 0) {
- const selectedItem = selectedTabs[0];
- const isSplitView = selectedItem.group?.hasAttribute('split-view-group');
- const selectedContainer = isSplitView ? selectedItem.group : selectedItem;
-
- const heightUntilSelected =
- window.windowUtils.getBoundsWithoutFlushing(selectedContainer).top -
- window.windowUtils.getBoundsWithoutFlushing(activeGroupStart).bottom;
-
- const adjustedHeight = isSplitView
- ? heightUntilSelected - 2
- : heightUntilSelected;
- activeGroupStart.style.marginTop =
- -(adjustedHeight + 4 * (selectedTabs.length === 0 ? 1 : 0)) + 'px';
- }
- this.setFolderIndentation([tab], activeGroup, /* for collapse = */ true);
- } else {
- // Since the folder is now expanded, we should remove active attribute
- // to the tab that was previously visible
- tab.removeAttribute('folder-active');
- if (tab.group?.hasAttribute('split-view-group')) {
- tab.group.style.removeProperty('--zen-folder-indent');
- } else {
- tab.style.removeProperty('--zen-folder-indent');
- }
- }
- }
-
- folders.clear();
- }
- // Folder has been expanded and has no active tabs
- group.activeTabs = [];
- })
- );
-
- this.#animationCount += 1;
- await Promise.all(animations);
- this.#animationCount -= 1;
- if (this.#animationCount) {
- return;
- }
- groupItems.forEach((item) => {
- // Cleanup just in case
- item.style.opacity = '';
- item.style.height = '';
- });
- itemsToHide.forEach((item) => {
- item.style.opacity = '';
- item.style.height = '';
- });
+ await this.animateExpand(group);
}
#onNewFolder(event) {
@@ -1208,256 +885,6 @@
}
}
- collapseVisibleTab(group, onlyIfActive = false, selectedTab = null) {
- let tabsToCollapse = [selectedTab];
- if (group?.hasAttribute('split-view-group') && selectedTab && onlyIfActive) {
- tabsToCollapse = group.tabs;
- group = group.group;
- }
- if (!group?.isZenFolder) return;
-
- if (selectedTab) {
- selectedTab.style.removeProperty('--zen-folder-indent');
- }
- // We ignore if the flag is set to avoid infinite recursion
- if (onlyIfActive && group.activeGroups.length && selectedTab) {
- onlyIfActive = true;
- group = group.activeGroups[group.activeGroups.length - 1];
- }
- // Only continue from here if we have the active tab for this group.
- // This is important so we dont set the margin to the wrong group.
- // Example:
- // folder1
- // ├─ folder2
- // └─── tab
- // When we collapse folder1 ONLY and reset tab since it's `active`, pinned
- // manager gives originally the direct group of `tab`, which is `folder2`.
- // But we should be setting the margin only on `folder1`.
- if (!group.activeTabs.includes(selectedTab) && selectedTab) return;
- group._prevActiveTabs = group.activeTabs;
- for (const item of group._prevActiveTabs) {
- if (selectedTab ? tabsToCollapse.includes(item) : !item.selected || !onlyIfActive) {
- item.removeAttribute('folder-active');
- group.activeTabs = group.activeTabs.filter((t) => t !== item);
- if (!onlyIfActive) {
- item.setAttribute('was-folder-active', 'true');
- }
- }
- }
-
- if (group.activeTabs.length === 0) {
- group.removeAttribute('has-active');
- this.updateFolderIcon(group, 'close');
- }
-
- return this.on_TabGroupCollapse({
- target: group,
- forCollapseVisible: true,
- targetTab: selectedTab,
- }).then(() => {
- if (selectedTab) {
- selectedTab.style.removeProperty('--zen-folder-indent');
- }
- });
- }
-
- expandVisibleTab(group) {
- if (!group?.isZenFolder) return;
-
- group.activeTabs = group._prevActiveTabs || [];
- for (const tab of group.activeTabs) {
- if (tab.hasAttribute('was-folder-active')) {
- tab.setAttribute('folder-active', 'true');
- tab.removeAttribute('was-folder-active');
- }
- }
-
- if (group.activeTabs.length === 0) {
- group.removeAttribute('has-active');
- this.updateFolderIcon(group, 'close');
- }
-
- this.on_TabGroupExpand({ target: group, forExpandVisible: true });
-
- gBrowser.tabContainer._invalidateCachedVisibleTabs();
- }
-
- async expandToSelected(group) {
- if (!group?.isZenFolder) return;
-
- this.cancelPopupTimer?.();
-
- const tabsContainer = group.querySelector('.tab-group-container');
- const groupStart = group.querySelector('.zen-tab-group-start');
- const animations = [];
-
- const normalizeGroupItems = (items) => {
- const processed = [];
- items
- .filter((item) => !item.hasAttribute('zen-empty-tab'))
- .forEach((item) => {
- if (gBrowser.isTabGroupLabel(item)) {
- if (item?.group?.hasAttribute('split-view-group')) {
- item = item.group;
- } else {
- item = item.parentElement;
- }
- }
- processed.push(item);
- });
- return processed;
- };
-
- const selectedItems = [];
- const groupItems = normalizeGroupItems(group.childGroupsAndTabs);
-
- for (const item of groupItems) {
- if (item.hasAttribute('folder-active') || item.selected) {
- selectedItems.push(item);
- }
- }
-
- for (const tab of selectedItems) {
- let current = tab?.group?.hasAttribute('split-view-group') ? tab.group.group : tab?.group;
- while (current) {
- const activeForGroup = selectedItems.filter((t) => current.contains(t));
- if (activeForGroup.length) {
- if (current.collapsed) {
- if (current.hasAttribute('has-active')) {
- // It is important to keep the sequence of elements as in the DOM
- current.activeTabs = [...new Set([...current.activeTabs, ...activeForGroup])].sort(
- (a, b) => {
- const position = a.compareDocumentPosition(b);
- if (position & Node.DOCUMENT_POSITION_FOLLOWING) return -1;
- if (position & Node.DOCUMENT_POSITION_PRECEDING) return 1;
- return 0;
- }
- );
- } else {
- current.setAttribute('has-active', 'true');
- current.activeTabs = activeForGroup;
- }
-
- // If selectedItems does not have a tab, it is necessary to add it
- current.activeTabs.forEach((tab) => {
- if (!selectedItems.includes(tab)) {
- selectedItems.push(tab);
- }
- });
- const tabsContainer = current.querySelector('.tab-group-container');
- const groupStart = current.querySelector('.zen-tab-group-start');
- const curMarginTop = parseInt(groupStart.style.marginTop) || 0;
-
- if (tabsContainer.hasAttribute('hidden')) tabsContainer.removeAttribute('hidden');
-
- animations.push(...this.updateFolderIcon(current, 'close'));
- animations.push(
- gZenUIManager.motion.animate(
- groupStart,
- {
- marginTop: [curMarginTop, 0],
- },
- { duration: 0.12, ease: 'easeInOut' }
- )
- );
- for (const tab of activeForGroup) {
- this.setFolderIndentation(
- [tab],
- current,
- /* for collapse = */ true,
- /* animate = */ false
- );
- }
- }
- }
- current = current.group;
- }
- }
-
- const selectedItemsSet = new Set();
- const selectedGroupIds = new Set();
- for (const tab of selectedItems) {
- const isSplit = tab?.group?.hasAttribute?.('split-view-group');
- if (isSplit) selectedGroupIds.add(tab.group.id);
- const container = isSplit ? tab.group : tab;
- selectedItemsSet.add(container);
- }
-
- const itemsToHide = [];
- for (const item of groupItems) {
- const isSplit = item.group?.hasAttribute?.('split-view-group');
- const splitId = isSplit ? item.group.id : null;
- const itemElem = isSplit ? item.group : item;
-
- if (selectedItemsSet.has(itemElem)) continue;
- if (splitId && selectedGroupIds.has(splitId)) continue;
-
- if (!itemElem.hasAttribute?.('folder-active')) {
- if (!itemsToHide.includes(itemElem)) itemsToHide.push(itemElem);
- }
- }
-
- if (tabsContainer.hasAttribute('hidden')) {
- tabsContainer.removeAttribute('hidden');
- }
-
- for (const item of groupItems) {
- animations.push(
- gZenUIManager.motion.animate(
- item,
- {
- opacity: 1,
- height: '',
- },
- { duration: 0.12, ease: 'easeInOut' }
- )
- );
- }
-
- for (const item of itemsToHide) {
- animations.push(
- gZenUIManager.motion.animate(
- item,
- {
- opacity: 0,
- height: 0,
- },
- { duration: 0.12, ease: 'easeInOut' }
- )
- );
- }
-
- let curMarginTop = parseInt(groupStart.style.marginTop) || 0;
- animations.push(
- gZenUIManager.motion
- .animate(
- groupStart,
- {
- marginTop: [curMarginTop, 0],
- },
- { duration: 0.12, ease: 'easeInOut' }
- )
- .then(() => {
- tabsContainer.style.overflow = '';
- })
- );
-
- animations.push(...this.updateFolderIcon(group));
-
- this.#animationCount = (this.#animationCount || 0) + 1;
- await Promise.all(animations);
- this.#animationCount -= 1;
-
- for (const item of groupItems) {
- item.style.opacity = '';
- item.style.height = '';
- }
- for (const item of itemsToHide) {
- item.style.opacity = '';
- item.style.height = '';
- }
- }
-
#groupInit(group, stateData) {
// Setup zen-folder icon to the correct position
this.updateFolderIcon(group, 'auto');
@@ -1615,11 +1042,6 @@
const parentWorkingData = tabFolderWorkingData.get(stateData.parentId);
if (parentWorkingData && parentWorkingData.node) {
switch (stateData?.prevSiblingInfo?.type) {
- case 'group': {
- const folder = document.getElementById(stateData.prevSiblingInfo.id);
- folder.after(node);
- break;
- }
case 'tab': {
const tab = parentWorkingData.node.querySelector(
`[zen-pin-id="${stateData.prevSiblingInfo.id}"]`
@@ -1627,6 +1049,18 @@
tab.after(node);
break;
}
+ case 'group': {
+ const folder = document.getElementById(stateData.prevSiblingInfo.id);
+ if (folder) {
+ folder.after(node);
+ break;
+ }
+ // If we didn't find the group, we should debug it and continue to default case.
+ console.warn(
+ `Zen Folders: Could not find previous sibling group with id ${stateData.prevSiblingInfo.id} while restoring session.`
+ );
+ // @eslint-disable-next-line no-fallthrough
+ }
default: {
// Should insert after zen-empty-tab
const start =
@@ -1753,6 +1187,552 @@
return { dropElement, colorCode, dropBefore };
}
+
+ #normalizeGroupItems(items) {
+ return items
+ .filter((item) => !item.hasAttribute('zen-empty-tab'))
+ .map((item) => {
+ if (gBrowser.isTabGroup(item)) {
+ item = item.firstChild;
+ } else if (gBrowser.isTabGroupLabel(item)) {
+ if (item?.group?.hasAttribute('split-view-group')) {
+ item = item.group;
+ } else {
+ item = item.parentElement;
+ }
+ }
+ return item;
+ });
+ }
+
+ #collectGroupItems(group, opts = {}) {
+ const { selectedTabs = [], splitViewIds = new Set(), activeFoldersIds = new Set() } = opts;
+ const folders = new Map();
+ return group.childGroupsAndTabs
+ .filter((item) => !item.hasAttribute('zen-empty-tab'))
+ .map((item) => {
+ const isSplitView = item.group?.hasAttribute?.('split-view-group');
+ const group = isSplitView ? item.group.group : item.group;
+ if (!folders.has(group?.id)) {
+ folders.set(group?.id, group?.activeGroups[0]);
+ }
+ const lastActiveFolder = folders.get(group?.id);
+ const activeFolderId = lastActiveFolder?.id;
+ const splitViewId = isSplitView ? item?.group?.id : null;
+
+ if (item.multiselected || item.selected || item.hasAttribute('folder-active')) {
+ selectedTabs.push(item);
+ if (splitViewId) splitViewIds.add(splitViewId);
+ if (activeFolderId) activeFoldersIds.add(activeFolderId);
+ }
+
+ if (gBrowser.isTabGroupLabel(item)) {
+ if (isSplitView) {
+ item = item.group;
+ } else {
+ item = item.parentElement;
+ }
+ }
+
+ return { item, splitViewId, activeFolderId };
+ });
+ }
+
+ #createAnimation(items, targetState, opts, callback = () => {}) {
+ items = Array.isArray(items) ? items : [items];
+ return items.map((item) =>
+ gZenUIManager.motion.animate(item, targetState, opts).then(callback)
+ );
+ }
+
+ #calculateHeightShift(tabsContainer, selectedTabs) {
+ let heightShift = 0;
+ if (selectedTabs.length) {
+ return heightShift;
+ } else {
+ heightShift += window.windowUtils.getBoundsWithoutFlushing(tabsContainer).height;
+ }
+ return heightShift;
+ }
+
+ async animateCollapse(group) {
+ this.cancelPopupTimer();
+
+ const animations = [];
+ const selectedTabs = [];
+ const splitViewIds = new Set();
+ const activeFoldersIds = new Set();
+ const itemsToHide = [];
+
+ const tabsContainer = group.querySelector('.tab-group-container');
+ const groupStart = group.querySelector('.zen-tab-group-start');
+
+ const groupItems = this.#collectGroupItems(group, {
+ selectedTabs,
+ splitViewIds,
+ activeFoldersIds,
+ });
+ const collapsedHeight = this.#calculateHeightShift(tabsContainer, selectedTabs);
+
+ if (selectedTabs.length) {
+ for (let i = 0; i < groupItems.length; i++) {
+ const { item, splitViewId, activeFolderId } = groupItems[i];
+
+ // Skip selected items
+ if (selectedTabs.includes(item)) continue;
+
+ // Skip items from selected split-view groups
+ if (splitViewId && splitViewIds.has(splitViewId)) continue;
+
+ // Skip items from selected active groups
+ if (activeFolderId && activeFoldersIds.has(activeFolderId)) {
+ // If item is tab-group-label-container we should hide it.
+ // Other items between tab-group-labe-container and folder-active tab should be visible cuz they are hidden by margin-top
+ if (item.parentElement.id !== activeFolderId && !item.hasAttribute('folder-active')) {
+ continue;
+ }
+ }
+
+ if (!itemsToHide.includes(item)) {
+ itemsToHide.push(item);
+ }
+ }
+
+ group.setAttribute('has-active', 'true');
+ group.activeTabs = selectedTabs;
+
+ selectedTabs.forEach((tab) => {
+ this.setFolderIndentation([tab], group, /* for collapse = */ true);
+ });
+ }
+
+ animations.push(
+ ...this.#createAnimation(
+ itemsToHide,
+ { opacity: [1, 0], height: ['auto', 0] },
+ { duration: 0.12, ease: 'easeInOut' }
+ ),
+ ...this.updateFolderIcon(group),
+ ...this.#createAnimation(
+ groupStart,
+ {
+ marginTop: -(collapsedHeight + 4 * (selectedTabs.length === 0 ? 1 : 0)),
+ },
+ { duration: 0.12, ease: 'easeInOut' }
+ )
+ );
+
+ gBrowser.tabContainer._invalidateCachedVisibleTabs();
+ this.#animationCount += 1;
+ await Promise.all(animations);
+ if (this.#animationCount) {
+ this.#animationCount -= 1;
+ return;
+ }
+ // Prevent hiding if we spam the group animations
+ if (!selectedTabs.length && !this.#animationCount) {
+ tabsContainer.setAttribute('hidden', true);
+ }
+
+ this.styleCleanup(itemsToHide);
+ }
+
+ async animateExpand(group) {
+ this.cancelPopupTimer();
+
+ const animations = [];
+ const itemsToHide = [];
+
+ const tabsContainer = group.querySelector('.tab-group-container');
+ tabsContainer.removeAttribute('hidden');
+ tabsContainer.style.overflow = 'hidden';
+
+ const groupStart = group.querySelector('.zen-tab-group-start');
+ const itemsToShow = this.#normalizeGroupItems(group.childGroupsAndTabs);
+ const activeFolders = group.childActiveGroups;
+
+ for (const folder of activeFolders) {
+ const splitViewIds = new Set();
+ const selectedTabs = folder.activeTabs;
+
+ const activeFoldersIds = new Set();
+ const activeFolderItems = this.#collectGroupItems(folder, {
+ splitViewIds,
+ activeFoldersIds,
+ });
+
+ if (selectedTabs.length) {
+ for (let i = 0; i < activeFolderItems.length; i++) {
+ const { item, splitViewId, activeFolderId } = activeFolderItems[i];
+
+ // Skip selected items
+ if (selectedTabs.includes(item)) continue;
+
+ // Skip items from selected split-view groups
+ if (splitViewId && splitViewIds.has(splitViewId)) continue;
+
+ if (activeFolderId && activeFoldersIds.has(activeFolderId)) {
+ const folder = item.parentElement;
+ if (
+ gBrowser.isTabGroup(folder) &&
+ folder.id !== activeFolderId &&
+ item.hasAttribute('folder-active')
+ ) {
+ continue;
+ }
+ }
+
+ if (!itemsToHide.includes(item)) {
+ itemsToHide.push(item);
+ }
+ }
+ }
+ }
+
+ const afterMarginTop = () => {
+ tabsContainer.style.overflow = '';
+ if (group.hasAttribute('has-active')) {
+ const activeTabs = group.activeTabs;
+ const folders = new Map();
+ group.removeAttribute('has-active');
+ for (let tab of activeTabs) {
+ const group = tab?.group?.hasAttribute('split-view-group')
+ ? tab?.group?.group
+ : tab?.group;
+ if (!folders.has(group?.id)) {
+ folders.set(group?.id, group?.activeGroups?.at(-1));
+ }
+ let activeGroup = folders.get(group?.id);
+ if (activeGroup) {
+ this.setFolderIndentation([tab], activeGroup, /* for collapse = */ true);
+ } else {
+ // Since the folder is now expanded, we should remove active attribute
+ // to the tab that was previously visible
+ tab.removeAttribute('folder-active');
+ if (tab.group?.hasAttribute('split-view-group')) {
+ tab.group.style.removeProperty('--zen-folder-indent');
+ } else {
+ tab.style.removeProperty('--zen-folder-indent');
+ }
+ }
+ }
+ folders.clear();
+ }
+ // Folder has been expanded and has no active tabs
+ group.activeTabs = [];
+ };
+
+ animations.push(
+ ...this.#createAnimation(
+ itemsToShow,
+ { opacity: '', height: '' },
+ { duration: 0.12, ease: 'easeInOut' }
+ ),
+ ...this.#createAnimation(
+ itemsToHide,
+ { opacity: 0, height: 0 },
+ { duration: 0.12, ease: 'easeInOut' }
+ ),
+ ...this.updateFolderIcon(group),
+ ...this.#createAnimation(
+ groupStart,
+ {
+ marginTop: 0,
+ },
+ { duration: 0.12, ease: 'easeInOut' },
+ afterMarginTop
+ )
+ );
+
+ this.#animationCount += 1;
+ await Promise.all(animations);
+ this.#animationCount -= 1;
+
+ // Cleanup
+ this.styleCleanup(itemsToShow);
+ this.styleCleanup(itemsToHide);
+ }
+
+ async animateUnloadAll(group) {
+ const animations = [];
+
+ const activeGroups = [group, ...group.childActiveGroups];
+ for (const folder of activeGroups) {
+ folder.removeAttribute('has-active');
+ folder.activeTabs = [];
+ const groupItems = this.#normalizeGroupItems(folder.allItems);
+ const tabsContainer = folder.querySelector('.tab-group-container');
+
+ // Set correct margin-top after animation
+ const afterAnimate = () => {
+ groupStart.style.removeProperty('margin-top');
+ this.styleCleanup(groupItems);
+ // Trigger the recalculation so that zen returns
+ // the correct container size in the DOM
+ tabsContainer.offsetHeight;
+ tabsContainer.setAttribute('hidden', true);
+ const collapsedHeight = this.#calculateHeightShift(tabsContainer, []);
+ groupStart.style.marginTop = `${-(collapsedHeight + 4)}px`;
+ };
+
+ const groupStart = folder.querySelector('.zen-tab-group-start');
+ const collapsedHeight = this.#calculateHeightShift(tabsContainer, []);
+
+ // Collect animations for this specific folder becoming inactive
+ animations.push(
+ ...this.updateFolderIcon(folder, 'close', false),
+ ...this.#createAnimation(
+ groupStart,
+ {
+ marginTop: -(collapsedHeight + 4),
+ },
+ { duration: 0.12, ease: 'easeInOut' },
+ afterAnimate
+ )
+ );
+ }
+
+ this.#animationCount += 1;
+ await Promise.all(animations);
+ this.#animationCount -= 1;
+ gBrowser.tabContainer._invalidateCachedTabs();
+ }
+
+ async animateUnload(group, tabToUnload, ungroup = false) {
+ const isSplitView = tabToUnload.group?.hasAttribute('split-view-group');
+ if ((!group?.isZenFolder || !isSplitView) && !tabToUnload.hasAttribute('folder-active'))
+ return;
+ const animations = [];
+ let lastTab = false;
+
+ const activeGroups = group.activeGroups;
+ for (const folder of activeGroups) {
+ folder.activeTabs = folder.activeTabs.filter((tab) => tab !== tabToUnload);
+
+ if (folder.activeTabs.length === 0) {
+ lastTab = true;
+ animations.push(async () => {
+ folder.removeAttribute('has-active');
+ const groupItems = this.#normalizeGroupItems(folder.allItems);
+ const tabsContainer = folder.querySelector('.tab-group-container');
+
+ // Set correct margin-top after animation
+ const afterAnimate = () => {
+ groupStart.style.removeProperty('margin-top');
+ this.styleCleanup(groupItems);
+ // Trigger the recalculation so that zen returns
+ // the correct container size in the DOM
+ tabsContainer.offsetHeight;
+ tabsContainer.setAttribute('hidden', true);
+ const collapsedHeight = this.#calculateHeightShift(tabsContainer, []);
+ groupStart.style.marginTop = `${-(collapsedHeight + 4)}px`;
+ };
+
+ const groupStart = folder.querySelector('.zen-tab-group-start');
+ const collapsedHeight = this.#calculateHeightShift(tabsContainer, []);
+
+ // Collect animations for this specific folder becoming inactive
+ const folderAnimation = [
+ ...this.updateFolderIcon(folder, 'close', false),
+ ...this.#createAnimation(
+ groupStart,
+ {
+ marginTop: -(collapsedHeight + 4),
+ },
+ { duration: 0.12, ease: 'easeInOut' },
+ afterAnimate
+ ),
+ ];
+ await Promise.all(folderAnimation);
+ });
+ }
+ }
+
+ tabToUnload.removeAttribute('folder-active');
+ if (isSplitView) {
+ tabToUnload = tabToUnload.group;
+ }
+
+ tabToUnload.style.removeProperty('--zen-folder-indent');
+
+ let tabUnloadAnimations = [];
+ if (!ungroup && !lastTab) {
+ tabUnloadAnimations = this.#createAnimation(
+ tabToUnload,
+ {
+ opacity: 0,
+ height: 0,
+ },
+ {
+ duration: 0.12,
+ ease: 'easeInOut',
+ }
+ );
+ }
+
+ // Manage global animation count
+ this.#animationCount += 1;
+
+ // Await the tab unload animation first
+ await Promise.all(tabUnloadAnimations);
+ await Promise.all(animations.map((item) => (typeof item === 'function' ? item() : item)));
+ this.#animationCount -= 1;
+ gBrowser.tabContainer._invalidateCachedTabs();
+ }
+
+ async animateSelect(group) {
+ if (!group?.isZenFolder) return;
+
+ this.cancelPopupTimer();
+
+ const animations = [];
+ const selectedTabs = [];
+ const splitViewIds = new Set();
+ const itemsToHide = [];
+
+ const groupItems = this.#collectGroupItems(group, {
+ selectedTabs,
+ splitViewIds,
+ });
+
+ for (const tab of selectedTabs) {
+ let currentGroup = tab?.group?.hasAttribute('split-view-group')
+ ? tab.group.group
+ : tab?.group;
+ while (currentGroup) {
+ const activeTabs = selectedTabs.filter((t) => currentGroup.tabs.includes(t));
+ if (activeTabs.length) {
+ if (currentGroup.collapsed) {
+ if (currentGroup.hasAttribute('has-active')) {
+ // It is important to keep the sequence of elements as in the DOM
+ currentGroup.activeTabs = [
+ ...new Set([...currentGroup.activeTabs, ...activeTabs]),
+ ].sort((a, b) => a._tPos > b._tPos);
+ } else {
+ currentGroup.setAttribute('has-active', 'true');
+ currentGroup.activeTabs = activeTabs;
+ }
+
+ const tabsContainer = currentGroup.querySelector('.tab-group-container');
+ const groupStart = currentGroup.querySelector('.zen-tab-group-start');
+ tabsContainer.style.overflow = 'clip';
+
+ if (tabsContainer.hasAttribute('hidden')) tabsContainer.removeAttribute('hidden');
+
+ const afterMarginTop = () => {
+ tabsContainer.style.overflow = '';
+ };
+
+ animations.push(
+ ...this.updateFolderIcon(currentGroup, 'close', false),
+ ...this.#createAnimation(
+ groupStart,
+ {
+ marginTop: 0,
+ },
+ { duration: 0.12, ease: 'easeInOut' },
+ afterMarginTop
+ )
+ );
+ for (const tab of activeTabs) {
+ this.setFolderIndentation(
+ [tab],
+ currentGroup,
+ /* for collapse = */ true,
+ /* animate = */ false
+ );
+ }
+ }
+ }
+ currentGroup = currentGroup.group;
+ }
+ }
+
+ const itemsToShow = [];
+ if (selectedTabs.length) {
+ for (let i = 0; i < groupItems.length; i++) {
+ const { item, splitViewId } = groupItems[i];
+
+ itemsToShow.push(item);
+
+ // Skip selected items
+ if (selectedTabs.includes(item)) continue;
+
+ // Skip items from selected split-view groups
+ if (splitViewId && splitViewIds.has(splitViewId)) continue;
+
+ if (!item.hasAttribute?.('folder-active')) {
+ if (!itemsToHide.includes(item)) itemsToHide.push(item);
+ }
+ }
+ }
+
+ // FIXME: This is a hack to fix the animations not working properly
+ this.styleCleanup(itemsToShow);
+ itemsToHide.forEach((item) => {
+ item.style.opacity = 0;
+ item.style.height = 0;
+ });
+
+ animations.push(
+ ...this.#createAnimation(
+ itemsToShow,
+ {
+ opacity: '',
+ height: '',
+ },
+ {
+ duration: 0.12,
+ ease: 'easeInOut',
+ }
+ ),
+ ...this.#createAnimation(
+ itemsToHide,
+ {
+ opacity: 0,
+ height: 0,
+ },
+ {
+ duration: 0.12,
+ ease: 'easeInOut',
+ }
+ )
+ );
+
+ this.#animationCount += 1;
+ await Promise.all(animations);
+ this.#animationCount -= 1;
+ if (this.#animationCount) {
+ return;
+ }
+
+ // Cleanup
+ this.styleCleanup(itemsToHide);
+ this.styleCleanup(selectedTabs);
+ }
+
+ animateGroupMove(group, expand = false) {
+ if (!group?.isZenFolder) return;
+ const groupStart = group.querySelector('.zen-tab-group-start');
+ const tabsContainer = group.querySelector('.tab-group-container');
+ const heightContainer = expand ? 0 : this.#calculateHeightShift(tabsContainer, []);
+ tabsContainer.style.overflow = 'clip';
+
+ this.#createAnimation(
+ groupStart,
+ {
+ marginTop: expand ? 0 : -(heightContainer + 4),
+ },
+ { duration: 0.12, ease: 'easeInOut' }
+ );
+ }
+
+ styleCleanup(items) {
+ items.forEach((item) => {
+ item.style.removeProperty('opacity');
+ item.style.removeProperty('height');
+ });
+ }
}
window.gZenFolders = new nsZenFolders();
diff --git a/src/zen/folders/zen-folders.css b/src/zen/folders/zen-folders.css
index d841303f1..f1be64211 100644
--- a/src/zen/folders/zen-folders.css
+++ b/src/zen/folders/zen-folders.css
@@ -207,7 +207,7 @@ zen-folder {
display: flex;
}
- & > .tab-group-container {
+ &:not([has-active]) > .tab-group-container {
overflow-y: clip;
}
}
@@ -335,13 +335,13 @@ zen-folder {
}
&:last-child {
- border-bottom-left-radius: max(calc(var(--panel-border-radius) - 6px), 4px);
- border-bottom-right-radius: max(calc(var(--panel-border-radius) - 6px), 4px);
+ border-bottom-left-radius: max(calc(var(--panel-border-radius) - 2px), 4px);
+ border-bottom-right-radius: max(calc(var(--panel-border-radius) - 2px), 4px);
}
&:first-child {
- border-top-left-radius: max(calc(var(--panel-border-radius) - 6px), 4px);
- border-top-right-radius: max(calc(var(--panel-border-radius) - 6px), 4px);
+ border-top-left-radius: max(calc(var(--panel-border-radius) - 2px), 4px);
+ border-top-right-radius: max(calc(var(--panel-border-radius) - 2px), 4px);
}
}
diff --git a/src/zen/glance/ZenGlanceManager.mjs b/src/zen/glance/ZenGlanceManager.mjs
index bccffa314..1990a1d77 100644
--- a/src/zen/glance/ZenGlanceManager.mjs
+++ b/src/zen/glance/ZenGlanceManager.mjs
@@ -1,312 +1,856 @@
// 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/.
+
{
+ /**
+ * Manages the Zen Glance feature - a preview overlay system for tabs
+ * Allows users to preview content without fully opening new tabs
+ */
class nsZenGlanceManager extends nsZenDOMOperatedFeature {
+ // Animation state
_animating = false;
_lazyPref = {};
+ // Glance management
#glances = new Map();
#currentGlanceID = null;
-
#confirmationTimeout = null;
+ // Animation flags
+ animatingOpen = false;
+ animatingFullOpen = false;
+ closingGlance = false;
+ #duringOpening = false;
+ #ignoreClose = false;
+
+ // Arc animation configuration
+ #ARC_CONFIG = Object.freeze({
+ ARC_STEPS: 70, // Increased for smoother bounce
+ MAX_ARC_HEIGHT: 30,
+ ARC_HEIGHT_RATIO: 0.2, // Arc height = distance * ratio (capped at MAX_ARC_HEIGHT)
+ });
+
init() {
+ this.#setupEventListeners();
+ this.#setupPreferences();
+ this.#setupObservers();
+ }
+
+ #setupEventListeners() {
window.addEventListener('TabClose', this.onTabClose.bind(this));
window.addEventListener('TabSelect', this.onLocationChange.bind(this));
+ document
+ .getElementById('tabbrowser-tabpanels')
+ .addEventListener('click', this.onOverlayClick.bind(this));
+ }
+
+ #setupPreferences() {
XPCOMUtils.defineLazyPreferenceGetter(
this._lazyPref,
'SHOULD_OPEN_EXTERNAL_TABS_IN_GLANCE',
'zen.glance.open-essential-external-links',
false
);
+ }
- document
- .getElementById('tabbrowser-tabpanels')
- .addEventListener('click', this.onOverlayClick.bind(this));
+ #setupObservers() {
Services.obs.addObserver(this, 'quit-application-requested');
}
+ /**
+ * Handle main command set events for glance operations
+ * @param {Event} event - The command event
+ */
handleMainCommandSet(event) {
const command = event.target;
- switch (command.id) {
- case 'cmd_zenGlanceClose':
- this.closeGlance({ onTabClose: true });
- break;
- case 'cmd_zenGlanceExpand':
- this.fullyOpenGlance();
- break;
- case 'cmd_zenGlanceSplit':
- this.splitGlance();
- break;
+ const commandHandlers = {
+ cmd_zenGlanceClose: () => this.closeGlance({ onTabClose: true }),
+ cmd_zenGlanceExpand: () => this.fullyOpenGlance(),
+ cmd_zenGlanceSplit: () => this.splitGlance(),
+ };
+
+ const handler = commandHandlers[command.id];
+ if (handler) {
+ handler();
}
}
+ /**
+ * Get the current glance browser element
+ * @returns {Browser} The current browser or null
+ */
get #currentBrowser() {
return this.#glances.get(this.#currentGlanceID)?.browser;
}
+ /**
+ * Get the current glance tab element
+ * @returns {Tab} The current tab or null
+ */
get #currentTab() {
return this.#glances.get(this.#currentGlanceID)?.tab;
}
+ /**
+ * Get the current glance parent tab element
+ * @returns {Tab} The parent tab or null
+ */
get #currentParentTab() {
return this.#glances.get(this.#currentGlanceID)?.parentTab;
}
+ /**
+ * Handle clicks on the glance overlay
+ * @param {Event} event - The click event
+ */
onOverlayClick(event) {
- if (event.target === this.overlay && event.originalTarget !== this.contentWrapper) {
+ const isOverlayClick = event.target === this.overlay;
+ const isNotContentClick = event.originalTarget !== this.contentWrapper;
+
+ if (isOverlayClick && isNotContentClick) {
this.closeGlance({ onTabClose: true });
}
}
+ /**
+ * Handle application observer notifications
+ * @param {Object} subject - The subject of the notification
+ * @param {string} topic - The topic of the notification
+ */
observe(subject, topic) {
- switch (topic) {
- case 'quit-application-requested':
- this.onUnload();
- break;
+ if (topic === 'quit-application-requested') {
+ this.onUnload();
}
}
+ /**
+ * Clean up all glances when the application is unloading
+ */
onUnload() {
- // clear everything
- /* eslint-disable no-unused-vars */
- for (let [id, glance] of this.#glances) {
+ for (const [, glance] of this.#glances) {
gBrowser.removeTab(glance.tab, { animate: false });
}
+ this.#glances.clear();
}
- createBrowserElement(url, currentTab, existingTab = null) {
- const newTabOptions = {
+ /**
+ * Create a new browser element for a glance
+ * @param {string} url - The URL to load
+ * @param {Tab} currentTab - The current tab
+ * @param {Tab} existingTab - Optional existing tab to reuse
+ * @returns {Browser} The created browser element
+ */
+ #createBrowserElement(url, currentTab, existingTab = null) {
+ const newTabOptions = this.#createTabOptions(currentTab);
+ const newUUID = gZenUIManager.generateUuidv4();
+
+ currentTab._selected = true;
+ const newTab =
+ existingTab ?? gBrowser.addTrustedTab(Services.io.newURI(url).spec, newTabOptions);
+
+ this.#configureNewTab(newTab, currentTab, newUUID);
+ this.#registerGlance(newTab, currentTab, newUUID);
+
+ gBrowser.selectedTab = newTab;
+ return this.#currentBrowser;
+ }
+
+ /**
+ * Create tab options for a new glance tab
+ * @param {Tab} currentTab - The current tab
+ * @returns {Object} Tab options
+ */
+ #createTabOptions(currentTab) {
+ return {
userContextId: currentTab.getAttribute('usercontextid') || '',
skipBackgroundNotify: true,
insertTab: true,
skipLoad: false,
};
- currentTab._selected = true;
- const newUUID = gZenUIManager.generateUuidv4();
- const newTab =
- existingTab ?? gBrowser.addTrustedTab(Services.io.newURI(url).spec, newTabOptions);
+ }
+
+ /**
+ * Configure a new tab for glance usage
+ * @param {Tab} newTab - The new tab to configure
+ * @param {Tab} currentTab - The current tab
+ * @param {string} glanceId - The glance ID
+ */
+ #configureNewTab(newTab, currentTab, glanceId) {
if (currentTab.hasAttribute('zenDefaultUserContextId')) {
newTab.setAttribute('zenDefaultUserContextId', true);
}
+
currentTab.querySelector('.tab-content').appendChild(newTab);
newTab.setAttribute('zen-glance-tab', true);
- newTab.setAttribute('glance-id', newUUID);
- currentTab.setAttribute('glance-id', newUUID);
- this.#glances.set(newUUID, {
+ newTab.setAttribute('glance-id', glanceId);
+ currentTab.setAttribute('glance-id', glanceId);
+ }
+
+ /**
+ * Register a new glance in the glances map
+ * @param {Tab} newTab - The new tab
+ * @param {Tab} currentTab - The current tab
+ * @param {string} glanceId - The glance ID
+ */
+ #registerGlance(newTab, currentTab, glanceId) {
+ this.#glances.set(glanceId, {
tab: newTab,
parentTab: currentTab,
browser: newTab.linkedBrowser,
});
- this.#currentGlanceID = newUUID;
- gBrowser.selectedTab = newTab;
- return this.#currentBrowser;
+ this.#currentGlanceID = glanceId;
}
+ /**
+ * Fill overlay references from a browser element
+ * @param {Browser} browser - The browser element
+ */
fillOverlay(browser) {
this.overlay = browser.closest('.browserSidebarContainer');
this.browserWrapper = browser.closest('.browserContainer');
this.contentWrapper = browser.closest('.browserStack');
}
+ /**
+ * Create new overlay buttons with animation
+ * @returns {DocumentFragment} The cloned button template
+ */
#createNewOverlayButtons() {
- const newButtons = document
- .getElementById('zen-glance-sidebar-template')
- .content.cloneNode(true);
+ const template = document.getElementById('zen-glance-sidebar-template');
+ const newButtons = template.content.cloneNode(true);
const container = newButtons.querySelector('.zen-glance-sidebar-container');
+
+ this.#animateOverlayButtons(container);
+ return newButtons;
+ }
+
+ /**
+ * Animate the overlay buttons entrance
+ * @param {Element} container - The button container
+ */
+ #animateOverlayButtons(container) {
container.style.opacity = 0;
+
+ const xOffset = gZenVerticalTabsManager._prefsRightSide ? 20 : -20;
+
gZenUIManager.motion.animate(
container,
{
opacity: [0, 1],
+ x: [xOffset, 0],
},
{
- duration: 0.2,
+ duration: 0.3,
type: 'spring',
- delay: 0.05,
+ delay: 0.15,
+ bounce: 0,
}
);
- return newButtons;
}
+ /**
+ * Get element preview data as a data URL
+ * @param {Object} data - Glance data
+ * @returns {Promise} Promise resolving to data URL or null
+ * if not available
+ */
+ async #getElementPreviewData(data) {
+ // Make the rect relative to the tabpanels. We dont do it directly on the
+ // content process since it does not take into account scroll. This way, we can
+ // be sure that the coordinates are correct.
+ const tabPanelsRect = gBrowser.tabpanels.getBoundingClientRect();
+ const rect = new DOMRect(
+ data.clientX + tabPanelsRect.left,
+ data.clientY + tabPanelsRect.top,
+ data.width,
+ data.height
+ );
+ return await this.#imageBitmapToBase64(
+ await window.browsingContext.currentWindowGlobal.drawSnapshot(rect, 1, 'transparent', true)
+ );
+ }
+
+ /**
+ * Open a glance overlay with the specified data
+ * @param {Object} data - Glance data including URL, position, and dimensions
+ * @param {Tab} existingTab - Optional existing tab to reuse
+ * @param {Tab} ownerTab - The tab that owns this glance
+ * @returns {Promise} Promise that resolves to the glance tab
+ */
openGlance(data, existingTab = null, ownerTab = null) {
if (this.#currentBrowser) {
return;
}
+
if (gBrowser.selectedTab === this.#currentParentTab) {
gBrowser.selectedTab = this.#currentTab;
return;
}
- this.animatingOpen = true;
- this._animating = true;
-
- const initialX = data.clientX;
- const initialY = data.clientY;
- const initialWidth = data.width;
- const initialHeight = data.height;
-
- this.browserWrapper?.removeAttribute('animate');
- this.browserWrapper?.removeAttribute('has-finished-animation');
- this.overlay?.removeAttribute('post-fade-out');
+ this.#setAnimationState(true);
const currentTab = ownerTab ?? gBrowser.selectedTab;
-
- const browserElement = this.createBrowserElement(data.url, currentTab, existingTab);
+ const browserElement = this.#createBrowserElement(data.url, currentTab, existingTab);
this.fillOverlay(browserElement);
-
this.overlay.classList.add('zen-glance-overlay');
- return new Promise((resolve) => {
- window.requestAnimationFrame(() => {
- this.quickOpenGlance();
- const newButtons = this.#createNewOverlayButtons();
- this.browserWrapper.appendChild(newButtons);
+ return this.#animateGlanceOpening(data, browserElement);
+ }
- // Performance: backdrop-filter blur on Windows significantly impacts scroll smoothness
- // in the Glance preview (particularly for wheel scrolling). Avoid applying it on Windows.
- const parentSidebarContainer = this.#currentParentTab.linkedBrowser.closest(
- '.browserSidebarContainer'
- );
- gZenUIManager.motion.animate(
- parentSidebarContainer,
- {
- scale: [1, 0.98],
- opacity: [1, 0.6],
- },
- {
- duration: 0.4,
- type: 'spring',
- bounce: 0.2,
- }
- );
- this.overlay.removeAttribute('fade-out');
- this.browserWrapper.setAttribute('animate', true);
- const top = initialY + initialHeight / 2;
- const left = initialX + initialWidth / 2;
- this.browserWrapper.style.top = `${top}px`;
- this.browserWrapper.style.left = `${left}px`;
- this.browserWrapper.style.width = `${initialWidth}px`;
- this.browserWrapper.style.height = `${initialHeight}px`;
- this.browserWrapper.style.opacity = 0.8;
- this.#glances.get(this.#currentGlanceID).originalPosition = {
- top: this.browserWrapper.style.top,
- left: this.browserWrapper.style.left,
- width: this.browserWrapper.style.width,
- height: this.browserWrapper.style.height,
- };
- this.browserWrapper.style.transform = 'translate(-50%, -50%)';
- this.overlay.style.overflow = 'visible';
- gZenUIManager.motion
- .animate(
- this.browserWrapper,
- {
- top: '50%',
- left: '50%',
- width: '85%',
- height: '100%',
- opacity: 1,
- },
- {
- duration: 0.3,
- type: 'spring',
- bounce: 0.2,
- }
- )
- .then(() => {
- gBrowser.tabContainer._invalidateCachedTabs();
- this.overlay.style.removeProperty('overflow');
- this.browserWrapper.removeAttribute('animate');
- this.browserWrapper.setAttribute('has-finished-animation', true);
- this._animating = false;
- this.animatingOpen = false;
- this.#currentTab.dispatchEvent(new Event('GlanceOpen', { bubbles: true }));
- resolve(this.#currentTab);
- });
+ /**
+ * Set animation state flags
+ * @param {boolean} isAnimating - Whether animations are active
+ */
+ #setAnimationState(isAnimating) {
+ this.animatingOpen = isAnimating;
+ this._animating = isAnimating;
+ }
+
+ /**
+ * Animate the glance opening process
+ * @param {Object} data - Glance data
+ * @param {Browser} browserElement - The browser element
+ * @returns {Promise} Promise that resolves to the glance tab
+ */
+ #animateGlanceOpening(data, browserElement) {
+ // FIXME(cheffy): We *must* have the call back async (at least,
+ // until a better solution is found). If we do it inside the requestAnimationFrame,
+ // we see flashing and if we do it directly, the animation does not play at all.
+ // eslint-disable-next-line no-async-promise-executor
+ return new Promise(async (resolve) => {
+ this.#prepareGlanceAnimation(data, browserElement);
+ if (data.width && data.height) {
+ data.elementData = await this.#getElementPreviewData(data);
+ }
+ this.#glances.get(this.#currentGlanceID).elementData = data.elementData;
+ window.requestAnimationFrame(() => {
+ this.#executeGlanceAnimation(data, browserElement, resolve);
});
});
}
- _clearContainerStyles(container) {
+ /**
+ * Prepare the glance for animation
+ * @param {Object} data - Glance data
+ * @param {Browser} browserElement - The browser element
+ */
+ #prepareGlanceAnimation(data, browserElement) {
+ this.quickOpenGlance();
+ const newButtons = this.#createNewOverlayButtons();
+ this.browserWrapper.appendChild(newButtons);
+
+ this.#animateParentBackground();
+ this.#setupGlancePositioning(data);
+ this.#configureBrowserElement(browserElement);
+ }
+
+ /**
+ * Animate the parent background
+ */
+ #animateParentBackground() {
+ const parentSidebarContainer = this.#currentParentTab.linkedBrowser.closest(
+ '.browserSidebarContainer'
+ );
+
+ gZenUIManager.motion.animate(
+ parentSidebarContainer,
+ {
+ scale: [1, 0.98],
+ opacity: [1, 0.5],
+ },
+ {
+ duration: 0.3,
+ type: 'spring',
+ bounce: 0.2,
+ }
+ );
+ }
+
+ /**
+ * Set up glance positioning
+ * @param {Object} data - Glance data with position and dimensions
+ */
+ #setupGlancePositioning(data) {
+ const { clientX, clientY, width, height } = data;
+ const top = clientY + height / 2;
+ const left = clientX + width / 2;
+
+ this.overlay.removeAttribute('fade-out');
+ this.browserWrapper.setAttribute('animate', true);
+ this.browserWrapper.style.top = `${top}px`;
+ this.browserWrapper.style.left = `${left}px`;
+ this.browserWrapper.style.width = `${width}px`;
+ this.browserWrapper.style.height = `${height}px`;
+
+ this.#storeOriginalPosition();
+ this.overlay.style.overflow = 'visible';
+ }
+
+ /**
+ * Store the original position for later restoration
+ */
+ #storeOriginalPosition() {
+ this.#glances.get(this.#currentGlanceID).originalPosition = {
+ top: this.browserWrapper.style.top,
+ left: this.browserWrapper.style.left,
+ width: this.browserWrapper.style.width,
+ height: this.browserWrapper.style.height,
+ };
+ }
+
+ /**
+ * Handle element preview if provided
+ * @param {Object} data - Glance data
+ * @returns {Element|null} The preview element or null
+ */
+ #handleElementPreview(data) {
+ if (!data.elementData) {
+ return null;
+ }
+
+ const imageDataElement = document.createXULElement('image');
+ imageDataElement.setAttribute('src', data.elementData);
+ imageDataElement.classList.add('zen-glance-element-preview');
+
+ // set an aspect ratio to prevent stretching during animation
+ imageDataElement.style.aspectRatio = `${data.width} / ${data.height}`;
+
+ this.browserWrapper.prepend(imageDataElement);
+ this.#glances.get(this.#currentGlanceID).elementImageData = data.elementData;
+
+ gZenUIManager.motion.animate(
+ imageDataElement,
+ {
+ opacity: [1, 0],
+ },
+ {
+ duration: 0.3,
+ easing: 'easeInOut',
+ }
+ );
+
+ return imageDataElement;
+ }
+
+ /**
+ * Configure browser element for animation
+ * @param {Browser} browserElement - The browser element
+ */
+ #configureBrowserElement(browserElement) {
+ const rect = window.windowUtils.getBoundsWithoutFlushing(this.browserWrapper.parentElement);
+ const minWidth = rect.width * 0.85;
+ const minHeight = rect.height * 0.85;
+
+ browserElement.style.minWidth = `${minWidth}px`;
+ browserElement.style.minHeight = `${minHeight}px`;
+ }
+
+ /**
+ * Get the transform origin for the animation
+ * @param {Object} data - Glance data with position and dimensions
+ * @returns {string} The transform origin CSS value
+ */
+ #getTransformOrigin(data) {
+ const { clientX, clientY, width, height } = data;
+ const parentRect = window.windowUtils.getBoundsWithoutFlushing(
+ this.browserWrapper.parentElement
+ );
+ const xPercent = ((clientX + width / 2 - parentRect.left) / parentRect.width) * 100;
+ const yPercent = ((clientY + height / 2 - parentRect.top) / parentRect.height) * 100;
+
+ const xOrigin = xPercent < 33 ? 'left' : xPercent > 66 ? 'right' : 'center';
+ const yOrigin = yPercent < 33 ? 'top' : yPercent > 66 ? 'bottom' : 'center';
+
+ return `${xOrigin} ${yOrigin}`;
+ }
+
+ /**
+ * Execute the main glance animation
+ * @param {Object} data - Glance data
+ * @param {Browser} browserElement - The browser element
+ * @param {Function} resolve - Promise resolve function
+ */
+ #executeGlanceAnimation(data, browserElement, resolve) {
+ const imageDataElement = this.#handleElementPreview(data);
+
+ // Create curved animation sequence
+ const arcSequence = this.#createGlanceArcSequence(data, 'opening');
+ const transformOrigin = this.#getTransformOrigin(data);
+
+ this.browserWrapper.style.transformOrigin = transformOrigin;
+
+ // Only animate if there is element data, so we can apply a
+ // nice fade-in effect to the content. But if it doesn't exist,
+ // we just fall back to always showing the browser directly.
+ if (data.elementData) {
+ this.contentWrapper.style.opacity = 0;
+ gZenUIManager.motion
+ .animate(
+ this.contentWrapper,
+ { opacity: [0, 1] },
+ {
+ duration: 0.1,
+ easing: 'easeInOut',
+ }
+ )
+ .then(() => {
+ this.contentWrapper.style.opacity = '';
+ });
+ }
+
+ gZenUIManager.motion
+ .animate(this.browserWrapper, arcSequence, {
+ duration: gZenUIManager.testingEnabled ? 0 : 0.4,
+ ease: 'easeInOut',
+ })
+ .then(() => {
+ this.#finalizeGlanceOpening(imageDataElement, browserElement, resolve);
+ });
+ }
+
+ /**
+ * Create arc animation sequence for glance animations
+ * @param {Object} data - Glance data with position and dimensions
+ * @param {string} direction - 'opening' or 'closing'
+ * @returns {Object} Animation sequence object
+ */
+ #createGlanceArcSequence(data, direction) {
+ const { clientX, clientY, width, height } = data;
+
+ // Calculate start and end positions based on direction
+ let startPosition, endPosition;
+
+ const tabPanelsRect = window.windowUtils.getBoundsWithoutFlushing(gBrowser.tabpanels);
+
+ const widthPercent = 0.85;
+ if (direction === 'opening') {
+ startPosition = {
+ x: clientX + width / 2,
+ y: clientY + height / 2,
+ width: width,
+ height: height,
+ };
+ endPosition = {
+ x: tabPanelsRect.width / 2,
+ y: tabPanelsRect.height / 2,
+ width: tabPanelsRect.width * widthPercent,
+ height: tabPanelsRect.height,
+ };
+ } else {
+ // closing
+ startPosition = {
+ x: tabPanelsRect.width / 2,
+ y: tabPanelsRect.height / 2,
+ width: tabPanelsRect.width * widthPercent,
+ height: tabPanelsRect.height,
+ };
+ endPosition = {
+ x: clientX + width / 2,
+ y: clientY + height / 2,
+ width: width,
+ height: height,
+ };
+ }
+
+ // Calculate distance and arc parameters
+ const distance = this.#calculateDistance(startPosition, endPosition);
+ const { arcHeight, shouldArcDownward } = this.#calculateOptimalArc(
+ startPosition,
+ endPosition,
+ distance
+ );
+
+ const sequence = {
+ top: [],
+ left: [],
+ width: [],
+ height: [],
+ transform: [],
+ };
+
+ const steps = this.#ARC_CONFIG.ARC_STEPS;
+ const arcDirection = shouldArcDownward ? 1 : -1;
+
+ function easeInOutQuad(t) {
+ return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
+ }
+
+ function easeOutCubic(t) {
+ return 1 - Math.pow(1 - t, 6);
+ }
+
+ // First, create the main animation steps
+ for (let i = 0; i <= steps; i++) {
+ const progress = i / steps;
+ const eased = direction === 'opening' ? easeInOutQuad(progress) : easeOutCubic(progress);
+
+ // Calculate size interpolation
+ const currentWidth =
+ startPosition.width + (endPosition.width - startPosition.width) * eased;
+ const currentHeight =
+ startPosition.height + (endPosition.height - startPosition.height) * eased;
+
+ // Calculate position on arc
+ const distanceX = endPosition.x - startPosition.x;
+ const distanceY = endPosition.y - startPosition.y;
+
+ const x = startPosition.x + distanceX * eased;
+ const y =
+ startPosition.y +
+ distanceY * eased +
+ arcDirection * arcHeight * (1 - (2 * eased - 1) ** 2);
+
+ sequence.transform.push(`translate(-50%, -50%) scale(1)`);
+ sequence.top.push(`${y}px`);
+ sequence.left.push(`${x}px`);
+ sequence.width.push(`${currentWidth}px`);
+ sequence.height.push(`${currentHeight}px`);
+ }
+
+ let scale = 1;
+ const bounceSteps = 60;
+ if (direction === 'opening') {
+ for (let i = 0; i < bounceSteps; i++) {
+ const progress = i / bounceSteps;
+ // Scale up slightly then back to normal
+ scale = 1 + 0.004 * Math.sin(progress * Math.PI);
+ // If we are at the last step, ensure scale is exactly 1
+ if (i === bounceSteps - 1) {
+ scale = 1;
+ }
+ sequence.transform.push(`translate(-50%, -50%) scale(${scale})`);
+ sequence.top.push(sequence.top[sequence.top.length - 1]);
+ sequence.left.push(sequence.left[sequence.left.length - 1]);
+ sequence.width.push(sequence.width[sequence.width.length - 1]);
+ sequence.height.push(sequence.height[sequence.height.length - 1]);
+ }
+ }
+
+ return sequence;
+ }
+
+ /**
+ * Calculate distance between two positions
+ * @param {Object} start - Start position
+ * @param {Object} end - End position
+ * @returns {number} Distance
+ */
+ #calculateDistance(start, end) {
+ const distanceX = end.x - start.x;
+ const distanceY = end.y - start.y;
+ return Math.sqrt(distanceX * distanceX + distanceY * distanceY);
+ }
+
+ /**
+ * Calculate optimal arc parameters
+ * @param {Object} startPosition - Start position
+ * @param {Object} endPosition - End position
+ * @param {number} distance - Distance between positions
+ * @returns {Object} Arc parameters
+ */
+ #calculateOptimalArc(startPosition, endPosition, distance) {
+ // Calculate available space for the arc
+ const availableTopSpace = Math.min(startPosition.y, endPosition.y);
+ const viewportHeight = window.innerHeight;
+ const availableBottomSpace = viewportHeight - Math.max(startPosition.y, endPosition.y);
+
+ // Determine if we should arc downward or upward based on available space
+ const shouldArcDownward = availableBottomSpace > availableTopSpace;
+
+ // Use the space in the direction we're arcing
+ const availableSpace = shouldArcDownward ? availableBottomSpace : availableTopSpace;
+
+ // Limit arc height to a percentage of the available space
+ const arcHeight = Math.min(
+ distance * this.#ARC_CONFIG.ARC_HEIGHT_RATIO,
+ this.#ARC_CONFIG.MAX_ARC_HEIGHT,
+ availableSpace * 0.6
+ );
+
+ return { arcHeight, shouldArcDownward };
+ }
+
+ /**
+ * Finalize the glance opening process
+ * @param {Element|null} imageDataElement - The preview element
+ * @param {Browser} browserElement - The browser element
+ * @param {Function} resolve - Promise resolve function
+ */
+ #finalizeGlanceOpening(imageDataElement, browserElement, resolve) {
+ if (imageDataElement) {
+ imageDataElement.remove();
+ }
+
+ this.browserWrapper.style.transformOrigin = '';
+
+ browserElement.style.minWidth = '';
+ browserElement.style.minHeight = '';
+
+ this.browserWrapper.style.height = '100%';
+ this.browserWrapper.style.width = '85%';
+
+ gBrowser.tabContainer._invalidateCachedTabs();
+ this.overlay.style.removeProperty('overflow');
+ this.browserWrapper.removeAttribute('animate');
+ this.browserWrapper.setAttribute('has-finished-animation', true);
+
+ this.#setAnimationState(false);
+ this.#currentTab.dispatchEvent(new Event('GlanceOpen', { bubbles: true }));
+ resolve(this.#currentTab);
+ }
+
+ /**
+ * Clear container styles while preserving inset
+ * @param {Element} container - The container element
+ */
+ #clearContainerStyles(container) {
const inset = container.style.inset;
container.removeAttribute('style');
container.style.inset = inset;
}
+ /**
+ * Close the current glance
+ * @param {Object} options - Close options
+ * @param {boolean} options.noAnimation - Skip animation
+ * @param {boolean} options.onTabClose - Called during tab close
+ * @param {string} options.setNewID - Set new glance ID
+ * @param {boolean} options.hasFocused - Has focus confirmation
+ * @param {boolean} options.skipPermitUnload - Skip unload permission check
+ * @returns {Promise|undefined} Promise if animated, undefined if immediate
+ */
closeGlance({
noAnimation = false,
onTabClose = false,
setNewID = null,
- isDifferent = false,
hasFocused = false,
skipPermitUnload = false,
} = {}) {
- if (
- (this._animating && !onTabClose) ||
- !this.#currentBrowser ||
- (this.animatingOpen && !onTabClose) ||
- this._duringOpening
- ) {
+ if (!this.#canCloseGlance(onTabClose)) {
return;
}
- if (!skipPermitUnload) {
- let { permitUnload } = this.#currentBrowser.permitUnload();
- if (!permitUnload) {
- return;
- }
+ if (!skipPermitUnload && !this.#checkPermitUnload()) {
+ return;
}
const browserSidebarContainer = this.#currentParentTab?.linkedBrowser?.closest(
'.browserSidebarContainer'
);
const sidebarButtons = this.browserWrapper.querySelector('.zen-glance-sidebar-container');
+
+ if (this.#handleConfirmationTimeout(onTabClose, hasFocused, sidebarButtons)) {
+ return;
+ }
+
+ this.browserWrapper.removeAttribute('has-finished-animation');
+
+ if (noAnimation) {
+ this.#clearContainerStyles(browserSidebarContainer);
+ this.quickCloseGlance({ closeCurrentTab: false });
+ return;
+ }
+
+ return this.#animateGlanceClosing(
+ onTabClose,
+ browserSidebarContainer,
+ sidebarButtons,
+ setNewID
+ );
+ }
+
+ /**
+ * Check if glance can be closed
+ * @param {boolean} onTabClose - Whether this is called during tab close
+ * @returns {boolean} True if can close
+ */
+ #canCloseGlance(onTabClose) {
+ return !(
+ (this._animating && !onTabClose) ||
+ !this.#currentBrowser ||
+ (this.animatingOpen && !onTabClose) ||
+ this._duringOpening
+ );
+ }
+
+ /**
+ * Check if unload is permitted
+ * @returns {boolean} True if unload is permitted
+ */
+ #checkPermitUnload() {
+ const { permitUnload } = this.#currentBrowser.permitUnload();
+ return permitUnload;
+ }
+
+ /**
+ * Handle confirmation timeout for focused close
+ * @param {boolean} onTabClose - Whether this is called during tab close
+ * @param {boolean} hasFocused - Has focus confirmation
+ * @param {Element} sidebarButtons - The sidebar buttons element
+ * @returns {boolean} True if should return early
+ */
+ #handleConfirmationTimeout(onTabClose, hasFocused, sidebarButtons) {
if (onTabClose && hasFocused && !this.#confirmationTimeout && sidebarButtons) {
- const cancelButton = sidebarButtons?.querySelector('.zen-glance-sidebar-close');
+ const cancelButton = sidebarButtons.querySelector('.zen-glance-sidebar-close');
cancelButton.setAttribute('waitconfirmation', true);
this.#confirmationTimeout = setTimeout(() => {
cancelButton.removeAttribute('waitconfirmation');
this.#confirmationTimeout = null;
}, 3000);
- return;
- }
-
- this.browserWrapper.removeAttribute('has-finished-animation');
- if (noAnimation) {
- this._clearContainerStyles(browserSidebarContainer);
- this.quickCloseGlance({ closeCurrentTab: false });
- return;
+ return true;
}
+ return false;
+ }
+ /**
+ * Animate the glance closing process
+ * @param {boolean} onTabClose - Whether this is called during tab close
+ * @param {Element} browserSidebarContainer - The sidebar container
+ * @param {Element} sidebarButtons - The sidebar buttons
+ * @param {string} setNewID - New glance ID to set
+ * @returns {Promise} Promise that resolves when closing is complete
+ */
+ #animateGlanceClosing(onTabClose, browserSidebarContainer, sidebarButtons, setNewID) {
this.closingGlance = true;
this._animating = true;
gBrowser.moveTabAfter(this.#currentTab, this.#currentParentTab);
- let quikcCloseZen = false;
- if (onTabClose) {
- // Create new tab if no more ex
- if (gBrowser.tabs.length === 1) {
- BrowserCommands.openTab();
- return;
- }
+ if (onTabClose && gBrowser.tabs.length === 1) {
+ BrowserCommands.openTab();
+ return;
}
- // do NOT touch here, I don't know what it does, but it works...
+ this.#prepareGlanceForClosing();
+ this.#animateSidebarButtons(sidebarButtons);
+ this.#animateParentBackgroundClose(browserSidebarContainer);
+
+ return this.#executeClosingAnimation(setNewID, onTabClose);
+ }
+
+ /**
+ * Prepare glance for closing
+ */
+ #prepareGlanceForClosing() {
+ // Critical: This line must not be touched - it works for unknown reasons
this.#currentTab.style.display = 'none';
this.overlay.setAttribute('fade-out', true);
this.overlay.style.pointerEvents = 'none';
this.quickCloseGlance({ justAnimateParent: true, clearID: false });
- const originalPosition = this.#glances.get(this.#currentGlanceID).originalPosition;
+ }
+
+ /**
+ * Animate sidebar buttons out
+ * @param {Element} sidebarButtons - The sidebar buttons element
+ */
+ #animateSidebarButtons(sidebarButtons) {
if (sidebarButtons) {
gZenUIManager.motion
.animate(
sidebarButtons,
- {
- opacity: [1, 0],
- },
+ { opacity: [1, 0] },
{
duration: 0.2,
type: 'spring',
@@ -317,110 +861,234 @@
sidebarButtons.remove();
});
}
+ }
+
+ #imageBitmapToBase64(imageBitmap) {
+ // 1. Create a canvas with the same size as the ImageBitmap
+ const canvas = document.createElement('canvas');
+ canvas.width = imageBitmap.width;
+ canvas.height = imageBitmap.height;
+
+ // 2. Draw the ImageBitmap onto the canvas
+ const ctx = canvas.getContext('2d');
+ ctx.drawImage(imageBitmap, 0, 0);
+
+ // 3. Convert the canvas content to a Base64 string (PNG by default)
+ const base64String = canvas.toDataURL('image/png');
+ return base64String;
+ }
+
+ /**
+ * Animate parent background restoration
+ * @param {Element} browserSidebarContainer - The sidebar container
+ */
+ #animateParentBackgroundClose(browserSidebarContainer) {
gZenUIManager.motion
.animate(
browserSidebarContainer,
{
scale: [0.98, 1],
- opacity: [0.6, 1],
+ opacity: [0.5, 1],
},
{
- duration: 0.4,
+ duration: 0.3,
type: 'spring',
- bounce: 0.2,
+ bounce: 0,
}
)
.then(() => {
- this._clearContainerStyles(browserSidebarContainer);
+ this.#clearContainerStyles(browserSidebarContainer);
});
+
this.browserWrapper.style.opacity = 1;
+ }
+
+ /**
+ * Execute the main closing animation
+ * @param {string} setNewID - New glance ID to set
+ * @param {boolean} onTabClose - Whether this is called during tab close
+ * @returns {Promise} Promise that resolves when complete
+ */
+ #executeClosingAnimation(setNewID, onTabClose) {
return new Promise((resolve) => {
+ const originalPosition = this.#glances.get(this.#currentGlanceID).originalPosition;
+ const elementImageData = this.#glances.get(this.#currentGlanceID).elementImageData;
+
+ this.#addElementPreview(elementImageData, originalPosition);
+
+ // Create curved closing animation sequence
+ const closingData = this.#createClosingDataFromOriginalPosition(originalPosition);
+ const arcSequence = this.#createGlanceArcSequence(closingData, 'closing');
+
gZenUIManager.motion
- .animate(
- this.browserWrapper,
- {
- ...originalPosition,
- opacity: 0,
- },
- { type: 'spring', bounce: 0, duration: 0.5, easing: 'ease-in' }
- )
+ .animate(this.browserWrapper, arcSequence, { duration: 0.4, ease: 'easeOut' })
.then(() => {
- this.browserWrapper.removeAttribute('animate');
- if (!this.#currentParentTab) {
- return;
+ // Remove element preview after closing animation
+ const elementPreview = this.browserWrapper.querySelector('.zen-glance-element-preview');
+ if (elementPreview) {
+ elementPreview.remove();
}
-
- if (!onTabClose || quikcCloseZen) {
- this.quickCloseGlance({ clearID: false });
- }
- this.overlay.removeAttribute('fade-out');
- this.browserWrapper.removeAttribute('animate');
-
- const lastCurrentTab = this.#currentTab;
-
- this.overlay.classList.remove('zen-glance-overlay');
- gBrowser
- ._getSwitcher()
- .setTabStateNoAction(lastCurrentTab, gBrowser.AsyncTabSwitcher.STATE_UNLOADED);
-
- if (!onTabClose) {
- this.#currentParentTab._visuallySelected = false;
- }
-
- if (
- this.#currentParentTab.linkedBrowser &&
- !this.#currentParentTab.hasAttribute('split-view')
- ) {
- this.#currentParentTab.linkedBrowser.zenModeActive = false;
- }
-
- // reset everything
- this.browserWrapper = null;
- this.overlay = null;
- this.contentWrapper = null;
-
- lastCurrentTab.removeAttribute('zen-glance-tab');
- lastCurrentTab._closingGlance = true;
-
- if (!isDifferent) {
- gBrowser.selectedTab = this.#currentParentTab;
- }
- this._ignoreClose = true;
- lastCurrentTab.dispatchEvent(new Event('GlanceClose', { bubbles: true }));
- gBrowser.removeTab(lastCurrentTab, { animate: true, skipPermitUnload: true });
- gBrowser.tabContainer._invalidateCachedTabs();
-
- this.#currentParentTab.removeAttribute('glance-id');
-
- this.#glances.delete(this.#currentGlanceID);
- this.#currentGlanceID = setNewID;
-
- this._duringOpening = false;
-
- this._animating = false;
- this.closingGlance = false;
-
- if (this.#currentGlanceID) {
- this.quickOpenGlance();
- }
-
- resolve();
+ this.#finalizeGlanceClosing(setNewID, resolve, onTabClose);
});
});
}
- quickOpenGlance() {
- if (!this.#currentBrowser || this._duringOpening) {
+ /**
+ * Create closing data from original position for arc animation
+ * @param {Object} originalPosition - Original position object
+ * @returns {Object} Closing data object
+ */
+ #createClosingDataFromOriginalPosition(originalPosition) {
+ // Parse the original position values
+ const top = parseFloat(originalPosition.top) || 0;
+ const left = parseFloat(originalPosition.left) || 0;
+ const width = parseFloat(originalPosition.width) || 0;
+ const height = parseFloat(originalPosition.height) || 0;
+
+ return {
+ clientX: left - width / 2,
+ clientY: top - height / 2,
+ width: width,
+ height: height,
+ };
+ }
+
+ /**
+ * Add element preview if available, used for the closing animation
+ * @param {string} elementImageData - The element image data
+ * @param {Object} rect - The rectangle data
+ */
+ #addElementPreview(elementImageData, rect) {
+ if (elementImageData) {
+ const imageDataElement = document.createXULElement('image');
+ imageDataElement.setAttribute('src', elementImageData);
+ imageDataElement.classList.add('zen-glance-element-preview');
+
+ // set an aspect ratio to prevent stretching during animation
+ imageDataElement.style.aspectRatio = `${parseFloat(rect.width)} / ${parseFloat(rect.height)}`;
+
+ this.browserWrapper.prepend(imageDataElement);
+ }
+ }
+
+ /**
+ * Finalize the glance closing process
+ * @param {string} setNewID - New glance ID to set
+ * @param {Function} resolve - Promise resolve function
+ * @param {boolean} onTabClose - Whether this is called during tab close
+ */
+ #finalizeGlanceClosing(setNewID, resolve, onTabClose) {
+ this.browserWrapper.removeAttribute('animate');
+
+ if (!this.#currentParentTab) {
return;
}
- this._duringOpening = true;
+ if (!onTabClose) {
+ this.quickCloseGlance({ clearID: false });
+ }
+ this.browserWrapper.style.display = 'none';
+ this.overlay.removeAttribute('fade-out');
+ this.browserWrapper.removeAttribute('animate');
+
+ const lastCurrentTab = this.#currentTab;
+ this.#cleanupGlanceElements(lastCurrentTab);
+ this.#resetGlanceState(setNewID);
+
+ this.#setAnimationState(false);
+ this.closingGlance = false;
+
+ if (this.#currentGlanceID) {
+ this.quickOpenGlance();
+ }
+
+ resolve();
+ }
+
+ /**
+ * Clean up glance DOM elements
+ * @param {Tab} lastCurrentTab - The tab being closed
+ */
+ #cleanupGlanceElements(lastCurrentTab) {
+ this.overlay.classList.remove('zen-glance-overlay');
+ gBrowser
+ ._getSwitcher()
+ .setTabStateNoAction(lastCurrentTab, gBrowser.AsyncTabSwitcher.STATE_UNLOADED);
+
+ if (!this.#currentParentTab.selected) {
+ this.#currentParentTab._visuallySelected = false;
+ }
+
+ if (gBrowser.selectedTab === lastCurrentTab) {
+ gBrowser.selectedTab = this.#currentParentTab;
+ }
+
+ if (
+ this.#currentParentTab.linkedBrowser &&
+ !this.#currentParentTab.hasAttribute('split-view')
+ ) {
+ this.#currentParentTab.linkedBrowser.zenModeActive = false;
+ }
+
+ // Reset overlay references
+ this.browserWrapper = null;
+ this.overlay = null;
+ this.contentWrapper = null;
+
+ lastCurrentTab.removeAttribute('zen-glance-tab');
+ lastCurrentTab._closingGlance = true;
+
+ this.#ignoreClose = true;
+ lastCurrentTab.dispatchEvent(new Event('GlanceClose', { bubbles: true }));
+ gBrowser.removeTab(lastCurrentTab, { animate: true, skipPermitUnload: true });
+ gBrowser.tabContainer._invalidateCachedTabs();
+ }
+
+ /**
+ * Reset glance state
+ * @param {string} setNewID - New glance ID to set
+ */
+ #resetGlanceState(setNewID) {
+ this.#currentParentTab.removeAttribute('glance-id');
+ this.#glances.delete(this.#currentGlanceID);
+ this.#currentGlanceID = setNewID;
+ this._duringOpening = false;
+ }
+
+ /**
+ * Quickly open glance without animation
+ */
+ quickOpenGlance() {
+ if (!this.#currentBrowser || this.#duringOpening) {
+ return;
+ }
+
+ this.#duringOpening = true;
+ this.#configureGlanceElements();
+ this.#setGlanceStates();
+ this.#duringOpening = false;
+ }
+
+ /**
+ * Configure glance DOM elements
+ */
+ #configureGlanceElements() {
const parentBrowserContainer = this.#currentParentTab.linkedBrowser.closest(
'.browserSidebarContainer'
);
+
parentBrowserContainer.classList.add('zen-glance-background');
parentBrowserContainer.classList.remove('zen-glance-overlay');
parentBrowserContainer.classList.add('deck-selected');
+
+ this.overlay.classList.add('deck-selected');
+ this.overlay.classList.add('zen-glance-overlay');
+ }
+
+ /**
+ * Set glance browser and tab states
+ */
+ #setGlanceStates() {
this.#currentParentTab.linkedBrowser.zenModeActive = true;
this.#currentParentTab.linkedBrowser.docShellIsActive = true;
this.#currentBrowser.zenModeActive = true;
@@ -428,13 +1096,16 @@
this.#currentBrowser.setAttribute('zen-glance-selected', true);
this.fillOverlay(this.#currentBrowser);
this.#currentParentTab._visuallySelected = true;
-
- this.overlay.classList.add('deck-selected');
- this.overlay.classList.add('zen-glance-overlay');
-
- this._duringOpening = false;
}
+ /**
+ * Quickly close glance without animation
+ * @param {Object} options - Close options
+ * @param {boolean} options.closeCurrentTab - Close current tab
+ * @param {boolean} options.closeParentTab - Close parent tab
+ * @param {boolean} options.justAnimateParent - Only animate parent
+ * @param {boolean} options.clearID - Clear current glance ID
+ */
quickCloseGlance({
closeCurrentTab = true,
closeParentTab = true,
@@ -445,127 +1116,217 @@
const browserContainer = this.#currentParentTab.linkedBrowser.closest(
'.browserSidebarContainer'
);
- if (parentHasBrowser) {
- browserContainer.classList.remove('zen-glance-background');
- }
+
+ this.#removeParentBackground(parentHasBrowser, browserContainer);
+
if (!justAnimateParent && this.overlay) {
- if (parentHasBrowser && !this.#currentParentTab.hasAttribute('split-view')) {
- if (closeParentTab) {
- browserContainer.classList.remove('deck-selected');
- }
- this.#currentParentTab.linkedBrowser.zenModeActive = false;
- }
- this.#currentBrowser.zenModeActive = false;
- if (closeParentTab && parentHasBrowser) {
- this.#currentParentTab.linkedBrowser.docShellIsActive = false;
- }
- if (closeCurrentTab) {
- this.#currentBrowser.docShellIsActive = false;
- this.overlay.classList.remove('deck-selected');
- this.#currentTab._selected = false;
- }
- if (!this.#currentParentTab._visuallySelected && closeParentTab) {
- this.#currentParentTab._visuallySelected = false;
- }
- this.#currentBrowser.removeAttribute('zen-glance-selected');
- this.overlay.classList.remove('zen-glance-overlay');
+ this.#resetGlanceStates(
+ closeCurrentTab,
+ closeParentTab,
+ parentHasBrowser,
+ browserContainer
+ );
}
+
if (clearID) {
this.#currentGlanceID = null;
}
}
+ /**
+ * Remove parent background styling
+ * @param {boolean} parentHasBrowser - Whether parent has browser
+ * @param {Element} browserContainer - The browser container
+ */
+ #removeParentBackground(parentHasBrowser, browserContainer) {
+ if (parentHasBrowser) {
+ browserContainer.classList.remove('zen-glance-background');
+ }
+ }
+
+ /**
+ * Reset glance states
+ * @param {boolean} closeCurrentTab - Whether to close current tab
+ * @param {boolean} closeParentTab - Whether to close parent tab
+ * @param {boolean} parentHasBrowser - Whether parent has browser
+ * @param {Element} browserContainer - The browser container
+ */
+ #resetGlanceStates(closeCurrentTab, closeParentTab, parentHasBrowser, browserContainer) {
+ if (parentHasBrowser && !this.#currentParentTab.hasAttribute('split-view')) {
+ if (closeParentTab) {
+ browserContainer.classList.remove('deck-selected');
+ }
+ this.#currentParentTab.linkedBrowser.zenModeActive = false;
+ }
+
+ this.#currentBrowser.zenModeActive = false;
+
+ if (closeParentTab && parentHasBrowser) {
+ this.#currentParentTab.linkedBrowser.docShellIsActive = false;
+ }
+
+ if (closeCurrentTab) {
+ this.#currentBrowser.docShellIsActive = false;
+ this.overlay.classList.remove('deck-selected');
+ this.#currentTab._selected = false;
+ }
+
+ if (!this.#currentParentTab._visuallySelected && closeParentTab) {
+ this.#currentParentTab._visuallySelected = false;
+ }
+
+ this.#currentBrowser.removeAttribute('zen-glance-selected');
+ this.overlay.classList.remove('zen-glance-overlay');
+ }
+
+ /**
+ * Open glance on location change if not animating
+ */
onLocationChangeOpenGlance() {
if (!this.animatingOpen) {
this.quickOpenGlance();
}
}
- // note: must be sync to avoid timing issues
+ /**
+ * Handle location change events
+ * Note: Must be sync to avoid timing issues
+ * @param {Event} event - The location change event
+ */
onLocationChange(event) {
const tab = event.target;
+
if (this.animatingFullOpen || this.closingGlance) {
return;
}
- if (this._duringOpening || !tab.hasAttribute('glance-id')) {
- if (this.#currentGlanceID && !this._duringOpening) {
+
+ if (this.#duringOpening || !tab.hasAttribute('glance-id')) {
+ if (this.#currentGlanceID && !this.#duringOpening) {
this.quickCloseGlance();
}
return;
}
+
if (this.#currentGlanceID && this.#currentGlanceID !== tab.getAttribute('glance-id')) {
this.quickCloseGlance();
}
+
this.#currentGlanceID = tab.getAttribute('glance-id');
+
if (gBrowser.selectedTab === this.#currentParentTab && this.#currentBrowser) {
- const curTab = this.#currentTab;
- const prevTab = event.detail.previousTab;
- setTimeout(() => {
- gBrowser.selectedTab = curTab;
- if (prevTab?.linkedBrowser) {
- prevTab.linkedBrowser
- .closest('.browserSidebarContainer')
- .classList.remove('deck-selected');
- }
- }, 0);
+ this.#handleParentTabSelection(event);
} else if (gBrowser.selectedTab === this.#currentTab) {
setTimeout(this.onLocationChangeOpenGlance.bind(this), 0);
}
}
+ /**
+ * Handle parent tab selection
+ * @param {Event} event - The location change event
+ */
+ #handleParentTabSelection(event) {
+ const curTab = this.#currentTab;
+ const prevTab = event.detail.previousTab;
+
+ setTimeout(() => {
+ gBrowser.selectedTab = curTab;
+ if (prevTab?.linkedBrowser) {
+ prevTab.linkedBrowser
+ .closest('.browserSidebarContainer')
+ .classList.remove('deck-selected');
+ }
+ }, 0);
+ }
+
+ /**
+ * Handle tab close events
+ * @param {Event} event - The tab close event
+ */
onTabClose(event) {
if (event.target === this.#currentParentTab) {
this.closeGlance({ onTabClose: true });
}
}
+ /**
+ * Manage tab close for glance tabs
+ * @param {Tab} tab - The tab being closed
+ * @returns {boolean} Whether to continue with tab close
+ */
manageTabClose(tab) {
- if (tab.hasAttribute('glance-id')) {
- const oldGlanceID = this.#currentGlanceID;
- const newGlanceID = tab.getAttribute('glance-id');
- this.#currentGlanceID = newGlanceID;
- const isDifferent = newGlanceID !== oldGlanceID;
- if (this._ignoreClose) {
- this._ignoreClose = false;
- return false;
- }
- this.closeGlance({
- onTabClose: true,
- setNewID: isDifferent ? oldGlanceID : null,
- isDifferent,
- });
- // only keep continueing tab close if we are not on the currently selected tab
- return !isDifferent;
+ if (!tab.hasAttribute('glance-id')) {
+ return false;
}
- return false;
+
+ const oldGlanceID = this.#currentGlanceID;
+ const newGlanceID = tab.getAttribute('glance-id');
+ this.#currentGlanceID = newGlanceID;
+ const isDifferent = newGlanceID !== oldGlanceID;
+
+ if (this.#ignoreClose) {
+ this.#ignoreClose = false;
+ return false;
+ }
+
+ this.closeGlance({
+ onTabClose: true,
+ setNewID: isDifferent ? oldGlanceID : null,
+ });
+
+ // Only continue tab close if we are not on the currently selected tab
+ return !isDifferent;
}
+ /**
+ * Check if two tabs have different domains
+ * @param {Tab} tab1 - First tab
+ * @param {nsIURI} url2 - Second URL
+ * @returns {boolean} True if domains differ
+ */
tabDomainsDiffer(tab1, url2) {
try {
if (!tab1) {
return true;
}
- let url1 = tab1.linkedBrowser.currentURI.spec;
+
+ const url1 = tab1.linkedBrowser.currentURI.spec;
if (url1.startsWith('about:')) {
return true;
}
- // https://github.com/zen-browser/desktop/issues/7173: Only glance up links that are http(s) or file
+
+ // Only glance up links that are http(s) or file
+ // https://github.com/zen-browser/desktop/issues/7173
const url2Spec = url2.spec;
- if (
- !url2Spec.startsWith('http') &&
- !url2Spec.startsWith('https') &&
- !url2Spec.startsWith('file')
- ) {
+ if (!this.#isValidGlanceUrl(url2Spec)) {
return false;
}
+
return Services.io.newURI(url1).host !== url2.host;
} catch {
return true;
}
}
+ /**
+ * Check if URL is valid for glance
+ * @param {string} urlSpec - The URL spec
+ * @returns {boolean} True if valid
+ */
+ #isValidGlanceUrl(urlSpec) {
+ return (
+ urlSpec.startsWith('http') || urlSpec.startsWith('https') || urlSpec.startsWith('file')
+ );
+ }
+
+ /**
+ * Check if a tab should be opened in glance
+ * @param {Tab} tab - The tab to check
+ * @param {nsIURI} uri - The URI to check
+ * @returns {boolean} True if should open in glance
+ */
shouldOpenTabInGlance(tab, uri) {
- let owner = tab.owner;
+ const owner = tab.owner;
+
return (
owner &&
owner.pinned &&
@@ -576,86 +1337,138 @@
);
}
+ /**
+ * Handle tab open events
+ * @param {Browser} browser - The browser element
+ * @param {nsIURI} uri - The URI being opened
+ */
onTabOpen(browser, uri) {
- let tab = gBrowser.getTabForBrowser(browser);
+ const tab = gBrowser.getTabForBrowser(browser);
if (!tab) {
return;
}
+
try {
if (this.shouldOpenTabInGlance(tab, uri)) {
- const browserRect = gBrowser.tabbox.getBoundingClientRect();
- this.openGlance(
- {
- url: undefined,
- ...(gZenUIManager._lastClickPosition || {
- clientX: browserRect.width / 2,
- clientY: browserRect.height / 2,
- }),
- width: 0,
- height: 0,
- },
- tab,
- tab.owner
- );
+ this.#openGlanceForTab(tab);
}
} catch (e) {
- console.error(e);
+ console.error('Error opening glance for tab:', e);
}
}
+ /**
+ * Open glance for a specific tab
+ * @param {Tab} tab - The tab to open glance for
+ */
+ #openGlanceForTab(tab) {
+ const browserRect = window.windowUtils.getBoundsWithoutFlushing(gBrowser.tabbox);
+ const clickPosition = gZenUIManager._lastClickPosition || {
+ clientX: browserRect.width / 2,
+ clientY: browserRect.height / 2,
+ };
+
+ this.openGlance(
+ {
+ url: undefined,
+ ...clickPosition,
+ width: 0,
+ height: 0,
+ },
+ tab,
+ tab.owner
+ );
+ }
+
+ /**
+ * Finish opening glance and clean up
+ */
finishOpeningGlance() {
gBrowser.tabContainer._invalidateCachedTabs();
gZenWorkspaces.updateTabsContainers();
this.overlay.classList.remove('zen-glance-overlay');
- this._clearContainerStyles(this.browserWrapper);
+ this.#clearContainerStyles(this.browserWrapper);
this.animatingFullOpen = false;
this.closeGlance({ noAnimation: true, skipPermitUnload: true });
this.#glances.delete(this.#currentGlanceID);
}
+ /**
+ * Fully open glance (convert to regular tab)
+ * @param {Object} options - Options for full opening
+ * @param {boolean} options.forSplit - Whether this is for split view
+ */
async fullyOpenGlance({ forSplit = false } = {}) {
- // If there is no active glance, do nothing
if (!this.#currentGlanceID || !this.#currentTab) {
return;
}
+
this.animatingFullOpen = true;
this.#currentTab.setAttribute('zen-dont-split-glance', true);
+ this.#handleZenFolderPinning();
+ gBrowser.moveTabAfter(this.#currentTab, this.#currentParentTab);
+
+ const browserRect = window.windowUtils.getBoundsWithoutFlushing(this.browserWrapper);
+ this.#prepareTabForFullOpen();
+
+ const sidebarButtons = this.browserWrapper.querySelector('.zen-glance-sidebar-container');
+ if (sidebarButtons) {
+ sidebarButtons.remove();
+ }
+
+ if (forSplit) {
+ this.finishOpeningGlance();
+ return;
+ }
+
+ if (gReduceMotion) {
+ gZenViewSplitter.deactivateCurrentSplitView();
+ this.finishOpeningGlance();
+ return;
+ }
+
+ await this.#animateFullOpen(browserRect);
+ this.finishOpeningGlance();
+ }
+
+ /**
+ * Handle Zen folder pinning if applicable
+ */
+ #handleZenFolderPinning() {
const isZenFolder = this.#currentParentTab?.group?.isZenFolder;
if (Services.prefs.getBoolPref('zen.folders.owned-tabs-in-folder') && isZenFolder) {
gBrowser.pinTab(this.#currentTab);
}
+ }
- gBrowser.moveTabAfter(this.#currentTab, this.#currentParentTab);
-
- const browserRect = window.windowUtils.getBoundsWithoutFlushing(this.browserWrapper);
+ /**
+ * Prepare tab for full opening
+ */
+ #prepareTabForFullOpen() {
this.#currentTab.removeAttribute('zen-glance-tab');
- this._clearContainerStyles(this.browserWrapper);
+ this.#clearContainerStyles(this.browserWrapper);
this.#currentTab.removeAttribute('glance-id');
this.#currentParentTab.removeAttribute('glance-id');
gBrowser.selectedTab = this.#currentTab;
+
this.#currentParentTab.linkedBrowser
.closest('.browserSidebarContainer')
.classList.remove('zen-glance-background');
this.#currentParentTab._visuallySelected = false;
gBrowser.TabStateFlusher.flush(this.#currentTab.linkedBrowser);
- const sidebarButtons = this.browserWrapper.querySelector('.zen-glance-sidebar-container');
- if (sidebarButtons) {
- sidebarButtons.remove();
- }
- if (forSplit) {
- this.finishOpeningGlance();
- return;
- }
- if (gReduceMotion || forSplit) {
- gZenViewSplitter.deactivateCurrentSplitView();
- this.finishOpeningGlance();
- return;
- }
- // Write the styles early to avoid flickering
+ }
+
+ /**
+ * Animate the full opening process
+ * @param {Object} browserRect - The browser rectangle
+ */
+ async #animateFullOpen(browserRect) {
+ // Write styles early to avoid flickering
this.browserWrapper.style.opacity = 1;
this.browserWrapper.style.width = `${browserRect.width}px`;
this.browserWrapper.style.height = `${browserRect.height}px`;
+
await gZenUIManager.motion.animate(
this.browserWrapper,
{
@@ -668,67 +1481,119 @@
bounce: 0,
}
);
+
this.browserWrapper.style.width = '';
this.browserWrapper.style.height = '';
this.browserWrapper.style.opacity = '';
gZenViewSplitter.deactivateCurrentSplitView({ removeDeckSelected: true });
- this.finishOpeningGlance();
}
+ /**
+ * Open glance for bookmark activation
+ * @param {Event} event - The bookmark click event
+ * @returns {boolean} False to prevent default behavior
+ */
openGlanceForBookmark(event) {
const activationMethod = Services.prefs.getStringPref('zen.glance.activation-method', 'ctrl');
- if (activationMethod === 'ctrl' && !event.ctrlKey) {
- return;
- } else if (activationMethod === 'alt' && !event.altKey) {
- return;
- } else if (activationMethod === 'shift' && !event.shiftKey) {
- return;
- } else if (activationMethod === 'meta' && !event.metaKey) {
- return;
- } else if (activationMethod === 'mantain' || typeof activationMethod === 'undefined') {
+ if (!this.#isActivationKeyPressed(event, activationMethod)) {
return;
}
event.preventDefault();
event.stopPropagation();
- const rect = event.target.getBoundingClientRect();
- const data = {
- url: event.target._placesNode.uri,
- clientX: rect.left,
- clientY: rect.top,
- width: rect.width,
- height: rect.height,
- };
-
+ const data = this.#createGlanceDataFromBookmark(event);
this.openGlance(data);
return false;
}
+ /**
+ * Check if the correct activation key is pressed
+ * @param {Event} event - The event
+ * @param {string} activationMethod - The activation method
+ * @returns {boolean} True if key is pressed
+ */
+ #isActivationKeyPressed(event, activationMethod) {
+ const keyMap = {
+ ctrl: event.ctrlKey,
+ alt: event.altKey,
+ shift: event.shiftKey,
+ meta: event.metaKey,
+ };
+
+ return keyMap[activationMethod] || false;
+ }
+
+ /**
+ * Create glance data from bookmark event
+ * @param {Event} event - The bookmark event
+ * @returns {Object} Glance data object
+ */
+ #createGlanceDataFromBookmark(event) {
+ const rect = window.windowUtils.getBoundsWithoutFlushing(event.target);
+ const tabPanelRect = window.windowUtils.getBoundsWithoutFlushing(gBrowser.tabpanels);
+ // the bookmark is most likely outisde the tabpanel, so we need to give a negative number
+ // so it can be corrected later
+ let top = rect.top - tabPanelRect.top;
+ let left = rect.left - tabPanelRect.left;
+ return {
+ url: event.target._placesNode.uri,
+ clientX: left,
+ clientY: top,
+ width: rect.width,
+ height: rect.height,
+ };
+ }
+
+ /**
+ * Get the focused tab based on direction
+ * @param {number} aDir - Direction (-1 for parent, 1 for current)
+ * @returns {Tab} The focused tab
+ */
getFocusedTab(aDir) {
return aDir < 0 ? this.#currentParentTab : this.#currentTab;
}
+ /**
+ * Split the current glance into a split view
+ */
async splitGlance() {
- if (this.#currentGlanceID) {
- const currentTab = this.#currentTab;
- const currentParentTab = this.#currentParentTab;
+ if (!this.#currentGlanceID) {
+ return;
+ }
- const isZenFolder = currentParentTab?.group?.isZenFolder;
- if (Services.prefs.getBoolPref('zen.folders.owned-tabs-in-folder') && isZenFolder) {
- gBrowser.pinTab(currentTab);
- }
- await this.fullyOpenGlance({ forSplit: true });
- gZenViewSplitter.splitTabs([currentTab, currentParentTab], 'vsep', 1);
- const browserContainer = currentTab.linkedBrowser?.closest('.browserSidebarContainer');
- if (!gReduceMotion && browserContainer) {
- gZenViewSplitter.animateBrowserDrop(browserContainer);
- }
+ const currentTab = this.#currentTab;
+ const currentParentTab = this.#currentParentTab;
+
+ this.#handleZenFolderPinningForSplit(currentParentTab);
+ await this.fullyOpenGlance({ forSplit: true });
+
+ gZenViewSplitter.splitTabs([currentTab, currentParentTab], 'vsep', 1);
+
+ const browserContainer = currentTab.linkedBrowser?.closest('.browserSidebarContainer');
+ if (!gReduceMotion && browserContainer) {
+ gZenViewSplitter.animateBrowserDrop(browserContainer);
}
}
+ /**
+ * Handle Zen folder pinning for split view
+ * @param {Tab} parentTab - The parent tab
+ */
+ #handleZenFolderPinningForSplit(parentTab) {
+ const isZenFolder = parentTab?.group?.isZenFolder;
+ if (Services.prefs.getBoolPref('zen.folders.owned-tabs-in-folder') && isZenFolder) {
+ gBrowser.pinTab(this.#currentTab);
+ }
+ }
+
+ /**
+ * Get the tab or its glance parent
+ * @param {Tab} tab - The tab to check
+ * @returns {Tab} The tab or its parent
+ */
getTabOrGlanceParent(tab) {
if (tab?.hasAttribute('glance-id') && this.#glances) {
const parentTab = this.#glances.get(tab.getAttribute('glance-id'))?.parentTab;
@@ -739,52 +1604,89 @@
return tab;
}
+ /**
+ * Check if deck should remain selected
+ * @param {Element} currentPanel - Current panel
+ * @param {Element} oldPanel - Previous panel
+ * @returns {boolean} True if deck should remain selected
+ */
shouldShowDeckSelected(currentPanel, oldPanel) {
- // Dont remove if it's a glance background and current panel corresponds to a glance
const currentBrowser = currentPanel?.querySelector('browser');
const oldBrowser = oldPanel?.querySelector('browser');
+
if (!currentBrowser || !oldBrowser) {
return false;
}
+
const currentTab = gBrowser.getTabForBrowser(currentBrowser);
const oldTab = gBrowser.getTabForBrowser(oldBrowser);
- if (currentTab && oldTab) {
- const currentGlanceID = currentTab.getAttribute('glance-id');
- const oldGlanceID = oldTab.getAttribute('glance-id');
- if (currentGlanceID && oldGlanceID) {
- return (
- currentGlanceID === oldGlanceID && oldPanel.classList.contains('zen-glance-background')
- );
- }
+
+ if (!currentTab || !oldTab) {
+ return false;
}
+
+ const currentGlanceID = currentTab.getAttribute('glance-id');
+ const oldGlanceID = oldTab.getAttribute('glance-id');
+
+ if (currentGlanceID && oldGlanceID) {
+ return (
+ currentGlanceID === oldGlanceID && oldPanel.classList.contains('zen-glance-background')
+ );
+ }
+
return false;
}
+ /**
+ * Handle search select command
+ * @param {string} where - Where to open the search result
+ */
onSearchSelectCommand(where) {
- // Check if Glance is globally enabled and specifically enabled for contextmenu/search
- if (
- !Services.prefs.getBoolPref('zen.glance.enabled', false) ||
- !Services.prefs.getBoolPref('zen.glance.enable-contextmenu-search', true)
- ) {
+ if (!this.#isGlanceEnabledForSearch()) {
return;
}
+
if (where !== 'tab') {
return;
}
+
const currentTab = gBrowser.selectedTab;
const parentTab = currentTab.owner;
+
if (!parentTab || parentTab.hasAttribute('glance-id')) {
return;
}
- // Open a new glance if the current tab is a glance tab
- const browserRect = gBrowser.tabbox.getBoundingClientRect();
+
+ this.#openGlanceForSearch(currentTab, parentTab);
+ }
+
+ /**
+ * Check if glance is enabled for search
+ * @returns {boolean} True if enabled
+ */
+ #isGlanceEnabledForSearch() {
+ return (
+ Services.prefs.getBoolPref('zen.glance.enabled', false) &&
+ Services.prefs.getBoolPref('zen.glance.enable-contextmenu-search', true)
+ );
+ }
+
+ /**
+ * Open glance for search result
+ * @param {Tab} currentTab - Current tab
+ * @param {Tab} parentTab - Parent tab
+ */
+ #openGlanceForSearch(currentTab, parentTab) {
+ const browserRect = window.windowUtils.getBoundsWithoutFlushing(gBrowser.tabbox);
+ const clickPosition = gZenUIManager._lastClickPosition || {
+ clientX: browserRect.width / 2,
+ clientY: browserRect.height / 2,
+ };
+
this.openGlance(
{
url: undefined,
- ...(gZenUIManager._lastClickPosition || {
- clientX: browserRect.width / 2,
- clientY: browserRect.height / 2,
- }),
+ ...clickPosition,
width: 0,
height: 0,
},
@@ -796,6 +1698,9 @@
window.gZenGlanceManager = new nsZenGlanceManager();
+ /**
+ * Register window actors for glance functionality
+ */
function registerWindowActors() {
gZenActorsManager.addJSWindowActor('ZenGlance', {
parent: {
diff --git a/src/zen/glance/actors/ZenGlanceChild.sys.mjs b/src/zen/glance/actors/ZenGlanceChild.sys.mjs
index c1cb21a6e..d78805321 100644
--- a/src/zen/glance/actors/ZenGlanceChild.sys.mjs
+++ b/src/zen/glance/actors/ZenGlanceChild.sys.mjs
@@ -2,11 +2,10 @@
// 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/.
export class ZenGlanceChild extends JSWindowActorChild {
+ #activationMethod;
+
constructor() {
super();
-
- this.mouseUpListener = this.handleMouseUp.bind(this);
- this.mouseDownListener = this.handleMouseDown.bind(this);
this.clickListener = this.handleClick.bind(this);
}
@@ -22,51 +21,34 @@ export class ZenGlanceChild extends JSWindowActorChild {
}
}
- async getActivationMethod() {
- if (this._activationMethod === undefined) {
- this._activationMethod = await this.sendQuery('ZenGlance:GetActivationMethod');
- }
- return this._activationMethod;
- }
-
- async getHoverActivationDelay() {
- if (this._hoverActivationDelay === undefined) {
- this._hoverActivationDelay = await this.sendQuery('ZenGlance:GetHoverActivationDelay');
- }
- return this._hoverActivationDelay;
+ async #initActivationMethod() {
+ this.#activationMethod = await this.sendQuery('ZenGlance:GetActivationMethod');
}
async initiateGlance() {
this.mouseIsDown = false;
- const activationMethod = await this.getActivationMethod();
- if (activationMethod === 'mantain') {
- this.contentWindow.addEventListener('mousedown', this.mouseDownListener);
- this.contentWindow.addEventListener('mouseup', this.mouseUpListener);
-
- this.contentWindow.document.removeEventListener('click', this.clickListener);
- } else if (
- activationMethod === 'ctrl' ||
- activationMethod === 'alt' ||
- activationMethod === 'shift'
- ) {
- this.contentWindow.document.addEventListener('click', this.clickListener, { capture: true });
-
- this.contentWindow.removeEventListener('mousedown', this.mouseDownListener);
- this.contentWindow.removeEventListener('mouseup', this.mouseUpListener);
- }
+ await this.#initActivationMethod();
+ this.contentWindow.document.addEventListener('click', this.clickListener, { capture: true });
}
ensureOnlyKeyModifiers(event) {
return !(event.ctrlKey ^ event.altKey ^ event.shiftKey ^ event.metaKey);
}
- openGlance(target) {
+ openGlance(target, originalTarget) {
let url = target.href;
// Add domain to relative URLs
if (!url.match(/^(?:[a-z]+:)?\/\//i)) {
url = this.contentWindow.location.origin + url;
}
- const rect = target.getBoundingClientRect();
+ // Get the largest element we can get. If the `A` element
+ // is a parent of the original target, use the anchor element,
+ // otherwise use the original target.
+ let rect = originalTarget.getBoundingClientRect();
+ const anchorRect = target.getBoundingClientRect();
+ if (anchorRect.width * anchorRect.height > rect.width * rect.height) {
+ rect = anchorRect;
+ }
this.sendAsyncMessage('ZenGlance:OpenGlance', {
url,
clientX: rect.left,
@@ -76,35 +58,11 @@ export class ZenGlanceChild extends JSWindowActorChild {
});
}
- handleMouseUp(event) {
- if (this.hasClicked) {
- event.preventDefault();
- event.stopPropagation();
- this.hasClicked = false;
- }
- this.mouseIsDown = null;
- }
-
- async handleMouseDown(event) {
- const target = event.target.closest('A');
- if (!target) {
- return;
- }
- this.mouseIsDown = target;
- const hoverActivationDelay = await this.getHoverActivationDelay();
- this.contentWindow.setTimeout(() => {
- if (this.mouseIsDown === target) {
- this.hasClicked = true;
- this.openGlance(target);
- }
- }, hoverActivationDelay);
- }
-
handleClick(event) {
if (this.ensureOnlyKeyModifiers(event) || event.button !== 0 || event.defaultPrevented) {
return;
}
- const activationMethod = this._activationMethod;
+ const activationMethod = this.#activationMethod;
if (activationMethod === 'ctrl' && !event.ctrlKey) {
return;
} else if (activationMethod === 'alt' && !event.altKey) {
@@ -113,8 +71,6 @@ export class ZenGlanceChild extends JSWindowActorChild {
return;
} else if (activationMethod === 'meta' && !event.metaKey) {
return;
- } else if (activationMethod === 'mantain' || typeof activationMethod === 'undefined') {
- return;
}
// get closest A element
const target = event.target.closest('A');
@@ -122,7 +78,7 @@ export class ZenGlanceChild extends JSWindowActorChild {
event.preventDefault();
event.stopPropagation();
- this.openGlance(target);
+ this.openGlance(target, event.originalTarget || event.target);
}
}
diff --git a/src/zen/glance/actors/ZenGlanceParent.sys.mjs b/src/zen/glance/actors/ZenGlanceParent.sys.mjs
index b6d5c9b12..2bc025df9 100644
--- a/src/zen/glance/actors/ZenGlanceParent.sys.mjs
+++ b/src/zen/glance/actors/ZenGlanceParent.sys.mjs
@@ -11,9 +11,6 @@ export class ZenGlanceParent extends JSWindowActorParent {
case 'ZenGlance:GetActivationMethod': {
return Services.prefs.getStringPref('zen.glance.activation-method', 'ctrl');
}
- case 'ZenGlance:GetHoverActivationDelay': {
- return Services.prefs.getIntPref('zen.glance.hold-duration', 500);
- }
case 'ZenGlance:OpenGlance': {
this.openGlance(this.browsingContext.topChromeWindow, message.data);
break;
@@ -32,6 +29,6 @@ export class ZenGlanceParent extends JSWindowActorParent {
}
openGlance(window, data) {
- window.gZenGlanceManager.openGlance(data);
+ return window.gZenGlanceManager.openGlance(data);
}
}
diff --git a/src/zen/glance/zen-glance.css b/src/zen/glance/zen-glance.css
index f59f20b79..b35e16758 100644
--- a/src/zen/glance/zen-glance.css
+++ b/src/zen/glance/zen-glance.css
@@ -14,11 +14,11 @@
gap: 12px;
max-width: 56px;
- :root[zen-right-side='true'] & {
+ :root:not([zen-right-side='true']) & {
left: 100%;
}
- :root:not([zen-right-side='true']) & {
+ :root[zen-right-side='true'] & {
right: 100%;
}
@@ -98,12 +98,15 @@
--zen-element-separation: 6px;
}
-.browserSidebarContainer.zen-glance-background,
-.browserSidebarContainer.zen-glance-overlay .browserContainer {
- border-radius: var(--zen-native-inner-radius);
+.browserSidebarContainer.zen-glance-background {
box-shadow: var(--zen-big-shadow);
}
+.browserSidebarContainer.zen-glance-background,
+.browserSidebarContainer.zen-glance-overlay .browserContainer:not([fade-out='true']) {
+ border-radius: var(--zen-native-inner-radius);
+}
+
.browserSidebarContainer.zen-glance-overlay {
box-shadow: none !important;
visibility: inherit;
@@ -116,14 +119,19 @@
}
& .browserContainer {
- background: light-dark(rgb(255, 255, 255), rgb(32, 32, 32));
+ transform: translate(-50%, -50%);
position: fixed;
- opacity: 0;
top: 0;
left: 0;
flex: unset !important;
/* Promote to its own layer during transitions to reduce jank */
- will-change: transform, opacity, top, left, width, height;
+ will-change: transform, top, left;
+ width: 85%;
+ height: 100%;
+
+ &:not([has-finished-animation='true']) #statuspanel {
+ display: none;
+ }
&[has-finished-animation='true'] {
position: relative !important;
@@ -137,13 +145,13 @@
& .browserStack {
border-radius: var(--zen-native-inner-radius);
overflow: hidden;
+ box-shadow: var(--zen-big-shadow);
}
& browser {
+ background: light-dark(rgb(255, 255, 255), rgb(32, 32, 32)) !important;
width: 100%;
height: 100%;
- opacity: 1;
- transition: opacity 0.2s ease-in-out;
}
&[animate='true'] {
@@ -152,9 +160,21 @@
}
&[fade-out='true'] {
- & browser {
- transition: opacity 0.2s ease;
+ & .browserStack {
+ transition: opacity 0.15s ease-in-out;
opacity: 0;
}
}
}
+
+.zen-glance-element-preview {
+ position: absolute;
+ pointer-events: none;
+ width: 100%;
+ height: 100%;
+ z-index: 0;
+ border-radius: var(--zen-native-inner-radius);
+ inset: 50%;
+ translate: -50% -50%;
+ will-change: transform, opacity;
+}
diff --git a/src/zen/kbs/ZenKeyboardShortcuts.mjs b/src/zen/kbs/ZenKeyboardShortcuts.mjs
index 38d26448a..0fb29b239 100644
--- a/src/zen/kbs/ZenKeyboardShortcuts.mjs
+++ b/src/zen/kbs/ZenKeyboardShortcuts.mjs
@@ -302,7 +302,6 @@ class KeyShortcut {
#disabled = false;
#reserved = false;
#internal = false;
- #shouldBeEmpty = false;
constructor(
id,
@@ -404,16 +403,11 @@ class KeyShortcut {
}
set shouldBeEmpty(value) {
- this.#shouldBeEmpty = value;
if (value) {
this.clearKeybind();
}
}
- get shouldBeEmpty() {
- return this.#shouldBeEmpty;
- }
-
toXHTMLElement(window) {
let key = window.document.createXULElement('key');
return this.replaceWithChild(key);
@@ -691,17 +685,6 @@ class nsZenKeyboardShortcutsLoader {
'zen-compact-mode-shortcut-show-sidebar'
)
);
- newShortcutList.push(
- new KeyShortcut(
- 'zen-compact-mode-show-toolbar',
- 'T',
- '',
- ZEN_COMPACT_MODE_SHORTCUTS_GROUP,
- nsKeyShortcutModifiers.fromObject({ accel: true, alt: true }),
- 'cmd_zenCompactModeShowToolbar',
- 'zen-compact-mode-shortcut-show-toolbar'
- )
- );
// Workspace shortcuts
for (let i = 10; i > 0; i--) {
@@ -816,7 +799,7 @@ class nsZenKeyboardShortcutsLoader {
}
class nsZenKeyboardShortcutsVersioner {
- static LATEST_KBS_VERSION = 11;
+ static LATEST_KBS_VERSION = 12;
constructor() {}
@@ -865,7 +848,7 @@ class nsZenKeyboardShortcutsVersioner {
return newData;
}
- console.error('Unknown keyboar shortcuts version');
+ console.error('Unknown keyboard shortcuts version');
this.version = 0;
return this.migrateIfNeeded(data);
}
@@ -884,17 +867,6 @@ class nsZenKeyboardShortcutsVersioner {
// Apply migrations and ensure defaults exist
let out = this.fillDefaultIfNotPresent(this.migrateIfNeeded(data));
- // Hard-remove deprecated or conflicting defaults regardless of version
- // - Remove the built-in "Open File" keybinding; menu item remains available
- // - Remove default "Bookmark All Tabs" keybinding (Ctrl+Shift+D) to avoid conflict
- // - Remove "Stop" keybinding to avoid conflict with Firefox's built-in binding
- const shouldBeEmptyShortcuts = ['openFileKb', 'bookmarkAllTabsKb', 'key_stop'];
- for (let shortcut of out) {
- if (shouldBeEmptyShortcuts.includes(shortcut.getID?.())) {
- shortcut.shouldBeEmpty = true;
- }
- }
-
return out;
}
@@ -1024,7 +996,6 @@ class nsZenKeyboardShortcutsVersioner {
const commandMap = {
'zen-compact-mode-toggle': 'cmd_zenCompactModeToggle',
'zen-compact-mode-show-sidebar': 'cmd_zenCompactModeShowSidebar',
- 'zen-compact-mode-show-toolbar': 'cmd_zenCompactModeShowToolbar',
'zen-workspace-forward': 'cmd_zenWorkspaceForward',
'zen-workspace-backward': 'cmd_zenWorkspaceBackward',
'zen-split-view-grid': 'cmd_zenSplitViewGrid',
@@ -1084,7 +1055,7 @@ class nsZenKeyboardShortcutsVersioner {
data.push(
new KeyShortcut(
'zen-new-empty-split-view',
- AppConstants.platform == 'linux' ? '*' : '+',
+ AppConstants.platform == 'macosx' ? '+' : '*',
'',
ZEN_SPLIT_VIEW_SHORTCUTS_GROUP,
nsKeyShortcutModifiers.fromObject({ accel: true, shift: true }),
@@ -1093,6 +1064,23 @@ class nsZenKeyboardShortcutsVersioner {
)
);
}
+
+ if (version < 12) {
+ // Hard-remove deprecated or conflicting defaults regardless of version
+ // - Remove the built-in "Open File" keybinding; menu item remains available
+ // - Remove default "Bookmark All Tabs" keybinding (Ctrl+Shift+D) to avoid conflict
+ // - Remove "Stop" keybinding to avoid conflict with Firefox's built-in binding
+ const shouldBeEmptyShortcuts = ['openFileKb', 'bookmarkAllTabsKb', 'key_stop'];
+ for (let shortcut of data) {
+ if (shouldBeEmptyShortcuts.includes(shortcut.getID?.())) {
+ shortcut.shouldBeEmpty = true;
+ }
+ }
+
+ // Also remove zen-compact-mode-show-toolbar
+ data = data.filter((shortcut) => shortcut.getID() != 'zen-compact-mode-show-toolbar');
+ }
+
return data;
}
}
@@ -1355,11 +1343,16 @@ var gZenKeyboardShortcutsManager = {
targetShortcut.getModifiers().equals(modifiers) &&
targetShortcut.getKeyNameOrCode()?.toLowerCase() == realShortcut
) {
- return true;
+ return {
+ hasConflicts: true,
+ conflictShortcut: targetShortcut,
+ };
}
}
- return false;
+ return {
+ hasConflicts: false,
+ };
},
getShortcutFromCommand(command) {
diff --git a/src/zen/media/zen-media-controls.css b/src/zen/media/zen-media-controls.css
index 54450aec8..d65e9e1b0 100644
--- a/src/zen/media/zen-media-controls.css
+++ b/src/zen/media/zen-media-controls.css
@@ -108,6 +108,10 @@
transform: translateY(0) !important;
pointer-events: auto;
}
+
+ & #zen-media-info-vbox label[overflow] {
+ animation: zen-back-and-forth-text 10s infinite ease-in-out;
+ }
}
& #zen-media-focus-button::after {
@@ -255,10 +259,6 @@
margin-left: 0;
font-weight: 500;
position: relative; /* For the animation */
-
- &[overflow] {
- animation: zen-back-and-forth-text 10s infinite ease-in-out;
- }
}
}
diff --git a/src/zen/split-view/ZenViewSplitter.mjs b/src/zen/split-view/ZenViewSplitter.mjs
index 2dd3c6424..9e8436691 100644
--- a/src/zen/split-view/ZenViewSplitter.mjs
+++ b/src/zen/split-view/ZenViewSplitter.mjs
@@ -958,10 +958,7 @@ class nsZenViewSplitter extends nsZenDOMOperatedFeature {
* @returns {Element} The tab browser panel.
*/
get tabBrowserPanel() {
- if (!this._tabBrowserPanel) {
- this._tabBrowserPanel = document.getElementById('tabbrowser-tabpanels');
- }
- return this._tabBrowserPanel;
+ return gBrowser.tabpanels;
}
get splitViewActive() {
diff --git a/src/zen/tabs/ZenPinnedTabManager.mjs b/src/zen/tabs/ZenPinnedTabManager.mjs
index 4366090a2..263387736 100644
--- a/src/zen/tabs/ZenPinnedTabManager.mjs
+++ b/src/zen/tabs/ZenPinnedTabManager.mjs
@@ -38,6 +38,12 @@
'zen.pinned-tab-manager.close-shortcut-behavior',
'switch'
);
+ XPCOMUtils.defineLazyPreferenceGetter(
+ lazy,
+ 'zenTabsEssentialsMax',
+ 'zen.tabs.essentials.max',
+ 12
+ );
ChromeUtils.defineESModuleGetters(lazy, {
E10SUtils: 'resource://gre/modules/E10SUtils.sys.mjs',
});
@@ -68,8 +74,6 @@
}
class nsZenPinnedTabManager extends nsZenDOMOperatedFeature {
- MAX_ESSENTIALS_TABS = 12;
-
hasInitializedPins = false;
promiseInitializedPinned = new Promise((resolve) => {
this._resolvePinnedInitializedInternal = resolve;
@@ -141,6 +145,10 @@
return !gZenWorkspaces.privateWindowOrDisabled;
}
+ get maxEssentialTabs() {
+ return lazy.zenTabsEssentialsMax;
+ }
+
async refreshPinnedTabs({ init = false } = {}) {
if (!this.enabled) {
return;
@@ -632,7 +640,7 @@
async _onTabClick(e) {
const tab = e.target?.closest('tab');
if (e.button === 1 && tab) {
- await this._onCloseTabShortcut(e, tab, {
+ await this.onCloseTabShortcut(e, tab, {
closeIfPending: Services.prefs.getBoolPref(
'zen.pinned-tab-manager.wheel-close-if-pending'
),
@@ -762,7 +770,7 @@
let cmdClose = document.getElementById('cmd_close');
if (cmdClose) {
- cmdClose.addEventListener('command', this._onCloseTabShortcut.bind(this));
+ cmdClose.addEventListener('command', this.onCloseTabShortcut.bind(this));
}
}
@@ -781,20 +789,38 @@
await ZenPinnedTabsStorage.savePin(pin, notifyObservers);
}
- async _onCloseTabShortcut(
+ async onCloseTabShortcut(
event,
selectedTab = gBrowser.selectedTab,
{
behavior = lazy.zenPinnedTabCloseShortcutBehavior,
noClose = false,
closeIfPending = false,
+ alwaysUnload = false,
+ folderToUnload = null,
} = {}
) {
try {
- if (!selectedTab?.pinned) {
+ const tabs = Array.isArray(selectedTab) ? selectedTab : [selectedTab];
+ const pinnedTabs = [
+ ...new Set(
+ tabs
+ .flatMap((tab) => {
+ if (tab.group?.hasAttribute('split-view-group')) {
+ return tab.group.tabs;
+ }
+ return tab;
+ })
+ .filter((tab) => tab?.pinned)
+ ),
+ ];
+
+ if (!pinnedTabs.length) {
return;
}
+ const selectedTabs = pinnedTabs.filter((tab) => tab.selected);
+
event.stopPropagation();
event.preventDefault();
@@ -802,66 +828,82 @@
behavior = 'unload-switch';
}
+ if (alwaysUnload && ['close', 'reset', 'switch', 'reset-switch'].includes(behavior)) {
+ behavior = behavior.contains('reset') ? 'reset-unload-switch' : 'unload-switch';
+ }
+
switch (behavior) {
- case 'close':
- this._removePinnedAttributes(selectedTab, true);
- gBrowser.removeTab(selectedTab, { animate: true });
+ case 'close': {
+ for (const tab of pinnedTabs) {
+ this._removePinnedAttributes(tab, true);
+ gBrowser.removeTab(tab, { animate: true });
+ }
break;
+ }
case 'reset-unload-switch':
case 'unload-switch':
case 'reset-switch':
case 'switch':
if (behavior.includes('unload')) {
- if (selectedTab.hasAttribute('glance-id')) {
- // We have a glance tab inside the tab we are trying to unload,
- // before we used to just ignore it but now we need to fully close
- // it as well.
- gZenGlanceManager.manageTabClose(selectedTab.glanceTab);
- await new Promise((resolve) => {
- let hasRan = false;
- const onGlanceClose = () => {
- hasRan = true;
- resolve();
- };
- window.addEventListener('GlanceClose', onGlanceClose, { once: true });
- // Set a timeout to resolve the promise if the event doesn't fire.
- // We do this to prevent any future issues where glance woudnt close such as
- // glance requering to ask for permit unload.
- setTimeout(() => {
- if (!hasRan) {
- console.warn('GlanceClose event did not fire within 3 seconds');
+ for (const tab of pinnedTabs) {
+ if (tab.hasAttribute('glance-id')) {
+ // We have a glance tab inside the tab we are trying to unload,
+ // before we used to just ignore it but now we need to fully close
+ // it as well.
+ gZenGlanceManager.manageTabClose(tab.glanceTab);
+ await new Promise((resolve) => {
+ let hasRan = false;
+ const onGlanceClose = () => {
+ hasRan = true;
resolve();
- }
- }, 3000);
- });
+ };
+ window.addEventListener('GlanceClose', onGlanceClose, { once: true });
+ // Set a timeout to resolve the promise if the event doesn't fire.
+ // We do this to prevent any future issues where glance woudnt close such as
+ // glance requering to ask for permit unload.
+ setTimeout(() => {
+ if (!hasRan) {
+ console.warn('GlanceClose event did not fire within 3 seconds');
+ resolve();
+ }
+ }, 3000);
+ });
+ }
+ const isSpltView = tab.group?.hasAttribute('split-view-group');
+ const group = isSpltView ? tab.group.group : tab.group;
+ if (!folderToUnload && tab.hasAttribute('folder-active')) {
+ await gZenFolders.animateUnload(group, tab);
+ }
}
- await gZenFolders.collapseVisibleTab(
- selectedTab.group,
- /* only if active */ true,
- selectedTab
- );
- let tabsToUnload = [selectedTab];
- if (selectedTab.group?.hasAttribute('split-view-group')) {
- tabsToUnload = selectedTab.group.tabs;
+ if (folderToUnload) {
+ await gZenFolders.animateUnloadAll(folderToUnload);
}
- const allAreUnloaded = tabsToUnload.every(
+ const allAreUnloaded = pinnedTabs.every(
(tab) => tab.hasAttribute('pending') && !tab.hasAttribute('zen-essential')
);
- if (allAreUnloaded && closeIfPending) {
- return await this._onCloseTabShortcut(event, selectedTab, { behavior: 'close' });
+ for (const tab of pinnedTabs) {
+ if (allAreUnloaded && closeIfPending) {
+ return await this._onCloseTabShortcut(event, tab, { behavior: 'close' });
+ }
+ }
+ await gBrowser.explicitUnloadTabs(pinnedTabs);
+ for (const tab of pinnedTabs) {
+ tab.removeAttribute('discarded');
}
- await gBrowser.explicitUnloadTabs(tabsToUnload);
- selectedTab.removeAttribute('discarded');
}
- if (selectedTab.selected) {
- this._handleTabSwitch(selectedTab);
+ if (selectedTabs.length) {
+ this._handleTabSwitch(selectedTabs[0]);
}
if (behavior.includes('reset')) {
- this._resetTabToStoredState(selectedTab);
+ for (const tab of pinnedTabs) {
+ this._resetTabToStoredState(tab);
+ }
}
break;
case 'reset':
- this._resetTabToStoredState(selectedTab);
+ for (const tab of pinnedTabs) {
+ this._resetTabToStoredState(tab);
+ }
break;
default:
return;
@@ -1056,7 +1098,7 @@
const element = window.MozXULElement.parseXULToFragment(`
@@ -1082,6 +1124,7 @@
contextTab.getAttribute('zen-essential') || !!contextTab.group;
document.l10n.setArgs(document.getElementById('context_zen-add-essential'), {
num: gBrowser._numZenEssentials,
+ max: this.maxEssentialTabs,
});
document
.getElementById('cmd_contextZenAddToEssentials')
@@ -1271,7 +1314,7 @@
let isVisible = true;
let parent = item.group;
while (parent) {
- if (parent.collapsed && !parent.hasAttribute('has-active')) {
+ if (!parent.visible) {
isVisible = false;
break;
}
@@ -1405,7 +1448,7 @@
(tab.getAttribute('usercontextid') || 0) !=
gZenWorkspaces.getActiveWorkspaceFromCache().containerTabId &&
gZenWorkspaces.containerSpecificEssentials
- ) && gBrowser._numZenEssentials < this.MAX_ESSENTIALS_TABS
+ ) && gBrowser._numZenEssentials < this.maxEssentialTabs
);
}
diff --git a/src/zen/tabs/zen-tabs.css b/src/zen/tabs/zen-tabs.css
index bfd25a1ff..a195b4e44 100644
--- a/src/zen/tabs/zen-tabs.css
+++ b/src/zen/tabs/zen-tabs.css
@@ -36,9 +36,7 @@
* - Bookmarks toolbar is visible OR
* - The container is explicitly marked to hide controls (e.g., on Linux with reversed controls)
*/
- &:has(#PersonalToolbar:not([collapsed])) {
-%include zen-tabs/vertical-tabs-topbar.inc.css
- }
+ :root[zen-has-bookmarks] &,
&[should-hide='true'] {
%include zen-tabs/vertical-tabs-topbar.inc.css
}
@@ -108,4 +106,11 @@
/* Include common fixes for this top-button scenario */
%include zen-tabs/vertical-tabs-topbuttons-fix.css
}
+
+ &:not([zen-right-side='true']):not([zen-sidebar-expanded='true']):not([zen-window-buttons-reversed='true']),
+ &[zen-right-side='true']:not([zen-sidebar-expanded='true'])[zen-window-buttons-reversed='true'] {
+ & #titlebar {
+ padding-top: var(--zen-toolbar-height);
+ }
+ }
}
\ No newline at end of file
diff --git a/src/zen/tabs/zen-tabs/vertical-tabs-topbar.inc.css b/src/zen/tabs/zen-tabs/vertical-tabs-topbar.inc.css
index 5bd8997da..791d52044 100644
--- a/src/zen/tabs/zen-tabs/vertical-tabs-topbar.inc.css
+++ b/src/zen/tabs/zen-tabs/vertical-tabs-topbar.inc.css
@@ -3,39 +3,36 @@
* 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-toolbar-height: 34px;
+
height: var(--zen-toolbar-height);
z-index: 1;
#zen-appcontent-navbar-container {
display: flex;
+ min-height: var(--zen-toolbar-height);
}
@media -moz-pref('zen.view.hide-window-controls') {
- & {
- transition:
- height 0.15s ease,
- opacity 0.1s ease-out;
- transition-delay: 0.2s;
+ transition: height var(--zen-hidden-toolbar-transition), opacity var(--zen-hidden-toolbar-transition);
+ will-change: height, opacity;
+ transition-delay: 0.2s;
+ overflow: clip;
- & > * {
- transition: opacity 0.2s ease-out;
- transition-delay: 0.2s;
- }
- }
+%include ../../compact-mode/windows-captions-fix-active.inc.css
&:not([zen-has-hover='true']):not([has-popup-menu]):not(:focus-within):not(
:has(*:is([panelopen='true'], [open='true']))
) {
- transition-delay: 0.2s;
- /* In order to still use it on fullscreen, even if it's 0px, add .1px (almost invisible) */
- height: calc(var(--zen-element-separation) + 0.1px);
- overflow: hidden;
+ height: var(--zen-element-separation);
opacity: 0;
- & > * {
- opacity: 0;
+ & #zen-appcontent-navbar-container {
pointer-events: none;
}
+%include ../../compact-mode/windows-captions-fix-default.inc.css
+
& .titlebar-button {
padding-top: 0 !important;
padding-bottom: 0 !important;
@@ -43,7 +40,7 @@ z-index: 1;
}
@media -moz-pref('zen.view.experimental-no-window-controls') {
- &:has(#PersonalToolbar[collapsed]) {
+ :root:not([zen-has-bookmarks]) & {
max-height: 0 !important;
overflow: hidden;
opacity: 0 !important;
diff --git a/src/zen/tabs/zen-tabs/vertical-tabs-topbuttons-fix.css b/src/zen/tabs/zen-tabs/vertical-tabs-topbuttons-fix.css
index 4ebaa0bca..4d0d8e534 100644
--- a/src/zen/tabs/zen-tabs/vertical-tabs-topbuttons-fix.css
+++ b/src/zen/tabs/zen-tabs/vertical-tabs-topbuttons-fix.css
@@ -6,7 +6,10 @@
&:not([zen-compact-animating])
#zen-sidebar-top-buttons:not(
- :has(#zen-sidebar-top-buttons-customization-target > *:not(#zen-sidebar-top-buttons-separator))
+ :has(
+ #zen-sidebar-top-buttons-customization-target > *:not(#zen-sidebar-top-buttons-separator),
+ .titlebar-buttonbox-container
+ )
) {
max-height: 0 !important;
min-height: 0 !important;
diff --git a/src/zen/tabs/zen-tabs/vertical-tabs.css b/src/zen/tabs/zen-tabs/vertical-tabs.css
index 0012ebfd6..90901c862 100644
--- a/src/zen/tabs/zen-tabs/vertical-tabs.css
+++ b/src/zen/tabs/zen-tabs/vertical-tabs.css
@@ -20,7 +20,8 @@
width: 100%;
}
-#pinned-drop-indicator {
+#pinned-drop-indicator,
+#drag-to-pin-promo-card {
/* We dont use this firefox feature */
display: none !important;
}
@@ -29,12 +30,6 @@
Single Toolbar Mode Specific Styles (`zen-single-toolbar='true'`)
========================================================================== */
:root[zen-single-toolbar='true'] {
- & #zen-appcontent-navbar-wrapper,
- & #zen-sidebar-top-buttons {
- --zen-toolbar-height: 32px;
- height: var(--zen-toolbar-height);
- }
-
@media (-moz-platform: macos) and (not -moz-pref('zen.view.mac.show-three-dot-menu')) {
&:not([customizing]) #PanelUI-button:not([open]):not([panelopen]) {
position: absolute;
@@ -43,6 +38,11 @@
}
}
+ & #zen-appcontent-navbar-wrapper,
+ & #zen-sidebar-top-buttons {
+ height: var(--zen-toolbar-height);
+ }
+
& #zen-sidebar-top-buttons-separator {
width: 100%;
}
@@ -60,18 +60,8 @@
&:root[zen-right-side='true'] #zen-sidebar-top-buttons .titlebar-buttonbox-container {
margin-right: calc(-1 * var(--zen-toolbox-padding));
- margin-top: -10px;
- height: calc(4px + var(--zen-toolbar-height)) !important;
-
- & .titlebar-button {
- align-items: end;
- }
}
}
-
- #tabbrowser-arrowscrollbox {
- min-height: fit-content !important;
- }
}
:root[zen-window-buttons-reversed='true'] .titlebar-buttonbox-container {
@@ -126,6 +116,9 @@
& #zen-sidebar-top-buttons {
margin: var(--zen-toolbox-padding) 0 calc(var(--zen-toolbox-padding) / 2) 0;
+ :root[zen-right-side='true']:not([zen-window-buttons-reversed='true']) & {
+ margin-top: 0;
+ }
}
& #PanelUI-menu-button {
@@ -133,10 +126,6 @@
}
}
-:root:not([zen-single-toolbar='true']) #tabbrowser-tabs {
- margin-top: -2px;
-}
-
/* ==========================================================================
Pinned Tabs Separator
========================================================================== */
@@ -717,13 +706,11 @@
& #titlebar {
display: grid;
- grid-template-rows: auto 1fr;
overflow: clip;
}
& #zen-sidebar-top-buttons-customization-target {
flex-direction: column;
- padding-top: var(--zen-element-separation);
}
& #zen-sidebar-foot-buttons {
@@ -972,29 +959,21 @@
:root[zen-sidebar-expanded='true'] & {
--toolbarbutton-inner-padding: var(--zen-toolbar-button-inner-padding) !important;
}
+
:root[zen-single-toolbar='true'] & {
--toolbarbutton-inner-padding: calc(var(--zen-toolbar-button-inner-padding) - 2px) !important;
& #PanelUI-button {
order: -2;
}
- & #unified-extensions-button {
- order: -1;
- }
}
& #zen-sidebar-top-buttons-customization-target {
height: 100%;
align-items: center;
- :root:not([zen-sidebar-expanded='true']):not([zen-right-side='true']) {
- padding-inline-start: var(--zen-toolbox-padding);
- }
#nav-bar & {
- padding-inline-start: var(--toolbarbutton-outer-padding);
- }
- :root[zen-right-side='true']:not([zen-window-buttons-reversed='true']) {
- padding-inline-end: var(--zen-toolbox-padding);
+ padding-inline-end: var(--toolbarbutton-outer-padding);
}
:root:not([zen-sidebar-expanded='true']) & toolbarspring {
@@ -1172,8 +1151,28 @@
position: relative;
--zen-essential-bg-margin: 2px;
+ --zen-essential-tab-selected-bg: light-dark(
+ rgba(255, 255, 255, 0.85),
+ color-mix(in srgb, var(--zen-primary-color), rgba(68, 64, 64, 0.85) 40%)
+ );
+ --zen-essential-tab-selected-bg-hover: light-dark(
+ rgba(255, 255, 255, 0.8),
+ color-mix(in srgb, var(--zen-primary-color), rgba(68, 64, 64, 0.85) 50%)
+ );
+
+ :root[zen-default-theme='true'] & {
+ --zen-essential-tab-selected-bg: light-dark(
+ rgba(255, 255, 255, 0.85),
+ rgba(68, 64, 64, 0.85)
+ );
+ --zen-essential-tab-selected-bg-hover: light-dark(
+ rgba(255, 255, 255, 0.8),
+ rgba(68, 64, 64, 0.75)
+ );
+ }
+
&::before {
- background: light-dark(rgba(255, 255, 255, 0.85), rgba(68, 64, 64, 0.85));
+ background: var(--zen-essential-tab-selected-bg);
margin: var(--zen-essential-bg-margin);
border-radius: calc(var(--border-radius-medium) - var(--zen-essential-bg-margin));
position: absolute;
@@ -1185,7 +1184,7 @@
}
&[visuallyselected]:hover .tab-background::before {
- background: light-dark(rgba(255, 255, 255, 0.8), rgba(68, 64, 64, 0.75));
+ background: var(--zen-essential-tab-selected-bg-hover);
}
}
}
diff --git a/src/zen/tests/glance/browser.toml b/src/zen/tests/glance/browser.toml
index 7f231bbff..6098fbf07 100644
--- a/src/zen/tests/glance/browser.toml
+++ b/src/zen/tests/glance/browser.toml
@@ -13,3 +13,4 @@ support-files = [
["browser_glance_next_tab.js"]
["browser_glance_prev_tab.js"]
["browser_glance_select_parent.js"]
+["browser_glance_close_select.js"]
diff --git a/src/zen/tests/glance/browser_glance_close_select.js b/src/zen/tests/glance/browser_glance_close_select.js
new file mode 100644
index 000000000..e073ec53a
--- /dev/null
+++ b/src/zen/tests/glance/browser_glance_close_select.js
@@ -0,0 +1,36 @@
+/* Any copyright is dedicated to the Public Domain.
+ https://creativecommons.org/publicdomain/zero/1.0/ */
+
+'use strict';
+
+async function openAndCloseGlance() {
+ await openGlanceOnTab(async (glanceTab) => {
+ ok(
+ glanceTab.hasAttribute('zen-glance-tab'),
+ 'The glance tab should have the zen-glance-tab attribute'
+ );
+ });
+}
+
+add_task(async function test_Glance_Close_No_Tabs() {
+ const currentTab = gBrowser.selectedTab;
+ await openAndCloseGlance();
+ Assert.equal(gBrowser.selectedTab, currentTab, 'The original tab should be selected');
+ ok(currentTab.selected, 'The original tab should be visually selected');
+});
+
+add_task(async function test_Glance_Close_With_Next_Tab() {
+ const originalTab = gBrowser.selectedTab;
+ await BrowserTestUtils.withNewTab(
+ { url: 'http://example.com', gBrowser, waitForLoad: false },
+ async function () {
+ const selectedTab = gBrowser.selectedTab;
+ Assert.notEqual(selectedTab, originalTab, 'A new tab should be selected');
+ await openAndCloseGlance();
+ Assert.equal(gBrowser.selectedTab, selectedTab, 'The new tab should still be selected');
+ ok(selectedTab.selected, 'The new tab should be visually selected');
+
+ gBrowser.selectedTab = originalTab;
+ }
+ );
+});
diff --git a/src/zen/tests/ignorePrefs.json b/src/zen/tests/ignorePrefs.json
index 25c2cf37a..b7244e654 100644
--- a/src/zen/tests/ignorePrefs.json
+++ b/src/zen/tests/ignorePrefs.json
@@ -1,6 +1,14 @@
+// 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/.
+//
+// This file lists preferences that are ignored when running mochitests.
+// Add here any preference that is not relevant for testing Zen Modus.
+// This prevents unnecessary test re-runs when these preferences are changed.
[
"zen.mods.updated-value-observer",
"zen.mods.last-update",
"zen.view.compact.enable-at-startup",
+ "zen.urlbar.suggestions-learner",
"browser.newtabpage.activity-stream.trendingSearch.defaultSearchEngine"
]
diff --git a/src/zen/tests/tabs/browser.toml b/src/zen/tests/tabs/browser.toml
index 3d86041c6..0d6efd5dd 100644
--- a/src/zen/tests/tabs/browser.toml
+++ b/src/zen/tests/tabs/browser.toml
@@ -8,6 +8,7 @@ support-files = [
]
["browser_tabs_empty_checks.js"]
+["browser_tabs_fetch_checks.js"]
["browser_drag_drop_vertical.js"]
tags = [
"drag-drop",
diff --git a/src/zen/tests/tabs/browser_tabs_fetch_checks.js b/src/zen/tests/tabs/browser_tabs_fetch_checks.js
new file mode 100644
index 000000000..db6fa0f81
--- /dev/null
+++ b/src/zen/tests/tabs/browser_tabs_fetch_checks.js
@@ -0,0 +1,29 @@
+/* Any copyright is dedicated to the Public Domain.
+ https://creativecommons.org/publicdomain/zero/1.0/ */
+
+'use strict';
+
+// Each firefox update, we should run this check, even
+// if its a very "basic" one. Just to make sure that we are
+// returning tabs correctly.
+add_task(async function test_Tabs_Getter() {
+ for (let tab of gBrowser.tabs) {
+ ok(tab.tagName.toLowerCase() === 'tab', 'Each item in gBrowser.tabs is a tab element');
+ }
+ Assert.equal(
+ gBrowser.tabs.length,
+ 2,
+ 'There should be 2 tabs (1 empty tab + 1 about:blank tab) at startup'
+ );
+});
+
+add_task(async function test_Aria_Focusable_Tabs() {
+ for (let tab of gBrowser.tabContainer.ariaFocusableItems) {
+ ok(tab.tagName.toLowerCase() === 'tab', 'Each item in ariaFocusableItems is a tab element');
+ }
+ Assert.equal(
+ gBrowser.tabContainer.ariaFocusableItems.length,
+ 1,
+ 'There should be 1 focusable tab (1 about:blank tab) at startup'
+ );
+});
diff --git a/src/zen/tests/welcome/browser_welcome.js b/src/zen/tests/welcome/browser_welcome.js
index b5302ae58..d780ce9f1 100644
--- a/src/zen/tests/welcome/browser_welcome.js
+++ b/src/zen/tests/welcome/browser_welcome.js
@@ -43,7 +43,6 @@ add_task(async function test_Welcome_Steps() {
);
for (const child of welcomeContent.children) {
- console.log(child);
ok(
child.querySelector('img').getAttribute('src').includes('blob:'),
'Welcome page content should have an image with a base64 data URL'
@@ -66,7 +65,7 @@ add_task(async function test_Welcome_Steps() {
}, 100); // Wait for the transition to complete
});
- await goNextWelcomePage('zen-welcome-next-action');
+ await goNextWelcomePage('zen-generic-next');
ok(true, 'Welcome Search Step Test Finished');
await new Promise((resolve) => {
@@ -103,7 +102,7 @@ add_task(async function test_Welcome_Steps() {
ok(url.startsWith('https://'), `The URL "${url}" should start with "https://"`);
}
- await goNextWelcomePage('zen-welcome-next-action');
+ await goNextWelcomePage('zen-generic-next');
await new Promise((resolve) => {
setTimeout(async () => {
@@ -120,7 +119,7 @@ add_task(async function test_Welcome_Steps() {
}, 1000); // Wait for the transition to complete
});
- await goNextWelcomePage('zen-welcome-next-action');
+ await goNextWelcomePage('zen-generic-next');
ok(true, 'Welcome Theme Step Test Finished');
await goNextWelcomePage('zen-welcome-start-browsing');
diff --git a/src/zen/tests/workspaces/browser_workspace_unload.js b/src/zen/tests/workspaces/browser_workspace_unload.js
new file mode 100644
index 000000000..7f2c60f99
--- /dev/null
+++ b/src/zen/tests/workspaces/browser_workspace_unload.js
@@ -0,0 +1,113 @@
+/* Any copyright is dedicated to the Public Domain.
+ https://creativecommons.org/publicdomain/zero/1.0/ */
+
+'use strict';
+
+// verify that workspace unloading works
+add_task(async function test_UnloadWorkspace_WithMultipleTabs() {
+ const workspaceId = await gZenWorkspaces.createAndSaveWorkspace('Test Workspace 1');
+ const tabs = [];
+ for (let i = 0; i < 3; i++) {
+ const tab = await BrowserTestUtils.openNewForegroundTab(
+ window.gBrowser,
+ `data:text/html,Workspace Tab ${i}`,
+ true,
+ { skipAnimation: true }
+ );
+ tab.setAttribute('zen-workspace-id', workspaceId);
+ 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.unloadWorkspace();
+
+ for (const tab of tabs) {
+ ok(tab.hasAttribute('pending'), 'Tab should be pending after unload');
+ ok(!tab.linkedPanel, 'Tab should not have linked panel after unload');
+ }
+
+ await gZenWorkspaces.removeWorkspace(workspaceId);
+});
+
+// verify that essential tabs are not unloaded
+add_task(async function test_UnloadWorkspace_WithEssentialTabs() {
+ const workspaceId = await gZenWorkspaces.createAndSaveWorkspace('Test Workspace 2');
+
+ const regularTab = await BrowserTestUtils.openNewForegroundTab(
+ window.gBrowser,
+ 'data:text/html,Hi! I am a Regular Tab',
+ true,
+ { skipAnimation: true }
+ );
+ regularTab.setAttribute('zen-workspace-id', workspaceId);
+
+ const essentialTab = await BrowserTestUtils.openNewForegroundTab(
+ window.gBrowser,
+ 'data:text/html,Hi! I am an Essential Tab',
+ true,
+ { skipAnimation: true }
+ );
+ essentialTab.setAttribute('zen-workspace-id', workspaceId);
+ essentialTab.setAttribute('zen-essential', 'true');
+
+ await gZenWorkspaces.unloadWorkspace();
+
+ ok(regularTab.hasAttribute('pending'), 'Regular tab should be unloaded');
+ ok(!regularTab.linkedPanel, 'Regular tab should not have linked panel');
+
+ ok(!essentialTab.hasAttribute('pending'), 'Essential tab should not be unloaded');
+ ok(essentialTab.linkedPanel, 'Essential tab should still have linked panel');
+
+ await gZenWorkspaces.removeWorkspace(workspaceId);
+});
+
+// only tabs from the targeted workspace should be unloaded
+add_task(async function test_UnloadWorkspace_TargetedWorkspaceIsolation() {
+ const inActiveWorkspaceId = await gZenWorkspaces.createAndSaveWorkspace(
+ 'Test In-Active Workspace'
+ );
+ const activeWorkspaceId = await gZenWorkspaces.createAndSaveWorkspace('Test Active Workspace');
+
+ const inActiveWorkspaceTabs = [];
+ for (let i = 0; i < 2; i++) {
+ const tab = await BrowserTestUtils.openNewForegroundTab(
+ window.gBrowser,
+ `data:text/html,In-Active Workspace Tab ${i}`,
+ 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(
+ window.gBrowser,
+ `data:text/html,Active Workspace Tab ${i}`,
+ true,
+ { skipAnimation: true }
+ );
+ tab.setAttribute('zen-workspace-id', activeWorkspaceId);
+ activeWorkspaceTabs.push(tab);
+ }
+
+ await gZenWorkspaces.unloadWorkspace(); // this unloads the latest created workspace -> activeWorkspaceId
+
+ for (const tab of activeWorkspaceTabs) {
+ ok(tab.hasAttribute('pending'), 'Active workspace tab should be pending after unload');
+ ok(!tab.linkedPanel, 'Active workspace tab should not have linked panel after unload');
+ }
+
+ for (const tab of inActiveWorkspaceTabs) {
+ ok(!tab.hasAttribute('pending'), 'In-Active workspace tab should NOT be pending after unload');
+ ok(tab.linkedPanel, 'In-Active workspace tab should still have linked panel after unload');
+ }
+
+ await gZenWorkspaces.removeWorkspace(inActiveWorkspaceId);
+ await gZenWorkspaces.removeWorkspace(activeWorkspaceId);
+});
diff --git a/src/zen/urlbar/ZenSiteDataPanel.sys.mjs b/src/zen/urlbar/ZenSiteDataPanel.sys.mjs
new file mode 100644
index 000000000..91f648636
--- /dev/null
+++ b/src/zen/urlbar/ZenSiteDataPanel.sys.mjs
@@ -0,0 +1,642 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+import { AppConstants } from 'resource://gre/modules/AppConstants.sys.mjs';
+
+const lazy = {};
+
+ChromeUtils.defineESModuleGetters(lazy, {
+ FeatureCallout: 'resource:///modules/asrouter/FeatureCallout.sys.mjs',
+});
+
+export class nsZenSiteDataPanel {
+ #iconMap = {
+ install: 'extension',
+ 'site-protection': 'shield',
+ '3rdPartyStorage': 'cookie',
+ };
+
+ constructor(window) {
+ this.window = window;
+ this.document = window.document;
+
+ this.panel = this.document.getElementById('zen-unified-site-data-panel');
+ this.#init();
+ }
+
+ #init() {
+ // Add a new button to the urlbar popup
+ const button = this.window.MozXULElement.parseXULToFragment(`
+
+
+
+ `);
+ this.anchor = button.querySelector('#zen-site-data-icon-button');
+ this.document.getElementById('identity-icon-box').before(button);
+ this.window.gUnifiedExtensions._button = this.anchor;
+
+ this.document
+ .getElementById('nav-bar')
+ .setAttribute('addon-webext-overflowbutton', 'zen-site-data-icon-button');
+
+ // Remove the old permissions dialog
+ this.document.getElementById('unified-extensions-panel-template').remove();
+
+ this.#initCopyUrlButton();
+ this.#initEventListeners();
+ this.#maybeShowFeatureCallout();
+ }
+
+ #initEventListeners() {
+ this.panel.addEventListener('popupshowing', this);
+ this.document.getElementById('zen-site-data-manage-addons').addEventListener('click', this);
+ this.document.getElementById('zen-site-data-settings-more').addEventListener('click', this);
+ const kCommandIDs = [
+ 'zen-site-data-header-share',
+ 'zen-site-data-header-bookmark',
+ 'zen-site-data-security-info',
+ 'zen-site-data-actions',
+ 'zen-site-data-new-addon-button',
+ ];
+
+ for (let id of kCommandIDs) {
+ this.document.getElementById(id).addEventListener('command', this);
+ }
+
+ this.#initContextMenuEventListener();
+ }
+
+ #initCopyUrlButton() {
+ // This function is a bit out of place, but it's related enough to the panel
+ // that it's easier to do it here than in a separate module.
+ const container = this.document.getElementById('page-action-buttons');
+ const fragment = this.window.MozXULElement.parseXULToFragment(`
+
+
+
+ `);
+ container.after(fragment);
+
+ const aElement = this.document.getElementById('zen-copy-url-button');
+ aElement.addEventListener('click', () => {
+ if (aElement.hasAttribute('disabled')) {
+ return;
+ }
+ this.document.getElementById('cmd_zenCopyCurrentURL').doCommand();
+ });
+
+ this.window.gBrowser.addProgressListener({
+ onLocationChange: (aWebProgress, aRequest, aLocation) => {
+ if (aWebProgress.isTopLevel) {
+ const disabled = !this.#canCopyUrl(aLocation);
+ if (disabled) {
+ aElement.setAttribute('disabled', true);
+ } else {
+ aElement.removeAttribute('disabled');
+ }
+ }
+ },
+ });
+ }
+
+ #initContextMenuEventListener() {
+ const kCommands = {
+ context_zenClearSiteData: (event) => {
+ this.window.gIdentityHandler.clearSiteData(event);
+ },
+ context_zenOpenGetAddons: () => {
+ this.#openGetAddons();
+ },
+ context_zenOpenSiteSettings: () => {
+ const { BrowserCommands } = this.window;
+ BrowserCommands.pageInfo(null, 'permTab');
+ },
+ };
+
+ for (let [id, handler] of Object.entries(kCommands)) {
+ this.document.getElementById(id).addEventListener('command', handler);
+ }
+ }
+
+ #preparePanel() {
+ this.#setSitePermissions();
+ this.#setSiteSecurityInfo();
+ this.#setSiteHeader();
+ }
+
+ #setSiteHeader() {
+ {
+ const button = this.document.getElementById('zen-site-data-header-reader-mode');
+ const urlbarButton = this.window.document.getElementById('reader-mode-button');
+ const isActive = urlbarButton?.hasAttribute('readeractive');
+ const isVisible = !urlbarButton?.hidden || isActive;
+
+ button.disabled = !isVisible;
+ if (isActive) {
+ button.classList.add('active');
+ } else {
+ button.classList.remove('active');
+ }
+ this.document.l10n.setAttributes(button, urlbarButton?.getAttribute('data-l10n-id'));
+ }
+ {
+ const button = this.document.getElementById('zen-site-data-header-bookmark');
+ const isPageBookmarked = this.window.BookmarkingUI.star?.hasAttribute('starred');
+
+ if (isPageBookmarked) {
+ button.classList.add('active');
+ } else {
+ button.classList.remove('active');
+ }
+ }
+ {
+ const button = this.document.getElementById('zen-site-data-header-share');
+ if (this.#canCopyUrl(this.window.gBrowser.currentURI)) {
+ button.removeAttribute('disabled');
+ } else {
+ button.setAttribute('disabled', 'true');
+ }
+ }
+ }
+
+ /*
+ * Determines whether the copy URL button should be hidden for the given URI.
+ * @param {nsIURI} uri - The URI to check.
+ * @returns {boolean} True if the button should be hidden, false otherwise.
+ */
+ #canCopyUrl(uri) {
+ if (!uri) {
+ return false;
+ }
+
+ return uri.scheme.startsWith('http');
+ }
+
+ #setSiteSecurityInfo() {
+ const { gIdentityHandler } = this.window;
+ const button = this.document.getElementById('zen-site-data-security-info');
+
+ if (gIdentityHandler._isSecureInternalUI) {
+ button.parentNode.hidden = true;
+ return;
+ }
+
+ let identity;
+ if (gIdentityHandler._pageExtensionPolicy) {
+ this.document.l10n.setAttributes(button, 'zen-site-data-security-info-extension');
+ identity = 'extension';
+ } else if (gIdentityHandler._uriHasHost && gIdentityHandler._isSecureConnection) {
+ this.document.l10n.setAttributes(button, 'zen-site-data-security-info-secure');
+ identity = 'secure';
+ } else {
+ this.document.l10n.setAttributes(button, 'zen-site-data-security-info-not-secure');
+ identity = 'not-secure';
+ }
+
+ button.parentNode.hidden = false;
+ button.setAttribute('identity', identity);
+ }
+
+ #setSitePermissions() {
+ const { gBrowser, SitePermissions } = this.window;
+ const list = this.document.getElementById('zen-site-data-settings-list');
+ const section = list.closest('.zen-site-data-section');
+
+ // show permission icons
+ let permissions = SitePermissions.getAllPermissionDetailsForBrowser(gBrowser.selectedBrowser);
+
+ // Don't display origin-keyed 3rdPartyStorage permissions that are covered by
+ // site-keyed 3rdPartyFrameStorage permissions.
+ let thirdPartyStorageSites = new Set(
+ permissions
+ .map(function (permission) {
+ let [id, key] = permission.id.split(SitePermissions.PERM_KEY_DELIMITER);
+ if (id == '3rdPartyFrameStorage' || id == '3rdPartyStorage') {
+ return key;
+ }
+ return null;
+ })
+ .filter(function (key) {
+ return key != null;
+ })
+ );
+ permissions = permissions.filter(function (permission) {
+ let [id, key] = permission.id.split(SitePermissions.PERM_KEY_DELIMITER);
+ if (id != '3rdPartyStorage') {
+ return true;
+ }
+ try {
+ let origin = Services.io.newURI(key);
+ let site = Services.eTLD.getSite(origin);
+ return !thirdPartyStorageSites.has(site);
+ } catch {
+ return false;
+ }
+ });
+
+ this._sharingState = gBrowser.selectedTab._sharingState;
+
+ if (this._sharingState?.geo) {
+ let geoPermission = permissions.find((perm) => perm.id === 'geo');
+ if (!geoPermission) {
+ permissions.push({
+ id: 'geo',
+ state: SitePermissions.ALLOW,
+ scope: SitePermissions.SCOPE_REQUEST,
+ sharingState: true,
+ });
+ }
+ }
+
+ if (this._sharingState?.xr) {
+ let xrPermission = permissions.find((perm) => perm.id === 'xr');
+ if (!xrPermission) {
+ permissions.push({
+ id: 'xr',
+ state: SitePermissions.ALLOW,
+ scope: SitePermissions.SCOPE_REQUEST,
+ sharingState: true,
+ });
+ }
+ }
+
+ if (this._sharingState?.webRTC) {
+ let webrtcState = this._sharingState.webRTC;
+ // If WebRTC device or screen are in use, we need to find
+ // the associated ALLOW permission item to set the sharingState field.
+ for (let id of ['camera', 'microphone', 'screen']) {
+ if (webrtcState[id]) {
+ let found = false;
+ for (let permission of permissions) {
+ let [permId] = permission.id.split(SitePermissions.PERM_KEY_DELIMITER);
+ if (permId != id || permission.state != SitePermissions.ALLOW) {
+ continue;
+ }
+ found = true;
+ }
+ if (!found) {
+ // If the ALLOW permission item we were looking for doesn't exist,
+ // the user has temporarily allowed sharing and we need to add
+ // an item in the permissions array to reflect this.
+ permissions.push({
+ id,
+ state: SitePermissions.ALLOW,
+ scope: SitePermissions.SCOPE_REQUEST,
+ sharingState: webrtcState[id],
+ });
+ }
+ }
+ }
+ }
+
+ // Add site protection permissions if needed.
+ const { gProtectionsHandler } = this.window;
+ if (
+ gBrowser.currentURI.schemeIs('http') ||
+ gBrowser.currentURI.schemeIs('https') ||
+ gBrowser.currentURI.schemeIs('ftp')
+ ) {
+ permissions.push({
+ id: 'site-protection',
+ state: gProtectionsHandler.hasException ? SitePermissions.BLOCK : SitePermissions.ALLOW,
+ scope: SitePermissions.SCOPE_PERSISTENT,
+ });
+ }
+
+ const separator = this.document.createXULElement('toolbarseparator');
+ list.innerHTML = '';
+ list.appendChild(separator);
+ const settingElements = [];
+ const crossSiteCookieElements = [];
+ for (let permission of permissions) {
+ let [id, key] = permission.id.split(SitePermissions.PERM_KEY_DELIMITER);
+
+ if (id == 'storage-access') {
+ // Ignore storage access permissions here, they are made visible inside
+ // the Content Blocking UI.
+ continue;
+ }
+
+ if (permission.state == SitePermissions.PROMPT) {
+ // We don't display "ask" permissions in the site data panel.
+ continue;
+ }
+
+ let [item, isCrossSiteCookie] = this.#createPermissionItem(id, key, permission);
+ if (item) {
+ if (isCrossSiteCookie) {
+ crossSiteCookieElements.push(item);
+ } else {
+ settingElements.push(item);
+ }
+ }
+ }
+
+ for (let elem of settingElements) {
+ separator.before(elem);
+ }
+ for (let elem of crossSiteCookieElements) {
+ separator.after(elem);
+ }
+
+ separator.hidden = !settingElements.length || !crossSiteCookieElements.length;
+ section.hidden = list.childElementCount < 2; // only the separator
+ }
+
+ #getPermissionStateLabelId(permission) {
+ const { SitePermissions } = this.window;
+ switch (permission.state) {
+ // There should only be these types being displayed in the panel.
+ case SitePermissions.ALLOW:
+ return 'zen-site-data-setting-allow';
+ case SitePermissions.BLOCK:
+ case SitePermissions.AUTOPLAY_BLOCKED_ALL:
+ return 'zen-site-data-setting-block';
+ default:
+ return null;
+ }
+ }
+
+ #createPermissionItem(id, key, permission) {
+ const { SitePermissions } = this.window;
+ const isCrossSiteCookie = id === '3rdPartyStorage';
+
+ // Create a permission item for the site data panel.
+ let container = this.document.createXULElement('hbox');
+ const idNoSuffix = permission.id;
+ container.classList.add(
+ 'permission-popup-permission-item',
+ `permission-popup-permission-item-${idNoSuffix}`
+ );
+ container.setAttribute('align', 'center');
+ container.setAttribute('role', 'group');
+
+ container.setAttribute('state', permission.state == SitePermissions.ALLOW ? 'allow' : 'block');
+
+ let img = this.document.createXULElement('toolbarbutton');
+ img.classList.add('permission-popup-permission-icon', 'zen-site-data-permission-icon');
+ if (this.#iconMap[id]) {
+ img.classList.add(`zen-permission-${this.#iconMap[id]}-icon`);
+ }
+
+ let labelContainer = this.document.createXULElement('vbox');
+ labelContainer.setAttribute('flex', '1');
+ labelContainer.setAttribute('align', 'start');
+ labelContainer.classList.add('permission-popup-permission-label-container');
+ labelContainer._permission = permission;
+ labelContainer.addEventListener('click', this);
+
+ let nameLabel = this.document.createXULElement('label');
+ nameLabel.setAttribute('flex', '1');
+ nameLabel.setAttribute('class', 'permission-popup-permission-label');
+ if (isCrossSiteCookie) {
+ this.document.l10n.setAttributes(nameLabel, 'zen-site-data-setting-cross-site');
+ } else {
+ let label = SitePermissions.getPermissionLabel(permission.id);
+ if (label) {
+ nameLabel.textContent = label;
+ } else {
+ this.document.l10n.setAttributes(nameLabel, 'zen-site-data-setting-' + idNoSuffix);
+ }
+ }
+ labelContainer.appendChild(nameLabel);
+
+ let stateLabel = this.document.createXULElement('label');
+ stateLabel.setAttribute('class', 'zen-permission-popup-permission-state-label');
+ if (isCrossSiteCookie) {
+ // The key should be the site for cross-site cookies.
+ stateLabel.textContent = key;
+ } else {
+ stateLabel.setAttribute('data-l10n-id', this.#getPermissionStateLabelId(permission));
+ }
+ labelContainer.appendChild(stateLabel);
+
+ container.appendChild(img);
+ container.appendChild(labelContainer);
+
+ return [container, isCrossSiteCookie];
+ }
+
+ #openGetAddons() {
+ const { switchToTabHavingURI } = this.window;
+ let amoUrl = Services.urlFormatter.formatURLPref('extensions.getAddons.link.url');
+ switchToTabHavingURI(amoUrl, true);
+ }
+
+ #onCommandEvent(event) {
+ const id = event.target.id;
+ switch (id) {
+ case 'zen-site-data-new-addon-button': {
+ this.#openGetAddons();
+ break;
+ }
+ case 'zen-site-data-security-info': {
+ this.window.gIdentityHandler._openPopup(event);
+ break;
+ }
+ case 'zen-site-data-actions': {
+ const button = this.document.getElementById('zen-site-data-actions');
+ const popup = this.document.getElementById('zenSiteDataActions');
+ popup.openPopup(
+ button,
+ 'after_start',
+ 0,
+ 0,
+ /* context menu */ true,
+ false,
+ this.window.event
+ );
+ break;
+ }
+ case 'zen-site-data-header-bookmark': {
+ this.window.BookmarkingUI.onStarCommand(event);
+ break;
+ }
+ case 'zen-site-data-header-share': {
+ if (Services.zen.canShare()) {
+ const buttonRect = event.target.getBoundingClientRect();
+ const currentUrl = this.window.gBrowser.currentURI;
+ Services.zen.share(
+ currentUrl,
+ '',
+ '',
+ buttonRect.left,
+ this.window.innerHeight - buttonRect.bottom,
+ buttonRect.width,
+ buttonRect.height
+ );
+ } else {
+ this.window.gZenCommonActions.copyCurrentURLToClipboard();
+ }
+ if (AppConstants.platform !== 'macosx') {
+ this.panel.hidePopup();
+ }
+ }
+ }
+ }
+
+ #onPermissionClick(label) {
+ const { SitePermissions, gBrowser } = this.window;
+ const permission = label._permission;
+
+ let newState;
+ switch (permission.state) {
+ case SitePermissions.ALLOW:
+ newState = SitePermissions.BLOCK;
+ break;
+ case SitePermissions.BLOCK:
+ case SitePermissions.AUTOPLAY_BLOCKED_ALL:
+ newState = SitePermissions.ALLOW;
+ break;
+ default:
+ return;
+ }
+
+ if (permission.id === 'site-protection') {
+ const { gProtectionsHandler } = this.window;
+ if (newState === SitePermissions.BLOCK) {
+ gProtectionsHandler.disableForCurrentPage();
+ } else {
+ gProtectionsHandler.enableForCurrentPage();
+ }
+ } else {
+ SitePermissions.setForPrincipal(gBrowser.contentPrincipal, permission.id, newState);
+ }
+
+ const isCrossSiteCookie = permission.id.startsWith('3rdPartyStorage');
+ label.parentNode.setAttribute('state', newState == SitePermissions.ALLOW ? 'allow' : 'block');
+ if (!isCrossSiteCookie) {
+ label
+ .querySelector('.zen-permission-popup-permission-state-label')
+ .setAttribute('data-l10n-id', this.#getPermissionStateLabelId({ state: newState }));
+ }
+ label._permission.state = newState;
+ }
+
+ #onClickEvent(event) {
+ const id = event.target.id;
+ switch (id) {
+ case 'zen-site-data-manage-addons': {
+ const { BrowserAddonUI } = this.window;
+ BrowserAddonUI.openAddonsMgr('addons://list/extension');
+ break;
+ }
+ case 'zen-site-data-settings-more': {
+ const { BrowserCommands } = this.window;
+ BrowserCommands.pageInfo(null, 'permTab');
+ break;
+ }
+ default: {
+ const item = event.target.closest('.permission-popup-permission-item');
+ if (!item) {
+ break;
+ }
+ const label = item.querySelector('.permission-popup-permission-label-container');
+ if (label?._permission) {
+ this.#onPermissionClick(label);
+ }
+ break;
+ }
+ }
+ }
+
+ handleEvent(event) {
+ const type = event.type;
+ switch (type) {
+ case 'click':
+ this.#onClickEvent(event);
+ break;
+ case 'command':
+ this.#onCommandEvent(event);
+ break;
+ case 'popupshowing':
+ this.#preparePanel();
+ break;
+ }
+ }
+
+ async #maybeShowFeatureCallout() {
+ const kPref = 'zen.site-data-panel.show-callout';
+ if (!Services.prefs.getBoolPref(kPref, false)) {
+ return;
+ }
+ Services.prefs.setBoolPref(kPref, false);
+ const { FeatureCallout } = lazy;
+ const { gBrowser, gZenWorkspaces } = this.window;
+ await gZenWorkspaces.promiseInitialized;
+ await new Promise((resolve) => {
+ const checkEmptyTab = () => {
+ if (!gBrowser.selectedTab.hasAttribute('zen-empty-tab')) {
+ resolve();
+ return;
+ }
+ this.window.addEventListener('TabSelect', checkEmptyTab, { once: true });
+ };
+ checkEmptyTab();
+ });
+ this.anchor.setAttribute('open', 'true');
+ const callout = new FeatureCallout({
+ win: this.window,
+ location: 'chrome',
+ context: 'chrome',
+ browser: gBrowser.selectedBrowser,
+ theme: { preset: 'chrome' },
+ });
+ this.window.setTimeout(() => {
+ callout.showFeatureCallout({
+ id: 'ZEN_EXTENSIONS_PANEL_MOVE_CALLOUT',
+ template: 'feature_callout',
+ groups: ['cfr'],
+ content: {
+ id: 'ZEN_EXTENSIONS_PANEL_MOVE_CALLOUT',
+ template: 'multistage',
+ backdrop: 'transparent',
+ transitions: true,
+ screens: [
+ {
+ id: 'ZEN_EXTENSIONS_PANEL_MOVE_CALLOUT',
+ anchors: [
+ {
+ selector: '#zen-site-data-icon-button',
+ panel_position: {
+ anchor_attachment: 'bottomcenter',
+ callout_attachment: 'topleft',
+ },
+ },
+ {
+ selector: '#identity-icon-box',
+ panel_position: {
+ anchor_attachment: 'bottomcenter',
+ callout_attachment: 'topleft',
+ },
+ },
+ ],
+ content: {
+ position: 'callout',
+ width: '355px',
+ title: {
+ string_id: 'zen-site-data-panel-feature-callout-title',
+ },
+ subtitle: {
+ string_id: 'zen-site-data-panel-feature-callout-subtitle',
+ },
+ dismiss_button: {
+ action: {
+ dismiss: true,
+ },
+ background: true,
+ size: 'small',
+ },
+ },
+ },
+ ],
+ },
+ });
+ }, 1000);
+ }
+}
diff --git a/src/zen/urlbar/ZenUBActionsProvider.sys.mjs b/src/zen/urlbar/ZenUBActionsProvider.sys.mjs
index d8ba00fe4..898aa9373 100644
--- a/src/zen/urlbar/ZenUBActionsProvider.sys.mjs
+++ b/src/zen/urlbar/ZenUBActionsProvider.sys.mjs
@@ -15,7 +15,7 @@ const DYNAMIC_TYPE_NAME = 'zen-actions';
const MAX_RECENT_ACTIONS = 5;
const MINIMUM_QUERY_SCORE = 92;
-const MINIMUM_PREFIXED_QUERY_SCORE = 50;
+const MINIMUM_PREFIXED_QUERY_SCORE = 30;
ChromeUtils.defineESModuleGetters(lazy, {
UrlbarResult: 'resource:///modules/UrlbarResult.sys.mjs',
@@ -242,15 +242,15 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
}
const ownerGlobal = lazy.BrowserWindowTracker.getTopWindow();
- const finalResults = [];
+ let finalResults = [];
for (const action of actionsResults) {
const [payload, payloadHighlights] = lazy.UrlbarResult.payloadAndSimpleHighlights([], {
suggestion: action.label,
title: action.label,
- query: queryContext.searchString,
zenCommand: action.command,
dynamicType: DYNAMIC_TYPE_NAME,
zenAction: true,
+ query: isPrefixed ? action.label.trimStart() : queryContext.searchString,
icon: action.icon,
shortcutContent: ownerGlobal.gZenKeyboardShortcutsManager.getShortcutDisplayFromCommand(
action.command
@@ -265,7 +265,7 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
payload,
payloadHighlights
);
- if (zenUrlbarResultsLearner.shouldPrioritize(action.commandId)) {
+ if (zenUrlbarResultsLearner.shouldPrioritize(action.commandId) && !isPrefixed) {
result.heuristic = true;
} else {
result.suggestedIndex = zenUrlbarResultsLearner.getDeprioritizeIndex(action.commandId);
@@ -278,8 +278,14 @@ export class ZenUrlbarProviderGlobalActions extends UrlbarProvider {
}
finalResults.push(result);
}
+ let i = 0;
zenUrlbarResultsLearner.sortCommandsByPriority(finalResults).forEach((result) => {
+ if (isPrefixed && i === 0 && query.length > 1) {
+ result.heuristic = true;
+ delete result.suggestedIndex;
+ }
addCallback(this, result);
+ i++;
});
}
diff --git a/src/zen/urlbar/ZenUBGlobalActions.sys.mjs b/src/zen/urlbar/ZenUBGlobalActions.sys.mjs
index ba5a88abe..8418e14be 100644
--- a/src/zen/urlbar/ZenUBGlobalActions.sys.mjs
+++ b/src/zen/urlbar/ZenUBGlobalActions.sys.mjs
@@ -37,16 +37,16 @@ const globalActionsTemplate = [
command: (window) => window.openPreferences(),
icon: 'chrome://browser/skin/zen-icons/settings.svg',
},
- {
- label: 'Open New Window',
- command: 'cmd_newNavigator',
- icon: 'chrome://browser/skin/zen-icons/window.svg',
- },
{
label: 'Open Private Window',
command: 'Tools:PrivateBrowsing',
icon: 'chrome://browser/skin/zen-icons/private-window.svg',
},
+ {
+ label: 'Open New Window',
+ command: 'cmd_newNavigator',
+ icon: 'chrome://browser/skin/zen-icons/window.svg',
+ },
{
label: 'Pin Tab',
command: 'cmd_zenTogglePinTab',
diff --git a/src/zen/urlbar/ZenUBResultsLearner.sys.mjs b/src/zen/urlbar/ZenUBResultsLearner.sys.mjs
index 6df19367d..73390b6a7 100644
--- a/src/zen/urlbar/ZenUBResultsLearner.sys.mjs
+++ b/src/zen/urlbar/ZenUBResultsLearner.sys.mjs
@@ -7,7 +7,7 @@ import { XPCOMUtils } from 'resource://gre/modules/XPCOMUtils.sys.mjs';
const lazy = {};
const DEFAULT_DB_DATA = '{}';
-const DEPRIORITIZE_MAX = -4;
+const DEPRIORITIZE_MAX = -5;
const PRIORITIZE_MAX = 5;
function addDataToLazy(data) {
diff --git a/src/zen/urlbar/moz.build b/src/zen/urlbar/moz.build
index 1e331db90..f321a86bb 100644
--- a/src/zen/urlbar/moz.build
+++ b/src/zen/urlbar/moz.build
@@ -3,6 +3,7 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
EXTRA_JS_MODULES += [
+ "ZenSiteDataPanel.sys.mjs",
"ZenUBActionsProvider.sys.mjs",
"ZenUBGlobalActions.sys.mjs",
"ZenUBProvider.sys.mjs",
diff --git a/src/zen/welcome/ZenWelcome.mjs b/src/zen/welcome/ZenWelcome.mjs
index 08a9458a5..3e1074bf5 100644
--- a/src/zen/welcome/ZenWelcome.mjs
+++ b/src/zen/welcome/ZenWelcome.mjs
@@ -409,7 +409,7 @@
document.querySelector('#zen-welcome-page-sidebar-buttons button').remove();
const newButton = document.querySelector('#zen-welcome-page-sidebar-buttons button');
newButton.classList.add('primary');
- document.l10n.setAttributes(newButton, 'zen-welcome-next-action');
+ document.l10n.setAttributes(newButton, 'zen-generic-next');
return false;
},
},
@@ -464,7 +464,7 @@
],
buttons: [
{
- l10n: 'zen-welcome-next-action',
+ l10n: 'zen-generic-next',
onclick: async () => {
return true;
},
@@ -533,7 +533,7 @@
],
buttons: [
{
- l10n: 'zen-welcome-next-action',
+ l10n: 'zen-generic-next',
onclick: async () => {
return true;
},
@@ -658,7 +658,7 @@
],
buttons: [
{
- l10n: 'zen-welcome-next-action',
+ l10n: 'zen-generic-next',
onclick: async () => {
return true;
},
diff --git a/src/zen/workspaces/ZenGradientGenerator.mjs b/src/zen/workspaces/ZenGradientGenerator.mjs
index fdb6661da..557e769ba 100644
--- a/src/zen/workspaces/ZenGradientGenerator.mjs
+++ b/src/zen/workspaces/ZenGradientGenerator.mjs
@@ -126,7 +126,12 @@
darkModeChange
);
- XPCOMUtils.defineLazyPreferenceGetter(this, 'darkModeBias', 'zen.theme.dark-mode-bias', 0.5);
+ XPCOMUtils.defineLazyPreferenceGetter(
+ this,
+ 'darkModeBias',
+ 'zen.theme.dark-mode-bias',
+ '0.5'
+ );
}
handleDarkModeChange() {
@@ -1192,7 +1197,7 @@
}
shouldBeDarkMode(accentColor) {
- if (Services.prefs.getBoolPref('zen.theme.use-sysyem-colors')) {
+ if (Services.prefs.getBoolPref('zen.theme.use-system-colors')) {
return this.isDarkMode;
}
@@ -1212,7 +1217,7 @@
let lightText = this.getToolbarColor(false); // e.g. [r, g, b, a]
if (this.canBeTransparent) {
- lightText[3] -= this.darkModeBias; // Reduce alpha for light text
+ lightText[3] -= parseFloat(this.darkModeBias); // Reduce alpha for light text
}
// Composite text color over background
@@ -1465,9 +1470,15 @@
gradient
);
const isDarkModeWindow = browser.gZenThemePicker.isDarkMode;
+ const docElement = browser.document.documentElement;
+ if (isDefaultTheme) {
+ docElement.setAttribute('zen-default-theme', 'true');
+ } else {
+ docElement.removeAttribute('zen-default-theme');
+ }
if (dominantColor) {
const primaryColor = this.getAccentColorForUI(dominantColor);
- browser.document.documentElement.style.setProperty('--zen-primary-color', primaryColor);
+ docElement.style.setProperty('--zen-primary-color', primaryColor);
// Should be set to `this.isLegacyVersion` but for some reason it is set to undefined if we open a private window,
// so instead get the pref value directly.
@@ -1478,10 +1489,10 @@
if (!isDefaultTheme && !this.isLegacyVersion) {
// Check for the primary color
isDarkMode = browser.gZenThemePicker.shouldBeDarkMode(dominantColor);
- browser.document.documentElement.setAttribute('zen-should-be-dark-mode', isDarkMode);
+ docElement.setAttribute('zen-should-be-dark-mode', isDarkMode);
browser.gZenThemePicker.panel.removeAttribute('invalidate-controls');
} else {
- browser.document.documentElement.removeAttribute('zen-should-be-dark-mode');
+ docElement.removeAttribute('zen-should-be-dark-mode');
if (!this.isLegacyVersion) {
browser.gZenThemePicker.panel.setAttribute('invalidate-controls', 'true');
}
@@ -1513,8 +1524,23 @@
}
getNativeAccentColor() {
- const accentColor = Services.prefs.getStringPref('zen.theme.accent-color');
- const rgb = this.hexToRgb(accentColor);
+ let accentColor = Services.prefs.getStringPref('zen.theme.accent-color');
+ let rgb;
+ if (accentColor === 'AccentColor') {
+ const rawRgb = window.getComputedStyle(document.getElementById('zen-browser-background'))[
+ 'color'
+ ];
+ rgb = rawRgb.match(/\d+/g).map(Number);
+ // Match our theme a bit more, since we can't always expect the OS
+ // to give us a color matching our theme scheme
+ rgb = this.blendColors(
+ rgb,
+ this.getToolbarModifiedBaseRaw().slice(0, 3),
+ this.isDarkMode ? 80 : 50
+ );
+ } else {
+ rgb = this.hexToRgb(accentColor);
+ }
if (this.isDarkMode) {
// If the theme is dark, we want to use a lighter color
return this.blendColors(rgb, [0, 0, 0], 40);
diff --git a/src/zen/workspaces/ZenWorkspaceIcons.mjs b/src/zen/workspaces/ZenWorkspaceIcons.mjs
index 3d67718c9..1d48a5f10 100644
--- a/src/zen/workspaces/ZenWorkspaceIcons.mjs
+++ b/src/zen/workspaces/ZenWorkspaceIcons.mjs
@@ -99,7 +99,7 @@
#createWorkspaceIcon(workspace) {
const button = document.createXULElement('toolbarbutton');
- button.setAttribute('class', 'subviewbutton');
+ button.setAttribute('class', 'subviewbutton toolbarbutton-1');
button.setAttribute('tooltiptext', workspace.name);
button.setAttribute('zen-workspace-id', workspace.uuid);
button.setAttribute('context', 'zenWorkspaceMoreActions');
diff --git a/src/zen/workspaces/ZenWorkspaces.mjs b/src/zen/workspaces/ZenWorkspaces.mjs
index ea881aeff..7cb7685f1 100644
--- a/src/zen/workspaces/ZenWorkspaces.mjs
+++ b/src/zen/workspaces/ZenWorkspaces.mjs
@@ -1479,6 +1479,26 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature {
});
}
+ async unloadWorkspace() {
+ const workspaceId = this.#contextMenuData?.workspaceId || this.activeWorkspace;
+
+ const tabsToUnload = this.allStoredTabs.filter(
+ (tab) =>
+ tab.getAttribute('zen-workspace-id') === workspaceId &&
+ !tab.hasAttribute('zen-empty-tab') &&
+ !tab.hasAttribute('zen-essential') &&
+ !tab.hasAttribute('pending')
+ );
+
+ if (tabsToUnload.length === 0) {
+ return;
+ }
+
+ this.log('Unloading workspace', workspaceId);
+
+ await gBrowser.explicitUnloadTabs(tabsToUnload); // TODO: unit test this
+ }
+
moveTabToWorkspace(tab, workspaceID) {
return this.moveTabsToWorkspace([tab], workspaceID);
}
@@ -2161,6 +2181,13 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature {
return true; // Always show glance tabs
}
+ // See https://github.com/zen-browser/desktop/issues/10666, we should never
+ // show closing tabs and consider them as not part of any workspace. This will
+ // invalidate the `lastSelectedTab[previousWorkspaceId]` logic in `_handleTabSelection`
+ if (tab.closing) {
+ return false; // Never show closing tabs
+ }
+
// Handle essential tabs
if (isEssential) {
if (!this.containerSpecificEssentials) {
@@ -2453,7 +2480,8 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature {
const shouldHideSeparator =
pinnedContainer.children.length === 1 ||
Array.from(arrowScrollbox.children).filter(
- (child) => !child.hasAttribute('hidden') && !child.hasAttribute('zen-empty-tab')
+ (child) =>
+ !child.hasAttribute('hidden') && !child.closing && !child.hasAttribute('zen-empty-tab')
).length <= 1;
if (shouldHideSeparator) {
pinnedContainer.setAttribute('hide-separator', 'true');
@@ -2478,7 +2506,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature {
for (const entry of entries) {
let originalWorkspaceId = entry.target.getAttribute('zen-workspace-id');
if (!originalWorkspaceId) {
- originalWorkspaceId = entry.target.closest('zen-workspace')?.id;
+ originalWorkspaceId = entry.target.closest('zen-workspace')?.id || this.activeWorkspace;
}
const workspacesIds = [];
if (entry.target.closest('#zen-essentials')) {
@@ -2494,12 +2522,13 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature {
}
for (const workspaceId of workspacesIds) {
const workspaceElement = this.workspaceElement(workspaceId);
- if (!workspaceElement) {
+ const workspaceObject = this.getWorkspaceFromId(workspaceId);
+ if (!workspaceElement || !workspaceObject) {
+ console.warn('Workspace element or object not found for id', workspaceId);
continue;
}
const arrowScrollbox = workspaceElement.tabsContainer;
const pinnedContainer = workspaceElement.pinnedTabsContainer;
- const workspaceObject = this.getWorkspaceFromId(workspaceId);
const essentialContainer = this.getEssentialsSection(workspaceObject.containerTabId);
const essentialNumChildren = essentialContainer.children.length;
let essentialHackType = 0;
@@ -2540,7 +2569,9 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature {
this._lastSelectedWorkspaceTabs[workspaceID] = gZenGlanceManager.getTabOrGlanceParent(tab);
tab.removeAttribute('change-workspace');
const workspace = this.getWorkspaceFromId(workspaceID);
- await this.changeWorkspace(workspace);
+ setTimeout(() => {
+ this.changeWorkspace(workspace);
+ }, 0);
}
return;
}
@@ -3002,6 +3033,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature {
onWindowResize(event = undefined) {
if (!(!event || event.target === window)) return;
+ gZenUIManager.updateTabsToolbar();
// Check if workspace icons overflow the parent container
const parent = this.workspaceIcons;
if (!parent || this._processingResize) {
@@ -3016,7 +3048,7 @@ var gZenWorkspaces = new (class extends nsZenMultiWindowFeature {
parent.removeAttribute('icons-overflow');
return;
}
- const maxButtonSize = 26; // IMPORTANT: This should match the CSS size of the icons
+ const maxButtonSize = 30; // IMPORTANT: This should match the CSS size of the icons
const minButtonSize = 15;
const separation = 3; // Space between icons
diff --git a/src/zen/workspaces/zen-workspaces.css b/src/zen/workspaces/zen-workspaces.css
index a37da3d66..eb1044835 100644
--- a/src/zen/workspaces/zen-workspaces.css
+++ b/src/zen/workspaces/zen-workspaces.css
@@ -33,8 +33,8 @@
& toolbarbutton {
margin: 0;
- max-width: 26px;
- height: 26px;
+ max-width: 28px;
+ height: 28px;
display: flex;
justify-content: center;
padding: 0 !important;
@@ -47,7 +47,7 @@
line-height: 0;
&:is(img) {
- padding: 6px;
+ width: 14px;
}
&[no-icon='true'] {
@@ -63,7 +63,8 @@
transition:
filter 0.2s,
opacity 0.2s,
- width 0.1s;
+ width 0.1s,
+ transform 0.2s;
&[active='true'],
&:hover,
@@ -152,6 +153,7 @@
/* Mark workspaces indicator */
.zen-current-workspace-indicator {
+ margin-top: 1px;
padding: calc(2px + var(--tab-inline-padding) + var(--zen-toolbox-padding));
font-weight: 500;
position: relative;
@@ -163,7 +165,7 @@
max-width: 100%;
width: 100%;
font-size: small;
- padding-right: 10px;
+ padding-right: 12px;
-moz-window-dragging: no-drag;
&::before {
@@ -237,7 +239,10 @@
--toolbarbutton-inner-padding: 6px;
& image {
- border-radius: calc(var(--border-radius-medium) - 4px);
+ border-radius: calc(var(--border-radius-medium) - 4px) !important;
+ width: 26px;
+ height: 26px;
+ margin-right: -1px;
}
:root[zen-renaming-tab='true'] & {
diff --git a/src/zen/zen.globals.js b/src/zen/zen.globals.js
index c8dc0987f..a225ca767 100644
--- a/src/zen/zen.globals.js
+++ b/src/zen/zen.globals.js
@@ -7,6 +7,8 @@ export default [
'nsZenDOMOperatedFeature',
'nsZenPreloadedFeature',
+ 'nsZenSiteDataPanel',
+
'ZenThemeModifier',
'ZenHasPolyfill',
diff --git a/surfer.json b/surfer.json
index f408413bf..d2baf90a9 100644
--- a/surfer.json
+++ b/surfer.json
@@ -5,8 +5,8 @@
"binaryName": "zen",
"version": {
"product": "firefox",
- "version": "143.0.1",
- "candidate": "143.0.1"
+ "version": "144.0",
+ "candidate": "144.0"
},
"buildOptions": {
"generateBranding": true
@@ -19,7 +19,7 @@
"brandShortName": "Zen",
"brandFullName": "Zen Browser",
"release": {
- "displayVersion": "1.16.2b",
+ "displayVersion": "1.17b",
"github": {
"repo": "zen-browser/desktop"
},
@@ -39,7 +39,7 @@
"brandShortName": "Twilight",
"brandFullName": "Zen Twilight",
"release": {
- "displayVersion": "1.16t",
+ "displayVersion": "1.18t",
"github": {
"repo": "zen-browser/desktop"
}
diff --git a/tools/ffprefs/src/main.rs b/tools/ffprefs/src/main.rs
index e044fd0f5..e2c7259e6 100644
--- a/tools/ffprefs/src/main.rs
+++ b/tools/ffprefs/src/main.rs
@@ -102,10 +102,10 @@
//
use serde::{Deserialize, Serialize};
+use std::collections::HashMap;
use std::env;
use std::fs;
use std::path::PathBuf;
-use std::collections::HashMap;
const STATIC_PREFS: &str = "../engine/modules/libpref/init/zen-static-prefs.inc";
const FIREFOX_PREFS: &str = "../engine/browser/app/profile/firefox.js";
@@ -136,25 +136,34 @@ fn ordered_prefs(mut prefs: Vec) -> Vec {
prefs
}
-fn load_preferences() -> Vec {
- let mut prefs = Vec::new();
- let config_path = get_config_path();
- // Iterate each file in the prefs directory
- if let Ok(entries) = fs::read_dir(&config_path) {
+fn get_prefs_files_recursively(dir: &PathBuf, files: &mut Vec) {
+ if let Ok(entries) = fs::read_dir(dir) {
for entry in entries {
if let Ok(entry) = entry {
- if let Some(ext) = entry.path().extension() {
+ let path = entry.path();
+ if path.is_dir() {
+ get_prefs_files_recursively(&path, files);
+ } else if let Some(ext) = path.extension() {
if ext == "yaml" || ext == "yml" {
- let file_path = entry.path();
- let content = fs::read_to_string(&file_path).expect("Failed to read file");
- let mut parsed_prefs: Vec =
- serde_yaml::from_str(&content).expect("Failed to parse YAML");
- prefs.append(&mut parsed_prefs);
+ files.push(path);
}
}
}
}
}
+}
+
+fn load_preferences() -> Vec {
+ let mut prefs = Vec::new();
+ let config_path = get_config_path();
+ let mut pref_files = Vec::new();
+ get_prefs_files_recursively(&config_path, &mut pref_files);
+ for file_path in pref_files {
+ let content = fs::read_to_string(&file_path).expect("Failed to read file");
+ let mut parsed_prefs: Vec =
+ serde_yaml::from_str(&content).expect("Failed to parse YAML");
+ prefs.append(&mut parsed_prefs);
+ }
ordered_prefs(prefs)
}