Compare commits

..

313 Commits

Author SHA1 Message Date
mr. M
8813c5174e Update newtabButton to newtabButtons for multiple button handling in ZenUIManager 2025-02-14 19:57:54 +01:00
mr. M
47824d8bca Simplify ResizeObserver initialization in ZenUIManager by consolidating method calls 2025-02-14 19:43:57 +01:00
mr. M
bf91ffddf3 Update visibility handling in ZenWorkspaces by replacing position styles with hidden attribute 2025-02-14 19:42:48 +01:00
mr. M
1a293fc5ff Refactor initialization logic in ZenStartup and update tab toolbar handling in ZenUIManager and ZenPinnedTabManager 2025-02-14 19:32:56 +01:00
mr. M
786a377ada Invalidate cached tabs after inserting a new pinned tab in ZenPinnedTabManager 2025-02-14 17:01:28 +01:00
mr. M
12e2781668 Format code for better readability in ZenWorkspaces 2025-02-14 16:53:03 +01:00
mr. M
5ace391a61 Fixed common bugs with workspaces 2025-02-14 16:52:46 +01:00
mr. M
31f5762efd Improve active workspace selection logic in ZenWorkspaces 2025-02-14 12:45:48 +01:00
mr. M
c27a26eee4 Rename 'zen-browser-tabs-wrapper' to 'zen-tabs-wrapper' across multiple files for consistency 2025-02-14 11:38:00 +01:00
mr. M
46ff0020bb Format event listener and improve attribute setting for workspace tabs 2025-02-14 11:32:40 +01:00
mr. M
869c2eb8b2 Refactor pinned tab management and improve event handling for workspace initialization 2025-02-14 11:29:25 +01:00
mr. m
721e121ebe Merge pull request #5342 from JSGRD22/patch-1
Fix text rendering issues by decreasing gfx.canvas.accelerated.cache-size back to Firefox default
2025-02-13 22:40:18 +01:00
mr. M
07ede1b96b Add Windows acrylic support and enhance toolbar transparency styles 2025-02-13 22:02:17 +01:00
mr. M
48879fb6a0 Enhance workspace tab initialization and update tab toolbar on load 2025-02-13 21:15:55 +01:00
mr. M
855c36280b Refactor tab overflow detection and adjust workspace initialization logic 2025-02-13 19:36:00 +01:00
mr. M
31ef8d2ec9 Refactor tab management and update CSS for improved layout and performance 2025-02-13 19:17:20 +01:00
mr. M
a5ae4077cf Refactor workspace tab transformations and update tab selection logic 2025-02-13 17:32:33 +01:00
mr. m
d6acd4deb8 Fixed switching workspaces 2025-02-13 16:29:34 +01:00
Jupi
5f7283531f Set gfx.canvas.accelerated.cache-size to 256 by default
Signed-off-by: Jupi <73097618+JSGRD22@users.noreply.github.com>
2025-02-13 21:24:55 +08:00
mr. m
ab836eb762 Fixed workspace switching 2025-02-13 11:16:16 +01:00
mr. m
22cc24e9f8 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-02-13 11:01:01 +01:00
mr. m
4f41aab3fa merge 2025-02-13 11:00:56 +01:00
mr. M
8b98469936 Added support for acrylic backgrounds for windows 11 with mica support 2025-02-12 21:38:05 +01:00
mr. M
d16992f5b2 Force overflow-x clipping in vertical tabs to ensure consistent styling 2025-02-12 20:05:56 +01:00
mr. M
9f6fbc5e57 Refactor tab handling and session restore logic for improved workspace management 2025-02-12 20:03:00 +01:00
mr. m
aebc2c9660 Fixed handling tab opens/close on workspaces 2025-02-12 15:36:59 +01:00
mr. m
23d9487ca7 Fixed pinned tabs separator using the wrong tabs when hiding 2025-02-12 15:35:37 +01:00
mr. m
bd4f9788cc Fixed urlbar glitching when focusing in compact mode 2025-02-12 13:16:20 +01:00
mr. m
40a843200f Fixed unpinning tabs 2025-02-12 12:39:13 +01:00
mr. m
22cad83c8f Fixed creating a new workspace in the new system 2025-02-12 10:58:53 +01:00
mr. m
c4b4aa6287 Fixed switching workspaces with 2025-02-11 23:27:43 +01:00
mr. m
2c9358ca07 Merge pull request #5273 from zen-browser/new-workspaces-layout
Started working on new workspaec layout
2025-02-11 22:06:49 +01:00
mr. M
d35fcabf92 Refactor workspace tab animations and improve workspace strip organization 2025-02-11 22:06:13 +01:00
mr. M
e387652c8b HUGE: handle workspaces as individual containers instead of a single list of tabs 2025-02-11 22:01:41 +01:00
mr. m
6f612d62cf Started working on new workspaec layout 2025-02-11 16:35:06 +01:00
mr. m
48badb83cf Fixed creating a new tab when we can just select the last one when switching workspaces 2025-02-11 13:45:09 +01:00
mr. m
6600e60498 Fixed showing wrong tab when changing workspaces 2025-02-11 13:40:13 +01:00
mr. m
c058950119 Formatted the project 2025-02-11 13:28:02 +01:00
mr. m
7cf0e05f70 Fixed normal tabs appear on pinned tab container 2025-02-11 13:26:50 +01:00
mr. m
f2460549e0 Added outline to urlbar when floating 2025-02-11 12:41:23 +01:00
mr. m
290aa09f89 Small urlbar improvements 2025-02-11 11:32:09 +01:00
mr. M
be2a44dab9 Added a timeout before the newtab url bar can clear it's content 2025-02-10 22:16:50 +01:00
mr. M
b5c889ab01 Refactor tab reset button label and clean up unused color scheme listener 2025-02-10 21:52:23 +01:00
mr. M
84bf229944 Fixed urlbar being hidden/glitched on fullscreen 2025-02-10 20:48:41 +01:00
mr. M
2dbd80f539 Increase minimum width of the urlbar to improve usability 2025-02-10 20:30:13 +01:00
mr. M
7990bfefad Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-02-10 20:12:37 +01:00
mr. M
d457e6fc76 Fixed urlbar hiding when entering on a composition state 2025-02-10 20:12:00 +01:00
mr. m
d2ee1507d9 Merge pull request #5224 from JSGRD22/patch-1
Improve corner radius on windows for a more native and consistent look (very minor change, not tested)
2025-02-10 16:03:25 +01:00
Jupi
c76066c99b Improve corner radius on windows for a more native and consistent look
Signed-off-by: Jupi <73097618+JSGRD22@users.noreply.github.com>
2025-02-10 21:54:28 +08:00
mr. M
0e8646d592 Refactor theme border-radius preference for consistency across platforms 2025-02-10 00:24:01 +01:00
mr. M
3708b86e58 Remove middle-click new tab preference and associated event handling for vertical tabs 2025-02-09 18:12:30 +01:00
mr. M
1475d3daee Refactor theme preferences by removing unused color options and adjusting border radius settings 2025-02-09 17:20:27 +01:00
mr. M
988056e59c Add overflow-clip-margin to vertical tabs for improved layout handling 2025-02-09 14:52:05 +01:00
mr. M
b79d6a7347 Reduce minimum width of the URL bar when open to improve layout flexibility 2025-02-08 20:20:00 +01:00
mr. M
1c83609b8c Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-02-08 19:42:02 +01:00
mr. M
4605b4f3ca Fix tab position calculation by removing unnecessary increment 2025-02-08 19:41:56 +01:00
mr. m
dd9c57a1d2 Delete .github/workflows/staler.yml
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-02-08 14:14:11 +01:00
mr. M
06a03cd4ca Refactor tab management logic to improve visibility of pinned tabs and enhance tab filtering 2025-02-08 00:11:06 +01:00
mr. M
bf6f0b19fd Update sidebar and menu icons for improved visual consistency 2025-02-07 23:40:31 +01:00
mr. M
da04a7a629 Enhance tab management by allowing drag-and-drop functionality with the workspace indicator and adjust URL bar primary adjustment timing 2025-02-07 23:36:07 +01:00
mr. M
d16ae38b28 Update URL bar behavior and version numbers in surfer.json 2025-02-07 23:00:06 +01:00
mr. M
f0976bc582 Implement scrollbar state management and adjust overflowing behavior in Zen UI components 2025-02-07 22:46:53 +01:00
mr. M
527b8a39f8 Enhance URL bar behavior by adjusting primary selection suppression and refining CSS styles for compact mode 2025-02-07 22:23:06 +01:00
mr. M
64cadfe37a Adjust margin styles for URL bar elements to improve layout consistency 2025-02-07 22:13:37 +01:00
mr. M
5527aaebe9 Refactor tab selection styles and remove debug log from ZenUIMigration 2025-02-07 21:08:44 +01:00
mr. M
8dfffc6ac0 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-02-07 19:51:05 +01:00
mr. M
302331bc7d Fixed tabs appearing on the pinned tab container 2025-02-07 19:48:45 +01:00
mr. M
d2477b5f8a Fixed middle clicks on the sidebar not opening a new tab 2025-02-07 19:30:51 +01:00
mr. m
e353d48af8 Fixed urlbar 2025-02-07 01:42:48 +01:00
mr. m
3a5a0be013 Fixed icons colors and other details 2025-02-07 01:33:48 +01:00
mr. m
1f6233c1e1 Fixed browser sidebar 2025-02-06 18:23:26 +01:00
mr. m
4824404636 Fixed sidebar icons 2025-02-06 13:56:25 +01:00
mr. m
23697a8930 Fixed glance opening tabs 2025-02-06 11:13:59 +01:00
mr. M
1e624ae580 Refactor getAndApplySidebarWidth to remove async and simplify sidebar width calculation 2025-02-06 07:37:27 +01:00
mr. M
8eaceb49cf Refactor ZenCompactMode to use async for sidebar width calculation and update overflow style 2025-02-06 07:32:13 +01:00
mr. M
459a37fc59 Enhance ZenCompactMode styles by adjusting transition timings and adding opacity effects for smoother animations 2025-02-06 07:07:46 +01:00
mr. M
5937338348 Refactor ZenCompactMode styles for consistent sidebar positioning and update animation parameters 2025-02-05 21:22:20 +01:00
mr. M
5e25b0ade9 Update profile preferences and modify default sidebar icons 2025-02-05 19:53:49 +01:00
mr. M
26a59ee1c1 Enable essentials favicon background and update tab icon overlay styles 2025-02-05 19:39:12 +01:00
mr. M
16e0b5f319 Remove existing firefox-l10n directory before cloning to ensure fresh download of language packs 2025-02-05 18:18:00 +01:00
mr. M
6d63d56fdd Refactor ZenUIMigration to use consistent single quotes for strings 2025-02-05 18:00:09 +01:00
mr. M
5e0b684b53 Implement Zen UI migration functionality and initialize on startup 2025-02-05 17:59:24 +01:00
mr. m
23fb79c9a3 Fixed twilight common issues 2025-02-05 15:18:45 +01:00
mr. m
071b7d2857 Merge pull request #4964 from jso8910/essential-workspace-switch-fix
Fixed bug where container-specific essentials don't remain focused when switching workspaces
2025-02-05 11:00:09 +01:00
jso8910
0666d18f06 Fixed bug where container-specific essentials don't remain focused when switching workspaces 2025-02-05 16:41:52 +08:00
mr. m
b65fbb53c8 Merge pull request #4957 from senacand/dev
bugfix: fix workspace swipe gesture does not respect the swipe direction
2025-02-05 07:32:20 +01:00
Sena Cahya
c401dfabdc Fix workspace swipe gesture does not respect the swipe direction 2025-02-05 08:57:56 +09:00
mr. M
25407369de Update subproject commit reference in l10n 2025-02-05 00:36:45 +01:00
mr. M
63109b4337 Enhance compact mode and URL bar behavior with improved transitions and offset handling; update version numbers in surfer.json 2025-02-05 00:35:38 +01:00
mr. M
365214d7f9 Refine CSS styles for compact mode and glance view, improving layout and background colors 2025-02-04 19:59:24 +01:00
mr. M
d9fc1e81cd Implement default keyboard shortcuts filling and migration handling 2025-02-04 19:26:04 +01:00
mr. M
f5a2206004 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-02-04 17:04:07 +01:00
mr. M
ff0c707061 Update Firefox version to 135.0 in README and configuration files 2025-02-04 17:04:00 +01:00
mr. m
ece702ec86 Fixed twilight version 2025-02-04 11:15:37 +01:00
mr. m
5fba4cf081 Fixed common issues 2025-02-04 11:11:20 +01:00
mr. M
9d2192def1 Simplify hover background color for vertical tabs in CSS 2025-02-04 00:18:28 +01:00
mr. M
f0f58844b8 Refactor CSS for tab browser to improve styling consistency and fix layout issues 2025-02-04 00:15:42 +01:00
mr. M
feda757c81 Rename CopyCurrentURLAsMarkdownToClipboard method to follow camelCase convention 2025-02-03 23:44:29 +01:00
mr. m
8ca765cce0 Merge pull request #4801 from EmilyxFox/feature/copy-current-url-markdown
Add feature: copy current URL as markdown
2025-02-03 23:43:30 +01:00
EmilyxFox
7758b14f26 removed copy all in split view feature.
it needs more work
2025-02-03 22:05:47 +01:00
mr. M
846b24603e Refactor npm commands in workflows for consistency and improved clarity 2025-02-03 21:39:04 +01:00
mr. M
42dbff273f Refactor npm commands in workflows for consistency and improved clarity 2025-02-03 21:27:38 +01:00
mr. M
b1b83ae32a Refactor Surfer CI commands in workflows for consistency and improved readability 2025-02-03 21:24:05 +01:00
mr. M
24d8e7a5d7 Replace pnpm with npm in workflows and scripts for consistency across the project 2025-02-03 21:20:29 +01:00
mr. M
ff1c57c5a3 Refactor URL bar handling and improve tab removal logic for enhanced user experience 2025-02-03 21:01:13 +01:00
mr. M
01d9fc31c1 Enhance ZenUIManager and ZenPinnedTabManager for improved tab drag-and-drop behavior and URL bar handling 2025-02-03 20:27:03 +01:00
mr. M
88fbae4bec Refactor ZenPinnedTabManager and ZenUIManager for improved tab closing behavior and URL bar handling 2025-02-03 19:42:28 +01:00
EmilyxFox
ffbe58b808 different settings for either shortcut 2025-02-03 04:09:14 +01:00
EmilyxFox
eea432418e copying all tabs in view depends on setting 2025-02-03 00:48:09 +01:00
mr. M
d9c8609d43 Add tab selection handling to ZenUIManager for improved URL bar management 2025-02-03 00:33:07 +01:00
mr. M
aa70c1bd54 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-02-02 23:41:47 +01:00
mr. M
20b04937c9 URL bar now opens instead of a newtab (optional, on by default) 2025-02-02 23:40:40 +01:00
mr. M
5fa7d9cc6e Refactor ZenGlanceManager to streamline tab closing logic and improve animation handling 2025-02-02 22:58:39 +01:00
mr. m
7b21cf5971 Merge pull request #4863 from different55/preserve-newlines 2025-02-02 12:55:24 -08:00
mr. M
5a367fdad0 Enhance ZenGlanceManager to manage tab selection and closing animations more effectively 2025-02-02 21:41:30 +01:00
mr. M
f0eeec83ee Refactor vertical-tabs styles to simplify overflow handling and improve layout 2025-02-02 18:30:08 +01:00
mr. M
9c47e2a35b Refactor zen-glance and vertical-tabs styles for improved layout and button padding 2025-02-02 17:58:03 +01:00
mr. M
ba3eca5629 Refactor zen-theme styles and update icon SVGs for improved consistency and performance 2025-02-02 17:48:41 +01:00
mr. M
792c562a35 Refactor vertical-tabs and theme styles for improved layout and transition effects 2025-02-02 16:03:35 +01:00
mr. M
0cdc7351df Update sidebar order in vertical-tabs.css for improved layout consistency 2025-02-02 15:40:54 +01:00
mr. M
093074a9fc Refactor tab handling in ZenGlanceManager and update tab filtering logic for improved performance 2025-02-02 14:31:12 +01:00
mr. M
61190233fc Enhance tab management by updating tab close handling and improving tab drag-and-drop functionality 2025-02-02 14:25:05 +01:00
mr. M
b55e0eb1d3 Refactor zen-glance styles and improve tab handling with enhanced animations 2025-02-02 13:08:59 +01:00
Different55
275f8d1531 Preserve new lines in installed theme stylesheets
Signed-off-by: Different55 <burritosaur@protonmail.com>
2025-02-02 03:49:28 -06:00
mr. M
da1a032c96 Refactor animation code in ZenGlanceManager for improved readability 2025-02-02 00:11:15 +01:00
mr. M
d5cea8bb0e Refactor zen-glance styles and improve sidebar button animation handling 2025-02-02 00:06:19 +01:00
mr. M
07b70efd19 Refactor zen-glance styles and improve tab handling in ZenGlanceManager 2025-02-01 23:46:35 +01:00
EmilyxFox
9bad51b94e copy all urls in split view 2025-02-01 23:24:21 +01:00
mr. M
b8aa560d52 Glance can now be on multiple tabs and improved animations 2025-02-01 22:53:21 +01:00
EmilyxFox
e39419af25 fix indentation woops 2025-02-01 22:42:01 +01:00
mr. M
3e89b1dae6 Disable tab hover preview and clean up animation code in ZenGlanceManager 2025-02-01 17:29:32 +01:00
mr. M
c47c140489 Refactor zen-glance animation and improve tab context handling 2025-02-01 11:32:32 +01:00
mr. M
2b17b5bd72 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-02-01 10:32:58 +01:00
mr. M
faff428afb Update Linux build artifacts to use .tar.xz format 2025-02-01 10:32:53 +01:00
mr-cheff
031043f2f2 Update monthly issue metrics 2025-02-01 02:31:05 +00:00
mr. M
e7175149d0 Refactor sidebar CSS to use variable for margin calculation and remove unnecessary border 2025-02-01 00:24:02 +01:00
mr. M
4975ff6fdc Add Linux-specific padding for toolbox and clean up drag indicator calculations 2025-01-31 23:54:26 +01:00
mr. M
d81745eef2 Refactor tab close handling and maintain scrollbar state 2025-01-31 23:35:45 +01:00
EmilyxFox
20ede93eb1 Add feature: copy current URL as markdown 2025-01-31 23:27:23 +01:00
mr. M
7b41eb753d Refactor tab drag-and-drop functionality and enhance drag indicator styling 2025-01-31 23:02:13 +01:00
mr. m
00de303335 Merge pull request #4784 from kristijanribaric/feature/pin-tab-by-drag-and-drop
Enhance Tab Reordering: Add drag-and-drop between tab containers (normal tabs, pinned and essentials)
2025-01-31 12:37:57 -08:00
mr. m
7129e9d73b Merge branch 'dev' into feature/pin-tab-by-drag-and-drop
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-31 12:37:50 -08:00
Kristijan Ribarić
384e268516 Fixes after rebase 2025-01-31 20:11:48 +01:00
mr. M
1ad8a9b7f1 Add thin scrollbar style to vertical tabs for improved aesthetics 2025-01-31 20:11:45 +01:00
mr. M
ab33aae127 Remove unused double-click event listener and adjust tab event handling for improved functionality 2025-01-31 19:41:40 +01:00
mr. M
307becf086 Fixed Switch to workspace where container is set as default when opening container tabs not working 2025-01-31 19:13:18 +01:00
mr. M
4bca6a8306 Fix double-click behavior to open new tab 2025-01-31 18:35:55 +01:00
Kristijan Ribarić
d3a04d043b Enhance Zen Tab Reordering: Add drag-and-drop between tab containers (normal tabs, pinned and essentials)
This commit enhances the drag-and-drop functionality in Zen, allowing users to seamlessly reorder tabs between the pinned tabs, essential tabs, and regular tab containers.  The changes include:

- Added `moveToAnotherTabContainerIfNecessary` and `applyDragoverClass` methods to `ZenPinnedTabManager` to handle tab movement and visual feedback during drag-and-drop.
- Updated `tabs.js` to integrate with the new methods, correctly handling tab pinning and unpinning, and essential tab toggling during reordering.
- Added CSS classes and styles to visually indicate the drop position (before or after) a target tab during the drag operation.  This improves user experience and clarity.
2025-01-31 17:57:46 +01:00
mr. M
89d1f7a731 Add vertical tab animations and implement stale issue management workflow 2025-01-31 17:26:15 +01:00
mr. m
773a65a87e Merge pull request #4675 from zen-browser/firefox-135 2025-01-31 07:39:18 -08:00
mr. m
3f22bd4e79 Merge branch 'dev' into firefox-135
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-31 07:38:50 -08:00
mr. m
5259fa7cbd Fixed loading tab animations 2025-01-30 23:03:19 +01:00
mr. m
9dd58ce0a4 Fixed critical bug and updated to 1.7.4b 2025-01-30 22:57:33 +01:00
mr. m
097b7fb262 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-01-30 18:23:22 +01:00
mr. m
7975494bd6 Fixed uploading mac builds 2025-01-30 18:23:11 +01:00
mr. m
fd9a754209 Update README.md
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-30 06:42:40 -08:00
mr. m
c2f4d7cd86 Update README.md
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-30 06:41:33 -08:00
mr. m
5ff6d80dc8 Fixed finding last tab when animating 2025-01-30 14:09:42 +01:00
mr. m
cd8a8b6a97 Fixed macos buttons 2025-01-30 14:03:24 +01:00
mr. M
3413399dfa Adjust workspace tab behavior and refine swipe sensitivity thresholds 2025-01-30 07:10:35 +01:00
mr. M
93ab8babbc Fix default value formatting in workflow YAML files and clean up whitespace in update_ff.py 2025-01-30 00:39:11 +01:00
mr. M
8d8c9e8a01 Update localization commit hashes for Firefox cache and subproject 2025-01-30 00:38:46 +01:00
mr. m
aec9ef390c Merge pull request #4601 from zen-browser/macos-signing-fix 2025-01-29 15:25:49 -08:00
mr. m
6e5a56bed5 Discard changes to pnpm-lock.yaml 2025-01-29 15:25:29 -08:00
mr. m
175d12cf42 Discard changes to src/browser/base/zen-components/ZenGlanceManager.mjs 2025-01-29 15:24:15 -08:00
mr. m
6d9fd13fbe Discard changes to configs/macos/mozconfig 2025-01-29 15:23:54 -08:00
mr. M
9870047d05 Update macOS signing command to use 'production-without-restricted' environment 2025-01-30 00:21:59 +01:00
mr. M
010f9acb54 Fix tab animation transform property formatting for consistency 2025-01-29 23:42:14 +01:00
mr. M
a1a9f645f5 Adjust tab animation blur effect for smoother transitions 2025-01-29 23:04:08 +01:00
mr. M
db5dd9ba7f Enhance tab animation effects by adjusting transform and margin properties for smoother transitions 2025-01-29 22:49:36 +01:00
mr. M
30f1def143 Update macOS signing script to support notarization and adjust provisioning profile location 2025-01-29 22:07:14 +01:00
mr. M
b9dd0c6bf1 Bump version to 1.7.3b in surfer.json 2025-01-29 20:43:32 +01:00
mr. M
d158472709 Enhance tab animations and transition effects for improved user experience 2025-01-29 20:43:17 +01:00
mr. M
cb9c7d5c48 Improve tab animation opacity and enhance CSS transition formatting 2025-01-29 20:09:17 +01:00
mr. M
f580e53fc2 Reorder steps in macOS release build workflow to copy provisioning profile before signing the app 2025-01-29 19:56:34 +01:00
mr. M
c68456310c Merge branch 'macos-signing-fix' of https://github.com/zen-browser/desktop into macos-signing-fix 2025-01-29 19:53:42 +01:00
mr. M
8d156192d5 Refactor macOS signing command to support notarization and adjust embedded provisioning profile location 2025-01-29 19:53:34 +01:00
mr. M
0ab41a84bd Refactor tab button visibility and styles for improved UX 2025-01-29 17:07:42 +01:00
mr. m
a3e1033c11 Fixed macos signing 2025-01-29 14:52:15 +01:00
mr. m
ebcd656e70 Fixed git commits hashing 2025-01-29 14:45:12 +01:00
mr. m
68ea69bad6 Fixed overflow menu on macos 2025-01-29 13:37:18 +01:00
mr. m
4f9feeb953 Formatter project 2025-01-29 11:21:47 +01:00
mr. m
7f99691e92 Uploading platform.init 2025-01-29 10:47:31 +01:00
mr. m
4f37352afe Fixed static prefs not being defined for macos windows 2025-01-29 10:30:53 +01:00
mr. M
32c001d06d Add dummy preference 'zen.browser.is-cool' to generate StaticPrefs_zen.h on all OS 2025-01-28 23:29:14 +01:00
mr. M
b81e1a3c70 Add 'zen' to preference groups in moz.build 2025-01-28 23:11:39 +01:00
mr. M
d32950a1b9 Refactor macOS signing command to remove Firefox condition from entitlements 2025-01-28 22:19:50 +01:00
mr. M
da13e238ac Add macOS monochrome window controls preference 2025-01-28 21:40:15 +01:00
mr. m
3c58f91d28 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-01-28 21:18:42 +01:00
mr. m
c004cd47f0 Added monochrome preference to macos window buttons 2025-01-28 21:18:03 +01:00
mr. m
6db11763f6 Merge pull request #4672 from Tanay-Kar/patch-4 2025-01-28 11:30:16 -08:00
mr. M
1e99b8cf36 Add !important to browser background style for overriding specificity 2025-01-28 20:26:59 +01:00
mr. M
fea9987b02 Update macOS signing command to use production entitlements and adjust rcodesign command for notarization 2025-01-28 20:20:42 +01:00
mr. m
67a6d9c844 Fixed swiping animations 2025-01-28 19:58:53 +01:00
mr. M
b2d476659e Update @zen-browser/surfer dependency to version 1.9.16 and adjust macOS signing command 2025-01-28 19:12:08 +01:00
Tanay Kar
8381fba596 Fixed visual inconsistency with split view confirmation popup
Assigned --arrowpanel-background to --zen-colors-primary for #confirmation-hint 

Signed-off-by: Tanay Kar <93914273+Tanay-Kar@users.noreply.github.com>
2025-01-28 21:52:40 +05:30
mr. M
5342837f0a Enhance vertical tab animations and improve background opacity for better visibility 2025-01-28 17:11:02 +01:00
mr. M
2787546f89 Fix tab scrolling logic to correctly check for zen-essential attribute 2025-01-28 17:10:06 +01:00
mr. M
34c9d808f8 Update background opacity for tab hover effects to enhance visibility 2025-01-28 17:02:02 +01:00
mr. M
02f1f52c2f Refactor active state styling for vertical tabs to simplify CSS rules 2025-01-28 17:00:58 +01:00
mr. M
8d2e0b0a89 Add support for updating the l10n last commit hash and new script option 2025-01-28 16:46:16 +01:00
mr. m
a408449e2c Updated to firefox RC 135.0 2025-01-28 16:27:56 +01:00
mr. m
c19748bbbe Update @zen-browser/surfer dependency to version 1.9.15 and refine macOS build workflows 2025-01-28 14:02:55 +00:00
mr. m
b6063c0831 Fixed panel UI not allowing popups to trigger
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-28 03:26:27 -08:00
mr. m
00682ed150 Update macos-universal-release-build.yml
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-28 08:27:49 +01:00
mr. M
af24ff6049 Cleanup macOS build workflow by removing unnecessary directory and adding executable permission to MAR 2025-01-28 01:50:25 +01:00
mr. M
e0376b88f5 Refactor animation code for improved readability and maintainability 2025-01-28 00:33:40 +01:00
mr. M
188fea025d Update cron schedule for candidate release check to run on Tuesday at 4:59 AM 2025-01-28 00:33:01 +01:00
mr. M
d69cc7edf4 Update cron schedule for candidate release check workflow 2025-01-27 23:59:31 +01:00
mr. M
f9ec71ba58 Add support for uploading and downloading host mar artifact in macOS build workflows 2025-01-27 23:44:34 +01:00
mr. M
1c59a6d461 Fix event target check in tab scrolling logic for improved performance 2025-01-27 22:30:47 +01:00
mr. M
29a0707bcd Update text-shadow property for improved visibility in zen-workspaces 2025-01-27 22:25:39 +01:00
mr. M
d4a9f9058d Add media query for macOS to enhance tab border radius and improve native appearance 2025-01-27 22:23:50 +01:00
mr. M
5c2274f429 Enhance workspace indicator styling for improved visibility and aesthetics 2025-01-27 21:28:49 +01:00
mr. M
ca57fa391d Update @zen-browser/surfer dependency to version 1.9.14 2025-01-27 20:50:46 +01:00
mr. M
9c7c8fc227 Update tab border radius for a more native appearance on Windows 2025-01-27 19:02:45 +01:00
mr. M
d1471d197f Add media query for Windows to enhance native appearance of tab borders 2025-01-27 18:58:39 +01:00
mr. M
add4576f0a Refactor vertical-tabs.css to improve overflow handling for better tab visibility and layout 2025-01-27 18:55:58 +01:00
mr. M
acacf0885c Update zen-toolbar background color for improved visual consistency 2025-01-27 18:49:56 +01:00
mr. M
7deaecc123 Refactor tab closing logic to improve handling of zen glance tabs and enhance tab sizing behavior 2025-01-27 18:45:59 +01:00
mr. M
b82b0322a1 Fix path in macOS universal release build workflow for artifact location 2025-01-27 18:04:14 +01:00
mr. m
c6a92c2670 Update macos-universal-release-build.yml
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-27 13:20:07 +01:00
mr. m
1d9c2f878e Fixed macos signing command 2025-01-27 10:20:19 +00:00
mr. m
dd7233c81e Update macos-universal-release-build.yml
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-27 08:29:11 +01:00
mr. M
d4dd298ef8 Enhance tab management by updating the toolbar on tab close and adjusting overflow behavior for the tab browser 2025-01-27 01:23:01 +01:00
mr. M
53e015a7aa Update @zen-browser/surfer dependency to version 1.9.13 2025-01-27 01:12:10 +01:00
mr. M
9203918788 Update vertical-tabs.css to apply dynamic padding for improved layout consistency 2025-01-27 01:05:36 +01:00
mr. M
b9ae18a0ca Refactor sidebar scrolling logic and improve tab height calculations for better UI performance 2025-01-27 00:29:54 +01:00
mr. M
d548b8cb6d Remove unnecessary directory change in artifact renaming step 2025-01-26 23:30:20 +01:00
mr. M
3931f8195b Refactor sidebar scrolling initialization and enhance tab visibility checks 2025-01-26 23:30:01 +01:00
mr. M
7077a01dad Increase tab unloader timeout from 20 to 40 minutes for improved performance 2025-01-26 21:59:41 +01:00
mr. M
26b3195bdd Fixed keyboard shortcuts not working after pinning extension to the bookmarks bar 2025-01-26 21:50:13 +01:00
mr. M
9b79e3c1ac Update macOS release build workflow to move all DMG files to a unified naming format 2025-01-26 21:40:34 +01:00
mr. M
405b2180cf Enable smooth scrolling in tabs and adjust tab height calculations for better UI responsiveness 2025-01-26 21:36:09 +01:00
mr. M
462f354a9d Removed panel ui button for macos users 2025-01-26 20:04:35 +01:00
mr. M
d3f14bd9c3 Refactor macOS build workflows to unify artifact naming and update dependencies 2025-01-26 19:54:03 +01:00
mr. M
d9939ea9be Refactor macOS build workflow to remove specific .app cleanup and delete unused telemetry build scripts 2025-01-26 15:57:11 +01:00
mr. M
9c5ae70562 Remove generation of ScalarArtifactDefinitions.json from telemetry build process 2025-01-26 14:06:50 +01:00
mr. M
cfa03fe1f9 Remove unused onThemePickerClick method from ZenGradientGenerator 2025-01-26 13:40:31 +01:00
mr. M
df745e1b43 Remove generation of EventArtifactDefinitions.json from telemetry build process 2025-01-26 12:12:11 +01:00
mr. M
b863045a8f Rename extract_dmg to unpack_dmg in macOS build workflow and fix newline in surfer.json 2025-01-25 22:55:42 +01:00
mr. M
ac53d731e9 Refactor macOS build workflow to streamline .app extraction from DMG files 2025-01-25 21:19:26 +01:00
mr. M
fa62827717 Increase font size of the popup notification dropmarker for better visibility 2025-01-25 18:16:29 +01:00
mr. M
5423aee3d5 Fixed print dialog not opening and fixed website dialogs being clipped 2025-01-25 18:04:01 +01:00
mr. M
74a4d982a5 Update macOS build workflow to use wildcard for DMG file attachment 2025-01-25 17:41:08 +01:00
mr. M
a7184adc4d Add ellipsis to URL bar placeholder text for improved visibility 2025-01-25 17:11:19 +01:00
mr. M
3fba559323 Fix sidebar button targeting in ZenUIManager and adjust CSS for right-side layout 2025-01-25 17:09:33 +01:00
mr. M
d41f0d7cf4 Add directory change to macOS build workflow before extracting .app from dmg 2025-01-25 15:47:47 +01:00
mr. M
9ebfc973f3 Add set -ex to macOS build workflow for improved error handling during .app extraction 2025-01-25 15:46:56 +01:00
mr. M
9850c977be Refactor macOS build workflow to improve artifact packaging process 2025-01-25 15:45:37 +01:00
mr. M
7fc4c03659 Change event listener from 'MozAfterPaint' to 'DOMContentLoaded' for better timing of resize event dispatch 2025-01-25 13:53:59 +01:00
mr. M
9c9627573b Merge branch 'macos-signing-fix' of https://github.com/zen-browser/desktop into macos-signing-fix 2025-01-25 13:52:16 +01:00
mr. M
abedcd8896 Remove emoji from extract step name in macOS build workflow 2025-01-25 13:52:12 +01:00
mr. M
63fcbc73a5 Enhance compact mode functionality by refining sidebar animation conditions and updating CSS ignore rules 2025-01-25 13:42:52 +01:00
mr. m
a724f9c6f2 Discard changes to src/browser/base/zen-components/ZenGlanceManager.mjs 2025-01-25 12:18:52 +01:00
mr. M
c67440a940 Fix variable reference in artifact packaging step of macOS build workflow 2025-01-25 12:15:37 +01:00
mr. M
d996db31d6 Refactor compact mode styles and improve vertical tab button visibility 2025-01-25 12:14:16 +01:00
mr. M
504faad077 Refactor macOS build workflows to improve artifact handling and extraction process 2025-01-25 10:49:47 +01:00
mr. M
c0eeab939b Implement wait promise for preference changes in ZenVerticalTabsManager 2025-01-25 02:01:48 +01:00
mr. M
ca4952c02c Add build ID generation and pass to build workflows 2025-01-25 00:44:40 +01:00
mr. M
952385f362 Fix quoting for APP_NAME environment variable in macOS build workflow 2025-01-24 21:25:49 +01:00
mr. M
343bfe12fd Update Windows release build workflow to include apt-get update before installing dependencies 2025-01-24 21:23:32 +01:00
mr. M
ac600ad91b Remove redundant APP_NAME verification step in macOS build workflow 2025-01-24 19:08:04 +01:00
mr. M
acfdb5b191 Update Windows release build workflow to include --fix-missing in apt-get install command 2025-01-24 18:42:51 +01:00
mr. M
ca1e0ffdea Refactor tab unloading logic to use explicit unload method and remove linked panel attribute 2025-01-24 17:55:31 +01:00
mr. M
a3bebadff8 Fixed crash on overflow menu in macos and fixed elements shifting on macos fullscreen 2025-01-24 17:41:03 +01:00
mr. M
22a042d35d Refine APP_NAME extraction and add verification step in macOS build workflow 2025-01-24 17:04:10 +01:00
mr. m
0def2c24c8 Update macos-universal-release-build.yml
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-24 02:00:22 +01:00
mr. M
a09f3ab32c Limit search depth for .app folders and refine APP_NAME extraction in macOS build workflow 2025-01-23 23:55:02 +01:00
mr. M
5f7fcd57d2 Fix quoting for environment variable expansion in macOS build workflow 2025-01-23 21:47:17 +01:00
mr. M
952c02d3d6 Refactor toolbar button active background color for improved consistency 2025-01-23 21:46:39 +01:00
mr. M
355d98eb53 Fixed glance opening on essential tabs even if it's disabled (closes #4564) 2025-01-23 19:52:03 +01:00
mr. M
3972f3e2a7 Fixed glance opening on essential tabs even if it's disabled (closes https://github.com/zen-browser/desktop/issues/4564) 2025-01-23 19:51:12 +01:00
mr. M
c3f22ec7eb Update macOS build workflow to specify artifact download paths for architecture-specific folders 2025-01-23 19:47:47 +01:00
mr. M
8330b31a6d Formatted the project 2025-01-23 19:47:07 +01:00
mr. M
c89e953b6e Refactor tab animation logic to improve element selection and adjust animation durations for smoother transitions 2025-01-23 18:50:39 +01:00
mr. M
1536f5805e Increase transition duration for inset and opacity in zen-split-view for smoother animations 2025-01-23 18:16:57 +01:00
mr. M
a640509e04 Enhance macOS build workflows by renaming artifact paths and adding a step to list .app folders 2025-01-23 16:47:33 +01:00
mr. M
ea0a808e15 Update @zen-browser/surfer dependency to version 1.9.10 2025-01-23 14:26:33 +01:00
mr. M
20f3a4128c Refactor CSS styles to replace border-radius with native inner radius and update box-shadow for improved visual consistency 2025-01-23 14:09:34 +01:00
mr. M
f6bad14087 Update @zen-browser/surfer dependency to version 1.9.9 2025-01-23 12:23:26 +01:00
mr. M
83f8975a50 Update macOS build workflow to include mac dependency and modify Firefox browser identifier in hardened runtime configuration 2025-01-23 12:20:20 +01:00
mr. M
ce7c1f797f Refactor macOS build workflow and remove deprecated entitlements files 2025-01-23 12:10:26 +01:00
mr. M
bb9a97496d Fixed compact mode sidebar not re-opening when the animation key is off 2025-01-23 00:50:43 +01:00
mr. m
b94b5b2d90 Merge pull request #4521 from Vinamra7/dev 2025-01-22 21:18:27 +01:00
mr. M
b523f3d24e Update tab styles to use medium border radius for improved consistency 2025-01-22 20:41:28 +01:00
Vinamra Mishra
79966cb5ed Windows build fix
Signed-off-by: Vinamra Mishra <72907109+Vinamra7@users.noreply.github.com>
2025-01-22 19:36:27 +05:30
mr. M
c9f97665be Enhance ZenGlanceManager to conditionally open tabs based on domain differences and refactor tab open handling 2025-01-22 07:49:09 +01:00
mr. m
d618181dc7 Removed home button from default layout
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-21 21:43:08 -08:00
mr. M
e2b6054b17 Change event listener from 'DOMContentLoaded' to 'MozAfterPaint' for improved UI responsiveness in ZenCustomizableUI 2025-01-21 23:10:48 +01:00
mr. M
0f6bdcd88d Format event listener registration for improved readability in ZenCustomizableUI 2025-01-21 23:09:17 +01:00
mr. M
74c9923f0b Improve self-hosted runner script execution and enhance ZenCustomizableUI event handling for better UI responsiveness 2025-01-21 23:08:27 +01:00
mr. M
a86bb5197d Refactor build workflow and patch for improved self-hosted runner management and customizable UI functionality 2025-01-21 22:26:56 +01:00
mr. M
6c7b15eeca Fix formatting inconsistencies in ZenGlanceManager for improved code clarity 2025-01-21 21:32:48 +01:00
mr. M
4c44f874b9 Adjust positioning and animation properties in ZenGlanceManager for improved UI responsiveness 2025-01-21 21:17:53 +01:00
mr. M
4efc2cd05f Refactor ZenGlanceManager to improve readability and maintainability of tab opening logic 2025-01-21 20:43:54 +01:00
mr. M
839d5ce1f9 Enhance ZenGlance functionality by enabling external link opening and adjusting tab positioning 2025-01-21 20:42:32 +01:00
mr. M
7c2d35d746 Fix CSS formatting for zen-toolbar element background 2025-01-21 18:44:52 +01:00
mr. M
eff0b040a2 Update display version to 1.7.2b in surfer.json 2025-01-21 18:29:44 +01:00
mr. M
eede41fb18 Update Firefox version to 134.0.2 in README and surfer.json 2025-01-21 18:29:20 +01:00
mr. m
a66abd037e Bumped twilight to 1.7.2t
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-20 23:34:30 +01:00
mr. m
7edce1967f Fix CSS font-family quotes for macOS and standardize string quotes in ZenGlanceManager 2025-01-20 22:23:02 +00:00
mr. m
6c028d8511 Update Firefox version to 134.0.2 in README and configuration files; adjust CSS font-family for macOS. 2025-01-20 22:14:38 +00:00
mr. m
ef32e5f990 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-01-20 21:35:58 +00:00
mr. m
ba435d9c14 Rename workspace select button to workspaces button and update related styles for consistency 2025-01-20 21:35:46 +00:00
mr. m
f6db693407 Fixed firefox sidebar spacings
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-20 17:57:49 +01:00
mr. m
0f446a5435 Refactor border-radius values for consistency across themes and components 2025-01-20 15:46:27 +00:00
mr. m
0b17ceda90 Rename workspaces button to workspace select button and adjust related styles for consistency 2025-01-20 15:38:11 +00:00
mr. M
f000af56e7 Refactor tab and URL bar styles for improved transparency and backdrop filtering 2025-01-20 08:10:08 +01:00
mr. M
d06d684c96 Update selected tab background color and box-shadow for improved visual consistency 2025-01-20 07:51:34 +01:00
mr. M
24063ad883 Refactor selected tab background color for consistency with toolbar element styling 2025-01-20 07:43:47 +01:00
mr. M
3aa2109986 Handle potential errors in flashSidebar method to prevent interruptions in compact mode functionality 2025-01-20 07:42:39 +01:00
mr. M
5c3c9f3dfa Update URLs in Flatpak template and adjust border-radius settings for improved styling 2025-01-20 07:39:41 +01:00
239 changed files with 8647 additions and 5215 deletions

View File

@@ -54,6 +54,18 @@ jobs:
echo "GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }}" echo "GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }}"
echo "GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}" echo "GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}"
buildid:
name: Generate build ID
runs-on: ubuntu-latest
outputs:
buildids: ${{ steps.get.outputs.bid }}
steps:
- id: get
shell: bash -xe {0}
run: |
bdat=`date +"%Y%m%d%I%M%S"`
echo "bid=${bdat}" >> $GITHUB_OUTPUT
start-self-host: start-self-host:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: debug-inputs needs: debug-inputs
@@ -130,18 +142,9 @@ jobs:
with: with:
node-version-file: '.nvmrc' node-version-file: '.nvmrc'
- name: Setup pnpm
run: npm install -g pnpm
- name: Get pnpm store directory
id: pnpm-cache
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
- name: Install dependencies - name: Install dependencies
run: | run: |
pnpm install npm install
- name: Setup Surfer - name: Setup Surfer
run: | run: |
@@ -150,12 +153,12 @@ jobs:
- name: Bump version - name: Bump version
if: ${{ inputs.update_version && inputs.update_branch == 'release' }} if: ${{ inputs.update_version && inputs.update_branch == 'release' }}
run: | run: |
pnpm surfer ci --brand ${{ inputs.update_branch }} --bump prerelease npm run surfer -- ci --brand ${{ inputs.update_branch }} --bump prerelease
- name: Bump version without new version - name: Bump version without new version
if: ${{ !inputs.update_version || inputs.update_branch == 'twilight' }} if: ${{ !inputs.update_version || inputs.update_branch == 'twilight' }}
run: | run: |
pnpm surfer ci --brand ${{ inputs.update_branch }} npm run surfer -- ci --brand ${{ inputs.update_branch }}
- name: Debug - name: Debug
run: | run: |
@@ -199,18 +202,9 @@ jobs:
with: with:
node-version-file: '.nvmrc' node-version-file: '.nvmrc'
- name: Setup pnpm
run: npm install -g pnpm
- name: Get pnpm store directory
id: pnpm-cache
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
- name: Install dependencies - name: Install dependencies
run: | run: |
pnpm install npm install
- name: Setup Surfer - name: Setup Surfer
run: | run: |
@@ -218,15 +212,14 @@ jobs:
- name: Activate Surfer CLI - name: Activate Surfer CLI
run: | run: |
echo "There's a bug in the Surfer CLI, we run this so that Surfer sets everything up correctly" npm run surfer -- ci --brand ${{ inputs.update_branch }} --display-version ${{ needs.build-data.outputs.version }}
pnpm surfer ci --brand ${{ inputs.update_branch }} --display-version ${{ needs.build-data.outputs.version }}
- name: Check version - name: Check version
run: | run: |
echo "$(pwd)" echo "$(pwd)"
ls . echo $(npm run --silent surfer -- get version | xargs)
echo "version=$(pnpm surfer get version | xargs)" >> $GITHUB_OUTPUT echo "version=$(npm run --silent surfer -- get version | xargs)" >> $GITHUB_OUTPUT
if [[ $(pnpm surfer get version | xargs) == ${{ needs.build-data.outputs.version }} ]]; then if [[ $(npm run --silent surfer -- get version | xargs) == ${{ needs.build-data.outputs.version }} ]]; then
echo ">>> Version matches" echo ">>> Version matches"
else else
echo ">>> Version mismatch" echo ">>> Version mismatch"
@@ -256,27 +249,18 @@ jobs:
git config --global user.email "mauro-balades@users.noreply.github.com" git config --global user.email "mauro-balades@users.noreply.github.com"
git config --global user.name "mauro-balades" git config --global user.name "mauro-balades"
- name: Setup pnpm
run: npm install -g pnpm
- name: Get pnpm store directory
id: pnpm-cache
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
- name: Install dependencies - name: Install dependencies
run: | run: |
pnpm install npm install
- name: Load Surfer CI setup - name: Load Surfer CI setup
run: pnpm surfer ci --brand ${{ inputs.update_branch }} --display-version ${{ needs.build-data.outputs.version }} run: npm run surfer -- ci --brand ${{ inputs.update_branch }} --display-version ${{ needs.build-data.outputs.version }}
- name: Download Firefox source and dependencies - name: Download Firefox source and dependencies
run: pnpm surfer download --verbose run: npm run download --verbose
- name: Import - name: Import
run: pnpm surfer import --verbose run: npm run import -- --verbose
- name: Compress - name: Compress
run: | run: |
@@ -294,7 +278,7 @@ jobs:
windows-step-1: windows-step-1:
name: Windows build step 1 (PGO build) name: Windows build step 1 (PGO build)
uses: ./.github/workflows/windows-release-build.yml uses: ./.github/workflows/windows-release-build.yml
needs: [build-data] needs: [build-data, buildid]
permissions: permissions:
contents: write contents: write
secrets: inherit secrets: inherit
@@ -303,6 +287,7 @@ jobs:
generate-gpo: true generate-gpo: true
profile-data-path-archive: zen-windows-profile-data-and-jarlog.zip profile-data-path-archive: zen-windows-profile-data-and-jarlog.zip
release-branch: ${{ inputs.update_branch }} release-branch: ${{ inputs.update_branch }}
MOZ_BUILD_DATE: ${{needs.buildid.outputs.buildids}}
windows-step-2: windows-step-2:
name: Windows build step 2 (Generate profile data) name: Windows build step 2 (Generate profile data)
@@ -322,11 +307,12 @@ jobs:
permissions: permissions:
contents: write contents: write
secrets: inherit secrets: inherit
needs: [build-data, windows-step-2, start-self-host] needs: [build-data, windows-step-2, start-self-host, buildid]
with: with:
build-version: ${{ needs.build-data.outputs.version }} build-version: ${{ needs.build-data.outputs.version }}
generate-gpo: false generate-gpo: false
release-branch: ${{ inputs.update_branch }} release-branch: ${{ inputs.update_branch }}
MOZ_BUILD_DATE: ${{needs.buildid.outputs.buildids}}
linux: linux:
name: Linux build name: Linux build
@@ -334,10 +320,11 @@ jobs:
permissions: permissions:
contents: write contents: write
secrets: inherit secrets: inherit
needs: [build-data, start-self-host] needs: [build-data, start-self-host, buildid]
with: with:
build-version: ${{ needs.build-data.outputs.version }} build-version: ${{ needs.build-data.outputs.version }}
release-branch: ${{ inputs.update_branch }} release-branch: ${{ inputs.update_branch }}
MOZ_BUILD_DATE: ${{needs.buildid.outputs.buildids}}
mac: mac:
name: macOS build name: macOS build
@@ -345,7 +332,19 @@ jobs:
permissions: permissions:
contents: write contents: write
secrets: inherit secrets: inherit
needs: [build-data] needs: [build-data, buildid]
with:
build-version: ${{ needs.build-data.outputs.version }}
release-branch: ${{ inputs.update_branch }}
MOZ_BUILD_DATE: ${{needs.buildid.outputs.buildids}}
mac-uni:
name: macOS build (Universal)
uses: ./.github/workflows/macos-universal-release-build.yml
permissions:
contents: write
secrets: inherit
needs: [build-data, mac]
with: with:
build-version: ${{ needs.build-data.outputs.version }} build-version: ${{ needs.build-data.outputs.version }}
release-branch: ${{ inputs.update_branch }} release-branch: ${{ inputs.update_branch }}
@@ -373,14 +372,14 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: | run: |
npm install -g pnpm npm install
sudo apt-get update sudo apt-get update
sudo apt-get -y install libfuse2 desktop-file-utils appstream sudo apt-get -y install libfuse2 desktop-file-utils appstream
- name: Download Linux build - name: Download Linux build
uses: actions/download-artifact@v4 uses: actions/download-artifact@v4
with: with:
name: zen.linux-${{ matrix.arch }}.tar.bz2 name: zen.linux-${{ matrix.arch }}.tar.xz
- name: Execute AppImage build - name: Execute AppImage build
run: | run: |
@@ -441,7 +440,7 @@ jobs:
echo "Stopping self-hosted runner" echo "Stopping self-hosted runner"
echo "${{ secrets.SELF_HOSTED_RUNNER_STOP_SCRIPT }}" | base64 -d > stop.sh echo "${{ secrets.SELF_HOSTED_RUNNER_STOP_SCRIPT }}" | base64 -d > stop.sh
sudo chmod +x stop.sh sudo chmod +x stop.sh
bash ./stop.sh > /dev/null 2>&1 & bash ./stop.sh > /dev/null
- name: Remove self-hosted runner script - name: Remove self-hosted runner script
if: always() && ${{ inputs.create_release && inputs.update_branch == 'release' }} if: always() && ${{ inputs.create_release && inputs.update_branch == 'release' }}
@@ -453,7 +452,7 @@ jobs:
if: ${{ inputs.create_release || inputs.update_branch == 'twilight' }} if: ${{ inputs.create_release || inputs.update_branch == 'twilight' }}
permissions: write-all permissions: write-all
name: Release name: Release
needs: [build-data, linux, windows-step-3, check-release, mac, appimage, source, lint, stop-self-hosted] needs: [build-data, linux, windows-step-3, check-release, mac-uni, appimage, source, lint, stop-self-hosted]
runs-on: ubuntu-latest runs-on: ubuntu-latest
environment: environment:
name: ${{ inputs.update_branch == 'release' && 'Deploy-Release' || 'Deploy-Twilight' }} name: ${{ inputs.update_branch == 'release' && 'Deploy-Release' || 'Deploy-Twilight' }}
@@ -503,8 +502,7 @@ jobs:
cp -a ../windows_update_manifest_arm64/. updates/ cp -a ../windows_update_manifest_arm64/. updates/
fi fi
cp -a ../macos_update_manifest_aarch64/. updates/ cp -a ../macos_update_manifest/. updates/
cp -a ../macos_update_manifest_x86_64/. updates/
- name: Commit - name: Commit
uses: stefanzweifel/git-auto-commit-action@v5 uses: stefanzweifel/git-auto-commit-action@v5
@@ -521,8 +519,8 @@ jobs:
with: with:
files: | files: |
zen.source.tar.zst zen.source.tar.zst
zen.linux-x86_64.tar.bz2 zen.linux-x86_64.tar.xz
zen.linux-aarch64.tar.bz2 zen.linux-aarch64.tar.xz
zen-x86_64.AppImage zen-x86_64.AppImage
zen-x86_64.AppImage.zsync zen-x86_64.AppImage.zsync
zen-aarch64.AppImage zen-aarch64.AppImage
@@ -533,12 +531,10 @@ jobs:
linux-aarch64.mar linux-aarch64.mar
windows.mar windows.mar
windows-arm64.mar windows-arm64.mar
macos-x86_64.mar macos.mar
macos-aarch64.mar
zen.installer.exe zen.installer.exe
zen.installer-arm64.exe zen.installer-arm64.exe
zen.macos-x86_64.dmg zen.macos-universal.dmg
zen.macos-aarch64.dmg
automatic_release_tag: 'twilight' automatic_release_tag: 'twilight'
title: 'Twilight build - ${{ needs.build-data.outputs.version }} (${{ needs.build-data.outputs.build_date }} at ${{ needs.build-data.outputs.build_time }})' title: 'Twilight build - ${{ needs.build-data.outputs.version }} (${{ needs.build-data.outputs.build_date }} at ${{ needs.build-data.outputs.build_time }})'
draft: false draft: false
@@ -557,8 +553,8 @@ jobs:
title: 'Release build - ${{ needs.build-data.outputs.version }} (${{ needs.build-data.outputs.build_date }})' title: 'Release build - ${{ needs.build-data.outputs.version }} (${{ needs.build-data.outputs.build_date }})'
files: | files: |
zen.source.tar.zst zen.source.tar.zst
zen.linux-x86_64.tar.bz2 zen.linux-x86_64.tar.xz
zen.linux-aarch64.tar.bz2 zen.linux-aarch64.tar.xz
zen-x86_64.AppImage zen-x86_64.AppImage
zen-x86_64.AppImage.zsync zen-x86_64.AppImage.zsync
zen-aarch64.AppImage zen-aarch64.AppImage
@@ -569,12 +565,10 @@ jobs:
linux-aarch64.mar linux-aarch64.mar
.github/workflows/object/windows-x64-signed-x86_64/windows.mar .github/workflows/object/windows-x64-signed-x86_64/windows.mar
.github/workflows/object/windows-x64-signed-arm64/windows-arm64.mar .github/workflows/object/windows-x64-signed-arm64/windows-arm64.mar
macos-x86_64.mar macos.mar
macos-aarch64.mar
.github/workflows/object/windows-x64-signed-x86_64/zen.installer.exe .github/workflows/object/windows-x64-signed-x86_64/zen.installer.exe
.github/workflows/object/windows-x64-signed-arm64/zen.installer-arm64.exe .github/workflows/object/windows-x64-signed-arm64/zen.installer-arm64.exe
zen.macos-x86_64.dmg zen.macos-universal.dmg
zen.macos-aarch64.dmg
prepare-flatpak: prepare-flatpak:
if: ${{ inputs.create_release && inputs.update_branch == 'release' }} if: ${{ inputs.create_release && inputs.update_branch == 'release' }}
@@ -652,12 +646,12 @@ jobs:
- name: Download Linux x86_64 build - name: Download Linux x86_64 build
uses: actions/download-artifact@v4 uses: actions/download-artifact@v4
with: with:
name: zen.linux-x86_64.tar.bz2 name: zen.linux-x86_64.tar.xz
- name: Download Linux aarch64 build - name: Download Linux aarch64 build
uses: actions/download-artifact@v4 uses: actions/download-artifact@v4
with: with:
name: zen.linux-aarch64.tar.bz2 name: zen.linux-aarch64.tar.xz
- name: Update repository - name: Update repository
uses: actions/checkout@v4 uses: actions/checkout@v4
@@ -679,8 +673,8 @@ jobs:
python3 ./zen-browser/scripts/prepare-flatpak-release.py \ python3 ./zen-browser/scripts/prepare-flatpak-release.py \
--flatpak-archive archive.tar \ --flatpak-archive archive.tar \
--version ${{ needs.build-data.outputs.version }} \ --version ${{ needs.build-data.outputs.version }} \
--linux-archive zen.linux-x86_64.tar.bz2 \ --linux-archive zen.linux-x86_64.tar.xz \
--linux-aarch64-archive zen.linux-aarch64.tar.bz2 \ --linux-aarch64-archive zen.linux-aarch64.tar.xz \
--output app.zen_browser.zen.yml \ --output app.zen_browser.zen.yml \
--template-root ./zen-browser/flatpak --template-root ./zen-browser/flatpak
@@ -693,7 +687,7 @@ jobs:
run: | run: |
rm -rf zen-browser rm -rf zen-browser
rm -rf archive.tar rm -rf archive.tar
rm -rf zen.linux-x86_64.tar.bz2 rm -rf zen.linux-x86_64.tar.xz
- name: Upload Flatpak manifest - name: Upload Flatpak manifest
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4

View File

@@ -2,7 +2,7 @@ name: Check Firefox Candidate Release
on: on:
schedule: schedule:
- cron: '0 21 * * 1' - cron: '59 4 * * 2'
workflow_dispatch: workflow_dispatch:
jobs: jobs:

View File

@@ -27,11 +27,8 @@ jobs:
- name: Setup autopep8 - name: Setup autopep8
run: sudo apt install python3-autopep8 run: sudo apt install python3-autopep8
- name: Setup pnpm
run: npm install -g pnpm
- name: Install dependencies - name: Install dependencies
run: pnpm install run: npm install
- name: Lint - name: Lint
run: pnpm lint run: npm run lint

View File

@@ -11,6 +11,10 @@ on:
description: 'The branch to build' description: 'The branch to build'
required: true required: true
type: string type: string
MOZ_BUILD_DATE:
type: string
required: true
default: ''
jobs: jobs:
build-linux: build-linux:
@@ -77,24 +81,15 @@ jobs:
path: /home/runner/.cache/sccache path: /home/runner/.cache/sccache
key: ${{ runner.os }}-sccache key: ${{ runner.os }}-sccache
- name: Setup pnpm
run: npm install -g pnpm
- name: Get pnpm store directory
id: pnpm-cache
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
- name: Install dependencies - name: Install dependencies
run: | run: |
pnpm install npm install
- name: Load Surfer CI setup - name: Load Surfer CI setup
run: pnpm surfer ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }} run: npm run surfer -- ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }}
- name: Download Firefox source and dependencies - name: Download Firefox source and dependencies
run: pnpm surfer download run: npm run download
- name: Fix Rust version - name: Fix Rust version
run: | run: |
@@ -111,7 +106,7 @@ jobs:
- name: Import - name: Import
env: env:
SURFER_COMPAT: ${{ matrix.arch }} SURFER_COMPAT: ${{ matrix.arch }}
run: pnpm surfer import run: npm run import
- name: Build language packs - name: Build language packs
run: sh scripts/download-language-packs.sh run: sh scripts/download-language-packs.sh
@@ -130,6 +125,9 @@ jobs:
continue-on-error: true continue-on-error: true
run: | run: |
export SURFER_PLATFORM="linux" export SURFER_PLATFORM="linux"
if [[ -n ${{ inputs.MOZ_BUILD_DATE }} ]];then
export MOZ_BUILD_DATE=${{ inputs.MOZ_BUILD_DATE }}
fi
bash .github/workflows/src/release-build.sh bash .github/workflows/src/release-build.sh
- name: Package - name: Package
@@ -139,19 +137,19 @@ jobs:
run: | run: |
export SURFER_PLATFORM="linux" export SURFER_PLATFORM="linux"
export ZEN_RELEASE=1 export ZEN_RELEASE=1
pnpm package npm run package
- name: Rename artifacts - name: Rename artifacts
run: | run: |
mv dist/zen-*.tar.bz2 "zen.linux-${{ matrix.arch }}.tar.bz2" mv dist/zen-*.tar.xz "zen.linux-${{ matrix.arch }}.tar.xz"
mv dist/output.mar linux${{ matrix.arch == 'aarch64' && '-aarch64' || '' }}.mar mv dist/output.mar linux${{ matrix.arch == 'aarch64' && '-aarch64' || '' }}.mar
- name: Upload build artifact (binary) - name: Upload build artifact (binary)
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
retention-days: 5 retention-days: 5
name: zen.linux-${{ matrix.arch }}.tar.bz2 name: zen.linux-${{ matrix.arch }}.tar.xz
path: ./zen.linux-${{ matrix.arch }}.tar.bz2 path: ./zen.linux-${{ matrix.arch }}.tar.xz
- name: Upload build artifact (.mar) - name: Upload build artifact (.mar)
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4

View File

@@ -11,6 +11,10 @@ on:
description: 'The branch to build' description: 'The branch to build'
required: true required: true
type: string type: string
MOZ_BUILD_DATE:
type: string
required: true
default: ''
jobs: jobs:
mac-build: mac-build:
@@ -77,24 +81,15 @@ jobs:
echo 'export PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"' >> ~/.zsh echo 'export PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"' >> ~/.zsh
source ~/.bash_profile source ~/.bash_profile
- name: Setup pnpm
run: npm install -g pnpm
- name: Get pnpm store directory
id: pnpm-cache
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
- name: Install dependencies - name: Install dependencies
run: | run: |
pnpm install npm install
- name: Load surfer CI setup - name: Load surfer CI setup
run: pnpm surfer ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }} run: npm run surfer -- ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }}
- name: Download Firefox source and dependencies - name: Download Firefox source and dependencies
run: pnpm surfer download run: npm run download
- name: Bootstrap - name: Bootstrap
run: | run: |
@@ -107,7 +102,7 @@ jobs:
- name: Import - name: Import
env: env:
SURFER_COMPAT: ${{ matrix.arch }} SURFER_COMPAT: ${{ matrix.arch }}
run: pnpm surfer import --verbose run: npm run import -- --verbose
- name: Build language packs - name: Build language packs
run: sh scripts/download-language-packs.sh run: sh scripts/download-language-packs.sh
@@ -118,72 +113,47 @@ jobs:
ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }} ZEN_RELEASE_BRANCH: ${{ inputs.release-branch }}
run: | run: |
export SURFER_PLATFORM="darwin" export SURFER_PLATFORM="darwin"
if [[ -n ${{ inputs.MOZ_BUILD_DATE }} ]];then
export MOZ_BUILD_DATE=${{ inputs.MOZ_BUILD_DATE }}
fi
bash .github/workflows/src/release-build.sh bash .github/workflows/src/release-build.sh
- name: Import APPLE DEVELOPER ID CERTIFICATE for .app
uses: Apple-Actions/import-codesign-certs@v3
with:
p12-file-base64: ${{ secrets.macOS_CERTIFICATES_P12_For_App_BASE64 }}
p12-password: ${{ secrets.macOS_CERTIFICATES_P12_PASSWORD }}
- name: Import provisioning profile for .app
run: |
echo "${{ secrets.macOS_PROVISIONING_PROFILE }}" | base64 --decode > ./engine/Zen_Browser.provisionprofile
ls -la
- name: Package - name: Package
env: env:
SURFER_COMPAT: ${{ matrix.arch }} SURFER_COMPAT: ${{ matrix.arch }}
ZEN_GA_DISABLE_PGO: true ZEN_GA_DISABLE_PGO: true
MACOS_APPLE_ACCOUNT_ID: ${{ secrets.macOS_AppleAccountId }}
MACOS_APPLE_DEVELOPER_ID_TEAM_ID: ${{ secrets.macOS_AppleDeveloperIdTeamId }}
MACOS_APPLE_DEVELOPER_ID_PASSWORD: ${{ secrets.macOS_AppleDeveloperIdPassword }}
run: | run: |
export SURFER_PLATFORM="darwin" export SURFER_PLATFORM="darwin"
export MACOS_APPLE_DEVELOPER_ID="${{ secrets.macOS_AppleDeveloperId }}"
export ZEN_RELEASE=1 export ZEN_RELEASE=1
pnpm package npm run package
- name: Rename artifacts - name: Rename artifacts
run: | run: |
mv ./dist/output.mar macos-${{ matrix.arch }}.mar echo "Tarballing DMG"
- name: Remove sensitive information
run: |
rm -f ./engine/Zen_Browser.provisionprofile
- name: Sign .dmg
run: |
set -ex set -ex
hdiutil convert ./dist/*.dmg -format UDZO -imagekey zlib-level=9 -o zen.macos-${{ matrix.arch }}.dmg mv ./dist/*.dmg ./zen-${{ matrix.arch }}-apple-darwin-dist.dmg
xattr -cr zen.macos-${{ matrix.arch }}.dmg mv ./engine/obj-${{ matrix.arch }}-apple-darwin/dist/host/bin/mar ./zen-macos-host-mar
codesign -s "${{ secrets.macOS_AppleDeveloperId }}" zen.macos-${{ matrix.arch }}.dmg mv ./engine/obj-${{ matrix.arch }}-apple-darwin/dist/bin/platform.ini ./platform.ini
xcrun notarytool submit "zen.macos-${{ matrix.arch }}.dmg" \
--apple-id "${{ secrets.macOS_AppleAccountId }}" \
--team-id "${{ secrets.macOS_AppleDeveloperIdTeamId }}" \
--password "${{ secrets.macOS_AppleDeveloperIdPassword }}" \
--no-s3-acceleration \
--verbose \
--wait
xcrun stapler staple "zen.macos-${{ matrix.arch }}.dmg"
- name: Upload build artifact - name: Upload dist dmg
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
retention-days: 5 retention-days: 1
name: zen.macos-${{ matrix.arch }}.dmg name: zen-${{ matrix.arch }}-apple-darwin-dist.dmg
path: ./zen.macos-${{ matrix.arch }}.dmg path: ./zen-${{ matrix.arch }}-apple-darwin-dist.dmg
- name: Upload build artifact (.mar) - name: Upload host mar
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
if: matrix.arch == 'aarch64'
with: with:
retention-days: 5 retention-days: 1
name: macos-${{ matrix.arch }}.mar name: zen-macos-host-mar
path: ./macos-${{ matrix.arch }}.mar path: ./zen-macos-host-mar
- name: Upload build artifact (update manifests) - name: Upload platform.ini
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
if: matrix.arch == 'x86_64'
with: with:
retention-days: 5 retention-days: 1
name: macos_update_manifest_${{ matrix.arch }} name: platform.ini
path: ./dist/update path: ./platform.ini

View File

@@ -0,0 +1,261 @@
name: macOS Release Build
on:
workflow_call:
inputs:
build-version:
description: 'The version to build'
required: true
type: string
release-branch:
description: 'The branch to build'
required: true
type: string
jobs:
mac-build:
name: Unify macOS (Universal)
runs-on: 'macos-14'
strategy:
fail-fast: false
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
token: ${{ secrets.DEPLOY_KEY }}
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version-file: '.nvmrc'
- name: Setup Python
uses: actions/setup-python@v5
# note: This will use the version defined in '.python-version' by default
- name: Setup Git
run: |
git config --global user.email "mauro-balades@users.noreply.github.com"
git config --global user.name "mauro-balades"
- name: Install system dependencies
run: |
brew update
brew install cairo sccache gnu-tar mercurial
sudo pip install setuptools
brew uninstall --ignore-dependencies python3.12 -f
export PATH="$(python3 -m site --user-base)/bin":$PATH
python3 -m pip install --user mercurial
rm '/usr/local/bin/2to3-3.11' '/usr/local/bin/2to3-3.12' '/usr/local/bin/2to3'
rm '/usr/local/bin/idle3.11' '/usr/local/bin/idle3.12' '/usr/local/bin/idle3'
rm '/usr/local/bin/pydoc3.11' '/usr/local/bin/pydoc3.12' '/usr/local/bin/pydoc3'
rm '/usr/local/bin/python3.11' '/usr/local/bin/python3.12' '/usr/local/bin/python3'
rm '/usr/local/bin/python3.11-config' '/usr/local/bin/python3.12-config' '/usr/local/bin/python3-config'
brew install watchman
cargo install apple-codesign
- name: Force usage of gnu-tar
run: |
echo 'export PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"' >> ~/.bash_profile
echo 'export PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"' >> ~/.zsh
source ~/.bash_profile
- name: Install dependencies
run: |
npm install
- name: Load surfer CI setup
run: npm run surfer -- ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }}
- name: Download Firefox source and dependencies
run: npm run download
- name: Bootstrap
run: |
cd engine
export SURFER_PLATFORM="darwin"
export PATH="$(python3 -m site --user-base)/bin":$PATH
./mach --no-interactive bootstrap --application-choice browser --no-system-changes
cd ..
- name: Import
run: npm run import
- name: Populate mozconfig
env:
SURFER_MOZCONFIG_ONLY: true
run: |
npm run build
cd engine
./mach configure
- name: Download x86_64 DMG from artifacts
uses: actions/download-artifact@v4
with:
name: zen-x86_64-apple-darwin-dist.dmg
- name: Download aarch64 DMG from artifacts
uses: actions/download-artifact@v4
with:
name: zen-aarch64-apple-darwin-dist.dmg
- name: Remove any existing .app folders
run: |
set -x
cd engine
rm -rf "./obj-x86_64-apple-darwin/" || true
rm -rf "./obj-aarch64-apple-darwin/" || true
- name: Extract .app from dmg
run: |
set -ex
cd engine
echo "Extracting x86_64 .app from dmg"
mkdir -p ./obj-x86_64-apple-darwin/dist
mkdir -p ./obj-aarch64-apple-darwin/dist
./mach python -m mozbuild.action.unpack_dmg \
../zen-x86_64-apple-darwin-dist.dmg \
./obj-x86_64-apple-darwin/dist
echo "Extracting aarch64 .app from dmg"
./mach python -m mozbuild.action.unpack_dmg \
../zen-aarch64-apple-darwin-dist.dmg \
./obj-aarch64-apple-darwin/dist
- name: Find first .app folder name
run: |
cd engine/obj-x86_64-apple-darwin/dist
export APP_NAME=$(basename "$(find . -maxdepth 1 -name "Zen *.app" -type d | head -n 1)" .app)
echo "APP_NAME=$APP_NAME" >> $GITHUB_ENV
echo "APP_NAME=$APP_NAME"
- name: List .app folders
run: |
ls engine/
echo "--------------------"
cd engine/obj-x86_64-apple-darwin/dist
find . -maxdepth 1 -name "*.app" -type d
cd ../..
- name: create .p12 for codesign 🖊️
run: |
cd engine
echo "${{ secrets.macOS_CERTIFICATES_P12_For_App_BASE64 }}" > cert.txt
base64 --decode -i cert.txt -o zenCert.p12
echo "${{ secrets.macOS_CERTIFICATES_P12_PASSWORD }}" > zenpCertPassword.passwd
- name: Remove certificate sensitive information
run: |
rm engine/cert.txt || true
- name: Import provisioning profile for .app
run: |
echo "${{ secrets.macOS_PROVISIONING_PROFILE }}" | base64 --decode > ./engine/Zen_Browser.provisionprofile
ls -la
- name: Unify architectures
run: |
cd engine
./mach python "./toolkit/mozapps/installer/unify.py" "./obj-x86_64-apple-darwin/dist/${{ env.APP_NAME }}.app" "./obj-aarch64-apple-darwin/dist/${{ env.APP_NAME }}.app"
echo "Merged aaarch64 into x86_64!"
- name: Import APPLE DEVELOPER ID CERTIFICATE for .app
uses: Apple-Actions/import-codesign-certs@v3
with:
p12-file-base64: ${{ secrets.macOS_CERTIFICATES_P12_For_App_BASE64 }}
p12-password: ${{ secrets.macOS_CERTIFICATES_P12_PASSWORD }}
- name: Copy provisioning profile for .app (embedded in .app)
run: |
cd engine
echo "Copying provisioning profile for .app on both architectures (${{ env.APP_NAME }})"
cp ./Zen_Browser.provisionprofile "./embedded.provisionprofile"
- name: Sign .app
run: |
cd engine
# TODO: Change it to "production" once we figure out the issue with the webauth
./mach macos-sign -v -r -c "release" -e "production-without-restricted" -a "./obj-x86_64-apple-darwin/dist/${{ env.APP_NAME }}.app" --rcodesign-p12-file zenCert.p12 --rcodesign-p12-password-file zenpCertPassword.passwd
- name: Create DMG
run: |
cd engine
./mach python -m mozbuild.action.make_dmg \
--volume-name "${{ env.APP_NAME }}" \
--background ./browser/branding/${{ inputs.release-branch }}/background.png \
--icon ./browser/branding/${{ inputs.release-branch }}/firefox.icns \
--dsstore ./browser/branding/${{ inputs.release-branch }}/dsstore \
./obj-x86_64-apple-darwin/dist/ ../zen-macOS-universal-temp.dmg
- name: Remove sensitive information
run: |
rm -f ./engine/Zen_Browser.provisionprofile
- name: Sign .dmg
run: |
set -ex
hdiutil convert zen-macOS-universal-temp.dmg -format UDZO -imagekey zlib-level=9 -o zen.macos-universal.dmg
codesign -s "${{ secrets.macOS_AppleDeveloperId }}" zen.macos-universal.dmg
xcrun notarytool submit "zen.macos-universal.dmg" \
--apple-id "${{ secrets.macOS_AppleAccountId }}" \
--team-id "${{ secrets.macOS_AppleDeveloperIdTeamId }}" \
--password "${{ secrets.macOS_AppleDeveloperIdPassword }}" \
--no-s3-acceleration \
--wait
xcrun stapler staple "zen.macos-universal.dmg"
- name: Download host mar
uses: actions/download-artifact@v4
with:
name: zen-macos-host-mar
- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
retention-days: 5
name: zen.macos-universal.dmg
path: ./zen.macos-universal.dmg
- name: Download platform.ini
uses: actions/download-artifact@v4
with:
name: platform.ini
- name: Package for mar
env:
JUST_MAR: true
run: |
# we don't need it anymore
set -ex
rm -rf ./engine/obj-aarch64-apple-darwin
mkdir -p ./engine/obj-x86_64-apple-darwin/dist/bin
mv ./platform.ini ./engine/obj-x86_64-apple-darwin/dist/bin/platform.ini
export SURFER_PLATFORM="darwin"
export ZEN_RELEASE=1
# full path to zen-macos-host-mar
export MAR=$(pwd)/zen-macos-host-mar
chmod +x $MAR
echo "MAR=$MAR"
npm run package -- --verbose
mv ./dist/output.mar ./macos.mar
- name: Upload build artifact (.mar)
uses: actions/upload-artifact@v4
with:
retention-days: 5
name: macos.mar
path: ./macos.mar
- name: Upload build artifact (update manifests)
uses: actions/upload-artifact@v4
with:
retention-days: 5
name: macos_update_manifest
path: ./dist/update

View File

@@ -19,14 +19,11 @@ jobs:
with: with:
node-version-file: '.nvmrc' node-version-file: '.nvmrc'
- name: Setup pnpm
run: npm install -g pnpm
- name: Install Surfer - name: Install Surfer
run: npm i -g @zen-browser/surfer run: npm i -g @zen-browser/surfer
- name: Install dependencies - name: Install dependencies
run: pnpm install run: npm install
- name: Download Firefox and dependencies - name: Download Firefox and dependencies
run: surfer download run: surfer download

View File

@@ -17,12 +17,12 @@ if command -v Xvfb &> /dev/null; then
export DISPLAY=:2 export DISPLAY=:2
fi fi
export ZEN_RELEASE=1 export ZEN_RELEASE=1
pnpm build npm run build
else else
echo "Xvfb could not be found, running without it" echo "Xvfb could not be found, running without it"
echo "ASSUMING YOU ARE RUNNING THIS ON MACOS" echo "ASSUMING YOU ARE RUNNING THIS ON MACOS"
set -v set -v
export ZEN_RELEASE=1 export ZEN_RELEASE=1
pnpm build npm run build
fi fi

View File

@@ -41,14 +41,11 @@ jobs:
git config --global user.email "mauro-balades@users.noreply.github.com" git config --global user.email "mauro-balades@users.noreply.github.com"
git config --global user.name "mauro-balades" git config --global user.name "mauro-balades"
- name: Setup pnpm
run: npm install -g pnpm
- name: Install Surfer - name: Install Surfer
run: npm i -g @zen-browser/surfer run: npm i -g @zen-browser/surfer
- name: Load Surfer CI setup - name: Load Surfer CI setup
run: pnpm surfer ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }} run: npm run surfer -- ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }}
- name: Download artifact - name: Download artifact
if: ${{ matrix.arch == 'x86_64' }} if: ${{ matrix.arch == 'x86_64' }}
@@ -74,13 +71,13 @@ jobs:
if: ${{ matrix.arch == 'x86_64' }} if: ${{ matrix.arch == 'x86_64' }}
run: | run: |
git config --global core.safecrlf false git config --global core.safecrlf false
pnpm surfer download npm run download
- name: Import patches - name: Import patches
if: ${{ matrix.arch == 'x86_64' }} if: ${{ matrix.arch == 'x86_64' }}
env: env:
SURFER_NO_BRANDING_PATCH: true SURFER_NO_BRANDING_PATCH: true
run: pnpm surfer import run: npm run import
- name: Generate - name: Generate
if: ${{ matrix.arch == 'x86_64' }} if: ${{ matrix.arch == 'x86_64' }}

View File

@@ -18,6 +18,10 @@ on:
description: 'The branch to build' description: 'The branch to build'
required: true required: true
type: string type: string
MOZ_BUILD_DATE:
type: string
required: true
default: ''
jobs: jobs:
windows-build: windows-build:
@@ -48,9 +52,6 @@ jobs:
with: with:
node-version-file: '.nvmrc' node-version-file: '.nvmrc'
- name: Setup pnpm
run: npm install -g pnpm
- name: Setup Git - name: Setup Git
run: | run: |
git config --global user.email "mauro-balades@users.noreply.github.com" git config --global user.email "mauro-balades@users.noreply.github.com"
@@ -58,15 +59,16 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: | run: |
pnpm install npm install
sudo apt-get install -y python3 python3-pip dos2unix yasm nasm build-essential libgtk2.0-dev libpython3-dev m4 uuid libasound2-dev libcurl4-openssl-dev libdbus-1-dev libdrm-dev libdbus-glib-1-dev libgtk-3-dev libpulse-dev libx11-xcb-dev libxt-dev xvfb lld llvm sudo apt-get update
sudo apt-get install -y python3 python3-pip dos2unix yasm nasm build-essential libgtk2.0-dev libpython3-dev m4 uuid libasound2-dev libcurl4-openssl-dev libdbus-1-dev libdrm-dev libdbus-glib-1-dev libgtk-3-dev libpulse-dev libx11-xcb-dev libxt-dev xvfb lld llvm --fix-missing
- name: Load Surfer CI setup - name: Load Surfer CI setup
run: pnpm surfer ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }} run: npm run surfer -- ci --brand ${{ inputs.release-branch }} --display-version ${{ inputs.build-version }}
- name: Download Firefox and dependencies - name: Download Firefox and dependencies
if: ${{ !(inputs.generate-gpo && matrix.arch == 'aarch64') }} if: ${{ !(inputs.generate-gpo && matrix.arch == 'aarch64') }}
run: pnpm surfer download run: npm run download
- name: win-cross Cache - name: win-cross Cache
env: env:
@@ -147,9 +149,8 @@ jobs:
cd engine/ cd engine/
chmod -R +x "$(echo ~)/win-cross/vs2022" || true chmod -R +x "$(echo ~)/win-cross/vs2022" || true
cd .. cd ..
npm install -g pnpm
export SURFER_PLATFORM="win32" export SURFER_PLATFORM="win32"
pnpm surfer bootstrap npm run bootstrap
cd engine/ cd engine/
ls ~/.mozbuild/clang/lib/clang/ ls ~/.mozbuild/clang/lib/clang/
echo "export LIB=\"$(cd ~/.mozbuild/clang/lib/clang/* && cd lib/windows && pwd)\"" >> ../configs/common/mozconfig echo "export LIB=\"$(cd ~/.mozbuild/clang/lib/clang/* && cd lib/windows && pwd)\"" >> ../configs/common/mozconfig
@@ -180,7 +181,7 @@ jobs:
if: ${{ !(inputs.generate-gpo && matrix.arch == 'aarch64') }} if: ${{ !(inputs.generate-gpo && matrix.arch == 'aarch64') }}
env: env:
SURFER_COMPAT: ${{ matrix.arch }} SURFER_COMPAT: ${{ matrix.arch }}
run: pnpm surfer import --verbose run: npm run import -- --verbose
- name: Build language packs - name: Build language packs
if: ${{ !(inputs.generate-gpo && matrix.arch == 'aarch64') }} if: ${{ !(inputs.generate-gpo && matrix.arch == 'aarch64') }}
@@ -215,6 +216,9 @@ jobs:
if test ${{ inputs.generate-gpo }} = true; then if test ${{ inputs.generate-gpo }} = true; then
export ZEN_GA_GENERATE_PROFILE=1 export ZEN_GA_GENERATE_PROFILE=1
fi fi
if [[ -n ${{ inputs.MOZ_BUILD_DATE }} ]];then
export MOZ_BUILD_DATE=${{ inputs.MOZ_BUILD_DATE }}
fi
bash .github/workflows/src/release-build.sh bash .github/workflows/src/release-build.sh
- name: Package - name: Package
@@ -227,8 +231,8 @@ jobs:
export SURFER_PLATFORM="win32" export SURFER_PLATFORM="win32"
export ZEN_CROSS_COMPILING=1 export ZEN_CROSS_COMPILING=1
export ZEN_RELEASE=1 export ZEN_RELEASE=1
pnpm package npm run package
mv ./dist/zen-$(pnpm surfer get version | xargs).en-US.win64${{ matrix.arch == 'aarch64' && '-aarch64' || '' }}.zip zen.win64.zip mv ./dist/zen-$(npm run --silent surfer -- get version | xargs).en-US.win64${{ matrix.arch == 'aarch64' && '-aarch64' || '' }}.zip zen.win64.zip
ls ./dist ls ./dist
ls . ls .

2
.gitignore vendored
View File

@@ -9,3 +9,5 @@ dist/
windsign-temp/ windsign-temp/
venv/ venv/
!firefox-cache/

View File

@@ -23,5 +23,6 @@ docs/issue-metrics/*.md
# Some CSS files are preprocessed and prettier doesn't handle them well # Some CSS files are preprocessed and prettier doesn't handle them well
# We also dont want to format the CSS files that are generated by the build # We also dont want to format the CSS files that are generated by the build
src/browser/base/content/zen-styles/zen-tabs/vertical-tabs.css src/browser/base/content/zen-styles/zen-tabs/vertical-tabs.css
src/browser/base/content/zen-styles/zen-compact-mode.css
src/browser/base/zen-components/ZenEmojies.mjs src/browser/base/zen-components/ZenEmojies.mjs
build/codesign/codesign.bash build/codesign/codesign.bash

View File

@@ -28,9 +28,9 @@
## 🖥️ Compatibility ## 🖥️ Compatibility
Zen is currently built using firefox version `134.0.1`! 🚀 Zen is currently built using firefox version `135.0`! 🚀
- [`Zen Twilight`](https://zen-browser.app/download?twilight) - Is currently built using firefox version `RC 134.0.1`! - [`Zen Twilight`](https://zen-browser.app/download?twilight) - Is currently built using firefox version `RC 135.0`!
- Check out the latest [release notes](https://zen-browser.app/release-notes)! - Check out the latest [release notes](https://zen-browser.app/release-notes)!
- Part of our mission is to keep Zen up-to-date with the latest version of Firefox, so you can enjoy the latest features and security updates! - Part of our mission is to keep Zen up-to-date with the latest version of Firefox, so you can enjoy the latest features and security updates!
@@ -117,7 +117,7 @@ Some components used by @zen-browser as an attempt to make firefox forks a bette
#### `Run Locally` #### `Run Locally`
In order to download and run zen locally, please follow [these instructions](https://docs.zen-browser.app/contribute/desktop). In order to download and run zen locally, please follow [these instructions](https://docs.zen-browser.app/building).
#### `Special Thanks` #### `Special Thanks`
@@ -129,6 +129,7 @@ Zen couldn't be in its current state without the help of these amazing projects!
- Zen's default preferences are based on [BetterFox](https://github.com/yokoffing/Betterfox) - Zen's default preferences are based on [BetterFox](https://github.com/yokoffing/Betterfox)
- Gradient image extracted from [Arc Palette](https://github.com/neurokitti/Arc_Palette) - Gradient image extracted from [Arc Palette](https://github.com/neurokitti/Arc_Palette)
- `icons.css` has been modified from [Edge Firefox](https://github.com/bmFtZQ/edge-frfox) (MIT licensed file).
### 🖥️ Comparison with other browsers ### 🖥️ Comparison with other browsers

View File

@@ -1,39 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!--
Entitlements to apply to the main browser process executable during
codesigning of production channel builds.
-->
<plist version="1.0">
<dict>
<!-- Firefox needs to create executable pages (without MAP_JIT) -->
<key>com.apple.security.cs.allow-unsigned-executable-memory</key><true/>
<!-- Firefox needs to create executable pages with MAP_JIT on aarch64 -->
<key>com.apple.security.cs.allow-jit</key><true/>
<!-- Allow loading third party libraries. Needed for Flash and CDMs -->
<key>com.apple.security.cs.disable-library-validation</key><true/>
<!-- Firefox needs to access the microphone on sites the user allows -->
<key>com.apple.security.device.audio-input</key><true/>
<!-- Firefox needs to access the camera on sites the user allows -->
<key>com.apple.security.device.camera</key><true/>
<!-- Firefox needs to access the location on sites the user allows -->
<key>com.apple.security.personal-information.location</key><true/>
<!-- Allow Firefox to send Apple events to other applications. Needed
for native messaging webextension helper applications launched by
Firefox which rely on Apple Events to signal other processes. -->
<key>com.apple.security.automation.apple-events</key><true/>
<!-- For SmartCardServices(7) -->
<key>com.apple.security.smartcard</key><true/>
<!-- Required for com.apple.developer.web-browser.public-key-credential -->
<key>com.apple.application-identifier</key>
<string>H36NPCN86W.app.zen-browser.zen</string>
</dict>
</plist>

View File

@@ -1,179 +0,0 @@
#!/bin/bash
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
#
# Runs codesign commands to codesign a Firefox .app bundle and enable macOS
# Hardened Runtime. Intended to be manually run by developers working on macOS
# 10.14+ who want to enable Hardened Runtime for manual testing. This is
# provided as a stop-gap until automated build tooling is available that signs
# binaries with a certificate generated during builds (bug 1522409). This
# script requires macOS 10.14 because Hardened Runtime is only available for
# applications running on 10.14 despite support for the codesign "-o runtime"
# option being available in 10.13.6 and newer.
#
# The script requires an identity string (-i option) from an Apple Developer
# ID certificate. This can be found in the macOS KeyChain after configuring an
# Apple Developer ID certificate.
#
# Example usage on macOS 10.14:
#
# $ ./mach build
# $ ./mach build package
# $ open </PATH/TO/DMG/FILE.dmg>
# <Drag Nightly.app to ~>
# $ ./security/mac/hardenedruntime/codesign.bash \
# -a ~/Nightly.app \
# -i <MY-IDENTITY-STRING> \
# -b security/mac/hardenedruntime/browser.developer.entitlements.xml
# -p security/mac/hardenedruntime/plugin-container.developer.entitlements.xml
# $ open ~/Nightly.app
#
usage ()
{
echo "Usage: $0 "
echo " -a <PATH-TO-BROWSER.app>"
echo " -i <IDENTITY>"
echo " -b <ENTITLEMENTS-FILE>"
echo " -p <CHILD-ENTITLEMENTS-FILE>"
echo " [-o <OUTPUT-DMG-FILE>]"
exit -1
}
# Make sure we are running on macOS with the sw_vers command available.
SWVERS=/usr/bin/sw_vers
if [ ! -x ${SWVERS} ]; then
echo "ERROR: macOS 10.14 or later is required"
exit -1
fi
# Require macOS 10.14 or newer.
#OSVERSION=`${SWVERS} -productVersion|sed -En 's/[0-9]+\.([0-9]+)\.[0-9]+/\1/p'`;
#if [ ${OSVERSION} \< 14 ]; then
# echo "ERROR: macOS 10.14 or later is required"
# exit -1
#fi
while getopts "a:i:b:o:p:" opt; do
case ${opt} in
a ) BUNDLE=$OPTARG ;;
i ) IDENTITY=$OPTARG ;;
b ) BROWSER_ENTITLEMENTS_FILE=$OPTARG ;;
p ) PLUGINCONTAINER_ENTITLEMENTS_FILE=$OPTARG ;;
o ) OUTPUT_DMG_FILE=$OPTARG ;;
\? ) usage; exit -1 ;;
esac
done
if [ -z "${BUNDLE}" ] ||
[ -z "${IDENTITY}" ] ||
[ -z "${PLUGINCONTAINER_ENTITLEMENTS_FILE}" ] ||
[ -z "${BROWSER_ENTITLEMENTS_FILE}" ]; then
usage
exit -1
fi
if [ ! -d "${BUNDLE}" ]; then
echo "Invalid bundle. Bundle should be a .app directory"
usage
exit -1
fi
if [ ! -e "${PLUGINCONTAINER_ENTITLEMENTS_FILE}" ]; then
echo "Invalid entitlements file"
usage
exit -1
fi
if [ ! -e "${BROWSER_ENTITLEMENTS_FILE}" ]; then
echo "Invalid entitlements file"
usage
exit -1
fi
# DMG file output flag is optional
if [ ! -z "${OUTPUT_DMG_FILE}" ] &&
[ -e "${OUTPUT_DMG_FILE}" ]; then
echo "Output dmg file ${OUTPUT_DMG_FILE} exists. Please delete it first."
usage
exit -1
fi
echo "-------------------------------------------------------------------------"
echo "bundle: $BUNDLE"
echo "identity: $IDENTITY"
echo "browser entitlements file: $BROWSER_ENTITLEMENTS_FILE"
echo "plugin-container entitlements file: $PLUGINCONTAINER_ENTITLEMENTS_FILE"
echo "output dmg file (optional): $OUTPUT_DMG_FILE"
echo "-------------------------------------------------------------------------"
set -x
# move Zen_Browser.provisionprofile to the Contents directory
#cp Zen_Browser.provisionprofile "${BUNDLE}"/Contents/embedded.provisionprofile
# Clear extended attributes which cause codesign to fail
xattr -cr "${BUNDLE}"
# Sign these binaries first. Signing of some binaries has an ordering
# requirement where other binaries must be signed first.
codesign --force -o runtime --verbose --sign "$IDENTITY" \
"${BUNDLE}/Contents/Library/LaunchServices/org.mozilla.updater" \
"${BUNDLE}/Contents/MacOS/XUL" \
"${BUNDLE}"/Contents/embedded.provisionprofile \
"${BUNDLE}/Contents/MacOS/pingsender"
# Sign every ${BUNDLE}/Contents/MacOS/*.dylib
find "${BUNDLE}"/Contents/MacOS -type f -name "*.dylib" -exec \
codesign --force --verbose --sign "$IDENTITY" {} \;
find "${BUNDLE}"/Contents/MacOS -type f -name "*.dylib" -exec \
codesign -vvv --strict --deep --verbose {} \;
codesign --force -o runtime --verbose --sign "$IDENTITY" --deep \
"${BUNDLE}"/Contents/MacOS/updater.app
# Sign zen main executable
codesign --force -o runtime --verbose --sign "$IDENTITY" --deep \
--entitlements ${BROWSER_ENTITLEMENTS_FILE} \
"${BUNDLE}"/Contents/MacOS/zen
# Sign Library/LaunchServices
codesign --force -o runtime --verbose --sign "$IDENTITY" --deep \
"${BUNDLE}"/Contents/Library/LaunchServices/org.mozilla.updater
# Sign gmp-clearkey files
find "${BUNDLE}"/Contents/Resources/gmp-clearkey -type f -exec \
codesign --force -o runtime --verbose --sign "$IDENTITY" {} \;
# Sign the main bundle
codesign --force -o runtime --verbose --sign "$IDENTITY" \
--entitlements ${BROWSER_ENTITLEMENTS_FILE} "${BUNDLE}"
# Sign the plugin-container bundle with deep
codesign --force -o runtime --verbose --sign "$IDENTITY" --deep \
--entitlements ${PLUGINCONTAINER_ENTITLEMENTS_FILE} \
"${BUNDLE}"/Contents/MacOS/plugin-container.app
# Validate
codesign -vvv --deep --strict "${BUNDLE}"
# Create a DMG
if [ ! -z "${OUTPUT_DMG_FILE}" ]; then
DISK_IMAGE_DIR=`mktemp -d`
TEMP_FILE=`mktemp`
TEMP_DMG=${TEMP_FILE}.dmg
NAME=`basename "${BUNDLE}"`
ditto "${BUNDLE}" "${DISK_IMAGE_DIR}/${NAME}"
hdiutil create -size 400m -fs HFS+ \
-volname Firefox -srcfolder "${DISK_IMAGE_DIR}" "${TEMP_DMG}"
hdiutil convert -format UDZO \
-o "${OUTPUT_DMG_FILE}" "${TEMP_DMG}"
rm ${TEMP_FILE}
rm ${TEMP_DMG}
rm -rf "${DISK_IMAGE_DIR}"
fi

View File

@@ -1,32 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!--
Entitlements to apply to the plugin-container.app bundle during
codesigning of production channel builds.
-->
<plist version="1.0">
<dict>
<!-- Firefox needs to create executable pages (without MAP_JIT) -->
<key>com.apple.security.cs.allow-unsigned-executable-memory</key><true/>
<!-- Firefox needs to create executable pages with MAP_JIT on aarch64 -->
<key>com.apple.security.cs.allow-jit</key><true/>
<!-- Allow loading third party libraries. Needed for Flash and CDMs -->
<key>com.apple.security.cs.disable-library-validation</key><true/>
<!-- Firefox needs to access the microphone on sites the user allows -->
<key>com.apple.security.device.audio-input</key><true/>
<!-- Firefox needs to access the camera on sites the user allows -->
<key>com.apple.security.device.camera</key><true/>
<!-- Firefox needs to access the location on sites the user allows -->
<key>com.apple.security.personal-information.location</key><true/>
<!-- Allow Firefox to send Apple events to other applications. Needed
for native messaging webextension helper applications launched by
Firefox which rely on Apple Events to signal other processes. -->
<key>com.apple.security.automation.apple-events</key><true/>
</dict>
</plist>

View File

@@ -29,7 +29,7 @@ echo "Downloaded x86_64 artifacts"
mkdir engine\obj-x86_64-pc-windows-msvc\ -ErrorAction SilentlyContinue mkdir engine\obj-x86_64-pc-windows-msvc\ -ErrorAction SilentlyContinue
pnpm surfer ci --brand release npm run surfer -- ci --brand release
function SignAndPackage($name) { function SignAndPackage($name) {
echo "Executing on $name" echo "Executing on $name"
@@ -53,7 +53,7 @@ function SignAndPackage($name) {
} }
echo "Compat Mode? $env:SURFER_COMPAT" echo "Compat Mode? $env:SURFER_COMPAT"
pnpm surfer package --verbose npm run package -- --verbose
# In the release script, we do the following: # In the release script, we do the following:
# tar -xvf .github/workflows/object/windows-x64-signed-x86_64.tar.gz -C windows-x64-signed-x86_64 # tar -xvf .github/workflows/object/windows-x64-signed-x86_64.tar.gz -C windows-x64-signed-x86_64

View File

@@ -3,8 +3,8 @@ ac_add_options --with-app-name=${binName}
ac_add_options --with-app-basename=Zen ac_add_options --with-app-basename=Zen
ac_add_options --enable-official-branding ac_add_options --enable-official-branding
# Localization # Localization (Must be an absolute path)
ac_add_options --with-l10n-base="$PWD/browser/locales" ac_add_options --with-l10n-base="${topsrcdir}/browser/locales"
export MOZ_USER_DIR="${name}" export MOZ_USER_DIR="${name}"
export MOZ_APP_BASENAME=Zen export MOZ_APP_BASENAME=Zen

View File

@@ -0,0 +1,522 @@
# Issue Metrics
| Metric | Average | Median | 90th percentile |
| --- | --- | --- | ---: |
| Time to first response | 1 day, 2:25:19 | 4:38:40 | 2 days, 20:40:51 |
| Time to close | 1 day, 21:15:55 | 8:22:21 | 5 days, 17:16:45 |
| Metric | Count |
| --- | ---: |
| Number of items that remain open | 274 |
| Number of items closed | 230 |
| Total number of items created | 504 |
| Title | URL | Time to first response | Time to close |
| --- | --- | --- | --- |
| Screen Sharing Issues when using Google Meet in Zen Browser | https://github.com/zen-browser/desktop/issues/4798 | 0:20:41 | 0:20:40 |
| All tabs are gone after I close Zen | https://github.com/zen-browser/desktop/issues/4797 | 1:59:48 | None |
| Setting the "Zen URL Bar" behavior to "Always floating" works the same as "Floating only when typing". | https://github.com/zen-browser/desktop/issues/4796 | None | None |
| Toggle Compact Mode Not Responsive | https://github.com/zen-browser/desktop/issues/4795 | 1:25:51 | 1:25:51 |
| Closing the last tab doesn't close the browser (again) | https://github.com/zen-browser/desktop/issues/4794 | 3:26:40 | None |
| flickering images | https://github.com/zen-browser/desktop/issues/4791 | None | None |
| Zen incorrectly assumes background color to be dark on some websites, making text unreadable | https://github.com/zen-browser/desktop/issues/4789 | 0:09:17 | 0:09:17 |
| Ctrl-tab should not cycle through essential tabs | https://github.com/zen-browser/desktop/issues/4787 | 4:08:36 | None |
| Erroneous conflicting shortcut (and maybe missing shortcut options) | https://github.com/zen-browser/desktop/issues/4785 | None | None |
| Touchpad space switching issue | https://github.com/zen-browser/desktop/issues/4783 | None | 0:02:16 |
| Closing 'new tab' or last opened tab opens last pinned tab or pinned essential if there is no pinned tab | https://github.com/zen-browser/desktop/issues/4779 | 0:41:29 | 1:03:21 |
| Scrolling bar UI issue: ugly white background | https://github.com/zen-browser/desktop/issues/4778 | 1:05:49 | 4:13:36 |
| Extensions become "big" after switching mode | https://github.com/zen-browser/desktop/issues/4777 | 1:36:21 | 1:36:21 |
| Missing "New Tab" option at the bottom of tab column | https://github.com/zen-browser/desktop/issues/4776 | 1:27:47 | 1:27:47 |
| PDF tab becomes unusable after unloading with unsaved edits | https://github.com/zen-browser/desktop/issues/4772 | None | 2:02:14 |
| Cloudflare ZeroTrust (Warp) VPN unable to connect if Zen is default browser | https://github.com/zen-browser/desktop/issues/4771 | None | None |
| Default Wayland Icon shows up in some places in KDE when installing from AppImage | https://github.com/zen-browser/desktop/issues/4770 | 2:51:55 | 2:54:44 |
| If i close a tab in the sidebar it reloads the entire window and also goes to the starting tabs again which i dont need | https://github.com/zen-browser/desktop/issues/4769 | 1:30:05 | 4:24:03 |
| Font doesnt load properly !! | https://github.com/zen-browser/desktop/issues/4767 | 1:27:56 | 3:58:48 |
| Tab Creation | https://github.com/zen-browser/desktop/issues/4766 | None | 0:01:11 |
| Open application menu button missing in Single toolbar mode | https://github.com/zen-browser/desktop/issues/4765 | 4:28:00 | 4:28:00 |
| moving through workspaces by trackpad swipe tracks the movement but not the direction | https://github.com/zen-browser/desktop/issues/4764 | None | None |
| Netflix does not work in zen | https://github.com/zen-browser/desktop/issues/4762 | 0:07:51 | 1:51:17 |
| Unable to remove duplicate workspaces buttons. | https://github.com/zen-browser/desktop/issues/4761 | 5:03:40 | 5:03:40 |
| Zen Identifies as Firefox in Powertoys run search plugin | https://github.com/zen-browser/desktop/issues/4759 | None | None |
| Close Window Keyboard Shortcut does nothing | https://github.com/zen-browser/desktop/issues/4758 | None | None |
| Scrolling on the tabs on a touch screen does nothing | https://github.com/zen-browser/desktop/issues/4757 | None | None |
| Glance stops working after closing with an unfinished form | https://github.com/zen-browser/desktop/issues/4756 | None | None |
| Dragging tabs scrollbar grabs window | https://github.com/zen-browser/desktop/issues/4755 | 7:07:32 | 7:07:31 |
| Pinned Tabs - URL does not reset when tab is closed, only when returning to the tab | https://github.com/zen-browser/desktop/issues/4754 | None | None |
| "empty space ontop of the vertical tabs" NOT fixed | https://github.com/zen-browser/desktop/issues/4753 | None | None |
| Passkeys using mac touchID is not working | https://github.com/zen-browser/desktop/issues/4752 | None | 8:03:39 |
| Out of order or hidden extensions on launch. Single Toolbar Mode | https://github.com/zen-browser/desktop/issues/4747 | None | None |
| Show in compact view not working | https://github.com/zen-browser/desktop/issues/4745 | 12:20:42 | 12:20:42 |
| Closing tab at the bottom of the tabs list puts you back on the top even if the tab isn't selected. | https://github.com/zen-browser/desktop/issues/4744 | 4:59:52 | 12:43:27 |
| Customizing toolbar spits the app | https://github.com/zen-browser/desktop/issues/4737 | 17:20:17 | 1 day, 0:31:32 |
| Zen URL bar settings doesn't work properly | https://github.com/zen-browser/desktop/issues/4736 | 12:52:11 | None |
| BUG: Bookmarks toolbar items shows 'Show more' arrow even though there are no more bookmarked items | https://github.com/zen-browser/desktop/issues/4735 | None | None |
| Scrolling after closing tab | https://github.com/zen-browser/desktop/issues/4733 | 15:39:10 | 1 day, 1:22:37 |
| BUG: Whole browser broken on Windows | https://github.com/zen-browser/desktop/issues/4732 | 0:08:04 | None |
| BUG: CTRL+SHIFT+B causes UI glitch by trying to show Bookmarks Toolbar in Single Toolbar Mode | https://github.com/zen-browser/desktop/issues/4731 | None | None |
| BUGAbnormal printing of web articles | https://github.com/zen-browser/desktop/issues/4730 | 20:28:04 | 20:28:04 |
| JS close() calls constantly close the entire browser when a website calling it is the only tab left | https://github.com/zen-browser/desktop/issues/4729 | None | None |
| Dragging empty space on sidebar tabs undocks and moves the program | https://github.com/zen-browser/desktop/issues/4728 | 21:01:43 | 21:01:43 |
| The tab bar and top bar overlap and make it annoying to close the browser. | https://github.com/zen-browser/desktop/issues/4726 | None | None |
| Tab switching to recent tab (Ctrl-Tab) doesn't work across workspaces | https://github.com/zen-browser/desktop/issues/4725 | None | None |
| Top and side bars do not disappear in fullscreen mode | https://github.com/zen-browser/desktop/issues/4723 | 13:46:56 | 22:02:10 |
| Toggling "Display workspaces as an icon strip" twice doesn't return to correctly rendered strip | https://github.com/zen-browser/desktop/issues/4722 | None | None |
| Separate window cannot be closed | https://github.com/zen-browser/desktop/issues/4719 | 1 day, 1:32:05 | None |
| Customize the toolbar without the toggle sidebar icon | https://github.com/zen-browser/desktop/issues/4717 | 1 day, 1:07:42 | None |
| No option to translate to Vietnamese | https://github.com/zen-browser/desktop/issues/4716 | None | None |
| When opening a site with prompt credentials form, the site cannot be opened | https://github.com/zen-browser/desktop/issues/4715 | None | None |
| Links that are not from same domain are opened in Glance when clicked within essential tab, even when Glance is disabled and browser restarted. | https://github.com/zen-browser/desktop/issues/4714 | None | None |
| Selected audio output device (speaker) is not being used | https://github.com/zen-browser/desktop/issues/4713 | None | None |
| ZEN BROWSER crash when open "more tools" menu twice | https://github.com/zen-browser/desktop/issues/4712 | 0:02:34 | None |
| Infinity loading | https://github.com/zen-browser/desktop/issues/4711 | None | 6:24:50 |
| Duplicate entry in Settings > Keyboard Shortcuts | https://github.com/zen-browser/desktop/issues/4709 | None | None |
| [BUG] Extension icons becomes huge after folding tabbar | https://github.com/zen-browser/desktop/issues/4707 | 9:14:59 | None |
| Duplicate entries in settings page | https://github.com/zen-browser/desktop/issues/4706 | None | None |
| Jitter / Stutter on macbook pro with apple silicon | https://github.com/zen-browser/desktop/issues/4705 | 0:21:08 | None |
| Wallpaper settings subsections don't take full width | https://github.com/zen-browser/desktop/issues/4704 | None | None |
| Zen Rice sharing is broken | https://github.com/zen-browser/desktop/issues/4701 | 2:38:42 | 11:21:17 |
| Preedit text misplacement in search box under Wayland with Fcitx5 input method | https://github.com/zen-browser/desktop/issues/4699 | None | None |
| permanently disable browser.tabs.allow_transparent_browser | https://github.com/zen-browser/desktop/issues/4698 | 1 day, 15:39:09 | None |
| Bookmarks Duplicated & Out of Sync | https://github.com/zen-browser/desktop/issues/4697 | None | None |
| Twitch freeze when alt-tabbing | https://github.com/zen-browser/desktop/issues/4696 | 2 days, 3:55:36 | None |
| Popup for TST extension that should occur once, occurs every time Zen is launched (Windows build issue, not Mac) | https://github.com/zen-browser/desktop/issues/4695 | 0:17:58 | None |
| overflow menu. | https://github.com/zen-browser/desktop/issues/4694 | None | None |
| Close tab X button hitbox is different between hover hitbox and click hitbox | https://github.com/zen-browser/desktop/issues/4692 | None | None |
| Menu Alignment Issues | https://github.com/zen-browser/desktop/issues/4691 | None | None |
| Zen freezes several times a day | https://github.com/zen-browser/desktop/issues/4690 | 2 days, 1:37:06 | 2 days, 5:28:59 |
| Scroll issue | https://github.com/zen-browser/desktop/issues/4689 | None | None |
| Issue with Zen Browser Getting Uninstalled Automatically | https://github.com/zen-browser/desktop/issues/4688 | None | None |
| Glance and Keyboard Focus | https://github.com/zen-browser/desktop/issues/4687 | 15:14:37 | None |
| Opening a new Tab when currently in an Essential tab, opens the news tab in Glance Mode | https://github.com/zen-browser/desktop/issues/4686 | 2 days, 4:20:37 | None |
| Empty Space on Tab bar above Workspace when aligned to right | https://github.com/zen-browser/desktop/issues/4683 | 1 day, 23:36:21 | None |
| [BUG] Native sidebar and Zen sidepanel splitters are positioned too close to each other | https://github.com/zen-browser/desktop/issues/4680 | None | None |
| Terminology (and icons) for Sidebars and Side Web Panels too similar and ambiguous | https://github.com/zen-browser/desktop/issues/4679 | 0:11:52 | 2 days, 15:30:38 |
| Customize toolbar in single toolbar mode looks like multiple toolbars | https://github.com/zen-browser/desktop/issues/4678 | None | None |
| Elements in top toolbar overlap when it is resized too small | https://github.com/zen-browser/desktop/issues/4676 | None | None |
| Empty space on the top of compact mode small sidebar | https://github.com/zen-browser/desktop/issues/4674 | 0:14:45 | 0:14:45 |
| Headset is not recognized in google meet | https://github.com/zen-browser/desktop/issues/4671 | None | None |
| Popup is cut in compact mode | https://github.com/zen-browser/desktop/issues/4670 | None | None |
| Combining windows causes tabs in other workspaces to become inaccessible | https://github.com/zen-browser/desktop/issues/4668 | None | None |
| Adjust search text and icon size when searching on a new tab. | https://github.com/zen-browser/desktop/issues/4667 | None | None |
| Tabs freezes while my RAM/VRAM utlizing | https://github.com/zen-browser/desktop/issues/4666 | None | None |
| Workspace Icons are overlayed with the theme color | https://github.com/zen-browser/desktop/issues/4665 | 15:18:13 | 15:18:13 |
| Unable to assign Cmd+Z for undo | https://github.com/zen-browser/desktop/issues/4664 | None | None |
| Black Screen on Windows after opening the Zen Browser | https://github.com/zen-browser/desktop/issues/4663 | None | None |
| Forward button icon slightly offcenter | https://github.com/zen-browser/desktop/issues/4662 | None | None |
| Everything opens in Glance | https://github.com/zen-browser/desktop/issues/4661 | 13:00:08 | 13:00:08 |
| Wrong location of title bar buttons when opening external links from VS Code | https://github.com/zen-browser/desktop/issues/4660 | None | None |
| Web Page print would not render preview | https://github.com/zen-browser/desktop/issues/4659 | 0:18:04 | 0:18:04 |
| Issue with Youtube playback in 4K quality | https://github.com/zen-browser/desktop/issues/4652 | None | None |
| when searching on the address bar, a new tab open instead of the origion tab | https://github.com/zen-browser/desktop/issues/4651 | None | None |
| Compact mode won't disable after changing which toolbars are hidden | https://github.com/zen-browser/desktop/issues/4649 | 16:26:34 | None |
| Problem with tab bar and top bar | https://github.com/zen-browser/desktop/issues/4648 | 7:28:57 | None |
| Excessive margin between bookmark sidebar and center pane | https://github.com/zen-browser/desktop/issues/4647 | 7:37:12 | None |
| I am not able to save my bookmarks of zen with the autoExportHTML flag, this works fine on firefox though. | https://github.com/zen-browser/desktop/issues/4646 | None | None |
| Dropdown input is not selected | https://github.com/zen-browser/desktop/issues/4645 | None | None |
| Toolbar becomes big after customizing the bookmarks placement | https://github.com/zen-browser/desktop/issues/4641 | None | None |
| Zen Mods are not properly installing | https://github.com/zen-browser/desktop/issues/4640 | None | None |
| HDR video plays in SDR | https://github.com/zen-browser/desktop/issues/4639 | None | 3 days, 3:56:44 |
| The rounded corner to the bottom right of the web viewport needs a bigger border radius on linux GTK | https://github.com/zen-browser/desktop/issues/4638 | 3:57:05 | 3:57:05 |
| Tab bar title not aligned properly | https://github.com/zen-browser/desktop/issues/4636 | None | None |
| Window Control Buttons Missing on Linux | https://github.com/zen-browser/desktop/issues/4635 | None | None |
| System freezes while using zen browser | https://github.com/zen-browser/desktop/issues/4634 | 4 days, 17:38:33 | None |
| keymaps issue | https://github.com/zen-browser/desktop/issues/4631 | 0:42:05 | None |
| tool bar stucked | https://github.com/zen-browser/desktop/issues/4630 | 7:29:01 | 1 day, 2:03:18 |
| side bar bug | https://github.com/zen-browser/desktop/issues/4628 | None | None |
| System Crashes (Blue Screen) While Using Zen Browser | https://github.com/zen-browser/desktop/issues/4627 | 10:07:14 | None |
| Macos fullscreen url bar overlaps with bookmark | https://github.com/zen-browser/desktop/issues/4625 | None | None |
| pdf will not load to print | https://github.com/zen-browser/desktop/issues/4623 | 1:48:06 | 1 day, 21:47:12 |
| The sidebar loses it's colour when in compact mode and revealed using the mouse cursor | https://github.com/zen-browser/desktop/issues/4621 | None | None |
| Printer Menu Perpetually Loads; cannot print anything from the browser | https://github.com/zen-browser/desktop/issues/4620 | 0:17:13 | 0:17:13 |
| Extension install dialog is over the tab-bar | https://github.com/zen-browser/desktop/issues/4617 | None | None |
| Light and Dark Mode from Firefox UI Bug | https://github.com/zen-browser/desktop/issues/4616 | None | None |
| Starting 1.7.1b, colourful dark theme doesn't work on browser frame | https://github.com/zen-browser/desktop/issues/4615 | None | None |
| Installing mods overwrites all currently installed ones | https://github.com/zen-browser/desktop/issues/4614 | None | None |
| text pops out of the buttons in Russian | https://github.com/zen-browser/desktop/issues/4613 | None | None |
| Can't do sidebar smaller | https://github.com/zen-browser/desktop/issues/4612 | 0:54:29 | 1 day, 14:32:22 |
| Customized toolbar icons aren't showing | https://github.com/zen-browser/desktop/issues/4610 | 5 days, 0:37:36 | None |
| Web view rounded corners disappear when `backdrop-filter` is used in the page | https://github.com/zen-browser/desktop/issues/4609 | None | None |
| Links don't open in browser | https://github.com/zen-browser/desktop/issues/4608 | None | 6 days, 11:27:06 |
| Issues with tab bar padding and workspaces | https://github.com/zen-browser/desktop/issues/4607 | None | 6 days, 11:37:23 |
| New Windows do not focus the address bar automatically | https://github.com/zen-browser/desktop/issues/4606 | None | None |
| Keybinding Conflict in Zen Browser | https://github.com/zen-browser/desktop/issues/4605 | 2 days, 17:44:23 | None |
| Zen browser URL bar flickering | https://github.com/zen-browser/desktop/issues/4604 | 23:56:25 | None |
| Workspace icon does not get set on creation | https://github.com/zen-browser/desktop/issues/4603 | None | None |
| Browser crashed when clicking expand toolbar button | https://github.com/zen-browser/desktop/issues/4600 | None | None |
| Close Pinned tabs in right click menu ignores "close tab shortcut behaviour" in prefs | https://github.com/zen-browser/desktop/issues/4599 | None | None |
| Weird color highlight (again) & thin border on right side | https://github.com/zen-browser/desktop/issues/4598 | None | None |
| Window control buttons disappear on MacOS | https://github.com/zen-browser/desktop/issues/4597 | None | None |
| Zen is not showing up in the default web browser selection on Elementary OS 8 settings | https://github.com/zen-browser/desktop/issues/4594 | 3:27:41 | 23:09:00 |
| My accounts keep signing out after a while. (Google, Github) | https://github.com/zen-browser/desktop/issues/4593 | 6 days, 0:59:05 | None |
| Arrows are Backwards | https://github.com/zen-browser/desktop/issues/4592 | 7:58:01 | 19:33:43 |
| Bookmarks Toolbar automatically hides in "Single toolbar" layout even though "Alway Show" is enabled | https://github.com/zen-browser/desktop/issues/4591 | None | None |
| Zen couldnt find any programs that contain bookmark, history or password data. | https://github.com/zen-browser/desktop/issues/4589 | 0:12:09 | 0:12:09 |
| Cannot remove Workspace switch from side bar/toolbar | https://github.com/zen-browser/desktop/issues/4588 | 0:10:50 | 0:18:19 |
| Window size of [Shows tabs from other devices] | https://github.com/zen-browser/desktop/issues/4586 | None | None |
| Bug, tabs getting "stuck" randomly, unclickable | https://github.com/zen-browser/desktop/issues/4583 | 11:25:21 | None |
| Sort Mods Store by popularity | https://github.com/zen-browser/desktop/issues/4582 | 6:36:38 | 6:36:38 |
| Significant FPS drop when playing 4k/1440p youtube video | https://github.com/zen-browser/desktop/issues/4580 | 0:12:21 | None |
| Adressbar only showing on hover if sidebar width is collabsed | https://github.com/zen-browser/desktop/issues/4579 | 0:07:48 | 0:13:21 |
| Can't find on github search | https://github.com/zen-browser/desktop/issues/4576 | 4:34:29 | 4:34:29 |
| URL is shifted to the right when a permission is granted to a website | https://github.com/zen-browser/desktop/issues/4574 | 4:46:44 | 15:13:36 |
| can't change font for different languages | https://github.com/zen-browser/desktop/issues/4573 | 13:11:54 | 2 days, 19:07:15 |
| Extention storage full or | https://github.com/zen-browser/desktop/issues/4572 | None | None |
| Sidebar layout issues | https://github.com/zen-browser/desktop/issues/4570 | None | None |
| codeiq.vex.com unsupported since 1.7.2b | https://github.com/zen-browser/desktop/issues/4569 | 0:56:16 | 17:32:41 |
| Zen not showing any webpage when out of compact mode | https://github.com/zen-browser/desktop/issues/4566 | None | None |
| Discord Web App Forces Links to Open in Glance Window, Overriding User Preferences | https://github.com/zen-browser/desktop/issues/4564 | 2:42:18 | 3:30:19 |
| Some Firefox settings wiped after signing into sync | https://github.com/zen-browser/desktop/issues/4562 | 0:39:56 | None |
| Empty space on top of sidebar in compact mode | https://github.com/zen-browser/desktop/issues/4561 | 0:05:34 | 0:05:34 |
| Cannot Click to Place Cursor in Address-Bar on Linux and Windows | https://github.com/zen-browser/desktop/issues/4560 | 4 days, 18:49:29 | None |
| Prezo.ai : site broken, not loading properly on Zen Browser. | https://github.com/zen-browser/desktop/issues/4557 | 1 day, 20:29:16 | None |
| Printing preview loads indefinitely | https://github.com/zen-browser/desktop/issues/4555 | 2:59:17 | 2 days, 9:39:10 |
| Neither swipe gestures nor mouse forward/backward buttons work to switch workspaces | https://github.com/zen-browser/desktop/issues/4554 | 1:04:38 | None |
| Expand Sidebar Icon missing when sidebar is folded | https://github.com/zen-browser/desktop/issues/4553 | 5:31:28 | None |
| Windows' button shadows, bleed into the website space | https://github.com/zen-browser/desktop/issues/4551 | None | None |
| MacOS pointer not hiding when entering fullscreen | https://github.com/zen-browser/desktop/issues/4550 | None | None |
| Private browsing Profile Icon is missing | https://github.com/zen-browser/desktop/issues/4549 | None | None |
| When customizing toolbar allows the browser window to be dragged but not maximized. | https://github.com/zen-browser/desktop/issues/4548 | None | None |
| Workspace icons moved from top to side bar | https://github.com/zen-browser/desktop/issues/4547 | 3:50:50 | 3:50:50 |
| macOS: 'All Desktops' option in dock icon context menu not functioning | https://github.com/zen-browser/desktop/issues/4546 | None | None |
| OPTIONS preflight request uses HTTPS while GET request is HTTP in Angular | https://github.com/zen-browser/desktop/issues/4545 | None | None |
| Cannot adjust horizontal split width when zen web panels are pinned | https://github.com/zen-browser/desktop/issues/4544 | None | None |
| Searchbar widget doesn't iconify in collapsed mode Sidebar | https://github.com/zen-browser/desktop/issues/4543 | None | None |
| Rightmost icon in multiple toolbars disappears on launch | https://github.com/zen-browser/desktop/issues/4542 | None | None |
| Essentials disappear when switching container with PiP playing | https://github.com/zen-browser/desktop/issues/4541 | None | None |
| Workspace switchers over vertical tabs misplaced after 1.7.2b | https://github.com/zen-browser/desktop/issues/4540 | 9:53:46 | 11:31:54 |
| Compact mode works once per window | https://github.com/zen-browser/desktop/issues/4539 | 0:15:28 | 18:44:40 |
| 1Password integrations | https://github.com/zen-browser/desktop/issues/4538 | 12:10:26 | 15:09:30 |
| Extra white space at the top of the sidebar | https://github.com/zen-browser/desktop/issues/4537 | 4:37:10 | 3 days, 6:44:37 |
| Windows - Can't hide any Bars | https://github.com/zen-browser/desktop/issues/4536 | 12:20:24 | 12:20:24 |
| Typo | https://github.com/zen-browser/desktop/issues/4534 | 13:55:02 | 13:55:02 |
| Viewport rounded corners flicker & sharpness | https://github.com/zen-browser/desktop/issues/4533 | None | 0:05:25 |
| Reloading Unloaded PDF tabs creates duplicates | https://github.com/zen-browser/desktop/issues/4532 | 9:22:02 | None |
| Browser shows extra animation every time user switches to a split | https://github.com/zen-browser/desktop/issues/4531 | 16:36:14 | None |
| Screenshot icon disappeads from toolbar after each time my MAC is shutdown | https://github.com/zen-browser/desktop/issues/4530 | None | 1 day, 8:23:32 |
| I want to close my WINDOW with Ctrl + W | https://github.com/zen-browser/desktop/issues/4529 | 0:21:41 | 1 day, 2:07:59 |
| Browser Closes when All Tabs in Default Workspace are Closed Even with Other Tabs | https://github.com/zen-browser/desktop/issues/4528 | None | None |
| IDN address show punny code in URL | https://github.com/zen-browser/desktop/issues/4527 | None | None |
| Text is garbled in google docs | https://github.com/zen-browser/desktop/issues/4522 | 1 day, 2:06:08 | 2 days, 6:20:50 |
| Sidebar issues | https://github.com/zen-browser/desktop/issues/4520 | None | None |
| Sidebar wallpaper blur Macos | https://github.com/zen-browser/desktop/issues/4519 | None | None |
| Zen crashes on macOS when expanding and collapsing tab bar | https://github.com/zen-browser/desktop/issues/4518 | 8:01:33 | 8:05:17 |
| Hide and unhide sidebar impacts the Extensions icons size | https://github.com/zen-browser/desktop/issues/4517 | 4 days, 11:55:27 | None |
| Overflow menu gone in single toolbar mode | https://github.com/zen-browser/desktop/issues/4516 | None | None |
| light theme page container looks like outset | https://github.com/zen-browser/desktop/issues/4515 | 6:33:55 | 6:33:55 |
| marvinpinto/action-automatic-releases should be updated to Node20 | https://github.com/zen-browser/desktop/issues/4514 | None | None |
| Searching using the new tab search box shows the name of the engine in the address bar | https://github.com/zen-browser/desktop/issues/4512 | None | None |
| Icons in collapsible top bar don't line up with other single toolbar icons | https://github.com/zen-browser/desktop/issues/4511 | None | None |
| Top button wrap feature hides buttons when there is space | https://github.com/zen-browser/desktop/issues/4510 | None | None |
| Hide bars doesn't work after last update | https://github.com/zen-browser/desktop/issues/4509 | 0:53:56 | 4:12:00 |
| artifacts/lines across screen on some websites. | https://github.com/zen-browser/desktop/issues/4508 | None | None |
| Browser freezes and CPU usage spikes after opening/closing "More tools" twice | https://github.com/zen-browser/desktop/issues/4507 | 1:22:50 | None |
| flood to Google by fast open/close broser. request support base64 favicon | https://github.com/zen-browser/desktop/issues/4506 | None | None |
| "Pin Tab" missing in keyboard shortcut settings | https://github.com/zen-browser/desktop/issues/4504 | None | None |
| Container tab opens the old signed in page | https://github.com/zen-browser/desktop/issues/4503 | None | None |
| Container Indicator Still Showing With New Window | https://github.com/zen-browser/desktop/issues/4502 | 8:13:52 | 8:13:52 |
| Text on PDFs/Powerpoints is completely unreadable | https://github.com/zen-browser/desktop/issues/4501 | 0:09:15 | 0:09:18 |
| Bookmarks in toolbar and ability to add bookmarks dissapppeared with release 1.7.1b | https://github.com/zen-browser/desktop/issues/4499 | 4 days, 3:23:33 | 3 days, 7:20:47 |
| Theme Selection Issue After Browser Update version 1.7.1b Windows | https://github.com/zen-browser/desktop/issues/4498 | 0:28:37 | 0:28:37 |
| Browser Freeze on image copy | https://github.com/zen-browser/desktop/issues/4497 | None | None |
| Fcitx5 doesn't load skins / themes / settings on KDE 6 wayland | https://github.com/zen-browser/desktop/issues/4495 | 1:42:18 | None |
| When starting zen browser it takes a long time starting up | https://github.com/zen-browser/desktop/issues/4494 | None | None |
| Scrolling between the workspaces is very slow.. | https://github.com/zen-browser/desktop/issues/4493 | None | 9 days, 9:07:24 |
| Theme colour interfering with webpage | https://github.com/zen-browser/desktop/issues/4492 | 1:24:45 | 1:24:45 |
| Essentials turning into pinned tab in new window | https://github.com/zen-browser/desktop/issues/4491 | None | None |
| All add-ons have been disabled by safe mode on version 1.7.1b Windows | https://github.com/zen-browser/desktop/issues/4490 | None | 23:06:20 |
| Opening the overflow menu twice freezes the browser window on MacOs | https://github.com/zen-browser/desktop/issues/4489 | 1 day, 10:02:01 | 5 days, 8:07:24 |
| After updating to 1.7.1 Zen "broke" | https://github.com/zen-browser/desktop/issues/4488 | 0:28:58 | 3:10:29 |
| After highlighting search toolbar the background blur breaks out. | https://github.com/zen-browser/desktop/issues/4487 | 3:22:32 | None |
| Compact Mode No Longer Hides Sidebar and Top Toolbar | https://github.com/zen-browser/desktop/issues/4486 | 0:13:16 | 0:20:02 |
| mailto dialog breaks when compact mode is enabled | https://github.com/zen-browser/desktop/issues/4485 | None | None |
| Toolbar is not hiding after hide both top bar and tab bar | https://github.com/zen-browser/desktop/issues/4484 | 0:46:49 | 0:54:21 |
| After last update, ZEN browser just disappered! | https://github.com/zen-browser/desktop/issues/4482 | 2:13:47 | 1 day, 19:31:19 |
| browser.tabs.closeWindowWithLastTab does not work when there are essentials or pinned tabs | https://github.com/zen-browser/desktop/issues/4481 | None | None |
| Address Bar Slides Down Unexpectedly When Hovering for Toolbar in Full-Screen Mode | https://github.com/zen-browser/desktop/issues/4480 | None | None |
| Web panel icon in the sidebar is missing | https://github.com/zen-browser/desktop/issues/4479 | 4:50:13 | None |
| Broken scrollbar on the sidebar | https://github.com/zen-browser/desktop/issues/4478 | 4:38:40 | 4:38:40 |
| Tab Toolbar No Longer Collapsing | https://github.com/zen-browser/desktop/issues/4477 | 2:05:12 | 4:17:18 |
| Tab group collapsing seems to not work | https://github.com/zen-browser/desktop/issues/4476 | 0:13:43 | 9:07:00 |
| No button to enable compact mode in settings page | https://github.com/zen-browser/desktop/issues/4473 | 5:51:29 | 6:25:51 |
| Can't click out of submenus or right-click context menu. | https://github.com/zen-browser/desktop/issues/4471 | None | 0:14:04 |
| "Some of Zen's security features may offer less protection on your current operating system" | https://github.com/zen-browser/desktop/issues/4470 | 0:42:44 | 0:42:47 |
| Dragging out the last tab from the tab list opens up another window | https://github.com/zen-browser/desktop/issues/4469 | 1:50:02 | None |
| Wrong location of input content directly after creating a new tab page | https://github.com/zen-browser/desktop/issues/4468 | 14:53:17 | 14:53:17 |
| active Essentials tab - url changed is opening in the active Essentials tab instead of new tab | https://github.com/zen-browser/desktop/issues/4467 | 0:04:56 | 0:04:56 |
| The Current Workspace Indicator is no longer clickable. | https://github.com/zen-browser/desktop/issues/4466 | 0:41:38 | None |
| My browser addons do not show up or have any effect in the Web panel tabs? | https://github.com/zen-browser/desktop/issues/4465 | None | None |
| Profile switcher not showing in collapsed sidebar | https://github.com/zen-browser/desktop/issues/4464 | None | None |
| Facebook does not work | https://github.com/zen-browser/desktop/issues/4463 | None | 0:08:40 |
| Latest Twilight Release breaks UI on MacOS | https://github.com/zen-browser/desktop/issues/4462 | 0:38:30 | 19:02:04 |
| Zen Compact mode doesn't work at all | https://github.com/zen-browser/desktop/issues/4461 | 0:33:07 | 1:45:21 |
| Extension permissions window shifted | https://github.com/zen-browser/desktop/issues/4460 | 1:45:17 | None |
| Browser Extensions Display Incorrectly When Changing Sidebar Width in Single Toolbar Mode | https://github.com/zen-browser/desktop/issues/4459 | None | None |
| Missing "Change theme colors" | https://github.com/zen-browser/desktop/issues/4458 | 3:34:32 | None |
| Zen getting closed immediately when I open it after screen is locked for some time | https://github.com/zen-browser/desktop/issues/4457 | 1 day, 3:23:38 | 6 days, 4:08:52 |
| Tab sidebar does not sliding properly with touchpad (IT FIXED WHEN UPDATE 1.7B) | https://github.com/zen-browser/desktop/issues/4456 | 4:03:13 | 4:04:23 |
| Massive Visual Glitch | https://github.com/zen-browser/desktop/issues/4455 | 4:28:14 | 4:38:13 |
| Tab and top bars not collapsing when upgrading from 1.7b to 1.7.1b | https://github.com/zen-browser/desktop/issues/4454 | 1:36:02 | 5:22:48 |
| Workspace Emoji not updating choice | https://github.com/zen-browser/desktop/issues/4453 | None | None |
| Synchronizing Duplicates Default Workspace | https://github.com/zen-browser/desktop/issues/4452 | 1 day, 7:42:33 | None |
| Tabs freeze when opening new ones | https://github.com/zen-browser/desktop/issues/4451 | 8:44:35 | None |
| Severe memory leak | https://github.com/zen-browser/desktop/issues/4450 | 3:35:43 | None |
| Tab Retitle Not Working For All Workspaces | https://github.com/zen-browser/desktop/issues/4448 | None | None |
| Scrolling horizontally on the sidebar animates even when current workspace is the only workspace | https://github.com/zen-browser/desktop/issues/4447 | None | None |
| Essentials Loading In Wrong Workspace When Using Firefox Multi-Acccount Containers | https://github.com/zen-browser/desktop/issues/4446 | 1 day, 13:29:49 | 1 day, 22:44:12 |
| Link to Firefox app in about:protections | https://github.com/zen-browser/desktop/issues/4445 | 17:52:50 | None |
| The name of the application displayed in the notification | https://github.com/zen-browser/desktop/issues/4444 | None | None |
| Bookmarks duplicate on new window (sometimes) | https://github.com/zen-browser/desktop/issues/4443 | None | 9 days, 4:00:20 |
| "Undo Close Window" action does not work correctly | https://github.com/zen-browser/desktop/issues/4442 | None | None |
| Zen Browser very slow to load all websites | https://github.com/zen-browser/desktop/issues/4441 | None | 8:28:11 |
| Close Browser issue | https://github.com/zen-browser/desktop/issues/4440 | None | None |
| 1password-extension connection failure on ZEN browser | https://github.com/zen-browser/desktop/issues/4438 | 0:13:02 | None |
| Container indicators always show on tabs dragged out of window, even if they are opened in their containers' default workspaces | https://github.com/zen-browser/desktop/issues/4437 | None | None |
| Essentials in new windows open in container of last used workspace instead of their actual containers | https://github.com/zen-browser/desktop/issues/4436 | None | None |
| Forced compact mode on multiple toolbars view, right of screen cut off | https://github.com/zen-browser/desktop/issues/4434 | 2:00:41 | 10:00:34 |
| Forced compact mode on multiple toolbars view, right of screen cut off | https://github.com/zen-browser/desktop/issues/4433 | 10:03:04 | 10:03:04 |
| problem moving icons | https://github.com/zen-browser/desktop/issues/4432 | None | 1 day, 22:26:39 |
| (Regression?) Tab moving is buggy after switching workspaces | https://github.com/zen-browser/desktop/issues/4431 | None | 13 days, 3:51:45 |
| Changing theme to light does not work | https://github.com/zen-browser/desktop/issues/4430 | None | 1:26:30 |
| Bottom Corners are not Rounded | https://github.com/zen-browser/desktop/issues/4428 | 0:09:07 | 0:09:07 |
| Moving bookmark items to sidebar makes it stuck | https://github.com/zen-browser/desktop/issues/4427 | None | None |
| Actual Window Width of Zen Twilight 1.7t (2025-01-18 at 00:37:45) | https://github.com/zen-browser/desktop/issues/4426 | 4:16:49 | None |
| Text in modals are blank | https://github.com/zen-browser/desktop/issues/4425 | None | None |
| Problem customizing the toolbar | https://github.com/zen-browser/desktop/issues/4424 | None | None |
| REGRESSION: Non-workspace users are seeing an useless button. | https://github.com/zen-browser/desktop/issues/4423 | 1:27:08 | 1:27:08 |
| Homepage and new tabs are clashing/reseting between two extensions after restarting the browser | https://github.com/zen-browser/desktop/issues/4420 | 9:59:30 | None |
| Zen browser (flatpak Linux) too slow to load the first website on first start | https://github.com/zen-browser/desktop/issues/4418 | None | None |
| Buggy Youtube entering and exiting full screen mode | https://github.com/zen-browser/desktop/issues/4417 | 1:28:01 | None |
| Unexpected UI for essential's active tabs | https://github.com/zen-browser/desktop/issues/4416 | None | None |
| old tab is not opening again. | https://github.com/zen-browser/desktop/issues/4412 | 13:38:37 | 13:57:44 |
| All gone on update | https://github.com/zen-browser/desktop/issues/4411 | 0:16:47 | 0:18:50 |
| https://discord.com requires login every refresh and is irresponsive when using Ctrl+Shift+I | https://github.com/zen-browser/desktop/issues/4408 | None | None |
| Required to double-click non tab elements in vertical tab bar | https://github.com/zen-browser/desktop/issues/4406 | None | 15 days, 1:43:06 |
| New tab opened with link click does not scroll into view, or have any indication that a new tab is been created | https://github.com/zen-browser/desktop/issues/4405 | None | None |
| Uneven padding in the window border | https://github.com/zen-browser/desktop/issues/4404 | None | None |
| editing problem in the url bar | https://github.com/zen-browser/desktop/issues/4403 | None | None |
| CMD+W closes the browser. | https://github.com/zen-browser/desktop/issues/4402 | 0:13:23 | 0:13:23 |
| Toolbar blinks when in compact mode and while hovering over it with a mouse | https://github.com/zen-browser/desktop/issues/4401 | 0:36:52 | 0:36:52 |
| When two windows of Zen are opened, they have slightly different color scheme | https://github.com/zen-browser/desktop/issues/4400 | 1 day, 4:29:58 | 2 days, 2:33:55 |
| Browser freezes after abruptly closing essential before loading them | https://github.com/zen-browser/desktop/issues/4399 | None | None |
| Collapsible Sidebar Not Functioning Correctly | https://github.com/zen-browser/desktop/issues/4398 | 2:47:32 | 2:47:32 |
| Failed to find update in twilight | https://github.com/zen-browser/desktop/issues/4397 | 2:49:14 | 3:02:05 |
| keepassxc addon not working on garuda linux | https://github.com/zen-browser/desktop/issues/4396 | None | 0:01:02 |
| (MacOS) Audio on browser not app-adjustable in utilities that allow individual app volume control. | https://github.com/zen-browser/desktop/issues/4395 | None | None |
| When enabling and disabling compact mode, depending on the web page you are viewing, the page jitters | https://github.com/zen-browser/desktop/issues/4394 | 3:26:06 | 3:26:06 |
| No dialog to give an "escape full screen" button when in full screen video, i.e on YouTube | https://github.com/zen-browser/desktop/issues/4392 | 4:01:26 | 4:01:26 |
| Pinned tabs are looking like regular tabs with a separator | https://github.com/zen-browser/desktop/issues/4391 | 0:48:28 | 21:14:22 |
| Added a new container and workspace, changed the icon and color, which caused in the search bar indicator to disappear. | https://github.com/zen-browser/desktop/issues/4390 | None | None |
| toolbar doesnt pop up when opening tabs with middle mouse click | https://github.com/zen-browser/desktop/issues/4389 | None | None |
| tabs are unloaded too quickly | https://github.com/zen-browser/desktop/issues/4388 | 0:27:37 | None |
| 1.7b When browser closes when the last tab is closed, it creates a new tab, and then quits | https://github.com/zen-browser/desktop/issues/4387 | None | None |
| 1.7b Active Tab Design | https://github.com/zen-browser/desktop/issues/4386 | 1:19:07 | None |
| Visual glitches with fonts on some websites | https://github.com/zen-browser/desktop/issues/4385 | 1:13:45 | 1:13:45 |
| 1.7b laggy in general compared to 1.6b | https://github.com/zen-browser/desktop/issues/4384 | 2:20:31 | 6 days, 23:13:36 |
| Tab unloader does not work; does not reduce resource consumption | https://github.com/zen-browser/desktop/issues/4383 | 6:47:30 | None |
| ZIP download button does nothing | https://github.com/zen-browser/desktop/issues/4382 | 0:26:46 | 0:26:46 |
| The history button is broken on the side bar | https://github.com/zen-browser/desktop/issues/4381 | 1:36:08 | None |
| Pixelated Text | https://github.com/zen-browser/desktop/issues/4380 | 1:34:11 | 1:34:11 |
| Allow workspaces have their own pinned tabs not working 1.7b | https://github.com/zen-browser/desktop/issues/4379 | 5:21:45 | 5:21:45 |
| Full LTO causes crash with flatpak | https://github.com/zen-browser/desktop/issues/4378 | 7:38:51 | None |
| Lost all pins and essentials on update 1.7b | https://github.com/zen-browser/desktop/issues/4377 | 6:01:05 | None |
| 1.7b tab bar choppy animation and interaction issue | https://github.com/zen-browser/desktop/issues/4376 | 22:56:24 | None |
| Workspace switching by touchpad swipe doesn't work with too many tabs open. | https://github.com/zen-browser/desktop/issues/4375 | 0:05:39 | None |
| Synced tabs pop-up layout messed up | https://github.com/zen-browser/desktop/issues/4371 | None | None |
| Keyboard shortcuts keep being reset | https://github.com/zen-browser/desktop/issues/4370 | 17:21:42 | 2 days, 1:32:20 |
| Zen doesn't respond quickly (~2 min) to discord attempting to download .deb file for update | https://github.com/zen-browser/desktop/issues/4369 | 0:32:40 | None |
| Compact tab bar isn't going to hide at last Twilight build (1.7t (2025-01-15)) | https://github.com/zen-browser/desktop/issues/4368 | 0:33:05 | 0:33:05 |
| Sidebar does't change width properly. | https://github.com/zen-browser/desktop/issues/4367 | 1:29:43 | 1:29:43 |
| Dialog box appearing in wrong direction | https://github.com/zen-browser/desktop/issues/4366 | 1:59:09 | 4:33:28 |
| 1Password says there's a Firefox update available | https://github.com/zen-browser/desktop/issues/4365 | 5:09:12 | None |
| Sometimes tabs stuck and not clickable | https://github.com/zen-browser/desktop/issues/4362 | 0:19:25 | None |
| Side Web Panel icon shows after start when deactivated | https://github.com/zen-browser/desktop/issues/4361 | 19:20:10 | None |
| Tab bar scrolls slow and buggy | https://github.com/zen-browser/desktop/issues/4359 | 0:09:28 | 0:23:50 |
| Zen Browser opens zen-beta? | https://github.com/zen-browser/desktop/issues/4358 | 11:38:19 | 1 day, 0:36:24 |
| Tab bar is blue | https://github.com/zen-browser/desktop/issues/4357 | 1:27:20 | 1:28:24 |
| Require Device Sign-in to fill passwords does not work | https://github.com/zen-browser/desktop/issues/4356 | 1 day, 13:54:07 | None |
| Quicktime browser plugin not displaying | https://github.com/zen-browser/desktop/issues/4355 | 0:02:21 | 1 day, 3:43:36 |
| Html Date (Month) Input is not working. | https://github.com/zen-browser/desktop/issues/4354 | 1 day, 4:02:04 | None |
| Proxies cannot be used to access google, YouTube, and more | https://github.com/zen-browser/desktop/issues/4352 | 1:35:57 | 1 day, 0:46:50 |
| Round edging not functional on some sites | https://github.com/zen-browser/desktop/issues/4351 | 2:37:01 | 1 day, 5:36:14 |
| Sign pop up windows not using container assigned to workspace. | https://github.com/zen-browser/desktop/issues/4350 | None | None |
| Browser bug , not work correctly | https://github.com/zen-browser/desktop/issues/4348 | 2:26:52 | 17 days, 7:42:31 |
| Opening settings causes sidebar to go ultra wide | https://github.com/zen-browser/desktop/issues/4347 | None | None |
| Notification for 'new tab' does not work | https://github.com/zen-browser/desktop/issues/4346 | 3:25:57 | 21:01:52 |
| New tab created with link click OR ctrl+T is obscured by empty/unused toolbar space | https://github.com/zen-browser/desktop/issues/4345 | None | None |
| Jittering in tab groups | https://github.com/zen-browser/desktop/issues/4343 | 3:11:54 | 3:32:43 |
| Sidebar Jittering While In compact mode | https://github.com/zen-browser/desktop/issues/4342 | None | None |
| [Windows] Videos crash in the second view | https://github.com/zen-browser/desktop/issues/4341 | 6:12:02 | None |
| Page refresh | https://github.com/zen-browser/desktop/issues/4338 | 11:57:25 | None |
| Expand Side's bar changes position of forward and backward buttons | https://github.com/zen-browser/desktop/issues/4336 | 12:19:39 | None |
| breaks after using rectify11 and mica for everyone | https://github.com/zen-browser/desktop/issues/4335 | None | 3:03:08 |
| Link "Zen support site" redirects to firefox support site | https://github.com/zen-browser/desktop/issues/4333 | 16:39:30 | 16:39:30 |
| Opening discord keeps crashing the tab | https://github.com/zen-browser/desktop/issues/4332 | 0:24:48 | 0:24:48 |
| space between essentials/tabs and the workspace title is different for default vs others | https://github.com/zen-browser/desktop/issues/4329 | None | 1 day, 0:42:55 |
| Essential disappears, but it's still there | https://github.com/zen-browser/desktop/issues/4328 | 17:21:42 | 2 days, 3:52:35 |
| Text in PDF is (still) distorted | https://github.com/zen-browser/desktop/issues/4327 | 1 day, 0:20:39 | 1 day, 0:20:39 |
| Waiting since very long for Hold click to preview link | https://github.com/zen-browser/desktop/issues/4326 | 1 day, 1:18:24 | 1 day, 1:18:24 |
| Can't close window by closing the last tab | https://github.com/zen-browser/desktop/issues/4325 | 0:50:23 | 1 day, 3:13:18 |
| Zen Browser on MacOS is not restoring tabs after closing window | https://github.com/zen-browser/desktop/issues/4324 | 1 day, 3:29:13 | None |
| Some videos can't play in Zen Browser | https://github.com/zen-browser/desktop/issues/4323 | 2 days, 14:26:03 | None |
| Web panel pin button has wrong icon when clicking for the first time | https://github.com/zen-browser/desktop/issues/4322 | None | None |
| Slow scrolling speed on the vertical tab bar in 1.6b | https://github.com/zen-browser/desktop/issues/4321 | 1:18:21 | 1 day, 5:19:47 |
| browser.urlbar.suggest.topsites set to false make url cannot be edited | https://github.com/zen-browser/desktop/issues/4319 | 1 day, 3:38:03 | 2 days, 9:54:46 |
| Tab volume icon not showing in collapsed toolbar unless tab is active | https://github.com/zen-browser/desktop/issues/4316 | None | 0:08:41 |
| Profile avatar picture flashes and is overridden by firefox account avatar | https://github.com/zen-browser/desktop/issues/4315 | 8:16:31 | 8:16:31 |
| Zen Browser Turn Light At Lost Focus | https://github.com/zen-browser/desktop/issues/4314 | 2 days, 4:11:22 | 5 days, 16:04:18 |
| "Log-in to this network" modal & button not interactible | https://github.com/zen-browser/desktop/issues/4313 | None | None |
| Sudden Crashes on Arch Linux with Multiple Tabs Opened | https://github.com/zen-browser/desktop/issues/4309 | 2:56:11 | None |
| Since 1.6b, tab bar scrolls slowly and unpredictably when using a touchpad | https://github.com/zen-browser/desktop/issues/4307 | 2:14:54 | 13:01:41 |
| Breaking Keyboard Shortcuts | https://github.com/zen-browser/desktop/issues/4306 | 2:00:54 | 4 days, 2:12:32 |
| [TWILIGHT] New update has some bugs I've found so far | https://github.com/zen-browser/desktop/issues/4304 | 4:56:10 | 19 days, 5:12:42 |
| blurry fonts on 32:9 aspect ratio | https://github.com/zen-browser/desktop/issues/4303 | 6:21:35 | None |
| Checked Radio button UI issue | https://github.com/zen-browser/desktop/issues/4302 | 0:51:38 | None |
| Firefox Home shortcut is turned off. | https://github.com/zen-browser/desktop/issues/4300 | 10:54:39 | None |
| Unable to edit URL in address bar | https://github.com/zen-browser/desktop/issues/4299 | 9:46:51 | 23:24:13 |
| Private Window New Tab is not showing blank page. | https://github.com/zen-browser/desktop/issues/4297 | None | None |
| Essential Tabs URLs Disappear After Brew Update and Browser Restart | https://github.com/zen-browser/desktop/issues/4296 | 2 days, 12:54:19 | None |
| Floating URL bar misplaced after opening Customize Toolbar | https://github.com/zen-browser/desktop/issues/4295 | 17:27:44 | None |
| Unfocusing the browser with "widget.gtk.rounded-bottom-corners.enabled" causes the bottom corners to stop being rounded | https://github.com/zen-browser/desktop/issues/4294 | None | 12:46:25 |
| Pin to toolbar text out of place on Mac | https://github.com/zen-browser/desktop/issues/4293 | None | None |
| the slider on the home screen looks just like a dot when turned on | https://github.com/zen-browser/desktop/issues/4291 | None | None |
| Closing the last tab in the only workspace should close the browser | https://github.com/zen-browser/desktop/issues/4289 | 2:29:09 | 19:14:35 |
| Scrolling on touchpad broken | https://github.com/zen-browser/desktop/issues/4288 | None | 0:07:44 |
| Sidebar behaving weird when compact mode is in "hide toolbar only" mode | https://github.com/zen-browser/desktop/issues/4287 | 1 day, 5:36:16 | 1 day, 23:15:29 |
| Zen Beta (any version) is completely broken for me | https://github.com/zen-browser/desktop/issues/4286 | 0:28:01 | 21:07:29 |
| Previous and Next page buttons switched | https://github.com/zen-browser/desktop/issues/4285 | 0:34:35 | 0:34:35 |
| Random crash after using the browser for some time. | https://github.com/zen-browser/desktop/issues/4284 | None | None |
| Even if you have recent activity turned on in the settings, it will be turned off the next time you start Zen Browser. | https://github.com/zen-browser/desktop/issues/4283 | 0:04:23 | None |
| [windows only] wired orange-ish background in new version | https://github.com/zen-browser/desktop/issues/4281 | 0:01:44 | 0:01:44 |
| Blurred fonts on Webpages | https://github.com/zen-browser/desktop/issues/4280 | 0:55:49 | 0:55:49 |
| Customize Toolbar breaks the browser layout | https://github.com/zen-browser/desktop/issues/4279 | 1:37:10 | None |
| When second window is opened, Essential tabs are not visible for this window | https://github.com/zen-browser/desktop/issues/4278 | None | None |
| Frame color is grey instead of light or dark themed | https://github.com/zen-browser/desktop/issues/4277 | 13:26:52 | 9 days, 19:55:41 |
| Tab styling bug | https://github.com/zen-browser/desktop/issues/4276 | None | 4:32:10 |
| Vertical Toolbar Resizing | https://github.com/zen-browser/desktop/issues/4275 | 1:10:26 | 5:40:14 |
| Scoll Bar has lower scroll factor. | https://github.com/zen-browser/desktop/issues/4274 | 8:35:00 | 8:35:00 |
| Closing last tab does not close browser | https://github.com/zen-browser/desktop/issues/4273 | 9:04:24 | 12:10:08 |
| I can't disable workspaces anymore | https://github.com/zen-browser/desktop/issues/4272 | 0:10:05 | 13:14:51 |
| Why there is strange styling / background color on some of the pages? | https://github.com/zen-browser/desktop/issues/4271 | None | 0:12:17 |
| Customize Toolbar not saving changes upon relaunch. | https://github.com/zen-browser/desktop/issues/4270 | 2 days, 0:05:19 | None |
| White line at the bottom | https://github.com/zen-browser/desktop/issues/4269 | None | None |
| History / recently visited pages list contains only icons, no names or adresses | https://github.com/zen-browser/desktop/issues/4265 | 2 days, 21:24:58 | None |
| Weird color highlight when window is in focus | https://github.com/zen-browser/desktop/issues/4264 | 1 day, 4:13:23 | 1 day, 20:39:36 |
| Workspaces | https://github.com/zen-browser/desktop/issues/4263 | None | 2:26:35 |
| Audio indicator not showing for sites playing audio when not chosen | https://github.com/zen-browser/desktop/issues/4262 | None | None |
| Theme color | https://github.com/zen-browser/desktop/issues/4261 | 0:11:52 | 3 days, 0:13:33 |
| Performance lag/FPS drops on HP Spectre laptop only | https://github.com/zen-browser/desktop/issues/4260 | None | None |
| Browser window colors change when window is inactive/unfocused | https://github.com/zen-browser/desktop/issues/4258 | 1 day, 7:13:53 | 0:08:23 |
| Each update requires the binary to be re-downloaded. | https://github.com/zen-browser/desktop/issues/4257 | None | None |
| Workspaces button (above tabs) does not hide even tho I have only one workspace. | https://github.com/zen-browser/desktop/issues/4256 | 0:39:33 | 2 days, 0:19:16 |
| Keyboard Shortcuts reset everytime I open the browser | https://github.com/zen-browser/desktop/issues/4255 | 8:48:29 | 2 days, 3:25:34 |
| When opening a new window, inned tabs are also reopen in the new window (tho some become "New Tab"). | https://github.com/zen-browser/desktop/issues/4254 | None | None |
| Back and Forward buttons moved to the right and flipped | https://github.com/zen-browser/desktop/issues/4253 | 12:03:43 | 0:11:45 |
| Web Developer Tools missing labels in collapsed toolbar. | https://github.com/zen-browser/desktop/issues/4252 | None | None |
| Can't change location in the weather widget | https://github.com/zen-browser/desktop/issues/4250 | 3 days, 18:40:41 | None |
| Tabs crashing randomlly | https://github.com/zen-browser/desktop/issues/4249 | 3 days, 11:21:20 | None |
| Freesync broken in fullscreen | https://github.com/zen-browser/desktop/issues/4248 | None | None |
| Floating URL touchpad switch workspace | https://github.com/zen-browser/desktop/issues/4246 | None | None |
| Page open. No Tab in tab bar. | https://github.com/zen-browser/desktop/issues/4244 | None | 12 days, 20:38:18 |
| Sidebar not working properly. | https://github.com/zen-browser/desktop/issues/4242 | 10:58:19 | 1 day, 6:06:30 |
| Why are the tabs on the right? | https://github.com/zen-browser/desktop/issues/4241 | 3:53:16 | 9 days, 21:54:56 |
| Shortcuts for cycling workspaces are not working on non-English keyboard layout | https://github.com/zen-browser/desktop/issues/4240 | 14:14:25 | None |
| Unsetting some keyboard shortcuts causes the application to get stuck in the splash screen. | https://github.com/zen-browser/desktop/issues/4238 | 4 days, 17:04:39 | 4 days, 17:04:38 |
| Google's access speed is very slow, other browsers open at the same time, no problem! | https://github.com/zen-browser/desktop/issues/4237 | None | None |
| Bookmark cannot deleted/edit when the the name starts with "?..." | https://github.com/zen-browser/desktop/issues/4236 | None | None |
| I set the startup page to be a blank page; browser never responds. | https://github.com/zen-browser/desktop/issues/4235 | 19 days, 4:19:18 | None |
| bug: In `compact mode` the `user account` icon in top bar is broken after first click - 1.0.2-b.5 (Firefox 133.0.3) | https://github.com/zen-browser/desktop/issues/4232 | 1 day, 11:10:39 | 2 days, 6:06:01 |
| screencast is not working underwayland | https://github.com/zen-browser/desktop/issues/4231 | 16 days, 20:54:10 | None |
| gradient theme color disappears | https://github.com/zen-browser/desktop/issues/4230 | 4 days, 12:17:20 | None |
| Autofilling not working in some webpages | https://github.com/zen-browser/desktop/issues/4229 | None | 2 days, 14:08:32 |
| Not possible to use CTRL + F on a web panel | https://github.com/zen-browser/desktop/issues/4228 | None | None |
| Switch workspace animation without workspaces | https://github.com/zen-browser/desktop/issues/4227 | None | None |
| Command Option L always opens inspector despite keyboard shortcut setting | https://github.com/zen-browser/desktop/issues/4224 | 2 days, 13:08:20 | 4 days, 12:27:38 |
| Webgl applications not working. | https://github.com/zen-browser/desktop/issues/4223 | 1:45:58 | None |
| Pins syncing across windows | https://github.com/zen-browser/desktop/issues/4222 | 2 days, 23:53:53 | 15 days, 21:21:10 |
| URL/Title bar can be scrolled up on Windows | https://github.com/zen-browser/desktop/issues/4220 | 5 days, 1:26:35 | None |
| [Linux][tarball] Twilight - Can't update/wrong notification | https://github.com/zen-browser/desktop/issues/4219 | 0:15:28 | 0:15:28 |
| [Linux][Flatpak] Light/Dark Theme settings not respected | https://github.com/zen-browser/desktop/issues/4217 | 0:49:02 | 1:47:37 |
| cant close side menu and back and forward buttons swapped. | https://github.com/zen-browser/desktop/issues/4216 | 12:38:36 | None |
| MacOS CMD+Shift+L opens Dev Tools | https://github.com/zen-browser/desktop/issues/4215 | 1:48:05 | 1:48:05 |
| Dark mode problem | https://github.com/zen-browser/desktop/issues/4214 | 2:02:31 | 2:02:35 |
| Unwanted separation in zen | https://github.com/zen-browser/desktop/issues/4213 | 2:48:23 | 2:48:23 |
| ctrl+shift+c not working | https://github.com/zen-browser/desktop/issues/4212 | 1:02:17 | 2:59:00 |
| Black screen on launch | https://github.com/zen-browser/desktop/issues/4211 | 2:12:26 | 5:25:52 |
| When adding 2500 Tabs to the essentials section the browser becomes unresponsive | https://github.com/zen-browser/desktop/issues/4210 | 3:34:59 | None |
| [Bug] Minimize & Maximize buttons are not visible in Title bar | https://github.com/zen-browser/desktop/issues/4209 | 22:13:45 | None |
| Vertical tab bar isn't working as expected | https://github.com/zen-browser/desktop/issues/4208 | 7:06:10 | None |
| thinks that there is an update available / failed | https://github.com/zen-browser/desktop/issues/4207 | 0:12:57 | 0:12:57 |
| Compact Bar Doesn't Fully Close | https://github.com/zen-browser/desktop/issues/4205 | 3:18:39 | 3:18:39 |
| twilight: release note link does not go to the right page | https://github.com/zen-browser/desktop/issues/4203 | 13:07:36 | 13:07:36 |
| Update pop up failed on twilight | https://github.com/zen-browser/desktop/issues/4202 | 0:12:04 | 0:25:02 |
| Auto-filling passwords is broken for any website on MacOS | https://github.com/zen-browser/desktop/issues/4201 | 1 day, 10:59:13 | 0:13:22 |
| Test | https://github.com/zen-browser/desktop/issues/4199 | None | 0:00:13 |
| If site opens tab using JS, and you switch workspace, it opens in wrong workspace | https://github.com/zen-browser/desktop/issues/4197 | None | None |
| Resetting keyboard shortcuts not reflected in the UI | https://github.com/zen-browser/desktop/issues/4194 | None | None |
| Fetch requests not showing in the Network panel | https://github.com/zen-browser/desktop/issues/4192 | 4 days, 12:19:17 | None |
| Search bar overlapping essentials area bug | https://github.com/zen-browser/desktop/issues/4191 | 20:07:09 | 20:07:09 |
| url bar is sized wrong when not in compact mode | https://github.com/zen-browser/desktop/issues/4190 | 10:45:50 | 10:45:50 |
| Compact mode sidebar trigger area is too wide (macOS) | https://github.com/zen-browser/desktop/issues/4189 | 15:13:53 | 15:13:53 |
| Install Add-on From File... | https://github.com/zen-browser/desktop/issues/4186 | None | None |
| Arrangement of back & forward arrows changes after toggling the sidebar's width | https://github.com/zen-browser/desktop/issues/4185 | None | None |
| Workspaces bar problems on toolbar | https://github.com/zen-browser/desktop/issues/4183 | 10 days, 6:32:09 | None |
| "Breakpoint A breakpoint has been reached." | https://github.com/zen-browser/desktop/issues/4181 | 3 days, 2:30:20 | None |
| (Detailed Report) Using Ctrl+Tab to switch from splitted tabs to other tabs only works for tabs adjacent to the last split if "change tabs on hover" is turned on | https://github.com/zen-browser/desktop/issues/4180 | None | None |
| unloaded tabs with unsaved changes cannot be opened | https://github.com/zen-browser/desktop/issues/4179 | 15 days, 8:16:21 | None |
| broken page background on some sites | https://github.com/zen-browser/desktop/issues/4178 | 1 day, 0:42:21 | 7 days, 5:35:11 |
| Deleting certain keyboard shortcuts crashes the file on restart | https://github.com/zen-browser/desktop/issues/4177 | 3 days, 13:52:28 | 7 days, 12:06:28 |
| Disabeling forward/backward mouse buttons for switching workspaces und trigger back/forward of current website. | https://github.com/zen-browser/desktop/issues/4176 | 10 days, 2:11:24 | None |
| A Silly White Line Appears At The Top Of The Browser Window In Windows | https://github.com/zen-browser/desktop/issues/4175 | 1 day, 23:59:40 | 1 day, 23:59:40 |
| Zooming in PDF viewer is not working when using scrollwheel click to scroll throught PDF | https://github.com/zen-browser/desktop/issues/4173 | 3 days, 2:26:50 | None |
| compact mode tabs flickers when cursor is on window border | https://github.com/zen-browser/desktop/issues/4172 | None | None |
| Since the app is no longer in beta, the app shouldn't use strings with 'beta' in it and replace those with a normal string such as "Zen Browser". | https://github.com/zen-browser/desktop/issues/4171 | 0:12:14 | 0:19:44 |
| Linux version doesn't use the system proxy | https://github.com/zen-browser/desktop/issues/4170 | 10 days, 23:13:16 | None |
| Reordering Essentials is weird | https://github.com/zen-browser/desktop/issues/4169 | 3 days, 8:53:15 | 8 days, 3:19:28 |
| Duplicate preferences for "Use themed...." | https://github.com/zen-browser/desktop/issues/4166 | None | 0:02:33 |
| Entering compact mode on one window engages compact mode on all windows | https://github.com/zen-browser/desktop/issues/4165 | 17 days, 6:17:00 | 17 days, 6:17:00 |
| Bug: Unable to perform a search, tab stuck on loading | https://github.com/zen-browser/desktop/issues/4160 | None | 1:30:36 |
| Windows 11 - Compact Mode - Hide Tab Bar - Doesn't hide if using touch | https://github.com/zen-browser/desktop/issues/4157 | None | None |
| just goes blank when i decide to open new tab | https://github.com/zen-browser/desktop/issues/4156 | None | None |
| decoding problem "i think" | https://github.com/zen-browser/desktop/issues/4155 | None | None |
| Performance And Black Squares Issue | https://github.com/zen-browser/desktop/issues/4154 | None | None |
| the design of the "new tab" button does not allow it to be distinguished properly | https://github.com/zen-browser/desktop/issues/4153 | 0:20:19 | None |
| Pinned tabs do not Refresh Automatically after browser restart | https://github.com/zen-browser/desktop/issues/4152 | 3 days, 4:53:05 | None |
| Startup load broken | https://github.com/zen-browser/desktop/issues/4151 | None | 0:06:12 |
| An intuitive problem with the automatic theme (light/dark) | https://github.com/zen-browser/desktop/issues/4150 | None | None |
| Zen keeps resetting Home page every so often | https://github.com/zen-browser/desktop/issues/4148 | 12 days, 1:40:29 | None |
| Bookmarks toolbar blank on single toolbar layout | https://github.com/zen-browser/desktop/issues/4146 | 1:28:06 | 1 day, 20:15:55 |
| UI Bug: Wrong aspect ratio in tab switcher on ultra wide screens (32:9) | https://github.com/zen-browser/desktop/issues/4144 | None | None |
| pdf.js jumps across pages when activating annonation tools | https://github.com/zen-browser/desktop/issues/4143 | None | None |
| A black bar appeared at the top of the browser. | https://github.com/zen-browser/desktop/issues/4137 | 1:08:53 | 1:08:53 |
| --zen-primary-color affecting Zen about pages | https://github.com/zen-browser/desktop/issues/4135 | 0:34:32 | 0:34:32 |
| Essentials load in wrong container when opening new window with different workspace | https://github.com/zen-browser/desktop/issues/4134 | 1 day, 4:39:10 | 9 days, 21:24:46 |
| Container Indicator Issue | https://github.com/zen-browser/desktop/issues/4132 | 0:15:50 | 1:36:18 |
| Bookmarks Separator Issue | https://github.com/zen-browser/desktop/issues/4131 | 6:20:17 | None |
| Bookmarks Modal Issue | https://github.com/zen-browser/desktop/issues/4130 | 0:19:20 | 1:37:35 |
| Bookmarks Random Appearing Issue | https://github.com/zen-browser/desktop/issues/4129 | 6:25:12 | 28 days, 23:29:22 |
| Bookmarks FOUC Type Issue | https://github.com/zen-browser/desktop/issues/4128 | 6:28:48 | None |
| Shortcuts Issue When Second Window Is Used: | https://github.com/zen-browser/desktop/issues/4127 | 4 days, 0:15:45 | 4 days, 0:15:45 |
| Essentials & Pinned Disappear With Second Window | https://github.com/zen-browser/desktop/issues/4126 | 3:18:35 | None |
| Can't install themes with nightly | https://github.com/zen-browser/desktop/issues/4124 | 9 days, 23:09:45 | 9 days, 23:11:39 |
| pid changes on boot | https://github.com/zen-browser/desktop/issues/4122 | 0:50:20 | 0:50:20 |
| Download fails if you delete a random file while downloading | https://github.com/zen-browser/desktop/issues/4120 | 7:44:40 | 7:59:19 |
| Zen asks to be the default browser every time after recent update. | https://github.com/zen-browser/desktop/issues/4118 | 7:20:20 | 2 days, 14:22:58 |
| Popups partially hidden when on sidebar | https://github.com/zen-browser/desktop/issues/4117 | 12:56:59 | 12:56:59 |
| [Twilight] Not seeing search for emojis for workspaces like mentioned in release notes | https://github.com/zen-browser/desktop/issues/4114 | 8:04:36 | 8:04:35 |
| Themes installed from Firefox store don't do anything | https://github.com/zen-browser/desktop/issues/4113 | 5 days, 19:00:45 | None |
| Misplaced Footer on Websites | https://github.com/zen-browser/desktop/issues/4112 | 0:01:36 | 0:34:51 |
| A weird bar appears randomly stopping the user from switching tabs | https://github.com/zen-browser/desktop/issues/4111 | 0:07:57 | None |
| Sidebar tries to handle event when trying to dismiss toast message | https://github.com/zen-browser/desktop/issues/4110 | 4:08:06 | None |
| pages are not saving | https://github.com/zen-browser/desktop/issues/4109 | 14:28:07 | 14:28:07 |
| Issue with Toolbar Pinning/Unpinning Affecting Sidebar Width in Zen Browser | https://github.com/zen-browser/desktop/issues/4108 | 19 days, 11:38:38 | 19 days, 11:38:38 |
| Doesn't download video after "save video as" button | https://github.com/zen-browser/desktop/issues/4106 | 0:24:18 | 1 day, 8:44:52 |
| Random bar when moving mouse to the top | https://github.com/zen-browser/desktop/issues/4105 | 0:28:07 | 19 days, 14:14:16 |
| Overflow menu is permanently shown with only Customize Toolbar | https://github.com/zen-browser/desktop/issues/4104 | None | 0:02:52 |
| Opens a weird tab after closing all tabs | https://github.com/zen-browser/desktop/issues/4103 | 1 day, 0:01:43 | 1 day, 0:01:43 |
| Horizontal tab layout when supposed to be vertical | https://github.com/zen-browser/desktop/issues/4102 | None | 0:09:22 |
| Unable to click on back button due to overlapping of the tab sidebar under `Multiple Toolbars` layout | https://github.com/zen-browser/desktop/issues/4100 | 4:11:09 | None |
| Toolbar rendering issue while browser is in Foreground | https://github.com/zen-browser/desktop/issues/4099 | 1:56:07 | 1:56:07 |
| Video playback stops when toggling mono audio | https://github.com/zen-browser/desktop/issues/4098 | None | None |
_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-01-01..2025-01-31`

View File

@@ -0,0 +1 @@
7d861618502fc97ac8da8a1a78ec09b226c55dd5

View File

@@ -44,21 +44,21 @@ modules:
sources: sources:
- type: archive - type: archive
url: https://github.com/zen-browser/desktop/releases/download/${version}/zen.linux-x86_64.tar.bz2 url: https://github.com/zen-browser/desktop/releases/download/{version}/zen.linux-x86_64.tar.xz
sha256: {linux_sha256} sha256: {linux_sha256}
strip-components: 0 strip-components: 0
only-arches: only-arches:
- x86_64 - x86_64
- type: archive - type: archive
url: https://github.com/zen-browser/desktop/releases/download/${version}/zen.linux-aarch64.tar.bz2 url: https://github.com/zen-browser/desktop/releases/download/{version}/zen.linux-aarch64.tar.xz
sha256: {linux_aarch64_sha256} sha256: {linux_aarch64_sha256}
strip-components: 0 strip-components: 0
only-arches: only-arches:
- aarch64 - aarch64
- type: archive - type: archive
url: https://github.com/zen-browser/flatpak/releases/download/${version}/archive.tar url: https://github.com/zen-browser/flatpak/releases/download/{version}/archive.tar
sha256: {flatpak_sha256} sha256: {flatpak_sha256}
strip-components: 0 strip-components: 0
dest: metadata dest: metadata

2
l10n

Submodule l10n updated: 1abc46f17d...19e2af33c4

4544
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -19,10 +19,12 @@
"update-ff:raw": "surfer update", "update-ff:raw": "surfer update",
"update-newtab": "python3 scripts/update_newtab.py", "update-newtab": "python3 scripts/update_newtab.py",
"update-ff:rc": "python3 scripts/update_ff.py --rc", "update-ff:rc": "python3 scripts/update_ff.py --rc",
"update-ff:l10n": "python3 scripts/update_ff.py --just-l10n",
"pretty": "prettier . --write && autopep8 -r --in-place scripts/ src/", "pretty": "prettier . --write && autopep8 -r --in-place scripts/ src/",
"lint": "npx prettier . --check && autopep8 --diff scripts/ src/", "lint": "npx prettier . --check && autopep8 --diff scripts/ src/",
"prepare": "husky", "prepare": "husky",
"reset-ff": "surfer reset" "reset-ff": "surfer reset",
"surfer": "surfer"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@@ -39,7 +41,7 @@
}, },
"homepage": "https://github.com/zen-browser/core#readme", "homepage": "https://github.com/zen-browser/core#readme",
"dependencies": { "dependencies": {
"@zen-browser/surfer": "^1.9.8" "@zen-browser/surfer": "^1.9.16"
}, },
"devDependencies": { "devDependencies": {
"husky": "^9.1.7", "husky": "^9.1.7",

159
pnpm-lock.yaml generated
View File

@@ -9,8 +9,8 @@ importers:
.: .:
dependencies: dependencies:
'@zen-browser/surfer': '@zen-browser/surfer':
specifier: ^1.9.8 specifier: ^1.9.16
version: 1.9.8(glob@7.2.3) version: 1.9.16(glob@7.2.3)
devDependencies: devDependencies:
husky: husky:
specifier: ^9.1.7 specifier: ^9.1.7
@@ -122,8 +122,8 @@ packages:
'@types/node@17.0.45': '@types/node@17.0.45':
resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
'@zen-browser/surfer@1.9.8': '@zen-browser/surfer@1.9.16':
resolution: {integrity: sha512-dx4ouPDB7bg+eWR+NNuhdroR0JyZ+bWlxpAFskl9TiR3cvr1qtmZG9bYSF27nLNOUSWgKNamjevP785B08Cxjg==} resolution: {integrity: sha512-6/Vcp1Ox9mt53hoBUuxFvpnRMnlvjFb3GBOcRhpqoYW/yi9mlV3G48icE717wGCoR2TThfuS6SYVfiT/G1kkrw==}
hasBin: true hasBin: true
ansi-escapes@7.0.0: ansi-escapes@7.0.0:
@@ -152,8 +152,8 @@ packages:
asap@2.0.6: asap@2.0.6:
resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
async-compat@1.6.1: async-compat@1.6.8:
resolution: {integrity: sha512-8ggRAJiUews+8pjzG/fQ0O9QOPxHFa3DGvvMoH67rukjIiRL7AVGcaUSkA6ecZYlDvyom7zet7zy1ZFjRliuqw==} resolution: {integrity: sha512-MVKdync5q2FgE+x/AErx0mtJSZgQxWBGIx7vOcQbXmTh04OAF41N2zQX5XhAb0Mq/sMSFqzZSSFwzZ3rrROsSg==}
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
async-icns@1.0.2: async-icns@1.0.2:
@@ -207,8 +207,8 @@ packages:
buffer@5.7.1: buffer@5.7.1:
resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
call-once-fn@1.0.6: call-once-fn@1.0.15:
resolution: {integrity: sha512-zBcRjl/aFJEJqNSNw0gtzi4ZtDLBqPqIbU8qyXv5M2biF2nYHqcpIXOWo6ZhhDAQDkr9WgXQnLLyXQJvWm5AMg==} resolution: {integrity: sha512-LPMeZc0iO4Ep9XCtvRk9ecOdQpJd1DKRWly1+95F+OinTRJri39ZUVItxJu0ru/KzBbbv0cmKFb0gzG4PJCinA==}
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
chalk@4.1.2: chalk@4.1.2:
@@ -337,12 +337,12 @@ packages:
resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==}
engines: {node: '>=6'} engines: {node: '>=6'}
extract-base-iterator@1.2.10: extract-base-iterator@1.2.22:
resolution: {integrity: sha512-xdSKIpRrB+AqUJByl1pIOAyHs2vUfA4pL05SiB/9ZhC4AYS4G9a5TNmKEfY6KKeoPw5eFLoQ/9hVUUq5BIguFA==} resolution: {integrity: sha512-gGMzo6ijt6oh9VSLOG3H+rpyzkoCYkVBgF/qdxVM/Wc/eKJyX2gxrBN8gO7IbnAMxre36wvzwzzD6umw80i3CQ==}
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
fast-extract@1.3.10: fast-extract@1.3.31:
resolution: {integrity: sha512-XrV3AQLlaW4sDMSOwcBRDBMaEdJKgXT2EhtsqTufdZWWNN2b8zmRSGee/VV/vurO0agKoEVCyxja2DmkBzv6lg==} resolution: {integrity: sha512-P3poghIIxD7mEIHymqaeevrrdWD23JLyagIfox+/jw6r0L8CtjHJsg/S/YZsHH6V2/IfK5tHoBsiyAqBIocSHw==}
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
peerDependencies: peerDependencies:
lzma-native: '*' lzma-native: '*'
@@ -369,10 +369,6 @@ packages:
debug: debug:
optional: true optional: true
fs-access-compat@1.1.4:
resolution: {integrity: sha512-Qvy38V5JTnQT9pDulL2HBDiuZ1XbA3IHLJrHZpsP2gcBocflwnrbIcRd/dcH+ax55JEqqc8N1ARpaxITlp7hMg==}
engines: {node: '>=0.8'}
fs-constants@1.0.0: fs-constants@1.0.0:
resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
@@ -588,8 +584,8 @@ packages:
mkdirp-classic@0.5.3: mkdirp-classic@0.5.3:
resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==}
mock-require-lazy@1.0.6: mock-require-lazy@1.0.14:
resolution: {integrity: sha512-+0sOddS06fxFPJEDulH1Qssavf7D8UWa54Z6LQFuKwWwKwXLIU2JHnNt9Qi449LkqrKtNVa0rHhAzoJCZxvTgg==} resolution: {integrity: sha512-PNuw/5/+IJLgOSJoXv4DYBu840i2NmhRFgUoB/To/hvL7J8YxjjrvNaAaPotq7Ndff344pDFSqDqGpstdhB8Tg==}
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
modern-async@1.1.5: modern-async@1.1.5:
@@ -607,14 +603,14 @@ packages:
nanoassert@2.0.0: nanoassert@2.0.0:
resolution: {integrity: sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==} resolution: {integrity: sha512-7vO7n28+aYO4J+8w96AzhmU8G+Y/xpPDJz/se19ICsqj/momRbb9mh9ZUtkoJ5X3nTnPdhEJyc0qnM6yAsHBaA==}
napi-build-utils@1.0.2: napi-build-utils@2.0.0:
resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==}
next-tick@1.1.0: next-tick@1.1.0:
resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
node-abi@3.71.0: node-abi@3.73.0:
resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} resolution: {integrity: sha512-z8iYzQGBu35ZkTQ9mtR8RqugJZ9RCLn8fv3d7LsgDBzOijGQP3RdKTX4LA7LXw03ZhU5z0l4xfhIMgSES31+cg==}
engines: {node: '>=10'} engines: {node: '>=10'}
node-addon-api@5.1.0: node-addon-api@5.1.0:
@@ -636,6 +632,10 @@ packages:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
on-one@0.1.4:
resolution: {integrity: sha512-fWyHjSVZvs7Dkt7F/fZCm4Eoxv7+uQkaiUYh3jDVN15khYa5iTnFWW9VM8rQgStAca5cDxHzyAT7cF+gfyLgcg==}
engines: {node: '>=0.8'}
once@1.4.0: once@1.4.0:
resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
@@ -685,8 +685,8 @@ packages:
resolution: {integrity: sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==} resolution: {integrity: sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==}
engines: {node: '>=12.13.0'} engines: {node: '>=12.13.0'}
prebuild-install@7.1.2: prebuild-install@7.1.3:
resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==}
engines: {node: '>=10'} engines: {node: '>=10'}
hasBin: true hasBin: true
@@ -717,8 +717,8 @@ packages:
pumpify@2.0.1: pumpify@2.0.1:
resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==}
queue-cb@1.4.10: queue-cb@1.4.16:
resolution: {integrity: sha512-Hi3ZvXvKhrmxJhn6FhwsyW/Dd6OFZy2RWPXrAxQFw0jDnoiOzx2edkarCr5RpR6no7nZ+O4if59M/2HKzFy3hw==} resolution: {integrity: sha512-7g8cAIeoENe4kYgLAjTF7j7nX71pLlGdIAViR8U8pmHD3UA116+LjMRyucE6c6qUYBlv4ppaYXCTZjlo/IN27w==}
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
rc@1.2.8: rc@1.2.8:
@@ -828,8 +828,8 @@ packages:
sprintf-js@1.0.3: sprintf-js@1.0.3:
resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
stack-base-iterator@1.1.11: stack-base-iterator@1.1.20:
resolution: {integrity: sha512-c9f/rUFy/GJCEn0kx7gqIM/LByOrvOAq4I0cEVeahcmSGFfFa2xAto6/RcjApT0qbz/+IrA0OCM7CHnSiVDrOw==} resolution: {integrity: sha512-dlhhk0qesNjtXQCvJsayyvrUIh4gz6HkGC3g00RmXUgpbpYV7SJm97/Ac2HNUfO2mtq68DEGvt+msCf7Uk55Hg==}
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
stream-shift@1.0.3: stream-shift@1.0.3:
@@ -850,9 +850,6 @@ packages:
string_decoder@1.1.1: string_decoder@1.1.1:
resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
string_decoder@1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
strip-ansi@6.0.1: strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'} engines: {node: '>=8'}
@@ -880,8 +877,8 @@ packages:
tar-fs@2.1.2: tar-fs@2.1.2:
resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==}
tar-iterator@1.2.9: tar-iterator@1.2.25:
resolution: {integrity: sha512-sHgC+mJjn5n4v1YDQsFyGUg8Up6byOWV8QjQh/ZOYSOVkmg5q9ivpTgIKJrQOUihivsh+4pQlY5gMmXyH4AyOg==} resolution: {integrity: sha512-PyjH/Rils3eQ2ThsBG4O8zQLx/nPkoS/Iqvob4wEtpOJoO5DcqQKeI88aGWC3ktG6ms1Lgf1qrYtCo59W4WeRg==}
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
tar-stream-compat@2.1.5: tar-stream-compat@2.1.5:
@@ -892,8 +889,8 @@ packages:
resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
engines: {node: '>=6'} engines: {node: '>=6'}
temp-suffix@0.1.6: temp-suffix@0.1.14:
resolution: {integrity: sha512-oxSvTMUHbFUEbCIQGJa221DvtpA1oNSlthyGjPJ/yiAum8JgE/Nu4jHh7osM7IKHPomRDCmxmYdTuX442EuZKg==} resolution: {integrity: sha512-OqUZmSYtyGgteGxgjh8mkV69Zr1GXSYMj/+VUol698zxnopimbAlmIx5cQIIg1F9XDyA01htZfxLqC1FQZ7hbw==}
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
through2@2.0.5: through2@2.0.5:
@@ -957,8 +954,8 @@ packages:
engines: {node: '>= 14'} engines: {node: '>= 14'}
hasBin: true hasBin: true
zip-iterator@1.2.7: zip-iterator@1.2.23:
resolution: {integrity: sha512-hLYAZigng8q3AWJyNJgiUAokV/NXYBXgLeYt+PnkcXMES9syJwiLCBJ1qvoBEip97E5/H0T5OwpZcCrx91FE8A==} resolution: {integrity: sha512-gS+3YsU/vIHXxaViw67Dm1DMyN7U5iVU/NFB0rWYKyN7MYlOH61icBZm8RWesDtknsUaT9saEChwj+ueZKS8Dg==}
engines: {node: '>=0.8'} engines: {node: '>=0.8'}
zip@1.2.0: zip@1.2.0:
@@ -1036,7 +1033,7 @@ snapshots:
'@types/node@17.0.45': {} '@types/node@17.0.45': {}
'@zen-browser/surfer@1.9.8(glob@7.2.3)': '@zen-browser/surfer@1.9.16(glob@7.2.3)':
dependencies: dependencies:
'@resvg/resvg-js': 1.4.0 '@resvg/resvg-js': 1.4.0
async-icns: 1.0.2 async-icns: 1.0.2
@@ -1045,7 +1042,7 @@ snapshots:
cli-progress: 3.12.0 cli-progress: 3.12.0
commander: 6.2.1 commander: 6.2.1
execa: 5.1.1 execa: 5.1.1
fast-extract: 1.3.10(glob@7.2.3) fast-extract: 1.3.31(glob@7.2.3)
fs-extra: 10.1.0 fs-extra: 10.1.0
ini: 3.0.1 ini: 3.0.1
is-apple-silicon: https://codeload.github.com/trickypr/is-apple-silicon/tar.gz/5f75501a1d7566ba9f94174b6825d7bd9d302b6a is-apple-silicon: https://codeload.github.com/trickypr/is-apple-silicon/tar.gz/5f75501a1d7566ba9f94174b6825d7bd9d302b6a
@@ -1085,7 +1082,7 @@ snapshots:
asap@2.0.6: {} asap@2.0.6: {}
async-compat@1.6.1: async-compat@1.6.8:
dependencies: dependencies:
is-error: 2.2.2 is-error: 2.2.2
is-promise: 4.0.0 is-promise: 4.0.0
@@ -1153,7 +1150,7 @@ snapshots:
base64-js: 1.5.1 base64-js: 1.5.1
ieee754: 1.2.1 ieee754: 1.2.1
call-once-fn@1.0.6: {} call-once-fn@1.0.15: {}
chalk@4.1.2: chalk@4.1.2:
dependencies: dependencies:
@@ -1277,43 +1274,42 @@ snapshots:
expand-template@2.0.3: {} expand-template@2.0.3: {}
extract-base-iterator@1.2.10(glob@7.2.3): extract-base-iterator@1.2.22(glob@7.2.3):
dependencies: dependencies:
fs-access-compat: 1.1.4
graceful-fs: 4.2.11 graceful-fs: 4.2.11
is-absolute: 1.0.0 is-absolute: 1.0.0
lodash.compact: 3.0.1 lodash.compact: 3.0.1
mkdirp-classic: 0.5.3 mkdirp-classic: 0.5.3
object-assign: 4.1.1 object-assign: 4.1.1
queue-cb: 1.4.10 queue-cb: 1.4.16
rimraf2: 2.8.2(glob@7.2.3) rimraf2: 2.8.2(glob@7.2.3)
stack-base-iterator: 1.1.11 stack-base-iterator: 1.1.20
transitivePeerDependencies: transitivePeerDependencies:
- glob - glob
fast-extract@1.3.10(glob@7.2.3): fast-extract@1.3.31(glob@7.2.3):
dependencies: dependencies:
bl: 3.0.1 bl: 3.0.1
buffer-v6-polyfill: 1.0.5 buffer-v6-polyfill: 1.0.5
call-once-fn: 1.0.6 call-once-fn: 1.0.15
content-disposition: 0.5.4 content-disposition: 0.5.4
end-of-stream: 1.4.4
flush-write-stream: 2.0.0 flush-write-stream: 2.0.0
lodash.throttle: 4.1.1 lodash.throttle: 4.1.1
mkdirp-classic: 0.5.3 mkdirp-classic: 0.5.3
mock-require-lazy: 1.0.6 mock-require-lazy: 1.0.14
next-tick: 1.1.0 next-tick: 1.1.0
on-one: 0.1.4
progress-stream: 2.0.0 progress-stream: 2.0.0
pumpify: 2.0.1 pumpify: 2.0.1
queue-cb: 1.4.10 queue-cb: 1.4.16
readable-stream: 2.3.8 readable-stream: 2.3.8
require_optional: 1.0.1 require_optional: 1.0.1
rimraf2: 2.8.2(glob@7.2.3) rimraf2: 2.8.2(glob@7.2.3)
signal-exit: 3.0.7 signal-exit: 3.0.7
tar-iterator: 1.2.9(glob@7.2.3) tar-iterator: 1.2.25(glob@7.2.3)
temp-suffix: 0.1.6 temp-suffix: 0.1.14
unbzip2-stream: 1.4.3 unbzip2-stream: 1.4.3
zip-iterator: 1.2.7(glob@7.2.3) zip-iterator: 1.2.23(glob@7.2.3)
transitivePeerDependencies: transitivePeerDependencies:
- glob - glob
@@ -1330,8 +1326,6 @@ snapshots:
follow-redirects@1.15.9: {} follow-redirects@1.15.9: {}
fs-access-compat@1.1.4: {}
fs-constants@1.0.0: {} fs-constants@1.0.0: {}
fs-extra@10.1.0: fs-extra@10.1.0:
@@ -1515,7 +1509,7 @@ snapshots:
mkdirp-classic@0.5.3: {} mkdirp-classic@0.5.3: {}
mock-require-lazy@1.0.6: mock-require-lazy@1.0.14:
dependencies: dependencies:
get-caller-file: 2.0.5 get-caller-file: 2.0.5
normalize-path: 3.0.0 normalize-path: 3.0.0
@@ -1535,11 +1529,11 @@ snapshots:
nanoassert@2.0.0: {} nanoassert@2.0.0: {}
napi-build-utils@1.0.2: {} napi-build-utils@2.0.0: {}
next-tick@1.1.0: {} next-tick@1.1.0: {}
node-abi@3.71.0: node-abi@3.73.0:
dependencies: dependencies:
semver: 7.6.3 semver: 7.6.3
@@ -1557,6 +1551,8 @@ snapshots:
object-assign@4.1.1: {} object-assign@4.1.1: {}
on-one@0.1.4: {}
once@1.4.0: once@1.4.0:
dependencies: dependencies:
wrappy: 1.0.2 wrappy: 1.0.2
@@ -1594,15 +1590,15 @@ snapshots:
pngjs@6.0.0: {} pngjs@6.0.0: {}
prebuild-install@7.1.2: prebuild-install@7.1.3:
dependencies: dependencies:
detect-libc: 2.0.3 detect-libc: 2.0.3
expand-template: 2.0.3 expand-template: 2.0.3
github-from-package: 0.0.0 github-from-package: 0.0.0
minimist: 1.2.8 minimist: 1.2.8
mkdirp-classic: 0.5.3 mkdirp-classic: 0.5.3
napi-build-utils: 1.0.2 napi-build-utils: 2.0.0
node-abi: 3.71.0 node-abi: 3.73.0
pump: 3.0.2 pump: 3.0.2
rc: 1.2.8 rc: 1.2.8
simple-get: 4.0.1 simple-get: 4.0.1
@@ -1640,7 +1636,7 @@ snapshots:
inherits: 2.0.4 inherits: 2.0.4
pump: 3.0.2 pump: 3.0.2
queue-cb@1.4.10: {} queue-cb@1.4.16: {}
rc@1.2.8: rc@1.2.8:
dependencies: dependencies:
@@ -1662,7 +1658,7 @@ snapshots:
readable-stream@3.6.2: readable-stream@3.6.2:
dependencies: dependencies:
inherits: 2.0.4 inherits: 2.0.4
string_decoder: 1.3.0 string_decoder: 1.1.1
util-deprecate: 1.0.2 util-deprecate: 1.0.2
require_optional@1.0.1: require_optional@1.0.1:
@@ -1702,7 +1698,7 @@ snapshots:
color: 4.2.3 color: 4.2.3
detect-libc: 2.0.3 detect-libc: 2.0.3
node-addon-api: 5.1.0 node-addon-api: 5.1.0
prebuild-install: 7.1.2 prebuild-install: 7.1.3
semver: 7.6.3 semver: 7.6.3
simple-get: 4.0.1 simple-get: 4.0.1
tar-fs: 2.1.2 tar-fs: 2.1.2
@@ -1752,11 +1748,11 @@ snapshots:
sprintf-js@1.0.3: {} sprintf-js@1.0.3: {}
stack-base-iterator@1.1.11: stack-base-iterator@1.1.20:
dependencies: dependencies:
asap: 2.0.6 asap: 2.0.6
async-compat: 1.6.1 async-compat: 1.6.8
call-once-fn: 1.0.6 call-once-fn: 1.0.15
fifo: 2.4.1 fifo: 2.4.1
stream-shift@1.0.3: {} stream-shift@1.0.3: {}
@@ -1779,10 +1775,6 @@ snapshots:
dependencies: dependencies:
safe-buffer: 5.1.2 safe-buffer: 5.1.2
string_decoder@1.3.0:
dependencies:
safe-buffer: 5.2.1
strip-ansi@6.0.1: strip-ansi@6.0.1:
dependencies: dependencies:
ansi-regex: 5.0.1 ansi-regex: 5.0.1
@@ -1808,16 +1800,14 @@ snapshots:
pump: 3.0.2 pump: 3.0.2
tar-stream: 2.2.0 tar-stream: 2.2.0
tar-iterator@1.2.9(glob@7.2.3): tar-iterator@1.2.25(glob@7.2.3):
dependencies: dependencies:
call-once-fn: 1.0.6 call-once-fn: 1.0.15
end-of-stream: 1.4.4 extract-base-iterator: 1.2.22(glob@7.2.3)
extract-base-iterator: 1.2.10(glob@7.2.3)
fs-access-compat: 1.1.4
lifecycle: 1.0.4 lifecycle: 1.0.4
lodash.compact: 3.0.1 lodash.compact: 3.0.1
mkdirp-classic: 0.5.3 mkdirp-classic: 0.5.3
queue-cb: 1.4.10 on-one: 0.1.4
rimraf2: 2.8.2(glob@7.2.3) rimraf2: 2.8.2(glob@7.2.3)
tar-stream-compat: 2.1.5 tar-stream-compat: 2.1.5
transitivePeerDependencies: transitivePeerDependencies:
@@ -1840,7 +1830,7 @@ snapshots:
inherits: 2.0.4 inherits: 2.0.4
readable-stream: 3.6.2 readable-stream: 3.6.2
temp-suffix@0.1.6: temp-suffix@0.1.14:
dependencies: dependencies:
imurmurhash: 0.1.4 imurmurhash: 0.1.4
@@ -1902,22 +1892,21 @@ snapshots:
yaml@2.6.1: {} yaml@2.6.1: {}
zip-iterator@1.2.7(glob@7.2.3): zip-iterator@1.2.23(glob@7.2.3):
dependencies: dependencies:
buffer-v6-polyfill: 1.0.5 buffer-v6-polyfill: 1.0.5
call-once-fn: 1.0.6 call-once-fn: 1.0.15
end-of-stream: 1.4.4 extract-base-iterator: 1.2.22(glob@7.2.3)
extract-base-iterator: 1.2.10(glob@7.2.3)
fs-access-compat: 1.1.4
lifecycle: 1.0.4 lifecycle: 1.0.4
lodash.compact: 3.0.1 lodash.compact: 3.0.1
mkdirp-classic: 0.5.3 mkdirp-classic: 0.5.3
on-one: 0.1.4
os-shim: 0.1.3 os-shim: 0.1.3
queue-cb: 1.4.10 queue-cb: 1.4.16
readable-stream: 2.3.8 readable-stream: 2.3.8
rimraf2: 2.8.2(glob@7.2.3) rimraf2: 2.8.2(glob@7.2.3)
short-hash: 1.0.0 short-hash: 1.0.0
temp-suffix: 0.1.6 temp-suffix: 0.1.14
zip: 1.2.0 zip: 1.2.0
transitivePeerDependencies: transitivePeerDependencies:
- glob - glob

View File

@@ -7,8 +7,14 @@ git config --global fetch.prune true
cd $CURRENT_DIR cd $CURRENT_DIR
LAST_FIREFOX_L10N_COMMIT=$(cat ./firefox-cache/l10n-last-commit-hash)
cd ./l10n cd ./l10n
rm -rf firefox-l10n
# clone only from LAST_FIREFOX_L10N_COMMIT
git clone https://github.com/mozilla-l10n/firefox-l10n git clone https://github.com/mozilla-l10n/firefox-l10n
cd firefox-l10n
git checkout $LAST_FIREFOX_L10N_COMMIT
cd $CURRENT_DIR cd $CURRENT_DIR
update_language() { update_language() {

View File

@@ -18,8 +18,8 @@ def update_rc(last_version: str):
with open("surfer.json", "w") as f: with open("surfer.json", "w") as f:
data["version"]["candidate"] = rc_version data["version"]["candidate"] = rc_version
json.dump(data, f, indent=2) json.dump(data, f, indent=2)
print("Download the new engine by running 'pnpm download'.") print("Download the new engine by running 'npm run download'.")
os.system("pnpm download") os.system("npm run download")
else: else:
print("No new Firefox RC version available.") print("No new Firefox RC version available.")
@@ -28,7 +28,7 @@ def update_ff(is_rc: bool = False, last_version: str = ""):
"""Runs the npm command to update the 'ff' component.""" """Runs the npm command to update the 'ff' component."""
if is_rc: if is_rc:
return update_rc(last_version) return update_rc(last_version)
result = os.system("pnpm update-ff:raw") result = os.system("npm run update-ff:raw")
if result != 0: if result != 0:
raise RuntimeError("Failed to update 'ff' component.") raise RuntimeError("Failed to update 'ff' component.")
@@ -57,21 +57,38 @@ def update_readme(last_version, new_version, is_rc=False):
raise RuntimeError(f"README.md file not found: {e}") raise RuntimeError(f"README.md file not found: {e}")
def update_l10n_last_commit_hash():
L10N_REPO = "https://github.com/mozilla-l10n/firefox-l10n"
try:
os.system(f"git clone {L10N_REPO} l10n-temp")
if not os.path.exists("firefox-cache"):
os.mkdir("firefox-cache")
os.system("cat l10n-temp/.git/refs/heads/main > firefox-cache/l10n-last-commit-hash")
except KeyboardInterrupt:
print("Exiting...")
shutil.rmtree("l10n-temp")
def main(): def main():
"""Main function to update versions and README.""" """Main function to update versions and README."""
arg_parser = argparse.ArgumentParser() arg_parser = argparse.ArgumentParser()
arg_parser.add_argument( arg_parser.add_argument(
"--rc", help="Indicates that this is a release candidate.", default=False, action="store_true") "--rc", help="Indicates that this is a release candidate.", default=False, action="store_true")
arg_parser.add_argument(
"--just-l10n", help="Only update the l10n last commit hash.", default=False, action="store_true")
args = arg_parser.parse_args() args = arg_parser.parse_args()
try: try:
last_version = get_version_from_file("surfer.json", args.rc) if not args.just_l10n:
update_ff(args.rc, last_version) last_version = get_version_from_file("surfer.json", args.rc)
new_version = get_version_from_file("surfer.json", args.rc) update_ff(args.rc, last_version)
update_readme(last_version, new_version, args.rc) new_version = get_version_from_file("surfer.json", args.rc)
print( update_readme(last_version, new_version, args.rc)
f"Updated version from {last_version} to {new_version} in README.md.") print(
f"Updated version from {last_version} to {new_version} in README.md.")
print("Updating l10n last commit hash.")
update_l10n_last_commit_hash()
except Exception as e: except Exception as e:
print(f"An error occurred: {e}") print(f"An error occurred: {e}")

View File

@@ -8,9 +8,7 @@
#endif #endif
#endif #endif
pref("browser.tabs.cardPreview.enabled", true); pref("browser.tabs.hoverPreview.enabled", false);
pref("browser.tabs.hoverPreview.enabled", true);
pref("browser.tabs.cardPreview.delayMs", 100);
#ifdef MOZ_UPDATE_CHANNEL #ifdef MOZ_UPDATE_CHANNEL
pref("devtools.debugger.prompt-connection", true); pref("devtools.debugger.prompt-connection", true);
@@ -86,11 +84,11 @@ pref('zen.theme.accent-color', "#ffb787");
pref('zen.theme.content-element-separation', 6); // In pixels pref('zen.theme.content-element-separation', 6); // In pixels
pref('zen.theme.pill-button', false); pref('zen.theme.pill-button', false);
pref('zen.theme.gradient', true); pref('zen.theme.gradient', true);
pref('zen.theme.essentials-favicon-bg', false); pref('zen.theme.essentials-favicon-bg', true);
pref('zen.tabs.show-newtab-vertical', true); pref('zen.tabs.show-newtab-vertical', true);
pref('zen.view.show-newtab-button-border-top', true); pref('zen.view.show-newtab-button-border-top', false);
pref('zen.view.show-newtab-button-top', false); pref('zen.view.show-newtab-button-top', true);
#ifdef MOZILLA_OFFICIAL #ifdef MOZILLA_OFFICIAL
pref('zen.rice.api.url', 'https://share.zen-browser.app', locked); pref('zen.rice.api.url', 'https://share.zen-browser.app', locked);
@@ -102,14 +100,12 @@ pref('zen.injections.match-urls', 'http://localhost/*', locked);
pref('zen.rice.share.notice.accepted', false); pref('zen.rice.share.notice.accepted', false);
#ifdef XP_MACOSX #ifdef XP_MACOSX
pref('zen.theme.border-radius', 11); // In pixels pref('zen.theme.border-radius', 10); // In pixels
#else #else
pref('zen.theme.border-radius', 8); // In pixels pref('zen.theme.border-radius', 8); // In pixels
#endif #endif
pref('zen.theme.color-prefs.use-workspace-colors', true); pref('zen.theme.color-prefs.use-workspace-colors', true);
pref('zen.theme.color-prefs.amoled', false);
pref('zen.theme.color-prefs.colorful', false);
pref('zen.view.compact.hide-tabbar', true); pref('zen.view.compact.hide-tabbar', true);
pref('zen.view.compact.hide-toolbar', false); pref('zen.view.compact.hide-toolbar', false);
@@ -120,7 +116,9 @@ pref('zen.view.compact.color-toolbar', true);
pref('zen.view.compact.color-sidebar', true); pref('zen.view.compact.color-sidebar', true);
pref('zen.view.compact.animate-sidebar', true); pref('zen.view.compact.animate-sidebar', true);
pref('zen.urlbar.replace-newtab', true);
pref('zen.urlbar.behavior', 'floating-on-type'); // default, floating-on-type, float pref('zen.urlbar.behavior', 'floating-on-type'); // default, floating-on-type, float
pref('zen.urlbar.wait-to-clear', 45000); // in ms (default 45s)
#ifdef XP_MACOSX #ifdef XP_MACOSX
// Disable for macos in the meantime until @HarryHeres finds a solution for hight DPI screens // Disable for macos in the meantime until @HarryHeres finds a solution for hight DPI screens
@@ -129,14 +127,22 @@ pref('zen.view.experimental-rounded-view', false);
pref('zen.view.experimental-rounded-view', true); pref('zen.view.experimental-rounded-view', true);
#endif #endif
#ifdef XP_WIN
pref('zen.widget.windows.acrylic', true);
#endif
// Glance
pref('zen.glance.enabled', true); pref('zen.glance.enabled', true);
pref('zen.glance.hold-duration', 300); // in ms pref('zen.glance.hold-duration', 300); // in ms
pref('zen.glance.open-essential-external-links', true);
pref('zen.glance.activation-method', 'alt'); // ctrl, alt, shift, none, hold pref('zen.glance.activation-method', 'alt'); // ctrl, alt, shift, none, hold
pref('zen.view.sidebar-height-throttle', 200); // in ms pref('zen.view.sidebar-height-throttle', 200); // in ms
pref('zen.view.sidebar-expanded.max-width', 500); pref('zen.view.sidebar-expanded.max-width', 500);
#ifdef XP_MACOSX
pref('zen.view.mac.show-three-dot-menu', false);
#endif
pref('zen.view.show-bottom-border', false); pref('zen.view.show-bottom-border', false);
pref('zen.view.use-single-toolbar', true); pref('zen.view.use-single-toolbar', true);
pref('zen.view.sidebar-expanded', true); pref('zen.view.sidebar-expanded', true);
@@ -153,7 +159,6 @@ pref('zen.view.hide-window-controls', true);
pref('zen.view.experimental-no-window-controls', false); pref('zen.view.experimental-no-window-controls', false);
pref('zen.tabs.dim-pending', true); pref('zen.tabs.dim-pending', true);
pref('zen.tabs.newtab-on-middle-click', true);
pref('zen.keyboard.shortcuts.enabled', true); pref('zen.keyboard.shortcuts.enabled', true);
pref('zen.keyboard.shortcuts.version', 0); // Empty string means default shortcuts pref('zen.keyboard.shortcuts.version', 0); // Empty string means default shortcuts
@@ -162,15 +167,15 @@ pref('zen.keyboard.shortcuts.disable-mainkeyset-clear', false); // for debugging
pref('zen.themes.updated-value-observer', false); pref('zen.themes.updated-value-observer', false);
pref('zen.tab-unloader.enabled', true); pref('zen.tab-unloader.enabled', true);
pref('zen.tab-unloader.timeout-minutes', 20); pref('zen.tab-unloader.timeout-minutes', 40);
pref('zen.tab-unloader.excluded-urls', "example.com,example.org"); pref('zen.tab-unloader.excluded-urls', "example.com,example.org");
pref('zen.pinned-tab-manager.debug', false); pref('zen.pinned-tab-manager.debug', false);
pref('zen.pinned-tab-manager.restore-pinned-tabs-to-pinned-url', false); pref('zen.pinned-tab-manager.restore-pinned-tabs-to-pinned-url', false);
pref('zen.pinned-tab-manager.close-shortcut-behavior', 'switch'); pref('zen.pinned-tab-manager.close-shortcut-behavior', 'unload-switch');
// Pref to enable the new profiles (TODO: Check this out!) // TODO: Check this out!
//pref("browser.profiles.enabled", true); pref("browser.profiles.enabled", false);
// Zen webpanels (calling it sidebar due to legacy reasons) // Zen webpanels (calling it sidebar due to legacy reasons)
pref('zen.sidebar.data', "{\"data\":\n {\"p1\":{\n \"url\":\"https://www.wikipedia.org/\"\n },\n\"p2\":{\n \"url\":\"https://m.twitter.com/\",\n\"ua\": true\n },\n\"p3\": {\n \"url\": \"https://www.youtube.com/\",\n\"ua\": true\n},\n\"p4\": {\n \"url\": \"https://translate.google.com/\",\n\"ua\": true\n},\n\"p5\": {\n \"url\": \"https://todoist.com/\",\n\"ua\": true\n}},\n\"index\":[\"p1\",\"p2\",\"p3\",\"p4\",\"p5\"]}"); pref('zen.sidebar.data', "{\"data\":\n {\"p1\":{\n \"url\":\"https://www.wikipedia.org/\"\n },\n\"p2\":{\n \"url\":\"https://m.twitter.com/\",\n\"ua\": true\n },\n\"p3\": {\n \"url\": \"https://www.youtube.com/\",\n\"ua\": true\n},\n\"p4\": {\n \"url\": \"https://translate.google.com/\",\n\"ua\": true\n},\n\"p5\": {\n \"url\": \"https://todoist.com/\",\n\"ua\": true\n}},\n\"index\":[\"p1\",\"p2\",\"p3\",\"p4\",\"p5\"]}");
@@ -179,13 +184,12 @@ pref('zen.sidebar.close-on-blur', true);
pref('zen.sidebar.max-webpanels', 8); pref('zen.sidebar.max-webpanels', 8);
// Zen Split View // Zen Split View
pref('zen.splitView.working', false);
pref('zen.splitView.min-resize-width', 7); pref('zen.splitView.min-resize-width', 7);
pref('zen.splitView.change-on-hover', false); pref('zen.splitView.change-on-hover', false);
pref('zen.splitView.rearrange-hover-size', 24); pref('zen.splitView.rearrange-hover-size', 24);
// Startup flags // Startup flags
pref('zen.startup.smooth-scroll-in-tabs', false); pref('zen.startup.smooth-scroll-in-tabs', true);
// Zen Workspaces // Zen Workspaces
pref('zen.workspaces.disabled_for_testing', false); pref('zen.workspaces.disabled_for_testing', false);
@@ -194,16 +198,18 @@ pref('zen.workspaces.hide-default-container-indicator', true);
pref('zen.workspaces.individual-pinned-tabs', true); pref('zen.workspaces.individual-pinned-tabs', true);
pref('zen.workspaces.show-icon-strip', true); pref('zen.workspaces.show-icon-strip', true);
pref('zen.workspaces.force-container-workspace', false); pref('zen.workspaces.force-container-workspace', false);
pref('zen.workspaces.open-new-tab-if-last-unpinned-tab-is-closed', true); pref('zen.workspaces.open-new-tab-if-last-unpinned-tab-is-closed', false);
pref('zen.workspaces.show-workspace-indicator', true); pref('zen.workspaces.show-workspace-indicator', true);
pref('zen.workspaces.swipe-actions', true); pref('zen.workspaces.swipe-actions', true);
pref('zen.workspaces.wrap-around-navigation', true); pref('zen.workspaces.wrap-around-navigation', true);
pref('zen.workspaces.natural-scroll', false); pref('zen.workspaces.natural-scroll', false);
pref('zen.workspaces.scroll-modifier-key','ctrl'); // can be ctrl, alt, shift, or a meta key pref('zen.workspaces.scroll-modifier-key','ctrl'); // can be ctrl, alt, shift, or a meta key
pref('services.sync.engine.workspaces', false); pref('services.sync.engine.workspaces', false);
pref('zen.essentials.enabled', true);
pref('zen.workspaces.container-specific-essentials-enabled', false); pref('zen.workspaces.container-specific-essentials-enabled', false);
// Essentials
pref('zen.essentials.enabled', true);
// Zen Watermark // Zen Watermark
#ifdef MOZILLA_OFFICIAL #ifdef MOZILLA_OFFICIAL
pref('zen.watermark.enabled', true, sticky); pref('zen.watermark.enabled', true, sticky);
@@ -375,6 +381,7 @@ pref("browser.urlbar.quicksuggest.enabled", false);
pref("browser.urlbar.suggest.quicksuggest.sponsored", false); pref("browser.urlbar.suggest.quicksuggest.sponsored", false);
pref("browser.urlbar.suggest.quicksuggest.nonsponsored", false); pref("browser.urlbar.suggest.quicksuggest.nonsponsored", false);
pref("browser.urlbar.groupLabels.enabled", false); pref("browser.urlbar.groupLabels.enabled", false);
pref("browser.urlbar.keepPanelOpenDuringImeComposition", true); // IMPORTANT: Fixes closing the urlbar when on some languages
pref("browser.formfill.enable", false); pref("browser.formfill.enable", false);
pref("security.insecure_connection_text.enabled", true); pref("security.insecure_connection_text.enabled", true);
pref("security.insecure_connection_text.pbmode.enabled", true); pref("security.insecure_connection_text.pbmode.enabled", true);
@@ -422,7 +429,7 @@ pref("browser.aboutwelcome.enabled", false);
// ---- Experimental settings to try make zen faster // ---- Experimental settings to try make zen faster
pref("gfx.canvas.accelerated.cache-items", 32768); pref("gfx.canvas.accelerated.cache-items", 32768);
pref("gfx.canvas.accelerated.cache-size", 4096); pref("gfx.canvas.accelerated.cache-size", 256);
pref("gfx.content.skia-font-cache-size", 80); pref("gfx.content.skia-font-cache-size", 80);
pref("media.memory_cache_max_size", 1048576); pref("media.memory_cache_max_size", 1048576);

View File

@@ -4,14 +4,14 @@ export var ZenCustomizableUI = new (class {
constructor() {} constructor() {}
TYPE_TOOLBAR = 'toolbar'; TYPE_TOOLBAR = 'toolbar';
defaultSidebarIcons = ['zen-profile-button', 'zen-workspaces-button', 'downloads-button']; defaultSidebarIcons = ['preferences-button', 'zen-workspaces-button', 'downloads-button'];
startup(CustomizableUIInternal) { startup(CustomizableUIInternal) {
CustomizableUIInternal.registerArea( CustomizableUIInternal.registerArea(
'zen-sidebar-top-buttons', 'zen-sidebar-top-buttons',
{ {
type: this.TYPE_TOOLBAR, type: this.TYPE_TOOLBAR,
defaultPlacements: ['home-button'], defaultPlacements: [],
defaultCollapsed: null, defaultCollapsed: null,
overflowable: true, overflowable: true,
}, },
@@ -64,6 +64,7 @@ export var ZenCustomizableUI = new (class {
addon-webext-overflowtarget="overflowed-extensions-list" addon-webext-overflowtarget="overflowed-extensions-list"
mode="icons"> mode="icons">
<hbox id="zen-sidebar-top-buttons-customization-target" class="customization-target" flex="1"> <hbox id="zen-sidebar-top-buttons-customization-target" class="customization-target" flex="1">
<html:div id="zen-sidebar-top-buttons-separator" skipintoolbarset="true" overflows="false"></html:div>
</hbox> </hbox>
</toolbar> </toolbar>
`); `);
@@ -83,13 +84,9 @@ export var ZenCustomizableUI = new (class {
const newTab = window.document.getElementById('vertical-tabs-newtab-button'); const newTab = window.document.getElementById('vertical-tabs-newtab-button');
newTab.classList.add('zen-sidebar-action-button'); newTab.classList.add('zen-sidebar-action-button');
const wrapper = window.document.createXULElement('toolbarbutton');
wrapper.id = 'zen-workspaces-button';
window.document.getElementById('zen-sidebar-icons-wrapper').prepend(wrapper);
for (let id of this.defaultSidebarIcons) { for (let id of this.defaultSidebarIcons) {
const elem = window.document.getElementById(id); const elem = window.document.getElementById(id);
if (!elem) continue; if (!elem || elem.id === 'zen-workspaces-button') continue;
elem.setAttribute('removable', 'true'); elem.setAttribute('removable', 'true');
} }
@@ -128,5 +125,12 @@ export var ZenCustomizableUI = new (class {
registerToolbarNodes(window) { registerToolbarNodes(window) {
window.CustomizableUI.registerToolbarNode(window.document.getElementById('zen-sidebar-top-buttons')); window.CustomizableUI.registerToolbarNode(window.document.getElementById('zen-sidebar-top-buttons'));
window.CustomizableUI.registerToolbarNode(window.document.getElementById('zen-sidebar-icons-wrapper')); window.CustomizableUI.registerToolbarNode(window.document.getElementById('zen-sidebar-icons-wrapper'));
window.addEventListener(
'DOMContentLoaded',
() => {
this._dispatchResizeEvent(window);
},
{ once: true }
);
} }
})(); })();

View File

@@ -3,11 +3,9 @@
var ZenStartup = { var ZenStartup = {
init() { init() {
this.openWatermark(); this.openWatermark();
window.SessionStore.promiseInitialized.then(() => { this._changeSidebarLocation();
this._changeSidebarLocation(); this._zenInitBrowserLayout();
this._zenInitBrowserLayout(); this._initSearchBar();
this._initSearchBar();
});
}, },
_zenInitBrowserLayout() { _zenInitBrowserLayout() {
@@ -31,11 +29,7 @@
document.getElementById('zen-appcontent-navbar-container').appendChild(deckTemplate); document.getElementById('zen-appcontent-navbar-container').appendChild(deckTemplate);
} }
// Disable smooth scroll this._initSidebarScrolling();
gBrowser.tabContainer.arrowScrollbox.smoothScroll = Services.prefs.getBoolPref(
'zen.startup.smooth-scroll-in-tabs',
false
);
gZenCompactModeManager.init(); gZenCompactModeManager.init();
ZenWorkspaces.init(); ZenWorkspaces.init();
@@ -86,6 +80,35 @@
} }
}, },
_initSidebarScrolling() {
// Disable smooth scroll
const canSmoothScroll = Services.prefs.getBoolPref('zen.startup.smooth-scroll-in-tabs', false);
const tabsWrapper = document.getElementById('zen-tabs-wrapper');
gBrowser.tabContainer.addEventListener('wheel', (event) => {
if (canSmoothScroll) return;
event.preventDefault(); // Prevent the smooth scroll behavior
gBrowser.tabContainer.scrollTop += event.deltaY * 20; // Apply immediate scroll
});
// Detect overflow and underflow
const observer = new ResizeObserver((_) => {
const tabContainer = gBrowser.tabContainer;
// const isVertical = tabContainer.getAttribute('orient') === 'vertical';
// let contentSize = tabsWrapper.getBoundingClientRect()[isVertical ? 'height' : 'width'];
// NOTE: This should be contentSize > scrollClientSize, but due
// to how Gecko internally rounds in those cases, we allow for some
// minor differences (the internal Gecko layout size is 1/60th of a
// pixel, so 0.02 should cover it).
//let overflowing = contentSize - tabContainer.arrowScrollbox.scrollClientSize > 0.02;
let overflowing = true; // cheatign the system, because we want to always show make the element overflowing
window.requestAnimationFrame(() => {
tabContainer.arrowScrollbox.toggleAttribute('overflowing', overflowing);
tabContainer.arrowScrollbox.dispatchEvent(new CustomEvent(overflowing ? 'overflow' : 'underflow'));
});
});
observer.observe(tabsWrapper);
},
_initSearchBar() { _initSearchBar() {
// Only focus the url bar // Only focus the url bar
gURLBar.focus(); gURLBar.focus();

View File

@@ -1,20 +1,20 @@
var gZenUIManager = { var gZenUIManager = {
_popupTrackingElements: [], _popupTrackingElements: [],
_hoverPausedForExpand: false, _hoverPausedForExpand: false,
_hasLoadedDOM: false,
init() { init() {
document.addEventListener('popupshowing', this.onPopupShowing.bind(this)); document.addEventListener('popupshowing', this.onPopupShowing.bind(this));
document.addEventListener('popuphidden', this.onPopupHidden.bind(this)); document.addEventListener('popuphidden', this.onPopupHidden.bind(this));
XPCOMUtils.defineLazyPreferenceGetter(this, 'sidebarHeightThrottle', 'zen.view.sidebar-height-throttle', 500); XPCOMUtils.defineLazyPreferenceGetter(this, 'sidebarHeightThrottle', 'zen.view.sidebar-height-throttle', 500);
XPCOMUtils.defineLazyPreferenceGetter(this, 'contentElementSeparation', 'zen.theme.content-element-separation', 0); XPCOMUtils.defineLazyPreferenceGetter(this, 'contentElementSeparation', 'zen.theme.content-element-separation', 0);
XPCOMUtils.defineLazyPreferenceGetter(this, 'urlbarWaitToClear', 'zen.urlbar.wait-to-clear', 0);
ChromeUtils.defineLazyGetter(this, 'motion', () => { ChromeUtils.defineLazyGetter(this, 'motion', () => {
return ChromeUtils.importESModule('chrome://browser/content/zen-vendor/motion.min.mjs', { global: 'current' }); return ChromeUtils.importESModule('chrome://browser/content/zen-vendor/motion.min.mjs', { global: 'current' });
}); });
new ResizeObserver(gZenCommonActions.throttle(this.updateTabsToolbar.bind(this), this.sidebarHeightThrottle)).observe( new ResizeObserver(this.updateTabsToolbar.bind(this)).observe(document.getElementById('TabsToolbar'));
document.getElementById('tabbrowser-tabs')
);
new ResizeObserver( new ResizeObserver(
gZenCommonActions.throttle( gZenCommonActions.throttle(
@@ -22,25 +22,60 @@ var gZenUIManager = {
this.sidebarHeightThrottle this.sidebarHeightThrottle
) )
).observe(document.getElementById('navigator-toolbox')); ).observe(document.getElementById('navigator-toolbox'));
SessionStore.promiseAllWindowsRestored.then(() => {
this._hasLoadedDOM = true;
this.updateTabsToolbar();
});
window.addEventListener('TabClose', this.onTabClose.bind(this));
this.tabsWrapper.addEventListener('scroll', this.saveScrollbarState.bind(this));
}, },
updateTabsToolbar() { updateTabsToolbar() {
// Set tabs max-height to the "toolbar-items" height // Set tabs max-height to the "toolbar-items" height
const toolbarItems = document.getElementById('tabbrowser-tabs'); const tabs = this.tabsWrapper;
const tabs = document.getElementById('tabbrowser-arrowscrollbox'); // Remove tabs so we can accurately calculate the height
tabs.style.maxHeight = '0px'; // reset to 0 // without them affecting the height of the toolbar
const toolbarRect = toolbarItems.getBoundingClientRect(); for (const tab of gBrowser.tabs) {
let height = toolbarRect.height; if (tab.hasAttribute('zen-essential')) {
// -5 for the controls padding continue;
let totalHeight = toolbarRect.height - this.contentElementSeparation * 2 - 5; }
// remove the height from other elements that aren't hidden tab.style.maxHeight = '0px';
const otherElements = document.querySelectorAll('#tabbrowser-tabs > *:not([hidden="true"])');
for (let tab of otherElements) {
if (tabs === tab) continue;
totalHeight -= tab.getBoundingClientRect().height;
} }
tabs.style.maxHeight = totalHeight + 'px'; tabs.style.flex = '1';
//console.info('ZenThemeModifier: set tabs max-height to', totalHeight + 'px'); tabs.style.removeProperty('max-height');
const toolbarRect = tabs.getBoundingClientRect();
let height = toolbarRect.height;
for (const tab of gBrowser.tabs) {
if (tab.hasAttribute('zen-essential')) {
continue;
}
tab.style.removeProperty('max-height');
}
tabs.style.removeProperty('flex');
tabs.style.maxHeight = height + 'px';
},
get tabsWrapper() {
if (this._tabsWrapper) {
return this._tabsWrapper;
}
this._tabsWrapper = document.getElementById('zen-tabs-wrapper');
return this._tabsWrapper;
},
saveScrollbarState() {
this._scrollbarState = this.tabsWrapper.scrollTop;
},
restoreScrollbarState() {
this.tabsWrapper.scrollTop = this._scrollbarState;
},
onTabClose(event) {
this.updateTabsToolbar();
this.restoreScrollbarState();
}, },
openAndChangeToTab(url, options) { openAndChangeToTab(url, options) {
@@ -55,9 +90,7 @@ var gZenUIManager = {
}, },
generateUuidv4() { generateUuidv4() {
return '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, (c) => return Services.uuid.generateUUID().toString();
(+c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (+c / 4)))).toString(16)
);
}, },
toogleBookmarksSidebar() { toogleBookmarksSidebar() {
@@ -113,11 +146,75 @@ var gZenUIManager = {
this.__currentPopup = null; this.__currentPopup = null;
this.__currentPopupTrackElement = null; this.__currentPopupTrackElement = null;
}, },
get newtabButtons() {
return document.querySelectorAll('#tabs-newtab-button');
},
_prevUrlbarLabel: null,
_lastSearch: '',
_clearTimeout: null,
_lastTab: null,
handleNewTab(werePassedURL, searchClipboard, where) {
const shouldOpenURLBar =
Services.prefs.getBoolPref('zen.urlbar.replace-newtab') && !werePassedURL && !searchClipboard && where === 'tab';
if (shouldOpenURLBar) {
if (this._clearTimeout) {
clearTimeout(this._clearTimeout);
}
this._lastTab = gBrowser.selectedTab;
this._lastTab._visuallySelected = false;
this._prevUrlbarLabel = gURLBar._untrimmedValue;
gURLBar._zenHandleUrlbarClose = this.handleUrlbarClose.bind(this);
gURLBar.setAttribute('zen-newtab', true);
for (const button of this.newtabButtons) {
button.setAttribute('in-urlbar', true);
}
document.getElementById('Browser:OpenLocation').doCommand();
gURLBar.search(this._lastSearch);
return true;
}
return false;
},
clearUrlbarData() {
this._prevUrlbarLabel = null;
this._lastSearch = '';
},
handleUrlbarClose(onSwitch) {
gURLBar._zenHandleUrlbarClose = null;
gURLBar.removeAttribute('zen-newtab');
this._lastTab._visuallySelected = true;
this._lastTab = null;
for (const button of this.newtabButtons) {
button.removeAttribute('in-urlbar');
}
if (onSwitch) {
this.clearUrlbarData();
} else {
this._lastSearch = gURLBar._untrimmedValue;
this._clearTimeout = setTimeout(() => {
this.clearUrlbarData();
}, this.urlbarWaitToClear);
}
gURLBar.setURI(this._prevUrlbarLabel, onSwitch, false, false, !onSwitch);
gURLBar.handleRevert();
if (gURLBar.focused) {
gURLBar.view.close({ elementPicked: onSwitch });
gURLBar.updateTextOverflow();
if (gBrowser.selectedTab.linkedBrowser && onSwitch) {
gURLBar.getBrowserState(gBrowser.selectedTab.linkedBrowser).urlbarFocused = false;
}
}
},
}; };
var gZenVerticalTabsManager = { var gZenVerticalTabsManager = {
init() { init() {
this._multiWindowFeature = new ZenMultiWindowFeature(); this._multiWindowFeature = new ZenMultiWindowFeature();
this._initWaitPromise();
ChromeUtils.defineLazyGetter(this, 'isWindowsStyledButtons', () => { ChromeUtils.defineLazyGetter(this, 'isWindowsStyledButtons', () => {
return !( return !(
@@ -135,8 +232,9 @@ var gZenVerticalTabsManager = {
}); });
var updateEvent = this._updateEvent.bind(this); var updateEvent = this._updateEvent.bind(this);
var onPrefChange = this._onPrefChange.bind(this);
this.initializePreferences(updateEvent); this.initializePreferences(onPrefChange);
this._toolbarOriginalParent = document.getElementById('nav-bar').parentElement; this._toolbarOriginalParent = document.getElementById('nav-bar').parentElement;
gZenCompactModeManager.addEventListener(updateEvent); gZenCompactModeManager.addEventListener(updateEvent);
@@ -145,27 +243,11 @@ var gZenVerticalTabsManager = {
window.addEventListener('customizationstarting', this._preCustomize.bind(this)); window.addEventListener('customizationstarting', this._preCustomize.bind(this));
window.addEventListener('aftercustomization', this._postCustomize.bind(this)); window.addEventListener('aftercustomization', this._postCustomize.bind(this));
window.addEventListener('DOMContentLoaded', updateEvent, { once: true }); this._updateEvent();
const tabs = document.getElementById('tabbrowser-tabs');
XPCOMUtils.defineLazyPreferenceGetter(this, 'canOpenTabOnMiddleClick', 'zen.tabs.newtab-on-middle-click', true);
if (!this.isWindowsStyledButtons) { if (!this.isWindowsStyledButtons) {
document.documentElement.setAttribute('zen-window-buttons-reversed', true); document.documentElement.setAttribute('zen-window-buttons-reversed', true);
} }
if (tabs) {
tabs.addEventListener('mouseup', this.openNewTabOnTabsMiddleClick.bind(this));
}
},
openNewTabOnTabsMiddleClick(event) {
if (event.button === 1 && event.target.id === 'tabbrowser-tabs' && this.canOpenTabOnMiddleClick) {
document.getElementById('cmd_newNavigatorTabNoEvent').doCommand();
event.stopPropagation();
event.preventDefault();
}
}, },
toggleExpand() { toggleExpand() {
@@ -198,13 +280,49 @@ var gZenVerticalTabsManager = {
if (this.__topButtonsSeparatorElement) { if (this.__topButtonsSeparatorElement) {
return this.__topButtonsSeparatorElement; return this.__topButtonsSeparatorElement;
} }
this.__topButtonsSeparatorElement = document.createElement('div'); this.__topButtonsSeparatorElement = document.getElementById('zen-sidebar-top-buttons-separator');
this.__topButtonsSeparatorElement.id = 'zen-sidebar-top-buttons-separator';
this.__topButtonsSeparatorElement.setAttribute('skipintoolbarset', 'true');
this.__topButtonsSeparatorElement.setAttribute('overflows', 'false');
return this.__topButtonsSeparatorElement; return this.__topButtonsSeparatorElement;
}, },
animateTab(aTab) {
if (!gZenUIManager.motion || !aTab || !gZenUIManager._hasLoadedDOM) {
return;
}
// get next visible tab
const isLastTab = () => {
const visibleTabs = gBrowser.visibleTabs;
return visibleTabs[visibleTabs.length - 1] === aTab;
};
const tabSize = aTab.getBoundingClientRect().height;
const transform = `-${tabSize}px`;
gZenUIManager.motion
.animate(
aTab,
{
opacity: [0, 1],
transform: ['scale(0.95)', 'scale(1)'],
marginBottom: isLastTab() ? [] : [transform, '0px'],
},
{
duration: 0.2,
easing: 'ease-out',
}
)
.then(() => {
aTab.style.removeProperty('margin-bottom');
aTab.style.removeProperty('transform');
aTab.style.removeProperty('opacity');
});
gZenUIManager.motion
.animate(aTab.querySelector('.tab-content'), {
filter: ['blur(1px)', 'blur(0px)'],
})
.then(() => {
aTab.querySelector('.tab-stack').style.removeProperty('filter');
});
},
get actualWindowButtons() { get actualWindowButtons() {
// we have multiple ".titlebar-buttonbox-container" in the DOM, because of the titlebar // we have multiple ".titlebar-buttonbox-container" in the DOM, because of the titlebar
if (!this.__actualWindowButtons) { if (!this.__actualWindowButtons) {
@@ -246,6 +364,31 @@ var gZenVerticalTabsManager = {
); );
}, },
_initWaitPromise() {
this._waitPromise = new Promise((resolve) => {
this._resolveWaitPromise = resolve;
});
},
async _onPrefChange() {
this._resolveWaitPromise();
// only run if we are in the active window
await this._multiWindowFeature.foreachWindowAsActive(async (browser) => {
if (browser.gZenVerticalTabsManager._multiWindowFeature.windowIsActive(browser)) {
return;
}
await browser.gZenVerticalTabsManager._waitPromise;
browser.gZenVerticalTabsManager._updateEvent({ dontRebuildAreas: true });
browser.gZenVerticalTabsManager._initWaitPromise();
});
if (ZenMultiWindowFeature.isActiveWindow) {
this._updateEvent();
this._initWaitPromise();
}
},
_updateEvent({ forCustomizableMode = false, dontRebuildAreas = false } = {}) { _updateEvent({ forCustomizableMode = false, dontRebuildAreas = false } = {}) {
if (this._isUpdating) { if (this._isUpdating) {
return; return;
@@ -271,6 +414,11 @@ var gZenVerticalTabsManager = {
gBrowser.tabContainer.setAttribute('orient', isVerticalTabs ? 'vertical' : 'horizontal'); gBrowser.tabContainer.setAttribute('orient', isVerticalTabs ? 'vertical' : 'horizontal');
gBrowser.tabContainer.arrowScrollbox.setAttribute('orient', isVerticalTabs ? 'vertical' : 'horizontal'); gBrowser.tabContainer.arrowScrollbox.setAttribute('orient', isVerticalTabs ? 'vertical' : 'horizontal');
// on purpose, we set the orient to horizontal, because the arrowScrollbox is vertical
gBrowser.tabContainer.arrowScrollbox.scrollbox.setAttribute(
'orient',
isVerticalTabs && ZenWorkspaces.workspaceEnabled ? 'horizontal' : 'vertical'
);
const buttonsTarget = document.getElementById('zen-sidebar-top-buttons-customization-target'); const buttonsTarget = document.getElementById('zen-sidebar-top-buttons-customization-target');
if (isRightSide) { if (isRightSide) {
@@ -387,7 +535,7 @@ var gZenVerticalTabsManager = {
if (isRightSide && !isSidebarExpanded) { if (isRightSide && !isSidebarExpanded) {
navBar.appendChild(windowButtons); navBar.appendChild(windowButtons);
} else { } else {
document.getElementById('zen-sidebar-top-buttons-customization-target').appendChild(windowButtons); topButtons.appendChild(windowButtons);
} }
} else if (!isSingleToolbar && !isCompactMode) { } else if (!isSingleToolbar && !isCompactMode) {
if (this.isWindowsStyledButtons) { if (this.isWindowsStyledButtons) {
@@ -424,6 +572,7 @@ var gZenVerticalTabsManager = {
} catch (e) { } catch (e) {
console.error(e); console.error(e);
} }
gZenUIManager.updateTabsToolbar();
this._isUpdating = false; this._isUpdating = false;
}, },

View File

@@ -0,0 +1,26 @@
diff --git a/browser/base/content/browser-commands.js b/browser/base/content/browser-commands.js
index 352de44dda36e3f6672eb353f42978ede0cd2681..66d1616da17df3430cec0994a346f0f446944f1a 100644
--- a/browser/base/content/browser-commands.js
+++ b/browser/base/content/browser-commands.js
@@ -318,6 +318,10 @@ var BrowserCommands = {
}
}
+ if (gZenUIManager.handleNewTab(werePassedURL, searchClipboard, where)) {
+ return;
+ }
+
// A notification intended to be useful for modular peformance tracking
// starting as close as is reasonably possible to the time when the user
// expressed the intent to open a new tab. Since there are a lot of
@@ -407,8 +411,8 @@ var BrowserCommands = {
(event.ctrlKey || event.metaKey || event.altKey) &&
gBrowser.selectedTab.pinned
) {
- if (gBrowser.visibleTabs.length > gBrowser.pinnedTabCount) {
- gBrowser.tabContainer.selectedIndex = gBrowser.pinnedTabCount;
+ if (gBrowser.visibleTabs.length > gBrowser._numVisiblePinTabs) {
+ gBrowser.tabContainer.selectedIndex = gBrowser._numVisiblePinTabs;
}
return;
}

View File

@@ -0,0 +1,19 @@
diff --git a/browser/base/content/browser-fullScreenAndPointerLock.js b/browser/base/content/browser-fullScreenAndPointerLock.js
index c61a424d3871d94e7086418c72ce22d5aef0a047..b6e3939b1ce67185acc3b9a66385869bd5490a39 100644
--- a/browser/base/content/browser-fullScreenAndPointerLock.js
+++ b/browser/base/content/browser-fullScreenAndPointerLock.js
@@ -431,10 +431,10 @@ var FullScreen = {
gNavToolbox.classList.toggle("fullscreen-with-menubar", shiftSize > 0);
let transform = shiftSize > 0 ? `translateY(${shiftSize}px)` : "";
- gNavToolbox.style.transform = transform;
- gURLBar.textbox.style.transform = gURLBar.textbox.hasAttribute("breakout")
- ? transform
- : "";
+ //gNavToolbox.style.transform = transform;
+ //gURLBar.textbox.style.transform = gURLBar.textbox.hasAttribute("breakout")
+ // ? transform
+ // : "";
if (shiftSize > 0) {
// If the mouse tracking missed our fullScreenToggler, then the toolbox
// might not have been shown before the menubar is animated down. Make

View File

@@ -1,11 +1,11 @@
diff --git a/browser/base/content/browser-init.js b/browser/base/content/browser-init.js diff --git a/browser/base/content/browser-init.js b/browser/base/content/browser-init.js
index 9df41bb3c82919839ee1408aa4d177ea7ee40a56..e37c64fa2c2ea39762be4285a1a7055463ded537 100644 index 63100defacf66c6b3232b9e0a783a5fd14e3a46a..22b79b021ff0baab4dac602447a124308208c828 100644
--- a/browser/base/content/browser-init.js --- a/browser/base/content/browser-init.js
+++ b/browser/base/content/browser-init.js +++ b/browser/base/content/browser-init.js
@@ -152,13 +152,15 @@ var gBrowserInit = { @@ -162,13 +162,15 @@ var gBrowserInit = {
elem.setAttribute("skipintoolbarset", "true"); elem.setAttribute("skipintoolbarset", "true");
} }
} }
+ ZenCustomizableUI.init(window); + ZenCustomizableUI.init(window);
for (let area of CustomizableUI.areas) { for (let area of CustomizableUI.areas) {
let type = CustomizableUI.getAreaType(area); let type = CustomizableUI.getAreaType(area);
@@ -16,10 +16,10 @@ index 9df41bb3c82919839ee1408aa4d177ea7ee40a56..e37c64fa2c2ea39762be4285a1a70554
} }
} }
+ ZenCustomizableUI.registerToolbarNodes(window); + ZenCustomizableUI.registerToolbarNodes(window);
if (isVerticalTabs) { if (isVerticalTabs) {
// Show the vertical tabs toolbar // Show the vertical tabs toolbar
setToolbarVisibility( setToolbarVisibility(
@@ -253,6 +255,10 @@ var gBrowserInit = { @@ -287,6 +289,10 @@ var gBrowserInit = {
gPrivateBrowsingUI.init(); gPrivateBrowsingUI.init();
BrowserSearch.init(); BrowserSearch.init();
BrowserPageActions.init(); BrowserPageActions.init();

View File

@@ -1,5 +1,5 @@
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index ccd83c15d0d73a1e53bdbfdfbe6fed43a26c961d..f18a6abf7debb97539a4cdf8422315b4dff08adb 100644 index 019b168c1aeae7e1c97a3ae58c99a48a27f54134..1f051e8a1e8a58e8bb721196deecfa36f4089dd6 100644
--- a/browser/base/content/browser.js --- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js +++ b/browser/base/content/browser.js
@@ -32,6 +32,7 @@ ChromeUtils.defineESModuleGetters(this, { @@ -32,6 +32,7 @@ ChromeUtils.defineESModuleGetters(this, {
@@ -26,19 +26,38 @@ index ccd83c15d0d73a1e53bdbfdfbe6fed43a26c961d..f18a6abf7debb97539a4cdf8422315b4
customElements.setElementCreationCallback("screenshots-buttons", () => { customElements.setElementCreationCallback("screenshots-buttons", () => {
Services.scriptloader.loadSubScript( Services.scriptloader.loadSubScript(
"chrome://browser/content/screenshots/screenshots-buttons.js", "chrome://browser/content/screenshots/screenshots-buttons.js",
@@ -3438,6 +3448,11 @@ var XULBrowserWindow = { @@ -3440,6 +3450,10 @@ var XULBrowserWindow = {
AboutReaderParent.updateReaderButton(gBrowser.selectedBrowser); AboutReaderParent.updateReaderButton(gBrowser.selectedBrowser);
TranslationsParent.onLocationChange(gBrowser.selectedBrowser); TranslationsParent.onLocationChange(gBrowser.selectedBrowser);
+ gZenViewSplitter.onLocationChange(gBrowser.selectedBrowser); + gZenViewSplitter.onLocationChange(gBrowser.selectedBrowser);
+ ZenWorkspaces.onLocationChange(gBrowser.selectedBrowser); + ZenWorkspaces.onLocationChange(gBrowser.selectedBrowser);
+ gZenTabUnloader.onLocationChange(gBrowser.selectedBrowser); + gZenTabUnloader.onLocationChange(gBrowser.selectedBrowser);
+ gZenGlanceManager.onLocationChange(gBrowser.selectedBrowser);
+ +
PictureInPicture.updateUrlbarToggle(gBrowser.selectedBrowser); PictureInPicture.updateUrlbarToggle(gBrowser.selectedBrowser);
if (!gMultiProcessBrowser) { if (!gMultiProcessBrowser) {
@@ -7289,6 +7304,12 @@ var gDialogBox = { @@ -4435,7 +4449,7 @@ nsBrowserAccess.prototype = {
// Passing a null-URI to only create the content window,
// and pass true for aSkipLoad to prevent loading of
// about:blank
- return this.getContentWindowOrOpenURIInFrame(
+ let res = this.getContentWindowOrOpenURIInFrame(
null,
aParams,
aWhere,
@@ -4443,6 +4457,10 @@ nsBrowserAccess.prototype = {
aName,
true
);
+ if (typeof window.gZenGlanceManager !== "undefined" && window.toolbar.visible) {
+ window.gZenGlanceManager.onTabOpen(res, aURI);
+ }
+ return res;
},
openURIInFrame: function browser_openURIInFrame(
@@ -7285,6 +7303,12 @@ var gDialogBox = {
parentElement.showModal(); parentElement.showModal();
this._didOpenHTMLDialog = true; this._didOpenHTMLDialog = true;

View File

@@ -1,13 +1,13 @@
diff --git a/browser/base/content/browser-sets.js b/browser/base/content/browser-sets.js diff --git a/browser/base/content/browser-sets.js b/browser/base/content/browser-sets.js
index 3031278749317d153624c6ccfbcc9d47aaf4089f..e67a8c3b56c01334627350c494b0139638ebf19a 100644 index 61aef2d420a78fb1910f556b71f6db75a16180ed..a3a1e70bedb760c165c338c28de6f2ee924df8de 100644
--- a/browser/base/content/browser-sets.js --- a/browser/base/content/browser-sets.js
+++ b/browser/base/content/browser-sets.js +++ b/browser/base/content/browser-sets.js
@@ -245,7 +245,7 @@ document.addEventListener( @@ -250,7 +250,7 @@ document.addEventListener(
} }
}); });
- document.getElementById("mainKeyset").addEventListener("command", event => { - document.getElementById("mainKeyset").addEventListener("command", event => {
+ document.getElementById("zenKeyset").addEventListener("command", event => { + document.getElementById("zenKeyset").addEventListener("command", event => {
switch (event.target.id) { const SIDEBAR_REVAMP_PREF = "sidebar.revamp";
case "goHome": const SIDEBAR_REVAMP_ENABLED = Services.prefs.getBoolPref(
BrowserCommands.home(); SIDEBAR_REVAMP_PREF,

View File

@@ -1,17 +1,17 @@
diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
index ca8953f3604f4f70de76576964af5f3c733f17a0..a2731ef6d4392301217cd05f6583e4814f1118e2 100644 index 891c067d6ad718061c410c04743bed25744504b5..560abfe817b94f535919ed29c21a912b09d63ac5 100644
--- a/browser/base/content/browser.xhtml --- a/browser/base/content/browser.xhtml
+++ b/browser/base/content/browser.xhtml +++ b/browser/base/content/browser.xhtml
@@ -101,6 +101,8 @@ @@ -99,6 +99,8 @@
<title data-l10n-id="browser-main-window-title"></title> <title data-l10n-id="browser-main-window-default-title"></title>
+#include zen-preloaded.inc.xhtml +#include zen-preloaded.inc.xhtml
+ +
# All JS files which are needed by browser.xhtml and other top level windows to # All JS files which are needed by browser.xhtml and other top level windows to
# support MacOS specific features *must* go into the global-scripts.inc file so # support MacOS specific features *must* go into the global-scripts.inc file so
# that they can be shared with macWindow.inc.xhtml. # that they can be shared with macWindow.inc.xhtml.
@@ -145,6 +147,7 @@ @@ -143,6 +145,7 @@
window.addEventListener("DOMContentLoaded", window.addEventListener("DOMContentLoaded",
gBrowserInit.onDOMContentLoaded.bind(gBrowserInit), { once: true }); gBrowserInit.onDOMContentLoaded.bind(gBrowserInit), { once: true });
</script> </script>
@@ -19,7 +19,7 @@ index ca8953f3604f4f70de76576964af5f3c733f17a0..a2731ef6d4392301217cd05f6583e481
</head> </head>
<html:body xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> <html:body xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
# All sets except for popupsets (commands, keys, and stringbundles) # All sets except for popupsets (commands, keys, and stringbundles)
@@ -166,9 +169,12 @@ @@ -164,9 +167,12 @@
</vbox> </vbox>
</html:template> </html:template>

View File

@@ -1,8 +1,8 @@
diff --git a/browser/base/content/main-popupset.inc.xhtml b/browser/base/content/main-popupset.inc.xhtml diff --git a/browser/base/content/main-popupset.inc.xhtml b/browser/base/content/main-popupset.inc.xhtml
index 1fb595272a184f9a40f56f87d86232e3324f7750..8dd0f0ff856be524a5fa27fb8c6180c1fe058134 100644 index e5f3424eaeeec0ba552537f167dd99e912216d94..4bdfcdb23fe9c44ad3d4de273c64f4cc31cb4034 100644
--- a/browser/base/content/main-popupset.inc.xhtml --- a/browser/base/content/main-popupset.inc.xhtml
+++ b/browser/base/content/main-popupset.inc.xhtml +++ b/browser/base/content/main-popupset.inc.xhtml
@@ -144,6 +144,10 @@ @@ -181,6 +181,10 @@
hidden="true" hidden="true"
tabspecific="true" tabspecific="true"
aria-labelledby="editBookmarkPanelTitle"> aria-labelledby="editBookmarkPanelTitle">
@@ -13,17 +13,17 @@ index 1fb595272a184f9a40f56f87d86232e3324f7750..8dd0f0ff856be524a5fa27fb8c6180c1
<box class="panel-header"> <box class="panel-header">
<html:h1> <html:h1>
<html:span id="editBookmarkPanelTitle"/> <html:span id="editBookmarkPanelTitle"/>
@@ -169,6 +173,7 @@ @@ -206,6 +210,7 @@
class="footer-button"/> class="footer-button"/>
</html:moz-button-group> </html:moz-button-group>
</vbox> </vbox>
+ </vbox> + </vbox>
</panel> </panel>
</html:template> </html:template>
@@ -454,6 +459,8 @@ @@ -535,6 +540,8 @@
#include popup-notifications.inc #include popup-notifications.inc.xhtml
+#include zen-popupset.inc.xhtml +#include zen-popupset.inc.xhtml
+ +

View File

@@ -1,5 +1,5 @@
diff --git a/browser/base/content/navigator-toolbox.inc.xhtml b/browser/base/content/navigator-toolbox.inc.xhtml diff --git a/browser/base/content/navigator-toolbox.inc.xhtml b/browser/base/content/navigator-toolbox.inc.xhtml
index 00391af141d9015fe5839534e5e6b22a91ba65d9..17d8ac96986e698b09033b870c24fc2f61c47a05 100644 index a0a382643a2f74b6d789f3641ef300eed202d5e9..7a2be5fe6cdecb771ce3326008085ae402a465de 100644
--- a/browser/base/content/navigator-toolbox.inc.xhtml --- a/browser/base/content/navigator-toolbox.inc.xhtml
+++ b/browser/base/content/navigator-toolbox.inc.xhtml +++ b/browser/base/content/navigator-toolbox.inc.xhtml
@@ -2,7 +2,7 @@ @@ -2,7 +2,7 @@
@@ -29,23 +29,30 @@ index 00391af141d9015fe5839534e5e6b22a91ba65d9..17d8ac96986e698b09033b870c24fc2f
<toolbartabstop/> <toolbartabstop/>
<hbox id="TabsToolbar-customization-target" flex="1"> <hbox id="TabsToolbar-customization-target" flex="1">
<toolbarbutton id="firefox-view-button" <toolbarbutton id="firefox-view-button"
@@ -40,6 +40,7 @@ @@ -40,9 +40,9 @@
data-l10n-id="toolbar-button-firefox-view-2" data-l10n-id="toolbar-button-firefox-view-2"
role="button" role="button"
aria-pressed="false" aria-pressed="false"
+ hidden="true" + hidden="true"
cui-areatype="toolbar" cui-areatype="toolbar"
removable="true"/> removable="true"/>
-
@@ -55,9 +56,14 @@ <tabs id="tabbrowser-tabs"
is="tabbrowser-tabs"
aria-multiselectable="true"
@@ -50,6 +50,10 @@
tooltip="tabbrowser-tab-tooltip"
orient="horizontal"
stopwatchid="FX_TAB_CLICK_MS">
+<html:div id="zen-essentials-container" skipintoolbarset="true"></html:div>
+<hbox id="zen-current-workspace-indicator-container"></hbox>
+<html:div id="zen-tabs-wrapper">
+<html:div id="zen-browser-tabs-container">
<hbox class="tab-drop-indicator" hidden="true"/>
# If the name (tabbrowser-arrowscrollbox) or structure of this changes
# significantly, there is an optimization in # significantly, there is an optimization in
# DisplayPortUtils::MaybeCreateDisplayPortInFirstScrollFrameEncountered based @@ -57,7 +61,7 @@
# the current structure that we may want to revisit. # the current structure that we may want to revisit.
+ <html:div id="zen-essentials-container"></html:div>
+ <hbox id="zen-current-workspace-indicator">
+ <hbox id="zen-current-workspace-indicator-icon"></hbox>
+ <hbox id="zen-current-workspace-indicator-name"></hbox>
+ </hbox>
<html:div id="vertical-pinned-tabs-container" tabindex="-1"></html:div> <html:div id="vertical-pinned-tabs-container" tabindex="-1"></html:div>
<html:div id="vertical-pinned-tabs-container-separator"></html:div> <html:div id="vertical-pinned-tabs-container-separator"></html:div>
- <arrowscrollbox id="tabbrowser-arrowscrollbox" orient="horizontal" flex="1" clicktoscroll="" scrolledtostart="" scrolledtoend=""> - <arrowscrollbox id="tabbrowser-arrowscrollbox" orient="horizontal" flex="1" clicktoscroll="" scrolledtostart="" scrolledtoend="">
@@ -53,6 +60,15 @@ index 00391af141d9015fe5839534e5e6b22a91ba65d9..17d8ac96986e698b09033b870c24fc2f
<tab is="tabbrowser-tab" class="tabbrowser-tab" selected="true" visuallyselected="" fadein=""/> <tab is="tabbrowser-tab" class="tabbrowser-tab" selected="true" visuallyselected="" fadein=""/>
<hbox id="tabbrowser-arrowscrollbox-periphery"> <hbox id="tabbrowser-arrowscrollbox-periphery">
<toolbartabstop/> <toolbartabstop/>
@@ -75,6 +79,8 @@
tooltip="dynamic-shortcut-tooltip"
data-l10n-id="tabs-toolbar-new-tab"/>
<html:span id="tabbrowser-tab-a11y-desc" hidden="true"/>
+</html:div>
+</html:div>
</tabs>
<toolbarbutton id="new-tab-button"
@@ -100,11 +106,12 @@ @@ -100,11 +106,12 @@
#include private-browsing-indicator.inc.xhtml #include private-browsing-indicator.inc.xhtml
<toolbarbutton id="content-analysis-indicator" <toolbarbutton id="content-analysis-indicator"
@@ -69,7 +85,7 @@ index 00391af141d9015fe5839534e5e6b22a91ba65d9..17d8ac96986e698b09033b870c24fc2f
<toolbar id="nav-bar" <toolbar id="nav-bar"
class="browser-toolbar chromeclass-location" class="browser-toolbar chromeclass-location"
data-l10n-id="navbar-accessible" data-l10n-id="navbar-accessible"
@@ -487,10 +494,12 @@ @@ -490,10 +497,12 @@
consumeanchor="PanelUI-button" consumeanchor="PanelUI-button"
data-l10n-id="appmenu-menu-button-closed2"/> data-l10n-id="appmenu-menu-button-closed2"/>
</toolbaritem> </toolbaritem>

View File

@@ -1,5 +1,5 @@
diff --git a/browser/base/content/navigator-toolbox.js b/browser/base/content/navigator-toolbox.js diff --git a/browser/base/content/navigator-toolbox.js b/browser/base/content/navigator-toolbox.js
index 64ded8fb2c08f1dbfec8fe08ab427a24b53f1169..69009d53d7242c26f777ac2e0bb1897ff27ad916 100644 index 64ded8fb2c08f1dbfec8fe08ab427a24b53f1169..9e1e888554279b6e1df3bc1cb907afd2ccb330ca 100644
--- a/browser/base/content/navigator-toolbox.js --- a/browser/base/content/navigator-toolbox.js
+++ b/browser/base/content/navigator-toolbox.js +++ b/browser/base/content/navigator-toolbox.js
@@ -8,7 +8,7 @@ @@ -8,7 +8,7 @@
@@ -11,3 +11,19 @@ index 64ded8fb2c08f1dbfec8fe08ab427a24b53f1169..69009d53d7242c26f777ac2e0bb1897f
const widgetOverflow = document.getElementById("widget-overflow"); const widgetOverflow = document.getElementById("widget-overflow");
function onPopupShowing(event) { function onPopupShowing(event) {
@@ -187,6 +187,7 @@ document.addEventListener(
#reload-button ,
#urlbar-go-button,
#reader-mode-button,
+ #zen-tabs-wrapper,
#picture-in-picture-button,
#shopping-sidebar-button,
#urlbar-zoom-button,
@@ -208,6 +209,7 @@ document.addEventListener(
case "vertical-tabs-newtab-button":
case "tabs-newtab-button":
case "new-tab-button":
+ case "zen-tabs-wrapper":
gBrowser.handleNewTabMiddleClick(element, event);
break;

View File

@@ -4,6 +4,7 @@
content/browser/ZenStartup.mjs (content/ZenStartup.mjs) content/browser/ZenStartup.mjs (content/ZenStartup.mjs)
content/browser/ZenUIManager.mjs (content/ZenUIManager.mjs) content/browser/ZenUIManager.mjs (content/ZenUIManager.mjs)
content/browser/ZenCustomizableUI.sys.mjs (content/ZenCustomizableUI.sys.mjs) content/browser/ZenCustomizableUI.sys.mjs (content/ZenCustomizableUI.sys.mjs)
content/browser/zen-components/ZenUIMigration.mjs (zen-components/ZenUIMigration.mjs)
content/browser/zen-components/ZenCompactMode.mjs (zen-components/ZenCompactMode.mjs) content/browser/zen-components/ZenCompactMode.mjs (zen-components/ZenCompactMode.mjs)
content/browser/zen-components/ZenViewSplitter.mjs (zen-components/ZenViewSplitter.mjs) content/browser/zen-components/ZenViewSplitter.mjs (zen-components/ZenViewSplitter.mjs)
content/browser/zen-components/ZenThemesCommon.mjs (zen-components/ZenThemesCommon.mjs) content/browser/zen-components/ZenThemesCommon.mjs (zen-components/ZenThemesCommon.mjs)
@@ -52,7 +53,7 @@
content/browser/zen-styles/zen-panels/print.css (content/zen-styles/zen-panels/print.css) content/browser/zen-styles/zen-panels/print.css (content/zen-styles/zen-panels/print.css)
content/browser/zen-styles/zen-panels/welcome.css (content/zen-styles/zen-panels/welcome.css) content/browser/zen-styles/zen-panels/welcome.css (content/zen-styles/zen-panels/welcome.css)
content/browser/zen-styles/zen-compact-mode.css (content/zen-styles/zen-compact-mode.css) * content/browser/zen-styles/zen-compact-mode.css (content/zen-styles/zen-compact-mode.css)
# Images # Images
content/browser/zen-images/gradient.png (content/zen-images/gradient.png) content/browser/zen-images/gradient.png (content/zen-images/gradient.png)

View File

@@ -1,4 +1,4 @@
<vbox id="zen-glance-sidebar-container"> <vbox id="zen-glance-sidebar-container" hidden="true">
<toolbarbutton id="zen-glance-sidebar-close" class="toolbarbutton-1" oncommand="gZenGlanceManager.closeGlance()"/> <toolbarbutton id="zen-glance-sidebar-close" class="toolbarbutton-1" oncommand="gZenGlanceManager.closeGlance({ onTabClose: true })"/>
<toolbarbutton id="zen-glance-sidebar-open" class="toolbarbutton-1" oncommand="gZenGlanceManager.fullyOpenGlance()"/> <toolbarbutton id="zen-glance-sidebar-open" class="toolbarbutton-1" oncommand="gZenGlanceManager.fullyOpenGlance()"/>
</vbox> </vbox>

View File

@@ -9,7 +9,7 @@
mode="icons"> mode="icons">
<toolbarbutton removable="true" class="chromeclass-toolbar-additional toolbarbutton-1 zen-sidebar-action-button" id="zen-expand-sidebar-button" data-l10n-id="sidebar-zen-expand" cui-areatype="toolbar" oncommand="gZenVerticalTabsManager.toggleExpand();"></toolbarbutton> <toolbarbutton removable="true" class="chromeclass-toolbar-additional toolbarbutton-1 zen-sidebar-action-button" id="zen-expand-sidebar-button" data-l10n-id="sidebar-zen-expand" cui-areatype="toolbar" oncommand="gZenVerticalTabsManager.toggleExpand();"></toolbarbutton>
<toolbarbutton removable="true" class="toolbarbutton-1 zen-sidebar-action-button zen-compact-mode-ignore" id="zen-sidepanel-button" data-l10n-id="sidebar-zen-sidepanel" onclick="gZenBrowserManagerSidebar.toggle();"></toolbarbutton> <toolbarbutton removable="true" class="toolbarbutton-1 zen-sidebar-action-button zen-compact-mode-ignore" id="zen-sidepanel-button" data-l10n-id="sidebar-zen-sidepanel" onclick="gZenBrowserManagerSidebar.toggle();"></toolbarbutton>
<toolbarbutton removable="true" id="zen-workspaces-button"></toolbarbutton> <toolbarbutton id="zen-workspaces-button" class="chromeclass-toolbar-additional" overflows="false" removable="false"></toolbarbutton>
<toolbarbutton id="zen-profile-button" <toolbarbutton id="zen-profile-button"
class="zen-sidebar-action-button toolbarbutton-1 chromeclass-toolbar-additional" class="zen-sidebar-action-button toolbarbutton-1 chromeclass-toolbar-additional"
delegatesanchor="true" delegatesanchor="true"

View File

@@ -56,21 +56,6 @@
} }
} }
@keyframes zen-new-tab-appear-vertical {
0% {
opacity: 0;
transform: translateY(-25px);
}
60% {
opacity: 0.8;
transform: translateY(4px);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
@keyframes zen-main-app-wrapper-animation { @keyframes zen-main-app-wrapper-animation {
from { from {
opacity: 1; opacity: 1;
@@ -219,16 +204,6 @@
} }
} }
@keyframes zen-workspaces-button-active {
from {
bottom: -20px;
}
to {
bottom: -2px;
}
}
/* Mark: Zen Glance */ /* Mark: Zen Glance */
@keyframes zen-glance-overlay-animation { @keyframes zen-glance-overlay-animation {
from { from {
@@ -252,76 +227,6 @@
} }
} }
@keyframes zen-glance-content-animation-out {
0% {
/* make the box shrink to final width/height and x/y coordinates */
transform: translate(-50%, -50%) translateZ(0);
width: 85%;
height: 100%;
top: 50%;
left: 50%;
opacity: 1;
}
100% {
/* make the box appear from initial width/height and x/y coordinates */
transform: translate(-50%, -50%) translateZ(0);
opacity: 0;
width: 47%;
height: 53%;
top: 50%;
left: 50%;
opacity: 0;
}
}
@keyframes zen-glance-buttons-animation-full {
from {
width: 85%;
height: 85%;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
to {
width: 100%;
height: 100%;
top: 50%;
left: 50%;
opacity: 1;
transform: translate(-50%, -50%);
}
}
@keyframes zen-glance-loading-animation {
0% {
opacity: 1;
width: 80%;
}
90% {
width: 100%;
}
100% {
opacity: 0;
}
}
@keyframes zen-glance-buttons-animation {
from {
right: 0;
opacity: 0;
width: fit-content;
}
to {
opacity: 1;
transform: translateX(-100%) translateY(-50%);
}
}
@keyframes zen-rice-form-out { @keyframes zen-rice-form-out {
0% { 0% {
transform: translateX(0); transform: translateX(0);

View File

@@ -6,15 +6,9 @@
:root:not([inDOMFullscreen='true']):not([chromehidden~='location']):not([chromehidden~='toolbar']) { :root:not([inDOMFullscreen='true']):not([chromehidden~='location']):not([chromehidden~='toolbar']) {
& #tabbrowser-tabbox #tabbrowser-tabpanels .browserSidebarContainer { & #tabbrowser-tabbox #tabbrowser-tabpanels .browserSidebarContainer {
width: -moz-available; width: -moz-available;
--zen-native-content-radius: env(-moz-gtk-csd-titlebar-radius, var(--zen-border-radius));
border-radius: var(--zen-native-inner-radius); border-radius: var(--zen-native-inner-radius);
position: relative; position: relative;
/* For glance */
transition:
transform 0.1s ease-in-out,
opacity 0.1s ease-in-out;
overflow: hidden; overflow: hidden;
:root:not([zen-no-padding='true']) & { :root:not([zen-no-padding='true']) & {

View File

@@ -22,13 +22,13 @@
:root:is([inDOMFullscreen='true'], [chromehidden~='location'], [chromehidden~='toolbar']) { :root:is([inDOMFullscreen='true'], [chromehidden~='location'], [chromehidden~='toolbar']) {
#navigator-toolbox, #navigator-toolbox,
#zen-sidebar-splitter { #zen-sidebar-splitter {
display: none; visibility: collapse;
} }
} }
#browser { #browser {
width: 100%; width: 100%;
background: var(--zen-main-browser-background); background: var(--zen-main-browser-background) !important;
will-change: background-color; will-change: background-color;
@@ -51,7 +51,7 @@
&[animating='true']::after { &[animating='true']::after {
background: var(--zen-main-browser-background-old); background: var(--zen-main-browser-background-old);
backdrop-filter: blur(5px); backdrop-filter: blur(5px);
animation: zen-main-app-wrapper-animation 0.4s ease forwards; animation: zen-main-app-wrapper-animation 0.2s ease forwards;
transition: 0s; transition: 0s;
} }
} }

View File

@@ -6,13 +6,7 @@
/* All overrides for compact mode go here */ /* All overrides for compact mode go here */
:root[zen-compact-mode='true']:not([customizing]):not([inDOMFullscreen='true']) { :root[zen-compact-mode='true']:not([customizing]):not([inDOMFullscreen='true']) {
#zen-sidebar-top-buttons:has(#zen-sidebar-top-buttons-customization-target:empty) { %include zen-tabs/vertical-tabs-topbuttons-fix.css
max-height: 0 !important;
min-height: 0 !important;
opacity: 0;
overflow: hidden;
pointer-events: none;
}
@media (-moz-bool-pref: 'zen.view.compact.hide-tabbar') or (-moz-bool-pref: 'zen.view.use-single-toolbar') { @media (-moz-bool-pref: 'zen.view.compact.hide-tabbar') or (-moz-bool-pref: 'zen.view.use-single-toolbar') {
#zen-sidebar-web-panel-wrapper:has(#zen-sidebar-web-panel[pinned='true']) { #zen-sidebar-web-panel-wrapper:has(#zen-sidebar-web-panel[pinned='true']) {
@@ -48,13 +42,13 @@
position: absolute; position: absolute;
z-index: 10; z-index: 10;
transition: transition:
left 0.25s ease, left 0.15s ease,
right 0.25s ease, right 0.15s ease,
opacity 1.5s ease; opacity 1.5s ease;
top: 0; top: 0;
bottom: var(--zen-element-separation); bottom: var(--zen-element-separation);
opacity: 0;
padding: 0 var(--zen-compact-float) !important; padding: 0 var(--zen-compact-float) !important;
opacity: 0;
:root[zen-single-toolbar='true'] & { :root[zen-single-toolbar='true'] & {
top: var(--zen-element-separation); top: var(--zen-element-separation);
@@ -65,13 +59,13 @@
margin-left: 0 !important; margin-left: 0 !important;
} }
& #urlbar[open] { & #urlbar[open]:not([zen-floating-urlbar='true']) {
top: 0 !important; top: 0 !important;
} }
} }
&:not([zen-right-side='true']) #navigator-toolbox { &:not([zen-right-side='true']) #navigator-toolbox {
left: calc(-1 * var(--zen-sidebar-width) + var(--zen-element-separation)); left: calc(-1 * var(--zen-sidebar-width) + 1px);
} }
/* When we have multiple toolbars and the top-toolbar is NOT being hidden, /* When we have multiple toolbars and the top-toolbar is NOT being hidden,
@@ -88,7 +82,7 @@
--zen-compact-float: calc(var(--zen-element-separation) + 1px); --zen-compact-float: calc(var(--zen-element-separation) + 1px);
&:not([animate='true']) { &:not([animate='true']) {
right: calc(-1 * var(--zen-sidebar-width) + var(--zen-element-separation)); right: calc(-1 * var(--zen-sidebar-width) + 1px);
} }
} }
@@ -100,7 +94,7 @@
#navigator-toolbox:not([animate='true']) #titlebar { #navigator-toolbox:not([animate='true']) #titlebar {
box-shadow: var(--zen-big-shadow); box-shadow: var(--zen-big-shadow);
border-radius: calc(var(--zen-native-inner-radius) + 2px); border-radius: var(--zen-native-inner-radius);
padding: var(--zen-toolbox-padding) !important; padding: var(--zen-toolbox-padding) !important;
position: relative; position: relative;
background: var(--zen-dialog-background); background: var(--zen-dialog-background);
@@ -117,6 +111,15 @@
background-size: 2000px !important; /* Dont ask me why */ background-size: 2000px !important; /* Dont ask me why */
backdrop-filter: blur(5px) !important; backdrop-filter: blur(5px) !important;
} }
& #urlbar[open][zen-floating-urlbar='true'] {
--zen-urlbar-offset: var(--zen-sidebar-width);
transition: left 0.05s ease;
#navigator-toolbox:has(&) {
opacity: 1;
}
}
} }
#navigator-toolbox:hover, #navigator-toolbox:hover,
@@ -127,9 +130,9 @@
#navigator-toolbox[movingtab], #navigator-toolbox[movingtab],
#navigator-toolbox:has(.tabbrowser-tab:active), #navigator-toolbox:has(.tabbrowser-tab:active),
#navigator-toolbox:has( #navigator-toolbox:has(
*:is([panelopen='true'], [open='true'], #nav-bar:focus-within):not(tab):not(.zen-compact-mode-ignore) *:is([panelopen='true'], [open='true'], #urlbar:not([zen-floating-urlbar='true']):focus-within):not(tab):not(.zen-compact-mode-ignore)
) { ) {
&:not([animate='true']) { &:not([animate='true']):not(:has(#urlbar[zen-floating-urlbar='true']:hover)) {
--zen-compact-mode-func: linear( --zen-compact-mode-func: linear(
0 0%, 0 0%,
0.002748 1%, 0.002748 1%,
@@ -234,14 +237,20 @@
1.003423 100% 1.003423 100%
); );
transition: transition:
left 0.3125s var(--zen-compact-mode-func), left 0.3s var(--zen-compact-mode-func),
right 0.3125s var(--zen-compact-mode-func); right 0.3s var(--zen-compact-mode-func);
opacity: 1; opacity: 1;
left: -1px; &:not([supress-primary-adjustment='true']) {
:root[zen-right-side='true'] & { left: -1px;
right: -1px; :root[zen-right-side='true'] & {
left: auto; right: -1px;
left: auto;
}
& #urlbar[open][zen-floating-urlbar='true'] {
--zen-urlbar-offset: 0px;
}
} }
} }
} }

View File

@@ -41,9 +41,9 @@
} }
#tabbrowser-tabpanels[zen-split-view='true']:not([zen-split-resizing]) > [zen-split-anim='true'] { #tabbrowser-tabpanels[zen-split-view='true']:not([zen-split-resizing]) > [zen-split-anim='true'] {
transition: inset 0.08s ease-out; transition: inset 0.09s ease-out !important;
& browser { & browser {
transition: opacity 0.2s ease-out; transition: opacity 0.2s ease-out !important;
} }
} }
@@ -56,11 +56,6 @@
--zen-split-row-gap: calc(var(--zen-element-separation) + 1px); --zen-split-row-gap: calc(var(--zen-element-separation) + 1px);
--zen-split-column-gap: calc(var(--zen-element-separation) + 1px); --zen-split-column-gap: calc(var(--zen-element-separation) + 1px);
margin-right: calc(-1 * var(--zen-split-column-gap)); margin-right: calc(-1 * var(--zen-split-column-gap));
:root[zen-right-side='true'] & {
margin-right: 0;
margin-left: var(--zen-element-separation);
}
} }
#tabbrowser-tabpanels:has(> [zen-split='true']), #tabbrowser-tabpanels:has(> [zen-split='true']),

View File

@@ -9,51 +9,58 @@
visibility: inherit; visibility: inherit;
} }
.zen-glance-background {
transform: scale(0.98);
backdrop-filter: blur(5px);
opacity: 0.6;
}
#zen-glance-sidebar-container { #zen-glance-sidebar-container {
display: none; position: absolute;
display: flex;
z-index: 999;
& toolbarbutton:hover { &[hidden='true'] {
background: var(--button-background-color-hover); display: none;
}
top: 10%;
transform: translateY(-50%);
padding: 5px;
gap: 12px;
left: 2%;
& toolbarbutton {
width: 32px;
height: 32px;
background: light-dark(rgb(24, 24, 24), rgb(231, 231, 231));
transition: background 0.2s ease;
border-radius: 999px;
appearance: none;
box-shadow: 0 0 12px 1px rgba(0, 0, 0, 0.07);
opacity: 0;
&:hover {
background: light-dark(rgb(41, 41, 41), rgb(204, 204, 204));
}
& label {
display: none;
}
& image {
filter: invert(1);
}
} }
} }
.browserSidebarContainer.zen-glance-overlay { .browserSidebarContainer.zen-glance-overlay {
box-shadow: none !important; box-shadow: none !important;
&[fade-out='true'] {
background: transparent;
opacity: 1;
& .browserContainer {
opacity: 1;
animation: zen-glance-content-animation-out 0.3s ease-in-out forwards !important;
& browser {
opacity: 1 !important;
}
& #zen-glance-sidebar-container {
opacity: 0;
transition: opacity 0.1s ease-in-out;
}
}
}
& .browserContainer { & .browserContainer {
background: var(--zen-dialog-background); background: var(--zen-dialog-background);
position: fixed; position: fixed;
border-radius: var(--zen-border-radius); border-radius: var(--zen-native-inner-radius);
opacity: 0; opacity: 0;
top: 0; top: 0;
left: 0; left: 0;
flex: unset !important; flex: unset !important;
border: 1px solid var(--zen-colors-border); box-shadow: var(--zen-big-shadow);
&[has-finished-animation='true'] { &[has-finished-animation='true'] {
position: relative !important; position: relative !important;
@@ -65,41 +72,10 @@
} }
& .browserStack { & .browserStack {
border-radius: var(--zen-border-radius); border-radius: var(--zen-native-inner-radius);
overflow: hidden; overflow: hidden;
} }
& #zen-glance-sidebar-container {
position: absolute;
display: flex;
top: 10%;
left: 0;
transform: translateY(-50%);
opacity: 0;
background: var(--zen-dialog-background);
border: 1px solid var(--zen-colors-border);
border-right: none;
border-top-left-radius: var(--zen-border-radius);
border-bottom-left-radius: var(--zen-border-radius);
padding: 5px;
gap: 6px;
animation: zen-glance-buttons-animation 0.2s ease-in-out forwards;
animation-delay: 0.3s;
& toolbarbutton {
width: 32px;
height: 32px;
& label {
display: none;
}
}
}
& browser { & browser {
width: 100%; width: 100%;
height: 100%; height: 100%;
@@ -108,9 +84,7 @@
} }
&[animate-full='true'] { &[animate-full='true'] {
opacity: 1; transform: translate(-50%, -50%);
animation: zen-glance-buttons-animation-full 0.2s ease-in-out forwards !important;
& #zen-glance-sidebar-container { & #zen-glance-sidebar-container {
opacity: 0 !important; opacity: 0 !important;
} }
@@ -118,22 +92,18 @@
&[animate='true'] { &[animate='true'] {
position: absolute; position: absolute;
transform: translate(-50%, -50%);
&:not([animate-end='true']) {
pointer-events: none;
& browser {
opacity: 0;
visibility: hidden;
}
& #zen-glance-sidebar-container {
opacity: 0;
animation: none;
pointer-events: none;
}
}
} }
} }
&[fade-out='true'] {
& browser {
transition: opacity 0.1s ease;
opacity: 0;
}
}
& browser[animate-glance-open='true'] {
transition: opacity 0.2s ease-in-out;
opacity: 0;
}
} }

View File

@@ -56,6 +56,11 @@ panel {
--panel-border-radius: var(--zen-native-inner-radius); --panel-border-radius: var(--zen-native-inner-radius);
} }
/* split-view popup */
#confirmation-hint {
--arrowpanel-background: var(--zen-colors-primary);
}
/* app menu */ /* app menu */
.addon-banner-item, .addon-banner-item,
.panel-banner-item { .panel-banner-item {

View File

@@ -83,7 +83,6 @@
border-radius: var(--zen-native-inner-radius); border-radius: var(--zen-native-inner-radius);
z-index: 2; z-index: 2;
box-shadow: var(--zen-big-shadow); box-shadow: var(--zen-big-shadow);
border: 1px solid var(--zen-colors-border);
background: var(--zen-colors-tertiary); background: var(--zen-colors-tertiary);
opacity: 0; opacity: 0;
animation-delay: 0.1s; animation-delay: 0.1s;
@@ -108,7 +107,7 @@
top: 0; top: 0;
left: 0; left: 0;
height: 100%; height: 100%;
width: calc(var(--zen-element-separation) * 2 - 3px); width: var(--zen-element-separation);
background: transparent; background: transparent;
border: none; border: none;
cursor: ew-resize; cursor: ew-resize;

View File

@@ -38,32 +38,17 @@
} }
} }
/*#zen-profile-button::before {
background: transparent;
border-radius: 50%;
border: 3px solid var(--zen-colors-border);
position: absolute;
content: "";
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: calc(2 * var(--toolbarbutton-inner-padding) + 16px - 8px - var(--toolbarbutton-inner-padding));
height: calc(2 * var(--toolbarbutton-inner-padding) + 16px - 8px - var(--toolbarbutton-inner-padding));
}*/
/* Bookmarks sidebar */ /* Bookmarks sidebar */
#zen-tabbox-wrapper { #zen-tabbox-wrapper {
& #sidebar-splitter { & #sidebar-splitter {
opacity: 0; opacity: 0;
margin-inline-end: -4px; margin: 0 calc(-1 * var(--zen-element-separation));
} }
& #sidebar-box { & #sidebar-box {
border-radius: var(--zen-border-radius); border-radius: var(--zen-native-inner-radius);
box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.1); box-shadow: var(--zen-big-shadow);
margin-bottom: var(--zen-element-separation);
overflow: hidden; overflow: hidden;
border: 1px solid var(--zen-colors-border);
:root:not([zen-right-side='true']) &[positionend='true'] { :root:not([zen-right-side='true']) &[positionend='true'] {
margin-right: var(--zen-element-separation); margin-right: var(--zen-element-separation);

View File

@@ -28,7 +28,7 @@
--tab-min-height: 10px !important; --tab-min-height: 10px !important;
} }
#vertical-pinned-tabs-container-separator { .vertical-pinned-tabs-container-separator {
display: none !important; display: none !important;
} }
@@ -214,7 +214,7 @@
} }
/* Other UI Elements */ /* Other UI Elements */
#zen-current-workspace-indicator { .zen-current-workspace-indicator {
display: none !important; display: none !important;
} }

View File

@@ -13,7 +13,7 @@ height: var(--zen-toolbar-height);
} }
} }
&:not([zen-has-hover='true']):not([has-popup-menu]):not(:focus-within) { &:not([zen-has-hover='true']):not([has-popup-menu]):not(:focus-within):not(:has(*:is([panelopen='true'], [open='true']))) {
transition-delay: 0.2s; transition-delay: 0.2s;
height: var(--zen-element-separation); height: var(--zen-element-separation);
overflow: hidden; overflow: hidden;

View File

@@ -4,7 +4,10 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
& #zen-sidebar-top-buttons:has(#zen-sidebar-top-buttons-customization-target:empty) { &
#zen-sidebar-top-buttons:not(
:has(#zen-sidebar-top-buttons-customization-target > *:not(#zen-sidebar-top-buttons-separator))
) {
max-height: 0 !important; max-height: 0 !important;
min-height: 0 !important; min-height: 0 !important;
opacity: 0; opacity: 0;

View File

@@ -19,9 +19,17 @@
height: var(--zen-toolbar-height); height: var(--zen-toolbar-height);
} }
@media (-moz-platform: macos) and (not (-moz-bool-pref: 'zen.view.mac.show-three-dot-menu')) {
&:not([customizing]) #PanelUI-button:not([open]):not([panelopen]) {
position: absolute;
opacity: 0;
pointer-events: none;
}
}
& #zen-sidebar-top-buttons .toolbarbutton-1 { & #zen-sidebar-top-buttons .toolbarbutton-1 {
& > .toolbarbutton-icon { & > .toolbarbutton-icon {
padding: 5px; padding: 4px;
} }
} }
@@ -37,10 +45,11 @@
width: fit-content; width: fit-content;
} }
&:root[zen-right-side='true'] #zen-sidebar-top-buttons-customization-target .titlebar-buttonbox-container { &:root[zen-right-side='true'] #zen-sidebar-top-buttons .titlebar-buttonbox-container {
/* Must have the zen-sidebar-top-buttons-customization-target so we target it only when it's on the sidebar */ /* Must have the #zen-sidebar-top-buttons so we target it only when it's on the sidebar */
margin-right: calc(-2 * var(--zen-toolbox-padding)); margin-right: calc(-1 * var(--zen-toolbox-padding));
margin-top: -10px /*Make sure this stays synced with the top buttons' margin!*/; margin-top: -10px /*Make sure this stays synced with the top buttons' margin!*/;
height: calc(4px + var(--zen-toolbar-height)) !important;
& .titlebar-button { & .titlebar-button {
align-items: end; align-items: end;
@@ -48,10 +57,8 @@
} }
} }
#vertical-pinned-tabs-container, #tabbrowser-arrowscrollbox { #tabbrowser-arrowscrollbox {
.tabbrowser-tab[fadein='true'][zen-initial-fadein='true'] { min-height: fit-content !important;
animation: zen-new-tab-appear-vertical 0.2s cubic-bezier(0.4, 0.0, 0.2, 1);
}
} }
} }
@@ -65,7 +72,14 @@
} }
#browser { #browser {
--zen-toolbox-padding: max(5px, calc(var(--zen-element-separation) / 1.5)); --zen-min-toolbox-padding: .4rem;
@media (-moz-platform: macos) {
--zen-min-toolbox-padding: .52rem;
}
@media (-moz-platform: linux) {
--zen-min-toolbox-padding: .35rem;
}
--zen-toolbox-padding: max(var(--zen-min-toolbox-padding), calc(var(--zen-element-separation) / 1.5));
} }
:root[zen-single-toolbar='true'] { :root[zen-single-toolbar='true'] {
@@ -73,17 +87,6 @@
width: -moz-available !important; width: -moz-available !important;
} }
.sharing-icon,
#identity-icon,
.urlbar-icon,
#permissions-granted-icon,
#tracking-protection-icon,
#tracking-protection-icon-box,
#blocked-permissions-container > .blocked-permission-icon {
width: 12px;
height: 12px;
}
#identity-icon-box, #identity-icon-box,
#identity-permission-box { #identity-permission-box {
margin-top: auto; margin-top: auto;
@@ -98,7 +101,7 @@
} }
& #nav-bar { & #nav-bar {
margin-bottom: 6px; margin-bottom: var(--zen-toolbox-padding);
& toolbarspring { & toolbarspring {
display: none; display: none;
@@ -114,23 +117,38 @@
} }
} }
#vertical-pinned-tabs-container-separator { .vertical-pinned-tabs-container-separator {
background: light-dark(rgba(1, 1, 1, 0.075), rgba(255, 255, 255, 0.1)); background: light-dark(rgba(1, 1, 1, 0.075), rgba(255, 255, 255, 0.1));
margin: 8px auto; margin: 8px auto;
border: none; border: none;
height: 1px; height: 1px;
max-height: 1px;
width: 98%; width: 98%;
transition: margin 0.2s ease-in-out, background 0.2s ease-in-out, max-height 0.2s ease-in-out;
#vertical-pinned-tabs-container:not(:has(tab:not([hidden]))) + & { #vertical-pinned-tabs-container .zen-workspace-tabs-section[hide-separator] & {
display: none; max-height: 0;
margin: 0 auto;
} }
} }
#navigator-toolbox { #navigator-toolbox {
--border-radius-medium: 10px; --border-radius-medium: 10px;
--tab-border-radius: 10px; --tab-border-radius: 6px;
--zen-toolbox-min-width: 1px; --zen-toolbox-min-width: 1px;
@media (-moz-platform: windows) {
/* More native look */
--border-radius-medium: 8px;
--tab-border-radius: 6px;
}
@media (-moz-platform: macos) {
/* More native look */
--border-radius-medium: 12px;
--tab-border-radius: 10px;
}
--tab-hover-background-color: color-mix(in srgb, var(--toolbarbutton-hover-background) 50%, transparent 50%); --tab-hover-background-color: color-mix(in srgb, var(--toolbarbutton-hover-background) 50%, transparent 50%);
min-width: var(--zen-toolbox-min-width); min-width: var(--zen-toolbox-min-width);
@@ -220,7 +238,9 @@
#tabbrowser-tabs { #tabbrowser-tabs {
margin-inline-start: 0 !important; margin-inline-start: 0 !important;
padding-inline-start: 0 !important; padding-inline-start: 0 !important;
overflow-x: hidden; overflow-y: unset !important; /* DO NOT CHANGE THIS: Firefox renders badly workspace changes */
overflow-x: clip;
overflow-clip-margin: var(--zen-toolbox-padding);
--tab-inner-inline-margin: 0; --tab-inner-inline-margin: 0;
@@ -228,24 +248,21 @@
border-bottom: 0px solid transparent !important; border-bottom: 0px solid transparent !important;
--tab-block-margin: 2px; --tab-block-margin: 2px;
--tab-selected-bgcolor: var(--zen-toolbar-element-bg); --tab-selected-bgcolor: light-dark(rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.12));
--tab-selected-shadow: 0 1px 1px 1px light-dark(rgba(0, 0, 0, 0.09), rgba(0, 0, 0, 0.1)) !important;
grid-gap: 0 !important; grid-gap: 0 !important;
&[overflow]::after, &[overflow]::after,
#vertical-tabs-newtab-button { #vertical-tabs-newtab-button,
#vertical-pinned-tabs-container-separator { /* notice #vertical-pinned-tabs-container-separator is an ID */
/* Hide separator they give us, eww */ /* Hide separator they give us, eww */
display: none !important; display: none !important;
} }
& .tabbrowser-tab { & .tabbrowser-tab {
transition: scale 0.07s ease; transition: scale 0.07s ease;
#tabbrowser-tabs &:not([zen-essential='true']) {
#tabbrowser-tabs[dont-animate-tabs] & {
opacity: 0;
}
}
&:not([zen-essential='true']):active { &:active {
scale: 0.98; scale: 0.98;
} }
@@ -253,7 +270,6 @@
padding: 0 !important; padding: 0 !important;
position: relative; position: relative;
border-radius: var(--border-radius-medium);
& .tab-background { & .tab-background {
overflow: hidden; overflow: hidden;
@@ -276,15 +292,24 @@
/* We have a tab inside a tab, this means, it's a glance tab */ /* We have a tab inside a tab, this means, it's a glance tab */
& .tabbrowser-tab { & .tabbrowser-tab {
border-radius: 5px;
pointer-events: none; pointer-events: none;
margin: 0; margin: 0 0 0 4px;
--toolbarbutton-inner-padding: 0; --toolbarbutton-inner-padding: 0;
--border-radius-medium: 8px;
width: 24px;
height: 24px;
--tab-min-height: 24px;
--tab-min-width: 24px;
& .tab-background { & .tab-background {
background: transparent; background: var(--zen-toolbar-element-bg) !important;
margin-block: 0 !important;
margin-inline: 0 !important;
box-shadow: none !important; box-shadow: none !important;
} }
& .tab-content {
padding: 0 5px;
}
& label { display: none !important; } & label { display: none !important; }
& .tab-close-button, & .tab-close-button,
& .tab-reset-button { & .tab-reset-button {
@@ -293,16 +318,18 @@
& .tab-icon-image { & .tab-icon-image {
--toolbarbutton-inner-padding: 0 !important; --toolbarbutton-inner-padding: 0 !important;
width: 14px;
height: 14px;
} }
} }
/* On essentials, glance tabs are floating */ /* On essentials, glance tabs are floating */
&[zen-essential='true'] .tabbrowser-tab { &[zen-essential='true'] .tabbrowser-tab {
position: absolute; position: absolute;
top: 3px; top: 4px;
right: 5px; right: 4px;
--tab-collapsed-width: 15px; --tab-collapsed-width: 35px;
--tab-min-height: 15px; --tab-min-height: 16px;
width: var(--tab-collapsed-width) !important; width: var(--tab-collapsed-width) !important;
z-index: 1; z-index: 1;
pointer-events: none; pointer-events: none;
@@ -316,6 +343,7 @@
align-items: center; align-items: center;
padding-top: var(--zen-element-separation); padding-top: var(--zen-element-separation);
--toolbarbutton-inner-padding: 5px;
& > toolbarbutton:not(#zen-workspaces-button) { & > toolbarbutton:not(#zen-workspaces-button) {
padding: 0 !important; padding: 0 !important;
@@ -337,11 +365,26 @@
} }
} }
#zen-tabs-wrapper {
min-height: fit-content;
overflow-y: auto;
height: 100%;
scrollbar-width: thin;
}
#zen-browser-tabs-container {
overflow-x: clip !important; /* might break custom css with new design, so let's force it */
position: relative;
}
#vertical-pinned-tabs-container { #vertical-pinned-tabs-container {
padding-inline-end: 0 !important; padding-inline-end: 0 !important;
display: flex !important; display: flex !important;
flex-direction: column; flex-direction: column;
max-height: calc(100vh - 12 * (var(--tab-min-height) + 2 * var(--tab-block-margin))) !important; min-height: fit-content !important;
overflow-x: clip;
overflow-y: visible;
max-height: unset !important;
& .tabbrowser-tab:not(:hover) .tab-background:not([selected]):not([multiselected]) { & .tabbrowser-tab:not(:hover) .tab-background:not([selected]):not([multiselected]) {
background: transparent !important; background: transparent !important;
@@ -398,7 +441,7 @@
width: calc(100% - 10px) !important; width: calc(100% - 10px) !important;
} }
& #zen-current-workspace-indicator-icon[no-icon='true'] { & .zen-current-workspace-indicator-icon[no-icon='true'] {
display: none; display: none;
} }
@@ -449,10 +492,10 @@
bottom: calc(-0.5 * var(--zen-toolbox-padding)); bottom: calc(-0.5 * var(--zen-toolbox-padding));
} }
& > *:not(tabs):not(#search-container):not(#zen-workspaces-button), & > :is(toolbaritem, toolbarbutton):not(#search-container):not(#zen-workspaces-button),
& #tabbrowser-arrowscrollbox-periphery > toolbarbutton { & #tabbrowser-arrowscrollbox-periphery > toolbarbutton {
width: 100% !important; width: 100% !important;
border-radius: var(--tab-border-radius) !important; border-radius: var(--border-radius-medium) !important;
padding-left: var(--toolbarbutton-inner-padding) !important; padding-left: var(--toolbarbutton-inner-padding) !important;
padding-right: var(--toolbarbutton-inner-padding) !important; padding-right: var(--toolbarbutton-inner-padding) !important;
@@ -478,7 +521,7 @@
} }
&:hover { &:hover {
background: var(--toolbarbutton-hover-background) !important; background: var(--toolbarbutton-hover-background);
& image, & image,
label { label {
@@ -529,11 +572,11 @@
#navigator-toolbox:not([zen-sidebar-expanded='true']) { #navigator-toolbox:not([zen-sidebar-expanded='true']) {
max-width: var(--zen-toolbox-max-width) !important; max-width: var(--zen-toolbox-max-width) !important;
min-width: var(--zen-toolbox-max-width) !important; min-width: var(--zen-toolbox-max-width) !important;
& #zen-current-workspace-indicator-name, & .zen-current-workspace-indicator-name,
& .toolbarbutton-text { & .toolbarbutton-text {
display: none !important; display: none !important;
} }
& #zen-current-workspace-indicator { & .zen-current-workspace-indicator {
padding-left: 0; padding-left: 0;
padding-right: 0; padding-right: 0;
display: flex; display: flex;
@@ -555,7 +598,6 @@
justify-content: center; justify-content: center;
max-height: unset !important; max-height: unset !important;
height: fit-content !important; height: fit-content !important;
margin-bottom: var(--zen-element-separation);
} }
& #titlebar { & #titlebar {
display: grid; display: grid;
@@ -683,31 +725,33 @@
/* Mark: Move sidebar to the right */ /* Mark: Move sidebar to the right */
:root[zen-right-side='true'] { :root[zen-right-side='true'] {
& #navigator-toolbox { & #navigator-toolbox {
order: 3 !important; order: 10 !important;
} }
& #zen-sidebar-splitter { & #zen-sidebar-splitter {
order: 2 !important; order: 9 !important;
} }
} }
/* Mark: Override the default tab close button */ /* Mark: Override the default tab close button */
#tabbrowser-tabs { #tabbrowser-tabs {
& .tabbrowser-tab { & .tabbrowser-tab {
&[pinned] .tab-close-button { &[pinned]:not([pending='true']) .tab-close-button {
display: none !important; display: none !important;
} }
&[pinned]:not([zen-essential]):hover .tab-reset-button, &[pinned]:not([pending='true']):not([zen-essential]) {
&[pinned][visuallyselected]:not([zen-essential]) .tab-reset-button { &:hover .tab-reset-button,
display: block; &[visuallyselected] .tab-reset-button {
display: block;
}
} }
&[zen-essential] .tab-reset-button { &[zen-essential] .tab-reset-button {
display: none; display: none;
} }
&:not([pinned]) .tab-reset-button { &:not([pinned][visuallyselected]) .tab-reset-button {
display: none; display: none;
} }
@@ -723,7 +767,7 @@
border-radius: var(--tab-border-radius); border-radius: var(--tab-border-radius);
color: inherit; color: inherit;
fill: currentColor; fill: currentColor;
padding: 6px; padding: var(--tab-close-button-padding);
width: 24px; width: 24px;
height: 24px; height: 24px;
outline: var(--toolbarbutton-outline); outline: var(--toolbarbutton-outline);
@@ -844,10 +888,22 @@
@media (-moz-bool-pref: 'zen.tabs.show-newtab-vertical') { @media (-moz-bool-pref: 'zen.tabs.show-newtab-vertical') {
#tabs-newtab-button { #tabs-newtab-button {
display: flex !important; display: flex !important;
transition: scale 0.1s ease;
& .toolbarbutton-text { & .toolbarbutton-text {
align-items: center; align-items: center;
padding-top: 0; padding-top: 0;
} }
&:active,
&[open] {
scale: 0.98;
}
&[in-urlbar] {
background: var(--tab-selected-bgcolor) !important;
opacity: 1 !important;
box-shadow: var(--tab-selected-shadow);
}
} }
#tabbrowser-arrowscrollbox-periphery { #tabbrowser-arrowscrollbox-periphery {
@@ -892,8 +948,7 @@
transition: max-height 0.3s ease-out; transition: max-height 0.3s ease-out;
opacity: 1; opacity: 1;
grid-template-columns: repeat(auto-fit, minmax(var(--tab-pinned-min-width-expanded), auto)); grid-template-columns: repeat(auto-fit, minmax(var(--tab-pinned-min-width-expanded), auto));
overflow-y: auto; overflow: hidden;
overflow-x: hidden;
scrollbar-width: thin; scrollbar-width: thin;
display: grid; display: grid;
padding: 0; padding: 0;
@@ -903,17 +958,16 @@
--toolbarbutton-inner-padding: 0; --toolbarbutton-inner-padding: 0;
max-width: unset; max-width: unset;
width: 100% !important; width: 100% !important;
border-radius: var(--border-radius-medium);
& .tab-background {
border-radius: var(--border-radius-medium) !important;
transition: background 0.1s ease-in-out;
}
--tab-selected-bgcolor: light-dark(rgba(255, 255, 255, 0.85), rgba(255, 255, 255, 0.2)); --tab-selected-bgcolor: light-dark(rgba(255, 255, 255, 0.85), rgba(255, 255, 255, 0.2));
&[selected] .tab-background { &:not([visuallyselected], [multiselected="true"]) .tab-background {
box-shadow: 0 0 1px 1px light-dark(rgba(0, 0, 0, 0.07), rgba(0, 0, 0, 0.1));
}
&:not([selected], [multiselected="true"]) .tab-background {
background: var(--zen-toolbar-element-bg); background: var(--zen-toolbar-element-bg);
backdrop-filter: none !important;
border: none; border: none;
} }
@@ -935,8 +989,12 @@
margin-inline-end: 0 !important; margin-inline-end: 0 !important;
} }
&:hover .tab-background {
background: var(--tab-selected-bgcolor);
}
@media (-moz-bool-pref: 'zen.theme.essentials-favicon-bg') { @media (-moz-bool-pref: 'zen.theme.essentials-favicon-bg') {
&[selected] .tab-background { &[visuallyselected] .tab-background {
&::after { &::after {
content: ""; content: "";
inset: -50%; inset: -50%;
@@ -953,19 +1011,19 @@
position: relative; position: relative;
&::before { &::before {
background: light-dark(rgba(255, 255, 255, 0.75), rgba(68, 64, 64, 0.75)); background: light-dark(rgba(255, 255, 255, 0.85), rgba(68, 64, 64, 0.85));
margin: 2px; margin: 2px;
border-radius: calc(var(--tab-border-radius) - 2px); border-radius: calc(var(--border-radius-medium) - 2px);
position: absolute; position: absolute;
inset: 0; inset: 0;
z-index: 0; z-index: 0;
content: ""; content: "";
transition: background 0.2s ease-in-out; transition: background 0.1s ease-in-out;
} }
} }
&[selected]:hover .tab-background::before { &[visuallyselected]:hover .tab-background::before {
background: light-dark(rgba(255, 255, 255, 0.70), rgba(68, 64, 64, 0.70)); background: light-dark(rgba(255, 255, 255, 0.80), rgba(68, 64, 64, 0.80));
} }
} }
} }
@@ -1023,3 +1081,66 @@
%include vertical-tabs-topbuttons-fix.css %include vertical-tabs-topbuttons-fix.css
} }
} }
/* Vertical tabs reordering indicators */
#zen-drag-indicator {
--zen-drag-indicator-height: 2px;
--zen-drag-indicator-bg: color-mix(in srgb, var(--zen-primary-color) 50%, light-dark(rgba(0, 0, 0, .85), rgba(255, 255, 255, .95)) 50%);
position: fixed;
z-index: 1000;
background: var(--zen-drag-indicator-bg);
pointer-events: none;
border-radius: 5px;
&::before {
content: "";
position: absolute;
height: calc(2 * var(--zen-drag-indicator-height));
width: calc(2 * var(--zen-drag-indicator-height));
border: var(--zen-drag-indicator-height) solid var(--zen-drag-indicator-bg);
border-radius: 50%;
background: transparent;
}
&[orientation='horizontal'] {
left: calc(var(--indicator-left) + 2 * var(--zen-drag-indicator-height) + 4px);
width: calc(var(--indicator-width) - 2 * var(--zen-drag-indicator-height) - 4px);
height: var(--zen-drag-indicator-height);
transition: top 0.1s ease-out, left 0.1s ease-out, width 0.1s ease-out;
&::before {
left: calc(-2 * var(--zen-drag-indicator-height));
top: 50%;
transform: translate(calc(-1 * var(--zen-drag-indicator-height)), -50%);
}
}
&[orientation='vertical'] {
top: calc(var(--indicator-top) + 2 * var(--zen-drag-indicator-height) + 4px);
height: calc(var(--indicator-height) - 2 * var(--zen-drag-indicator-height) - 4px);
width: var(--zen-drag-indicator-height);
transition: top 0.1s ease-out, left 0.1s ease-out, height 0.1s ease-out;
&::before {
top: calc(-2 * var(--zen-drag-indicator-height));
left: 50%;
transform: translate(-50%, calc(-1 * var(--zen-drag-indicator-height)));
}
}
}
/* Horizontal tabs reordering indicators */
#zen-essentials-container .tabbrowser-tab.drag-over-before {
box-shadow: 3px 0 6px -2px var(--toolbarbutton-active-background, rgba(0, 255, 0, 0.2));
}
#zen-essentials-container .tabbrowser-tab.drag-over-after {
box-shadow: -3px 0 6px -2px var(--toolbarbutton-active-background, rgba(0, 255, 0, 0.2));
}
/* Section: tab workspaces stylings */
.zen-workspace-tabs-section {
position: absolute;
transform: translateX(-100%);
min-width: 100%;
}

View File

@@ -104,7 +104,7 @@
--zen-button-border-radius: 5px; --zen-button-border-radius: 5px;
--zen-button-padding: 0.6rem 1.2rem; --zen-button-padding: 0.6rem 1.2rem;
--zen-toolbar-element-bg: light-dark(rgba(0, 0, 0, 0.06), rgba(255, 255, 255, 0.11)); --zen-toolbar-element-bg: light-dark(rgba(0, 0, 0, 0.07), rgba(255, 255, 255, 0.11));
/* Toolbar */ /* Toolbar */
--zen-toolbar-height: 38px; --zen-toolbar-height: 38px;
@@ -131,6 +131,8 @@
--toolbarbutton-border-radius: 6px; --toolbarbutton-border-radius: 6px;
--urlbar-margin-inline: 1px !important; --urlbar-margin-inline: 1px !important;
--tab-icon-overlay-stroke: light-dark(white, black) !important;
--fp-contextmenu-border-radius: 8px; --fp-contextmenu-border-radius: 8px;
--fp-contextmenu-padding: calc(4px - var(--fp-contextmenu-menuitem-border-width)) 0; --fp-contextmenu-padding: calc(4px - var(--fp-contextmenu-menuitem-border-width)) 0;
--fp-contextmenu-menuitem-border-radius: calc(4px + var(--fp-contextmenu-menuitem-border-width)); --fp-contextmenu-menuitem-border-radius: calc(4px + var(--fp-contextmenu-menuitem-border-width));
@@ -146,52 +148,61 @@
--fp-contextmenu-bgcolor: light-dark(Menu, rgb(43 42 51 / 0.95)); --fp-contextmenu-bgcolor: light-dark(Menu, rgb(43 42 51 / 0.95));
--toolbar-bgcolor: transparent; --toolbar-bgcolor: transparent;
--toolbarbutton-active-background: light-dark( --tab-close-button-padding: 5px !important;
rgba(255, 255, 255, 0.9),
color-mix(in srgb, var(--zen-primary-color) 50%, rgba(255, 255, 255, 0.1)) --toolbarbutton-active-background: var(--zen-toolbar-element-bg);
);
--input-bgcolor: var(--zen-colors-tertiary) !important; --input-bgcolor: var(--zen-colors-tertiary) !important;
--input-border-color: var(--zen-input-border-color) !important; --input-border-color: var(--zen-input-border-color) !important;
--zen-themed-toolbar-bg: light-dark(var(--zen-branding-bg), #161616); --zen-themed-toolbar-bg: light-dark(var(--zen-branding-bg), #161616);
--zen-themed-toolbar-bg-transparent: light-dark(var(--zen-branding-bg), #161616); --zen-themed-toolbar-bg-transparent: light-dark(var(--zen-branding-bg), #161616);
--zen-workspace-indicator-height: 45px;
@media (-moz-windows-mica) or (-moz-platform: macos) { @media (-moz-windows-mica) or (-moz-platform: macos) {
background: transparent; background: transparent;
--zen-themed-toolbar-bg-transparency: 0; --zen-themed-toolbar-bg-transparency: 0;
--zen-themed-toolbar-bg-transparent: light-dark( @media (-moz-bool-pref: 'zen.widget.windows.acrylic') {
rgba(255, 255, 255, var(--zen-themed-toolbar-bg-transparency)), --zen-themed-toolbar-bg-transparency: 15%;
rgba(0, 0, 0, var(--zen-themed-toolbar-bg-transparency)) }
--zen-themed-toolbar-bg-transparent: color-mix(
in srgb,
var(--zen-themed-toolbar-bg) calc(100% - var(--zen-themed-toolbar-bg-transparency)),
transparent var(--zen-themed-toolbar-bg-transparency)
); );
} }
--toolbar-field-background-color: var(--zen-colors-input-bg) !important; --toolbar-field-background-color: var(--zen-colors-input-bg) !important;
--arrowpanel-background: var(--zen-dialog-background) !important; --arrowpanel-background: var(--zen-dialog-background) !important;
--tab-selected-shadow: none !important;
--zen-big-shadow: 0 0 9.73px 0px light-dark(rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.25)); --zen-big-shadow: 0 0 9.73px 0px light-dark(rgba(0, 0, 0, 0.15), rgba(0, 0, 0, 0.25));
/* Nativity */ /* Nativity */
--zen-native-content-radius: env(-moz-gtk-csd-titlebar-radius, var(--zen-border-radius)); --zen-native-content-radius: var(--zen-border-radius);
@media (-moz-platform: linux) {
--zen-native-content-radius: env(-moz-gtk-csd-titlebar-radius);
}
--zen-native-inner-radius: var( --zen-native-inner-radius: var(
--zen-webview-border-radius, --zen-webview-border-radius,
/* Inner radius calculation: /* Inner radius calculation:
* 1. If the native radius - the separation is less than 4px, use 4px. * 1. If the native radius - the separation is less than 4px, use 4px.
* 2. Otherwise, use the the calculated value (inner radius = outer radius - separation). * 2. Otherwise, use the the calculated value (inner radius = outer radius - separation).
*/ */
max(4px, calc(var(--zen-native-content-radius) - var(--zen-element-separation))) max(5px, calc(var(--zen-native-content-radius) - var(--zen-element-separation) / 2))
); );
/** Other theme-related styles */ /** Other theme-related styles */
font-family: @media (-moz-platform: macos) {
SF Pro, font-family:
ui-sans-serif, SF Pro,
system-ui, ui-sans-serif,
sans-serif, system-ui,
Apple Color Emoji, sans-serif,
Segoe UI Emoji, Apple Color Emoji,
Segoe UI Symbol, Segoe UI Emoji,
Noto Color Emoji; Segoe UI Symbol,
Noto Color Emoji;
}
} }
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
@@ -207,7 +218,7 @@
--zen-colors-primary-foreground: color-mix(in srgb, var(--zen-primary-color) 80%, white 20%); --zen-colors-primary-foreground: color-mix(in srgb, var(--zen-primary-color) 80%, white 20%);
--zen-colors-input-bg: color-mix(in srgb, var(--zen-primary-color) 1%, var(--zen-dark-color-mix-base) 99%); --zen-colors-input-bg: color-mix(in srgb, var(--zen-primary-color) 1%, var(--zen-dark-color-mix-base) 99%);
--zen-colors-border: color-mix(in srgb, var(--zen-colors-secondary) 20%, rgb(53, 53, 53) 80%); --zen-colors-border: color-mix(in srgb, var(--zen-colors-secondary) 20%, rgb(79, 79, 79) 80%);
--zen-colors-border-contrast: color-mix(in srgb, var(--zen-colors-secondary) 10%, rgba(255, 255, 255, 0.11) 90%); --zen-colors-border-contrast: color-mix(in srgb, var(--zen-colors-secondary) 10%, rgba(255, 255, 255, 0.11) 90%);
--zen-dialog-background: var(--zen-dark-color-mix-base); --zen-dialog-background: var(--zen-dark-color-mix-base);
@@ -216,33 +227,3 @@
--zen-browser-gradient-base: color-mix(in srgb, var(--zen-primary-color) 30%, var(--zen-dark-color-mix-base) 70%); --zen-browser-gradient-base: color-mix(in srgb, var(--zen-primary-color) 30%, var(--zen-dark-color-mix-base) 70%);
} }
} }
@media (prefers-color-scheme: dark) {
@media (-moz-bool-pref: 'zen.theme.color-prefs.amoled') {
:root {
--zen-dark-color-mix-base: hsl(5 5 5);
--zen-urlbar-background: color-mix(in srgb, var(--zen-primary-color) 4%, rgb(0, 0, 0) 96%);
}
}
@media (-moz-bool-pref: 'zen.theme.color-prefs.colorful') {
:root {
--zen-in-content-dialog-background: rgb(28, 28, 32);
--zen-colors-primary: color-mix(in srgb, var(--zen-primary-color) 50%, black 50%);
--zen-colors-secondary: color-mix(in srgb, var(--zen-primary-color) 40%, black 60%);
--zen-colors-tertiary: color-mix(in srgb, var(--zen-primary-color) 15%, black 85%);
--zen-colors-hover-bg: color-mix(in srgb, var(--zen-primary-color) 90%, black 10%);
--zen-colors-primary-foreground: color-mix(in srgb, var(--zen-primary-color) 80%, white 20%);
--zen-colors-input-bg: color-mix(in srgb, var(--zen-primary-color) 10%, black 80%);
--zen-colors-border: color-mix(in srgb, var(--zen-colors-secondary) 80%, black 20%);
--zen-dialog-background: color-mix(in srgb, var(--zen-primary-color) 10%, black 90%);
--zen-urlbar-background: color-mix(in srgb, var(--zen-primary-color) 8%, rgb(15, 15, 15) 92%);
--zen-browser-gradient-base: color-mix(in srgb, var(--zen-primary-color) 30%, black 70%);
}
}
}

View File

@@ -10,14 +10,18 @@
} }
#urlbar { #urlbar {
--toolbarbutton-border-radius: 10px; --toolbarbutton-border-radius: 8px;
--urlbarView-separator-color: var(--zen-colors-border); --urlbarView-separator-color: light-dark(hsl(0, 0%, 90%), hsl(0, 0%, 20%));
--urlbarView-hover-background: var(--toolbarbutton-hover-background); --urlbarView-hover-background: var(--toolbarbutton-hover-background);
--urlbarView-highlight-background: var(--toolbarbutton-hover-background); --urlbarView-highlight-background: var(--toolbarbutton-hover-background);
border-radius: var(--toolbarbutton-border-radius); border-radius: var(--toolbarbutton-border-radius);
padding: 1px; padding: 1px;
} }
.urlbar-input::placeholder {
text-overflow: ellipsis;
}
#searchbar:focus-within { #searchbar:focus-within {
border-color: transparent !important; border-color: transparent !important;
} }
@@ -28,10 +32,9 @@
#urlbar-background { #urlbar-background {
background: var(--zen-toolbar-element-bg) !important; background: var(--zen-toolbar-element-bg) !important;
border-radius: var(--border-radius-medium);
outline: none !important; outline: none !important;
}
#urlbar-background {
border: none !important; border: none !important;
margin: 1px; margin: 1px;
@@ -118,16 +121,21 @@
} }
#urlbar[breakout-extend='true'] #urlbar-background { #urlbar[breakout-extend='true'] #urlbar-background {
border: 1px solid var(--zen-colors-border) !important; box-shadow:
box-shadow: var(--zen-big-shadow) !important; inset 0 0 0.5px 1px hsla(0, 0%, 100%, 0.1),
/* 2. shadow ring 👇 */ 0 0 0 1px hsla(230, 13%, 9%, 0.075),
/* 3. multiple soft shadows 👇 */ 0 0.3px 0.4px hsla(230, 13%, 9%, 0.02),
0 0.9px 1.5px hsla(230, 13%, 9%, 0.045),
0 6.5px 12px hsla(230, 13%, 9%, 0.1) !important;
backdrop-filter: none !important;
} }
:root[zen-single-toolbar='true'] { :root[zen-single-toolbar='true'] {
.urlbar-page-action:not([open]), .urlbar-page-action:not([open]),
#tracking-protection-icon-container { #tracking-protection-icon-container {
margin-inline-end: calc(-16px - 2 * var(--urlbar-icon-padding)) !important; margin-inline-end: calc(-14px - 2 * var(--urlbar-icon-padding)) !important;
opacity: 0; opacity: 0;
transition: all 0.2s; transition: all 0.1s ease;
} }
#identity-permission-box > *:not(#permissions-granted-icon) { #identity-permission-box > *:not(#permissions-granted-icon) {
@@ -230,9 +238,23 @@ button.popup-notification-dropmarker {
} }
@container urlbar-container (width < 350px) { @container urlbar-container (width < 350px) {
#userContext-icons {
transition: all 0.1s ease;
}
#userContext-label { #userContext-label {
display: none; display: none;
} }
#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;
}
} }
@media (max-width: 550px) { @media (max-width: 550px) {
@@ -270,7 +292,7 @@ button.popup-notification-dropmarker {
#urlbar .urlbar-page-action, #urlbar .urlbar-page-action,
#urlbar #tracking-protection-icon-container, #urlbar #tracking-protection-icon-container,
#urlbar:not([breakout-extend='true']) #identity-box:is(:not(.chromeUI), [pageproxystate='invalid']) #identity-icon-box { #urlbar:not([breakout-extend='true']) #identity-box:is(:not(.chromeUI), [pageproxystate='invalid']) #identity-icon-box {
border-radius: 10px !important; border-radius: 8px !important;
} }
/* Extensions or similar */ /* Extensions or similar */
@@ -369,13 +391,14 @@ button.popup-notification-dropmarker {
/* We cant have a transparent background with a backdrop-filter because on normal websites, /* We cant have a transparent background with a backdrop-filter because on normal websites,
the backdrop woudn't work, we would need to apply a clip-path to the site and that's not recommended the backdrop woudn't work, we would need to apply a clip-path to the site and that's not recommended
due to performance issues */ due to performance issues */
background-color: light-dark(rgb(247, 247, 247), var(--zen-branding-bg)) !important; background-color: light-dark(hsl(0, 0%, 100%), hsl(0, 0%, 14%)) !important;
outline: 1px solid rgba(0, 0, 0, 0.3) !important;
} }
} }
:root[zen-single-toolbar='true'] { :root[zen-single-toolbar='true'] {
#urlbar[open] { #urlbar[open] {
min-width: 30vw; min-width: 35vw;
} }
&[zen-right-side='true'] #urlbar[open]:not([zen-floating-urlbar='true']) { &[zen-right-side='true'] #urlbar[open]:not([zen-floating-urlbar='true']) {
@@ -387,19 +410,24 @@ button.popup-notification-dropmarker {
z-index: 1000; z-index: 1000;
max-width: 45vw; max-width: 45vw;
min-width: 45vw !important; min-width: 45vw !important;
font-size: 1.1em;
--urlbar-container-height: 55px !important; --urlbar-container-height: 55px !important;
--urlbar-margin-inline: 10px !important; --urlbar-margin-inline: 10px !important;
position: absolute; position: absolute;
font-size: 1.15em !important;
@media (-moz-platform: macos) {
font-size: 1.5em !important;
}
top: calc(var(--zen-toolbar-height) * 2) !important; top: calc(var(--zen-toolbar-height) * 2) !important;
--zen-urlbar-center: calc(var(--zen-urlbar-offset, 0px) + 28vw);
:root[zen-right-side='true'] & { :root[zen-right-side='true'] & {
right: 28vw !important; right: var(--zen-urlbar-center) !important;
} }
:root:not([zen-right-side='true']) & { :root:not([zen-right-side='true']) & {
left: 28vw !important; left: var(--zen-urlbar-center) !important;
} }
#urlbar-container:has(&) { #urlbar-container:has(&) {
@@ -470,10 +498,9 @@ button.popup-notification-dropmarker {
} }
&:hover { &:hover {
background-color: light-dark(var(--zen-colors-secondary), var(--zen-colors-primary)) !important; .urlbarView-favicon,
& {
.urlbarView-favicon { background-color: color-mix(in srgb, var(--zen-branding-bg-reverse) 5%, transparent 95%) !important;
background-color: color-mix(in srgb, var(--zen-branding-bg-reverse) 20%, transparent 80%) !important;
} }
.urlbarView-url, .urlbarView-url,

View File

@@ -61,13 +61,16 @@
@media not (-moz-bool-pref: 'zen.workspaces.hide-deactivated-workspaces') { @media not (-moz-bool-pref: 'zen.workspaces.hide-deactivated-workspaces') {
& { & {
opacity: 0.4;
filter: grayscale(1); filter: grayscale(1);
transition: opacity 0.2s; opacity: 0.5;
transition:
filter 0.2s,
opacity 0.2s;
} }
&[active='true'] { &[active='true'],
filter: none; &:hover {
filter: grayscale(0);
opacity: 1; opacity: 1;
} }
} }
@@ -138,14 +141,6 @@
& #zen-workspaces-button .zen-workspace-sidebar-icon { & #zen-workspaces-button .zen-workspace-sidebar-icon {
margin-inline-end: 5px; margin-inline-end: 5px;
& [no-icon='true'] {
display: none;
}
}
& #zen-workspaces-button .zen-workspace-sidebar-icon[no-icon='true'] + .zen-workspace-sidebar-name {
margin-left: 0;
} }
& #zen-workspaces-button { & #zen-workspaces-button {
@@ -428,8 +423,8 @@
min-height: 1px !important; min-height: 1px !important;
padding: 3px; padding: 3px;
border-radius: 4px; border-radius: 4px;
width: 20px; width: 24px;
height: 20px; height: 24px;
} }
#PanelUI-zen-workspaces-create-footer, #PanelUI-zen-workspaces-create-footer,
@@ -451,44 +446,60 @@
} }
/* Mark workspaces indicator */ /* Mark workspaces indicator */
#zen-current-workspace-indicator { #zen-current-workspace-indicator-container {
margin-bottom: var(--zen-workspace-indicator-height);
}
.zen-current-workspace-indicator {
padding: 15px calc(4px + var(--tab-inline-padding)); padding: 15px calc(4px + var(--tab-inline-padding));
font-weight: 600; font-weight: 600;
align-items: center; position: absolute;
position: relative; max-height: var(--zen-workspace-indicator-height);
min-height: var(--zen-workspace-indicator-height);
gap: 12px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
flex-direction: row !important;
& #zen-current-workspace-indicator-icon { &::before {
font-size: 14px; border-radius: var(--border-radius-medium);
background: transparent;
transition: background 0.1s;
pointer-events: none;
content: '';
position: absolute;
top: 4px;
left: 2px;
z-index: -1;
width: calc(100% - 4px);
height: calc(100% - 10px);
} }
#zen-current-workspace-indicator-name { &:hover,
&[open='true'] {
&::before {
background: var(--tab-hover-background-color);
}
}
& .zen-current-workspace-indicator-icon {
font-size: 12px;
}
.zen-current-workspace-indicator-name {
font-size: 13px; font-size: 13px;
opacity: 0.5; opacity: 0.5;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
display: block; display: block;
position: absolute;
max-width: calc(100% - var(--zen-toolbox-padding) * 4);
}
& #zen-current-workspace-indicator-icon {
min-height: 16px;
}
& #zen-current-workspace-indicator-icon:not([hidden]) + #zen-current-workspace-indicator-name {
padding-left: 24px;
} }
} }
@media not (-moz-bool-pref: 'zen.workspaces.show-workspace-indicator') { @media not (-moz-bool-pref: 'zen.workspaces.show-workspace-indicator') {
#zen-current-workspace-indicator { #zen-current-workspace-indicator-container {
display: none !important; display: none !important;
} }
} }
#zen-current-workspace-indicator[hidden='true'] { #zen-current-workspace-indicator-container[hidden='true'] {
display: none !important; display: none !important;
} }

View File

@@ -72,6 +72,21 @@ var gZenCommonActions = {
ConfirmationHint.show(document.getElementById('PanelUI-menu-button'), 'zen-copy-current-url-confirmation'); ConfirmationHint.show(document.getElementById('PanelUI-menu-button'), 'zen-copy-current-url-confirmation');
} }
}, },
copyCurrentURLAsMarkdownToClipboard() {
const currentUrl = gBrowser.currentURI.spec;
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(getLoadContext());
transferable.addDataFlavor('text/plain');
transferable.setTransferData('text/plain', str);
Services.clipboard.setData(transferable, null, Ci.nsIClipboard.kGlobalClipboard);
ConfirmationHint.show(document.getElementById('PanelUI-menu-button'), 'zen-copy-current-url-confirmation');
}
},
throttle(f, delay) { throttle(f, delay) {
let timer = 0; let timer = 0;

View File

@@ -14,18 +14,24 @@ XPCOMUtils.defineLazyPreferenceGetter(
true true
); );
XPCOMUtils.defineLazyPreferenceGetter(
lazyCompactMode,
'COMPACT_MODE_CAN_ANIMATE_SIDEBAR',
'zen.view.compact.animate-sidebar',
true
);
ChromeUtils.defineLazyGetter(lazyCompactMode, 'mainAppWrapper', () => document.getElementById('zen-main-app-wrapper'));
var gZenCompactModeManager = { var gZenCompactModeManager = {
_flashTimeouts: {}, _flashTimeouts: {},
_evenListeners: [], _evenListeners: [],
_removeHoverFrames: {}, _removeHoverFrames: {},
_animating: false,
init() { init() {
Services.prefs.addObserver('zen.tabs.vertical.right-side', this._updateSidebarIsOnRight.bind(this)); Services.prefs.addObserver('zen.tabs.vertical.right-side', this._updateSidebarIsOnRight.bind(this));
ChromeUtils.defineLazyGetter(this, 'mainAppWrapper', () => document.getElementById('zen-main-app-wrapper'));
this._canAnimateSidebar = Services.prefs.getBoolPref('zen.view.compact.animate-sidebar', true);
gZenUIManager.addPopupTrackingAttribute(this.sidebar); gZenUIManager.addPopupTrackingAttribute(this.sidebar);
gZenUIManager.addPopupTrackingAttribute(document.getElementById('zen-appcontent-navbar-container')); gZenUIManager.addPopupTrackingAttribute(document.getElementById('zen-appcontent-navbar-container'));
@@ -35,18 +41,28 @@ var gZenCompactModeManager = {
get preference() { get preference() {
if (!document.documentElement.hasAttribute('zen-compact-mode')) { if (!document.documentElement.hasAttribute('zen-compact-mode')) {
document.documentElement.setAttribute('zen-compact-mode', this.mainAppWrapper.getAttribute('zen-compact-mode')); window.addEventListener(
'MozAfterPaint',
() => {
document.documentElement.setAttribute(
'zen-compact-mode',
lazyCompactMode.mainAppWrapper.getAttribute('zen-compact-mode')
);
},
{ once: true }
);
} }
return this.mainAppWrapper.getAttribute('zen-compact-mode') === 'true'; return lazyCompactMode.mainAppWrapper.getAttribute('zen-compact-mode') === 'true';
}, },
set preference(value) { set preference(value) {
if (this.preference === value) { if (this.preference === value || this._animating) {
// We dont want the user to be able to spam the button
return value; return value;
} }
// We use this element in order to make it persis across restarts, by using the XULStore. // We use this element in order to make it persis across restarts, by using the XULStore.
// main-window can't store attributes other than window sizes, so we use this instead // main-window can't store attributes other than window sizes, so we use this instead
this.mainAppWrapper.setAttribute('zen-compact-mode', value); lazyCompactMode.mainAppWrapper.setAttribute('zen-compact-mode', value);
document.documentElement.setAttribute('zen-compact-mode', value); document.documentElement.setAttribute('zen-compact-mode', value);
this._updateEvent(); this._updateEvent();
return value; return value;
@@ -90,8 +106,6 @@ var gZenCompactModeManager = {
}, },
updateCompactModeContext(isSingleToolbar) { updateCompactModeContext(isSingleToolbar) {
this.getAndApplySidebarWidth(); // Ignore return value
const IDs = [ const IDs = [
'zen-context-menu-compact-mode-hide-sidebar', 'zen-context-menu-compact-mode-hide-sidebar',
'zen-context-menu-compact-mode-hide-toolbar', 'zen-context-menu-compact-mode-hide-toolbar',
@@ -130,22 +144,32 @@ var gZenCompactModeManager = {
getAndApplySidebarWidth() { getAndApplySidebarWidth() {
let sidebarWidth = this.sidebar.getBoundingClientRect().width; let sidebarWidth = this.sidebar.getBoundingClientRect().width;
if (sidebarWidth > 1) { if (sidebarWidth > 1) {
gZenUIManager.restoreScrollbarState();
this.sidebar.style.setProperty('--zen-sidebar-width', `${sidebarWidth}px`); this.sidebar.style.setProperty('--zen-sidebar-width', `${sidebarWidth}px`);
} }
return sidebarWidth; return sidebarWidth;
}, },
animateCompactMode() { animateCompactMode() {
this._animating = true;
const isCompactMode = this.preference; const isCompactMode = this.preference;
const canHideSidebar = Services.prefs.getBoolPref('zen.view.compact.hide-tabbar'); const canHideSidebar = Services.prefs.getBoolPref('zen.view.compact.hide-tabbar');
const canAnimate =
lazyCompactMode.COMPACT_MODE_CAN_ANIMATE_SIDEBAR &&
!this.sidebar.hasAttribute('zen-user-show') &&
!this.sidebar.hasAttribute('zen-has-hover');
// Do this so we can get the correct width ONCE compact mode styled have been applied // Do this so we can get the correct width ONCE compact mode styled have been applied
if (this._canAnimateSidebar) { if (canAnimate) {
this.sidebar.setAttribute('animate', 'true'); this.sidebar.setAttribute('animate', 'true');
} }
this.sidebar.style.removeProperty('margin-right');
this.sidebar.style.removeProperty('margin-left');
this.sidebar.style.removeProperty('transform');
window.requestAnimationFrame(() => { window.requestAnimationFrame(() => {
let sidebarWidth = this.getAndApplySidebarWidth(); let sidebarWidth = this.getAndApplySidebarWidth();
if (!this._canAnimateSidebar) { if (!canAnimate) {
this.sidebar.removeAttribute('animate'); this.sidebar.removeAttribute('animate');
this._animating = false;
return; return;
} }
if (canHideSidebar && isCompactMode) { if (canHideSidebar && isCompactMode) {
@@ -160,23 +184,23 @@ var gZenCompactModeManager = {
{ {
ease: 'easeIn', ease: 'easeIn',
type: 'spring', type: 'spring',
stiffness: 3000, bounce: 0,
damping: 150, duration: 0.2,
mass: 1,
} }
) )
.then(() => { .then(() => {
this.sidebar.removeAttribute('animate'); this.sidebar.removeAttribute('animate');
this.sidebar.style.transition = 'none';
this.sidebar.style.removeProperty('margin-right'); this.sidebar.style.removeProperty('margin-right');
this.sidebar.style.removeProperty('margin-left'); this.sidebar.style.removeProperty('margin-left');
this.sidebar.style.removeProperty('transform'); this.sidebar.style.removeProperty('transform');
this.sidebar.style.transition = 'none';
setTimeout(() => { setTimeout(() => {
this._animating = false;
this.sidebar.style.removeProperty('transition'); this.sidebar.style.removeProperty('transition');
}); });
}); });
} else if (canHideSidebar && !isCompactMode) { } else if (canHideSidebar && !isCompactMode) {
document.getElementById('browser').style.overflow = 'hidden'; document.getElementById('browser').style.overflow = 'clip';
if (this.sidebarIsOnRight) { if (this.sidebarIsOnRight) {
this.sidebar.style.marginRight = `-${sidebarWidth}px`; this.sidebar.style.marginRight = `-${sidebarWidth}px`;
} else { } else {
@@ -187,16 +211,15 @@ var gZenCompactModeManager = {
this.sidebar, this.sidebar,
this.sidebarIsOnRight this.sidebarIsOnRight
? { ? {
marginRight: 0, marginRight: [`-${sidebarWidth}px`, 0],
transform: ['translateX(100%)', 'translateX(0)'], transform: ['translateX(100%)', 'translateX(0)'],
} }
: { marginLeft: 0 }, : { marginLeft: 0 },
{ {
ease: 'easeOut', ease: 'easeOut',
type: 'spring', type: 'spring',
stiffness: 3000, bounce: 0,
damping: 150, duration: 0.2,
mass: 1,
} }
) )
.then(() => { .then(() => {
@@ -206,12 +229,14 @@ var gZenCompactModeManager = {
this.sidebar.style.removeProperty('margin-right'); this.sidebar.style.removeProperty('margin-right');
this.sidebar.style.removeProperty('margin-left'); this.sidebar.style.removeProperty('margin-left');
this.sidebar.style.removeProperty('transform'); this.sidebar.style.removeProperty('transform');
this._animating = false;
setTimeout(() => { setTimeout(() => {
this.sidebar.style.removeProperty('transition'); this.sidebar.style.removeProperty('transition');
}); });
}); });
} else { } else {
this.sidebar.removeAttribute('animate'); // remove the attribute if we are not animating this.sidebar.removeAttribute('animate'); // remove the attribute if we are not animating
this._animating = false;
} }
}); });
}, },
@@ -219,8 +244,8 @@ var gZenCompactModeManager = {
updateContextMenu() { updateContextMenu() {
document.getElementById('zen-context-menu-compact-mode-toggle').setAttribute('checked', this.preference); document.getElementById('zen-context-menu-compact-mode-toggle').setAttribute('checked', this.preference);
const hideTabBar = Services.prefs.getBoolPref('zen.view.compact.hide-tabbar'); const hideTabBar = Services.prefs.getBoolPref('zen.view.compact.hide-tabbar', false);
const hideToolbar = Services.prefs.getBoolPref('zen.view.compact.hide-toolbar'); const hideToolbar = Services.prefs.getBoolPref('zen.view.compact.hide-toolbar', false);
const hideBoth = hideTabBar && hideToolbar; const hideBoth = hideTabBar && hideToolbar;
const idName = 'zen-context-menu-compact-mode-hide-'; const idName = 'zen-context-menu-compact-mode-hide-';
@@ -323,7 +348,7 @@ var gZenCompactModeManager = {
return; return;
} }
if (this.hoverableElements[i].keepHoverDuration) { if (this.hoverableElements[i].keepHoverDuration && !event.target.querySelector('#urlbar[zen-floating-urlbar]')) {
this.flashElement(target, this.hoverableElements[i].keepHoverDuration, 'has-hover' + target.id, 'zen-has-hover'); this.flashElement(target, this.hoverableElements[i].keepHoverDuration, 'has-hover' + target.id, 'zen-has-hover');
} else { } else {
this._removeHoverFrames[target.id] = window.requestAnimationFrame(() => target.removeAttribute('zen-has-hover')); this._removeHoverFrames[target.id] = window.requestAnimationFrame(() => target.removeAttribute('zen-has-hover'));

View File

@@ -1,14 +1,22 @@
{ {
class ZenGlanceManager extends ZenDOMOperatedFeature { class ZenGlanceManager extends ZenDOMOperatedFeature {
#currentBrowser = null;
#currentTab = null;
_animating = false; _animating = false;
_lazyPref = {};
#glances = new Map();
#currentGlanceID = null;
init() { init() {
document.documentElement.setAttribute('zen-glance-uuid', gZenUIManager.generateUuidv4());
window.addEventListener('keydown', this.onKeyDown.bind(this)); window.addEventListener('keydown', this.onKeyDown.bind(this));
window.addEventListener('TabClose', this.onTabClose.bind(this)); window.addEventListener('TabClose', this.onTabClose.bind(this));
window.addEventListener('TabSelect', this.onLocationChange.bind(this));
XPCOMUtils.defineLazyPreferenceGetter(
this._lazyPref,
'SHOULD_OPEN_EXTERNAL_TABS_IN_GLANCE',
'zen.glance.open-essential-external-links',
false
);
ChromeUtils.defineLazyGetter(this, 'sidebarButtons', () => document.getElementById('zen-glance-sidebar-container')); ChromeUtils.defineLazyGetter(this, 'sidebarButtons', () => document.getElementById('zen-glance-sidebar-container'));
@@ -17,17 +25,29 @@
Services.obs.addObserver(this, 'quit-application-requested'); Services.obs.addObserver(this, 'quit-application-requested');
} }
get #currentBrowser() {
return this.#glances.get(this.#currentGlanceID)?.browser;
}
get #currentTab() {
return this.#glances.get(this.#currentGlanceID)?.tab;
}
get #currentParentTab() {
return this.#glances.get(this.#currentGlanceID)?.parentTab;
}
onKeyDown(event) { onKeyDown(event) {
if (event.key === 'Escape' && this.#currentBrowser) { if (event.key === 'Escape' && this.#currentGlanceID) {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
this.closeGlance(); this.closeGlance({ onTabClose: true });
} }
} }
onOverlayClick(event) { onOverlayClick(event) {
if (event.target === this.overlay && event.originalTarget !== this.contentWrapper) { if (event.target === this.overlay && event.originalTarget !== this.contentWrapper) {
this.closeGlance(); this.closeGlance({ onTabClose: true });
} }
} }
@@ -41,34 +61,74 @@
onUnload() { onUnload() {
// clear everything // clear everything
if (this.#currentBrowser) { for (let [id, glance] of this.#glances) {
gBrowser.removeTab(this.#currentTab); gBrowser.removeTab(glance.tab, { animate: false });
} }
} }
createBrowserElement(url, currentTab) { getTabPosition(tab) {
return Math.max(gBrowser._numVisiblePinTabs, tab._tPos);
}
createBrowserElement(url, currentTab, existingTab = null) {
const newTabOptions = { const newTabOptions = {
userContextId: currentTab.getAttribute('usercontextid') || '', userContextId: currentTab.getAttribute('usercontextid') || '',
skipBackgroundNotify: true, skipBackgroundNotify: true,
insertTab: true, insertTab: true,
skipLoad: false, skipLoad: false,
index: currentTab._tPos + 1, index: this.getTabPosition(currentTab),
}; };
this.currentParentTab = currentTab; currentTab._selected = true;
const newTab = gBrowser.addTrustedTab(Services.io.newURI(url).spec, newTabOptions); const newUUID = gZenUIManager.generateUuidv4();
const newTab = existingTab ?? gBrowser.addTrustedTab(Services.io.newURI(url).spec, newTabOptions);
gBrowser.selectedTab = newTab; if (currentTab.hasAttribute('zenDefaultUserContextId')) {
newTab.setAttribute('zenDefaultUserContextId', true);
}
currentTab.querySelector('.tab-content').appendChild(newTab); currentTab.querySelector('.tab-content').appendChild(newTab);
newTab.setAttribute('zen-glance-tab', true); newTab.setAttribute('zen-glance-tab', true);
this.#currentBrowser = newTab.linkedBrowser; newTab.setAttribute('glance-id', newUUID);
this.#currentTab = newTab; currentTab.setAttribute('glance-id', newUUID);
this.#glances.set(newUUID, {
tab: newTab,
parentTab: currentTab,
browser: newTab.linkedBrowser,
});
this.#currentGlanceID = newUUID;
gBrowser.selectedTab = newTab;
return this.#currentBrowser; return this.#currentBrowser;
} }
openGlance(data) { fillOverlay(browser) {
this.overlay = browser.closest('.browserSidebarContainer');
this.browserWrapper = browser.closest('.browserContainer');
this.contentWrapper = browser.closest('.browserStack');
}
showSidebarButtons(animate = false) {
if (this.sidebarButtons.hasAttribute('hidden') && animate) {
gZenUIManager.motion.animate(
this.sidebarButtons.querySelectorAll('toolbarbutton'),
{ x: [50, 0], opacity: [0, 1] },
{ delay: gZenUIManager.motion.stagger(0.1) }
);
}
this.sidebarButtons.removeAttribute('hidden');
}
hideSidebarButtons() {
this.sidebarButtons.setAttribute('hidden', true);
}
openGlance(data, existingTab = null, ownerTab = null) {
if (this.#currentBrowser) { if (this.#currentBrowser) {
return; return;
} }
if (gBrowser.selectedTab === this.#currentParentTab) {
gBrowser.selectedTab = this.#currentTab;
return;
}
this.animatingOpen = true;
this._animating = true;
const initialX = data.x; const initialX = data.x;
const initialY = data.y; const initialY = data.y;
@@ -78,54 +138,72 @@
this.browserWrapper?.removeAttribute('animate'); this.browserWrapper?.removeAttribute('animate');
this.browserWrapper?.removeAttribute('animate-end'); this.browserWrapper?.removeAttribute('animate-end');
this.browserWrapper?.removeAttribute('animate-full'); this.browserWrapper?.removeAttribute('animate-full');
this.browserWrapper?.removeAttribute('animate-full-end');
this.browserWrapper?.removeAttribute('has-finished-animation'); this.browserWrapper?.removeAttribute('has-finished-animation');
this.overlay?.removeAttribute('post-fade-out'); this.overlay?.removeAttribute('post-fade-out');
const url = data.url; const currentTab = ownerTab ?? gBrowser.selectedTab;
const currentTab = gBrowser.selectedTab;
this.animatingOpen = true; const browserElement = this.createBrowserElement(data.url, currentTab, existingTab);
this._animating = true;
const browserElement = this.createBrowserElement(url, currentTab); this.fillOverlay(browserElement);
this.overlay = browserElement.closest('.browserSidebarContainer');
this.browserWrapper = browserElement.closest('.browserContainer');
this.contentWrapper = browserElement.closest('.browserStack');
this.browserWrapper.prepend(this.sidebarButtons);
this.overlay.classList.add('zen-glance-overlay'); this.overlay.classList.add('zen-glance-overlay');
this.browserWrapper.removeAttribute('animate-end'); this.browserWrapper.removeAttribute('animate-end');
window.requestAnimationFrame(() => { window.requestAnimationFrame(() => {
this.quickOpenGlance(); this.quickOpenGlance({ dontOpenButtons: true });
this.showSidebarButtons(true);
gZenUIManager.motion.animate(
this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer'),
{
scale: [1, 0.98],
backdropFilter: ['blur(0px)', 'blur(5px)'],
opacity: [1, 0.5],
},
{
duration: 0.4,
type: 'spring',
bounce: 0.2,
}
);
this.#currentBrowser.setAttribute('animate-glance-open', true);
this.overlay.removeAttribute('fade-out'); this.overlay.removeAttribute('fade-out');
this.browserWrapper.setAttribute('animate', true); this.browserWrapper.setAttribute('animate', true);
this.browserWrapper.style.top = `${initialY}px`; const top = initialY + initialHeight / 2;
this.browserWrapper.style.left = `${initialX}px`; 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.width = `${initialWidth}px`;
this.browserWrapper.style.height = `${initialHeight}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 gZenUIManager.motion
.animate( .animate(
this.browserWrapper, this.browserWrapper,
{ {
top: [`${initialY}px`, '50%'], top: '50%',
left: [`${initialX}px`, '50%'], left: '50%',
width: [`${initialWidth}px`, '85%'], width: '85%',
height: [`${initialHeight}px`, '100%'], height: '100%',
opacity: [0.8, 1], opacity: 1,
}, },
{ {
duration: 0.5, duration: 0.3,
ease: 'easeIn',
type: 'spring', type: 'spring',
bounce: 0.25, bounce: 0.2,
} }
) )
.then(() => { .then(() => {
this.#currentBrowser.removeAttribute('animate-glance-open');
this.overlay.style.removeProperty('overflow');
this.browserWrapper.removeAttribute('animate'); this.browserWrapper.removeAttribute('animate');
this.browserWrapper.setAttribute('animate-end', true); this.browserWrapper.setAttribute('animate-end', true);
this.browserWrapper.setAttribute('has-finished-animation', true); this.browserWrapper.setAttribute('has-finished-animation', true);
@@ -135,190 +213,314 @@
}); });
} }
closeGlance({ noAnimation = false, onTabClose = false } = {}) { closeGlance({ noAnimation = false, onTabClose = false, setNewID = null, isDifferent = false } = {}) {
if (this._animating || !this.#currentBrowser || this.animatingOpen || this._duringOpening) { if (this._animating || !this.#currentBrowser || this.animatingOpen || this._duringOpening) {
return; return;
} }
this.browserWrapper.removeAttribute('has-finished-animation'); this.browserWrapper.removeAttribute('has-finished-animation');
if (noAnimation) { if (noAnimation) {
this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer').removeAttribute('style');
this.quickCloseGlance({ closeCurrentTab: false }); this.quickCloseGlance({ closeCurrentTab: false });
this.#currentBrowser = null;
this.#currentTab = null;
return; return;
} }
this.closingGlance = true;
this._animating = true; this._animating = true;
gBrowser._insertTabAtIndex(this.#currentTab, { gBrowser._insertTabAtIndex(this.#currentTab, {
index: this.currentParentTab._tPos + 1, index: this.getTabPosition(this.#currentParentTab),
}); });
let quikcCloseZen = false; let quikcCloseZen = false;
if (onTabClose) { if (onTabClose) {
// Create new tab if no more ex // Create new tab if no more ex
if (gBrowser.tabs.length === 1) { if (gBrowser.tabs.length === 1) {
gBrowser.selectedTab = gZenUIManager.openAndChangeToTab(Services.prefs.getStringPref('browser.startup.homepage')); BrowserCommands.openTab();
return; return;
} else if (gBrowser.selectedTab === this.#currentTab) {
this._duringOpening = true;
gBrowser.tabContainer.advanceSelectedTab(1, true); // to skip the current tab
this._duringOpening = false;
quikcCloseZen = true;
} }
} }
// do NOT touch here, I don't know what it does, but it works... // do NOT touch here, I don't know what it does, but it works...
window.requestAnimationFrame(() => { this.#currentTab.style.display = 'none';
this.#currentTab.style.display = 'none'; this.overlay.setAttribute('fade-out', true);
this.browserWrapper.removeAttribute('animate'); this.overlay.style.pointerEvents = 'none';
this.browserWrapper.removeAttribute('animate-end'); this.quickCloseGlance({ justAnimateParent: true, clearID: false });
this.overlay.setAttribute('fade-out', true); const originalPosition = this.#glances.get(this.#currentGlanceID).originalPosition;
window.requestAnimationFrame(() => { gZenUIManager.motion
this.quickCloseGlance({ justAnimateParent: true }); .animate(
this.browserWrapper.setAttribute('animate', true); this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer'),
setTimeout(() => { {
if (!this.currentParentTab) { scale: [0.98, 1],
return; backdropFilter: ['blur(5px)', 'blur(0px)'],
} opacity: [0.5, 1],
},
if (!onTabClose || quikcCloseZen) { {
this.quickCloseGlance(); duration: 0.4,
} type: 'spring',
this.overlay.removeAttribute('fade-out'); bounce: 0.2,
this.browserWrapper.removeAttribute('animate'); }
)
this.lastCurrentTab = this.#currentTab; .then(() => {
this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer').removeAttribute('style');
this.overlay.classList.remove('zen-glance-overlay'); });
gBrowser._getSwitcher().setTabStateNoAction(this.lastCurrentTab, gBrowser.AsyncTabSwitcher.STATE_UNLOADED); gZenUIManager.motion
.animate(
if (!onTabClose && gBrowser.selectedTab === this.lastCurrentTab) { this.browserWrapper,
this._duringOpening = true; {
gBrowser.selectedTab = this.currentParentTab; ...originalPosition,
} opacity: 0.3,
},
// reset everything { type: 'spring', bounce: 0, duration: 0.4, easing: 'ease' }
this.currentParentTab = null; )
this.browserWrapper = null; .then(() => {
this.overlay = null; this.browserWrapper.removeAttribute('animate');
this.contentWrapper = null; this.browserWrapper.removeAttribute('animate-end');
if (!this.#currentParentTab) {
this.lastCurrentTab.removeAttribute('zen-glance-tab'); return;
this.lastCurrentTab._closingGlance = true; }
gBrowser.tabContainer._invalidateCachedTabs(); if (!onTabClose || quikcCloseZen) {
gBrowser.removeTab(this.lastCurrentTab, { animate: true }); this.quickCloseGlance({ clearID: false });
}
this.#currentTab = null; this.overlay.removeAttribute('fade-out');
this.#currentBrowser = null; this.browserWrapper.removeAttribute('animate');
this.lastCurrentTab = null; this.lastCurrentTab = this.#currentTab;
this._duringOpening = false;
this.overlay.classList.remove('zen-glance-overlay');
this._animating = false; gBrowser._getSwitcher().setTabStateNoAction(this.lastCurrentTab, gBrowser.AsyncTabSwitcher.STATE_UNLOADED);
}, 400);
if (!onTabClose) {
this.#currentParentTab._visuallySelected = false;
}
// reset everything
const prevOverlay = this.overlay;
this.browserWrapper = null;
this.overlay = null;
this.contentWrapper = null;
this.lastCurrentTab.removeAttribute('zen-glance-tab');
this.lastCurrentTab._closingGlance = true;
if (!isDifferent) {
gBrowser.selectedTab = this.#currentParentTab;
}
this._ignoreClose = true;
gBrowser.removeTab(this.lastCurrentTab, { animate: true });
gBrowser.tabContainer._invalidateCachedTabs();
this.#currentParentTab.removeAttribute('glance-id');
this.#glances.delete(this.#currentGlanceID);
this.#currentGlanceID = setNewID;
this.lastCurrentTab = null;
this._duringOpening = false;
this._animating = false;
this.closingGlance = false;
if (this.#currentGlanceID) {
this.quickOpenGlance();
}
}); });
});
} }
quickOpenGlance() { quickOpenGlance({ dontOpenButtons = false } = {}) {
if (!this.#currentBrowser || this._duringOpening) { if (!this.#currentBrowser || this._duringOpening) {
return; return;
} }
this._duringOpening = true; this._duringOpening = true;
try { if (!dontOpenButtons) {
gBrowser.selectedTab = this.#currentTab; this.showSidebarButtons();
} catch (e) {} }
this.currentParentTab.linkedBrowser const parentBrowserContainer = this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer');
.closest('.browserSidebarContainer') parentBrowserContainer.classList.add('zen-glance-background');
.classList.add('deck-selected', 'zen-glance-background'); parentBrowserContainer.classList.remove('zen-glance-overlay');
this.currentParentTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('zen-glance-overlay'); parentBrowserContainer.classList.add('deck-selected');
this.currentParentTab.linkedBrowser.zenModeActive = true; this.#currentParentTab.linkedBrowser.zenModeActive = true;
this.#currentParentTab.linkedBrowser.docShellIsActive = true;
this.#currentBrowser.zenModeActive = true; this.#currentBrowser.zenModeActive = true;
this.currentParentTab.linkedBrowser.docShellIsActive = true;
this.#currentBrowser.docShellIsActive = true; this.#currentBrowser.docShellIsActive = true;
this.#currentBrowser.setAttribute('zen-glance-selected', true); this.#currentBrowser.setAttribute('zen-glance-selected', true);
this.fillOverlay(this.#currentBrowser);
this.#currentParentTab._visuallySelected = true;
this.currentParentTab._visuallySelected = true;
this.overlay.classList.add('deck-selected'); this.overlay.classList.add('deck-selected');
this.overlay.classList.add('zen-glance-overlay');
this._duringOpening = false; this._duringOpening = false;
} }
quickCloseGlance({ closeCurrentTab = true, closeParentTab = true, justAnimateParent = false } = {}) { quickCloseGlance({ closeCurrentTab = true, closeParentTab = true, justAnimateParent = false, clearID = true } = {}) {
const parentHasBrowser = !!this.currentParentTab.linkedBrowser; const parentHasBrowser = !!this.#currentParentTab.linkedBrowser;
if (!justAnimateParent) { this.hideSidebarButtons();
if (parentHasBrowser) {
this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('zen-glance-background');
}
if (!justAnimateParent && this.overlay) {
if (parentHasBrowser) { if (parentHasBrowser) {
if (closeParentTab) { if (closeParentTab) {
this.currentParentTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('deck-selected'); this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('deck-selected');
} }
this.currentParentTab.linkedBrowser.zenModeActive = false; this.#currentParentTab.linkedBrowser.zenModeActive = false;
} }
this.#currentBrowser.zenModeActive = false; this.#currentBrowser.zenModeActive = false;
if (closeParentTab && parentHasBrowser) { if (closeParentTab && parentHasBrowser) {
this.currentParentTab.linkedBrowser.docShellIsActive = false; this.#currentParentTab.linkedBrowser.docShellIsActive = false;
} }
if (closeCurrentTab) { if (closeCurrentTab) {
this.#currentBrowser.docShellIsActive = false; this.#currentBrowser.docShellIsActive = false;
this.overlay.classList.remove('deck-selected'); this.overlay.classList.remove('deck-selected');
this.#currentTab._selected = false;
} }
if (!this.currentParentTab._visuallySelected && closeParentTab) { if (!this.#currentParentTab._visuallySelected && closeParentTab) {
this.currentParentTab._visuallySelected = false; this.#currentParentTab._visuallySelected = false;
} }
this.#currentBrowser.removeAttribute('zen-glance-selected'); this.#currentBrowser.removeAttribute('zen-glance-selected');
this.overlay.classList.remove('zen-glance-overlay');
} }
if (parentHasBrowser) { if (clearID) {
this.currentParentTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('zen-glance-background'); this.#currentGlanceID = null;
} }
} }
onLocationChange(_) { onLocationChangeOpenGlance() {
if (this._duringOpening) { if (!this.animatingOpen) {
this.quickOpenGlance();
}
}
// note: must be async to avoid timing issues
onLocationChange(event) {
const tab = event.target;
if (this.animatingFullOpen || this.closingGlance) {
return; return;
} }
if (gBrowser.selectedTab === this.#currentTab && !this.animatingOpen && !this._duringOpening && this.#currentBrowser) { if (this._duringOpening || !tab.hasAttribute('glance-id')) {
this.quickOpenGlance(); if (this.#currentGlanceID && !this._duringOpening) {
this.quickCloseGlance();
}
return; return;
} }
if (gBrowser.selectedTab === this.currentParentTab && this.#currentBrowser) { if (this.#currentGlanceID && this.#currentGlanceID !== tab.getAttribute('glance-id')) {
this.quickOpenGlance(); this.quickCloseGlance();
} else if ((!this.animatingFullOpen || this.animatingOpen) && this.#currentBrowser) { }
this.closeGlance(); this.#currentGlanceID = tab.getAttribute('glance-id');
if (gBrowser.selectedTab === this.#currentParentTab && this.#currentBrowser) {
const curTab = this.#currentTab;
setTimeout(() => {
gBrowser.selectedTab = curTab;
}, 0);
} else if (gBrowser.selectedTab === this.#currentTab) {
setTimeout(this.onLocationChangeOpenGlance.bind(this), 0);
} }
} }
onTabClose(event) { onTabClose(event) {
if (event.target === this.currentParentTab) { if (event.target === this.#currentParentTab) {
this.closeGlance({ onTabClose: true }); this.closeGlance({ onTabClose: true });
} }
} }
fullyOpenGlance() { manageTabClose(tab) {
gBrowser._insertTabAtIndex(this.#currentTab, { if (tab.hasAttribute('glance-id')) {
index: this.#currentTab._tPos + 1, 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;
}
return false;
}
tabDomainsDiffer(tab1, url2) {
try {
if (!tab1) {
return true;
}
let url1 = tab1.linkedBrowser.currentURI.spec;
if (url1.startsWith('about:')) {
return true;
}
return Services.io.newURI(url1).host !== url2.host;
} catch (e) {
return true;
}
}
shouldOpenTabInGlance(tab, uri) {
let owner = tab.owner;
return (
owner &&
owner.getAttribute('zen-essential') === 'true' &&
this._lazyPref.SHOULD_OPEN_EXTERNAL_TABS_IN_GLANCE &&
owner.linkedBrowser?.docShellIsActive &&
owner.linkedBrowser?.browsingContext?.isAppTab &&
this.tabDomainsDiffer(owner, uri) &&
Services.prefs.getBoolPref('zen.glance.enabled', true)
);
}
onTabOpen(browser, uri) {
let tab = gBrowser.getTabForBrowser(browser);
if (!tab) {
return;
}
try {
if (this.shouldOpenTabInGlance(tab, uri)) {
this.openGlance({ url: undefined, x: 0, y: 0, width: 0, height: 0 }, tab, tab.owner);
}
} catch (e) {
console.error(e);
}
}
fullyOpenGlance() {
this.animatingFullOpen = true; this.animatingFullOpen = true;
this.currentParentTab._visuallySelected = false; gBrowser._insertTabAtIndex(this.#currentTab, {
index: this.getTabPosition(this.#currentTab),
});
this.browserWrapper.removeAttribute('style'); this.browserWrapper.removeAttribute('style');
this.browserWrapper.removeAttribute('has-finished-animation'); this.browserWrapper.removeAttribute('has-finished-animation');
this.browserWrapper.setAttribute('animate-full', true); this.browserWrapper.setAttribute('animate-full', true);
this.#currentTab.removeAttribute('zen-glance-tab'); this.#currentTab.removeAttribute('zen-glance-tab');
this.#currentTab.removeAttribute('glance-id');
this.#currentParentTab.removeAttribute('glance-id');
gBrowser.selectedTab = this.#currentTab; gBrowser.selectedTab = this.#currentTab;
this.currentParentTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('zen-glance-background'); this.#currentParentTab.linkedBrowser.closest('.browserSidebarContainer').classList.remove('zen-glance-background');
setTimeout(() => { this.#currentParentTab._visuallySelected = false;
window.requestAnimationFrame(() => { this.hideSidebarButtons();
this.browserWrapper.setAttribute('animate-full-end', true); gZenUIManager.motion
.animate(
this.browserWrapper,
{
width: ['85%', '100%'],
height: ['100%', '100%'],
},
{
duration: 0.4,
type: 'spring',
}
)
.then(() => {
this.browserWrapper.removeAttribute('animate-full');
this.overlay.classList.remove('zen-glance-overlay'); this.overlay.classList.remove('zen-glance-overlay');
setTimeout(() => { this.browserWrapper.removeAttribute('style');
this.animatingFullOpen = false; this.animatingFullOpen = false;
this.closeGlance({ noAnimation: true }); this.closeGlance({ noAnimation: true });
}, 600); this.#glances.delete(this.#currentGlanceID);
}); });
}, 300);
} }
openGlanceForBookmark(event) { openGlanceForBookmark(event) {
@@ -352,6 +554,10 @@
return false; return false;
} }
getFocusedTab(aDir) {
return aDir < 0 ? this.#currentParentTab : this.#currentTab;
}
} }
window.gZenGlanceManager = new ZenGlanceManager(); window.gZenGlanceManager = new ZenGlanceManager();
@@ -368,6 +574,7 @@
DOMContentLoaded: {}, DOMContentLoaded: {},
}, },
}, },
matches: ['https://*/*'],
}); });
} }
} }

View File

@@ -37,7 +37,6 @@
this.initCanvas(); this.initCanvas();
this.initCustomColorInput(); this.initCustomColorInput();
ZenWorkspaces.addChangeListeners(this.onWorkspaceChange.bind(this));
window.matchMedia('(prefers-color-scheme: dark)').addListener(this.onDarkModeChange.bind(this)); window.matchMedia('(prefers-color-scheme: dark)').addListener(this.onDarkModeChange.bind(this));
} }
@@ -246,51 +245,6 @@
} }
} }
onThemePickerClick(event) {
event.preventDefault();
if (event.button !== 0 || this.dragging) return;
const gradient = this.panel.querySelector('.zen-theme-picker-gradient');
const rect = gradient.getBoundingClientRect();
const padding = 90; // each side
const centerX = rect.left + rect.width / 2;
const centerY = rect.top + rect.height / 2;
const radius = (rect.width - padding) / 2;
let pixelX = event.clientX;
let pixelY = event.clientY;
// Check if the click is within the circle
const distance = Math.sqrt((pixelX - centerX) ** 2 + (pixelY - centerY) ** 2);
if (distance > radius) {
return; // Don't create a dot if clicking outside the circle
}
// Check if we clicked on an existing dot
const clickedElement = event.target;
const isExistingDot = clickedElement.classList.contains('zen-theme-picker-dot');
// Only proceed if not clicking on an existing dot
if (!isExistingDot) {
const relativeX = event.clientX - rect.left;
const relativeY = event.clientY - rect.top;
const color = this.getColorFromPosition(relativeX, relativeY);
// Create new dot
const dot = document.createElement('div');
dot.classList.add('zen-theme-picker-dot');
dot.addEventListener('mousedown', this.onDotMouseDown.bind(this));
dot.style.left = `${relativeX}px`;
dot.style.top = `${relativeY}px`;
dot.style.setProperty('--zen-theme-picker-dot-color', `rgb(${color[0]}, ${color[1]}, ${color[2]})`);
gradient.appendChild(dot);
this.updateCurrentWorkspace(true);
}
}
onDotMouseDown(event) { onDotMouseDown(event) {
event.preventDefault(); event.preventDefault();
if (event.button === 2) { if (event.button === 2) {
@@ -659,7 +613,7 @@
// Reactivate the transition after the animation // Reactivate the transition after the animation
appWrapper.removeAttribute('post-animating'); appWrapper.removeAttribute('post-animating');
}, 100); }, 100);
}, 500); }, 200);
}); });
} }

View File

@@ -80,6 +80,7 @@ const defaultKeyboardGroups = {
'zen-search-find-again-shortcut-prev', 'zen-search-find-again-shortcut-prev',
], ],
pageOperations: [ pageOperations: [
'zen-text-action-copy-url-markdown-shortcut',
'zen-text-action-copy-url-shortcut', 'zen-text-action-copy-url-shortcut',
'zen-location-open-shortcut', 'zen-location-open-shortcut',
'zen-location-open-shortcut-alt', 'zen-location-open-shortcut-alt',
@@ -755,7 +756,7 @@ class ZenKeyboardShortcutsLoader {
} }
class ZenKeyboardShortcutsVersioner { class ZenKeyboardShortcutsVersioner {
static LATEST_KBS_VERSION = 7; static LATEST_KBS_VERSION = 8;
constructor() {} constructor() {}
@@ -809,6 +810,20 @@ class ZenKeyboardShortcutsVersioner {
return this.migrateIfNeeded(data); return this.migrateIfNeeded(data);
} }
fillDefaultIfNotPresent(data) {
for (let shortcut of ZenKeyboardShortcutsLoader.zenGetDefaultShortcuts()) {
// If it has an ID and we dont find it in the data, we add it
if (shortcut.getID() && !data.find((s) => s.getID() == shortcut.getID())) {
data.push(shortcut);
}
}
return data;
}
fixedKeyboardShortcuts(data) {
return this.fillDefaultIfNotPresent(this.migrateIfNeeded(data));
}
migrate(data, version) { migrate(data, version) {
if (version < 1) { if (version < 1) {
// Migrate from 0 to 1 // Migrate from 0 to 1
@@ -907,6 +922,21 @@ class ZenKeyboardShortcutsVersioner {
gZenKeyboardShortcutsManager._hasToLoadDefaultDevtools = true; gZenKeyboardShortcutsManager._hasToLoadDefaultDevtools = true;
window.addEventListener('zen-devtools-keyset-added', listener); window.addEventListener('zen-devtools-keyset-added', listener);
} }
if (version < 8) {
// Migrate from 7 to 8
// In this new version, we add the "Copy URL as Markdown" shortcut to the default shortcuts
data.push(
new KeyShortcut(
'zen-copy-url-markdown',
'C',
'',
ZEN_OTHER_SHORTCUTS_GROUP,
KeyShortcutModifiers.fromObject({ accel: true, shift: true, alt: true }),
'code:gZenCommonActions.copyCurrentURLAsMarkdownToClipboard()',
'zen-text-action-copy-url-markdown-shortcut'
)
);
}
return data; return data;
} }
} }
@@ -934,7 +964,7 @@ var gZenKeyboardShortcutsManager = {
if (this.inBrowserView) { if (this.inBrowserView) {
const loadedShortcuts = await this._loadSaved(); const loadedShortcuts = await this._loadSaved();
this._currentShortcutList = this.versioner.migrateIfNeeded(loadedShortcuts); this._currentShortcutList = this.versioner.fixedKeyboardShortcuts(loadedShortcuts);
this._applyShortcuts(); this._applyShortcuts();
await this._saveShortcuts(); await this._saveShortcuts();

View File

@@ -69,7 +69,9 @@
return; return;
} }
await this._refreshPinnedTabs(newWorkspace, { init: onInit }); if (onInit) {
await this._refreshPinnedTabs(newWorkspace, { init: onInit });
}
} }
log(message) { log(message) {
@@ -152,7 +154,7 @@
const pinsToCreate = new Set(pins.map((p) => p.uuid)); const pinsToCreate = new Set(pins.map((p) => p.uuid));
// First pass: identify existing tabs and remove those without pins // First pass: identify existing tabs and remove those without pins
for (let tab of gBrowser.tabs) { for (let tab of ZenWorkspaces.allStoredTabs) {
const pinId = tab.getAttribute('zen-pin-id'); const pinId = tab.getAttribute('zen-pin-id');
if (!pinId) { if (!pinId) {
continue; continue;
@@ -178,10 +180,6 @@
continue; // Skip pins that already have tabs continue; // Skip pins that already have tabs
} }
if (!this._shouldShowPin(pin, currentWorkspace, workspaces)) {
continue; // Skip pins not relevant to current workspace
}
let params = { let params = {
skipAnimation: true, skipAnimation: true,
allowInheritPrincipal: false, allowInheritPrincipal: false,
@@ -234,6 +232,13 @@
this.log(`Created new pinned tab for pin ${pin.uuid} (isEssential: ${pin.isEssential})`); this.log(`Created new pinned tab for pin ${pin.uuid} (isEssential: ${pin.isEssential})`);
gBrowser.pinTab(newTab); gBrowser.pinTab(newTab);
if (!pin.isEssential) {
const contaienr = document.querySelector(
`#vertical-pinned-tabs-container .zen-workspace-tabs-section[zen-workspace-id="${pin.workspaceUuid}"]`
);
contaienr.insertBefore(newTab, contaienr.lastChild);
}
gBrowser.tabContainer._invalidateCachedTabs();
newTab.initialize(); newTab.initialize();
} }
@@ -244,43 +249,7 @@
} }
gBrowser._updateTabBarForPinnedTabs(); gBrowser._updateTabBarForPinnedTabs();
} gZenUIManager.updateTabsToolbar();
_shouldShowPin(pin, currentWorkspace, workspaces) {
const isEssential = pin.isEssential;
const pinWorkspaceUuid = pin.workspaceUuid;
const pinContextId = pin.containerTabId ? pin.containerTabId.toString() : '0';
const workspaceContextId = currentWorkspace.containerTabId?.toString() || '0';
const containerSpecificEssentials = ZenWorkspaces.containerSpecificEssentials;
// Handle essential pins
if (isEssential) {
if (!containerSpecificEssentials) {
return true; // Show all essential pins when containerSpecificEssentials is false
}
if (workspaceContextId !== '0') {
// In workspaces with default container: Show essentials that match the container
return pinContextId === workspaceContextId;
} else {
// In workspaces without a default container: Show essentials that aren't in container-specific workspaces
// or have userContextId="0" or no userContextId
return (
!pinContextId ||
pinContextId === '0' ||
!workspaces.workspaces.some((workspace) => workspace.containerTabId === parseInt(pinContextId, 10))
);
}
}
// For non-essential pins
if (!pinWorkspaceUuid) {
// Pins without a workspace belong to all workspaces (if that's your desired behavior)
return true;
}
// Show if pin belongs to current workspace
return pinWorkspaceUuid === currentWorkspace.uuid;
} }
_onPinnedTabEvent(action, event) { _onPinnedTabEvent(action, event) {
@@ -327,6 +296,10 @@
} }
const actualPin = this._pinsCache.find((pin) => pin.uuid === tab.getAttribute('zen-pin-id')); const actualPin = this._pinsCache.find((pin) => pin.uuid === tab.getAttribute('zen-pin-id'));
if (!actualPin) {
return;
}
actualPin.position = tab.position; actualPin.position = tab.position;
await ZenPinnedTabsStorage.savePin(actualPin); await ZenPinnedTabsStorage.savePin(actualPin);
} }
@@ -446,7 +419,7 @@
} }
} }
_onCloseTabShortcut(event, selectedTab = gBrowser.selectedTab) { _onCloseTabShortcut(event, selectedTab = gBrowser.selectedTab, behavior = lazy.zenPinnedTabCloseShortcutBehavior) {
if (!selectedTab?.pinned) { if (!selectedTab?.pinned) {
return; return;
} }
@@ -454,8 +427,6 @@
event.stopPropagation(); event.stopPropagation();
event.preventDefault(); event.preventDefault();
const behavior = lazy.zenPinnedTabCloseShortcutBehavior;
switch (behavior) { switch (behavior) {
case 'close': case 'close':
this._removePinnedAttributes(selectedTab, true); this._removePinnedAttributes(selectedTab, true);
@@ -470,7 +441,11 @@
this._resetTabToStoredState(selectedTab); this._resetTabToStoredState(selectedTab);
} }
if (behavior.includes('unload')) { if (behavior.includes('unload')) {
gBrowser.discardBrowser(selectedTab); if (selectedTab.hasAttribute('glance-id')) {
break;
}
gBrowser.explicitUnloadTabs([selectedTab]);
selectedTab.removeAttribute('linkedpanel');
} }
break; break;
case 'reset': case 'reset':
@@ -556,8 +531,8 @@
} }
} }
addToEssentials() { addToEssentials(tab) {
const tabs = TabContextMenu.contextTab.multiselected ? gBrowser.selectedTabs : [TabContextMenu.contextTab]; const tabs = tab ? [tab] : TabContextMenu.contextTab.multiselected ? gBrowser.selectedTabs : [TabContextMenu.contextTab];
for (let i = 0; i < tabs.length; i++) { for (let i = 0; i < tabs.length; i++) {
const tab = tabs[i]; const tab = tabs[i];
tab.setAttribute('zen-essential', 'true'); tab.setAttribute('zen-essential', 'true');
@@ -571,10 +546,11 @@
gBrowser.pinTab(tab); gBrowser.pinTab(tab);
this.onTabIconChanged(tab); this.onTabIconChanged(tab);
} }
gZenUIManager.updateTabsToolbar();
} }
removeEssentials() { removeEssentials(tab) {
const tabs = TabContextMenu.contextTab.multiselected ? gBrowser.selectedTabs : [TabContextMenu.contextTab]; const tabs = tab ? [tab] : TabContextMenu.contextTab.multiselected ? gBrowser.selectedTabs : [TabContextMenu.contextTab];
for (let i = 0; i < tabs.length; i++) { for (let i = 0; i < tabs.length; i++) {
const tab = tabs[i]; const tab = tabs[i];
tab.removeAttribute('zen-essential'); tab.removeAttribute('zen-essential');
@@ -583,6 +559,7 @@
} }
gBrowser.unpinTab(tab); gBrowser.unpinTab(tab);
} }
gZenUIManager.updateTabsToolbar();
} }
_insertItemsIntoTabContextMenu() { _insertItemsIntoTabContextMenu() {
@@ -637,6 +614,170 @@
document.getElementById('context_unpinSelectedTabs').hidden || contextTab.getAttribute('zen-essential'); document.getElementById('context_unpinSelectedTabs').hidden || contextTab.getAttribute('zen-essential');
document.getElementById('context_zen-pinned-tab-separator').hidden = !isVisible; document.getElementById('context_zen-pinned-tab-separator').hidden = !isVisible;
} }
moveToAnotherTabContainerIfNecessary(event, draggedTab) {
const pinnedTabsTarget =
event.target.closest('#vertical-pinned-tabs-container') || event.target.closest('.zen-current-workspace-indicator');
const essentialTabsTarget = event.target.closest('#zen-essentials-container');
const tabsTarget = event.target.closest('#tabbrowser-arrowscrollbox');
let moved = false;
let isVertical = this.expandedSidebarMode;
let isRegularTabs = false;
// Check for pinned tabs container
if (pinnedTabsTarget) {
if (!draggedTab.pinned) {
gBrowser.pinTab(draggedTab);
moved = true;
} else if (draggedTab.hasAttribute('zen-essential')) {
this.removeEssentials(draggedTab);
gBrowser.pinTab(draggedTab);
moved = true;
}
}
// Check for essentials container
else if (essentialTabsTarget) {
if (!draggedTab.hasAttribute('zen-essential')) {
this.addToEssentials(draggedTab);
moved = true;
isVertical = false;
}
}
// Check for normal tabs container
else if (tabsTarget || event.target.id === 'zen-tabs-wrapper') {
if (draggedTab.pinned && !draggedTab.hasAttribute('zen-essential')) {
gBrowser.unpinTab(draggedTab);
moved = true;
isRegularTabs = true;
} else if (draggedTab.hasAttribute('zen-essential')) {
this.removeEssentials(draggedTab);
moved = true;
isRegularTabs = true;
}
}
// If the tab was moved, adjust its position relative to the target tab
if (moved) {
const targetTab = event.target.closest('.tabbrowser-tab');
if (targetTab) {
const rect = targetTab.getBoundingClientRect();
let newIndex = targetTab._tPos;
if (isVertical) {
const middleY = targetTab.screenY + rect.height / 2;
if (!isRegularTabs && event.screenY > middleY) {
newIndex++;
} else if (isRegularTabs && event.screenY < middleY) {
newIndex--;
}
} else {
const middleX = targetTab.screenX + rect.width / 2;
if (event.screenX > middleX) {
newIndex++;
}
}
gBrowser.moveTabTo(draggedTab, newIndex);
}
}
return moved;
}
removeTabContainersDragoverClass() {
this.dragIndicator.remove();
this._dragIndicator = null;
ZenWorkspaces.activeWorkspaceIndicator.removeAttribute('open');
}
get dragIndicator() {
if (!this._dragIndicator) {
this._dragIndicator = document.createElement('div');
this._dragIndicator.id = 'zen-drag-indicator';
document.body.appendChild(this._dragIndicator);
}
return this._dragIndicator;
}
get expandedSidebarMode() {
return document.documentElement.getAttribute('zen-sidebar-expanded') === 'true';
}
applyDragoverClass(event, draggedTab) {
const pinnedTabsTarget = event.target.closest('#vertical-pinned-tabs-container');
const essentialTabsTarget = event.target.closest('#zen-essentials-container');
const tabsTarget = event.target.closest('#tabbrowser-arrowscrollbox');
const targetTab = event.target.closest('.tabbrowser-tab');
if (event.target.closest('.zen-current-workspace-indicator')) {
this.removeTabContainersDragoverClass();
ZenWorkspaces.activeWorkspaceIndicator.setAttribute('open', true);
} else {
ZenWorkspaces.activeWorkspaceIndicator.removeAttribute('open');
}
// If there's no valid target tab, nothing to do
if (!targetTab) {
return;
}
let shouldAddDragOverElement = false;
let isVertical = this.expandedSidebarMode;
// Decide whether we should show a dragover class for the given target
if (pinnedTabsTarget) {
if (!draggedTab.pinned || draggedTab.hasAttribute('zen-essential')) {
shouldAddDragOverElement = true;
}
} else if (essentialTabsTarget) {
if (!draggedTab.hasAttribute('zen-essential')) {
shouldAddDragOverElement = true;
isVertical = false;
}
} else if (tabsTarget) {
if (draggedTab.pinned || draggedTab.hasAttribute('zen-essential')) {
shouldAddDragOverElement = true;
}
}
if (!shouldAddDragOverElement) {
this.removeTabContainersDragoverClass();
return;
}
// Calculate middle to decide 'before' or 'after'
const rect = targetTab.getBoundingClientRect();
if (isVertical) {
const separation = 8;
const middleY = targetTab.screenY + rect.height / 2;
const indicator = this.dragIndicator;
let top = 0;
if (event.screenY > middleY) {
top = rect.top + rect.height + 'px';
} else {
top = rect.top + 'px';
}
indicator.setAttribute('orientation', 'horizontal');
indicator.style.setProperty('--indicator-left', rect.left + separation / 2 + 'px');
indicator.style.setProperty('--indicator-width', rect.width - separation + 'px');
indicator.style.top = top;
indicator.style.removeProperty('left');
} else {
const separation = 8;
const middleX = targetTab.screenX + rect.width / 2;
const indicator = this.dragIndicator;
let left = 0;
if (event.screenX > middleX) {
left = rect.left + rect.width + 1 + 'px';
} else {
left = rect.left - 2 + 'px';
}
indicator.setAttribute('orientation', 'vertical');
indicator.style.setProperty('--indicator-top', rect.top + separation / 2 + 'px');
indicator.style.setProperty('--indicator-height', rect.height - separation + 'px');
indicator.style.left = left;
indicator.style.removeProperty('top');
}
}
} }
window.gZenPinnedTabManager = new ZenPinnedTabManager(); window.gZenPinnedTabManager = new ZenPinnedTabManager();

View File

@@ -46,7 +46,6 @@ var ZenPinnedTabsStorage = {
CREATE INDEX IF NOT EXISTS idx_zen_pins_changes_uuid ON zen_pins_changes(uuid) CREATE INDEX IF NOT EXISTS idx_zen_pins_changes_uuid ON zen_pins_changes(uuid)
`); `);
await SessionStore.promiseInitialized;
this._resolveInitialized(); this._resolveInitialized();
}); });
}, },

View File

@@ -173,7 +173,7 @@
} }
handleTabClose(tab) { handleTabClose(tab) {
// Nothing yet tab.lastActivity = null;
} }
handleTabOpen(tab) { handleTabOpen(tab) {
@@ -226,7 +226,7 @@
unloadTab() { unloadTab() {
const tabs = TabContextMenu.contextTab.multiselected ? gBrowser.selectedTabs : [TabContextMenu.contextTab]; const tabs = TabContextMenu.contextTab.multiselected ? gBrowser.selectedTabs : [TabContextMenu.contextTab];
for (let i = 0; i < tabs.length; i++) { for (let i = 0; i < tabs.length; i++) {
if (this.canUnloadTab(tabs[i], Date.now(), [], true)) { if (this.canUnloadTab(tabs[i], Date.now(), this.intervalUnloader.excludedUrls, true)) {
this.unload(tabs[i]); this.unload(tabs[i]);
} }
} }
@@ -258,6 +258,7 @@
!tab.linkedPanel || !tab.linkedPanel ||
tab.splitView || tab.splitView ||
tab.attention || tab.attention ||
tab.hasAttribute('glance-id') ||
tab.linkedBrowser?.zenModeActive || tab.linkedBrowser?.zenModeActive ||
(tab.pictureinpicture && !ignoreTimestamp) || (tab.pictureinpicture && !ignoreTimestamp) ||
(tab.soundPlaying && !ignoreTimestamp) || (tab.soundPlaying && !ignoreTimestamp) ||

View File

@@ -0,0 +1,63 @@
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
BrowserWindowTracker: 'resource:///modules/BrowserWindowTracker.sys.mjs',
});
class ZenUIMigration {
PREF_NAME = 'zen.migration.version';
MIGRATION_VERSION = 1;
init(isNewProfile, win) {
if (!isNewProfile) {
this._migrate(win);
}
this.clearVariables();
}
get _migrationVersion() {
return Services.prefs.getIntPref(this.PREF_NAME, 0);
}
set _migrationVersion(value) {
Services.prefs.setIntPref(this.PREF_NAME, value);
}
_migrate(win) {
if (this._migrationVersion < 1) {
this._migrateV1(win);
}
}
clearVariables() {
this._migrationVersion = this.MIGRATION_VERSION;
}
async _migrateV1(win) {
// Introduction of the new URL bar, show a message to the user
const notification = win.gNotificationBox.appendNotification(
'zen-new-urlbar-notification',
{
label: { 'l10n-id': 'zen-new-urlbar-notification' },
image: 'chrome://browser/skin/notification-icons/persistent-storage-blocked.svg',
priority: win.gNotificationBox.PRIORITY_WARNING_HIGH,
},
[
{
'l10n-id': 'zen-disable',
accessKey: 'D',
callback: () => {
Services.prefs.setBoolPref('zen.urlbar.replace-newtab', false);
},
},
{
link: 'https://docs.zen-browser.app/user-manual/urlbar/',
'l10n-id': 'zen-learn-more-text',
},
]
);
notification.persistence = -1;
}
}
export var gZenUIMigration = new ZenUIMigration();

View File

@@ -8,10 +8,9 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
_swipeState = { _swipeState = {
isGestureActive: true, isGestureActive: true,
cumulativeDelta: 0, lastDelta: 0,
direction: null, direction: null,
}; };
_hoveringSidebar = false;
_lastScrollTime = 0; _lastScrollTime = 0;
bookmarkMenus = [ bookmarkMenus = [
'PlacesToolbar', 'PlacesToolbar',
@@ -29,13 +28,22 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
this._resolvePinnedInitialized = resolve; this._resolvePinnedInitialized = resolve;
}); });
promiseSectionsInitialized = new Promise((resolve) => {
this._resolveSectionsInitialized = resolve;
});
workspaceIndicatorXUL = `
<hbox class="zen-current-workspace-indicator-icon"></hbox>
<hbox class="zen-current-workspace-indicator-name"></hbox>
`;
async waitForPromises() { async waitForPromises() {
await Promise.all([this.promiseDBInitialized, this.promisePinnedInitialized, SessionStore.promiseAllWindowsRestored]); await Promise.all([this.promiseDBInitialized, this.promisePinnedInitialized]);
} }
async init() { async init() {
if (!this.shouldHaveWorkspaces) { if (!this.shouldHaveWorkspaces) {
document.getElementById('zen-current-workspace-indicator').setAttribute('hidden', 'true'); document.getElementById('zen-current-workspace-indicator-container').setAttribute('hidden', 'true');
console.warn('ZenWorkspaces: !!! ZenWorkspaces is disabled in hidden windows !!!'); console.warn('ZenWorkspaces: !!! ZenWorkspaces is disabled in hidden windows !!!');
return; // We are in a hidden window, don't initialize ZenWorkspaces return; // We are in a hidden window, don't initialize ZenWorkspaces
} }
@@ -71,17 +79,25 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
); );
ChromeUtils.defineLazyGetter(this, 'tabContainer', () => document.getElementById('tabbrowser-tabs')); ChromeUtils.defineLazyGetter(this, 'tabContainer', () => document.getElementById('tabbrowser-tabs'));
this._activeWorkspace = Services.prefs.getStringPref('zen.workspaces.active', ''); this._activeWorkspace = Services.prefs.getStringPref('zen.workspaces.active', '');
this._delayedStartup(); await SessionStore.promiseInitialized;
if (!this._hasInitializedTabsStrip) {
await this.delayedStartup();
}
await this.promiseSectionsInitialized;
window.addEventListener(
'MozAfterPaint',
async () => {
await SessionStore.promiseAllWindowsRestored;
await this.afterLoadInit();
},
{ once: true }
);
} }
async _delayedStartup() { async afterLoadInit() {
if (!this.workspaceEnabled) {
return;
}
await this.waitForPromises();
await this.initializeWorkspaces();
console.info('ZenWorkspaces: ZenWorkspaces initialized'); console.info('ZenWorkspaces: ZenWorkspaces initialized');
await this.initializeWorkspaces();
if (Services.prefs.getBoolPref('zen.workspaces.swipe-actions', false) && this.workspaceEnabled) { if (Services.prefs.getBoolPref('zen.workspaces.swipe-actions', false) && this.workspaceEnabled) {
this.initializeGestureHandlers(); this.initializeGestureHandlers();
this.initializeWorkspaceNavigation(); this.initializeWorkspaceNavigation();
@@ -98,6 +114,137 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
); );
} }
async delayedStartup() {
if (!this.workspaceEnabled) {
return;
}
this._pinnedTabsResizeObserver = new ResizeObserver(this.onPinnedTabsResize.bind(this));
await this.waitForPromises();
await this.initializeTabsStripSections();
this._resolveSectionsInitialized();
}
registerPinnedResizeObserver() {
if (!this._hasInitializedTabsStrip) {
return;
}
this._pinnedTabsResizeObserver.disconnect();
for (let element of document.getElementById('vertical-pinned-tabs-container').children) {
if (element.classList.contains('tabbrowser-tab')) {
continue;
}
this._pinnedTabsResizeObserver.observe(element);
}
}
get activeWorkspaceStrip() {
if (!this._hasInitializedTabsStrip) {
return gBrowser.tabContainer.arrowScrollbox;
}
const activeWorkspace = this.activeWorkspace;
return document.querySelector(
`#tabbrowser-arrowscrollbox .zen-workspace-tabs-section[zen-workspace-id="${activeWorkspace}"]`
);
}
get activeWorkspaceIndicator() {
return document.querySelector(
`#zen-current-workspace-indicator-container .zen-workspace-tabs-section[zen-workspace-id="${this.activeWorkspace}"]`
);
}
get tabboxChildren() {
return this.activeWorkspaceStrip.children;
}
get pinnedTabsContainer() {
if (!this.workspaceEnabled || !this._hasInitializedTabsStrip) {
return document.getElementById('vertical-pinned-tabs-container');
}
return document.querySelector(
`#vertical-pinned-tabs-container .zen-workspace-tabs-section[zen-workspace-id="${this.activeWorkspace}"]`
);
}
async initializeTabsStripSections() {
const perifery = document.getElementById('tabbrowser-arrowscrollbox-periphery');
const tabs = gBrowser.tabContainer.allTabs;
const workspaces = await this._workspaces();
for (const workspace of workspaces.workspaces) {
this._createWorkspaceTabsSection(workspace, tabs, perifery);
}
if (tabs.length) {
const defaultSelectedContainer = document.querySelector(
`#tabbrowser-arrowscrollbox .zen-workspace-tabs-section[zen-workspace-id="${this.activeWorkspace}"]`
);
// New profile with no workspaces does not have a default selected container
if (defaultSelectedContainer) {
const pinnedContainer = document.querySelector(
`#vertical-pinned-tabs-container .zen-workspace-tabs-section[zen-workspace-id="${this.activeWorkspace}"]`
);
for (const tab of tabs) {
if (tab.pinned) {
pinnedContainer.insertBefore(tab, pinnedContainer.lastChild);
continue;
}
// before to the last child (perifery)
defaultSelectedContainer.insertBefore(tab, defaultSelectedContainer.lastChild);
}
}
}
perifery.setAttribute('hidden', 'true');
this._hasInitializedTabsStrip = true;
this.registerPinnedResizeObserver();
this._fixIndicatorsNames(workspaces);
}
_createWorkspaceSection(workspace) {
const section = document.createXULElement('vbox');
section.className = 'zen-workspace-tabs-section';
section.setAttribute('flex', '1');
section.setAttribute('zen-workspace-id', workspace.uuid);
return section;
}
async _createWorkspaceTabsSection(workspace, tabs, perifery) {
const container = gBrowser.tabContainer.arrowScrollbox;
const section = this._createWorkspaceSection(workspace);
container.appendChild(section);
const pinnedContainer = document.getElementById('vertical-pinned-tabs-container');
const pinnedSection = this._createWorkspaceSection(workspace);
this._organizeTabsToWorkspaceSections(workspace, section, pinnedSection, tabs);
section.appendChild(perifery.cloneNode(true));
pinnedSection.appendChild(
window.MozXULElement.parseXULToFragment(`
<html:div class="vertical-pinned-tabs-container-separator"></html:div>
`)
);
pinnedContainer.appendChild(pinnedSection);
const workspaceIndicator = this._createWorkspaceSection(workspace);
workspaceIndicator.classList.add('zen-current-workspace-indicator');
workspaceIndicator.appendChild(window.MozXULElement.parseXULToFragment(this.workspaceIndicatorXUL));
document.getElementById('zen-current-workspace-indicator-container').appendChild(workspaceIndicator);
this.initIndicatorContextMenu(workspaceIndicator);
}
_organizeTabsToWorkspaceSections(workspace, section, pinnedSection, tabs) {
const workspaceTabs = Array.from(tabs).filter((tab) => tab.getAttribute('zen-workspace-id') === workspace.uuid);
for (const tab of workspaceTabs) {
if (tab.hasAttribute('zen-essential')) {
continue; // Ignore essentials as they need to be in their own section
}
// remove tab from list
tabs.splice(tabs.indexOf(tab), 1);
if (tab.pinned) {
pinnedSection.appendChild(tab);
} else {
section.appendChild(tab);
}
}
}
initializeWorkspaceNavigation() { initializeWorkspaceNavigation() {
this._setupAppCommandHandlers(); this._setupAppCommandHandlers();
this._setupSidebarHandlers(); this._setupSidebarHandlers();
@@ -114,6 +261,10 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
window.addEventListener('AppCommand', HandleAppCommandEvent, true); window.addEventListener('AppCommand', HandleAppCommandEvent, true);
} }
get _hoveringSidebar() {
return document.getElementById('navigator-toolbox').hasAttribute('zen-has-hover');
}
_handleAppCommand(event) { _handleAppCommand(event) {
if (!this.workspaceEnabled || !this._hoveringSidebar) { if (!this.workspaceEnabled || !this._hoveringSidebar) {
return; return;
@@ -138,14 +289,6 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
_setupSidebarHandlers() { _setupSidebarHandlers() {
const toolbox = document.getElementById('navigator-toolbox'); const toolbox = document.getElementById('navigator-toolbox');
toolbox.addEventListener('mouseenter', () => {
this._hoveringSidebar = true;
});
toolbox.addEventListener('mouseleave', () => {
this._hoveringSidebar = false;
});
const scrollCooldown = 200; // Milliseconds to wait before allowing another scroll const scrollCooldown = 200; // Milliseconds to wait before allowing another scroll
const scrollThreshold = 2; // Minimum scroll delta to trigger workspace change const scrollThreshold = 2; // Minimum scroll delta to trigger workspace change
@@ -212,7 +355,10 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
element.addEventListener('MozSwipeGestureMayStart', this._handleSwipeMayStart.bind(this), true); element.addEventListener('MozSwipeGestureMayStart', this._handleSwipeMayStart.bind(this), true);
element.addEventListener('MozSwipeGestureStart', this._handleSwipeStart.bind(this), true); element.addEventListener('MozSwipeGestureStart', this._handleSwipeStart.bind(this), true);
element.addEventListener('MozSwipeGestureUpdate', this._handleSwipeUpdate.bind(this), true); element.addEventListener('MozSwipeGestureUpdate', this._handleSwipeUpdate.bind(this), true);
element.addEventListener('MozSwipeGestureEnd', this._handleSwipeEnd.bind(this), true);
// Use MozSwipeGesture instead of MozSwipeGestureEnd because MozSwipeGestureEnd is fired after animation ends,
// while MozSwipeGesture is fired immediately after swipe ends.
element.addEventListener('MozSwipeGesture', this._handleSwipeEnd.bind(this), true);
} }
_handleSwipeMayStart(event) { _handleSwipeMayStart(event) {
@@ -236,7 +382,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
this._swipeState = { this._swipeState = {
isGestureActive: true, isGestureActive: true,
cumulativeDelta: 0, lastDelta: 0,
direction: null, direction: null,
}; };
} }
@@ -247,13 +393,19 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
// Update cumulative delta const delta = event.delta * 300;
this._swipeState.cumulativeDelta += event.delta; this._swipeState.lastDelta = delta;
// Determine swipe direction based on cumulative delta if (Math.abs(delta) > 1) {
if (Math.abs(this._swipeState.cumulativeDelta) > 0.25) { this._swipeState.direction = delta > 0 ? 'left' : 'right';
this._swipeState.direction = this._swipeState.cumulativeDelta > 0 ? 'left' : 'right';
} }
// Apply a translateX to the tab strip to give the user feedback on the swipe
const stripWidth = document.getElementById('tabbrowser-tabs').scrollWidth;
const translateX = Math.max(-stripWidth, Math.min(delta, stripWidth));
const currentWorkspace = this.activeWorkspace;
this._organizeWorkspaceStripLocations({ uuid: currentWorkspace }, true, translateX);
} }
async _handleSwipeEnd(event) { async _handleSwipeEnd(event) {
@@ -266,13 +418,15 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
let rawDirection = moveForward ? 1 : -1; let rawDirection = moveForward ? 1 : -1;
if (this._swipeState.direction) { if (this._swipeState.direction) {
let direction = this.naturalScroll ? -1 : 1; let direction = this.naturalScroll ? -1 : 1;
this.changeWorkspaceShortcut(rawDirection * direction); this.changeWorkspaceShortcut(rawDirection * direction, true);
} else {
this._cancelSwipeAnimation();
} }
// Reset swipe state // Reset swipe state
this._swipeState = { this._swipeState = {
isGestureActive: false, isGestureActive: false,
cumulativeDelta: 0, lastDelta: 0,
direction: null, direction: null,
}; };
} }
@@ -389,35 +543,28 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
this._initializeWorkspaceTabContextMenus(); this._initializeWorkspaceTabContextMenus();
await this.workspaceBookmarks(); await this.workspaceBookmarks();
window.addEventListener('TabBrowserInserted', this.onTabBrowserInserted.bind(this)); window.addEventListener('TabBrowserInserted', this.onTabBrowserInserted.bind(this));
window.addEventListener('TabOpen', this.updateTabsContainers.bind(this));
let workspaces = await this._workspaces(); let workspaces = await this._workspaces();
let activeWorkspace = null; let activeWorkspace = null;
if (workspaces.workspaces.length === 0) { if (workspaces.workspaces.length === 0) {
activeWorkspace = await this.createAndSaveWorkspace('Default Workspace', true, '🏠'); activeWorkspace = await this.createAndSaveWorkspace('Default Workspace', true, '🏠');
} else { } else {
activeWorkspace = await this.getActiveWorkspace(); activeWorkspace = await this.getActiveWorkspace();
if (!activeWorkspace) { this.activeWorkspace = activeWorkspace?.uuid;
activeWorkspace = workspaces.workspaces.find((workspace) => workspace.default);
this.activeWorkspace = activeWorkspace?.uuid;
}
if (!activeWorkspace) {
activeWorkspace = workspaces.workspaces[0];
this.activeWorkspace = activeWorkspace?.uuid;
}
} }
try { try {
if (activeWorkspace) { if (activeWorkspace) {
window.gZenThemePicker = new ZenThemePicker(); window.gZenThemePicker = new ZenThemePicker();
await this.changeWorkspace(activeWorkspace, { onInit: true }); await this.changeWorkspace(activeWorkspace, { onInit: true });
gBrowser.tabContainer._positionPinnedTabs();
} }
} catch (e) { } catch (e) {
console.error('ZenWorkspaces: Error initializing theme picker', e); console.error('ZenWorkspaces: Error initializing theme picker', e);
} }
} }
this.initIndicatorContextMenu();
} }
initIndicatorContextMenu() { initIndicatorContextMenu(indicator) {
const indicator = document.getElementById('zen-current-workspace-indicator');
const th = (event) => { const th = (event) => {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
@@ -629,7 +776,11 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
async getActiveWorkspace() { async getActiveWorkspace() {
const workspaces = await this._workspaces(); const workspaces = await this._workspaces();
return workspaces.workspaces.find((workspace) => workspace.uuid === this.activeWorkspace) ?? workspaces.workspaces[0]; return (
workspaces.workspaces.find((workspace) => workspace.uuid === this.activeWorkspace) ??
workspaces.workspaces.find((workspace) => workspace.default) ??
workspaces.workspaces[0]
);
} }
// Workspaces dialog UI management // Workspaces dialog UI management
@@ -731,7 +882,6 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
if (!browser.ZenWorkspaces.workspaceEnabled) { if (!browser.ZenWorkspaces.workspaceEnabled) {
return; return;
} }
await browser.ZenWorkspaces.updateWorkspaceIndicator();
let workspaceList = browser.document.getElementById('PanelUI-zen-workspaces-list'); let workspaceList = browser.document.getElementById('PanelUI-zen-workspaces-list');
const createWorkspaceElement = (workspace) => { const createWorkspaceElement = (workspace) => {
let element = browser.document.createXULElement('toolbarbutton'); let element = browser.document.createXULElement('toolbarbutton');
@@ -1025,7 +1175,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
if (!this.workspaceEnabled) { if (!this.workspaceEnabled) {
return; return;
} }
let target = event.target.closest('#zen-current-workspace-indicator') || document.getElementById('zen-workspaces-button'); let target = event.target.closest('.zen-current-workspace-indicator') || document.getElementById('zen-workspaces-button');
let panel = document.getElementById('PanelUI-zen-workspaces'); let panel = document.getElementById('PanelUI-zen-workspaces');
await this._propagateWorkspaceData({ await this._propagateWorkspaceData({
ignoreStrip: true, ignoreStrip: true,
@@ -1058,14 +1208,6 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
button.firstChild.remove(); button.firstChild.remove();
} }
for (let attr of [...button.attributes]) {
if (attr.name !== 'id') {
button.removeAttribute(attr.name);
}
}
button.className = '';
if (this._workspacesButtonClickListener) { if (this._workspacesButtonClickListener) {
button.removeEventListener('click', this._workspacesButtonClickListener); button.removeEventListener('click', this._workspacesButtonClickListener);
this._workspacesButtonClickListener = null; this._workspacesButtonClickListener = null;
@@ -1075,7 +1217,6 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
this._workspaceButtonContextMenuListener = null; this._workspaceButtonContextMenuListener = null;
} }
button.setAttribute('removable', 'true');
button.setAttribute('showInPrivateBrowsing', 'false'); button.setAttribute('showInPrivateBrowsing', 'false');
button.setAttribute('tooltiptext', 'Workspaces'); button.setAttribute('tooltiptext', 'Workspaces');
if (this.shouldShowIconStrip) { if (this.shouldShowIconStrip) {
@@ -1191,13 +1332,25 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
} }
} }
moveTabToWorkspace(tab, workspaceID) {
if (tab.getAttribute('zen-workspace-id') === workspaceID) {
return;
}
tab.setAttribute('zen-workspace-id', workspaceID);
const parent = tab.pinned ? '#zen-browser-tabs-pinned ' : '#zen-browser-tabs ';
const container = document.querySelector(parent + '.zen-workspace-tabs-section');
if (container) {
container.insertBefore(tab, container.firstChild);
}
}
_prepareNewWorkspace(window) { _prepareNewWorkspace(window) {
document.documentElement.setAttribute('zen-workspace-id', window.uuid); document.documentElement.setAttribute('zen-workspace-id', window.uuid);
let tabCount = 0; let tabCount = 0;
for (let tab of gBrowser.tabs) { for (let tab of gBrowser.tabs) {
const isEssential = tab.getAttribute('zen-essential') === 'true'; const isEssential = tab.getAttribute('zen-essential') === 'true';
if (!tab.hasAttribute('zen-workspace-id') && !tab.pinned && !isEssential) { if (!tab.hasAttribute('zen-workspace-id') && !tab.pinned && !isEssential) {
tab.setAttribute('zen-workspace-id', window.uuid); this.moveTabToWorkspace(tab, window.uuid);
tabCount++; tabCount++;
} }
} }
@@ -1212,6 +1365,8 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
if (window.uuid) { if (window.uuid) {
tab.setAttribute('zen-workspace-id', window.uuid); tab.setAttribute('zen-workspace-id', window.uuid);
} }
return tab;
} }
async saveWorkspaceFromCreate() { async saveWorkspaceFromCreate() {
@@ -1276,21 +1431,25 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
if (!this.workspaceEnabled || this._inChangingWorkspace) { if (!this.workspaceEnabled || this._inChangingWorkspace) {
return; return;
} }
await SessionStore.promiseInitialized;
this._inChangingWorkspace = true; this._inChangingWorkspace = true;
try { try {
await this._performWorkspaceChange(window, ...args); await this._performWorkspaceChange(window, ...args);
} finally { } finally {
this._inChangingWorkspace = false; this._inChangingWorkspace = false;
this.tabContainer.removeAttribute('dont-animate-tabs');
} }
} }
async _performWorkspaceChange(window, { onInit = false, explicitAnimationDirection = undefined } = {}) { _cancelSwipeAnimation() {
const previousWorkspace = await this.getActiveWorkspace(); const currentWorkspace = this.activeWorkspace;
this._animateTabs({ uuid: currentWorkspace }, true);
}
if (previousWorkspace && previousWorkspace.uuid === window.uuid && !onInit) { async _performWorkspaceChange(window, { onInit = false, alwaysChange = false, whileScrolling = false } = {}) {
const previousWorkspace = await this.getActiveWorkspace();
alwaysChange = alwaysChange || onInit;
if (previousWorkspace && previousWorkspace.uuid === window.uuid && !alwaysChange) {
this._cancelSwipeAnimation();
return; return;
} }
@@ -1299,99 +1458,130 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
const workspaces = await this._workspaces(); const workspaces = await this._workspaces();
// Refresh tab cache // Refresh tab cache
gBrowser.verticalPinnedTabsContainer = this.pinnedTabsContainer;
gBrowser.tabContainer.verticalPinnedTabsContainer = this.pinnedTabsContainer;
this.tabContainer._invalidateCachedTabs(); this.tabContainer._invalidateCachedTabs();
if (!whileScrolling) {
let animationDirection; await this._organizeWorkspaceStripLocations(previousWorkspace);
if (previousWorkspace && !onInit && !this._animatingChange) {
animationDirection =
explicitAnimationDirection ??
(workspaces.workspaces.findIndex((w) => w.uuid === previousWorkspace.uuid) <
workspaces.workspaces.findIndex((w) => w.uuid === window.uuid)
? 'right'
: 'left');
}
if (animationDirection) {
// Animate tabs out of view before changing workspace, therefor we
// need to animate in the opposite direction
await this._animateTabs(animationDirection === 'left' ? 'right' : 'left', true);
} }
// First pass: Handle tab visibility and workspace ID assignment // First pass: Handle tab visibility and workspace ID assignment
const visibleTabs = this._processTabVisibility(window.uuid, containerId, workspaces); this._processTabVisibility(window.uuid, containerId, workspaces);
// Second pass: Handle tab selection // Second pass: Handle tab selection
await this._handleTabSelection(window, onInit, visibleTabs, containerId, workspaces); this.tabContainer._invalidateCachedTabs();
const tabToSelect = await this._handleTabSelection(window, onInit, containerId, workspaces, previousWorkspace.uuid);
// Update UI and state // Update UI and state
await this._updateWorkspaceState(window, onInit); await this._updateWorkspaceState(window, onInit, tabToSelect);
}
if (animationDirection) { _updateMarginTopPinnedTabs(arrowscrollbox, pinnedContainer) {
await this._animateTabs(animationDirection); if (arrowscrollbox) {
arrowscrollbox.style.marginTop = pinnedContainer.getBoundingClientRect().height + 'px';
} }
} }
async _animateTabs(direction, out = false) { async _organizeWorkspaceStripLocations(workspace, justMove = false, offsetPixels = 0) {
const selector = `#tabbrowser-tabs *:is(.tabbrowser-tab:not([zen-essential], [hidden]), #tabbrowser-arrowscrollbox-periphery, #zen-current-workspace-indicator)`; const workspaces = await this._workspaces();
this.tabContainer.removeAttribute('dont-animate-tabs'); let workspaceIndex = workspaces.workspaces.findIndex((w) => w.uuid === workspace.uuid);
if (out) { if (!justMove) {
return gZenUIManager.motion.animate( this._fixIndicatorsNames(workspaces);
selector,
{
transform: `translateX(${direction === 'left' ? '-' : ''}100%)`,
opacity: 0,
},
{
type: 'spring',
duration: 0.2,
bounce: 0.2,
// delay: gZenUIManager.motion.stagger(0.01),
}
);
} }
return gZenUIManager.motion.animate( for (const otherWorkspace of workspaces.workspaces) {
selector, const selector = `.zen-workspace-tabs-section[zen-workspace-id="${otherWorkspace.uuid}"]`;
{ const newTransform = -(workspaceIndex - workspaces.workspaces.indexOf(otherWorkspace)) * 100;
transform: [`translateX(${direction === 'left' ? '-' : ''}100%)`, 'translateX(0%)'], for (const container of document.querySelectorAll(selector)) {
opacity: 1, container.style.transform = `translateX(${newTransform + offsetPixels / 2}%)`;
}, container.style.opacity = offsetPixels ? 1 : !newTransform;
{ if (!offsetPixels && !container.hasAttribute('active')) {
duration: 0.2, container.setAttribute('hidden', 'true');
type: 'spring', } else {
bounce: 0.2, container.removeAttribute('hidden');
// delay: gZenUIManager.motion.stagger(0.01), }
} }
); }
}
updateWorkspaceIndicator(currentWorkspace, workspaceIndicator) {
if (!workspaceIndicator) {
return;
}
const indicatorName = workspaceIndicator.querySelector('.zen-current-workspace-indicator-name');
const indicatorIcon = workspaceIndicator.querySelector('.zen-current-workspace-indicator-icon');
if (this.workspaceHasIcon(currentWorkspace)) {
indicatorIcon.removeAttribute('no-icon');
} else {
indicatorIcon.setAttribute('no-icon', 'true');
}
indicatorIcon.textContent = this.getWorkspaceIcon(currentWorkspace);
indicatorName.textContent = currentWorkspace.name;
}
_fixIndicatorsNames(workspaces) {
for (const workspace of workspaces.workspaces) {
const workspaceIndicator = document.querySelector(
`#zen-current-workspace-indicator-container .zen-workspace-tabs-section[zen-workspace-id="${workspace.uuid}"]`
);
this.updateWorkspaceIndicator(workspace, workspaceIndicator);
}
}
async _animateTabs(newWorkspace, shouldAnimate, tabToSelect = null) {
this._animatingChange = true;
const animations = [];
const workspaces = await this._workspaces();
const newWorkspaceIndex = workspaces.workspaces.findIndex((w) => w.uuid === newWorkspace.uuid);
for (const element of document.querySelectorAll('.zen-workspace-tabs-section')) {
const existingTransform = element.style.transform;
const elementWorkspaceId = element.getAttribute('zen-workspace-id');
const elementWorkspaceIndex = workspaces.workspaces.findIndex((w) => w.uuid === elementWorkspaceId);
const offset = -(newWorkspaceIndex - elementWorkspaceIndex) * 100;
const newTransform = `translateX(${offset}%)`;
const isCurrent = offset === 0;
if (shouldAnimate) {
element.removeAttribute('hidden');
if (isCurrent) {
element.style.opacity = 1;
}
animations.push(
gZenUIManager.motion.animate(
element,
{
transform: existingTransform ? [existingTransform, newTransform] : newTransform,
// -0 to convert to number
opacity: !isCurrent ? [!!offset - 0, !offset - 0] : [1, 1],
},
{
type: 'spring',
bounce: 0,
duration: 0.3,
}
)
);
}
if (offset === 0) {
element.setAttribute('active', 'true');
if (tabToSelect != gBrowser.selectedTab) {
gBrowser.selectedTab = tabToSelect;
}
} else {
element.removeAttribute('active');
}
}
await Promise.all(animations);
this._animatingChange = false;
} }
_processTabVisibility(workspaceUuid, containerId, workspaces) { _processTabVisibility(workspaceUuid, containerId, workspaces) {
const visibleTabs = new Set();
const lastSelectedTab = this._lastSelectedWorkspaceTabs[workspaceUuid];
this.tabContainer.setAttribute('dont-animate-tabs', 'true');
for (const tab of gBrowser.tabs) { for (const tab of gBrowser.tabs) {
const tabWorkspaceId = tab.getAttribute('zen-workspace-id'); if (!this._shouldShowTab(tab, workspaceUuid, containerId, workspaces)) {
const isEssential = tab.getAttribute('zen-essential') === 'true';
// Always hide last selected tabs from other workspaces
if (lastSelectedTab === tab && tabWorkspaceId !== workspaceUuid && !isEssential) {
gBrowser.hideTab(tab, undefined, true);
continue;
}
if (this._shouldShowTab(tab, workspaceUuid, containerId, workspaces)) {
gBrowser.showTab(tab);
visibleTabs.add(tab);
// Assign workspace ID if needed
if (!tabWorkspaceId && !isEssential) {
tab.setAttribute('zen-workspace-id', workspaceUuid);
}
} else {
gBrowser.hideTab(tab, undefined, true); gBrowser.hideTab(tab, undefined, true);
} else if (tab.hasAttribute('zen-essential')) {
gBrowser.showTab(tab, undefined, true);
} }
} }
return visibleTabs;
} }
_shouldShowTab(tab, workspaceUuid, containerId, workspaces) { _shouldShowTab(tab, workspaceUuid, containerId, workspaces) {
@@ -1422,7 +1612,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
// For non-essential tabs (both normal and pinned) // For non-essential tabs (both normal and pinned)
if (!tabWorkspaceId) { if (!tabWorkspaceId) {
// Assign workspace ID to tabs without one // Assign workspace ID to tabs without one
tab.setAttribute('zen-workspace-id', workspaceUuid); this.moveTabToWorkspace(tab, workspaceUuid);
return true; return true;
} }
@@ -1430,9 +1620,9 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
return tabWorkspaceId === workspaceUuid; return tabWorkspaceId === workspaceUuid;
} }
async _handleTabSelection(window, onInit, visibleTabs, containerId, workspaces) { async _handleTabSelection(window, onInit, containerId, workspaces, previousWorkspaceId) {
const currentSelectedTab = gBrowser.selectedTab; const currentSelectedTab = gBrowser.selectedTab;
const oldWorkspaceId = currentSelectedTab.getAttribute('zen-workspace-id'); const oldWorkspaceId = previousWorkspaceId;
const lastSelectedTab = this._lastSelectedWorkspaceTabs[window.uuid]; const lastSelectedTab = this._lastSelectedWorkspaceTabs[window.uuid];
// Save current tab as last selected for old workspace if it shouldn't be visible in new workspace // Save current tab as last selected for old workspace if it shouldn't be visible in new workspace
@@ -1441,53 +1631,54 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
} }
let tabToSelect = null; let tabToSelect = null;
// If current tab is visible in new workspace, keep it
if (this._shouldShowTab(currentSelectedTab, window.uuid, containerId, workspaces) && visibleTabs.has(currentSelectedTab)) {
tabToSelect = currentSelectedTab;
}
// Try last selected tab if it is visible // Try last selected tab if it is visible
else if ( if (lastSelectedTab && this._shouldShowTab(lastSelectedTab, window.uuid, containerId, workspaces)) {
lastSelectedTab &&
this._shouldShowTab(lastSelectedTab, window.uuid, containerId, workspaces) &&
visibleTabs.has(lastSelectedTab)
) {
tabToSelect = lastSelectedTab; tabToSelect = lastSelectedTab;
} }
// Find first suitable tab // Find first suitable tab
else { else {
tabToSelect = Array.from(visibleTabs).find((tab) => !tab.pinned); tabToSelect = gBrowser.visibleTabs.find((tab) => !tab.pinned);
if (!tabToSelect && gBrowser.visibleTabs.length) {
tabToSelect = gBrowser.visibleTabs[gBrowser.visibleTabs.length - 1];
}
} }
const previousSelectedTab = gBrowser.selectedTab;
// If we found a tab to select, select it // If we found a tab to select, select it
if (tabToSelect) { if (!onInit && !tabToSelect) {
gBrowser.selectedTab = tabToSelect;
this._lastSelectedWorkspaceTabs[window.uuid] = tabToSelect;
} else if (!onInit) {
// Create new tab if needed and no suitable tab was found // Create new tab if needed and no suitable tab was found
const newTab = this._createNewTabForWorkspace(window); const newTab = this._createNewTabForWorkspace(window);
gBrowser.selectedTab = newTab; tabToSelect = newTab;
this._lastSelectedWorkspaceTabs[window.uuid] = newTab; }
if (tabToSelect) {
tabToSelect._visuallySelected = true;
} }
// After selecting the new tab, hide the previous selected tab if it shouldn't be visible in the new workspace // Always make sure we always unselect the tab from the old workspace
if (!this._shouldShowTab(previousSelectedTab, window.uuid, containerId, workspaces)) { if (currentSelectedTab && currentSelectedTab !== tabToSelect) {
gBrowser.hideTab(previousSelectedTab, undefined, true); currentSelectedTab._selected = false;
} }
return tabToSelect;
} }
async _updateWorkspaceState(window, onInit) { async _updateWorkspaceState(window, onInit, tabToSelect) {
// Update document state // Update document state
document.documentElement.setAttribute('zen-workspace-id', window.uuid); document.documentElement.setAttribute('zen-workspace-id', window.uuid);
// Recalculate new tab observers
gBrowser.tabContainer.observe(null, 'nsPref:changed', 'privacy.userContext.enabled');
// Update workspace UI // Update workspace UI
await this._updateWorkspacesChangeContextMenu(); await this._updateWorkspacesChangeContextMenu();
document.getElementById('tabbrowser-tabs')._positionPinnedTabs();
gZenUIManager.updateTabsToolbar(); gZenUIManager.updateTabsToolbar();
await this._propagateWorkspaceData({ clearCache: false }); await this._propagateWorkspaceData({ clearCache: false });
gZenThemePicker.onWorkspaceChange(window);
document.getElementById('zen-tabs-wrapper').style.scrollbarWidth = 'none';
await this._animateTabs(window, !onInit && !this._animatingChange, tabToSelect);
await this._organizeWorkspaceStripLocations(window, true);
document.getElementById('zen-tabs-wrapper').style.scrollbarWidth = '';
// Notify listeners // Notify listeners
if (this._changeListeners?.length) { if (this._changeListeners?.length) {
for (const listener of this._changeListeners) { for (const listener of this._changeListeners) {
@@ -1499,7 +1690,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
this._invalidateBookmarkContainers(); this._invalidateBookmarkContainers();
// Update workspace indicator // Update workspace indicator
await this.updateWorkspaceIndicator(); await this.updateWorkspaceIndicator(window, this.workspaceIndicator);
} }
_invalidateBookmarkContainers() { _invalidateBookmarkContainers() {
@@ -1512,22 +1703,6 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
} }
} }
async updateWorkspaceIndicator() {
// Update current workspace indicator
const currentWorkspace = await this.getActiveWorkspace();
if (!currentWorkspace) return;
const indicatorName = document.getElementById('zen-current-workspace-indicator-name');
const indicatorIcon = document.getElementById('zen-current-workspace-indicator-icon');
if (this.workspaceHasIcon(currentWorkspace)) {
indicatorIcon.removeAttribute('no-icon');
} else {
indicatorIcon.setAttribute('no-icon', 'true');
}
indicatorIcon.textContent = this.getWorkspaceIcon(currentWorkspace);
indicatorName.textContent = currentWorkspace.name;
}
async _updateWorkspacesChangeContextMenu() { async _updateWorkspacesChangeContextMenu() {
const workspaces = await this._workspaces(); const workspaces = await this._workspaces();
@@ -1552,7 +1727,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
} }
} }
_createWorkspaceData(name, isDefault, icon) { _createWorkspaceData(name, isDefault, icon, tabs) {
let window = { let window = {
uuid: gZenUIManager.generateUuidv4(), uuid: gZenUIManager.generateUuidv4(),
default: isDefault, default: isDefault,
@@ -1561,6 +1736,10 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
theme: ZenThemePicker.getTheme([]), theme: ZenThemePicker.getTheme([]),
}; };
this._prepareNewWorkspace(window); this._prepareNewWorkspace(window);
const perifery = document.querySelector('#tabbrowser-arrowscrollbox-periphery[hidden]');
perifery?.removeAttribute('hidden');
this._createWorkspaceTabsSection(window, tabs, perifery);
perifery.setAttribute('hidden', 'true');
return window; return window;
} }
@@ -1568,12 +1747,49 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
if (!this.workspaceEnabled) { if (!this.workspaceEnabled) {
return; return;
} }
let workspaceData = this._createWorkspaceData(name, isDefault, icon); // get extra tabs remaning (e.g. on new profiles) and just move them to the new workspace
const extraTabs = Array.from(gBrowser.tabContainer.arrowScrollbox.children).filter(
(child) => child.tagName === 'tab' && !child.hasAttribute('zen-workspace-id')
);
let workspaceData = this._createWorkspaceData(name, isDefault, icon, extraTabs);
await this.saveWorkspace(workspaceData); await this.saveWorkspace(workspaceData);
this.registerPinnedResizeObserver();
let changed = extraTabs.length > 0;
if (changed) {
gBrowser.tabContainer._invalidateCachedTabs();
gBrowser.selectedTab = extraTabs[0];
}
await this.changeWorkspace(workspaceData); await this.changeWorkspace(workspaceData);
return workspaceData; return workspaceData;
} }
updateTabsContainers() {
this.onPinnedTabsResize([{ target: this.pinnedTabsContainer }]);
}
updateShouldHideSeparator(arrowScrollbox, pinnedContainer) {
const shouldHideSeparator = pinnedContainer.children.length === 1 || arrowScrollbox.children.length === 1;
if (shouldHideSeparator) {
pinnedContainer.setAttribute('hide-separator', 'true');
} else {
pinnedContainer.removeAttribute('hide-separator');
}
}
onPinnedTabsResize(entries) {
if (!this._hasInitializedTabsStrip) {
return;
}
for (const entry of entries) {
const workspaceId = entry.target.getAttribute('zen-workspace-id');
const arrowScrollbox = document.querySelector(
`#tabbrowser-arrowscrollbox .zen-workspace-tabs-section[zen-workspace-id="${workspaceId}"]`
);
this._updateMarginTopPinnedTabs(arrowScrollbox, entry.target);
this.updateShouldHideSeparator(arrowScrollbox, entry.target);
}
}
async onTabBrowserInserted(event) { async onTabBrowserInserted(event) {
let tab = event.originalTarget; let tab = event.originalTarget;
const isEssential = tab.getAttribute('zen-essential') === 'true'; const isEssential = tab.getAttribute('zen-essential') === 'true';
@@ -1609,12 +1825,48 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
} }
// Switch workspace if needed // Switch workspace if needed
if (workspaceID && workspaceID !== activeWorkspace.uuid) { if (workspaceID && workspaceID !== activeWorkspace.uuid && parent.ZenWorkspaces._hasInitializedTabsStrip) {
await parent.ZenWorkspaces.changeWorkspace({ uuid: workspaceID }); await parent.ZenWorkspaces.changeWorkspace({ uuid: workspaceID });
} }
} }
} }
makeSurePinTabIsInCorrectPosition() {
if (!this.pinnedTabsContainer) {
return 0; // until we initialize the pinned tabs container
}
const tabsInsidePinTab = Array.from(this.pinnedTabsContainer.parentElement.children).filter(
(child) => child.tagName === 'tab'
);
let changed = false;
for (const tab of tabsInsidePinTab) {
if (tab.getAttribute('zen-glance-tab') === 'true') {
continue;
}
if (tab.getAttribute('zen-essential') === 'true') {
const container = document.getElementById('zen-essentials-container');
container.appendChild(tab);
changed = true;
continue;
}
const workspaceId = tab.getAttribute('zen-workspace-id');
if (!workspaceId) {
continue;
}
const contaienr = document.querySelector(
`#vertical-pinned-tabs-container .zen-workspace-tabs-section[zen-workspace-id="${workspaceId}"]`
);
contaienr.insertBefore(tab, contaienr.firstChild);
changed = true;
}
if (changed) {
gBrowser.tabContainer._invalidateCachedTabs();
}
// Return the number of essentials INSIDE the pinned tabs container so we can correctly change their parent
return Array.from(this.pinnedTabsContainer.children).filter((child) => child.getAttribute('zen-essential') === 'true')
.length;
}
// Context menu management // Context menu management
_contextMenuId = null; _contextMenuId = null;
@@ -1711,7 +1963,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
this._emojis = null; this._emojis = null;
} }
async changeWorkspaceShortcut(offset = 1) { async changeWorkspaceShortcut(offset = 1, whileScrolling = false) {
// Cycle through workspaces // Cycle through workspaces
let workspaces = await this._workspaces(); let workspaces = await this._workspaces();
let activeWorkspace = await this.getActiveWorkspace(); let activeWorkspace = await this.getActiveWorkspace();
@@ -1728,7 +1980,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
} }
let nextWorkspace = workspaces.workspaces[targetIndex]; let nextWorkspace = workspaces.workspaces[targetIndex];
await this.changeWorkspace(nextWorkspace, { explicitAnimationDirection: offset > 0 ? 'right' : 'left' }); await this.changeWorkspace(nextWorkspace, { whileScrolling });
} }
_initializeWorkspaceTabContextMenus() { _initializeWorkspaceTabContextMenus() {
@@ -1750,7 +2002,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
document.getElementById('tabContextMenu').hidePopup(); document.getElementById('tabContextMenu').hidePopup();
const previousWorkspaceID = document.documentElement.getAttribute('zen-workspace-id'); const previousWorkspaceID = document.documentElement.getAttribute('zen-workspace-id');
for (let tab of tabs) { for (let tab of tabs) {
tab.setAttribute('zen-workspace-id', workspaceID); this.moveTabToWorkspace(tab, workspaceID);
if (this._lastSelectedWorkspaceTabs[previousWorkspaceID] === tab) { if (this._lastSelectedWorkspaceTabs[previousWorkspaceID] === tab) {
// This tab is no longer the last selected tab in the previous workspace because it's being moved to // This tab is no longer the last selected tab in the previous workspace because it's being moved to
// the current workspace // the current workspace
@@ -1788,7 +2040,13 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
if (matchingWorkspaces.length === 1) { if (matchingWorkspaces.length === 1) {
const workspace = matchingWorkspaces[0]; const workspace = matchingWorkspaces[0];
if (workspace.uuid !== this.getActiveWorkspaceFromCache().uuid) { if (workspace.uuid !== this.getActiveWorkspaceFromCache().uuid) {
this.changeWorkspace(workspace); window.addEventListener(
'TabSelected',
(event) => {
this.changeWorkspace(workspace, { alwaysChange: true });
},
{ once: true }
);
return [userContextId, true, workspace.uuid]; return [userContextId, true, workspace.uuid];
} }
} }
@@ -1837,4 +2095,43 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
// Return true only if the bookmark is in another workspace and not in the active one // Return true only if the bookmark is in another workspace and not in the active one
return isInOtherWorkspace && !isInActiveWorkspace; return isInOtherWorkspace && !isInActiveWorkspace;
} }
// Session restore functions
get allStoredTabs() {
if (!this._hasInitializedTabsStrip) {
const children = Array.from(this.tabboxChildren);
children.pop(); // Remove the last child which is the new tab button
return children;
}
const tabs = [];
// we need to go through each tab in each container
const essentialsContainer = document.getElementById('zen-essentials-container');
const pinnedContainers = document.querySelectorAll('#vertical-pinned-tabs-container .zen-workspace-tabs-section');
const normalContainers = document.querySelectorAll('#tabbrowser-arrowscrollbox .zen-workspace-tabs-section');
const containers = [essentialsContainer, ...pinnedContainers, ...normalContainers];
for (const container of containers) {
for (const tab of container.children) {
if (tab.tagName === 'tab' || tab.tagName == 'tab-group') {
tabs.push(tab);
}
}
}
return tabs;
}
get pinnedTabCount() {
return this.pinnedTabsContainer.children.length - 1;
}
get normalTabCount() {
return this.tabboxChildren.length - 1;
}
get allWorkspaceTabs() {
const currentWorkspace = this.activeWorkspace;
return this.allStoredTabs.filter(
(tab) => tab.hasAttribute('zen-essential') || tab.getAttribute('zen-workspace-id') === currentWorkspace
);
}
})(); })();

View File

@@ -96,7 +96,7 @@ export class ZenGlanceChild extends JSWindowActorChild {
} }
handleClick(event) { handleClick(event) {
if (this.ensureOnlyKeyModifiers(event)) { if (this.ensureOnlyKeyModifiers(event) || event.button !== 0 || event.defaultPrevented) {
return; return;
} }
const activationMethod = this._activationMethod; const activationMethod = this._activationMethod;

View File

@@ -122,10 +122,10 @@ export class ZenThemeMarketplaceParent extends JSWindowActorParent {
} }
getStyleSheetFullContent(style = '') { getStyleSheetFullContent(style = '') {
let stylesheet = '@-moz-document url-prefix("chrome:") {'; let stylesheet = '@-moz-document url-prefix("chrome:") {\n';
for (const line of style.split('\n')) { for (const line of style.split('\n')) {
stylesheet += ` ${line}`; stylesheet += ` ${line}\n`;
} }
stylesheet += '}'; stylesheet += '}';

View File

@@ -1,8 +1,24 @@
diff --git a/browser/components/BrowserGlue.sys.mjs b/browser/components/BrowserGlue.sys.mjs diff --git a/browser/components/BrowserGlue.sys.mjs b/browser/components/BrowserGlue.sys.mjs
index 2de73e75bf98b21dde9ec05213a66f9e9039200f..04ab3ea4c47d674778e8965654867c4cf0f99161 100644 index b888a753a7f23a9800fe04da51a4e6b898314ff2..35eea774e1ea4b1807ec65ebc767f423d81602bd 100644
--- a/browser/components/BrowserGlue.sys.mjs --- a/browser/components/BrowserGlue.sys.mjs
+++ b/browser/components/BrowserGlue.sys.mjs +++ b/browser/components/BrowserGlue.sys.mjs
@@ -4643,6 +4643,7 @@ BrowserGlue.prototype = { @@ -121,6 +121,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
WindowsGPOParser: "resource://gre/modules/policies/WindowsGPOParser.sys.mjs",
clearTimeout: "resource://gre/modules/Timer.sys.mjs",
setTimeout: "resource://gre/modules/Timer.sys.mjs",
+ gZenUIMigration: "chrome://browser/content/zen-components/ZenUIMigration.mjs",
});
if (AppConstants.MOZ_UPDATER) {
@@ -1951,6 +1952,7 @@ BrowserGlue.prototype = {
lazy.UrlbarPrefs.updateFirefoxSuggestScenario();
+ lazy.gZenUIMigration.init(this._isNewProfile, aWindow);
// A channel for "remote troubleshooting" code...
let channel = new lazy.WebChannel(
"remote-troubleshooting",
@@ -4761,6 +4763,7 @@ BrowserGlue.prototype = {
}, },
async _maybeShowDefaultBrowserPrompt() { async _maybeShowDefaultBrowserPrompt() {
@@ -10,7 +26,7 @@ index 2de73e75bf98b21dde9ec05213a66f9e9039200f..04ab3ea4c47d674778e8965654867c4c
// Highest priority is about:welcome window modal experiment // Highest priority is about:welcome window modal experiment
// Second highest priority is the upgrade dialog, which can include a "primary // Second highest priority is the upgrade dialog, which can include a "primary
// browser" request and is limited in various ways, e.g., major upgrades. // browser" request and is limited in various ways, e.g., major upgrades.
@@ -5169,6 +5170,16 @@ BrowserGlue.prototype = { @@ -5302,6 +5305,16 @@ BrowserGlue.prototype = {
"nsIObserver", "nsIObserver",
"nsISupportsWeakReference", "nsISupportsWeakReference",
]), ]),

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs diff --git a/browser/components/customizableui/CustomizableUI.sys.mjs b/browser/components/customizableui/CustomizableUI.sys.mjs
index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..1a3142c58af638a731f546b8695a0fc3fab9054c 100644 index e6b9b7dcfab179e7552c146eb1551b45ad042266..d9d838a7a51f67b52b69f419024cc3174ae5260b 100644
--- a/browser/components/customizableui/CustomizableUI.sys.mjs --- a/browser/components/customizableui/CustomizableUI.sys.mjs
+++ b/browser/components/customizableui/CustomizableUI.sys.mjs +++ b/browser/components/customizableui/CustomizableUI.sys.mjs
@@ -13,6 +13,7 @@ ChromeUtils.defineESModuleGetters(lazy, { @@ -13,6 +13,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
@@ -19,8 +19,8 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..1a3142c58af638a731f546b8695a0fc3
const kSpecialWidgetPfx = "customizableui-special-"; const kSpecialWidgetPfx = "customizableui-special-";
@@ -307,13 +308,11 @@ var CustomizableUIInternal = { @@ -317,13 +318,11 @@ var CustomizableUIInternal = {
"spring", "vertical-spacer",
"urlbar-container", "urlbar-container",
"spring", "spring",
- "save-to-pocket-button", - "save-to-pocket-button",
@@ -35,7 +35,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..1a3142c58af638a731f546b8695a0fc3
this.registerArea( this.registerArea(
CustomizableUI.AREA_NAVBAR, CustomizableUI.AREA_NAVBAR,
{ {
@@ -321,7 +320,6 @@ var CustomizableUIInternal = { @@ -331,7 +330,6 @@ var CustomizableUIInternal = {
overflowable: true, overflowable: true,
defaultPlacements: navbarPlacements, defaultPlacements: navbarPlacements,
verticalTabsDefaultPlacements: [ verticalTabsDefaultPlacements: [
@@ -43,7 +43,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..1a3142c58af638a731f546b8695a0fc3
"alltabs-button", "alltabs-button",
], ],
defaultCollapsed: false, defaultCollapsed: false,
@@ -346,10 +344,7 @@ var CustomizableUIInternal = { @@ -356,10 +354,7 @@ var CustomizableUIInternal = {
{ {
type: CustomizableUI.TYPE_TOOLBAR, type: CustomizableUI.TYPE_TOOLBAR,
defaultPlacements: [ defaultPlacements: [
@@ -54,7 +54,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..1a3142c58af638a731f546b8695a0fc3
], ],
verticalTabsDefaultPlacements: [], verticalTabsDefaultPlacements: [],
defaultCollapsed: null, defaultCollapsed: null,
@@ -412,6 +407,7 @@ var CustomizableUIInternal = { @@ -422,6 +417,7 @@ var CustomizableUIInternal = {
CustomizableUI.AREA_NAVBAR, CustomizableUI.AREA_NAVBAR,
CustomizableUI.AREA_BOOKMARKS, CustomizableUI.AREA_BOOKMARKS,
CustomizableUI.AREA_TABSTRIP, CustomizableUI.AREA_TABSTRIP,
@@ -62,7 +62,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..1a3142c58af638a731f546b8695a0fc3
]); ]);
if (AppConstants.platform != "macosx") { if (AppConstants.platform != "macosx") {
toolbars.add(CustomizableUI.AREA_MENUBAR); toolbars.add(CustomizableUI.AREA_MENUBAR);
@@ -1127,6 +1123,9 @@ var CustomizableUIInternal = { @@ -1151,6 +1147,9 @@ var CustomizableUIInternal = {
placements = gPlacements.get(area); placements = gPlacements.get(area);
} }
@@ -72,7 +72,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..1a3142c58af638a731f546b8695a0fc3
// For toolbars that need it, mark as dirty. // For toolbars that need it, mark as dirty.
let defaultPlacements = areaProperties.get("defaultPlacements"); let defaultPlacements = areaProperties.get("defaultPlacements");
if ( if (
@@ -1540,7 +1539,7 @@ var CustomizableUIInternal = { @@ -1564,7 +1563,7 @@ var CustomizableUIInternal = {
lazy.log.info( lazy.log.info(
"Widget " + aWidgetId + " not found, unable to remove from " + aArea "Widget " + aWidgetId + " not found, unable to remove from " + aArea
); );
@@ -81,7 +81,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..1a3142c58af638a731f546b8695a0fc3
} }
this.notifyDOMChange(widgetNode, null, container, true, () => { this.notifyDOMChange(widgetNode, null, container, true, () => {
@@ -1550,7 +1549,7 @@ var CustomizableUIInternal = { @@ -1574,7 +1573,7 @@ var CustomizableUIInternal = {
// We also need to remove the panel context menu if it's there: // We also need to remove the panel context menu if it's there:
this.ensureButtonContextMenu(widgetNode); this.ensureButtonContextMenu(widgetNode);
if (gPalette.has(aWidgetId) || this.isSpecialWidget(aWidgetId)) { if (gPalette.has(aWidgetId) || this.isSpecialWidget(aWidgetId)) {
@@ -90,7 +90,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..1a3142c58af638a731f546b8695a0fc3
} else { } else {
window.gNavToolbox.palette.appendChild(widgetNode); window.gNavToolbox.palette.appendChild(widgetNode);
} }
@@ -2654,7 +2653,6 @@ var CustomizableUIInternal = { @@ -2678,7 +2677,6 @@ var CustomizableUIInternal = {
if (!this.isWidgetRemovable(aWidgetId)) { if (!this.isWidgetRemovable(aWidgetId)) {
return; return;
} }
@@ -98,7 +98,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..1a3142c58af638a731f546b8695a0fc3
let placements = gPlacements.get(oldPlacement.area); let placements = gPlacements.get(oldPlacement.area);
let position = placements.indexOf(aWidgetId); let position = placements.indexOf(aWidgetId);
if (position != -1) { if (position != -1) {
@@ -3609,7 +3607,7 @@ var CustomizableUIInternal = { @@ -3669,7 +3667,7 @@ var CustomizableUIInternal = {
} }
}, },
@@ -107,7 +107,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..1a3142c58af638a731f546b8695a0fc3
for (let [areaId, areaNodes] of gBuildAreas) { for (let [areaId, areaNodes] of gBuildAreas) {
let placements = gPlacements.get(areaId); let placements = gPlacements.get(areaId);
let isFirstChangedToolbar = true; let isFirstChangedToolbar = true;
@@ -3620,7 +3618,7 @@ var CustomizableUIInternal = { @@ -3680,7 +3678,7 @@ var CustomizableUIInternal = {
if (area.get("type") == CustomizableUI.TYPE_TOOLBAR) { if (area.get("type") == CustomizableUI.TYPE_TOOLBAR) {
let defaultCollapsed = area.get("defaultCollapsed"); let defaultCollapsed = area.get("defaultCollapsed");
let win = areaNode.ownerGlobal; let win = areaNode.ownerGlobal;
@@ -116,7 +116,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..1a3142c58af638a731f546b8695a0fc3
win.setToolbarVisibility( win.setToolbarVisibility(
areaNode, areaNode,
typeof defaultCollapsed == "string" typeof defaultCollapsed == "string"
@@ -4583,6 +4581,7 @@ export var CustomizableUI = { @@ -4658,6 +4656,7 @@ export var CustomizableUI = {
unregisterArea(aName, aDestroyPlacements) { unregisterArea(aName, aDestroyPlacements) {
CustomizableUIInternal.unregisterArea(aName, aDestroyPlacements); CustomizableUIInternal.unregisterArea(aName, aDestroyPlacements);
}, },
@@ -124,17 +124,31 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..1a3142c58af638a731f546b8695a0fc3
/** /**
* Add a widget to an area. * Add a widget to an area.
* If the area to which you try to add is not known to CustomizableUI, * If the area to which you try to add is not known to CustomizableUI,
@@ -6404,7 +6403,8 @@ class OverflowableToolbar { @@ -6483,11 +6482,11 @@ class OverflowableToolbar {
this.#target
);
totalAvailWidth =
- getInlineSize(this.#toolbar) -
+ ((win.gZenVerticalTabsManager._hasSetSingleToolbar ? parseInt(this.#toolbar.closest("#navigator-toolbox")?.getAttribute("width")) : 0) ||
+ getInlineSize(this.#toolbar)) -
parseFloat(style.paddingLeft) - parseFloat(style.paddingLeft) -
parseFloat(style.paddingRight) - parseFloat(style.paddingRight) -
toolbarChildrenWidth; toolbarChildrenWidth;
@@ -6516,7 +6516,7 @@ class OverflowableToolbar { - targetWidth = getInlineSize(this.#target);
+ targetWidth = getInlineSize(this.#target) - ((win.gZenVerticalTabsManager._hasSetSingleToolbar && this.#target.id == 'zen-sidebar-top-buttons-customization-target') ? win.gZenVerticalTabsManager._topButtonsSeparatorElement.getBoundingClientRect().width : 0);
targetChildrenWidth =
this.#target == this.#toolbar
? toolbarChildrenWidth
- : sumChildrenInlineSize(this.#target);
+ : sumChildrenInlineSize(this.#target, win.gZenVerticalTabsManager._topButtonsSeparatorElement);
});
lazy.log.debug(
@@ -6497,7 +6496,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;
+ 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;
return { isOverflowing, targetContentWidth, totalAvailWidth };
}
@@ -6591,7 +6591,7 @@ class OverflowableToolbar {
} }
} }
if (!inserted) { if (!inserted) {
@@ -143,3 +157,13 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..1a3142c58af638a731f546b8695a0fc3
} }
child.removeAttribute("cui-anchorid"); child.removeAttribute("cui-anchorid");
child.removeAttribute("overflowedItem"); child.removeAttribute("overflowedItem");
@@ -6753,6 +6753,9 @@ class OverflowableToolbar {
* @param {MouseEvent} aEvent the click event.
*/
#onClickDefaultListButton(aEvent) {
+ if (aEvent.view.gZenVerticalTabsManager._hasSetSingleToolbar && this.#toolbar.id == 'nav-bar') {
+ return;
+ }
if (this.#defaultListButton.open) {
this.#defaultListButton.open = false;
lazy.PanelMultiView.hidePopup(this.#defaultListPanel);

View File

@@ -1,58 +1,50 @@
diff --git a/browser/components/places/content/editBookmarkPanel.inc.xhtml b/browser/components/places/content/editBookmarkPanel.inc.xhtml diff --git a/browser/components/places/content/editBookmarkPanel.inc.xhtml b/browser/components/places/content/editBookmarkPanel.inc.xhtml
index 3ec3f094831c2143a818b43d1761a571f0ffa63d..98704f399089f2a33776c6ae9565b8ff9b8ddd34 100644 index 40366677b60123c66bf0739d1b2374b423d3061c..3e722dce6b21ab62535369f20afe5f0acd43838f 100644
--- a/browser/components/places/content/editBookmarkPanel.inc.xhtml --- a/browser/components/places/content/editBookmarkPanel.inc.xhtml
+++ b/browser/components/places/content/editBookmarkPanel.inc.xhtml +++ b/browser/components/places/content/editBookmarkPanel.inc.xhtml
@@ -5,7 +5,7 @@ @@ -12,14 +12,15 @@
<div id="editBookmarkPanelContent"> <html:input id="editBMPanel_namePicker"
<label id="editBMPanel_itemsCountText" class="editBMPanel_nameRow hideable"
class="editBMPanel_selectionCount"/> type="text"/>
- -
+<hbox flex="1" class="zenEditBMPanel_fieldContainer"> +<hbox flex="1" class="zenEditBMPanel_fieldContainer">
<label data-l10n-id="bookmark-overlay-name-2"
class="editBMPanel_nameRow hideable"
control="editBMPanel_namePicker"/>
@@ -13,7 +13,7 @@
class="editBMPanel_nameRow hideable"
type="text"
onchange="gEditItemOverlay.onNamePickerChange().catch(Cu.reportError);"/>
-
+</hbox>
<label data-l10n-id="bookmark-overlay-url" <label data-l10n-id="bookmark-overlay-url"
class="editBMPanel_locationRow hideable" class="editBMPanel_locationRow hideable"
control="editBMPanel_locationField"/> control="editBMPanel_locationField"/>
@@ -21,7 +21,7 @@ <html:input id="editBMPanel_locationField"
class="editBMPanel_locationRow uri-element hideable" class="editBMPanel_locationRow uri-element hideable"
type="text" type="text"/>
onchange="gEditItemOverlay.onLocationFieldChange();"/>
- -
+</hbox>
+<hbox flex="1" class="zenEditBMPanel_fieldContainer"> +<hbox flex="1" class="zenEditBMPanel_fieldContainer">
<label data-l10n-id="bookmark-overlay-location-2" <label data-l10n-id="bookmark-overlay-location-2"
class="editBMPanel_folderRow hideable" class="editBMPanel_folderRow hideable"
control="editBMPanel_folderMenuList"/> control="editBMPanel_folderMenuList"/>
@@ -51,6 +51,26 @@ @@ -47,7 +48,26 @@
data-l10n-id="bookmark-overlay-folders-expander2" class="expander-down panel-button"
oncommand="gEditItemOverlay.toggleFolderTreeVisibility();"/> data-l10n-id="bookmark-overlay-folders-expander2"/>
</hbox> </hbox>
+</hbox> -
+ <hbox flex="1" class="zenEditBMPanel_fieldContainer">
+ <label data-l10n-id="zen-bookmark-edit-panel-workspace-selector"
+ class="hideable"
+ control="editBMPanel_workspacesSelectorExpander"/>
+ <div id="editBMPanel_workspaceDropdown"
+ class="editBMPanel_workspaceRow hideable workspace-dropdown">
+ <div
+ id="editBMPanel_workspaceSummary"
+ class="workspace-trigger">-</div>
+ <button id="editBMPanel_workspacesSelectorExpander"
+ class="expander-down panel-button"
+ data-l10n-id="bookmark-overlay-tags-expander2"
+ oncommand="gEditItemOverlay.onWorkspaceDropdownToggle();"/>
+
+ </div>
+ </hbox> + </hbox>
+ + <hbox flex="1" class="zenEditBMPanel_fieldContainer">
+ <ul id="editBMPanel_workspaceList" class="workspace-list hideable" hidden="true"> + <label data-l10n-id="zen-bookmark-edit-panel-workspace-selector"
+ </ul> + class="hideable"
+ control="editBMPanel_workspacesSelectorExpander"/>
+ <div id="editBMPanel_workspaceDropdown"
+ class="editBMPanel_workspaceRow hideable workspace-dropdown">
+ <div
+ id="editBMPanel_workspaceSummary"
+ class="workspace-trigger">-</div>
+ <button id="editBMPanel_workspacesSelectorExpander"
+ class="expander-down panel-button"
+ data-l10n-id="bookmark-overlay-tags-expander2"
+ oncommand="gEditItemOverlay.onWorkspaceDropdownToggle();"/>
+
+ </div>
+ </hbox>
+
+ <ul id="editBMPanel_workspaceList" class="workspace-list hideable" hidden="true">
+ </ul>
<vbox id="editBMPanel_folderTreeRow" <vbox id="editBMPanel_folderTreeRow"
class="hideable" class="hideable"
hidden="true">

View File

@@ -495,19 +495,14 @@ var gZenLooksAndFeel = {
this._initializeColorPicker(this._getInitialAccentColor()); this._initializeColorPicker(this._getInitialAccentColor());
window.zenPageAccentColorChanged = this._handleAccentColorChange.bind(this); window.zenPageAccentColorChanged = this._handleAccentColorChange.bind(this);
gZenMarketplaceManager.init(); gZenMarketplaceManager.init();
var onPreferColorSchemeChange = this.onPreferColorSchemeChange.bind(this);
window.matchMedia('(prefers-color-scheme: dark)').addListener(onPreferColorSchemeChange);
for (const pref of [kZenExtendedSidebar, kZenSingleToolbar]) { for (const pref of [kZenExtendedSidebar, kZenSingleToolbar]) {
Services.prefs.addObserver(pref, this); Services.prefs.addObserver(pref, this);
} }
this.onPreferColorSchemeChange();
window.addEventListener('unload', () => { window.addEventListener('unload', () => {
window.matchMedia('(prefers-color-scheme: dark)').removeListener(onPreferColorSchemeChange);
for (const pref of [kZenExtendedSidebar, kZenSingleToolbar]) { for (const pref of [kZenExtendedSidebar, kZenSingleToolbar]) {
Services.prefs.removeObserver(pref, this); Services.prefs.removeObserver(pref, this);
} }
}); });
this.setDarkThemeListener();
this.setCompactModeStyle(); this.setCompactModeStyle();
this.applySidebarLayout(); this.applySidebarLayout();
@@ -550,59 +545,14 @@ var gZenLooksAndFeel = {
} }
}, },
onPreferColorSchemeChange(event) {
const darkTheme = window.matchMedia('(prefers-color-scheme: dark)').matches;
let elem = document.getElementById('ZenDarkThemeStyles');
if (darkTheme) {
elem.removeAttribute('hidden');
} else {
elem.setAttribute('hidden', 'true');
}
},
setDarkThemeListener() {
const chooser = document.getElementById('zen-dark-theme-styles-form');
const radios = [...chooser.querySelectorAll('input')];
for (let radio of radios) {
if (radio.value === 'amoled' && Services.prefs.getBoolPref('zen.theme.color-prefs.amoled')) {
radio.checked = true;
} else if (radio.value === 'colorful' && Services.prefs.getBoolPref('zen.theme.color-prefs.colorful')) {
radio.checked = true;
} else if (
radio.value === 'default' &&
!Services.prefs.getBoolPref('zen.theme.color-prefs.amoled') &&
!Services.prefs.getBoolPref('zen.theme.color-prefs.colorful')
) {
radio.checked = true;
}
radio.addEventListener('change', (e) => {
let value = e.target.value;
switch (value) {
case 'amoled':
Services.prefs.setBoolPref('zen.theme.color-prefs.amoled', true);
Services.prefs.setBoolPref('zen.theme.color-prefs.colorful', false);
break;
case 'colorful':
Services.prefs.setBoolPref('zen.theme.color-prefs.amoled', false);
Services.prefs.setBoolPref('zen.theme.color-prefs.colorful', true);
break;
default:
Services.prefs.setBoolPref('zen.theme.color-prefs.amoled', false);
Services.prefs.setBoolPref('zen.theme.color-prefs.colorful', false);
break;
}
});
}
},
setCompactModeStyle() { setCompactModeStyle() {
const chooser = document.getElementById('zen-compact-mode-styles-form'); const chooser = document.getElementById('zen-compact-mode-styles-form');
const radios = [...chooser.querySelectorAll('input')]; const radios = [...chooser.querySelectorAll('input')];
let value = ''; let value = '';
if ( if (
Services.prefs.getBoolPref('zen.view.compact.hide-tabbar') && Services.prefs.getBoolPref('zen.view.compact.hide-tabbar', false) &&
Services.prefs.getBoolPref('zen.view.compact.hide-toolbar') Services.prefs.getBoolPref('zen.view.compact.hide-toolbar', false)
) { ) {
value = 'both'; value = 'both';
} else { } else {
@@ -719,6 +669,8 @@ var zenMissingKeyboardShortcutL10n = {
goHome: 'zen-key-go-home', goHome: 'zen-key-go-home',
key_redo: 'zen-key-redo', key_redo: 'zen-key-redo',
key_inspectorMac: 'zen-key-inspector-mac',
// Devtools // Devtools
key_toggleToolbox: 'zen-devtools-toggle-shortcut', key_toggleToolbox: 'zen-devtools-toggle-shortcut',
key_browserToolbox: 'zen-devtools-toggle-browser-toolbox-shortcut', key_browserToolbox: 'zen-devtools-toggle-browser-toolbox-shortcut',

View File

@@ -68,147 +68,6 @@
<hbox id="zenLooksAndFeelGradientPickerParent"></hbox> <hbox id="zenLooksAndFeelGradientPickerParent"></hbox>
<html:div id="ZenDarkThemeStyles">
<html:h2 data-l10n-id="zen-dark-theme-styles-header"/>
<description class="description-deemphasized" data-l10n-id="zen-dark-theme-styles-description" />
<form xmlns="http://www.w3.org/1999/xhtml" autocomplete="off" id="zen-dark-theme-styles-form">
<label class="web-appearance-choice">
<div class="web-appearance-choice-image-container">
<svg width="50%" height="50%" viewBox="0 0 229 135" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;">
<g id="Icon-1--Icon-2" serif:id="Icon 1, Icon 2">
<g transform="matrix(0.983827,0,0,0.922551,1.56302,5.09242)">
<path d="M223.674,41.506L223.674,93.788C223.674,114.914 207.591,132.065 187.78,132.065L41.807,132.065C21.996,132.065 5.913,114.914 5.913,93.788L5.913,41.506C5.913,20.38 21.996,3.228 41.807,3.228L187.78,3.228C207.591,3.228 223.674,20.38 223.674,41.506Z" style="fill:transparent"/>
</g>
<g id="Outline">
<g transform="matrix(0.983827,0,0,0.922551,1.56302,5.09242)">
<path d="M223.674,41.506L223.674,93.788C223.674,114.914 207.591,132.065 187.78,132.065L41.807,132.065C21.996,132.065 5.913,114.914 5.913,93.788L5.913,41.506C5.913,20.38 21.996,3.228 41.807,3.228L187.78,3.228C207.591,3.228 223.674,20.38 223.674,41.506Z" style="fill:none;stroke:var(--zen-colors-border);stroke-width:4.78px;"/>
</g>
<g transform="matrix(0.790162,0,0,0.603645,44.881,47.2089)">
<path d="M223.674,3.228L223.674,77.954C223.674,107.819 205.151,132.065 182.335,132.065L5.913,132.065L5.913,41.506C5.913,20.38 19.016,3.228 35.155,3.228L223.674,3.228Z" style="fill:none;stroke:var(--zen-colors-border);stroke-width:4.78px;"/>
</g>
</g>
<g id="Top-Bar" serif:id="Top Bar">
<g transform="matrix(1.19149,0,0,1.19149,-7.8979,-3.64443)">
<circle cx="45.459" cy="27.22" r="3.448" style="fill:var(--zen-colors-primary);"/>
</g>
<g transform="matrix(1.19149,0,0,1.19149,128.569,-3.64443)">
<circle cx="45.459" cy="27.22" r="3.448" style="fill:var(--zen-colors-primary);"/>
</g>
<g transform="matrix(1.29333,0,0,1,-30.3604,4.42935)">
<path d="M149.424,24.359C149.424,26.626 148,28.467 146.247,28.467L77.764,28.467C76.01,28.467 74.587,26.626 74.587,24.359C74.587,22.091 76.01,20.25 77.764,20.25L146.247,20.25C148,20.25 149.424,22.091 149.424,24.359Z" style="fill:var(--zen-colors-primary);"/>
</g>
</g>
<g id="Side-Bar" serif:id="Side Bar">
<g transform="matrix(1.19149,0,0,1.19149,-25.5066,20.8338)">
<circle cx="45.459" cy="27.22" r="3.448" style="fill:var(--zen-colors-primary);"/>
</g>
<g transform="matrix(1.19149,0,0,1.19149,-25.5066,44.7817)">
<circle cx="45.459" cy="27.22" r="3.448" style="fill:var(--zen-colors-primary);"/>
</g>
<g transform="matrix(1.19149,0,0,1.19149,-25.5066,68.7295)">
<circle cx="45.459" cy="27.22" r="3.448" style="fill:var(--zen-colors-primary);"/>
</g>
</g>
</g>
</svg>
</div>
<div class="web-appearance-choice-footer">
<input type="radio" name="web-appearance" value="amoled" data-l10n-id="preferences-web-appearance-choice-input-auto"
/><span data-l10n-id="zen-dark-theme-styles-amoled" />
</div>
</label>
<label class="web-appearance-choice">
<div class="web-appearance-choice-image-container">
<svg width="50%" height="50%" viewBox="0 0 229 135" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;">
<g id="Icon-1--Icon-2" serif:id="Icon 1, Icon 2">
<g transform="matrix(0.983827,0,0,0.922551,1.56302,5.09242)">
<path d="M223.674,41.506L223.674,93.788C223.674,114.914 207.591,132.065 187.78,132.065L41.807,132.065C21.996,132.065 5.913,114.914 5.913,93.788L5.913,41.506C5.913,20.38 21.996,3.228 41.807,3.228L187.78,3.228C207.591,3.228 223.674,20.38 223.674,41.506Z" style="fill:color-mix(in srgb, var(--zen-colors-secondary) 17%, transparent 98%)"/>
</g>
<g id="Outline">
<g transform="matrix(0.983827,0,0,0.922551,1.56302,5.09242)">
<path d="M223.674,41.506L223.674,93.788C223.674,114.914 207.591,132.065 187.78,132.065L41.807,132.065C21.996,132.065 5.913,114.914 5.913,93.788L5.913,41.506C5.913,20.38 21.996,3.228 41.807,3.228L187.78,3.228C207.591,3.228 223.674,20.38 223.674,41.506Z" style="fill:none;stroke:var(--zen-colors-border);stroke-width:4.78px;"/>
</g>
<g transform="matrix(0.790162,0,0,0.603645,44.881,47.2089)">
<path d="M223.674,3.228L223.674,77.954C223.674,107.819 205.151,132.065 182.335,132.065L5.913,132.065L5.913,41.506C5.913,20.38 19.016,3.228 35.155,3.228L223.674,3.228Z" style="fill:none;stroke:var(--zen-colors-border);stroke-width:4.78px;"/>
</g>
</g>
<g id="Top-Bar" serif:id="Top Bar">
<g transform="matrix(1.19149,0,0,1.19149,-7.8979,-3.64443)">
<circle cx="45.459" cy="27.22" r="3.448" style="fill:var(--zen-primary-color);"/>
</g>
<g transform="matrix(1.19149,0,0,1.19149,128.569,-3.64443)">
<circle cx="45.459" cy="27.22" r="3.448" style="fill:var(--zen-primary-color);"/>
</g>
<g transform="matrix(1.29333,0,0,1,-30.3604,4.42935)">
<path d="M149.424,24.359C149.424,26.626 148,28.467 146.247,28.467L77.764,28.467C76.01,28.467 74.587,26.626 74.587,24.359C74.587,22.091 76.01,20.25 77.764,20.25L146.247,20.25C148,20.25 149.424,22.091 149.424,24.359Z" style="fill:var(--zen-primary-color);"/>
</g>
</g>
<g id="Side-Bar" serif:id="Side Bar">
<g transform="matrix(1.19149,0,0,1.19149,-25.5066,20.8338)">
<circle cx="45.459" cy="27.22" r="3.448" style="fill:var(--zen-primary-color);"/>
</g>
<g transform="matrix(1.19149,0,0,1.19149,-25.5066,44.7817)">
<circle cx="45.459" cy="27.22" r="3.448" style="fill:var(--zen-primary-color);"/>
</g>
<g transform="matrix(1.19149,0,0,1.19149,-25.5066,68.7295)">
<circle cx="45.459" cy="27.22" r="3.448" style="fill:var(--zen-primary-color);"/>
</g>
</g>
</g>
</svg>
</div>
<div class="web-appearance-choice-footer">
<input type="radio" name="web-appearance" value="default" data-l10n-id="preferences-web-appearance-choice-input-light"
/><span data-l10n-id="zen-dark-theme-styles-default" />
</div>
</label>
<label class="web-appearance-choice">
<div class="web-appearance-choice-image-container">
<svg width="50%" height="50%" viewBox="0 0 229 135" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;">
<g id="Icon-1--Icon-2" serif:id="Icon 1, Icon 2">
<g transform="matrix(0.983827,0,0,0.922551,1.56302,5.09242)">
<path d="M223.674,41.506L223.674,93.788C223.674,114.914 207.591,132.065 187.78,132.065L41.807,132.065C21.996,132.065 5.913,114.914 5.913,93.788L5.913,41.506C5.913,20.38 21.996,3.228 41.807,3.228L187.78,3.228C207.591,3.228 223.674,20.38 223.674,41.506Z" style="fill:var(--zen-colors-secondary);"/>
</g>
<g id="Outline">
<g transform="matrix(0.983827,0,0,0.922551,1.56302,5.09242)">
<path d="M223.674,41.506L223.674,93.788C223.674,114.914 207.591,132.065 187.78,132.065L41.807,132.065C21.996,132.065 5.913,114.914 5.913,93.788L5.913,41.506C5.913,20.38 21.996,3.228 41.807,3.228L187.78,3.228C207.591,3.228 223.674,20.38 223.674,41.506Z" style="fill:none;stroke:var(--zen-primary-color);stroke-width:4px;"/>
</g>
<g transform="matrix(0.790162,0,0,0.603645,44.881,47.2089)">
<path d="M223.674,3.228L223.674,77.954C223.674,107.819 205.151,132.065 182.335,132.065L5.913,132.065L5.913,41.506C5.913,20.38 19.016,3.228 35.155,3.228L223.674,3.228Z" style="fill:none;stroke:var(--zen-primary-color);stroke-width:4.78px;"/>
</g>
</g>
<g id="Top-Bar" serif:id="Top Bar">
<g transform="matrix(1.19149,0,0,1.19149,-7.8979,-3.64443)">
<circle cx="45.459" cy="27.22" r="3.448" style="fill:var(--zen-primary-color);"/>
</g>
<g transform="matrix(1.19149,0,0,1.19149,128.569,-3.64443)">
<circle cx="45.459" cy="27.22" r="3.448" style="fill:var(--zen-primary-color);"/>
</g>
<g transform="matrix(1.29333,0,0,1,-30.3604,4.42935)">
<path d="M149.424,24.359C149.424,26.626 148,28.467 146.247,28.467L77.764,28.467C76.01,28.467 74.587,26.626 74.587,24.359C74.587,22.091 76.01,20.25 77.764,20.25L146.247,20.25C148,20.25 149.424,22.091 149.424,24.359Z" style="fill:var(--zen-primary-color);"/>
</g>
</g>
<g id="Side-Bar" serif:id="Side Bar">
<g transform="matrix(1.19149,0,0,1.19149,-25.5066,20.8338)">
<circle cx="45.459" cy="27.22" r="3.448" style="fill:var(--zen-primary-color);"/>
</g>
<g transform="matrix(1.19149,0,0,1.19149,-25.5066,44.7817)">
<circle cx="45.459" cy="27.22" r="3.448" style="fill:var(--zen-primary-color);"/>
</g>
<g transform="matrix(1.19149,0,0,1.19149,-25.5066,68.7295)">
<circle cx="45.459" cy="27.22" r="3.448" style="fill:var(--zen-primary-color);"/>
</g>
</g>
</g>
</svg>
</div>
<div class="web-appearance-choice-footer">
<input type="radio" name="web-appearance" value="colorful" data-l10n-id="preferences-web-appearance-choice-input-dark"
/><span data-l10n-id="zen-dark-theme-styles-colorful" />
</div>
</label>
</form>
</html:div>
<html:div data-l10n-id="preferences-web-appearance-footer"> <html:div data-l10n-id="preferences-web-appearance-footer">
<html:a id="web-appearance-manage-themes-link" class="text-link" data-l10n-name="themes-link" href="about:addons" target="_blank" /> <html:a id="web-appearance-manage-themes-link" class="text-link" data-l10n-name="themes-link" href="about:addons" target="_blank" />
</html:div> </html:div>

View File

@@ -1,8 +1,20 @@
diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs
index 8125c1afc07f3365a2ad030adaf6a560453d7fe6..2856c5f93bfc9d68b98e09b2f26e3d5266c1f46a 100644 index 908743177d9f95e2e6549c689e7a493ca8668701..2dd53f5fdbffb21dfdc8bf68a6771d4ac0acd8be 100644
--- a/browser/components/sessionstore/SessionStore.sys.mjs --- a/browser/components/sessionstore/SessionStore.sys.mjs
+++ b/browser/components/sessionstore/SessionStore.sys.mjs +++ b/browser/components/sessionstore/SessionStore.sys.mjs
@@ -3679,6 +3679,7 @@ var SessionStoreInternal = { @@ -2174,9 +2174,10 @@ var SessionStoreInternal = {
TelemetryStopwatch.finish(
"FX_SESSION_RESTORE_STARTUP_ONLOAD_INITIAL_WINDOW_MS"
);
-
+ aWindow.ZenWorkspaces.delayedStartup().then(() => {
// Let everyone know we're done.
this._deferredInitialized.resolve();
+ });
}
})
.catch(ex => {
@@ -3848,6 +3849,7 @@ var SessionStoreInternal = {
aWindow.gBrowser.selectedTab = newTab; aWindow.gBrowser.selectedTab = newTab;
} }
@@ -10,3 +22,12 @@ index 8125c1afc07f3365a2ad030adaf6a560453d7fe6..2856c5f93bfc9d68b98e09b2f26e3d52
// Restore the state into the new tab. // Restore the state into the new tab.
this.restoreTab(newTab, tabState, { this.restoreTab(newTab, tabState, {
restoreImmediately: aRestoreImmediately, restoreImmediately: aRestoreImmediately,
@@ -5315,7 +5317,7 @@ var SessionStoreInternal = {
}
let tabbrowser = aWindow.gBrowser;
- let tabs = tabbrowser.tabs;
+ let tabs = aWindow.ZenWorkspaces.allStoredTabs;
/** @type {WindowStateData} */
let winData = this._windows[aWindow.__SSi];
let tabsData = (winData.tabs = []);

View File

@@ -1,8 +1,8 @@
diff --git a/browser/components/sidebar/browser-sidebar.js b/browser/components/sidebar/browser-sidebar.js diff --git a/browser/components/sidebar/browser-sidebar.js b/browser/components/sidebar/browser-sidebar.js
index 4a124003976684e014435854aef69ce29da541d2..61ce44751c36eea3e5ae2ddcc62e42c01459629b 100644 index 1937a01b9940c79782cc2ad002b09ea5938b89e0..a702e8c520fad651a98615215f94657b7e1c58eb 100644
--- a/browser/components/sidebar/browser-sidebar.js --- a/browser/components/sidebar/browser-sidebar.js
+++ b/browser/components/sidebar/browser-sidebar.js +++ b/browser/components/sidebar/browser-sidebar.js
@@ -578,7 +578,7 @@ var SidebarController = { @@ -671,7 +671,7 @@ var SidebarController = {
*/ */
setPosition() { setPosition() {
// First reset all ordinals to match DOM ordering. // First reset all ordinals to match DOM ordering.
@@ -11,26 +11,12 @@ index 4a124003976684e014435854aef69ce29da541d2..61ce44751c36eea3e5ae2ddcc62e42c0
[...browser.children].forEach((node, i) => { [...browser.children].forEach((node, i) => {
node.style.order = i + 1; node.style.order = i + 1;
}); });
@@ -592,9 +592,10 @@ var SidebarController = { @@ -681,7 +681,7 @@ var SidebarController = {
// DOM ordering is: sidebar-main | launcher-splitter | sidebar-box | splitter | tabbrowser-tabbox |
// Want to display as: | tabbrowser-tabbox | splitter | sidebar-box | launcher-splitter | sidebar-main
// So we just swap box and tabbrowser-tabbox ordering and move sidebar-main to the end
- let tabbox = document.getElementById("tabbrowser-tabbox");
+ let tabbox = document.getElementById("tabbrowser-tabpanels");
let boxOrdinal = this._box.style.order; let boxOrdinal = this._box.style.order;
this._box.style.order = tabbox.style.order; this._box.style.order = tabbox.style.order;
- tabbox.style.order = boxOrdinal;
// the launcher should be on the right of the sidebar-box
- sidebarContainer.style.order = parseInt(this._box.style.order) + 1;
+ this._box.style.order = browser.children.length + 2;
+ this._splitter.style.order = browser.children.length + 1;
+ this._splitter.style.marginRight = 0;
// Indicate we've switched ordering to the box
this._box.toggleAttribute("positionend", true);
sidebarMain.toggleAttribute("positionend", true);
@@ -603,6 +604,9 @@ var SidebarController = {
this._box.toggleAttribute("positionend", false);
sidebarMain.toggleAttribute("positionend", false);
sidebarContainer.toggleAttribute("positionend", false);
+ this._box.style.order = 1;
+ this._splitter.style.order = 2;
+ this._splitter.style.removeProperty("margin-right");
this.toolbarButton &&
this.toolbarButton.toggleAttribute("positionend", false);
}

View File

@@ -1,16 +1,25 @@
diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js diff --git a/browser/components/tabbrowser/content/tab.js b/browser/components/tabbrowser/content/tab.js
index 60061540d79843281f3ee2ce905824b224da6f46..c01f8a7f18921588ecdc635c281cf01041ef627b 100644 index d41c486c02a6f09dcff5741a59ad8b617294c481..abaccd1935fc117924c44dd22cae0b322fc6a0c4 100644
--- a/browser/components/tabbrowser/content/tab.js --- a/browser/components/tabbrowser/content/tab.js
+++ b/browser/components/tabbrowser/content/tab.js +++ b/browser/components/tabbrowser/content/tab.js
@@ -39,6 +39,7 @@ @@ -37,6 +37,7 @@
</hbox> </hbox>
</vbox> </vbox>
<image class="tab-close-button close-icon" role="button" data-l10n-id="tabbrowser-close-tabs-button" data-l10n-args='{"tabCount": 1}' keyNav="false"/> <image class="tab-close-button close-icon" role="button" data-l10n-id="tabbrowser-close-tabs-button" data-l10n-args='{"tabCount": 1}' keyNav="false"/>
+ <image class="tab-reset-button reset-icon" role="button" data-l10n-id="tabbrowser-reset-tabs-button" data-l10n-args='{"tabCount": 1}' keyNav="false"/> + <image class="tab-reset-button reset-icon" role="button" data-l10n-id="tabbrowser-unload-tab-button" data-l10n-args='{"tabCount": 1}' keyNav="false"/>
</hbox> </hbox>
</stack> </stack>
`; `;
@@ -447,6 +448,7 @@ @@ -168,7 +169,7 @@
}
set _visuallySelected(val) {
- if (val == this.hasAttribute("visuallyselected")) {
+ if (val == this.hasAttribute("visuallyselected") || (!val && this.linkedBrowser?.closest('.browserSidebarContainer').classList.contains('zen-glance-background'))) {
return;
}
@@ -451,6 +452,7 @@
this.style.MozUserFocus = "ignore"; this.style.MozUserFocus = "ignore";
} else if ( } else if (
event.target.classList.contains("tab-close-button") || event.target.classList.contains("tab-close-button") ||
@@ -18,13 +27,21 @@ index 60061540d79843281f3ee2ce905824b224da6f46..c01f8a7f18921588ecdc635c281cf010
event.target.classList.contains("tab-icon-overlay") event.target.classList.contains("tab-icon-overlay")
) { ) {
eventMaySelectTab = false; eventMaySelectTab = false;
@@ -549,6 +551,11 @@ @@ -544,6 +546,7 @@
if (this.multiselected) {
gBrowser.removeMultiSelectedTabs();
} else {
+ gZenPinnedTabManager._removePinnedAttributes(this, true);
gBrowser.removeTab(this, {
animate: true,
triggeringEvent: event,
@@ -553,6 +556,11 @@
// (see tabbrowser-tabs 'click' handler). // (see tabbrowser-tabs 'click' handler).
gBrowser.tabContainer._blockDblClick = true; gBrowser.tabContainer._blockDblClick = true;
} }
+ +
+ if (event.target.classList.contains("tab-reset-button")) { + if (event.target.classList.contains("tab-reset-button")) {
+ gZenPinnedTabManager._resetTabToStoredState(this); + gZenPinnedTabManager._onCloseTabShortcut(event, this, 'unload-switch');
+ gBrowser.tabContainer._blockDblClick = true; + gBrowser.tabContainer._blockDblClick = true;
+ } + }
} }

View File

@@ -1,15 +1,15 @@
diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js diff --git a/browser/components/tabbrowser/content/tabbrowser.js b/browser/components/tabbrowser/content/tabbrowser.js
index ce68c339f35416574b7bc7ebf8c93378f653242b..ceb292dd9939bd9db12b00673f0c3d54da793e76 100644 index ff90a70bdad6c94ec4b90027ff102972d0eb28e5..5db2380df21f4b25a6c03bfa457b62093051cc9a 100644
--- a/browser/components/tabbrowser/content/tabbrowser.js --- a/browser/components/tabbrowser/content/tabbrowser.js
+++ b/browser/components/tabbrowser/content/tabbrowser.js +++ b/browser/components/tabbrowser/content/tabbrowser.js
@@ -409,11 +409,39 @@ @@ -406,11 +406,39 @@
return count; return this.tabContainer.visibleTabs;
} }
+ get _numVisiblePinTabs() { + get _numVisiblePinTabs() {
+ let i = 0; + let i = 0;
+ for (let tab of this.tabs) { + for (let tab of this.tabs) {
+ if (!tab.pinned) { + if (!tab.pinned && !tab.hasAttribute("zen-glance-tab")) {
+ break; + break;
+ } + }
+ if (!tab.hidden) { + if (!tab.hidden) {
@@ -22,7 +22,7 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..ceb292dd9939bd9db12b00673f0c3d54
+ get _numZenEssentials() { + get _numZenEssentials() {
+ let i = 0; + let i = 0;
+ for (let tab of this.tabs) { + for (let tab of this.tabs) {
+ if (!tab.hasAttribute("zen-essential")) { + if (!tab.hasAttribute("zen-essential") && !tab.hasAttribute("zen-glance-tab")) {
+ break; + break;
+ } + }
+ if (!tab.hidden) { + if (!tab.hidden) {
@@ -37,23 +37,32 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..ceb292dd9939bd9db12b00673f0c3d54
- if (!this.tabs[i].pinned) { - if (!this.tabs[i].pinned) {
+ let i = 0; + let i = 0;
+ for (let tab of this.tabs) { + for (let tab of this.tabs) {
+ if (!tab.pinned) { + if (!tab.pinned && !tab.hasAttribute("zen-glance-tab")) {
break; break;
} }
+ i++; + i++;
} }
return i; return i;
} }
@@ -806,7 +834,7 @@ @@ -807,7 +835,7 @@
this.showTab(aTab); this.showTab(aTab);
if (this.tabContainer.verticalMode) { if (this.tabContainer.verticalMode) {
this._handleTabMove(aTab, () => this._handleTabMove(aTab, () =>
- this.verticalPinnedTabsContainer.appendChild(aTab) - this.verticalPinnedTabsContainer.appendChild(aTab)
+ aTab.hasAttribute("zen-essential") ? document.getElementById("zen-essentials-container").appendChild(aTab) : this.verticalPinnedTabsContainer.appendChild(aTab) + aTab.hasAttribute("zen-essential") ? document.getElementById("zen-essentials-container").appendChild(aTab) : this.verticalPinnedTabsContainer.insertBefore(aTab, this.verticalPinnedTabsContainer.lastChild)
); );
} else { } else {
this.moveTabTo(aTab, this.pinnedTabCount); this.moveTabTo(aTab, this.pinnedTabCount, { forceStandaloneTab: true });
@@ -1052,6 +1080,8 @@ @@ -828,7 +856,7 @@
// the moving of a tab from the vertical pinned tabs container
// and back into arrowscrollbox.
aTab.removeAttribute("pinned");
- this.tabContainer.arrowScrollbox.prepend(aTab);
+ ZenWorkspaces.activeWorkspaceStrip.prepend(aTab);
});
} else {
this.moveTabTo(aTab, this.pinnedTabCount - 1, {
@@ -1055,6 +1083,8 @@
let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"]; let LOCAL_PROTOCOLS = ["chrome:", "about:", "resource:", "data:"];
@@ -62,7 +71,7 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..ceb292dd9939bd9db12b00673f0c3d54
if ( if (
aIconURL && aIconURL &&
!aLoadingPrincipal && !aLoadingPrincipal &&
@@ -1062,6 +1092,9 @@ @@ -1065,6 +1095,9 @@
); );
return; return;
} }
@@ -72,7 +81,7 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..ceb292dd9939bd9db12b00673f0c3d54
let browser = this.getBrowserForTab(aTab); let browser = this.getBrowserForTab(aTab);
browser.mIconURL = aIconURL; browser.mIconURL = aIconURL;
@@ -1291,6 +1324,7 @@ @@ -1310,6 +1343,7 @@
if (!this._previewMode) { if (!this._previewMode) {
newTab.recordTimeFromUnloadToReload(); newTab.recordTimeFromUnloadToReload();
newTab.updateLastAccessed(); newTab.updateLastAccessed();
@@ -80,7 +89,17 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..ceb292dd9939bd9db12b00673f0c3d54
oldTab.updateLastAccessed(); oldTab.updateLastAccessed();
// if this is the foreground window, update the last-seen timestamps. // if this is the foreground window, update the last-seen timestamps.
if (this.ownerGlobal == BrowserWindowTracker.getTopWindow()) { if (this.ownerGlobal == BrowserWindowTracker.getTopWindow()) {
@@ -2374,7 +2408,7 @@ @@ -1462,6 +1496,9 @@
}
let activeEl = document.activeElement;
+ if (gURLBar._zenHandleUrlbarClose) {
+ gURLBar._zenHandleUrlbarClose(true);
+ }
// If focus is on the old tab, move it to the new tab.
if (activeEl == oldTab) {
newTab.focus();
@@ -2387,7 +2424,7 @@
let panel = this.getPanel(browser); let panel = this.getPanel(browser);
let uniqueId = this._generateUniquePanelID(); let uniqueId = this._generateUniquePanelID();
@@ -89,16 +108,18 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..ceb292dd9939bd9db12b00673f0c3d54
aTab.linkedPanel = uniqueId; aTab.linkedPanel = uniqueId;
// Inject the <browser> into the DOM if necessary. // Inject the <browser> into the DOM if necessary.
@@ -2434,7 +2468,7 @@ @@ -2446,8 +2483,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. // hasSiblings=false on both the existing browser and the new browser.
if (this.tabs.length == 2) { if (this.tabs.length == 2) {
this.tabs[0].linkedBrowser.browsingContext.hasSiblings = true; - this.tabs[0].linkedBrowser.browsingContext.hasSiblings = true;
- this.tabs[1].linkedBrowser.browsingContext.hasSiblings = true; - this.tabs[1].linkedBrowser.browsingContext.hasSiblings = true;
+ if (this.tabs[0].linkedBrowser.browsingContext) this.tabs[0].linkedBrowser.browsingContext.hasSiblings = true;
+ if (this.tabs[1].linkedBrowser.browsingContext) this.tabs[1].linkedBrowser.browsingContext.hasSiblings = true; + if (this.tabs[1].linkedBrowser.browsingContext) this.tabs[1].linkedBrowser.browsingContext.hasSiblings = true;
} else { } else {
aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1; aTab.linkedBrowser.browsingContext.hasSiblings = this.tabs.length > 1;
} }
@@ -2666,6 +2700,12 @@ @@ -2679,6 +2716,12 @@
); );
} }
@@ -111,7 +132,7 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..ceb292dd9939bd9db12b00673f0c3d54
if (!UserInteraction.running("browser.tabs.opening", window)) { if (!UserInteraction.running("browser.tabs.opening", window)) {
UserInteraction.start("browser.tabs.opening", "initting", window); UserInteraction.start("browser.tabs.opening", "initting", window);
} }
@@ -2735,6 +2775,12 @@ @@ -2742,6 +2785,12 @@
noInitialLabel, noInitialLabel,
skipBackgroundNotify, skipBackgroundNotify,
}); });
@@ -124,25 +145,20 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..ceb292dd9939bd9db12b00673f0c3d54
if (insertTab) { if (insertTab) {
// insert the tab into the tab container in the correct position // insert the tab into the tab container in the correct position
this._insertTabAtIndex(t, { this._insertTabAtIndex(t, {
@@ -2878,6 +2924,13 @@ @@ -2885,6 +2934,9 @@
} }
} }
+ requestAnimationFrame(() => { + if (typeof window.gZenVerticalTabsManager !== "undefined") {
+ t.setAttribute("zen-initial-fadein", "true"); + gZenVerticalTabsManager.animateTab(t);
+ setTimeout(() => { + }
+ t.removeAttribute("zen-initial-fadein");
+ }, 2000);
+ });
+
// Additionally send pinned tab events // Additionally send pinned tab events
if (pinned) { if (pinned) {
this._notifyPinnedStatus(t); this._notifyPinnedStatus(t);
@@ -3389,6 +3442,23 @@ @@ -3403,6 +3455,21 @@
) { ) {
tabWasReused = true; tabWasReused = true;
tab = this.selectedTab; tab = this.selectedTab;
+
+ if (tabData.zenWorkspace) { + if (tabData.zenWorkspace) {
+ tab.setAttribute("zen-workspace-id", tabData.zenWorkspace); + tab.setAttribute("zen-workspace-id", tabData.zenWorkspace);
+ } + }
@@ -158,24 +174,22 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..ceb292dd9939bd9db12b00673f0c3d54
+ if (tabData.zenPinnedEntry) { + if (tabData.zenPinnedEntry) {
+ tab.setAttribute("zen-pinned-entry", tabData.zenPinnedEntry); + tab.setAttribute("zen-pinned-entry", tabData.zenPinnedEntry);
+ } + }
+
if (!tabData.pinned) { if (!tabData.pinned) {
this.unpinTab(tab); this.unpinTab(tab);
} else { } else {
@@ -3402,6 +3472,9 @@ @@ -3416,6 +3483,7 @@
restoreTabsLazily && !select && !tabData.pinned; restoreTabsLazily && !select && !tabData.pinned;
let url = "about:blank"; let url = "about:blank";
+
+ gZenPinnedTabManager.resetPinnedTabData(tabData); + gZenPinnedTabManager.resetPinnedTabData(tabData);
+
if (tabData.entries?.length) { if (tabData.entries?.length) {
let activeIndex = (tabData.index || tabData.entries.length) - 1; let activeIndex = (tabData.index || tabData.entries.length) - 1;
// Ensure the index is in bounds. // Ensure the index is in bounds.
@@ -3438,6 +3511,21 @@ @@ -3451,7 +3519,21 @@
skipLoad: true,
preferredRemoteType, preferredRemoteType,
}); });
-
+ if (tabData.zenWorkspace) { + if (tabData.zenWorkspace) {
+ tab.setAttribute("zen-workspace-id", tabData.zenWorkspace); + tab.setAttribute("zen-workspace-id", tabData.zenWorkspace);
+ } + }
@@ -194,26 +208,54 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..ceb292dd9939bd9db12b00673f0c3d54
if (select) { if (select) {
tabToSelect = tab; tabToSelect = tab;
} }
@@ -3491,7 +3579,6 @@ @@ -3464,8 +3546,8 @@
// inserted in the DOM. If the tab is not yet in the DOM,
// just insert it in the right place from the start.
if (!tab.parentNode) {
- tab._tPos = this.pinnedTabCount;
- this.tabContainer.insertBefore(tab, this.tabs[this.pinnedTabCount]);
+ tab._tPos = this._numVisiblePinTabs;
+ this.tabContainer.insertBefore(tab, this.tabs[this._numVisiblePinTabs]);
tab.toggleAttribute("pinned", true);
this.tabContainer._invalidateCachedTabs(); this.tabContainer._invalidateCachedTabs();
} // Then ensure all the tab open/pinning information is sent.
} @@ -3729,7 +3811,7 @@
- // Ensure we have an index if one was not provided.
tab.initialize(); if (typeof index != "number") {
// Move the new tab after another tab if needed, to the end otherwise.
- index = Infinity;
+ index = Services.prefs.getBoolPref("zen.view.show-newtab-button-top") ? this.pinnedTabCount : Infinity;
if (
!bulkOrderedOpen &&
((openerTab &&
@@ -3780,7 +3862,7 @@
} }
@@ -4070,6 +4157,10 @@ /** @type {MozTabbrowserTab|undefined} */
- let tabAfter = this.tabs.at(index);
+ let tabAfter = this.tabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).at(index);
this.tabContainer._invalidateCachedTabs();
if (tabGroup) {
@@ -4095,6 +4177,9 @@
return; return;
} }
+ for (let tab of selectedTabs) { + for (let tab of selectedTabs) {
+ gZenPinnedTabManager._removePinnedAttributes(tab, true); + gZenPinnedTabManager._removePinnedAttributes(tab, true);
+ } + }
+
this.removeTabs(selectedTabs); this.removeTabs(selectedTabs);
} }
@@ -4389,6 +4480,13 @@ @@ -4427,6 +4512,7 @@
skipSessionStore,
} = {}
) {
+ gZenUIManager.saveScrollbarState();
if (UserInteraction.running("browser.tabs.opening", window)) {
UserInteraction.finish("browser.tabs.opening", window);
}
@@ -4443,6 +4529,12 @@
TelemetryStopwatch.start("FX_TAB_CLOSE_TIME_NO_ANIM_MS", aTab); TelemetryStopwatch.start("FX_TAB_CLOSE_TIME_NO_ANIM_MS", aTab);
} }
@@ -223,22 +265,29 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..ceb292dd9939bd9db12b00673f0c3d54
+ this.selectedTab = newTab; + this.selectedTab = newTab;
+ } + }
+ } + }
+
// Handle requests for synchronously removing an already // Handle requests for synchronously removing an already
// asynchronously closing tab. // asynchronously closing tab.
if (!animate && aTab.closing) { if (!animate && aTab.closing) {
@@ -4404,6 +4502,10 @@ @@ -4457,7 +4549,9 @@
// frame created for it (for example, by updating the visually selected
// state). // state).
let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width; let tabWidth = window.windowUtils.getBoundsWithoutFlushing(aTab).width;
-
+ if (aTab.hasAttribute("zen-glance-tab")) { + if (gZenGlanceManager.manageTabClose(aTab)) {
+ gZenGlanceManager.closeGlance();
+ return; + return;
+ } + }
if ( if (
!this._beginRemoveTab(aTab, { !this._beginRemoveTab(aTab, {
closeWindowFastpath: true, closeWindowFastpath: true,
@@ -4556,14 +4658,14 @@ @@ -4471,7 +4565,6 @@
TelemetryStopwatch.cancel("FX_TAB_CLOSE_TIME_NO_ANIM_MS", aTab);
return;
}
-
let lockTabSizing =
!this.tabContainer.verticalMode &&
!aTab.pinned &&
@@ -4610,14 +4703,14 @@
!!this.tabsInCollapsedTabGroups.length; !!this.tabsInCollapsedTabGroups.length;
if ( if (
aTab.visible && aTab.visible &&
@@ -255,7 +304,16 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..ceb292dd9939bd9db12b00673f0c3d54
if (closeWindow) { if (closeWindow) {
// We've already called beforeunload on all the relevant tabs if we get here, // We've already called beforeunload on all the relevant tabs if we get here,
@@ -5411,10 +5513,10 @@ @@ -4812,6 +4905,8 @@
this.tabs[i]._tPos = i;
}
+ ZenWorkspaces.updateTabsContainers();
+
if (!this._windowIsClosing) {
if (wasPinned) {
this.tabContainer._positionPinnedTabs();
@@ -5465,10 +5560,10 @@
SessionStore.deleteCustomTabValue(aTab, "hiddenBy"); SessionStore.deleteCustomTabValue(aTab, "hiddenBy");
} }
@@ -268,7 +326,38 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..ceb292dd9939bd9db12b00673f0c3d54
aTab.selected || aTab.selected ||
aTab.closing || aTab.closing ||
// Tabs that are sharing the screen, microphone or camera cannot be hidden. // Tabs that are sharing the screen, microphone or camera cannot be hidden.
@@ -7384,6 +7486,7 @@ @@ -5706,9 +5801,9 @@
// Don't allow mixing pinned and unpinned tabs.
if (aTab.pinned) {
- aIndex = Math.min(aIndex, this.pinnedTabCount - 1);
+ aIndex = Math.min(aIndex, this._numVisiblePinTabs - 1);
} else {
- aIndex = Math.max(aIndex, this.pinnedTabCount);
+ aIndex = Math.max(aIndex, this._numVisiblePinTabs);
}
if (aTab._tPos == aIndex) {
return;
@@ -5727,6 +5822,9 @@
this.tabContainer.insertBefore(aTab, neighbor);
}
});
+ if (aTab.hasAttribute("glance-id")) {
+ this.moveTabTo(aTab.querySelector("tab[glance-id]"), aIndex, options);
+ }
}
moveTabToGroup(aTab, aGroup) {
@@ -5802,7 +5900,7 @@
createLazyBrowser,
};
- let numPinned = this.pinnedTabCount;
+ let numPinned = this._numVisiblePinTabs;
if (aIndex < numPinned || (aTab.pinned && aIndex == numPinned)) {
params.pinned = true;
}
@@ -7443,6 +7541,7 @@
aWebProgress.isTopLevel aWebProgress.isTopLevel
) { ) {
this.mTab.setAttribute("busy", "true"); this.mTab.setAttribute("busy", "true");
@@ -276,7 +365,7 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..ceb292dd9939bd9db12b00673f0c3d54
gBrowser._tabAttrModified(this.mTab, ["busy"]); gBrowser._tabAttrModified(this.mTab, ["busy"]);
this.mTab._notselectedsinceload = !this.mTab.selected; this.mTab._notselectedsinceload = !this.mTab.selected;
gBrowser.syncThrobberAnimations(this.mTab); gBrowser.syncThrobberAnimations(this.mTab);
@@ -8344,7 +8447,7 @@ var TabContextMenu = { @@ -8411,7 +8510,7 @@ var TabContextMenu = {
); );
contextUnpinSelectedTabs.hidden = contextUnpinSelectedTabs.hidden =
!this.contextTab.pinned || !multiselectionContext; !this.contextTab.pinned || !multiselectionContext;
@@ -285,7 +374,7 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..ceb292dd9939bd9db12b00673f0c3d54
// Move Tab items // Move Tab items
let contextMoveTabOptions = document.getElementById( let contextMoveTabOptions = document.getElementById(
"context_moveTabOptions" "context_moveTabOptions"
@@ -8378,7 +8481,7 @@ var TabContextMenu = { @@ -8444,7 +8543,7 @@ var TabContextMenu = {
let contextMoveTabToStart = document.getElementById("context_moveToStart"); let contextMoveTabToStart = document.getElementById("context_moveToStart");
let isFirstTab = let isFirstTab =
tabsToMove[0] == visibleTabs[0] || tabsToMove[0] == visibleTabs[0] ||
@@ -294,7 +383,7 @@ index ce68c339f35416574b7bc7ebf8c93378f653242b..ceb292dd9939bd9db12b00673f0c3d54
contextMoveTabToStart.disabled = isFirstTab && allSelectedTabsAdjacent; contextMoveTabToStart.disabled = isFirstTab && allSelectedTabsAdjacent;
document.getElementById("context_openTabInWindow").disabled = document.getElementById("context_openTabInWindow").disabled =
@@ -8607,6 +8710,7 @@ var TabContextMenu = { @@ -8677,6 +8776,7 @@ var TabContextMenu = {
if (this.contextTab.multiselected) { if (this.contextTab.multiselected) {
gBrowser.removeMultiSelectedTabs(); gBrowser.removeMultiSelectedTabs();
} else { } else {

View File

@@ -1,8 +1,34 @@
diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js diff --git a/browser/components/tabbrowser/content/tabs.js b/browser/components/tabbrowser/content/tabs.js
index f7c39fe804182e2bdf53045ba3b6a5ba17079fc3..f578fe9da3c502289c6a3e3a0ba17de6e747e80f 100644 index 8aeb244ffca9f48661805f5b7d860b5896055562..3d323615040dcb5e379519878fb7874d5b28de81 100644
--- a/browser/components/tabbrowser/content/tabs.js --- a/browser/components/tabbrowser/content/tabs.js
+++ b/browser/components/tabbrowser/content/tabs.js +++ b/browser/components/tabbrowser/content/tabs.js
@@ -649,7 +649,7 @@ @@ -94,7 +94,7 @@
};
this.arrowScrollbox._canScrollToElement = element => {
if (isTab(element)) {
- return !element.pinned || !this.hasAttribute("positionpinnedtabs");
+ return !element.hasAttribute("zen-essential") || !this.hasAttribute("positionpinnedtabs");
}
return true;
};
@@ -362,7 +362,7 @@
// and we're not hitting the scroll buttons.
if (
event.button != 0 ||
- event.target != this.arrowScrollbox ||
+ event.target != document.getElementById("zen-tabs-wrapper") ||
event.composedTarget.localName == "toolbarbutton"
) {
return;
@@ -411,6 +411,7 @@
// Reset the "ignored click" flag
target._ignoredCloseButtonClicks = false;
}
+ gZenUIManager.saveScrollbarState();
}
/* Protects from close-tab-button errant doubleclick:
@@ -659,7 +660,7 @@
if (this.#isContainerVerticalPinnedExpanded(tab)) { if (this.#isContainerVerticalPinnedExpanded(tab)) {
// In expanded vertical mode, the max number of pinned tabs per row is dynamic // In expanded vertical mode, the max number of pinned tabs per row is dynamic
// Set this before adjusting dragged tab's position // Set this before adjusting dragged tab's position
@@ -11,16 +37,43 @@ index f7c39fe804182e2bdf53045ba3b6a5ba17079fc3..f578fe9da3c502289c6a3e3a0ba17de6
let tabsPerRow = 0; let tabsPerRow = 0;
let position = 0; let position = 0;
for (let pinnedTab of pinnedTabs) { for (let pinnedTab of pinnedTabs) {
@@ -997,7 +997,7 @@ @@ -859,6 +860,9 @@
}
let draggedTab = event.dataTransfer.mozGetDataAt(TAB_DROP_TYPE, 0);
+ if (draggedTab && effects === "move") {
+ gZenPinnedTabManager.applyDragoverClass(event, draggedTab);
+ }
if (
(effects == "move" || effects == "copy") &&
this == draggedTab.container &&
@@ -972,6 +976,14 @@
this._tabDropIndicator.hidden = true;
event.stopPropagation();
+ if (draggedTab && dropEffect == "move") {
+ let moved = gZenPinnedTabManager.moveToAnotherTabContainerIfNecessary(event, draggedTab);
+
+ if (moved) {
+ this._finishMoveTogetherSelectedTabs(draggedTab);
+ return;
+ }
+ }
if (draggedTab && dropEffect == "copy") {
// copy the dropped tab (wherever it's from)
let newIndex = this._getDropIndex(event);
@@ -1010,8 +1022,8 @@
} }
} else { } else {
let pinned = draggedTab.pinned; let pinned = draggedTab.pinned;
- let numPinned = gBrowser.pinnedTabCount; - let numPinned = gBrowser.pinnedTabCount;
- let tabs = this.visibleTabs.slice(
+ let numPinned = gBrowser._numVisiblePinTabs; + let numPinned = gBrowser._numVisiblePinTabs;
let tabs = this.visibleTabs.slice( + let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(
pinned ? 0 : numPinned, pinned ? 0 : numPinned,
pinned ? numPinned : undefined pinned ? numPinned : undefined
@@ -1076,7 +1076,7 @@ );
@@ -1090,7 +1102,7 @@
let postTransitionCleanup = () => { let postTransitionCleanup = () => {
tab.removeAttribute("tabdrop-samewindow"); tab.removeAttribute("tabdrop-samewindow");
@@ -28,8 +81,8 @@ index f7c39fe804182e2bdf53045ba3b6a5ba17079fc3..f578fe9da3c502289c6a3e3a0ba17de6
+ this._finishAnimateTabMove(true); + this._finishAnimateTabMove(true);
if (dropIndex !== false) { if (dropIndex !== false) {
gBrowser.moveTabTo(tab, dropIndex); gBrowser.moveTabTo(tab, dropIndex);
if (incrementDropIndex) { if (!directionForward) {
@@ -1086,7 +1086,7 @@ @@ -1100,7 +1112,7 @@
gBrowser.syncThrobberAnimations(tab); gBrowser.syncThrobberAnimations(tab);
}; };
@@ -38,7 +91,7 @@ index f7c39fe804182e2bdf53045ba3b6a5ba17079fc3..f578fe9da3c502289c6a3e3a0ba17de6
postTransitionCleanup(); postTransitionCleanup();
} else { } else {
let onTransitionEnd = transitionendEvent => { let onTransitionEnd = transitionendEvent => {
@@ -1238,7 +1238,8 @@ @@ -1263,7 +1275,8 @@
if ( if (
dt.mozUserCancelled || dt.mozUserCancelled ||
dt.dropEffect != "none" || dt.dropEffect != "none" ||
@@ -48,16 +101,69 @@ index f7c39fe804182e2bdf53045ba3b6a5ba17079fc3..f578fe9da3c502289c6a3e3a0ba17de6
) { ) {
delete draggedTab._dragData; delete draggedTab._dragData;
return; return;
@@ -1487,7 +1488,7 @@ @@ -1478,7 +1491,7 @@
}
get newTabButton() {
- return this.querySelector("#tabs-newtab-button");
+ return ZenWorkspaces.activeWorkspaceStrip.querySelector("#tabs-newtab-button");
}
get verticalMode() {
@@ -1498,7 +1511,7 @@
if (this.#allTabs) {
return this.#allTabs;
}
- let children = Array.from(this.arrowScrollbox.children);
+ let children = Array.from(ZenWorkspaces.tabboxChildren);
// remove arrowScrollbox periphery element
children.pop();
@@ -1512,14 +1525,28 @@
} }
this.#allTabs = [ this.#allTabs = [
- ...this.verticalPinnedTabsContainer.children, - ...this.verticalPinnedTabsContainer.children,
+ ...document.getElementById("zen-essentials-container").children, ...this.verticalPinnedTabsContainer.children, + ...document.getElementById("zen-essentials-container").children, ...this.verticalPinnedTabsContainer.children,
...children, ...children,
]; ];
+ const lastPinnedTabIdx = gBrowser.pinnedTabCount;
+ for (let i = 0; i < this.#allTabs.length; i++) {
+ // add glance tabs (tabs inside tabs) to the list
+ const glanceTab = this.#allTabs[i].querySelector("tab[zen-glance-tab]");
+ if (glanceTab) {
+ // insert right after the parent tab
+ this.#allTabs.splice(Math.min(i + 1, lastPinnedTabIdx), 0, glanceTab);
+ i++;
+ } else if (this.#allTabs[i].classList.contains("vertical-pinned-tabs-container-separator")) {
+ // remove the separator from the list
+ this.#allTabs.splice(i, 1);
+ i--;
+ }
+ }
return this.#allTabs; return this.#allTabs;
@@ -1556,6 +1557,7 @@ }
get allGroups() {
- let children = Array.from(this.arrowScrollbox.children);
+ let children = Array.from(ZenWorkspaces.tabboxChildren);
return children.filter(node => node.tagName == "tab-group");
}
@@ -1574,10 +1601,8 @@
return this.#focusableItems;
}
- let verticalPinnedTabsContainer = document.getElementById(
- "vertical-pinned-tabs-container"
- );
- let children = Array.from(this.arrowScrollbox.children);
+ let verticalPinnedTabsContainer = this.verticalPinnedTabsContainer;
+ let children = Array.from(ZenWorkspaces.tabboxChildren);
let focusableItems = [];
for (let child of children) {
@@ -1593,6 +1618,7 @@
} }
this.#focusableItems = [ this.#focusableItems = [
@@ -65,7 +171,7 @@ index f7c39fe804182e2bdf53045ba3b6a5ba17079fc3..f578fe9da3c502289c6a3e3a0ba17de6
...verticalPinnedTabsContainer.children, ...verticalPinnedTabsContainer.children,
...focusableItems, ...focusableItems,
]; ];
@@ -1579,8 +1581,8 @@ @@ -1617,8 +1643,8 @@
#isContainerVerticalPinnedExpanded(tab) { #isContainerVerticalPinnedExpanded(tab) {
return ( return (
this.verticalMode && this.verticalMode &&
@@ -76,7 +182,25 @@ index f7c39fe804182e2bdf53045ba3b6a5ba17079fc3..f578fe9da3c502289c6a3e3a0ba17de6
); );
} }
@@ -1778,7 +1780,7 @@ @@ -1633,7 +1659,7 @@
if (node == null) {
// We have a container for non-tab elements at the end of the scrollbox.
- node = this.arrowScrollbox.lastChild;
+ node = ZenWorkspaces.activeWorkspaceStrip.lastChild;
}
node.before(tab);
@@ -1733,7 +1759,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.
- const newTab = document.getElementById("new-tab-button");
+ const newTab = ZenWorkspaces.activeWorkspaceStrip.querySelector("#tabs-newtab-button");
const newTab2 = this.newTabButton;
const newTabVertical = document.getElementById(
"vertical-tabs-newtab-button"
@@ -1816,7 +1842,7 @@
let rect = ele => { let rect = ele => {
return window.windowUtils.getBoundsWithoutFlushing(ele); return window.windowUtils.getBoundsWithoutFlushing(ele);
}; };
@@ -85,7 +209,12 @@ index f7c39fe804182e2bdf53045ba3b6a5ba17079fc3..f578fe9da3c502289c6a3e3a0ba17de6
if (tab && rect(tab).width <= this._tabClipWidth) { if (tab && rect(tab).width <= this._tabClipWidth) {
this.setAttribute("closebuttons", "activetab"); this.setAttribute("closebuttons", "activetab");
} else { } else {
@@ -1794,6 +1796,7 @@ @@ -1828,10 +1854,12 @@
_handleTabSelect(aInstant) {
let selectedTab = this.selectedItem;
+ if (!selectedTab) return;
if (this.overflowing) {
this.arrowScrollbox.ensureElementIsVisible(selectedTab, aInstant); this.arrowScrollbox.ensureElementIsVisible(selectedTab, aInstant);
} }
@@ -93,7 +222,16 @@ index f7c39fe804182e2bdf53045ba3b6a5ba17079fc3..f578fe9da3c502289c6a3e3a0ba17de6
selectedTab._notselectedsinceload = false; selectedTab._notselectedsinceload = false;
} }
@@ -1841,7 +1844,7 @@ @@ -1843,7 +1871,7 @@
return;
}
- let tabs = this.visibleTabs;
+ let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab"));
if (!tabs.length) {
return;
}
@@ -1879,7 +1907,7 @@
if (isEndTab && !this._hasTabTempMaxWidth) { if (isEndTab && !this._hasTabTempMaxWidth) {
return; return;
} }
@@ -102,7 +240,7 @@ index f7c39fe804182e2bdf53045ba3b6a5ba17079fc3..f578fe9da3c502289c6a3e3a0ba17de6
// Force tabs to stay the same width, unless we're closing the last tab, // Force tabs to stay the same width, unless we're closing the last tab,
// which case we need to let them expand just enough so that the overall // which case we need to let them expand just enough so that the overall
// tabbar width is the same. // tabbar width is the same.
@@ -1856,7 +1859,7 @@ @@ -1894,7 +1922,7 @@
let tabsToReset = []; let tabsToReset = [];
for (let i = numPinned; i < tabs.length; i++) { for (let i = numPinned; i < tabs.length; i++) {
let tab = tabs[i]; let tab = tabs[i];
@@ -111,64 +249,93 @@ index f7c39fe804182e2bdf53045ba3b6a5ba17079fc3..f578fe9da3c502289c6a3e3a0ba17de6
if (!isEndTab) { if (!isEndTab) {
// keep tabs the same width // keep tabs the same width
tab.style.transition = "none"; tab.style.transition = "none";
@@ -1922,13 +1925,13 @@ @@ -1960,16 +1988,15 @@
let verticalTabsContainer = document.getElementById( // Move pinned tabs to another container when the tabstrip is toggled to vertical
"vertical-pinned-tabs-container" // and when session restore code calls _positionPinnedTabs; update styling whenever
); // the number of pinned tabs changes.
- let numPinned = gBrowser.pinnedTabCount; - let verticalTabsContainer = document.getElementById(
+ let numPinned = gBrowser._numVisiblePinTabs; - "vertical-pinned-tabs-container"
- );
+ let verticalTabsContainer = this.verticalPinnedTabsContainer;
let numPinned = gBrowser.pinnedTabCount;
if (gBrowser.pinnedTabCount !== verticalTabsContainer.children.length) { - if (gBrowser.pinnedTabCount !== verticalTabsContainer.children.length) {
let tabs = this.visibleTabs; - let tabs = this.visibleTabs;
+ let count = ZenWorkspaces.makeSurePinTabIsInCorrectPosition();
+ if (gBrowser.pinnedTabCount !== (verticalTabsContainer.children.length - count - 1 + document.getElementById("zen-essentials-container").children.length)) {
+ let tabs = this.allTabs.filter(tab => !tab.hasAttribute("zen-glance-tab"));
for (let i = 0; i < numPinned; i++) { for (let i = 0; i < numPinned; i++) {
tabs[i].style.marginInlineStart = ""; tabs[i].style.marginInlineStart = "";
- verticalTabsContainer.appendChild(tabs[i]); - verticalTabsContainer.appendChild(tabs[i]);
+ tabs[i].hasAttribute("zen-essential") ? document.getElementById("zen-essentials-container").appendChild(tabs[i]) : verticalTabsContainer.appendChild(tabs[i]); + tabs[i].hasAttribute("zen-essential") ? document.getElementById("zen-essentials-container").appendChild(tabs[i]) : verticalTabsContainer.insertBefore(tabs[i], verticalTabsContainer.lastChild);
} }
} }
@@ -1952,7 +1955,7 @@ @@ -1977,9 +2004,7 @@
}
_resetVerticalPinnedTabs() {
- let verticalTabsContainer = document.getElementById(
- "vertical-pinned-tabs-container"
- );
+ let verticalTabsContainer = this.verticalPinnedTabsContainer;
if (!verticalTabsContainer.children.length) {
return;
@@ -1992,8 +2017,8 @@
}
_positionPinnedTabs() { _positionPinnedTabs() {
let tabs = this.visibleTabs; - let tabs = this.visibleTabs;
- let numPinned = gBrowser.pinnedTabCount; - let numPinned = gBrowser.pinnedTabCount;
+ let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab"));
+ let numPinned = gBrowser._numVisiblePinTabs; + let numPinned = gBrowser._numVisiblePinTabs;
let absPositionHorizontalTabs = let absPositionHorizontalTabs =
this.overflowing && tabs.length > numPinned && numPinned > 0; this.overflowing && tabs.length > numPinned && numPinned > 0;
@@ -2033,7 +2036,7 @@ @@ -2003,6 +2028,7 @@
if (this.verticalMode) {
this._updateVerticalPinnedTabs();
} else if (absPositionHorizontalTabs) {
+ return;
let layoutData = this._pinnedTabsLayoutCache;
let uiDensity = document.documentElement.getAttribute("uidensity");
if (!layoutData || layoutData.uiDensity != uiDensity) {
@@ -2074,7 +2100,7 @@
return; return;
} }
- let tabs = this.visibleTabs.slice(0, gBrowser.pinnedTabCount); - let tabs = this.visibleTabs.slice(0, gBrowser.pinnedTabCount);
+ let tabs = this.visibleTabs.slice(0, gBrowser._numVisiblePinTabs); + let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(0, gBrowser._numVisiblePinTabs);
let directionX = screenX > dragData.animLastScreenX; let directionX = screenX > dragData.animLastScreenX;
let directionY = screenY > dragData.animLastScreenY; let directionY = screenY > dragData.animLastScreenY;
@@ -2221,9 +2224,9 @@ @@ -2257,9 +2283,9 @@
} }
let pinned = draggedTab.pinned; let pinned = draggedTab.pinned;
- let numPinned = gBrowser.pinnedTabCount; - let numPinned = gBrowser.pinnedTabCount;
+ let numPinned = gBrowser._numVisiblePinTabs; - let tabs = this.visibleTabs.slice(
let tabs = this.visibleTabs.slice(
- pinned ? 0 : numPinned, - pinned ? 0 : numPinned,
+ let numPinned = gBrowser._numVisiblePinTabs;
+ let tabs = this.visibleTabs.filter(tab => !tab.hasAttribute("zen-glance-tab")).slice(
+ pinned ? gBrowser._numZenEssentials : numPinned, + pinned ? gBrowser._numZenEssentials : numPinned,
pinned ? numPinned : undefined pinned ? numPinned : undefined
); );
@@ -2456,8 +2459,8 @@ @@ -2502,8 +2528,9 @@
); );
} }
- _finishAnimateTabMove() { - _finishAnimateTabMove() {
- if (!this.hasAttribute("movingtab")) { - if (!this.hasAttribute("movingtab")) {
+ _finishAnimateTabMove(always = false) { + _finishAnimateTabMove(always = false) {
+ gZenPinnedTabManager.removeTabContainersDragoverClass();
+ if (!this.hasAttribute("movingtab") && !always) { + if (!this.hasAttribute("movingtab") && !always) {
return; return;
} }
@@ -2622,9 +2625,9 @@ @@ -2668,9 +2695,9 @@
function newIndex(aTab, index) { function newIndex(aTab, index) {
// Don't allow mixing pinned and unpinned tabs. // Don't allow mixing pinned and unpinned tabs.
if (aTab.pinned) { if (aTab.pinned) {
@@ -180,7 +347,16 @@ index f7c39fe804182e2bdf53045ba3b6a5ba17079fc3..f578fe9da3c502289c6a3e3a0ba17de6
} }
} }
@@ -2726,12 +2729,14 @@ @@ -2754,7 +2781,7 @@
}
_notifyBackgroundTab(aTab) {
- if (aTab.pinned || !aTab.visible || !this.overflowing) {
+ if (aTab.hasAttribute("zen-essential") || !aTab.visible || !this.overflowing) {
return;
}
@@ -2772,12 +2799,14 @@
selectedTab = { selectedTab = {
left: selectedTab.left, left: selectedTab.left,
right: selectedTab.right, right: selectedTab.right,
@@ -196,7 +372,7 @@ index f7c39fe804182e2bdf53045ba3b6a5ba17079fc3..f578fe9da3c502289c6a3e3a0ba17de6
selectedTab, selectedTab,
]; ];
}) })
@@ -2748,8 +2753,11 @@ @@ -2794,8 +2823,11 @@
delete this._lastTabToScrollIntoView; delete this._lastTabToScrollIntoView;
// Is the new tab already completely visible? // Is the new tab already completely visible?
if ( if (
@@ -210,7 +386,7 @@ index f7c39fe804182e2bdf53045ba3b6a5ba17079fc3..f578fe9da3c502289c6a3e3a0ba17de6
) { ) {
return; return;
} }
@@ -2757,21 +2765,29 @@ @@ -2803,21 +2835,29 @@
if (this.arrowScrollbox.smoothScroll) { if (this.arrowScrollbox.smoothScroll) {
// Can we make both the new tab and the selected tab completely visible? // Can we make both the new tab and the selected tab completely visible?
if ( if (

View File

@@ -1,5 +1,5 @@
diff --git a/browser/components/urlbar/UrlbarInput.sys.mjs b/browser/components/urlbar/UrlbarInput.sys.mjs diff --git a/browser/components/urlbar/UrlbarInput.sys.mjs b/browser/components/urlbar/UrlbarInput.sys.mjs
index 3ab07e5864b3bb200608e7f619645f92ade129fe..31085d82271b0259cd69ec9691ea5f33fe29e19e 100644 index 50968dc04b527438acf30151f0c2e92f8b45097c..f8587b68ac057bb0f829fc21f08ade6605b14c92 100644
--- a/browser/components/urlbar/UrlbarInput.sys.mjs --- a/browser/components/urlbar/UrlbarInput.sys.mjs
+++ b/browser/components/urlbar/UrlbarInput.sys.mjs +++ b/browser/components/urlbar/UrlbarInput.sys.mjs
@@ -67,6 +67,13 @@ XPCOMUtils.defineLazyPreferenceGetter( @@ -67,6 +67,13 @@ XPCOMUtils.defineLazyPreferenceGetter(
@@ -16,7 +16,56 @@ index 3ab07e5864b3bb200608e7f619645f92ade129fe..31085d82271b0259cd69ec9691ea5f33
const DEFAULT_FORM_HISTORY_NAME = "searchbar-history"; const DEFAULT_FORM_HISTORY_NAME = "searchbar-history";
const SEARCH_BUTTON_CLASS = "urlbar-search-button"; const SEARCH_BUTTON_CLASS = "urlbar-search-button";
@@ -2152,6 +2159,11 @@ export class UrlbarInput { @@ -348,7 +355,11 @@ export class UrlbarInput {
// See _on_select(). HTMLInputElement.select() dispatches a "select"
// event but does not set the primary selection.
this._suppressPrimaryAdjustment = true;
+ this.document.getElementById("navigator-toolbox").setAttribute("supress-primary-adjustment", !this.document.getElementById("navigator-toolbox").hasAttribute("zen-has-hover"));
this.inputField.select();
+ this.document.ownerGlobal.setTimeout(() => {
+ this.document.getElementById("navigator-toolbox").removeAttribute("supress-primary-adjustment");
+ }, 100);
this._suppressPrimaryAdjustment = false;
}
@@ -424,6 +435,10 @@ export class UrlbarInput {
hideSearchTerms = false,
isSameDocument = false
) {
+ if (this.hasAttribute("zen-newtab")) {
+ return;
+ }
+
// We only need to update the searchModeUI on tab switch conditionally
// as we only persist searchMode with ScotchBonnet enabled.
if (
@@ -697,8 +712,11 @@ export class UrlbarInput {
return;
}
}
-
+ this.document.getElementById("navigator-toolbox").setAttribute("supress-primary-adjustment", !this.document.getElementById("navigator-toolbox").hasAttribute("zen-has-hover"));
this.handleNavigation({ event });
+ this.document.ownerGlobal.setTimeout(() => {
+ this.document.getElementById("navigator-toolbox").removeAttribute("supress-primary-adjustment");
+ }, 200);
}
/**
@@ -1087,7 +1105,11 @@ export class UrlbarInput {
}
if (!result.payload.providesSearchMode) {
- this.view.close({ elementPicked: true });
+ if (this._zenHandleUrlbarClose) {
+ this._zenHandleUrlbarClose(true);
+ } else {
+ this.view.close({ elementPicked: true });
+ }
}
this.controller.recordSelectedResult(event, result);
@@ -2144,6 +2166,11 @@ export class UrlbarInput {
this.setAttribute("breakout-extend", "true"); this.setAttribute("breakout-extend", "true");
@@ -28,7 +77,28 @@ index 3ab07e5864b3bb200608e7f619645f92ade129fe..31085d82271b0259cd69ec9691ea5f33
// Enable the animation only after the first extend call to ensure it // Enable the animation only after the first extend call to ensure it
// doesn't run when opening a new window. // doesn't run when opening a new window.
if (!this.hasAttribute("breakout-extend-animate")) { if (!this.hasAttribute("breakout-extend-animate")) {
@@ -3875,6 +3887,11 @@ export class UrlbarInput { @@ -2163,6 +2190,11 @@ export class UrlbarInput {
return;
}
+ if (this._zenHandleUrlbarClose) {
+ this._zenHandleUrlbarClose();
+ }
+ this.removeAttribute("zen-floating-urlbar");
+
this.removeAttribute("breakout-extend");
this.#updateTextboxPosition();
}
@@ -3305,7 +3337,7 @@ export class UrlbarInput {
} else {
where = lazy.BrowserUtils.whereToOpenLink(event, false, false);
}
- if (lazy.UrlbarPrefs.get("openintab")) {
+ if (lazy.UrlbarPrefs.get("openintab") || this.hasAttribute("zen-newtab")) {
if (where == "current") {
where = "tab";
} else if (where == "tab") {
@@ -3859,6 +3891,11 @@ export class UrlbarInput {
} }
_on_click(event) { _on_click(event) {
@@ -40,7 +110,16 @@ index 3ab07e5864b3bb200608e7f619645f92ade129fe..31085d82271b0259cd69ec9691ea5f33
if ( if (
event.target == this.inputField || event.target == this.inputField ||
event.target == this._inputContainer || event.target == this._inputContainer ||
@@ -3986,9 +4003,12 @@ export class UrlbarInput { @@ -3930,7 +3967,7 @@ export class UrlbarInput {
}
}
- if (this.focusedViaMousedown) {
+ if (this.focusedViaMousedown || this.hasAttribute("zen-newtab")) {
this.view.autoOpen({ event });
} else {
if (this._untrimOnFocusAfterKeydown) {
@@ -3970,9 +4007,12 @@ export class UrlbarInput {
} }
_on_mousedown(event) { _on_mousedown(event) {
@@ -54,7 +133,7 @@ index 3ab07e5864b3bb200608e7f619645f92ade129fe..31085d82271b0259cd69ec9691ea5f33
if ( if (
event.target != this.inputField && event.target != this.inputField &&
@@ -3998,8 +4018,8 @@ export class UrlbarInput { @@ -3982,8 +4022,8 @@ export class UrlbarInput {
break; break;
} }

View File

@@ -39,7 +39,7 @@ body {
#welcome .zen-branding-title, #welcome .zen-branding-title,
#thanks .zen-branding-title { #thanks .zen-branding-title {
text-align: center; text-align: center;
font-size: 9rem; font-size: 7rem;
} }
#buttons-footer { #buttons-footer {
@@ -62,11 +62,6 @@ body {
} }
} }
body:has(#welcome:not([hidden='true'])) {
background: var(--zen-branding-coral);
color: var(--zen-branding-paper);
}
body:has(:is(#welcome, #thanks):not([hidden='true'])) { body:has(:is(#welcome, #thanks):not([hidden='true'])) {
& #buttons-footer { & #buttons-footer {
justify-content: center; justify-content: center;

View File

@@ -0,0 +1,22 @@
diff --git a/browser/themes/shared/browser-shared.css b/browser/themes/shared/browser-shared.css
index 7fcb1d906c3aaec3e6b099ae731267c2b9d0b96a..ea8e0f510b09faaed0955e9974a2d9f285a52649 100644
--- a/browser/themes/shared/browser-shared.css
+++ b/browser/themes/shared/browser-shared.css
@@ -78,7 +78,7 @@ body {
--toolbarbutton-border-radius: 4px;
--identity-box-margin-inline: 4px;
--urlbar-min-height: max(32px, 1.4em);
- --urlbar-icon-padding: calc((var(--urlbar-min-height) - 2px /* border */ - 2px /* padding */ - 16px /* icon */) / 2);
+ --urlbar-icon-padding: calc((var(--urlbar-min-height) - 2px /* border */ - 14px /* icon */) / 2);
/* 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 */
@@ -148,8 +148,6 @@ body {
*/
&.fullscreen-with-menubar {
z-index: var(--browser-area-z-index-toolbox-while-animating);
- box-shadow: var(--content-area-shadow);
- border-bottom-color: var(--chrome-content-separator-color);
}
/* Themes define a set of toolbox foreground and background colors which we

View File

@@ -1,8 +1,8 @@
diff --git a/browser/themes/shared/customizableui/panelUI-shared.css b/browser/themes/shared/customizableui/panelUI-shared.css diff --git a/browser/themes/shared/customizableui/panelUI-shared.css b/browser/themes/shared/customizableui/panelUI-shared.css
index e4409ac75f6ee794d400559b0b01ae30904d01bc..4c10051d6bbc77440195b08397743c03a11d1fb0 100644 index bdbfd3521b4921f7d6d44623181019a8263b5825..d4c4bab98197b2e5948a34daa1e435b74880a700 100644
--- a/browser/themes/shared/customizableui/panelUI-shared.css --- a/browser/themes/shared/customizableui/panelUI-shared.css
+++ b/browser/themes/shared/customizableui/panelUI-shared.css +++ b/browser/themes/shared/customizableui/panelUI-shared.css
@@ -16,7 +16,7 @@ @@ -18,7 +18,7 @@
--menu-panel-width-wide: 29em; --menu-panel-width-wide: 29em;
--arrowpanel-menuitem-margin-block: 0; --arrowpanel-menuitem-margin-block: 0;
@@ -11,7 +11,7 @@ index e4409ac75f6ee794d400559b0b01ae30904d01bc..4c10051d6bbc77440195b08397743c03
--arrowpanel-menuitem-margin: var(--arrowpanel-menuitem-margin-block) var(--arrowpanel-menuitem-margin-inline); --arrowpanel-menuitem-margin: var(--arrowpanel-menuitem-margin-block) var(--arrowpanel-menuitem-margin-inline);
--arrowpanel-menuitem-padding-block: 8px; --arrowpanel-menuitem-padding-block: 8px;
--arrowpanel-menuitem-padding-inline: 8px; --arrowpanel-menuitem-padding-inline: 8px;
@@ -720,15 +720,15 @@ toolbarbutton[constrain-size="true"][cui-areatype="panel"] > .toolbarbutton-badg @@ -819,15 +819,15 @@ toolbarbutton[constrain-size="true"][cui-areatype="panel"] > .toolbarbutton-badg
/* Firefox Account Toolbar Panel */ /* Firefox Account Toolbar Panel */
#fxa-avatar-image { #fxa-avatar-image {
@@ -29,4 +29,4 @@ index e4409ac75f6ee794d400559b0b01ae30904d01bc..4c10051d6bbc77440195b08397743c03
+ --avatar-image-url: var(--zen-avatar-image-url); + --avatar-image-url: var(--zen-avatar-image-url);
} }
&:not([fxatoolbarmenu]) #fxa-toolbar-menu-button { /**

View File

@@ -51,24 +51,6 @@ groupbox {
box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.1); box-shadow: 0 0 2px 0 rgba(0, 0, 0, 0.1);
} }
@media (prefers-color-scheme: dark) {
@media (-moz-bool-pref: 'zen.theme.color-prefs.amoled') {
groupbox {
background: #141414;
}
}
@media (-moz-bool-pref: 'zen.theme.color-prefs.colorful') {
groupbox {
background: light-dark(white, color-mix(in srgb, var(--zen-primary-color) 10%, #1b1b1b 90%));
}
:root {
--zen-settings-secondary-background: light-dark(#f2f4f4, color-mix(in srgb, var(--zen-colors-tertiary) 70%, #0f0f0f 30%));
}
}
}
.subcategory + groupbox, .subcategory + groupbox,
#noFxaAccount, #noFxaAccount,
#hasFxaAccount { #hasFxaAccount {
@@ -182,7 +164,6 @@ groupbox h2 {
margin-bottom: 15px; margin-bottom: 15px;
} }
#zen-dark-theme-styles-form,
#zen-compact-mode-styles-form { #zen-compact-mode-styles-form {
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;

View File

@@ -0,0 +1,13 @@
diff --git a/browser/themes/shared/tabbrowser/content-area.css b/browser/themes/shared/tabbrowser/content-area.css
index 5c721ee07f0be1318a50cb381ddf59550a04d496..fa2d21687dd8ea7dd03fb4cc2952fe783782a955 100644
--- a/browser/themes/shared/tabbrowser/content-area.css
+++ b/browser/themes/shared/tabbrowser/content-area.css
@@ -237,7 +237,7 @@
.dialogStack {
z-index: var(--browser-stack-z-index-dialog-stack);
- position: absolute;
+ position: fixed;
inset: 0;
/* Hide tab-modal dialogs when a window-modal one is up. */

View File

@@ -1,8 +1,8 @@
diff --git a/browser/themes/shared/tabbrowser/tabs.css b/browser/themes/shared/tabbrowser/tabs.css diff --git a/browser/themes/shared/tabbrowser/tabs.css b/browser/themes/shared/tabbrowser/tabs.css
index d48aad3a397909056ee43be4e65797875e80b772..d9728867a69a935caf2176d492a7aa78dcee7424 100644 index 96f930638c04c7ddcc8dc1a7fe4dce8b12a325e6..9e11e715ade485c33ba4c8f719b41002f3008dde 100644
--- a/browser/themes/shared/tabbrowser/tabs.css --- a/browser/themes/shared/tabbrowser/tabs.css
+++ b/browser/themes/shared/tabbrowser/tabs.css +++ b/browser/themes/shared/tabbrowser/tabs.css
@@ -26,7 +26,7 @@ @@ -33,7 +33,7 @@
--tab-icon-overlay-fill: light-dark(white, black); --tab-icon-overlay-fill: light-dark(white, black);
--tab-icon-overlay-stroke: light-dark(black, white); --tab-icon-overlay-stroke: light-dark(black, white);
--tab-label-line-height: 1.7; --tab-label-line-height: 1.7;
@@ -11,7 +11,7 @@ index d48aad3a397909056ee43be4e65797875e80b772..d9728867a69a935caf2176d492a7aa78
--tab-hover-background-color: color-mix(in srgb, currentColor 11%, transparent); --tab-hover-background-color: color-mix(in srgb, currentColor 11%, transparent);
--tab-selected-textcolor: var(--toolbar-color); --tab-selected-textcolor: var(--toolbar-color);
--tab-selected-bgcolor: var(--toolbar-bgcolor); --tab-selected-bgcolor: var(--toolbar-bgcolor);
@@ -145,8 +145,7 @@ @@ -207,8 +207,7 @@
} }
#tabbrowser-tabs[positionpinnedtabs] > #tabbrowser-arrowscrollbox > &[pinned] { #tabbrowser-tabs[positionpinnedtabs] > #tabbrowser-arrowscrollbox > &[pinned] {
@@ -21,7 +21,31 @@ index d48aad3a397909056ee43be4e65797875e80b772..d9728867a69a935caf2176d492a7aa78
} }
#tabbrowser-tabs[movingtab] &:is([selected], [multiselected]) { #tabbrowser-tabs[movingtab] &:is([selected], [multiselected]) {
@@ -498,14 +497,14 @@ @@ -238,7 +237,6 @@
}
:root:not([uidensity=compact]) &[pinned] {
- padding: 0 10px;
}
&:is([selected], [multiselected]) {
@@ -252,6 +250,7 @@
border-radius: inherit;
position: relative;
overflow: hidden;
+ display: none;
&::before {
position: absolute;
@@ -511,7 +510,6 @@
background-repeat: no-repeat;
border-radius: 10px;
-moz-context-properties: fill;
- fill: var(--tab-icon-overlay-fill);
}
}
@@ -569,14 +567,14 @@
} }
&[textoverflow] { &[textoverflow] {
@@ -40,7 +64,16 @@ index d48aad3a397909056ee43be4e65797875e80b772..d9728867a69a935caf2176d492a7aa78
direction: rtl; direction: rtl;
mask-image: linear-gradient(to right, transparent, black var(--tab-label-mask-size)); mask-image: linear-gradient(to right, transparent, black var(--tab-label-mask-size));
} }
@@ -863,7 +862,7 @@ tab-group { @@ -1135,7 +1133,7 @@
}
}
-#tabbrowser-arrowscrollbox[orient="vertical"] > #tabbrowser-arrowscrollbox-periphery > #tabs-newtab-button,
+#tabbrowser-arrowscrollbox[orient="vertical"] #tabbrowser-arrowscrollbox-periphery > #tabs-newtab-button,
#vertical-tabs-newtab-button {
appearance: none;
min-height: var(--tab-min-height);
@@ -1146,7 +1144,7 @@
margin-inline: var(--tab-inner-inline-margin); margin-inline: var(--tab-inner-inline-margin);
#tabbrowser-tabs[orient="vertical"]:not([expanded]) & > .toolbarbutton-text { #tabbrowser-tabs[orient="vertical"]:not([expanded]) & > .toolbarbutton-text {
@@ -49,7 +82,24 @@ index d48aad3a397909056ee43be4e65797875e80b772..d9728867a69a935caf2176d492a7aa78
} }
&:hover { &:hover {
@@ -1052,7 +1051,7 @@ tab-group { @@ -1170,7 +1168,7 @@
* 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.
*/
-#tabbrowser-arrowscrollbox[orient="vertical"] > #tabbrowser-arrowscrollbox-periphery > #tabs-newtab-button {
+#tabbrowser-arrowscrollbox[orient="vertical"] #tabbrowser-arrowscrollbox-periphery > #tabs-newtab-button {
margin-block: var(--tab-block-margin);
}
@@ -1194,7 +1192,6 @@
}
#vertical-pinned-tabs-container {
- --tab-inline-padding: calc((calc(var(--tab-collapsed-background-width) + 2 * var(--tab-pinned-margin-inline-expanded) - var(--icon-size-default)) / 2));
display: none;
grid-template-columns: repeat(auto-fit, minmax(var(--tab-pinned-min-width-expanded), auto));
overflow-y: auto;
@@ -1347,7 +1344,7 @@
toolbarbutton:not(#firefox-view-button), toolbarbutton:not(#firefox-view-button),
toolbarpaletteitem:not(#wrapper-firefox-view-button) toolbarpaletteitem:not(#wrapper-firefox-view-button)
) ~ #tabbrowser-tabs { ) ~ #tabbrowser-tabs {
@@ -58,7 +108,7 @@ index d48aad3a397909056ee43be4e65797875e80b772..d9728867a69a935caf2176d492a7aa78
padding-inline-start: calc(var(--tab-overflow-pinned-tabs-width) + 2px); padding-inline-start: calc(var(--tab-overflow-pinned-tabs-width) + 2px);
margin-inline-start: 2px; margin-inline-start: 2px;
} }
@@ -1087,7 +1086,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button { @@ -1381,7 +1378,6 @@ toolbar:not(#TabsToolbar) #firefox-view-button {
list-style-image: url(chrome://global/skin/icons/plus.svg); list-style-image: url(chrome://global/skin/icons/plus.svg);
} }

View File

@@ -0,0 +1,15 @@
diff --git a/browser/themes/shared/urlbar-searchbar.css b/browser/themes/shared/urlbar-searchbar.css
index 45aa61f93d354da432eceb1c276466609a6910d0..6585158b855af19689e86ef6a833f63736ec225c 100644
--- a/browser/themes/shared/urlbar-searchbar.css
+++ b/browser/themes/shared/urlbar-searchbar.css
@@ -291,7 +291,9 @@
}
#urlbar[breakout][breakout-extend] {
- margin-left: calc(-1 * var(--urlbar-margin-inline));
+ :root:not([zen-single-toolbar='true']) {
+ margin-left: calc(-1 * var(--urlbar-margin-inline));
+ }
width: calc(var(--urlbar-width) + 2 * var(--urlbar-margin-inline));
> .urlbar-input-container {

View File

@@ -1,8 +1 @@
<!-- <svg xmlns="http://www.w3.org/2000/svg" height="18" width="18" viewBox="0 0 18 18"><g stroke-linecap="round" stroke-width="1.5" fill="none" stroke="currentColor" stroke-opacity="context-fill-opacity" stroke-linejoin="round" class="nc-icon-wrapper"><circle cx="9" cy="2.25" r="1.5" data-color="color-2"></circle><line x1="7.25" y1="16.5" x2="7.25" y2="6.24"></line><line x1="10.75" y1="6.24" x2="10.75" y2="16.5"></line><path d="M2.75,5.75c1.751,.3,3.86,.531,6.25,.531,1.777,0,3.894-.128,6.25-.531"></path><line x1="7.25" y1="11.25" x2="10.75" y2="11.25"></line></g></svg>
- 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/.
-->
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" fill="context-fill" fill-opacity="context-fill-opacity">
<path d="M8 0a2.5 2.5 0 0 0-2.396 3.213l-2.24-.847a1.746 1.746 0 0 0-1.245 3.26L5 6.736v2.398l-1.643 4.524a1.747 1.747 0 0 0 3.284 1.194L8 11.145l1.365 3.702a1.745 1.745 0 0 0 3.278-1.2L11 9.124V6.73l2.867-1.087a1.752 1.752 0 1 0-1.244-3.278l-2.227.843A2.5 2.5 0 0 0 8 0zm0 1a1.5 1.5 0 1 1 0 2.999 1.5 1.5 0 0 1 0-3zM2.729 3.252a.74.74 0 0 1 .28.05l4.104 1.551c.571.216 1.201.216 1.772 0l4.094-1.552a.754.754 0 1 1 .535 1.41l-3.192 1.208a.498.498 0 0 0-.322.467V9.21c0 .058.01.117.03.171l1.673 4.608a.745.745 0 0 1-1.4.511l-1.37-3.719c-.319-.867-1.547-.866-1.865.002L5.703 14.51a.747.747 0 1 1-1.404-.511l1.67-4.606A.497.497 0 0 0 6 9.222v-2.83a.5.5 0 0 0-.32-.467L2.479 4.693a.745.745 0 0 1 .25-1.44z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 572 B

View File

@@ -1,9 +1 @@
<!-- <svg xmlns="http://www.w3.org/2000/svg" height="18" width="18" viewBox="0 0 18 18"><g stroke-linecap="round" stroke-width="1.5" fill="none" stroke="currentColor" stroke-opacity="context-fill-opacity" stroke-linejoin="round" class="nc-icon-wrapper"><path d="M14.181,3.257c-.221-.865-.998-1.507-1.931-1.507H5.75c-1.105,0-2,.896-2,2v12.5l5.25-3.5,5.25,3.5v-3"></path><line x1="14.25" y1="5.75" x2="14.25" y2="10.75" data-color="color-2"></line><line x1="16.75" y1="8.25" x2="11.75" y2="8.25" data-color="color-2"></line></g></svg>
- 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/.
-->
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" fill="context-fill" fill-opacity="context-fill-opacity">
<path d="M4 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h4.35a5.769 5.769 0 0 1-1.076-1H4.001a1 1 0 0 1-1-1h3.605a5.376 5.376 0 0 1-.406-1H3V2a1 1 0 0 1 1-1h8a1 1 0 0 1 1 1v4.199a5.2 5.2 0 0 1 1 .398V2a2 2 0 0 0-2-2H4zm1 2a1 1 0 0 0-1 1v1a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1V3a1 1 0 0 0-1-1H5zm0 1h6v1H5V3z"/>
<path d="M16 11.5a4.5 4.5 0 1 1-9 0 4.5 4.5 0 0 1 9 0zm-4-2a.5.5 0 0 0-1 0V11H9.5a.5.5 0 0 0 0 1H11v1.5a.5.5 0 0 0 1 0V12h1.5a.5.5 0 0 0 0-1H12z"/>
</svg>

Before

Width:  |  Height:  |  Size: 791 B

After

Width:  |  Height:  |  Size: 528 B

View File

@@ -1,8 +1 @@
<!-- <svg xmlns="http://www.w3.org/2000/svg" height="18" width="18" viewBox="0 0 18 18"><g stroke-linecap="round" stroke-width="1.5" fill="none" stroke="currentColor" stroke-opacity="context-fill-opacity" stroke-linejoin="round" class="nc-icon-wrapper"><polyline points="15.25 6.5 9 12.75 2.75 6.5"></polyline></g></svg>
- 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/.
-->
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" fill="context-fill" fill-opacity="context-fill-opacity">
<path d="M8 11.5a.547.547 0 0 1-.389-.162L2.146 5.854a.5.5 0 1 1 .707-.705L8 10.313l5.146-5.164a.5.5 0 1 1 .71.705l-5.466 5.484A.55.55 0 0 1 8 11.5z"/>
</svg>

Before

Width:  |  Height:  |  Size: 501 B

After

Width:  |  Height:  |  Size: 316 B

View File

@@ -1,8 +1 @@
<!-- <svg xmlns="http://www.w3.org/2000/svg" height="18" width="18" viewBox="0 0 18 18"><g stroke-linecap="round" stroke-width="1.5" fill="none" stroke="currentColor" stroke-opacity="context-fill-opacity" stroke-linejoin="round" class="nc-icon-wrapper"><polyline points="11.5 15.25 5.25 9 11.5 2.75"></polyline></g></svg>
- 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/.
-->
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" fill="context-fill" fill-opacity="context-fill-opacity">
<path transform="scale(-1 1) translate(-16 0)" d="M5.5 2a.5.5 0 0 0-.354.853L10.313 8l-5.167 5.146a.5.5 0 0 0 .707.71l5.484-5.468a.548.548 0 0 0 0-.777L5.853 2.143A.496.496 0 0 0 5.5 2z"/>
</svg>

Before

Width:  |  Height:  |  Size: 538 B

After

Width:  |  Height:  |  Size: 317 B

View File

@@ -1,8 +1 @@
<!-- <svg xmlns="http://www.w3.org/2000/svg" height="18" width="18" viewBox="0 0 18 18"><g stroke-linecap="round" stroke-width="1.5" fill="none" stroke="currentColor" stroke-opacity="context-fill-opacity" stroke-linejoin="round" class="nc-icon-wrapper"><polyline points="6.5 2.75 12.75 9 6.5 15.25"></polyline></g></svg>
- 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/.
-->
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" fill="context-fill" fill-opacity="context-fill-opacity">
<path d="M5.5 2a.5.5 0 0 0-.354.853L10.313 8l-5.167 5.146a.5.5 0 0 0 .707.71l5.484-5.468a.548.548 0 0 0 0-.777L5.853 2.143A.496.496 0 0 0 5.5 2z"/>
</svg>

Before

Width:  |  Height:  |  Size: 497 B

After

Width:  |  Height:  |  Size: 316 B

View File

@@ -1,8 +1 @@
<!-- <svg xmlns="http://www.w3.org/2000/svg" height="18" width="18" viewBox="0 0 18 18"><g stroke-linecap="round" stroke-width="1.5" fill="none" stroke="currentColor" stroke-opacity="context-fill-opacity" stroke-linejoin="round" class="nc-icon-wrapper"><polyline points="2.75 11.5 9 5.25 15.25 11.5"></polyline></g></svg>
- 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/.
-->
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" fill="context-fill" fill-opacity="context-fill-opacity">
<path d="M8 4.5a.547.547 0 0 0-.389.162l-5.465 5.484a.5.5 0 1 0 .707.705L8 5.687l5.146 5.164a.5.5 0 1 0 .71-.705L8.388 4.662A.55.55 0 0 0 8 4.5z"/>
</svg>

Before

Width:  |  Height:  |  Size: 497 B

After

Width:  |  Height:  |  Size: 317 B

View File

@@ -1,9 +1 @@
<!-- <svg xmlns="http://www.w3.org/2000/svg" height="18" width="18" viewBox="0 0 18 18"><g stroke-linecap="round" stroke-width="1.5" fill="none" stroke="currentColor" stroke-opacity="context-fill-opacity" stroke-linejoin="round" class="nc-icon-wrapper"><line x1="5.75" y1="7.25" x2="5.75" y2="13.75"></line><line x1="14.75" y1="5.75" x2="14.75" y2="12.25"></line><path d="m8.6399,3.0186l4.9461-.8246c.61-.102,1.164.368,1.164.986v2.57l-9,1.5"></path><circle cx="3.75" cy="13.75" r="2"></circle><circle cx="12.75" cy="12.25" r="2"></circle><line x1="3.75" y1="1.25" x2="3.75" y2="6.25" data-color="color-2"></line><line x1="6.25" y1="3.75" x2="1.25" y2="3.75" data-color="color-2"></line></g></svg>
- 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/.
-->
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" fill="context-fill" fill-opacity="context-fill-opacity">
<path d="M14.13 7c-.478 0-.957.18-1.322.547l-4.828 4.83a2.2 2.2 0 0 0-.578 1.02l-.375 1.498a.889.889 0 0 0 1.078 1.078l1.498-.375a2.2 2.2 0 0 0 1.02-.578l4.828-4.828A1.872 1.872 0 0 0 14.13 7zm-.002 1.002c.427.002.671.224.8.537.13.314.116.643-.187.947l-4.826 4.826a1.204 1.204 0 0 1-.556.315l-1.316.332.33-1.32H8.37c.053-.21.163-.403.316-.557l4.828-4.83a.85.85 0 0 1 .614-.25zm-6.266 7 .002.002H7.86z"/>
<path d="M12.94.182c-.08.004-.162.02-.242.045l-7 2.188a.998.998 0 0 0-.701.953V11.5a2.5 2.5 0 1 0 1 2V6.368l7-2.188v2.055c.32-.137.66-.213 1-.229V1.18c0-.59-.5-1.032-1.057-.998zm.057.998v1.953l-7 2.188V3.368l7-2.188zM3.497 12a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3z"/>
</svg>

Before

Width:  |  Height:  |  Size: 1021 B

After

Width:  |  Height:  |  Size: 692 B

View File

@@ -1,10 +1 @@
<!-- <svg xmlns="http://www.w3.org/2000/svg" height="18" width="18" viewBox="0 0 18 18"><g stroke-linecap="round" stroke-width="1.5" fill="none" stroke="currentColor" stroke-opacity="context-fill-opacity" stroke-linejoin="round" class="nc-icon-wrapper"><path d="M9.25,8.75V1.75s1.303,2.048,3.427,3.573"></path><path d="M5.406,16.13c.268,.078,.551,.12,.844,.12,1.657,0,3-1.343,3-3,0-.293-.042-.577-.12-.844"></path><path d="M7.485,10.515c-.377-.17-.795-.265-1.235-.265-1.657,0-3,1.343-3,3,0,.44,.095,.858,.265,1.235"></path><line x1="2" y1="16" x2="16" y2="2" data-color="color-2"></line></g></svg>
- 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/.
-->
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" fill="context-fill" fill-opacity="context-fill-opacity">
<defs><clipPath id="a"><path d="M2.1 0 16 13.9V0zM0 .7V16h15.3z"/></clipPath></defs>
<path clip-path="url(#a)" d="M12.94.182c-.08.004-.162.017-.242.043l-7 2.188a1 1 0 0 0-.701.955V11.5a2.5 2.5 0 1 0 1 2V6.368l7-2.188V9.5a2.5 2.5 0 1 0 1 2V1.18c0-.59-.5-1.032-1.057-.998zm.057.998v1.953l-7 2.188V3.368l7-2.188zm-1.5 8.82a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zm-8 2a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3z"/>
<path d="M.5 0a.5.5 0 0 0-.354.146.5.5 0 0 0 0 .707l15 15a.5.5 0 0 0 .707 0 .5.5 0 0 0 0-.707l-15-15A.5.5 0 0 0 .499 0z"/>
</svg>

Before

Width:  |  Height:  |  Size: 878 B

After

Width:  |  Height:  |  Size: 593 B

View File

@@ -1,8 +1 @@
<!-- <svg xmlns="http://www.w3.org/2000/svg" height="18" width="18" viewBox="0 0 18 18"><g stroke-linecap="round" stroke-width="1.5" fill="none" stroke="currentColor" stroke-opacity="context-fill-opacity" stroke-linejoin="round" class="nc-icon-wrapper"><path d="M9.75,13.25V1.75s1.75,2.75,4.5,4.25" data-color="color-2"></path><circle cx="6.75" cy="13.25" r="3"></circle></g></svg>
- 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/.
-->
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" fill="context-fill" fill-opacity="context-fill-opacity">
<path d="M12.94.182c-.08.004-.162.017-.242.043l-7 2.188a1 1 0 0 0-.701.955V11.5a2.5 2.5 0 1 0 1 2V6.368l7-2.188V9.5a2.5 2.5 0 1 0 1 2V1.18c0-.59-.5-1.032-1.057-.998zm.057.998v1.953l-7 2.188V3.368l7-2.188zm-1.5 8.82a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zm-8 2a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3z"/>
</svg>

Before

Width:  |  Height:  |  Size: 646 B

After

Width:  |  Height:  |  Size: 377 B

View File

@@ -1,9 +1 @@
<!-- <svg xmlns="http://www.w3.org/2000/svg" height="18" width="18" viewBox="0 0 18 18"><g stroke-linecap="round" stroke-width="1.5" fill="none" stroke="currentColor" stroke-opacity="context-fill-opacity" stroke-linejoin="round" class="nc-icon-wrapper"><line x1="2.75" y1="9" x2="15.25" y2="9" data-color="color-2"></line><polyline points="7 13.25 2.75 9 7 4.75"></polyline></g></svg>
- 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/.
-->
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" fill="context-fill" fill-opacity="context-fill-opacity"
viewBox="0 0 16 16" xml:space="preserve">
<path d="M9.7,13.9L3.8,8l5.9-5.9l0.7,0.7L5.1,8l5.3,5.3L9.7,13.9z"/>
</svg>

Before

Width:  |  Height:  |  Size: 458 B

After

Width:  |  Height:  |  Size: 380 B

View File

@@ -1,8 +1 @@
<!-- <svg xmlns="http://www.w3.org/2000/svg" height="18" width="18" viewBox="0 0 18 18"><g stroke-linecap="round" stroke-width="1.5" fill="none" stroke="currentColor" stroke-opacity="context-fill-opacity" stroke-linejoin="round" class="nc-icon-wrapper"><path d="M12.25,16.25l-4.75-3.5-4.75,3.5V6.75c0-1.105,.895-2,2-2h5.5c1.105,0,2,.895,2,2v9.5Z"></path><path d="M6.781,2c.287-.159,.617-.25,.969-.25h5.5c1.105,0,2,.895,2,2V13.25" data-color="color-2"></path></g></svg>
- 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/.
-->
<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" fill="context-fill" fill-opacity="context-fill-opacity">
<path d="M8.002.3a.99.99 0 0 0-.898.557L5.174 4.77l-4.316.627a1 1 0 0 0-.555 1.705l3.123 3.045-.736 4.3A1 1 0 0 0 4.14 15.5l3.862-2.029 3.859 2.03a1 1 0 0 0 1.45-1.056l-.736-4.299 3.123-3.045a1 1 0 0 0-.554-1.705l-4.316-.627L8.898.857A.987.987 0 0 0 8 .301zm0 1 1.93 3.91c.146.296.426.5.752.548l4.318.629-3.125 3.043c-.236.23-.343.562-.287.886l.738 4.3-3.86-2.03a1.002 1.002 0 0 0-.932 0l-3.86 2.03.737-4.3a1.003 1.003 0 0 0-.287-.886L1.003 6.387l4.316-.63a.998.998 0 0 0 .752-.546z"/>
</svg>

Before

Width:  |  Height:  |  Size: 835 B

After

Width:  |  Height:  |  Size: 464 B

Some files were not shown because too many files have changed in this diff Show More