Compare commits

..

389 Commits

Author SHA1 Message Date
mr. M
335925abad Add CSS Houdini squircle support and polyfill for enhanced styling 2025-02-05 22:39:58 +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
mr. M
07a9aabe20 Remove box-shadow from selected vertical tabs for a cleaner appearance 2025-01-20 00:17:13 +01:00
mr. M
4702b8ffed Add dark mode support for dialog box border styling in welcome panel 2025-01-19 23:54:41 +01:00
mr. M
b071c7ff11 Refactor URL bar styles to remove box-shadow and outlines for improved aesthetics 2025-01-19 22:33:56 +01:00
mr. M
9d8b8458bf Refactor URL bar styles to remove box-shadow for a cleaner appearance in single toolbar mode 2025-01-19 22:28:50 +01:00
mr. M
73bc2382bb Set default placement for top buttons in ZenCustomizableUI 2025-01-19 22:17:38 +01:00
mr. M
4a4c8a7b2b Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-01-19 20:30:05 +01:00
mr. M
0a9f88a2fb Remove compact view preference and update related logic for improved clarity 2025-01-19 20:29:59 +01:00
mr. m
8bed8e2cf7 Update zen-theme.css
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-19 08:30:17 -08:00
mr. m
c8b396b99d Update surfer.json
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-19 08:26:23 -08:00
mr. M
afc636a20f Refactor ZenCompactMode animation logic for improved readability 2025-01-19 17:10:31 +01:00
mr. M
bd0b012bce Reduce animation duration in ZenWorkspaces for improved responsiveness 2025-01-19 17:06:49 +01:00
mr. M
86b0a9dac2 Refactor tab animation logic for improved performance and update CSS variables for consistent styling 2025-01-19 16:28:07 +01:00
mr. M
f344c0d41d Refactor ZenCompactMode animation logic for improved performance and readability 2025-01-19 15:17:53 +01:00
mr. M
f70c599afd Update border contrast color in zen-theme.css for improved visibility 2025-01-19 13:57:25 +01:00
mr. M
08cf77eb23 Enhance Zen styling and transitions for improved user experience 2025-01-19 13:55:57 +01:00
mr. M
25910c5189 Refactor initialization scripts and update CSS variables for consistent styling across components 2025-01-19 13:00:27 +01:00
mr. M
09d17f2cfe Remove unnecessary blank line in ZenWorkspacesStorage.mjs 2025-01-18 22:38:15 +01:00
mr. M
c9cf757964 Add ZenWorkspacesStorage initialization and ensure waitForPromises is called 2025-01-18 22:35:35 +01:00
mr. M
98b64e2fad Adjust zen-appcontent-wrapper styles to prevent bookmarks overflow without using overflow:hidden 2025-01-18 22:35:29 +01:00
mr. M
fbfab42e8b Update waitForPromises to ensure all windows are restored before initialization 2025-01-18 22:12:01 +01:00
mr. M
c44c63d5ce Add debug logging for pinned tab manager and ensure session store initialization 2025-01-18 21:38:12 +01:00
mr. M
1e3b1a6605 Refine box-shadow styles for zen-browser and zen-theme to enhance visual consistency 2025-01-18 19:56:12 +01:00
mr. M
ef2a2a5efc Enhance tab animation logic to include vertical tabs peripherals in workspace indicator animations 2025-01-18 11:06:01 +01:00
mr. M
ccfe709789 Update tab unloading behavior and prevent closing window with last tab 2025-01-18 10:55:43 +01:00
mr. M
43563ccff7 Add opacity to new tab button for improved visibility in vertical tabs 2025-01-18 10:28:57 +01:00
mr. M
db2673cf27 Implement sidebar splitter and overflow handling; enhance customizable UI features 2025-01-18 10:25:13 +01:00
mr. M
351cc884ec Add ZenGlanceManager script and update event listener binding in PlacesViewBase 2025-01-18 01:36:17 +01:00
mr. M
d6823beb95 Enhance vertical tabs styling with new background color variable; adjust sidebar transition durations for smoother animations and improve hover handling logic 2025-01-17 22:50:05 +01:00
mr. M
dfede695a7 Increase hover duration for sidebar elements to enhance user interaction experience 2025-01-17 22:31:02 +01:00
mr. M
b0354fa8b9 Refactor CSS styles for improved layout and transitions; adjust sidebar and tab margins for better visual consistency 2025-01-17 22:23:57 +01:00
mr. M
41cecd4947 Disable essentials favicon background in theme preferences for improved customization options 2025-01-17 21:46:48 +01:00
mr. M
dd5a59a1cb Enhance vertical tabs layout with max-height adjustment; update hover duration and animation easing for improved user experience 2025-01-17 21:41:49 +01:00
mr. M
ee86bff81c Refactor Zen UI components for improved toolbar button management and layout adjustments 2025-01-17 21:29:08 +01:00
mr. M
9fb04e4f7c Add shutdown check to prevent closing pinned tabs during shutdown 2025-01-17 20:30:48 +01:00
mr. M
74a4efddf1 Refactor font-family declaration for improved readability and consistency; fix syntax in ZenPinnedTabsStorage 2025-01-17 20:28:29 +01:00
mr. M
10906f91f5 Adjust zen-toolbox padding for improved layout consistency 2025-01-17 19:58:12 +01:00
mr. M
816d6887ad Refactor CSS styles to enhance layout consistency and improve padding values 2025-01-17 19:55:51 +01:00
mr. M
e950e012ed Refactor styles and animations for improved UI consistency and performance 2025-01-17 19:47:51 +01:00
mr. M
4fdd0993d7 Reorganize script loading in zen-assets and zen-preloaded to improve module management 2025-01-17 19:14:44 +01:00
mr. M
8e783f948f Fixed essentials and pinned tabs not being correctly restored and race conditions when starting multiple zen windows 2025-01-17 19:01:32 +01:00
mr. M
e6313c4d5f Update URLs in zen.yml.template to use version variable for improved maintainability 2025-01-16 02:30:00 +01:00
mr. M
7de3843cd9 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-01-16 02:13:18 +01:00
mr. M
425d334f8b Rename zen.template to zen.yml.template and update install commands to use variable syntax for improved clarity 2025-01-16 02:13:13 +01:00
mr. m
609854c28d Reverted windows codesign PR
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-15 16:25:58 -08:00
mr. m
fd09bd2092 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-01-15 22:17:25 +00:00
mr. m
1aa00bfa2a Corrected setup wizard branding images
Co-authored-by: heyitszenithyt <heyitszenithyt@gmail.com>
2025-01-15 22:17:07 +00:00
mr. M
d757c36569 Fix self-hosted runner stop script execution by decoding base64 and using bash 2025-01-15 17:07:38 +01:00
mr. M
899567b305 Update zen-toolbox-padding calculation for improved responsiveness 2025-01-15 17:05:32 +01:00
mr. M
59bf54001e Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-01-15 17:04:20 +01:00
mr. M
c50b9cd555 Refactor ZenCompactMode hover handling by removing unused animation tracking and simplifying hover duration logic 2025-01-15 17:04:12 +01:00
mr. m
92fc0f4044 Fixed installing aria2
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-15 11:39:26 +01:00
mr. m
7b90548f88 Fixed stoping self-hosted release runners
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-15 11:36:01 +01:00
mr. m
c0d64f91c0 Update build.yml
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-15 11:33:45 +01:00
mr. m
cd86c556a9 Install aria2c for release builds
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-15 11:30:05 +01:00
mr. M
c909421090 Refactor CSS to remove unnecessary line breaks in max() calculation for native content radius 2025-01-14 23:24:27 +01:00
mr. M
b66b46b8a0 Started using more native rounded corners 2025-01-14 23:22:13 +01:00
mr. M
d94aff97ea Simplify vertical-tabs CSS by removing unnecessary user-hover condition 2025-01-14 20:43:35 +01:00
mr. M
191597e333 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-01-14 20:42:29 +01:00
mr. M
270af0ff00 Refactor ZenCompactMode hover animation handling and add check for ZenWorkspaces existence in browserPlacesViews 2025-01-14 20:42:25 +01:00
mr. m
2f1e292e06 Updated to the correct versioning scheme
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-14 19:17:09 +01:00
mr. M
dd5461273c Fix package manager commands in release build script 2025-01-14 18:59:19 +01:00
mr. M
818100e3d8 Update Flatpak configuration and templates for app.zen_browser.zen 2025-01-14 18:43:14 +01:00
mr. M
1dbc492aac Refactor self-hosted runner script execution in build workflow 2025-01-14 17:58:08 +01:00
mr. M
5c0e99008b Disable smooth scroll on startup and add comment for sidebar animation duration 2025-01-14 17:45:57 +01:00
mr. M
60553b996c Enhance workspace indicator styling and add animation handling in compact mode 2025-01-14 17:43:25 +01:00
mr. M
5886241e8d Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-01-14 16:54:48 +01:00
mr. M
bdcc36c321 Fixed space between essentials/tabs and the workspace title is different for default vs others (closes https://github.com/zen-browser/desktop/issues/4329) 2025-01-14 16:54:40 +01:00
mr. M
9fd989106d Update Firefox version to 134.0.1 in surfer.json and README.md; adjust LTO settings in mozconfig 2025-01-14 16:46:55 +01:00
mr. m
f99f6f4ea7 Removed about:support text field from bug report form
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-14 12:48:53 +01:00
mr. M
62df1fbc59 Refactor language pack download script: replace shell script with Python equivalent for consistency and maintainability 2025-01-14 00:05:14 +01:00
mr. M
a512948eb0 Refactor language pack scripts: replace shell scripts with Python equivalents for improved maintainability and functionality; remove obsolete scripts and update surfer.json formatting. 2025-01-13 23:15:37 +01:00
mr. M
2aaf3f82e6 Update surfer.json to change Firefox candidate version to 134.0.1 2025-01-13 22:57:14 +01:00
mr. M
af79354d46 Update surfer.json to correct Firefox candidate version to 134.0 2025-01-13 22:55:35 +01:00
mr. M
f6d3b4d868 Refactor workflow and scripts for improved functionality; update package.json commands and ensure consistent return values in scripts. 2025-01-13 22:53:39 +01:00
mr. M
20882f65cc Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-01-13 22:49:15 +01:00
mr. M
922e909a7f Update README and surfer.json for Firefox RC 134.0.1; enhance update scripts 2025-01-13 22:49:10 +01:00
mr. M
98c5f0efb7 Add script to check Firefox release candidates and notify via Discord 2025-01-13 22:46:48 +01:00
mr. m
509ede1f98 Bumped twilight version to 1.7t
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-13 11:57:33 -08:00
mr. M
e0ea3b5866 Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-01-13 16:55:12 +01:00
mr. M
aa67693b8d Refactor CSS to reintroduce accent color styles for window states in zen-browser UI and theme (closes https://github.com/zen-browser/desktop/issues/4261) 2025-01-13 16:55:05 +01:00
mr. m
f70f27fc94 Merge pull request #4318 from Tanay-Kar/patch-2
Fixed grammatical error in README.md
2025-01-13 07:51:13 +01:00
Tanay Kar
1b2eb4a92d Fixed grammatical error
amongs -> among

Signed-off-by: Tanay Kar <93914273+Tanay-Kar@users.noreply.github.com>
2025-01-13 10:17:51 +05:30
mr. M
661916eac6 Add fallback to remove self-hosted runner scripts without error 2025-01-13 00:45:20 +01:00
mr. M
e9c662cbf7 Reduce box-shadow opacity in zen-browser-container.css for improved visual clarity 2025-01-12 21:21:27 +01:00
mr. M
f123e0534b Decode self-hosted runner start script from base64 before execution 2025-01-12 21:01:05 +01:00
mr. M
9160111e20 Refactor lint job to use reusable workflow for code linting 2025-01-12 20:53:46 +01:00
mr. M
1318341451 Increase sleep duration to 90 seconds for runner readiness in build workflow 2025-01-12 20:50:33 +01:00
mr. M
e9456ac073 Update AWS CLI installation in build workflow to include --update flag 2025-01-12 20:47:01 +01:00
mr. M
5865b9fd2d Update GitHub Actions to use self-hosted runners for x86_64 release builds 2025-01-12 20:45:12 +01:00
mr. M
e1c3bac43a Update tar-fs to version 2.1.2 and standardize import quotes in ZenCustomizableUI 2025-01-12 20:33:24 +01:00
mr. M
7e5be9f0b8 Comment out exit on branch mismatch in build workflow 2025-01-12 20:15:35 +01:00
mr. M
e3e7eec78a Merge branch 'dev' of https://github.com/zen-browser/desktop into dev 2025-01-12 20:03:45 +01:00
mr. M
f5bffa4b24 Add import for AppConstants in ZenCustomizableUI module 2025-01-12 20:03:38 +01:00
mauro-balades
0978259d2e Update monthly issue metrics 2025-01-12 18:59:17 +00:00
mr. M
d6a140ea7d Update default placements for ZenCustomizableUI based on platform 2025-01-12 18:39:21 +01:00
mr. M
33744a4a73 Add aws-cli installation steps to build workflow and update script handling 2025-01-12 18:33:18 +01:00
mr. M
3bb64df473 Add self-hosted runner management to build workflow 2025-01-12 18:27:45 +01:00
mr. M
9775e1c75d Update formatting commands in package.json and pyproject.toml; refactor indentation in Python scripts for consistency 2025-01-12 17:01:36 +01:00
mr. M
225ab67a50 Add autopep8 configuration and integrate into workflows for code formatting 2025-01-12 16:57:34 +01:00
mr. M
838569e386 Refactor remove-failed-jobs.sh for improved readability and formatting 2025-01-12 16:37:27 +01:00
mr. m
040a8fad5b Merge pull request #4162 from cristiancmoises/patch-2 2025-01-12 16:35:18 +01:00
mr. m
143218913d Discard changes to scripts/download-language-packs.sh 2025-01-12 16:34:09 +01:00
mr. m
2b7580f186 Discard changes to scripts/copy-language-pack.sh 2025-01-12 16:34:01 +01:00
mr. m
babdc9568f Discard changes to .github/workflows/code-linter.yml 2025-01-12 16:26:16 +01:00
mr. M
e4103c9d4a Fixed unfocusing the browser with widget.gtk.rounded-bottom-corners.enabled causes the bottom corners to stop being rounded (closes https://github.com/zen-browser/desktop/issues/4294) 2025-01-12 14:14:53 +01:00
mr. M
dff60ee6ef Fixed a small border being visible at the top of the window (closes https://github.com/zen-browser/desktop/issues/4264) 2025-01-12 14:06:45 +01:00
mr. M
14664bd38f Refactor keyboard shortcut validation logic to simplify parsing and remove obsolete checks 2025-01-12 12:43:47 +01:00
mr. M
f61feb54d4 Update display version to 1.6t.1 in surfer.json 2025-01-12 12:01:02 +01:00
Cristian Cezar Moisés
bbeb8aa884 Update sign.ps1
Refactored Repeated Logic: Created functions for downloading artifacts, signing files, moving files, and creating tar archives.

Error Handling: Added checks for file existence before moving files and implemented verbose logging.

Parameter Validation: Used ValidateNotNullOrEmpty for parameters.

Improved Path Handling: Used Join-Path for constructing file paths

Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-12 02:59:35 +00:00
Cristian Cezar Moisés
864879eabe Update code-linter.yml
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-12 02:52:20 +00:00
Cristian Cezar Moisés
d10ce64f2d Merge branch 'zen-browser:dev' into patch-2 2025-01-11 23:47:07 -03:00
mr. M
c93263ccea Add support for essentials favicon background in tab styles 2025-01-11 23:53:59 +01:00
mr. M
37092f0359 Refine CSS transition timing and update animation function for compact mode 2025-01-11 23:40:58 +01:00
mr. M
e26ff172c8 Add tab icon change handling and enhance tab background styles 2025-01-11 22:54:04 +01:00
mr. M
619f979232 Enhance animation logic for workspace transitions and refine CSS styles 2025-01-11 21:59:49 +01:00
mr. M
1710ebae19 Add motion animation support and refine UI transitions for workspace interactions 2025-01-11 21:33:06 +01:00
mr. M
50a48cdf24 Add conditional check for branch verification in build workflow 2025-01-11 17:48:06 +01:00
mr. m
997384e832 Merge pull request #4282 from zen-browser/new-workspace-functionality 2025-01-11 17:37:41 +01:00
mr. M
1f43997088 Workspace switching animations are now context aware 2025-01-11 17:35:50 +01:00
mr. M
097404b3d1 Refactor tab animation logic to improve workspace transitions and remove unused CSS animations 2025-01-11 17:25:42 +01:00
mr. M
8562cfb813 Refactor tab closing logic to handle new tab creation when closing the last unpinned tab and prevent reentrancy issues during window closure 2025-01-11 16:50:00 +01:00
mr. M
70cd0f90c7 Fixed weird margins on the browser view when having right sided tabs 2025-01-11 16:10:55 +01:00
mr. M
8981160627 Implement logic to close window when last tab is closed based on user preference 2025-01-11 14:49:28 +01:00
mr. M
e01af2fe97 Fixed closing the last tab of a workspace not opening a new tab when zen.workspaces.open-new-tab-if-last-unpinned-tab-is-closed is set to true 2025-01-11 14:35:57 +01:00
mr. M
a5d1537b75 Add TODO comment to handle user preferences for tab opening behavior 2025-01-11 14:31:29 +01:00
mr. M
a035b6f1c6 Fixed urlbar being below the tabs visually (closes https://github.com/zen-browser/desktop/issues/4276) 2025-01-11 14:24:55 +01:00
mr. m
18f84476ef Update zen.desktop
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-10 16:30:07 +01:00
mr. m
ed7735e3b8 Update build.yml
Signed-off-by: mr. m  <91018726+mauro-balades@users.noreply.github.com>
2025-01-10 16:29:09 +01:00
Cristian Cezar Moisés
5a9f29bd9d Merge branch 'zen-browser:dev' into patch-2 2025-01-04 21:16:13 -03:00
Cristian Cezar Moisés
728cd96cfa Merge branch 'zen-browser:dev' into patch-2 2025-01-04 13:27:03 -03:00
mr. m
67f3da6be2 Merge branch 'dev' into patch-2
Signed-off-by: mr. m  <91018726+mr-cheff@users.noreply.github.com>
2025-01-04 12:32:30 +01:00
Cristian Cezar Moisés
9ff2cf35c6 Update update-en-US-packs.sh
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-04 04:39:55 +00:00
Cristian Cezar Moisés
86a3a06bb1 Update download-language-packs.sh
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-04 04:39:09 +00:00
Cristian Cezar Moisés
f81835cc60 Update download-language-packs.sh
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-04 04:29:30 +00:00
Cristian Cezar Moisés
8ab4f8bd93 Update update-en-US-packs.sh
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-04 04:27:49 +00:00
Cristian Cezar Moisés
ae5526c928 Update download-language-packs.sh
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-04 04:14:32 +00:00
Cristian Cezar Moisés
335cd41eca Update update-en-US-packs.sh
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-04 04:14:11 +00:00
Cristian Cezar Moisés
711f189e0e Update update_newtab.py
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-03 23:11:02 +00:00
Cristian Cezar Moisés
1d579d12d2 Update update_ff.py
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-03 23:10:11 +00:00
Cristian Cezar Moisés
624fde5b46 Update update-en-US-packs.sh
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-03 23:09:14 +00:00
Cristian Cezar Moisés
87a3c923a6 Update update-en-US-packs.sh
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-03 23:08:30 +00:00
Cristian Cezar Moisés
c38c82bf6a Update remove-failed-jobs.sh
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-03 23:07:12 +00:00
Cristian Cezar Moisés
cd03077b77 Update download-language-packs.sh
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-03 23:06:22 +00:00
Cristian Cezar Moisés
871f320de7 Update copy-language-pack.sh
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-03 23:05:08 +00:00
Cristian Cezar Moisés
3ab089c264 Update check-rc-response.py
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-03 23:03:55 +00:00
Cristian Cezar Moisés
d993ab7b48 Update update_newtab.py
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-03 23:02:38 +00:00
Cristian Cezar Moisés
b1103ab227 Update update_ff.py
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-03 23:01:52 +00:00
Cristian Cezar Moisés
2217959242 Update remove-failed-jobs.sh
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-03 23:01:16 +00:00
Cristian Cezar Moisés
d38274acae Update prepare-flatpak-release.py
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-03 23:00:32 +00:00
Cristian Cezar Moisés
08e4b07364 Update download-language-packs.sh
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-03 22:59:38 +00:00
Cristian Cezar Moisés
8c129ab512 Update copy-language-pack.sh
Signed-off-by: Cristian Cezar Moisés <ethicalhacker@riseup.net>
2025-01-03 22:58:18 +00:00
265 changed files with 9050 additions and 7481 deletions

View File

@@ -64,17 +64,3 @@ body:
label: Relevant log output if applicable label: Relevant log output if applicable
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks. description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
render: shell render: shell
- type: textarea
id: support
attributes:
label: Data from about:support if applicable (click on the "Copy text to clipboard" button)
description: Please copy and paste about:support data if you think it might be relevant. This will help us understand your environment.
value: |
<details>
<summary>about:support</summary>
<!-- Please leave one blank line below for enabling the code block rendering. -->
```
Select this line and paste your about:support clipboard
```
</details>

View File

@@ -54,6 +54,42 @@ 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:
runs-on: ubuntu-latest
needs: debug-inputs
steps:
- name: Download aws-cli
run: |
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install --update
- name: Start self-hosted runner
if: ${{ inputs.create_release && inputs.update_branch == 'release' }}
run: |
echo "Starting self-hosted runner"
echo "${{ secrets.SELF_HOSTED_RUNNER_START_SCRIPT }}" | base64 -d > start.sh
sudo chmod +x start.sh
bash ./start.sh
- name: Remove self-hosted runner script
if: always() && ${{ inputs.create_release && inputs.update_branch == 'release' }}
run: |
echo "Removing self-hosted runner script"
rm start.sh || true
check-build-is-correct: check-build-is-correct:
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [debug-inputs] needs: [debug-inputs]
@@ -65,6 +101,7 @@ jobs:
token: ${{ secrets.DEPLOY_KEY }} token: ${{ secrets.DEPLOY_KEY }}
- name: Check if correct branch - name: Check if correct branch
if: ${{ inputs.create_release }}
run: | run: |
echo "Checking if we are on the correct branch" echo "Checking if we are on the correct branch"
git branch git branch
@@ -78,7 +115,7 @@ jobs:
fi fi
if [[ $(git branch --show-current) != $branch ]]; then if [[ $(git branch --show-current) != $branch ]]; then
echo ">>> Branch mismatch" echo ">>> Branch mismatch"
exit 1 # exit 1
else else
echo ">>> Branch matches" echo ">>> Branch matches"
fi fi
@@ -105,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: |
@@ -125,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: |
@@ -155,29 +183,9 @@ jobs:
commit_user_email: zen-browser-auto@users.noreply.github.com commit_user_email: zen-browser-auto@users.noreply.github.com
lint: lint:
runs-on: ubuntu-latest uses: ./.github/workflows/code-linter.yml
needs: [build-data] needs: [build-data]
steps: name: Lint
- 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 pnpm
run: npm install -g pnpm
- name: Install dependencies
run: |
pnpm install
- name: Lint
run: pnpm lint
check-release: check-release:
runs-on: ubuntu-latest runs-on: ubuntu-latest
@@ -194,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: |
@@ -213,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"
@@ -251,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: |
@@ -289,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
@@ -298,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)
@@ -317,11 +307,12 @@ jobs:
permissions: permissions:
contents: write contents: write
secrets: inherit secrets: inherit
needs: [build-data, windows-step-2] 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
@@ -329,10 +320,11 @@ jobs:
permissions: permissions:
contents: write contents: write
secrets: inherit secrets: inherit
needs: [build-data] 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
@@ -340,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 }}
@@ -368,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: |
@@ -386,7 +390,7 @@ jobs:
if [ "${{ inputs.update_branch }}" = "twilight" ]; then if [ "${{ inputs.update_branch }}" = "twilight" ]; then
sed -i -e 's/Name=Zen Browser/Name=Zen Twilight/g' AppDir/zen.desktop sed -i -e 's/Name=Zen Browser/Name=Zen Twilight/g' AppDir/zen.desktop
sed -i -e 's/StartupWMClass=zen-release/StartupWMClass=zen-twilight/g' AppDir/zen.desktop sed -i -e 's/StartupWMClass=zen/StartupWMClass=zen-twilight/g' AppDir/zen.desktop
fi fi
APPDIR=AppDir APPDIR=AppDir
@@ -419,11 +423,36 @@ jobs:
name: zen-${{ matrix.arch }}.AppImage.zsync name: zen-${{ matrix.arch }}.AppImage.zsync
path: ./dist/zen-${{ matrix.arch }}.AppImage.zsync path: ./dist/zen-${{ matrix.arch }}.AppImage.zsync
stop-self-hosted:
runs-on: ubuntu-latest
needs: [windows-step-3, linux]
if: always()
steps:
- name: Download aws-cli
run: |
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install --update
- name: Stop self-hosted runner
if: ${{ inputs.create_release && inputs.update_branch == 'release' }}
run: |
echo "Stopping self-hosted runner"
echo "${{ secrets.SELF_HOSTED_RUNNER_STOP_SCRIPT }}" | base64 -d > stop.sh
sudo chmod +x stop.sh
bash ./stop.sh > /dev/null
- name: Remove self-hosted runner script
if: always() && ${{ inputs.create_release && inputs.update_branch == 'release' }}
run: |
echo "Removing self-hosted runner script"
rm stop.sh || true
release: release:
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] 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' }}
@@ -473,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
@@ -491,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
@@ -503,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
@@ -527,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
@@ -539,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' }}
@@ -590,7 +614,7 @@ jobs:
pwd pwd
ls . ls .
ls .. ls ..
mv releases.xml ./flatpak/io.github.zen_browser.zen.metainfo.xml mv releases.xml ./flatpak/app.zen_browser.zen.metainfo.xml
# output the version to the file # output the version to the file
echo -n ${{ needs.build-data.outputs.version }} > ./flatpak/version echo -n ${{ needs.build-data.outputs.version }} > ./flatpak/version
@@ -616,13 +640,18 @@ jobs:
- name: Checkout Flatpak repository - name: Checkout Flatpak repository
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
repository: flathub/io.github.zen_browser.zen repository: flathub/app.zen_browser.zen
token: ${{ secrets.DEPLOY_KEY }} token: ${{ secrets.DEPLOY_KEY }}
- 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
uses: actions/download-artifact@v4
with:
name: zen.linux-aarch64.tar.xz
- name: Update repository - name: Update repository
uses: actions/checkout@v4 uses: actions/checkout@v4
@@ -644,27 +673,28 @@ 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 \
--output io.github.zen_browser.zen.yml \ --linux-aarch64-archive zen.linux-aarch64.tar.xz \
--output app.zen_browser.zen.yml \
--template-root ./zen-browser/flatpak --template-root ./zen-browser/flatpak
- name: Commit changes - name: Commit changes
run: | run: |
git add io.github.zen_browser.zen.yml git add app.zen_browser.zen.yml
git commit -m "Update to version ${{ needs.build-data.outputs.version }}" git commit -m "Update to version ${{ needs.build-data.outputs.version }}"
- name: Clean up - name: Clean up
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
with: with:
retention-days: 5 retention-days: 5
name: io.github.zen_browser.zen.yml name: app.zen_browser.zen.yml
path: ./io.github.zen_browser.zen.yml path: ./app.zen_browser.zen.yml
- name: Create pull request - name: Create pull request
uses: peter-evans/create-pull-request@v7 uses: peter-evans/create-pull-request@v7

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:
@@ -13,13 +13,9 @@ jobs:
- name: Check out repository - name: Check out repository
uses: actions/checkout@v2 uses: actions/checkout@v2
- name: Fetch JSON Response
run: |
curl -s "https://hg.mozilla.org/releases/mozilla-release/json-tags" > rc-response.json
- name: Check for any updates - name: Check for any updates
env: env:
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }} DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
DISCORD_PING_IDS: ${{ secrets.DISCORD_PING_IDS }} DISCORD_PING_IDS: ${{ secrets.DISCORD_PING_IDS }}
run: | run: |
python3 scripts/check-rc-response.py || true python3 scripts/check_rc_response.py

View File

@@ -5,6 +5,7 @@ on:
branches: branches:
- dev - dev
workflow_dispatch: workflow_dispatch:
workflow_call:
pull_request: pull_request:
branches: branches:
- dev - dev
@@ -23,11 +24,11 @@ jobs:
with: with:
node-version-file: '.nvmrc' node-version-file: '.nvmrc'
- name: Setup pnpm - name: Setup autopep8
run: npm install -g pnpm run: sudo apt install python3-autopep8
- 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,13 +11,17 @@ 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:
permissions: permissions:
contents: write contents: write
# aarch64 does not need full 16x # aarch64 does not need full 16x
runs-on: ${{ (inputs.release-branch == 'release' && matrix.arch == 'x86_64') && 'ubuntu-latest' || 'ubuntu-latest' }} runs-on: ${{ (inputs.release-branch == 'release' && matrix.arch == 'x86_64') && 'self-hosted' || 'ubuntu-latest' }}
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
@@ -51,7 +55,7 @@ jobs:
set -x set -x
sudo apt-get update --fix-missing sudo apt-get update --fix-missing
sudo apt-get update sudo apt-get update
sudo apt-get install -y 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 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
- name: Configure sccache - name: Configure sccache
uses: actions/github-script@v7 uses: actions/github-script@v7
@@ -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

@@ -4,8 +4,7 @@ set -xe
if command -v apt-get &> /dev/null; then if command -v apt-get &> /dev/null; then
sudo add-apt-repository ppa:kisak/kisak-mesa sudo add-apt-repository ppa:kisak/kisak-mesa
sudo apt update sudo apt-get update
sudo apt upgrade
sudo apt-get install -y xvfb libnvidia-egl-wayland1 mesa-utils libgl1-mesa-dri sudo apt-get install -y xvfb libnvidia-egl-wayland1 mesa-utils libgl1-mesa-dri
fi fi
@@ -18,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

15
.github/workflows/staler.yml vendored Normal file
View File

@@ -0,0 +1,15 @@
name: 'Close stale issues and PRs'
on:
schedule:
- cron: '30 1 * * *'
workflow_dispatch:
jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v9
with:
stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
days-before-stale: 65
days-before-close: 10

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,12 +18,16 @@ 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:
name: Build Windows - ${{ matrix.arch }} name: Build Windows - ${{ matrix.arch }}
# aarch64 does not need full 16x, and we also dont use full LTO when generating GPO # aarch64 does not need full 16x, and we also dont use full LTO when generating GPO
runs-on: ${{ (inputs.release-branch == 'release' && !inputs.generate-gpo && matrix.arch == 'x86_64') && 'ubuntu-latest' || 'ubuntu-latest' }} runs-on: ${{ (inputs.release-branch == 'release' && !inputs.generate-gpo && matrix.arch == 'x86_64') && 'self-hosted' || 'ubuntu-latest' }}
strategy: strategy:
fail-fast: false fail-fast: false
@@ -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,14 +59,16 @@ jobs:
- name: Install dependencies - name: Install dependencies
run: | run: |
pnpm install npm install
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:
@@ -89,11 +92,7 @@ jobs:
set -x set -x
mkdir -p ~/win-cross mkdir -p ~/win-cross
cd engine/ cd engine/
echo Setup wine sudo add-apt-repository ppa:savoury1/backports
aria2c "https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/gecko.cache.level-1.toolchains.v3.linux64-wine.latest/artifacts/public%2Fbuild%2Fwine.tar.zst" -o wine.tar.zst
tar --zstd -xvf wine.tar.zst -C ~/win-cross
rm wine.tar.zst
echo Setup Visual Studio
sudo apt-get update sudo apt-get update
sudo apt-get install -y python3-pip autoconf \ sudo apt-get install -y python3-pip autoconf \
autoconf2.13 \ autoconf2.13 \
@@ -134,7 +133,13 @@ jobs:
uuid-dev \ uuid-dev \
wget \ wget \
zip \ zip \
zlib1g-dev zlib1g-dev \
aria2
echo Setup wine
aria2c "https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/gecko.cache.level-1.toolchains.v3.linux64-wine.latest/artifacts/public%2Fbuild%2Fwine.tar.zst" -o wine.tar.zst
tar --zstd -xvf wine.tar.zst -C ~/win-cross
rm wine.tar.zst
echo Setup Visual Studio
./mach python --virtualenv build taskcluster/scripts/misc/get_vs.py build/vs/vs2022.yaml ~/win-cross/vs2022 ./mach python --virtualenv build taskcluster/scripts/misc/get_vs.py build/vs/vs2022.yaml ~/win-cross/vs2022
- name: Bootstrap - name: Bootstrap
@@ -144,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
@@ -177,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') }}
@@ -212,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
@@ -224,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

@@ -4,9 +4,13 @@ engine/
**/*.xhtml **/*.xhtml
**/*.inc.xhtml **/*.inc.xhtml
**/*.bundle.min.js **/*.bundle.min.js
**/*.min.js
**/*.min.mjs
**/*.svg **/*.svg
surfer.json
src/browser/app/profile/*.js src/browser/app/profile/*.js
pnpm-lock.yaml pnpm-lock.yaml
@@ -19,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

@@ -5,7 +5,7 @@ Exec=zen %u
Icon=zen Icon=zen
Type=Application Type=Application
MimeType=text/html;text/xml;application/xhtml+xml;x-scheme-handler/http;x-scheme-handler/https;application/x-xpinstall;application/pdf;application/json; MimeType=text/html;text/xml;application/xhtml+xml;x-scheme-handler/http;x-scheme-handler/https;application/x-xpinstall;application/pdf;application/json;
StartupWMClass=zen-release StartupWMClass=zen
Categories=Network;WebBrowser; Categories=Network;WebBrowser;
StartupNotify=true StartupNotify=true
Terminal=false Terminal=false

View File

@@ -28,8 +28,9 @@
## 🖥️ Compatibility ## 🖥️ Compatibility
Zen is currently built using firefox version `134.0`! 🚀 Zen is currently built using firefox version `135.0`! 🚀
- [`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!
@@ -43,7 +44,7 @@ We keep track of how many issues are closed at the end of the month in [docs/iss
### Versioning ### Versioning
Zen uses [Semantic Versioning](https://semver.org/) for versioning. Meaning, versions are displayed as `a.b-c.d` where: Zen uses [Semantic Versioning](https://semver.org/) for versioning. Meaning, versions are displayed as `a.bc.d` where:
- `a` is the major version - `a` is the major version
- `b` is the minor version - `b` is the minor version
@@ -116,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`
@@ -128,10 +129,11 @@ 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
Thanks everyone for making zen stand out amongs these giants! Thanks everyone for making zen stand out among these giants!
[![Star History Chart](https://api.star-history.com/svg?repos=zen-browser/desktop,chromium/chromium,brave/brave-browser&type=Date)](https://star-history.com/#zen-browser/desktop&chromium/chromium&brave/brave-browser&Date) [![Star History Chart](https://api.star-history.com/svg?repos=zen-browser/desktop,chromium/chromium,brave/brave-browser&type=Date)](https://star-history.com/#zen-browser/desktop&chromium/chromium&brave/brave-browser&Date)

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 201 KiB

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
@@ -59,8 +59,8 @@ if test "$ZEN_RELEASE"; then
# only enable full LTO when ZEN_RELEASE_BRANCH is 'release' # only enable full LTO when ZEN_RELEASE_BRANCH is 'release'
if test "$ZEN_RELEASE_BRANCH" = "release"; then if test "$ZEN_RELEASE_BRANCH" = "release"; then
# TODO: make it "full" once we have the resources to build it # TODO: make it "full" once we have the resources to build it
export MOZ_LTO=cross,thin export MOZ_LTO=cross,full
ac_add_options --enable-lto=cross,thin ac_add_options --enable-lto=cross,full
else else
export MOZ_LTO=cross,thin export MOZ_LTO=cross,thin
ac_add_options --enable-lto=cross,thin ac_add_options --enable-lto=cross,thin

View File

@@ -6,6 +6,11 @@ ac_add_options --enable-eme=widevine
export MOZ_MACBUNDLE_ID=${appId} export MOZ_MACBUNDLE_ID=${appId}
export MOZ_MACBUNDLE_NAME="Zen Browser.app" export MOZ_MACBUNDLE_NAME="Zen Browser.app"
# override LTO settings
# TODO: Dont
export MOZ_LTO=cross,thin
ac_add_options --enable-lto=cross,thin
if test "$ZEN_RELEASE"; then if test "$ZEN_RELEASE"; then
if test "$ZEN_GA_DISABLE_PGO"; then if test "$ZEN_GA_DISABLE_PGO"; then
export ZEN_DUMMY=1 export ZEN_DUMMY=1

View File

@@ -2,13 +2,13 @@
| Metric | Average | Median | 90th percentile | | Metric | Average | Median | 90th percentile |
| --- | --- | --- | ---: | | --- | --- | --- | ---: |
| Time to first response | 2 days, 2:25:52 | 6:06:45 | 4 days, 23:54:11 | | Time to first response | 2 days, 19:29:04 | 6:53:13 | 7 days, 6:58:13 |
| Time to close | 4 days, 10:13:09 | 1 day, 7:06:20 | 11 days, 18:39:59 | | Time to close | 8 days, 4:46:39 | 2 days, 12:37:34 | 31 days, 21:13:40 |
| Metric | Count | | Metric | Count |
| --- | ---: | | --- | ---: |
| Number of items that remain open | 293 | | Number of items that remain open | 251 |
| Number of items closed | 278 | | Number of items closed | 320 |
| Total number of items created | 571 | | Total number of items created | 571 |
| Title | URL | Time to first response | Time to close | | Title | URL | Time to first response | Time to close |
@@ -92,18 +92,18 @@
| Zen doesn't remember entered data on webpages when clicking "go back" button | https://github.com/zen-browser/desktop/issues/3989 | None | None | | Zen doesn't remember entered data on webpages when clicking "go back" button | https://github.com/zen-browser/desktop/issues/3989 | None | None |
| Unexpected text appears when selecting wallpapers and typing. | https://github.com/zen-browser/desktop/issues/3988 | 2 days, 14:37:23 | 2 days, 14:37:23 | | Unexpected text appears when selecting wallpapers and typing. | https://github.com/zen-browser/desktop/issues/3988 | 2 days, 14:37:23 | 2 days, 14:37:23 |
| [BUG] Extension Expands Vertically on Each Usage | https://github.com/zen-browser/desktop/issues/3987 | 0:03:27 | 2 days, 2:35:47 | | [BUG] Extension Expands Vertically on Each Usage | https://github.com/zen-browser/desktop/issues/3987 | 0:03:27 | 2 days, 2:35:47 |
| Pinning (or unpinning) extensions cause toolbar to break in compact mode | https://github.com/zen-browser/desktop/issues/3986 | 8 days, 15:29:08 | None | | Pinning (or unpinning) extensions cause toolbar to break in compact mode | https://github.com/zen-browser/desktop/issues/3986 | 8 days, 15:29:08 | 16 days, 11:39:45 |
| Weird behavior on MacOS when Zen is in fullscreen | https://github.com/zen-browser/desktop/issues/3985 | 0:54:00 | None | | Weird behavior on MacOS when Zen is in fullscreen | https://github.com/zen-browser/desktop/issues/3985 | 0:54:00 | None |
| Title bar buttons on Linux | https://github.com/zen-browser/desktop/issues/3984 | None | None | | Title bar buttons on Linux | https://github.com/zen-browser/desktop/issues/3984 | 18 days, 10:31:55 | 18 days, 10:31:55 |
| Playback Issue After Long Pauses in Videos: Requires Refresh to Fix | https://github.com/zen-browser/desktop/issues/3981 | None | None | | Playback Issue After Long Pauses in Videos: Requires Refresh to Fix | https://github.com/zen-browser/desktop/issues/3981 | None | None |
| Profile button breaks if pressed fast right after pressing workspace | https://github.com/zen-browser/desktop/issues/3980 | None | None | | Profile button breaks if pressed fast right after pressing workspace | https://github.com/zen-browser/desktop/issues/3980 | None | None |
| Single collapsed toolbar doesn't slide out in fullscreen (on Mac) | https://github.com/zen-browser/desktop/issues/3979 | None | None | | Single collapsed toolbar doesn't slide out in fullscreen (on Mac) | https://github.com/zen-browser/desktop/issues/3979 | None | 18 days, 6:00:53 |
| Theme bleeds into websites | https://github.com/zen-browser/desktop/issues/3978 | 0:25:41 | 13:15:26 | | Theme bleeds into websites | https://github.com/zen-browser/desktop/issues/3978 | 0:25:41 | 13:15:26 |
| Laggy Scrolling and UI after updating from 1.0.2-b3 to 1.0.2-b4 and b5 | https://github.com/zen-browser/desktop/issues/3975 | None | 0:35:22 | | Laggy Scrolling and UI after updating from 1.0.2-b3 to 1.0.2-b4 and b5 | https://github.com/zen-browser/desktop/issues/3975 | None | 0:35:22 |
| Clicking on any top application menu bar items triggers vertical tab bar | https://github.com/zen-browser/desktop/issues/3974 | 3 days, 7:31:20 | None | | Clicking on any top application menu bar items triggers vertical tab bar | https://github.com/zen-browser/desktop/issues/3974 | 3 days, 7:31:20 | None |
| Toolbar icons not centered properly on macOS | https://github.com/zen-browser/desktop/issues/3973 | 15:40:09 | 6 days, 2:04:51 | | Toolbar icons not centered properly on macOS | https://github.com/zen-browser/desktop/issues/3973 | 15:40:09 | 6 days, 2:04:51 |
| Essentials change container after a restart. | https://github.com/zen-browser/desktop/issues/3972 | None | None | | Essentials change container after a restart. | https://github.com/zen-browser/desktop/issues/3972 | None | None |
| pinning too many extensions causes toolbar to break | https://github.com/zen-browser/desktop/issues/3971 | None | None | | pinning too many extensions causes toolbar to break | https://github.com/zen-browser/desktop/issues/3971 | 18 days, 23:40:54 | 18 days, 23:40:54 |
| New centered omnibox loses focus in the middle of composing characters in Korean IME | https://github.com/zen-browser/desktop/issues/3970 | None | None | | New centered omnibox loses focus in the middle of composing characters in Korean IME | https://github.com/zen-browser/desktop/issues/3970 | None | None |
| default theme does not apply correctly | https://github.com/zen-browser/desktop/issues/3969 | None | None | | default theme does not apply correctly | https://github.com/zen-browser/desktop/issues/3969 | None | None |
| Pick element from page shortcuts not working | https://github.com/zen-browser/desktop/issues/3968 | 2 days, 9:57:49 | 8 days, 1:57:55 | | Pick element from page shortcuts not working | https://github.com/zen-browser/desktop/issues/3968 | 2 days, 9:57:49 | 8 days, 1:57:55 |
@@ -115,12 +115,12 @@
| Compact mode hides the wrong bar | https://github.com/zen-browser/desktop/issues/3957 | None | None | | Compact mode hides the wrong bar | https://github.com/zen-browser/desktop/issues/3957 | None | None |
| Sidebar doesn't hide sometimes. | https://github.com/zen-browser/desktop/issues/3956 | 1 day, 17:09:53 | None | | Sidebar doesn't hide sometimes. | https://github.com/zen-browser/desktop/issues/3956 | 1 day, 17:09:53 | None |
| when an extension is used, the shrinked URL bar is inaccessible [new layout issue] | https://github.com/zen-browser/desktop/issues/3954 | None | None | | when an extension is used, the shrinked URL bar is inaccessible [new layout issue] | https://github.com/zen-browser/desktop/issues/3954 | None | None |
| Error: File browser/extensions/moz.build does not exist | https://github.com/zen-browser/desktop/issues/3951 | 4:03:32 | None | | Error: File browser/extensions/moz.build does not exist | https://github.com/zen-browser/desktop/issues/3951 | 4:03:32 | 20 days, 4:52:42 |
| Address Bar is off-center (MacOS) | https://github.com/zen-browser/desktop/issues/3950 | 2:38:16 | 2:56:46 | | Address Bar is off-center (MacOS) | https://github.com/zen-browser/desktop/issues/3950 | 2:38:16 | 2:56:46 |
| Previous setting not retained after clicking on "cancel" button on "Tab unloader" | https://github.com/zen-browser/desktop/issues/3948 | None | None | | Previous setting not retained after clicking on "cancel" button on "Tab unloader" | https://github.com/zen-browser/desktop/issues/3948 | None | None |
| Broken design when "Tab unloader" setting is saved | https://github.com/zen-browser/desktop/issues/3947 | None | None | | Broken design when "Tab unloader" setting is saved | https://github.com/zen-browser/desktop/issues/3947 | None | None |
| Zen Browser Udemy Issue | https://github.com/zen-browser/desktop/issues/3942 | 0:38:14 | 19:55:04 | | Zen Browser Udemy Issue | https://github.com/zen-browser/desktop/issues/3942 | 0:38:14 | 19:55:04 |
| Zen crashes when try to access chrome://browser/content/browser.xhtml | https://github.com/zen-browser/desktop/issues/3941 | 8:25:55 | None | | Zen crashes when trying to access chrome://browser/content/browser.xhtml | https://github.com/zen-browser/desktop/issues/3941 | 8:25:55 | None |
| Move tab to other window when compact mode sidebar | https://github.com/zen-browser/desktop/issues/3940 | 1 day, 20:46:00 | 22:23:33 | | Move tab to other window when compact mode sidebar | https://github.com/zen-browser/desktop/issues/3940 | 1 day, 20:46:00 | 22:23:33 |
| Opening a new instance of Zen changes position of Essentials | https://github.com/zen-browser/desktop/issues/3939 | None | None | | Opening a new instance of Zen changes position of Essentials | https://github.com/zen-browser/desktop/issues/3939 | None | None |
| browser scrolling sensitivity unnecessary | https://github.com/zen-browser/desktop/issues/3938 | 23:04:47 | 23:04:47 | | browser scrolling sensitivity unnecessary | https://github.com/zen-browser/desktop/issues/3938 | 23:04:47 | 23:04:47 |
@@ -157,7 +157,7 @@
| Default shortcut for "Copy current URL" overridden by element inspector | https://github.com/zen-browser/desktop/issues/3894 | 0:04:46 | 0:32:12 | | Default shortcut for "Copy current URL" overridden by element inspector | https://github.com/zen-browser/desktop/issues/3894 | 0:04:46 | 0:32:12 |
| Default Firefox Window Control buttons used instead of custom Zen icons | https://github.com/zen-browser/desktop/issues/3893 | 0:18:50 | 11 days, 18:08:37 | | Default Firefox Window Control buttons used instead of custom Zen icons | https://github.com/zen-browser/desktop/issues/3893 | 0:18:50 | 11 days, 18:08:37 |
| Flightradar24 has botched information when hovering an airport | https://github.com/zen-browser/desktop/issues/3892 | None | 7:23:49 | | Flightradar24 has botched information when hovering an airport | https://github.com/zen-browser/desktop/issues/3892 | None | 7:23:49 |
| Crash when playing videos | https://github.com/zen-browser/desktop/issues/3891 | 16 days, 23:26:14 | None | | Crash when playing videos | https://github.com/zen-browser/desktop/issues/3891 | 16 days, 23:26:14 | 19 days, 2:14:52 |
| Sidebar goes black | https://github.com/zen-browser/desktop/issues/3890 | 2:18:33 | None | | Sidebar goes black | https://github.com/zen-browser/desktop/issues/3890 | 2:18:33 | None |
| Dark theme not respected | https://github.com/zen-browser/desktop/issues/3889 | 10:06:12 | None | | Dark theme not respected | https://github.com/zen-browser/desktop/issues/3889 | 10:06:12 | None |
| Mod default preferences not displayed correctly until reopening the settings page or browser restart | https://github.com/zen-browser/desktop/issues/3887 | 15 days, 6:11:30 | 16 days, 2:04:56 | | Mod default preferences not displayed correctly until reopening the settings page or browser restart | https://github.com/zen-browser/desktop/issues/3887 | 15 days, 6:11:30 | 16 days, 2:04:56 |
@@ -170,7 +170,7 @@
| Unable to change user profile when compact mode is on | https://github.com/zen-browser/desktop/issues/3879 | 1 day, 5:44:54 | 1 day, 5:44:54 | | Unable to change user profile when compact mode is on | https://github.com/zen-browser/desktop/issues/3879 | 1 day, 5:44:54 | 1 day, 5:44:54 |
| profile change error from last update | https://github.com/zen-browser/desktop/issues/3877 | 0:44:21 | None | | profile change error from last update | https://github.com/zen-browser/desktop/issues/3877 | 0:44:21 | None |
| Back and Forward buttons are still flipping | https://github.com/zen-browser/desktop/issues/3876 | 6:53:13 | 8 days, 16:43:46 | | Back and Forward buttons are still flipping | https://github.com/zen-browser/desktop/issues/3876 | 6:53:13 | 8 days, 16:43:46 |
| Incorrect characters shown for Option+Cmd keyboard shortcuts | https://github.com/zen-browser/desktop/issues/3874 | None | None | | Incorrect characters shown for Option+Cmd keyboard shortcuts | https://github.com/zen-browser/desktop/issues/3874 | 25 days, 11:48:12 | 25 days, 11:48:12 |
| YouTube mini player bug. | https://github.com/zen-browser/desktop/issues/3872 | 5:48:23 | 9 days, 22:48:33 | | YouTube mini player bug. | https://github.com/zen-browser/desktop/issues/3872 | 5:48:23 | 9 days, 22:48:33 |
| Even after closing the tabs I heard the audio and I can't able to stop it | https://github.com/zen-browser/desktop/issues/3871 | None | None | | Even after closing the tabs I heard the audio and I can't able to stop it | https://github.com/zen-browser/desktop/issues/3871 | None | None |
| Close pinned tabs using mouse middle-click not working | https://github.com/zen-browser/desktop/issues/3870 | 2 days, 20:03:49 | None | | Close pinned tabs using mouse middle-click not working | https://github.com/zen-browser/desktop/issues/3870 | 2 days, 20:03:49 | None |
@@ -195,7 +195,7 @@
| Udemy stopped working | https://github.com/zen-browser/desktop/issues/3843 | 2:23:45 | 11:49:34 | | Udemy stopped working | https://github.com/zen-browser/desktop/issues/3843 | 2:23:45 | 11:49:34 |
| URL Bar Overflow | https://github.com/zen-browser/desktop/issues/3842 | 10:58:10 | 19:32:36 | | URL Bar Overflow | https://github.com/zen-browser/desktop/issues/3842 | 10:58:10 | 19:32:36 |
| Moving the sidebar to the right brings back the Top Bar | https://github.com/zen-browser/desktop/issues/3840 | 1 day, 7:39:22 | 4 days, 9:06:05 | | Moving the sidebar to the right brings back the Top Bar | https://github.com/zen-browser/desktop/issues/3840 | 1 day, 7:39:22 | 4 days, 9:06:05 |
| Essential tabs get reset after browser restart | https://github.com/zen-browser/desktop/issues/3839 | None | None | | Essential tabs get reset after browser restart | https://github.com/zen-browser/desktop/issues/3839 | None | 22 days, 14:43:39 |
| After removing Zen mods, some settings from the extension remain active in the browser | https://github.com/zen-browser/desktop/issues/3837 | 0:06:12 | 10 days, 23:20:01 | | After removing Zen mods, some settings from the extension remain active in the browser | https://github.com/zen-browser/desktop/issues/3837 | 0:06:12 | 10 days, 23:20:01 |
| Cannot run dev build 133.0.3 | https://github.com/zen-browser/desktop/issues/3836 | None | 0:23:06 | | Cannot run dev build 133.0.3 | https://github.com/zen-browser/desktop/issues/3836 | None | 0:23:06 |
| Why Zen creating this folder itself on starting? | https://github.com/zen-browser/desktop/issues/3835 | 0:37:11 | 2:47:03 | | Why Zen creating this folder itself on starting? | https://github.com/zen-browser/desktop/issues/3835 | 0:37:11 | 2:47:03 |
@@ -350,7 +350,7 @@
| window control buttons (close, minimize, maximize) have been moved to the sidebar | https://github.com/zen-browser/desktop/issues/3640 | None | None | | window control buttons (close, minimize, maximize) have been moved to the sidebar | https://github.com/zen-browser/desktop/issues/3640 | None | None |
| High frequency of clicking on web links that do not load correctly | https://github.com/zen-browser/desktop/issues/3639 | None | None | | High frequency of clicking on web links that do not load correctly | https://github.com/zen-browser/desktop/issues/3639 | None | None |
| Problems for href, text, and button. | https://github.com/zen-browser/desktop/issues/3638 | None | None | | Problems for href, text, and button. | https://github.com/zen-browser/desktop/issues/3638 | None | None |
| When you visit light theme website with dark mode its not looking correct | https://github.com/zen-browser/desktop/issues/3637 | 0:34:46 | None | | When you visit light theme website with dark mode its not looking correct | https://github.com/zen-browser/desktop/issues/3637 | 0:34:46 | 31 days, 2:38:59 |
| "Remove from history" in URL bar doesn't remove history, unfocuses URL bar | https://github.com/zen-browser/desktop/issues/3635 | None | None | | "Remove from history" in URL bar doesn't remove history, unfocuses URL bar | https://github.com/zen-browser/desktop/issues/3635 | None | None |
| when sidebar on right and collapsed it blocks close window button on windows | https://github.com/zen-browser/desktop/issues/3634 | None | 0:09:46 | | when sidebar on right and collapsed it blocks close window button on windows | https://github.com/zen-browser/desktop/issues/3634 | None | 0:09:46 |
| Bug when searching in Korean. | https://github.com/zen-browser/desktop/issues/3633 | 2:13:54 | None | | Bug when searching in Korean. | https://github.com/zen-browser/desktop/issues/3633 | 2:13:54 | None |
@@ -365,7 +365,7 @@
| PLEASE Respect XDG User Paths | https://github.com/zen-browser/desktop/issues/3619 | 2:06:38 | 2:06:38 | | PLEASE Respect XDG User Paths | https://github.com/zen-browser/desktop/issues/3619 | 2:06:38 | 2:06:38 |
| "do-nothing" links keep opening newtabs | https://github.com/zen-browser/desktop/issues/3618 | None | None | | "do-nothing" links keep opening newtabs | https://github.com/zen-browser/desktop/issues/3618 | None | None |
| Url suggestion container is not in right place. | https://github.com/zen-browser/desktop/issues/3617 | 8:00:08 | None | | Url suggestion container is not in right place. | https://github.com/zen-browser/desktop/issues/3617 | 8:00:08 | None |
| Zen side panel showing behind the browser | https://github.com/zen-browser/desktop/issues/3616 | None | None | | Zen side panel showing behind the browser | https://github.com/zen-browser/desktop/issues/3616 | None | 27 days, 1:16:57 |
| Horrible experience on touchpad when switch workspace using gesture | https://github.com/zen-browser/desktop/issues/3615 | None | None | | Horrible experience on touchpad when switch workspace using gesture | https://github.com/zen-browser/desktop/issues/3615 | None | None |
| The current multi toolbars mode UI on macOS has some serious flaws | https://github.com/zen-browser/desktop/issues/3614 | None | None | | The current multi toolbars mode UI on macOS has some serious flaws | https://github.com/zen-browser/desktop/issues/3614 | None | None |
| `urlbar-background` alpha is too low | https://github.com/zen-browser/desktop/issues/3613 | 1:47:36 | 16 days, 14:24:53 | | `urlbar-background` alpha is too low | https://github.com/zen-browser/desktop/issues/3613 | 1:47:36 | 16 days, 14:24:53 |
@@ -396,7 +396,7 @@
| Clicking search results in new floating URL doesn't openlinks | https://github.com/zen-browser/desktop/issues/3581 | 0:05:21 | 5:08:59 | | Clicking search results in new floating URL doesn't openlinks | https://github.com/zen-browser/desktop/issues/3581 | 0:05:21 | 5:08:59 |
| "Private Browsing" text doesn't fit in collapsed sidebar. Also, it's shown on the window twice. | https://github.com/zen-browser/desktop/issues/3580 | 1:40:14 | 1 day, 4:46:49 | | "Private Browsing" text doesn't fit in collapsed sidebar. Also, it's shown on the window twice. | https://github.com/zen-browser/desktop/issues/3580 | 1:40:14 | 1 day, 4:46:49 |
| User Change Error | https://github.com/zen-browser/desktop/issues/3579 | 1:12:55 | 1 day, 23:09:27 | | User Change Error | https://github.com/zen-browser/desktop/issues/3579 | 1:12:55 | 1 day, 23:09:27 |
| Linux &#124; Wayland icon instead of normal Zen one on taskbar | https://github.com/zen-browser/desktop/issues/3578 | 3:26:58 | None | | Linux &#124; Wayland icon instead of normal Zen one on taskbar | https://github.com/zen-browser/desktop/issues/3578 | 3:26:58 | 31 days, 22:22:17 |
| Browser freezes when playing videos, does not work. Video plays intermittently during video playback. Browser functions do not work. | https://github.com/zen-browser/desktop/issues/3577 | None | None | | Browser freezes when playing videos, does not work. Video plays intermittently during video playback. Browser functions do not work. | https://github.com/zen-browser/desktop/issues/3577 | None | None |
| Buttons Overlapping one another | https://github.com/zen-browser/desktop/issues/3576 | None | None | | Buttons Overlapping one another | https://github.com/zen-browser/desktop/issues/3576 | None | None |
| Search Engine Selector has no icon size limit | https://github.com/zen-browser/desktop/issues/3575 | None | 17 days, 4:58:24 | | Search Engine Selector has no icon size limit | https://github.com/zen-browser/desktop/issues/3575 | None | 17 days, 4:58:24 |
@@ -409,7 +409,7 @@
| How to put the search bar in its place? | https://github.com/zen-browser/desktop/issues/3567 | 0:08:37 | 10 days, 10:16:58 | | How to put the search bar in its place? | https://github.com/zen-browser/desktop/issues/3567 | 0:08:37 | 10 days, 10:16:58 |
| UI Disappeared - circumnstances unclear | https://github.com/zen-browser/desktop/issues/3566 | 2:24:11 | None | | UI Disappeared - circumnstances unclear | https://github.com/zen-browser/desktop/issues/3566 | 2:24:11 | None |
| Pinned side panel and main content area have different borders/box shadows | https://github.com/zen-browser/desktop/issues/3565 | None | None | | Pinned side panel and main content area have different borders/box shadows | https://github.com/zen-browser/desktop/issues/3565 | None | None |
| Mouse back button occasionally fails to go back a page, tries switching workspaces instead | https://github.com/zen-browser/desktop/issues/3564 | None | None | | Mouse back button occasionally fails to go back a page, tries switching workspaces instead | https://github.com/zen-browser/desktop/issues/3564 | 32 days, 2:15:31 | None |
| Weird Spacing In Sidebar | https://github.com/zen-browser/desktop/issues/3563 | 0:59:49 | None | | Weird Spacing In Sidebar | https://github.com/zen-browser/desktop/issues/3563 | 0:59:49 | None |
| Browser view padding | https://github.com/zen-browser/desktop/issues/3562 | 1:58:05 | None | | Browser view padding | https://github.com/zen-browser/desktop/issues/3562 | 1:58:05 | None |
| Changing mod string preferences sometimes results in missing characters | https://github.com/zen-browser/desktop/issues/3558 | None | 24 days, 6:15:07 | | Changing mod string preferences sometimes results in missing characters | https://github.com/zen-browser/desktop/issues/3558 | None | 24 days, 6:15:07 |
@@ -431,15 +431,15 @@
| Font rendering broken when scaling PDFs | https://github.com/zen-browser/desktop/issues/3537 | 1:05:51 | 12:46:07 | | Font rendering broken when scaling PDFs | https://github.com/zen-browser/desktop/issues/3537 | 1:05:51 | 12:46:07 |
| corner rounding around padding doesnt work in maximized window on some websites | https://github.com/zen-browser/desktop/issues/3535 | 0:26:58 | None | | corner rounding around padding doesnt work in maximized window on some websites | https://github.com/zen-browser/desktop/issues/3535 | 0:26:58 | None |
| Close, Minimize and Fullscreen buttons not showing up in single titlebar mode | https://github.com/zen-browser/desktop/issues/3534 | 10 days, 9:25:03 | 11 days, 8:37:40 | | Close, Minimize and Fullscreen buttons not showing up in single titlebar mode | https://github.com/zen-browser/desktop/issues/3534 | 10 days, 9:25:03 | 11 days, 8:37:40 |
| Weird Bar in new Tab | https://github.com/zen-browser/desktop/issues/3533 | 3:59:44 | None | | Weird Bar in new Tab | https://github.com/zen-browser/desktop/issues/3533 | 3:59:44 | 31 days, 20:17:31 |
| Address bar goes down, cursor gets in the way while typing | https://github.com/zen-browser/desktop/issues/3531 | 2:35:20 | None | | Address bar goes down, cursor gets in the way while typing | https://github.com/zen-browser/desktop/issues/3531 | 2:35:20 | 32 days, 14:13:28 |
| Workspace switcher in place of url bar | https://github.com/zen-browser/desktop/issues/3529 | None | None | | Workspace switcher in place of url bar | https://github.com/zen-browser/desktop/issues/3529 | None | None |
| Corners appear unrounded when CSS backdrop blur filter used on website | https://github.com/zen-browser/desktop/issues/3528 | None | None | | Corners appear unrounded when CSS backdrop blur filter used on website | https://github.com/zen-browser/desktop/issues/3528 | None | None |
| Transparency only works in troubleshooting mode | https://github.com/zen-browser/desktop/issues/3527 | None | 1:28:25 | | Transparency only works in troubleshooting mode | https://github.com/zen-browser/desktop/issues/3527 | None | 1:28:25 |
| Settings in 'Customize Toolbar' section do not affect Toolbar in 1.0.2b0 | https://github.com/zen-browser/desktop/issues/3526 | None | 1:25:14 | | Settings in 'Customize Toolbar' section do not affect Toolbar in 1.0.2b0 | https://github.com/zen-browser/desktop/issues/3526 | None | 1:25:14 |
| Bug: Floating URL Bar Disappears When Using Chinese Input Method | https://github.com/zen-browser/desktop/issues/3525 | 8:42:05 | 9:42:10 | | Bug: Floating URL Bar Disappears When Using Chinese Input Method | https://github.com/zen-browser/desktop/issues/3525 | 8:42:05 | 9:42:10 |
| The URL text is not selected when clicked | https://github.com/zen-browser/desktop/issues/3524 | 2:05:53 | None | | The URL text is not selected when clicked | https://github.com/zen-browser/desktop/issues/3524 | 2:05:53 | None |
| Toolbar Customization is broken | https://github.com/zen-browser/desktop/issues/3523 | 6:54:42 | None | | Toolbar Customization is broken | https://github.com/zen-browser/desktop/issues/3523 | 6:54:42 | 32 days, 16:54:39 |
| Expandable Vertical Tabs No Longer Available as of 1.0.2-b.0 | https://github.com/zen-browser/desktop/issues/3522 | 1:38:01 | 4 days, 11:05:00 | | Expandable Vertical Tabs No Longer Available as of 1.0.2-b.0 | https://github.com/zen-browser/desktop/issues/3522 | 1:38:01 | 4 days, 11:05:00 |
| When typing on the URL bar the bar itself moves | https://github.com/zen-browser/desktop/issues/3521 | 12:41:11 | None | | When typing on the URL bar the bar itself moves | https://github.com/zen-browser/desktop/issues/3521 | 12:41:11 | None |
| App icon on the task bar disappears when personalizing toolbar seting the title bar visible | https://github.com/zen-browser/desktop/issues/3517 | None | None | | App icon on the task bar disappears when personalizing toolbar seting the title bar visible | https://github.com/zen-browser/desktop/issues/3517 | None | None |
@@ -497,7 +497,7 @@
| Sidebar icons spilling over | https://github.com/zen-browser/desktop/issues/3447 | None | 23:54:49 | | Sidebar icons spilling over | https://github.com/zen-browser/desktop/issues/3447 | None | 23:54:49 |
| Default Browser issue | https://github.com/zen-browser/desktop/issues/3445 | 4 days, 15:34:03 | None | | Default Browser issue | https://github.com/zen-browser/desktop/issues/3445 | 4 days, 15:34:03 | None |
| Bookmarks don't get fully deleted from places.sqlite | https://github.com/zen-browser/desktop/issues/3444 | None | None | | Bookmarks don't get fully deleted from places.sqlite | https://github.com/zen-browser/desktop/issues/3444 | None | None |
| When Workspaces are enabled browser.tabs.closeWindowWithLastTab set to true does not work (macOS) | https://github.com/zen-browser/desktop/issues/3443 | None | None | | When Workspaces are enabled browser.tabs.closeWindowWithLastTab set to true does not work (macOS) | https://github.com/zen-browser/desktop/issues/3443 | 32 days, 16:41:09 | None |
| Logging on Google does not prompt security key popup to login | https://github.com/zen-browser/desktop/issues/3442 | 11:20:10 | 21 days, 12:51:05 | | Logging on Google does not prompt security key popup to login | https://github.com/zen-browser/desktop/issues/3442 | 11:20:10 | 21 days, 12:51:05 |
| Zen breaks when all keybinds are assigned to "not set" | https://github.com/zen-browser/desktop/issues/3441 | 7 days, 8:26:47 | 25 days, 14:43:17 | | Zen breaks when all keybinds are assigned to "not set" | https://github.com/zen-browser/desktop/issues/3441 | 7 days, 8:26:47 | 25 days, 14:43:17 |
| After the new twilight update "Toggle Sidebar's Width" hotkey is not there | https://github.com/zen-browser/desktop/issues/3440 | 5 days, 19:37:46 | 6 days, 16:41:34 | | After the new twilight update "Toggle Sidebar's Width" hotkey is not there | https://github.com/zen-browser/desktop/issues/3440 | 5 days, 19:37:46 | 6 days, 16:41:34 |
@@ -517,9 +517,9 @@
| The side bar keeps appearing when navigating tabs in split mode in compact mode | https://github.com/zen-browser/desktop/issues/3422 | None | 9 days, 7:10:57 | | The side bar keeps appearing when navigating tabs in split mode in compact mode | https://github.com/zen-browser/desktop/issues/3422 | None | 9 days, 7:10:57 |
| Windows 98 titlebar appears sometimes when i try to open a PDF. | https://github.com/zen-browser/desktop/issues/3421 | None | None | | Windows 98 titlebar appears sometimes when i try to open a PDF. | https://github.com/zen-browser/desktop/issues/3421 | None | None |
| Welcome Page Color Theme Selection Bug: Double-Click Required | https://github.com/zen-browser/desktop/issues/3420 | None | 20 days, 14:37:58 | | Welcome Page Color Theme Selection Bug: Double-Click Required | https://github.com/zen-browser/desktop/issues/3420 | None | 20 days, 14:37:58 |
| Glance does not work with links inside iframes or shadow roots | https://github.com/zen-browser/desktop/issues/3419 | None | None | | Glance does not work with links inside iframes or shadow roots | https://github.com/zen-browser/desktop/issues/3419 | None | 31 days, 21:06:02 |
| Choose app dialog window not listing any apps except Zen itself | https://github.com/zen-browser/desktop/issues/3418 | None | None | | Choose app dialog window not listing any apps except Zen itself | https://github.com/zen-browser/desktop/issues/3418 | None | None |
| No privacy | https://github.com/zen-browser/desktop/issues/3417 | None | None | | No privacy | https://github.com/zen-browser/desktop/issues/3417 | None | 36 days, 15:12:07 |
| The page goes black, and upon attempting to reload, nothing is displayed | https://github.com/zen-browser/desktop/issues/3413 | None | None | | The page goes black, and upon attempting to reload, nothing is displayed | https://github.com/zen-browser/desktop/issues/3413 | None | None |
| Can't move the cursor with arrows from my keyboard when i'm in a field | https://github.com/zen-browser/desktop/issues/3412 | 27 days, 22:13:16 | 30 days, 20:23:42 | | Can't move the cursor with arrows from my keyboard when i'm in a field | https://github.com/zen-browser/desktop/issues/3412 | 27 days, 22:13:16 | 30 days, 20:23:42 |
| Essentials and pinned tabs still don't retain favicons after reset | https://github.com/zen-browser/desktop/issues/3411 | None | 4 days, 6:01:13 | | Essentials and pinned tabs still don't retain favicons after reset | https://github.com/zen-browser/desktop/issues/3411 | None | 4 days, 6:01:13 |
@@ -527,62 +527,62 @@
| Rounded corners & fluorescent RGB-style lighting around the perimeter on full screen Youtube. Goes away in Private window? | https://github.com/zen-browser/desktop/issues/3409 | None | 0:06:16 | | Rounded corners & fluorescent RGB-style lighting around the perimeter on full screen Youtube. Goes away in Private window? | https://github.com/zen-browser/desktop/issues/3409 | None | 0:06:16 |
| 1.0.1-a.22 is vunarable to few CVEs from ff 132 | https://github.com/zen-browser/desktop/issues/3408 | 2 days, 5:08:58 | 4 days, 17:50:02 | | 1.0.1-a.22 is vunarable to few CVEs from ff 132 | https://github.com/zen-browser/desktop/issues/3408 | 2 days, 5:08:58 | 4 days, 17:50:02 |
| search bar 'jump' to sidebar when in compact mode in twilight | https://github.com/zen-browser/desktop/issues/3406 | 0:05:11 | 3 days, 20:58:06 | | search bar 'jump' to sidebar when in compact mode in twilight | https://github.com/zen-browser/desktop/issues/3406 | 0:05:11 | 3 days, 20:58:06 |
| When I fast forward or rewind a video, video's sound level changes on YouTube. | https://github.com/zen-browser/desktop/issues/3405 | None | None | | When I fast forward or rewind a video, video's sound level changes on YouTube. | https://github.com/zen-browser/desktop/issues/3405 | None | 37 days, 19:38:52 |
| Sidebar section spacing inconsistent | https://github.com/zen-browser/desktop/issues/3404 | None | None | | Sidebar section spacing inconsistent | https://github.com/zen-browser/desktop/issues/3404 | None | 37 days, 19:54:01 |
| Essentials not loading pages correctly | https://github.com/zen-browser/desktop/issues/3403 | 1 day, 0:09:34 | None | | Essentials not loading pages correctly | https://github.com/zen-browser/desktop/issues/3403 | 1 day, 0:09:34 | 32 days, 20:29:06 |
| Windows Defender positive: Redirector.GPAY!MTB | https://github.com/zen-browser/desktop/issues/3402 | 12 days, 1:10:39 | 12 days, 1:22:56 | | Windows Defender positive: Redirector.GPAY!MTB | https://github.com/zen-browser/desktop/issues/3402 | 12 days, 1:10:39 | 12 days, 1:22:56 |
| `npm run build` failed | https://github.com/zen-browser/desktop/issues/3401 | None | None | | `npm run build` failed | https://github.com/zen-browser/desktop/issues/3401 | None | None |
| New URL in sidebar layout makes browser unusable | https://github.com/zen-browser/desktop/issues/3400 | 3 days, 16:54:29 | 4 days, 2:15:00 | | New URL in sidebar layout makes browser unusable | https://github.com/zen-browser/desktop/issues/3400 | 3 days, 16:54:29 | 4 days, 2:15:00 |
| CSS not loading or something | https://github.com/zen-browser/desktop/issues/3399 | None | None | | CSS not loading or something | https://github.com/zen-browser/desktop/issues/3399 | 32 days, 2:15:05 | 32 days, 2:15:05 |
| Unnecessary empty space in tab | https://github.com/zen-browser/desktop/issues/3398 | None | 31 days, 12:18:50 | | Unnecessary empty space in tab | https://github.com/zen-browser/desktop/issues/3398 | None | 31 days, 12:18:50 |
| The window control buttons are duplicated on top of each other | https://github.com/zen-browser/desktop/issues/3395 | 2:08:07 | 3 days, 20:39:23 | | The window control buttons are duplicated on top of each other | https://github.com/zen-browser/desktop/issues/3395 | 2:08:07 | 3 days, 20:39:23 |
| Customizing Toolbar | https://github.com/zen-browser/desktop/issues/3394 | 28 days, 20:55:35 | 28 days, 20:55:35 | | Customizing Toolbar | https://github.com/zen-browser/desktop/issues/3394 | 28 days, 20:55:35 | 28 days, 20:55:35 |
| Keyboard shortcuts not resetting to default values | https://github.com/zen-browser/desktop/issues/3390 | None | 30 days, 21:31:32 | | Keyboard shortcuts not resetting to default values | https://github.com/zen-browser/desktop/issues/3390 | None | 30 days, 21:31:32 |
| Possible Memory Leak - Zen won't leave the Taskbar after hours of use | https://github.com/zen-browser/desktop/issues/3389 | None | None | | Possible Memory Leak - Zen won't leave the Taskbar after hours of use | https://github.com/zen-browser/desktop/issues/3389 | None | 37 days, 17:44:30 |
| Can't switch to Tab. Possibly because Tab has a modal dialog. | https://github.com/zen-browser/desktop/issues/3386 | 1 day, 3:55:33 | None | | Can't switch to Tab. Possibly because Tab has a modal dialog. | https://github.com/zen-browser/desktop/issues/3386 | 1 day, 3:55:33 | 35 days, 23:59:29 |
| The option to hide autofill from the browser does not work with iCloud passwords | https://github.com/zen-browser/desktop/issues/3384 | None | None | | The option to hide autofill from the browser does not work with iCloud passwords | https://github.com/zen-browser/desktop/issues/3384 | None | 37 days, 23:42:50 |
| Per window expansion of sidebar. | https://github.com/zen-browser/desktop/issues/3383 | None | None | | Per window expansion of sidebar. | https://github.com/zen-browser/desktop/issues/3383 | 34 days, 8:07:53 | None |
| Some extensions do not trigger on webpage load (but do work on FF) | https://github.com/zen-browser/desktop/issues/3382 | None | None | | Some extensions do not trigger on webpage load (but do work on FF) | https://github.com/zen-browser/desktop/issues/3382 | None | 38 days, 0:22:39 |
| Scrollwheel not working | https://github.com/zen-browser/desktop/issues/3380 | None | None | | Scrollwheel not working | https://github.com/zen-browser/desktop/issues/3380 | None | None |
| SideBar Compact mode bug | https://github.com/zen-browser/desktop/issues/3379 | None | None | | SideBar Compact mode bug | https://github.com/zen-browser/desktop/issues/3379 | None | 38 days, 2:46:44 |
| Joining Microsoft Teams call crashes browser tabs | https://github.com/zen-browser/desktop/issues/3378 | 11 days, 22:11:35 | None | | Joining Microsoft Teams call crashes browser tabs | https://github.com/zen-browser/desktop/issues/3378 | 11 days, 22:11:35 | None |
| can not quit browser by ctrl + q | https://github.com/zen-browser/desktop/issues/3377 | 2 days, 8:01:56 | None | | can not quit browser by ctrl + q | https://github.com/zen-browser/desktop/issues/3377 | 2 days, 8:01:56 | None |
| RIME input method cannot input information | https://github.com/zen-browser/desktop/issues/3374 | None | None | | RIME input method cannot input information | https://github.com/zen-browser/desktop/issues/3374 | None | 38 days, 9:36:51 |
| Workspace behaves badly when switching between them with touchpad | https://github.com/zen-browser/desktop/issues/3373 | None | None | | Workspace behaves badly when switching between them with touchpad | https://github.com/zen-browser/desktop/issues/3373 | None | None |
| the z-index of both compact modes are messed up | https://github.com/zen-browser/desktop/issues/3371 | None | None | | the z-index of both compact modes are messed up | https://github.com/zen-browser/desktop/issues/3371 | None | 37 days, 16:11:05 |
| Open/close sidebar icon is confusing | https://github.com/zen-browser/desktop/issues/3370 | None | None | | Open/close sidebar icon is confusing | https://github.com/zen-browser/desktop/issues/3370 | None | None |
| Tab Management - Workspaces - Display workspaces as an icon strip bug | https://github.com/zen-browser/desktop/issues/3369 | None | None | | Tab Management - Workspaces - Display workspaces as an icon strip bug | https://github.com/zen-browser/desktop/issues/3369 | None | 37 days, 16:55:24 |
| Google meet not loading | https://github.com/zen-browser/desktop/issues/3368 | 16:55:47 | None | | Google meet not loading | https://github.com/zen-browser/desktop/issues/3368 | 16:55:47 | 38 days, 16:59:55 |
| Workspace icon highlight on hover is uneven | https://github.com/zen-browser/desktop/issues/3367 | 30 days, 0:55:16 | 30 days, 0:55:16 | | Workspace icon highlight on hover is uneven | https://github.com/zen-browser/desktop/issues/3367 | 30 days, 0:55:16 | 30 days, 0:55:16 |
| The main UI's background doesn't follow the theme sometimes | https://github.com/zen-browser/desktop/issues/3366 | None | None | | The main UI's background doesn't follow the theme sometimes | https://github.com/zen-browser/desktop/issues/3366 | None | 37 days, 19:55:37 |
| Shortcut Settings Typo | https://github.com/zen-browser/desktop/issues/3365 | None | None | | Shortcut Settings Typo | https://github.com/zen-browser/desktop/issues/3365 | 34 days, 13:56:04 | 34 days, 16:38:11 |
| Video image freezes when we move the progress video bar, and only the audio is playing | https://github.com/zen-browser/desktop/issues/3363 | 31 days, 7:22:57 | None | | Video image freezes when we move the progress video bar, and only the audio is playing | https://github.com/zen-browser/desktop/issues/3363 | 31 days, 7:22:57 | None |
| ClickTrades Webpage not loading | https://github.com/zen-browser/desktop/issues/3362 | None | None | | ClickTrades Webpage not loading | https://github.com/zen-browser/desktop/issues/3362 | None | 38 days, 0:31:43 |
| When switch workspaces, the current-focused tab sometimes also show in the new workspace | https://github.com/zen-browser/desktop/issues/3357 | 3:34:51 | 9 days, 17:41:38 | | When switch workspaces, the current-focused tab sometimes also show in the new workspace | https://github.com/zen-browser/desktop/issues/3357 | 3:34:51 | 9 days, 17:41:38 |
| Toggle Floating Sidebar keyboard shortcut not working | https://github.com/zen-browser/desktop/issues/3356 | 6 days, 13:00:18 | None | | Toggle Floating Sidebar keyboard shortcut not working | https://github.com/zen-browser/desktop/issues/3356 | 6 days, 13:00:18 | None |
| Workspace icon still shows on compact mode even when flag is disabled. | https://github.com/zen-browser/desktop/issues/3355 | 20 days, 3:42:54 | 20 days, 3:42:39 | | Workspace icon still shows on compact mode even when flag is disabled. | https://github.com/zen-browser/desktop/issues/3355 | 20 days, 3:42:54 | 20 days, 3:42:39 |
| Moving tab across workspace and then right-clicking on it does not render a menu | https://github.com/zen-browser/desktop/issues/3353 | 2 days, 14:33:51 | 18 days, 16:47:56 | | Moving tab across workspace and then right-clicking on it does not render a menu | https://github.com/zen-browser/desktop/issues/3353 | 2 days, 14:33:51 | 18 days, 16:47:56 |
| Glance in compact view opens tabs bar | https://github.com/zen-browser/desktop/issues/3351 | 31 days, 13:55:54 | 33 days, 15:15:20 | | Glance in compact view opens tabs bar | https://github.com/zen-browser/desktop/issues/3351 | 31 days, 13:55:54 | 33 days, 15:15:20 |
| Dev Tools Context Menus Broken | https://github.com/zen-browser/desktop/issues/3350 | None | None | | Dev Tools Context Menus Broken | https://github.com/zen-browser/desktop/issues/3350 | None | 38 days, 15:57:10 |
| Stuck in toolbar customizing mode | https://github.com/zen-browser/desktop/issues/3349 | None | None | | Stuck in toolbar customizing mode | https://github.com/zen-browser/desktop/issues/3349 | None | 37 days, 16:08:33 |
| Top Bar Padding Increasing in Compact Mode (Twilight) | https://github.com/zen-browser/desktop/issues/3348 | 9:32:10 | 6 days, 22:39:00 | | Top Bar Padding Increasing in Compact Mode (Twilight) | https://github.com/zen-browser/desktop/issues/3348 | 9:32:10 | 6 days, 22:39:00 |
| Not using QUIC/http3 | https://github.com/zen-browser/desktop/issues/3346 | None | None | | Not using QUIC/http3 | https://github.com/zen-browser/desktop/issues/3346 | None | 37 days, 22:07:48 |
| Unable to go to zen-browser.app when using zen-browser, i can go to the website using other browsers | https://github.com/zen-browser/desktop/issues/3345 | None | None | | Unable to go to zen-browser.app when using zen-browser, i can go to the website using other browsers | https://github.com/zen-browser/desktop/issues/3345 | None | 39 days, 23:44:19 |
| UI Error | https://github.com/zen-browser/desktop/issues/3342 | None | None | | UI Error | https://github.com/zen-browser/desktop/issues/3342 | None | 38 days, 1:42:45 |
| Zen Mod - Sorting issue | https://github.com/zen-browser/desktop/issues/3341 | None | None | | Zen Mod - Sorting issue | https://github.com/zen-browser/desktop/issues/3341 | 36 days, 18:11:48 | 36 days, 18:11:48 |
| YouTube Viewport Issue | https://github.com/zen-browser/desktop/issues/3340 | None | 19:39:03 | | YouTube Viewport Issue | https://github.com/zen-browser/desktop/issues/3340 | None | 19:39:03 |
| Discord capcha and Cloudflare turnstile cannot verify human access | https://github.com/zen-browser/desktop/issues/3339 | None | None | | Discord capcha and Cloudflare turnstile cannot verify human access | https://github.com/zen-browser/desktop/issues/3339 | None | 38 days, 13:52:12 |
| `null` in toolbar won't disappear | https://github.com/zen-browser/desktop/issues/3337 | 12:31:11 | 10 days, 11:19:00 | | `null` in toolbar won't disappear | https://github.com/zen-browser/desktop/issues/3337 | 12:31:11 | 10 days, 11:19:00 |
| Zen Browser Unusable and Stuck on Zen Logo After Changing Keyboard Shortcuts (Issue Across Multiple Platforms) | https://github.com/zen-browser/desktop/issues/3335 | 31 days, 15:12:01 | None | | Zen Browser Unusable and Stuck on Zen Logo After Changing Keyboard Shortcuts (Issue Across Multiple Platforms) | https://github.com/zen-browser/desktop/issues/3335 | 31 days, 15:12:01 | None |
| Slight translation error for Swedish | https://github.com/zen-browser/desktop/issues/3334 | None | None | | Slight translation error for Swedish | https://github.com/zen-browser/desktop/issues/3334 | None | None |
| GIVE ME SOMETHING TO GRAB ONTO SO I CAN DRAG WINDOWS AROUND!!! | https://github.com/zen-browser/desktop/issues/3333 | 1:31:36 | None | | GIVE ME SOMETHING TO GRAB ONTO SO I CAN DRAG WINDOWS AROUND!!! | https://github.com/zen-browser/desktop/issues/3333 | 1:31:36 | 41 days, 20:29:07 |
| GsConnect Not working | https://github.com/zen-browser/desktop/issues/3332 | 2:36:46 | 4:34:49 | | GsConnect Not working | https://github.com/zen-browser/desktop/issues/3332 | 2:36:46 | 4:34:49 |
| Fullscreening a tab still has borders on the right and bottom of the browser. | https://github.com/zen-browser/desktop/issues/3331 | None | 1:22:12 | | Fullscreening a tab still has borders on the right and bottom of the browser. | https://github.com/zen-browser/desktop/issues/3331 | None | 1:22:12 |
| Drag-and-Drop Feature | https://github.com/zen-browser/desktop/issues/3329 | 3:02:05 | None | | Drag-and-Drop Feature | https://github.com/zen-browser/desktop/issues/3329 | 3:02:05 | None |
| Unresponsive or crashing when different profile is opened | https://github.com/zen-browser/desktop/issues/3327 | None | None | | Unresponsive or crashing when different profile is opened | https://github.com/zen-browser/desktop/issues/3327 | None | 38 days, 11:27:50 |
| Some issues with sync between multiple windows | https://github.com/zen-browser/desktop/issues/3326 | None | 32 days, 4:09:34 | | Some issues with sync between multiple windows | https://github.com/zen-browser/desktop/issues/3326 | None | 32 days, 4:09:34 |
| Google Sign in Stuck | https://github.com/zen-browser/desktop/issues/3325 | None | 10 days, 1:50:46 | | Google Sign in Stuck | https://github.com/zen-browser/desktop/issues/3325 | None | 10 days, 1:50:46 |
| SSL reporting as Unknown Issuer when using a valid certificate | https://github.com/zen-browser/desktop/issues/3324 | None | None | | SSL reporting as Unknown Issuer when using a valid certificate | https://github.com/zen-browser/desktop/issues/3324 | None | 38 days, 12:53:11 |
| Google Classroom acting funky | https://github.com/zen-browser/desktop/issues/3323 | 13:22:38 | 17:26:18 | | Google Classroom acting funky | https://github.com/zen-browser/desktop/issues/3323 | 13:22:38 | 17:26:18 |
_This report was generated with the [Issue Metrics Action](https://github.com/github/issue-metrics)_ _This report was generated with the [Issue Metrics Action](https://github.com/github/issue-metrics)_

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

@@ -1,4 +1,4 @@
app-id: io.github.zen_browser.zen app-id: app.zen_browser.zen
runtime: org.freedesktop.Platform runtime: org.freedesktop.Platform
runtime-version: '24.08' runtime-version: '24.08'
sdk: org.freedesktop.Sdk sdk: org.freedesktop.Sdk
@@ -28,7 +28,7 @@ finish-args:
- --system-talk-name=org.freedesktop.NetworkManager - --system-talk-name=org.freedesktop.NetworkManager
- --talk-name=org.a11y.Bus - --talk-name=org.a11y.Bus
- --env=GTK_PATH=/app/lib/gtkmodules - --env=GTK_PATH=/app/lib/gtkmodules
- --env=MESA_SHADER_CACHE_DIR=$XDG_RUNTIME_DIR/app/$FLATPAK_ID/cache/mesa_shader_cache_db - --env=MESA_SHADER_CACHE_DIR=$XDG_RUNTIME_DIR/app/$FLATPAK_ID/cache/mesa_shader_cache_db
modules: modules:
- name: zen_browser - name: zen_browser
buildsystem: simple buildsystem: simple
@@ -38,15 +38,24 @@ modules:
- install -Dm0755 metadata/launch-script.sh ${{FLATPAK_DEST}}/bin/launch-script.sh - install -Dm0755 metadata/launch-script.sh ${{FLATPAK_DEST}}/bin/launch-script.sh
- install -Dm0644 metadata/policies.json ${{FLATPAK_DEST}}/bin/distribution/policies.json - install -Dm0644 metadata/policies.json ${{FLATPAK_DEST}}/bin/distribution/policies.json
- install -Dm0644 metadata/icons/io.github.zen_browser.zen.svg ${{FLATPAK_DEST}}/share/icons/hicolor/scalable/apps/${{FLATPAK_ID}}.svg - install -Dm0644 metadata/icons/${{FLATPAK_ID}}.svg ${{FLATPAK_DEST}}/share/icons/hicolor/scalable/apps/${{FLATPAK_ID}}.svg
- install -Dm0644 metadata/io.github.zen_browser.zen.metainfo.xml ${{FLATPAK_DEST}}/share/metainfo/${{FLATPAK_ID}}.metainfo.xml - install -Dm0644 metadata/${{FLATPAK_ID}}.metainfo.xml ${{FLATPAK_DEST}}/share/metainfo/${{FLATPAK_ID}}.metainfo.xml
- install -Dm0644 metadata/io.github.zen_browser.zen.desktop ${{FLATPAK_DEST}}/share/applications/${{FLATPAK_ID}}.desktop - install -Dm0644 metadata/${{FLATPAK_ID}}.desktop ${{FLATPAK_DEST}}/share/applications/${{FLATPAK_ID}}.desktop
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:
- x86_64
- type: archive
url: https://github.com/zen-browser/desktop/releases/download/{version}/zen.linux-aarch64.tar.xz
sha256: {linux_aarch64_sha256}
strip-components: 0
only-arches:
- 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

2
l10n

Submodule l10n updated: 1abc46f17d...fb2f27225e

4544
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -11,15 +11,20 @@
"start": "cd engine && ./mach run --noprofile", "start": "cd engine && ./mach run --noprofile",
"import": "surfer import", "import": "surfer import",
"export": "surfer export", "export": "surfer export",
"init": "npm run bootstrap && npm run import", "init": "npm run download && npm run bootstrap && npm run import",
"bootstrap": "surfer download && surfer bootstrap", "download": "surfer download",
"bootstrap": "surfer bootstrap && surfer bootstrap",
"package": "surfer package", "package": "surfer package",
"update-ff": "python3 scripts/update_ff.py", "update-ff": "python3 scripts/update_ff.py",
"update-ff:raw": "surfer update", "update-ff:raw": "surfer update",
"update-newtab": "python3 scripts/update_newtab.py", "update-newtab": "python3 scripts/update_newtab.py",
"pretty": "prettier . --write", "update-ff:rc": "python3 scripts/update_ff.py --rc",
"lint": "npx prettier . --check", "update-ff:l10n": "python3 scripts/update_ff.py --just-l10n",
"prepare": "husky" "pretty": "prettier . --write && autopep8 -r --in-place scripts/ src/",
"lint": "npx prettier . --check && autopep8 --diff scripts/ src/",
"prepare": "husky",
"reset-ff": "surfer reset",
"surfer": "surfer"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@@ -36,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",

1927
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

5
pyproject.toml Normal file
View File

@@ -0,0 +1,5 @@
[tool.autopep8]
max_line_length = 120
recursive = true
aggressive = 3
indent_size = 2

7
requirements.txt Normal file
View File

@@ -0,0 +1,7 @@
autopep8==2.3.1
click==8.1.8
mypy-extensions==1.0.0
packaging==24.2
pathspec==0.12.1
platformdirs==4.3.6
pycodestyle==2.12.1

View File

@@ -1,63 +0,0 @@
import json
import sys
import os
import requests
RESPONSE = 'rc-response.json'
METADATA = 'surfer.json'
def get_current_version():
with open(METADATA) as f:
metadata = json.load(f)
return metadata['version']['candidate']
def get_rc_response():
with open(RESPONSE) as f:
data = json.load(f)
for tag_dict in data['tags']:
tag = tag_dict['tag']
is_valid_tag = (tag.startswith('FIREFOX') and tag.endswith('_BUILD1')
and not 'ESR' in tag and not 'b' in tag)
if is_valid_tag:
return tag.replace('FIREFOX_', '').replace('_BUILD1', '').replace('_', '.')
return None
def get_pings():
pings = ""
for ping in os.getenv('DISCORD_PING_IDS').split(','):
pings += "<@%s> " % ping
return pings
def send_webhook(rc: str):
text = "||%s|| New Firefox RC version is available: **%s**" % (get_pings(), rc)
webhook_url = os.getenv('DISCORD_WEBHOOK_URL') #os.getenv('DISCORD_WEBHOOK_URL')
message = {
"content": text,
"username": "Firefox RC Checker",
"avatar_url": "https://avatars.githubusercontent.com/u/189789277?v=4",
}
response = requests.post(webhook_url, json=message)
if response.status_code == 204:
print("Message sent successfully!")
else:
print(f"Failed to send message: {response.status_code}")
def main():
current = get_current_version()
if not current:
print('Could not find current version')
return 1
rc = get_rc_response()
if not rc:
print('Could not find RC version')
return 1
if current != rc:
print('Current version is %s, but RC version is %s' % (current, rc))
# Here, we should update the current version in surfer.json
send_webhook(rc)
return 0
print('Current version is %s, and RC version is %s' % (current, rc))
return 1
if __name__ == '__main__':
sys.exit(main())

View File

@@ -0,0 +1,92 @@
import json
import os
import sys
import requests
from typing import Optional
METADATA_FILENAME = "surfer.json"
TAGS_API_URL = "https://hg.mozilla.org/releases/mozilla-release/json-tags"
def get_current_version() -> Optional[str]:
"""Retrieve the current version from the metadata file."""
try:
with open(METADATA_FILENAME) as f:
metadata = json.load(f)
return metadata["version"]["candidate"]
except (FileNotFoundError, json.JSONDecodeError) as e:
print(f"Error reading current version: {e}")
return None
def get_repo_data() -> Optional[str]:
"""Retrieve the repository data from the API."""
try:
print(f"Retrieving repository data from {TAGS_API_URL}")
response = requests.get(TAGS_API_URL)
response.raise_for_status() # Raise an error for bad responses
return response.json()
except requests.RequestException as e:
print(f"Error retrieving repository data: {e}")
return None
def get_rc_response() -> Optional[str]:
"""Get the release candidate response from the response file."""
try:
data = get_repo_data()
for tag_dict in data["tags"]:
tag = tag_dict["tag"]
if (tag.startswith("FIREFOX") and tag.endswith("_BUILD1")
and "ESR" not in tag and "b" not in tag):
return (tag.replace("FIREFOX_", "").replace("_BUILD1",
"").replace("_", "."))
except (FileNotFoundError, json.JSONDecodeError) as e:
print(f"Error reading RC response: {e}")
return None
def get_pings() -> str:
"""Build a string of Discord user IDs for mentions."""
ping_ids = os.getenv("DISCORD_PING_IDS", "")
return " ".join(f"<@{ping.strip()}>" for ping in ping_ids.split(",")
if ping.strip())
def send_webhook(rc: str) -> None:
"""Send a message to the Discord webhook."""
text = f"||{get_pings()}|| New Firefox RC version is available: **{rc}**"
webhook_url = os.getenv("DISCORD_WEBHOOK_URL")
if webhook_url:
message = {
"content": text,
"username": "Firefox RC Checker",
}
try:
response = requests.post(webhook_url, json=message)
response.raise_for_status() # Raise an error for bad responses
except requests.RequestException as e:
print(f"Error sending webhook: {e}")
else:
print("Webhook URL not set.")
def rc_should_be_updated(rc_response: str, current_version: str) -> bool:
return rc_response and rc_response != current_version
def main() -> int:
current_version = get_current_version()
rc_response = get_rc_response()
if rc_should_be_updated(rc_response, current_version):
send_webhook(rc_response)
return 0
print(f"Current version: {current_version}, RC version: {rc_response}")
return 0
if __name__ == "__main__":
sys.exit(main())

View File

@@ -1,18 +0,0 @@
browser_locales=engine/browser/locales
copy_browser_locales() {
langId=$1
mkdir -p $browser_locales/$langId
if [ "$langId" = "en-US" ]; then
find $browser_locales/$langId -type f -name "zen*" -delete
rsync -av --exclude=.git ./l10n/en-US/browser/ $browser_locales/$langId/
return
fi
rm -rf $browser_locales/$langId/
# TODO: Copy the rest of the l10n directories to their respective locations
rsync -av --exclude=.git ./l10n/$langId/ $browser_locales/$langId/
}
LANG=$1
echo "Copying language pack for $LANG"
copy_browser_locales $LANG

View File

@@ -0,0 +1,78 @@
import os
import shutil
import sys
# Define the path for browser locales
BROWSER_LOCALES = "engine/browser/locales"
def copy_browser_locales(lang_id: str):
"""
Copies language pack files to the specified browser locale directory.
:param lang_id: Language identifier (e.g., 'en-US', 'fr', etc.)
"""
lang_path = os.path.join(BROWSER_LOCALES, lang_id)
# Create the directory for the language pack if it doesn't exist
os.makedirs(lang_path, exist_ok=True)
print(f"Creating directory: {lang_path}")
# If the language is 'en-US', handle special processing
if lang_id == "en-US":
# Remove files starting with "zen" in the 'en-US' directory
for root, _, files in os.walk(lang_path):
for file in files:
if file.startswith("zen"):
os.remove(os.path.join(root, file))
# Copy files from the source directory
source_path = "./l10n/en-US/browser/"
copy_files(source_path, lang_path)
return
# For other languages, delete the existing directory and copy files anew
if os.path.exists(lang_path):
shutil.rmtree(lang_path) # Remove existing directory
source_path = f"./l10n/{lang_id}/"
copy_files(source_path, lang_path)
def copy_files(source: str, destination: str):
"""
Copies files and directories from the source to the destination.
:param source: Source directory path
:param destination: Destination directory path
"""
if not os.path.exists(source):
raise FileNotFoundError(f"Source path '{source}' does not exist.")
# Recursively copy all files and directories
for root, dirs, files in os.walk(source):
# Determine relative path to preserve directory structure
relative_path = os.path.relpath(root, source)
destination_root = os.path.join(destination, relative_path)
os.makedirs(destination_root, exist_ok=True)
# Copy files
for file in files:
src_file = os.path.join(root, file)
dest_file = os.path.join(destination_root, file)
print(f"\tCopying {src_file} to {dest_file}")
shutil.copy2(src_file, dest_file) # Copy file with metadata
if __name__ == "__main__":
if len(sys.argv) != 2:
print("Usage: python script.py <LANG>")
sys.exit(1)
lang = sys.argv[1]
print(f"Copying language pack for {lang}")
try:
copy_browser_locales(lang)
except Exception as e:
print(f"Error: {e}")
sys.exit(1)

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() {
@@ -31,9 +37,9 @@ cd $CURRENT_DIR
# Move all the files to the correct location # Move all the files to the correct location
sh scripts/copy-language-pack.sh en-US python3 scripts/copy_language_pack.py en-US
for lang in $(cat ./l10n/supported-languages); do for lang in $(cat ./l10n/supported-languages); do
sh scripts/copy-language-pack.sh $lang python3 scripts/copy_language_pack.py $lang
done done
wait wait

View File

@@ -1,52 +1,75 @@
import hashlib import hashlib
import argparse import argparse
import sys import sys
import os
FLATID = "io.github.zen_browser.zen" FLATID = "app.zen_browser.zen"
def get_sha256sum(filename):
"""Calculate the SHA256 checksum of a file.""" def get_sha256sum(filename):
sha256 = hashlib.sha256() """Calculate the SHA256 checksum of a file."""
sha256 = hashlib.sha256()
try:
with open(filename, "rb") as f: with open(filename, "rb") as f:
for byte_block in iter(lambda: f.read(4096), b""): for byte_block in iter(lambda: f.read(4096), b""):
sha256.update(byte_block) sha256.update(byte_block)
return sha256.hexdigest() except FileNotFoundError:
print(f"File {filename} not found.")
sys.exit(1)
return sha256.hexdigest()
def build_template(template, linux_sha256, flatpak_sha256, version, linux_aarch64_sha256):
"""Build the template with the provided hashes and version."""
print(f"Building template with version {version}")
print(f"\tLinux archive sha256: {linux_sha256}")
print(f"\tLinux aarch64 archive sha256: {linux_aarch64_sha256}")
print(f"\tFlatpak archive sha256: {flatpak_sha256}")
return template.format(linux_sha256=linux_sha256,
flatpak_sha256=flatpak_sha256,
version=version,
linux_aarch64_sha256=linux_aarch64_sha256)
def build_template(template, linux_sha256, flatpak_sha256, version):
print(f"Building template with version {version}")
print(f"\tLinux archive sha256: {linux_sha256}")
print(f"\tFlatpak archive sha256: {flatpak_sha256}")
return template.format(linux_sha256=linux_sha256,
flatpak_sha256=flatpak_sha256,
version=version)
def get_template(template_root): def get_template(template_root):
file = f"{template_root}/{FLATID}.yml.template" """Get the template content from the specified root directory."""
print(f"Reading template {file}") file = os.path.join(template_root, f"{FLATID}.yml.template")
try: print(f"Reading template {file}")
with open(file, "r") as f: try:
return f.read() with open(file, "r") as f:
except FileNotFoundError: return f.read()
print(f"Template {file} not found") except FileNotFoundError:
sys.exit(1) print(f"Template {file} not found.")
sys.exit(1)
def main(): def main():
parser = argparse.ArgumentParser(description='Prepare flatpak release') """Main function to parse arguments and process files."""
parser.add_argument('--version', help='Version of the release', required=True) parser = argparse.ArgumentParser(description="Prepare flatpak release")
parser.add_argument('--linux-archive', help='Linux archive', required=True) parser.add_argument("--version",
parser.add_argument('--flatpak-archive', help='Flatpak archive', required=True) help="Version of the release",
parser.add_argument('--output', help='Output file', default=f"{FLATID}.yml") required=True)
parser.add_argument('--template-root', help='Template root', default="flatpak") parser.add_argument("--linux-archive", help="Linux archive", required=True)
args = parser.parse_args() parser.add_argument("--linux-aarch64-archive", help="Linux aarch64 archive", required=True)
parser.add_argument("--flatpak-archive",
help="Flatpak archive",
required=True)
parser.add_argument("--output", help="Output file", default=f"{FLATID}.yml")
parser.add_argument("--template-root",
help="Template root",
default="flatpak")
args = parser.parse_args()
linux_sha256 = get_sha256sum(args.linux_archive) linux_sha256 = get_sha256sum(args.linux_archive)
flatpak_sha256 = get_sha256sum(args.flatpak_archive) linux_aarch64_sha256 = get_sha256sum(args.linux_aarch64_archive)
template = build_template(get_template(args.template_root), linux_sha256, flatpak_sha256, args.version) flatpak_sha256 = get_sha256sum(args.flatpak_archive)
template = build_template(get_template(args.template_root), linux_sha256,
flatpak_sha256, args.version, linux_aarch64_sha256)
print(f"Writing output to {args.output}")
with open(args.output, "w") as f:
f.write(template)
print(f"Writing output to {args.output}")
with open(args.output, "w") as f:
f.write(template)
if __name__ == "__main__": if __name__ == "__main__":
main() main()

View File

@@ -1,5 +1,7 @@
#!/bin/bash
gh_bulk_delete_workflow_runs() { gh_bulk_delete_workflow_runs() {
repo=$1 local repo=$1
# Ensure the repo argument is provided # Ensure the repo argument is provided
if [[ -z "$repo" ]]; then if [[ -z "$repo" ]]; then
@@ -7,14 +9,37 @@ gh_bulk_delete_workflow_runs() {
return 1 return 1
fi fi
runs=$(gh api repos/$repo/actions/runs --paginate | jq -r '.workflow_runs[] | select(.conclusion == "cancelled" or .conclusion == "failure" or .conclusion == "timed_out") | .id') # Fetch workflow runs that are cancelled, failed, or timed out
local runs
runs=$(gh api repos/$repo/actions/runs --paginate \
| jq -r '.workflow_runs[] |
select(.conclusion == "cancelled" or
.conclusion == "failure" or
.conclusion == "timed_out") |
.id')
if [[ -z "$runs" ]]; then
echo "No workflow runs found for $repo with the specified conclusions."
return 0
fi
# Loop through each run and delete it
while IFS= read -r run; do while IFS= read -r run; do
echo "Deleting run https://github.com/$repo/actions/runs/$run" echo "Attempting to delete run: https://github.com/$repo/actions/runs/$run"
gh api -X DELETE repos/$repo/actions/runs/$run --silent
# Perform the deletion
if gh api -X DELETE repos/$repo/actions/runs/$run --silent; then
echo "Successfully deleted run: $run"
else
echo "Error deleting run: $run" >&2
fi
# Optional delay to avoid hitting API rate limits
sleep 1
done <<< "$runs" done <<< "$runs"
echo "All workflow runs for $repo have been deleted." echo "Completed deletion process for workflow runs in $repo."
} }
gh_bulk_delete_workflow_runs $1 # Execute the function with the provided argument
gh_bulk_delete_workflow_runs "$1"

View File

@@ -1 +0,0 @@
sh ./scripts/copy-language-pack.sh en-US

View File

@@ -0,0 +1,4 @@
from copy_language_pack import copy_browser_locales
if __name__ == "__main__":
copy_browser_locales("en-US")

View File

@@ -1,37 +1,97 @@
import os import os
import json import json
import argparse
import shutil
last_version = "0.0.0" from check_rc_response import get_rc_response, rc_should_be_updated
new_version = "0.0.0"
def update_ff():
os.system("npm run update-ff:raw")
def get_version_before(): def update_rc(last_version: str):
global last_version rc_version = get_rc_response()
with open("surfer.json", "r") as f: if rc_should_be_updated(rc_version, last_version):
data = json.load(f) print(f"New Firefox RC version is available: {rc_version}")
last_version = data["version"]["version"] print("Removing engine directory and updating surfer.json.")
if os.path.exists("engine"):
shutil.rmtree("engine")
with open("surfer.json", "r") as f:
data = json.load(f)
with open("surfer.json", "w") as f:
data["version"]["candidate"] = rc_version
json.dump(data, f, indent=2)
print("Download the new engine by running 'npm run download'.")
os.system("npm run download")
else:
print("No new Firefox RC version available.")
def get_version_after():
global new_version
with open("surfer.json", "r") as f:
data = json.load(f)
new_version = data["version"]["version"]
def update_readme(): def update_ff(is_rc: bool = False, last_version: str = ""):
global last_version """Runs the npm command to update the 'ff' component."""
global new_version if is_rc:
with open("README.md", "r") as f: return update_rc(last_version)
data = f.read() result = os.system("npm run update-ff:raw")
data = data.replace(last_version, new_version) if result != 0:
with open("README.md", "w") as f: raise RuntimeError("Failed to update 'ff' component.")
f.write(data)
def get_version_from_file(filename, is_rc):
"""Retrieves the version from the specified JSON file."""
try:
with open(filename, "r") as f:
data = json.load(f)
return data["version"]["version"] if not is_rc else data["version"]["candidate"]
except (FileNotFoundError, json.JSONDecodeError) as e:
raise RuntimeError(f"Error reading version from {filename}: {e}")
def update_readme(last_version, new_version, is_rc=False):
"""Updates the README.md file to reflect the new version."""
prefix = "RC " if is_rc else "`"
try:
with open("README.md", "r") as f:
data = f.read()
updated_data = data.replace(prefix + last_version, prefix + new_version)
with open("README.md", "w") as f:
f.write(updated_data)
except FileNotFoundError as 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():
"""Main function to update versions and README."""
arg_parser = argparse.ArgumentParser()
arg_parser.add_argument(
"--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()
try:
if not args.just_l10n:
last_version = get_version_from_file("surfer.json", args.rc)
update_ff(args.rc, last_version)
new_version = get_version_from_file("surfer.json", args.rc)
update_readme(last_version, new_version, args.rc)
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:
print(f"An error occurred: {e}")
if __name__ == "__main__": if __name__ == "__main__":
get_version_before() main()
update_ff()
get_version_after()
update_readme()
print("Updated from version {} to version {}".format(last_version, new_version))

View File

@@ -1,9 +1,41 @@
import os import os
import subprocess
import logging
# Set up logging
logging.basicConfig(level=logging.INFO)
# Constants for paths
NEW_TAB_DIR = "./engine/browser/components/newtab"
ENGINE_DIR = "./engine"
NPM_INSTALL_COMMANDS = ["npm install", "npm install meow@9.0.0"]
BUNDLE_COMMAND = "npm run bundle --prefix=browser/components/newtab"
def install_dependencies():
"""Install necessary npm packages for the newtab component."""
for command in NPM_INSTALL_COMMANDS:
logging.info(f"Running command: {command} in {NEW_TAB_DIR}")
subprocess.run(command.split(), cwd=NEW_TAB_DIR, check=True)
def bundle_newtab_components():
"""Bundle the newtab components."""
logging.info(f"Bundling newtab components in {ENGINE_DIR}")
subprocess.run(BUNDLE_COMMAND.split(), cwd=ENGINE_DIR, check=True)
def update_newtab(init: bool = True): def update_newtab(init: bool = True):
if init: """Update the newtab components, optionally initializing dependencies."""
os.system("(cd ./engine/browser/components/newtab && ../../../mach npm install && ../../../mach npm install meow@9.0.0)") try:
os.system("cd ./engine && ./mach npm run bundle --prefix=browser/components/newtab") if init:
install_dependencies()
bundle_newtab_components()
except subprocess.CalledProcessError as e:
logging.error(f"An error occurred: {e}")
raise
if __name__ == "__main__": if __name__ == "__main__":
update_newtab(False) update_newtab(init=False)

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);
@@ -61,6 +59,7 @@ pref('pdfjs.enableHighlightFloatingButton', true);
pref("alerts.showFavicons", true); pref("alerts.showFavicons", true);
// Toolbars // Toolbars
pref("browser.tabs.closeWindowWithLastTab", false);
pref("browser.tabs.loadBookmarksInTabs", false); pref("browser.tabs.loadBookmarksInTabs", false);
pref('browser.toolbars.bookmarks.visibility', 'never'); pref('browser.toolbars.bookmarks.visibility', 'never');
pref("browser.bookmarks.openInTabClosesMenu", false); pref("browser.bookmarks.openInTabClosesMenu", false);
@@ -85,10 +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', 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);
@@ -103,7 +103,7 @@ pref('zen.rice.share.notice.accepted', false);
pref('zen.theme.border-radius', 10); // In pixels pref('zen.theme.border-radius', 10); // In pixels
#else #else
#ifdef XP_WIN #ifdef XP_WIN
pref('zen.theme.border-radius', 6); // In pixels pref('zen.theme.border-radius', 12); // In pixels
#else #else
pref('zen.theme.border-radius', 8); // In pixels pref('zen.theme.border-radius', 8); // In pixels
#endif #endif
@@ -113,7 +113,6 @@ pref('zen.theme.color-prefs.use-workspace-colors', true);
pref('zen.theme.color-prefs.amoled', false); pref('zen.theme.color-prefs.amoled', false);
pref('zen.theme.color-prefs.colorful', false); pref('zen.theme.color-prefs.colorful', false);
pref('zen.view.compact', 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);
pref('zen.view.compact.toolbar-flash-popup', true); pref('zen.view.compact.toolbar-flash-popup', true);
@@ -123,6 +122,7 @@ 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
#ifdef XP_MACOSX #ifdef XP_MACOSX
@@ -132,14 +132,18 @@ pref('zen.view.experimental-rounded-view', false);
pref('zen.view.experimental-rounded-view', true); pref('zen.view.experimental-rounded-view', true);
#endif #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);
@@ -165,14 +169,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.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', '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\"]}");
@@ -196,16 +201,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);

View File

@@ -1,16 +1,19 @@
import { AppConstants } from 'resource://gre/modules/AppConstants.sys.mjs';
export var ZenCustomizableUI = new (class { 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: ['zen-sidepanel-button'], defaultPlacements: [],
defaultCollapsed: null, defaultCollapsed: null,
overflowable: true,
}, },
true true
); );
@@ -32,6 +35,16 @@ export var ZenCustomizableUI = new (class {
} }
_addSidebarButtons(window) { _addSidebarButtons(window) {
const toolbox = window.document.getElementById('navigator-toolbox');
// Set a splitter to navigator-toolbox
const splitter = window.document.createXULElement('splitter');
splitter.setAttribute('id', 'zen-sidebar-splitter');
splitter.setAttribute('orient', 'horizontal');
splitter.setAttribute('resizebefore', 'sibling');
splitter.setAttribute('resizeafter', 'none');
toolbox.insertAdjacentElement('afterend', splitter);
const sidebarBox = window.MozXULElement.parseXULToFragment(` const sidebarBox = window.MozXULElement.parseXULToFragment(`
<toolbar id="zen-sidebar-top-buttons" <toolbar id="zen-sidebar-top-buttons"
fullscreentoolbar="true" fullscreentoolbar="true"
@@ -43,25 +56,37 @@ export var ZenCustomizableUI = new (class {
flex="1" flex="1"
skipintoolbarset="true" skipintoolbarset="true"
customizationtarget="zen-sidebar-top-buttons-customization-target" customizationtarget="zen-sidebar-top-buttons-customization-target"
overflowable="true"
default-overflowbutton="nav-bar-overflow-button"
default-overflowtarget="widget-overflow-list"
default-overflowpanel="widget-overflow"
addon-webext-overflowbutton="unified-extensions-button"
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">
<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> <html:div id="zen-sidebar-top-buttons-separator" skipintoolbarset="true" overflows="false"></html:div>
<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>
</hbox> </hbox>
</toolbar> </toolbar>
`); `);
window.document.getElementById('navigator-toolbox').prepend(sidebarBox); toolbox.prepend(sidebarBox);
new window.MutationObserver((e) => {
if (e[0].type !== 'attributes' || e[0].attributeName !== 'width') return;
this._dispatchResizeEvent(window);
}).observe(toolbox, {
attributes: true, //configure it to listen to attribute changes
});
// remove all styles except for the width, since we are xulstoring the complet style list
const width = toolbox.style.width || '180px';
toolbox.removeAttribute('style');
toolbox.style.width = width;
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');
} }
@@ -93,8 +118,19 @@ export var ZenCustomizableUI = new (class {
} }
} }
_dispatchResizeEvent(window) {
window.dispatchEvent(new window.Event('resize'));
}
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

@@ -31,17 +31,17 @@
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', gZenUIMigration.init();
false
);
gZenCompactModeManager.init(); gZenCompactModeManager.init();
ZenWorkspaces.init(); ZenWorkspaces.init();
gZenVerticalTabsManager.init(); gZenVerticalTabsManager.init();
gZenUIManager.init(); gZenUIManager.init();
this._initSquircles();
document.l10n.setAttributes(document.getElementById('tabs-newtab-button'), 'tabs-toolbar-new-tab'); document.l10n.setAttributes(document.getElementById('tabs-newtab-button'), 'tabs-toolbar-new-tab');
} catch (e) { } catch (e) {
console.error('ZenThemeModifier: Error initializing browser layout', e); console.error('ZenThemeModifier: Error initializing browser layout', e);
@@ -84,19 +84,35 @@
sidebarPanelWrapper.prepend(elem); sidebarPanelWrapper.prepend(elem);
} }
} }
},
// remove all styles except for the width, since we are xulstoring the complet style list _initSidebarScrolling() {
const width = toolbox.style.width || '270px'; // Disable smooth scroll
toolbox.removeAttribute('style'); const canSmoothScroll = Services.prefs.getBoolPref('zen.startup.smooth-scroll-in-tabs', false);
toolbox.style.width = width; const workspaceIndicator = document.getElementById('zen-current-workspace-indicator');
const tabsWrapper = document.getElementById('zen-browser-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;
// Set a splitter to navigator-toolbox window.requestAnimationFrame(() => {
const splitter = document.createXULElement('splitter'); tabContainer.arrowScrollbox.toggleAttribute('overflowing', overflowing);
splitter.setAttribute('id', 'zen-sidebar-splitter'); tabContainer.arrowScrollbox.dispatchEvent(new CustomEvent(overflowing ? 'overflow' : 'underflow'));
splitter.setAttribute('orient', 'horizontal'); });
splitter.setAttribute('resizebefore', 'sibling'); });
splitter.setAttribute('resizeafter', 'none'); observer.observe(tabsWrapper);
toolbox.insertAdjacentElement('afterend', splitter);
}, },
_initSearchBar() { _initSearchBar() {
@@ -107,6 +123,12 @@
gURLBar._initPasteAndGo(); gURLBar._initPasteAndGo();
gURLBar._initStripOnShare(); gURLBar._initStripOnShare();
}, },
_initSquircles() {
CSS.paintWorklet.addModule(
`chrome://browser/content/zen-vendor/css-houdini-squircle.min.mjs`
);
}
}; };
ZenStartup.init(); ZenStartup.init();

View File

@@ -1,6 +1,7 @@
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));
@@ -8,8 +9,12 @@ var gZenUIManager = {
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);
ChromeUtils.defineLazyGetter(this, 'motion', () => {
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(gZenCommonActions.throttle(this.updateTabsToolbar.bind(this), this.sidebarHeightThrottle)).observe(
document.getElementById('tabbrowser-tabs') document.getElementById('TabsToolbar')
); );
new ResizeObserver( new ResizeObserver(
@@ -18,25 +23,55 @@ var gZenUIManager = {
this.sidebarHeightThrottle this.sidebarHeightThrottle
) )
).observe(document.getElementById('navigator-toolbox')); ).observe(document.getElementById('navigator-toolbox'));
SessionStore.promiseAllWindowsRestored.then(() => {
this._hasLoadedDOM = true;
});
window.addEventListener('TabClose', this.onTabClose.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 = document.getElementById('zen-browser-tabs-wrapper');
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-browser-tabs-wrapper');
return this._tabsWrapper;
},
saveScrollbarState() {
this._scrollbarState = this.tabsWrapper.scrollTop;
},
onTabClose(event) {
this.updateTabsToolbar();
this.tabsWrapper.scrollTop = this._scrollbarState;
this._scrollbarState = 0;
}, },
openAndChangeToTab(url, options) { openAndChangeToTab(url, options) {
@@ -51,9 +86,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() {
@@ -109,11 +142,49 @@ var gZenUIManager = {
this.__currentPopup = null; this.__currentPopup = null;
this.__currentPopupTrackElement = null; this.__currentPopupTrackElement = null;
}, },
_prevUrlbarLabel: null,
_lastSearch: '',
handleNewTab(werePassedURL, searchClipboard, where) {
const shouldOpenURLBar =
Services.prefs.getBoolPref('zen.urlbar.replace-newtab') && !werePassedURL && !searchClipboard && where === 'tab';
if (shouldOpenURLBar) {
this._prevUrlbarLabel = gURLBar._untrimmedValue;
gURLBar._zenHandleUrlbarClose = this.handleUrlbarClose.bind(this);
gURLBar.setAttribute('zen-newtab', true);
document.getElementById('Browser:OpenLocation').doCommand();
gURLBar.search(this._lastSearch);
return true;
}
return false;
},
handleUrlbarClose(onSwitch) {
gURLBar._zenHandleUrlbarClose = null;
gURLBar.removeAttribute('zen-newtab');
if (onSwitch) {
this._prevUrlbarLabel = null;
this._lastSearch = '';
} else {
this._lastSearch = gURLBar._untrimmedValue;
}
gURLBar.setURI(this._prevUrlbarLabel, false, false, false, true);
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 !(
@@ -131,8 +202,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);
@@ -194,18 +266,56 @@ 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');
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) {
this.__actualWindowButtons = !this.isWindowsStyledButtons this.__actualWindowButtons = !this.isWindowsStyledButtons
? document.querySelector('.titlebar-buttonbox-container') // TODO: test if it works 100% of the time ? document.querySelector('.titlebar-buttonbox-container') // TODO: test if it works 100% of the time
: document.querySelector('#nav-bar .titlebar-buttonbox-container'); : document.querySelector('#nav-bar .titlebar-buttonbox-container');
this.__actualWindowButtons.setAttribute('overflows', 'false');
} }
return this.__actualWindowButtons; return this.__actualWindowButtons;
}, },
@@ -227,14 +337,6 @@ var gZenVerticalTabsManager = {
}, },
initializePreferences(updateEvent) { initializePreferences(updateEvent) {
XPCOMUtils.defineLazyPreferenceGetter(
this,
'_prefsCompactMode',
'zen.view.compact',
false
// no need to update the event, it's handled by the compact mode manager
);
XPCOMUtils.defineLazyPreferenceGetter(this, '_prefsVerticalTabs', 'zen.tabs.vertical', true, updateEvent); XPCOMUtils.defineLazyPreferenceGetter(this, '_prefsVerticalTabs', 'zen.tabs.vertical', true, updateEvent);
XPCOMUtils.defineLazyPreferenceGetter(this, '_prefsRightSide', 'zen.tabs.vertical.right-side', false, updateEvent); XPCOMUtils.defineLazyPreferenceGetter(this, '_prefsRightSide', 'zen.tabs.vertical.right-side', false, updateEvent);
XPCOMUtils.defineLazyPreferenceGetter(this, '_prefsUseSingleToolbar', 'zen.view.use-single-toolbar', false, updateEvent); XPCOMUtils.defineLazyPreferenceGetter(this, '_prefsUseSingleToolbar', 'zen.view.use-single-toolbar', false, updateEvent);
@@ -248,6 +350,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;
@@ -261,7 +388,7 @@ var gZenVerticalTabsManager = {
} }
const topButtons = document.getElementById('zen-sidebar-top-buttons'); const topButtons = document.getElementById('zen-sidebar-top-buttons');
const isCompactMode = this._prefsCompactMode && !forCustomizableMode; const isCompactMode = gZenCompactModeManager.preference && !forCustomizableMode;
const isVerticalTabs = this._prefsVerticalTabs || forCustomizableMode; const isVerticalTabs = this._prefsVerticalTabs || forCustomizableMode;
const isSidebarExpanded = this._prefsSidebarExpanded || !isVerticalTabs; const isSidebarExpanded = this._prefsSidebarExpanded || !isVerticalTabs;
const isRightSide = this._prefsRightSide && isVerticalTabs; const isRightSide = this._prefsRightSide && isVerticalTabs;
@@ -328,7 +455,10 @@ var gZenVerticalTabsManager = {
this._topButtonsSeparatorElement.after(button); this._topButtonsSeparatorElement.after(button);
} }
buttonsTarget.prepend(document.getElementById('unified-extensions-button')); buttonsTarget.prepend(document.getElementById('unified-extensions-button'));
buttonsTarget.prepend(document.getElementById('PanelUI-button')); const panelUIButton = document.getElementById('PanelUI-button');
buttonsTarget.prepend(panelUIButton);
panelUIButton.setAttribute('overflows', 'false');
buttonsTarget.parentElement.append(document.getElementById('nav-bar-overflow-button'));
if (this.isWindowsStyledButtons && !doNotChangeWindowButtons) { if (this.isWindowsStyledButtons && !doNotChangeWindowButtons) {
appContentNavbarContaienr.append(windowButtons); appContentNavbarContaienr.append(windowButtons);
} }
@@ -353,7 +483,10 @@ var gZenVerticalTabsManager = {
} }
this._topButtonsSeparatorElement.remove(); this._topButtonsSeparatorElement.remove();
document.documentElement.removeAttribute('zen-single-toolbar'); document.documentElement.removeAttribute('zen-single-toolbar');
navBar.appendChild(document.getElementById('PanelUI-button')); const panelUIButton = document.getElementById('PanelUI-button');
navBar.appendChild(panelUIButton);
panelUIButton.removeAttribute('overflows');
navBar.appendChild(document.getElementById('nav-bar-overflow-button'));
this._toolbarOriginalParent.prepend(navBar); this._toolbarOriginalParent.prepend(navBar);
if (!dontRebuildAreas) { if (!dontRebuildAreas) {
this.rebuildAreas(); this.rebuildAreas();
@@ -383,7 +516,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) {
@@ -416,6 +549,7 @@ var gZenVerticalTabsManager = {
// Always move the splitter next to the sidebar // Always move the splitter next to the sidebar
this.navigatorToolbox.after(document.getElementById('zen-sidebar-splitter')); this.navigatorToolbox.after(document.getElementById('zen-sidebar-splitter'));
window.dispatchEvent(new Event('resize'));
} catch (e) { } catch (e) {
console.error(e); console.error(e);
} }
@@ -448,4 +582,15 @@ var gZenVerticalTabsManager = {
const newVal = !Services.prefs.getBoolPref('zen.tabs.vertical.right-side'); const newVal = !Services.prefs.getBoolPref('zen.tabs.vertical.right-side');
Services.prefs.setBoolPref('zen.tabs.vertical.right-side', newVal); Services.prefs.setBoolPref('zen.tabs.vertical.right-side', newVal);
}, },
appendCustomizableItem(target, child, placements) {
if (
target.id === 'zen-sidebar-top-buttons-customization-target' &&
this._hasSetSingleToolbar &&
placements.includes(child.id)
) {
return this._topButtonsSeparatorElement.before(child);
}
target.appendChild(child);
},
}; };

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..eb7ed966628a595847b850f981418d425b78f14b 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,14 +16,15 @@ 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,11 @@ var gBrowserInit = {
gPrivateBrowsingUI.init(); gPrivateBrowsingUI.init();
BrowserSearch.init(); BrowserSearch.init();
BrowserPageActions.init(); BrowserPageActions.init();
+ +
+Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenUIMigration.mjs", window);
+Services.scriptloader.loadSubScript("chrome://browser/content/ZenStartup.mjs", window); +Services.scriptloader.loadSubScript("chrome://browser/content/ZenStartup.mjs", window);
+Services.scriptloader.loadSubScript("chrome://browser/content/zenThemeModifier.js", window); +Services.scriptloader.loadSubScript("chrome://browser/content/zenThemeModifier.js", window);
+ +

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 5dd337a2ffc9f9107d735f4dc96a50d57b12d213..58ecaf7136e13885ac38d74d40b5ef0f52cd7684 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
@@ -98,6 +98,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.
@@ -141,6 +143,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,18 +19,18 @@ index 5dd337a2ffc9f9107d735f4dc96a50d57b12d213..58ecaf7136e13885ac38d74d40b5ef0f
</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)
@@ -162,9 +165,12 @@ @@ -164,9 +167,12 @@
</vbox> </vbox>
</html:template> </html:template>
-#include navigator-toolbox.inc.xhtml -#include navigator-toolbox.inc.xhtml
- -
-#include browser-box.inc.xhtml -#include browser-box.inc.xhtml
+ <hbox id="zen-main-app-wrapper" flex="1"> + <hbox id="zen-main-app-wrapper" flex="1" persist="zen-compact-mode">
+ #include navigator-toolbox.inc.xhtml + #include navigator-toolbox.inc.xhtml
+ <html:span id="zen-sidebar-box-container"> + <html:span id="zen-sidebar-box-container">
+ </html:span> + </html:span>
+ #include browser-box.inc.xhtml + #include browser-box.inc.xhtml
+ </hbox> + </hbox>
<html:template id="customizationPanel"> <html:template id="customizationPanel">

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 00391af141d9015fe5839534e5e6b22a91ba65d9..b68767d0fef6cea2756376bbcfe00603d5d1a655 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,32 @@ 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,12 @@
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" skipintoolbarset="true">
+ <hbox id="zen-current-workspace-indicator-icon"></hbox>
+ <hbox id="zen-current-workspace-indicator-name"></hbox>
+</hbox>
+<html:div id="zen-browser-tabs-wrapper">
<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 +63,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,7 +62,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/>
@@ -100,11 +106,12 @@ @@ -75,6 +81,7 @@
tooltip="dynamic-shortcut-tooltip"
data-l10n-id="tabs-toolbar-new-tab"/>
<html:span id="tabbrowser-tab-a11y-desc" hidden="true"/>
+</html:div>
</tabs>
<toolbarbutton id="new-tab-button"
@@ -100,11 +107,12 @@
#include private-browsing-indicator.inc.xhtml #include private-browsing-indicator.inc.xhtml
<toolbarbutton id="content-analysis-indicator" <toolbarbutton id="content-analysis-indicator"
class="toolbarbutton-1 content-analysis-indicator-icon"/> class="toolbarbutton-1 content-analysis-indicator-icon"/>
@@ -69,7 +86,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 @@ @@ -487,10 +495,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

@@ -28,19 +28,19 @@
# Scripts used all over the browser # Scripts used all over the browser
<script src="chrome://browser/content/zen-components/ZenThemesCommon.mjs" /> <script src="chrome://browser/content/zen-components/ZenThemesCommon.mjs" />
<script src="chrome://browser/content/zen-components/ZenActorsManager.mjs" />
<script src="chrome://browser/content/zen-components/ZenGlanceManager.mjs" />
<script src="chrome://browser/content/zen-components/ZenThemesImporter.mjs" /> <script src="chrome://browser/content/zen-components/ZenThemesImporter.mjs" />
<script src="chrome://browser/content/zen-components/ZenCompactMode.mjs" /> <script src="chrome://browser/content/zen-components/ZenCompactMode.mjs" />
<script src="chrome://browser/content/ZenUIManager.mjs" /> <script src="chrome://browser/content/ZenUIManager.mjs" />
<script src="chrome://browser/content/zen-components/ZenSidebarManager.mjs"/> <script src="chrome://browser/content/zen-components/ZenSidebarManager.mjs"/>
<script src="chrome://browser/content/zen-components/ZenTabUnloader.mjs" /> <script src="chrome://browser/content/zen-components/ZenTabUnloader.mjs" />
<script src="chrome://browser/content/zen-components/ZenWorkspaces.mjs" />
<script src="chrome://browser/content/zen-components/ZenPinnedTabsStorage.mjs" /> <script src="chrome://browser/content/zen-components/ZenPinnedTabsStorage.mjs" />
<script src="chrome://browser/content/zen-components/ZenWorkspacesStorage.mjs" />
<script src="chrome://browser/content/zen-components/ZenPinnedTabManager.mjs" /> <script src="chrome://browser/content/zen-components/ZenPinnedTabManager.mjs" />
<script src="chrome://browser/content/zen-components/ZenGradientGenerator.mjs" /> <script src="chrome://browser/content/zen-components/ZenGradientGenerator.mjs" />
<script src="chrome://browser/content/zen-components/ZenViewSplitter.mjs"/> <script src="chrome://browser/content/zen-components/ZenViewSplitter.mjs"/>
<script src="chrome://browser/content/zen-components/ZenProfileDialogUI.mjs" /> <script src="chrome://browser/content/zen-components/ZenProfileDialogUI.mjs" />
<script src="chrome://browser/content/zen-components/ZenGlanceManager.mjs" />
<script src="chrome://browser/content/zen-vendor/css-paint-polyfill.min.mjs" />
# Unimportant scripts # Unimportant scripts
<script src="chrome://browser/content/zen-components/ZenRices.mjs" /> <script src="chrome://browser/content/zen-components/ZenRices.mjs" />

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)
@@ -13,7 +14,6 @@
content/browser/zen-components/ZenSidebarManager.mjs (zen-components/ZenSidebarManager.mjs) content/browser/zen-components/ZenSidebarManager.mjs (zen-components/ZenSidebarManager.mjs)
content/browser/zen-components/ZenProfileDialogUI.mjs (zen-components/ZenProfileDialogUI.mjs) content/browser/zen-components/ZenProfileDialogUI.mjs (zen-components/ZenProfileDialogUI.mjs)
content/browser/zen-components/ZenKeyboardShortcuts.mjs (zen-components/ZenKeyboardShortcuts.mjs) content/browser/zen-components/ZenKeyboardShortcuts.mjs (zen-components/ZenKeyboardShortcuts.mjs)
content/browser/zen-components/ZenThemeBuilder.mjs (zen-components/ZenThemeBuilder.mjs)
content/browser/zen-components/ZenThemesImporter.mjs (zen-components/ZenThemesImporter.mjs) content/browser/zen-components/ZenThemesImporter.mjs (zen-components/ZenThemesImporter.mjs)
content/browser/zen-components/ZenTabUnloader.mjs (zen-components/ZenTabUnloader.mjs) content/browser/zen-components/ZenTabUnloader.mjs (zen-components/ZenTabUnloader.mjs)
content/browser/zen-components/ZenPinnedTabsStorage.mjs (zen-components/ZenPinnedTabsStorage.mjs) content/browser/zen-components/ZenPinnedTabsStorage.mjs (zen-components/ZenPinnedTabsStorage.mjs)
@@ -53,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)
@@ -75,3 +75,6 @@
# JS Vendor # JS Vendor
content/browser/zen-vendor/tsparticles.confetti.bundle.min.js (content/zen-vendor/tsparticles.confetti.bundle.min.js) content/browser/zen-vendor/tsparticles.confetti.bundle.min.js (content/zen-vendor/tsparticles.confetti.bundle.min.js)
content/browser/zen-vendor/motion.min.mjs (content/zen-vendor/motion.min.mjs)
content/browser/zen-vendor/css-houdini-squircle.min.mjs (content/zen-vendor/css-houdini-squircle.min.mjs)
content/browser/zen-vendor/css-paint-polyfill.min.mjs (content/zen-vendor/css-paint-polyfill.min.mjs)

View File

@@ -9,12 +9,14 @@ JAR_ENTRY_TEMPLATE = "\tcontent/browser/zen-avatars/{0}\t(content/zen-avatars/{0
URL = "https://source.boringavatars.com/bauhaus/120/${}?colors={}" URL = "https://source.boringavatars.com/bauhaus/120/${}?colors={}"
COLORS = { COLORS = {
"dark": ["DDDDDD", "5E9188", "3E5954", "253342", "232226"], "dark": ["DDDDDD", "5E9188", "3E5954", "253342", "232226"],
"light": ["9D9382", "FFC1B2", "FFDBC8", "FFF6C7", "DCD7C2"] "light": ["9D9382", "FFC1B2", "FFDBC8", "FFF6C7", "DCD7C2"],
} }
def random_string(length): def random_string(length):
return ''.join(random.choices("abcdefghijklmnopqrstuvwxyz", k=length)) return "".join(random.choices("abcdefghijklmnopqrstuvwxyz", k=length))
def generate_list_names(): def generate_list_names():
names = [] names = []
@@ -22,9 +24,11 @@ def generate_list_names():
names.append(random_string(random.randint(5, 10))) names.append(random_string(random.randint(5, 10)))
return names return names
def write_jar_file(jar_file): def write_jar_file(jar_file):
with open("jar.inc.mn", "w") as f: with open("jar.inc.mn", "w") as f:
f.write(jar_file) f.write(jar_file)
def fetch_all_avatars(): def fetch_all_avatars():
names = generate_list_names() names = generate_list_names()
@@ -36,15 +40,19 @@ def fetch_all_avatars():
with open(f"avatar-{i}-{theme}.svg", "w") as f: with open(f"avatar-{i}-{theme}.svg", "w") as f:
f.write(response.text) f.write(response.text)
jar_file += JAR_ENTRY_TEMPLATE.format(f"avatar-{i}-{theme}.svg") + "\n" jar_file += JAR_ENTRY_TEMPLATE.format(f"avatar-{i}-{theme}.svg") + "\n"
print(f"SUCCESS: Fetched 'avatar-{i}-{theme}.svg' for name '{name}' with theme '{theme}'") print(
f"SUCCESS: Fetched 'avatar-{i}-{theme}.svg' for name '{name}' with theme '{theme}'"
)
write_jar_file(jar_file) write_jar_file(jar_file)
def clear_all_avatars(): def clear_all_avatars():
for file in os.listdir(): for file in os.listdir():
if file.startswith("avatar-") and file.endswith(".svg"): if file.startswith("avatar-") and file.endswith(".svg"):
os.remove(file) os.remove(file)
print(f"SUCCESS: Removed '{file}'") print(f"SUCCESS: Removed '{file}'")
def main(): def main():
if not os.getcwd().endswith("zen-avatars"): if not os.getcwd().endswith("zen-avatars"):
print("ERROR: Please run this script from the 'zen-avatars' directory") print("ERROR: Please run this script from the 'zen-avatars' directory")
@@ -52,5 +60,6 @@ def main():
clear_all_avatars() clear_all_avatars()
fetch_all_avatars() fetch_all_avatars()
if __name__ == "__main__": if __name__ == "__main__":
main() main()

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

@@ -4,6 +4,7 @@
<script type="text/javascript"> <script type="text/javascript">
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenCommonUtils.mjs", this); Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenCommonUtils.mjs", this);
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenKeyboardShortcuts.mjs", this); Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenKeyboardShortcuts.mjs", this);
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspaces.mjs", this);
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspacesSync.mjs", this); Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspacesSync.mjs", this);
Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenWorkspacesStorage.mjs", this); Services.scriptloader.loadSubScript("chrome://browser/content/zen-components/ZenActorsManager.mjs", this);
</script> </script>

View File

@@ -7,6 +7,9 @@
skipintoolbarset="true" skipintoolbarset="true"
context="toolbar-context-menu" context="toolbar-context-menu"
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="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 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"
@@ -22,4 +25,4 @@
<image id="zen-profile-button-icon" /> <image id="zen-profile-button-icon" />
</vbox> </vbox>
</toolbarbutton> </toolbarbutton>
</toolbar> </toolbar>

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;
@@ -100,28 +85,6 @@
} }
} }
@keyframes zen-slide-in {
from {
transform: translateX(-150%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
@keyframes zen-slide-in-reverse {
from {
transform: translateX(150%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
@keyframes zen-deck-fadeIn { @keyframes zen-deck-fadeIn {
0% { 0% {
transform: scale(0.9); transform: scale(0.9);
@@ -241,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 {
@@ -274,108 +227,6 @@
} }
} }
@keyframes zen-glance-content-animation {
/* make the box appear from initial width/height and x/y coordinates */
0% {
opacity: 0;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) translateZ(0);
width: 0%;
height: 0%;
}
80% {
/* make the box grow to full width/height */
opacity: 1;
transform: translate(-50%, -50%) translateZ(0);
top: 50%;
left: 50%;
width: 87%;
height: 102%;
}
100% {
/* make the box shrink to final width/height and x/y coordinates */
transform: translate(-50%, -50%) translateZ(0);
opacity: 1;
width: 85%;
height: 100%;
top: 50%;
left: 50%;
}
}
@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,23 +6,13 @@
: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;
border-radius: var(--zen-webview-border-radius, var(--zen-border-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[zen-right-side='true'] & {
margin-left: var(--zen-element-separation);
}
:root:not([zen-no-padding='true']) & { :root:not([zen-no-padding='true']) & {
margin: 1px; box-shadow: var(--zen-big-shadow);
box-shadow: 0 0 1px 1px light-dark(rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.5));
} }
} }

View File

@@ -28,7 +28,7 @@
#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,25 +51,12 @@
&[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.6s ease forwards; animation: zen-main-app-wrapper-animation 0.5s ease forwards;
transition: 0s; transition: 0s;
} }
} }
@media (-moz-windows-accent-color-in-titlebar) { @media (not (-moz-windows-mica)) and (-moz-bool-pref: 'zen.view.grey-out-inactive-windows') {
background-color: ActiveCaption;
color: CaptionText;
transition: background-color var(--inactive-window-transition);
&:-moz-window-inactive {
background-color: InactiveCaption;
color: InactiveCaptionText;
}
&::after {
display: none;
}
}
@media (not (-moz-windows-accent-color-in-titlebar)) and (not (-moz-windows-mica)) and (-moz-bool-pref: 'zen.view.grey-out-inactive-windows') {
transition: color var(--inactive-window-transition); transition: color var(--inactive-window-transition);
&:-moz-window-inactive { &:-moz-window-inactive {
color: var(--toolbox-textcolor-inactive); color: var(--toolbox-textcolor-inactive);
@@ -111,6 +98,11 @@
z-index: 2; z-index: 2;
} }
#nav-bar {
/* For some reason, firefox adds a really small border to the top of the nav-bar */
border-top: none !important;
}
#zen-main-app-wrapper { #zen-main-app-wrapper {
background: transparent; background: transparent;
overflow: hidden; overflow: hidden;
@@ -118,13 +110,24 @@
& > * { & > * {
z-index: 1; z-index: 1;
} }
@media (-moz-windows-accent-color-in-titlebar) and (-moz-windows-mica) {
background-color: ActiveCaption;
color: CaptionText;
transition: background-color var(--inactive-window-transition);
&:-moz-window-inactive {
background-color: InactiveCaption;
color: InactiveCaptionText;
}
}
} }
#zen-appcontent-wrapper { #zen-appcontent-wrapper {
max-width: 100%;
min-width: 1px;
overflow-x: hidden;
z-index: 1; z-index: 1;
/* Use this trick to prevent bookmarks from overflowing the window,
* without using overflow: hidden.
*/
min-width: 1px;
} }
:root:not([inDOMFullscreen='true']):not([chromehidden~='location']):not([chromehidden~='toolbar']) { :root:not([inDOMFullscreen='true']):not([chromehidden~='location']):not([chromehidden~='toolbar']) {
@@ -140,16 +143,13 @@
&[zen-right-side='true'] #zen-tabbox-wrapper { &[zen-right-side='true'] #zen-tabbox-wrapper {
margin-right: 0; margin-right: 0;
} }
&:not([zen-no-padding='true']) #zen-tabbox-wrapper {
margin-left: 1px;
}
} }
#tabbrowser-tabbox { #tabbrowser-tabbox {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
position: relative; position: relative;
gap: var(--zen-element-separation);
} }
.titlebar-buttonbox-container { .titlebar-buttonbox-container {

View File

@@ -5,227 +5,328 @@
*/ */
/* All overrides for compact mode go here */ /* All overrides for compact mode go here */
@media (-moz-bool-pref: 'zen.view.compact') { :root[zen-compact-mode='true']:not([customizing]):not([inDOMFullscreen='true']) {
:root:not([customizing]):not([inDOMFullscreen='true']) { %include zen-tabs/vertical-tabs-topbuttons-fix.css
#zen-sidebar-top-buttons:has(#zen-sidebar-top-buttons-customization-target:empty) {
max-height: 0 !important; @media (-moz-bool-pref: 'zen.view.compact.hide-tabbar') or (-moz-bool-pref: 'zen.view.use-single-toolbar') {
min-height: 0 !important; #zen-sidebar-web-panel-wrapper:has(#zen-sidebar-web-panel[pinned='true']) {
opacity: 0; margin-left: var(--zen-sidebar-web-panel-spacing) !important;
overflow: hidden;
pointer-events: none;
} }
@media (-moz-bool-pref: 'zen.view.compact.hide-tabbar') or (-moz-bool-pref: 'zen.view.use-single-toolbar') { #zen-tabbox-wrapper {
#zen-sidebar-web-panel-wrapper:has(#zen-sidebar-web-panel[pinned='true']) { /* Remove extra 1px of margine we have to add to the tabbox */
margin-left: var(--zen-sidebar-web-panel-spacing) !important; margin-left: 0 !important;
}
#zen-appcontent-wrapper {
margin-left: var(--zen-element-separation) !important;
& #tabbrowser-tabbox {
margin-left: 0 !important;
}
}
#zen-sidebar-top-buttons-customization-target {
padding-inline-start: calc(var(--zen-toolbox-padding) - var(--toolbarbutton-outer-padding)) !important;
}
#zen-sidebar-splitter {
display: none !important;
}
#navigator-toolbox {
--zen-toolbox-max-width: 64px !important;
--zen-compact-float: var(--zen-element-separation);
&:not([animate='true']) {
position: absolute;
z-index: 10;
transition:
left 0.25s ease,
right 0.25s ease;
top: 0;
bottom: var(--zen-element-separation);
padding: 0 var(--zen-compact-float) !important;
:root[zen-single-toolbar='true'] & {
top: var(--zen-element-separation);
}
} }
#zen-tabbox-wrapper { &:not([zen-right-side='true']) #nav-bar {
/* Remove extra 1px of margine we have to add to the tabbox */
margin-left: 0 !important; margin-left: 0 !important;
} }
#zen-appcontent-wrapper { & #urlbar[open]:not([zen-floating-urlbar='true']) {
margin-left: var(--zen-element-separation) !important; top: 0 !important;
& #tabbrowser-tabbox {
margin-left: 0 !important;
}
}
#zen-sidebar-top-buttons-customization-target {
padding-inline-start: calc(var(--zen-toolbox-padding) - var(--toolbarbutton-outer-padding)) !important;
}
#zen-sidebar-splitter {
display: none !important;
}
#navigator-toolbox {
--zen-toolbox-max-width: 64px !important;
--zen-compact-float: var(--zen-element-separation);
&:not([animate='true']) {
position: absolute;
z-index: 10;
transition:
left 0.25s ease,
right 0.25s ease,
opacity 1.5s ease;
top: 0;
bottom: var(--zen-element-separation);
opacity: 0;
padding: 0 var(--zen-compact-float) !important;
:root[zen-single-toolbar='true'] & {
top: var(--zen-element-separation);
}
}
&:not([zen-right-side='true']) #nav-bar {
margin-left: 0 !important;
}
& #urlbar[open] {
top: 0 !important;
}
}
&:not([zen-right-side='true']) #navigator-toolbox {
left: calc(-1 * var(--zen-sidebar-width) + var(--zen-element-separation));
}
/* When we have multiple toolbars and the top-toolbar is NOT being hidden,
* we need to adjust the top-padding of the toolbox to account for the
* extra toolbar height. */
@media not (-moz-bool-pref: 'zen.view.compact.hide-toolbar') {
&:not([zen-single-toolbar='true']) #navigator-toolbox:not([animate='true']) {
margin-top: var(--zen-toolbar-height) !important;
}
}
&[zen-right-side='true'] {
& #navigator-toolbox {
--zen-compact-float: calc(var(--zen-element-separation) + 1px);
&:not([animate='true']) {
right: calc(-1 * var(--zen-sidebar-width) + var(--zen-element-separation));
}
}
& .browserSidebarContainer {
margin-left: 0 !important;
margin-right: var(--zen-element-separation) !important;
}
}
#navigator-toolbox:not([animate='true']) #titlebar {
box-shadow: 0 0 2px 2px rgba(0, 0, 0, 0.1);
border-radius: calc(var(--zen-border-radius) - 2px);
padding: var(--zen-toolbox-padding) !important;
position: relative;
background: var(--zen-dialog-background);
outline: 1px solid light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1));
:root[zen-single-toolbar='true'] {
padding-top: 0 !important;
margin-left: 0 !important;
}
@media (-moz-bool-pref: 'zen.view.compact.color-sidebar') {
background: var(--zen-main-browser-background-toolbar) !important;
background-attachment: fixed !important;
background-size: 2000px !important; /* Dont ask me why */
backdrop-filter: blur(5px) !important;
}
}
#navigator-toolbox:hover,
#navigator-toolbox[zen-has-hover],
#navigator-toolbox[zen-user-show],
#navigator-toolbox[flash-popup],
#navigator-toolbox[has-popup-menu],
#navigator-toolbox[movingtab],
#navigator-toolbox:has(.tabbrowser-tab:active),
#navigator-toolbox:has(
*:is([panelopen='true'], [open='true'], #nav-bar:focus-within):not(tab):not(.zen-compact-mode-ignore)
) {
&:not([animate='true']) {
transition:
left 0.25s ease,
right 0.25s ease;
opacity: 1;
left: -1px;
:root[zen-right-side='true'] & {
right: -1px;
left: auto;
}
}
} }
} }
@media (-moz-bool-pref: 'zen.view.compact.hide-toolbar') { &:not([zen-right-side='true']) #navigator-toolbox {
&:not([zen-single-toolbar='true']) { left: calc(-1 * var(--zen-sidebar-width) + 1px);
& #navigator-toolbox { }
top: 0;
/* When we have multiple toolbars and the top-toolbar is NOT being hidden,
* we need to adjust the top-padding of the toolbox to account for the
* extra toolbar height. */
@media not (-moz-bool-pref: 'zen.view.compact.hide-toolbar') {
&:not([zen-single-toolbar='true']) #navigator-toolbox:not([animate='true']) {
margin-top: var(--zen-toolbar-height) !important;
}
}
&[zen-right-side='true'] {
& #navigator-toolbox {
--zen-compact-float: calc(var(--zen-element-separation) + 1px);
&:not([animate='true']) {
right: calc(-1 * var(--zen-sidebar-width) + 1px);
}
}
& .browserSidebarContainer {
margin-left: 0 !important;
margin-right: var(--zen-element-separation) !important;
}
}
#navigator-toolbox:not([animate='true']) #titlebar {
box-shadow: var(--zen-big-shadow);
border-radius: var(--zen-native-inner-radius);
padding: var(--zen-toolbox-padding) !important;
position: relative;
background: var(--zen-dialog-background);
border: 1px solid var(--zen-colors-border-contrast);
:root[zen-single-toolbar='true'] {
padding-top: 0 !important;
margin-left: 0 !important;
}
@media (-moz-bool-pref: 'zen.view.compact.color-sidebar') {
background: var(--zen-main-browser-background-toolbar) !important;
background-attachment: fixed !important;
background-size: 2000px !important; /* Dont ask me why */
backdrop-filter: blur(5px) !important;
}
& #urlbar[open][zen-floating-urlbar='true'] {
--zen-urlbar-offset: var(--zen-sidebar-width);
transition: left 0.1s ease;
}
}
#navigator-toolbox:hover,
#navigator-toolbox[zen-has-hover],
#navigator-toolbox[zen-user-show],
#navigator-toolbox[flash-popup],
#navigator-toolbox[has-popup-menu],
#navigator-toolbox[movingtab],
#navigator-toolbox:has(.tabbrowser-tab:active),
#navigator-toolbox:has(
*:is([panelopen='true'], [open='true'], #urlbar:not([zen-floating-urlbar='true']):focus-within):not(tab):not(.zen-compact-mode-ignore)
) {
&:not([animate='true']):not(:has(#urlbar[zen-floating-urlbar='true']:hover)) {
--zen-compact-mode-func: linear(
0 0%,
0.002748 1%,
0.010544 2%,
0.022757 3%,
0.038804 4%,
0.058151 5%,
0.080308 6%,
0.104828 7.000000000000001%,
0.131301 8%,
0.159358 9%,
0.188662 10%,
0.21891 11%,
0.249828 12%,
0.281172 13%,
0.312724 14.000000000000002%,
0.344288 15%,
0.375693 16%,
0.40679 17%,
0.437447 18%,
0.467549 19%,
0.497 20%,
0.525718 21%,
0.553633 22%,
0.580688 23%,
0.60684 24%,
0.632052 25%,
0.656298 26%,
0.679562 27%,
0.701831 28.000000000000004%,
0.723104 28.999999999999996%,
0.743381 30%,
0.76267 31%,
0.780983 32%,
0.798335 33%,
0.814744 34%,
0.830233 35%,
0.844826 36%,
0.858549 37%,
0.87143 38%,
0.883498 39%,
0.894782 40%,
0.905314 41%,
0.915125 42%,
0.924247 43%,
0.93271 44%,
0.940547 45%,
0.947787 46%,
0.954463 47%,
0.960603 48%,
0.966239 49%,
0.971397 50%,
0.976106 51%,
0.980394 52%,
0.984286 53%,
0.987808 54%,
0.990984 55.00000000000001%,
0.993837 56.00000000000001%,
0.99639 56.99999999999999%,
0.998664 57.99999999999999%,
1.000679 59%,
1.002456 60%,
1.004011 61%,
1.005363 62%,
1.006528 63%,
1.007522 64%,
1.008359 65%,
1.009054 66%,
1.009618 67%,
1.010065 68%,
1.010405 69%,
1.010649 70%,
1.010808 71%,
1.01089 72%,
1.010904 73%,
1.010857 74%,
1.010757 75%,
1.010611 76%,
1.010425 77%,
1.010205 78%,
1.009955 79%,
1.009681 80%,
1.009387 81%,
1.009077 82%,
1.008754 83%,
1.008422 84%,
1.008083 85%,
1.00774 86%,
1.007396 87%,
1.007052 88%,
1.00671 89%,
1.006372 90%,
1.00604 91%,
1.005713 92%,
1.005394 93%,
1.005083 94%,
1.004782 95%,
1.004489 96%,
1.004207 97%,
1.003935 98%,
1.003674 99%,
1.003423 100%
);
transition:
left 0.3s var(--zen-compact-mode-func),
right 0.3s var(--zen-compact-mode-func);
left: -1px;
:root[zen-right-side='true'] & {
right: -1px;
left: auto;
} }
& #navigator-toolbox { & #urlbar[open][zen-floating-urlbar='true'] {
--zen-toolbox-top-align: var(--zen-element-separation); --zen-urlbar-offset: 0px;
}
}
}
}
@media (-moz-bool-pref: 'zen.view.compact.hide-toolbar') {
&:not([zen-single-toolbar='true']) {
& #navigator-toolbox {
top: 0;
}
& #navigator-toolbox {
--zen-toolbox-top-align: var(--zen-element-separation);
}
& #sidebar-box,
& #titlebar,
& #zen-appcontent-wrapper,
& #zen-sidebar-web-panel-wrapper:has(#zen-sidebar-web-panel:not([pinned='true'])) {
margin-top: var(--zen-element-separation) !important;
}
& #zen-appcontent-wrapper {
z-index: 3 !important;
}
& #zen-sidebar-web-panel-wrapper:has(#zen-sidebar-web-panel[pinned='true']) {
margin-top: calc(var(--zen-element-separation) * 2) !important;
}
& #zen-appcontent-navbar-container {
--zen-compact-toolbar-offset: 5px;
position: absolute;
top: calc((-1 * var(--zen-toolbar-height)) + var(--zen-element-separation) + 1px);
left: 0;
z-index: 20;
box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.3) !important;
border-bottom-left-radius: var(--zen-border-radius);
border-bottom-right-radius: var(--zen-border-radius);
border-top-left-radius: env(-moz-gtk-csd-titlebar-radius);
border-top-right-radius: env(-moz-gtk-csd-titlebar-radius);
transition: all 0.15s ease;
width: 100%;
opacity: 0;
background: var(--zen-dialog-background);
max-height: var(--zen-toolbar-height);
overflow: hidden;
& > * {
position: relative !important;
} }
& #sidebar-box, & #urlbar {
& #titlebar, transform: translateY(-50%);
& #zen-appcontent-wrapper, transition: transform 0.1s ease-in-out;
& #zen-sidebar-web-panel-wrapper:has(#zen-sidebar-web-panel:not([pinned='true'])) {
margin-top: var(--zen-element-separation) !important;
} }
& #zen-appcontent-wrapper { @media (-moz-bool-pref: 'zen.view.compact.color-toolbar') {
z-index: 3 !important; background-attachment: fixed;
backdrop-filter: blur(5px);
background: var(--zen-main-browser-background-toolbar);
background-size: 100% 2000px;
border-bottom: 1px solid var(--zen-colors-border);
} }
}
& #zen-sidebar-web-panel-wrapper:has(#zen-sidebar-web-panel[pinned='true']) { & #zen-appcontent-navbar-container:hover,
margin-top: calc(var(--zen-element-separation) * 2) !important; & #zen-appcontent-navbar-container[zen-has-hover],
} & #zen-appcontent-navbar-container:focus-within,
& #zen-appcontent-navbar-container[zen-user-show],
& #zen-appcontent-navbar-container[has-popup-menu],
& #zen-appcontent-navbar-container:has(*:is([panelopen='true'], [open='true']):not(.zen-compact-mode-ignore)) {
opacity: 1;
border-top-width: 1px;
& #zen-appcontent-navbar-container { top: -1px;
--zen-compact-toolbar-offset: 5px; overflow: initial;
position: absolute; max-height: unset;
top: calc((-1 * var(--zen-toolbar-height)) + var(--zen-element-separation) + 1px);
left: 0;
z-index: 20;
box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.3) !important;
border-bottom-left-radius: var(--zen-border-radius);
border-bottom-right-radius: var(--zen-border-radius);
border-top-left-radius: env(-moz-gtk-csd-titlebar-radius);
border-top-right-radius: env(-moz-gtk-csd-titlebar-radius);
transition: all 0.15s ease;
width: 100%;
opacity: 0;
background: var(--zen-dialog-background);
max-height: var(--zen-toolbar-height); & #urlbar {
overflow: hidden; transform: translateY(0);
& > * { &[open]:not([zen-floating-urlbar='true']) {
position: relative !important; top: 0 !important;
}
& #urlbar {
transform: translateY(-50%);
transition: transform 0.1s ease-in-out;
}
@media (-moz-bool-pref: 'zen.view.compact.color-toolbar') {
background-attachment: fixed;
backdrop-filter: blur(5px);
background: var(--zen-main-browser-background-toolbar);
background-size: 100% 2000px;
border-bottom: 1px solid var(--zen-colors-border);
}
}
& #zen-appcontent-navbar-container:hover,
& #zen-appcontent-navbar-container[zen-has-hover],
& #zen-appcontent-navbar-container:focus-within,
& #zen-appcontent-navbar-container[zen-user-show],
& #zen-appcontent-navbar-container[has-popup-menu],
& #zen-appcontent-navbar-container:has(*:is([panelopen='true'], [open='true']):not(.zen-compact-mode-ignore)) {
opacity: 1;
border-top-width: 1px;
top: -1px;
overflow: initial;
max-height: unset;
& #urlbar {
transform: translateY(0);
&[open]:not([zen-floating-urlbar='true']) {
top: 0 !important;
}
} }
} }
} }

View File

@@ -9,7 +9,7 @@
#tabbrowser-tabpanels[zen-split-view='true'] { #tabbrowser-tabpanels[zen-split-view='true'] {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
margin-top: calc(var(--zen-split-column-gap) / -2); margin-top: calc(var(--zen-split-column-gap) * -1);
} }
#tabbrowser-tabpanels[zen-split-view='true'] > *:not([zen-split='true']) { #tabbrowser-tabpanels[zen-split-view='true'] > *:not([zen-split='true']) {
@@ -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,27 +56,14 @@
--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']),
#zen-splitview-overlay { #zen-splitview-overlay {
@media (-moz-bool-pref: 'zen.view.compact') { :root:not([zen-compact-mode='true']):not([customizing]) & {
:root:not([customizing]) & { @media (-moz-bool-pref: 'zen.view.compact.hide-toolbar') {
@media (-moz-bool-pref: 'zen.view.compact.hide-tabbar') { & {
& { margin-top: calc(var(--zen-split-column-gap) * -1);
margin-left: 1px;
}
}
@media (-moz-bool-pref: 'zen.view.compact.hide-toolbar') {
& {
margin-top: calc(var(--zen-split-column-gap) / -2);
}
} }
} }
} }

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,75 +72,38 @@
} }
& .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%;
opacity: 1; opacity: 1;
transition: opacity 0.2s ease-in-out; transition: opacity 0.2s ease-in-out;
transition-delay: 0.1s;
} }
&[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;
} }
} }
&[animate='true'] { &[animate='true'] {
animation: zen-glance-content-animation 0.4s ease-in-out forwards; position: absolute;
&: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

@@ -4,8 +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 Welcome idalog override */ /* Zen Welcome idalog override */
.dialogBox:not(.spotlightBox) { @media (prefers-color-scheme: dark) {
border: 1px solid var(--zen-colors-border); .dialogBox:not(.spotlightBox) {
border: 1px solid var(--zen-colors-border);
}
} }
#window-modal-dialog[zen-dialog-welcome-element='true'] .dialogBox:not(.spotlightBox) { #window-modal-dialog[zen-dialog-welcome-element='true'] .dialogBox:not(.spotlightBox) {

View File

@@ -53,7 +53,12 @@
menupopup, menupopup,
panel { panel {
--panel-background: var(--arrowpanel-background); --panel-background: var(--arrowpanel-background);
--panel-border-radius: var(--zen-panel-radius); --panel-border-radius: var(--zen-native-inner-radius);
}
/* split-view popup */
#confirmation-hint {
--arrowpanel-background: var(--zen-colors-primary);
} }
/* app menu */ /* app menu */

View File

@@ -15,7 +15,7 @@
#zen-rice-share-dialog-notice { #zen-rice-share-dialog-notice {
color: var(--panel-color); color: var(--panel-color);
background: var(--arrowpanel-background); background: var(--arrowpanel-background);
border-radius: var(--zen-panel-radius); border-radius: var(--zen-native-inner-radius);
box-shadow: 0 0 1px 1px hsla(0, 0%, 0%, 0.2); box-shadow: 0 0 1px 1px hsla(0, 0%, 0%, 0.2);
border: var(--zen-appcontent-border); border: var(--zen-appcontent-border);
overflow: hidden; overflow: hidden;
@@ -130,7 +130,7 @@
background: rgba(255, 0, 0, 0.1); background: rgba(255, 0, 0, 0.1);
padding: 5px; padding: 5px;
transition: opacity 0.3s ease; transition: opacity 0.3s ease;
border-radius: var(--zen-panel-radius); border-radius: var(--zen-native-inner-radius);
@starting-style { @starting-style {
opacity: 0; opacity: 0;

View File

@@ -63,6 +63,7 @@
max-width: 0; max-width: 0;
padding: 0; padding: 0;
margin: 0; margin: 0;
display: none;
} }
#zen-sidebar-web-panel-wrapper:has(#zen-sidebar-web-panel[pinned='true']) { #zen-sidebar-web-panel-wrapper:has(#zen-sidebar-web-panel[pinned='true']) {
@@ -79,10 +80,9 @@
} }
#zen-sidebar-web-panel { #zen-sidebar-web-panel {
border-radius: var(--zen-panel-radius); border-radius: var(--zen-native-inner-radius);
z-index: 2; z-index: 2;
box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.1); 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;
@@ -101,12 +101,13 @@
} }
.zen-sidebar-web-panel-splitter, .zen-sidebar-web-panel-splitter,
.zen-split-view-splitter[orient='vertical'] { .zen-split-view-splitter[orient='vertical'],
#zen-sidebar-splitter {
position: absolute; position: absolute;
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;
@@ -119,9 +120,9 @@
} }
&::before { &::before {
height: 30px; height: 50px;
width: 3px; width: 4px;
background: var(--zen-colors-border); background: var(--zen-colors-primary);
border-radius: 2px; border-radius: 2px;
content: ''; content: '';
position: absolute; position: absolute;
@@ -181,10 +182,6 @@
display: flex; display: flex;
} }
#zen-sidebar-web-panel-wrapper {
margin: 0 calc(var(--zen-element-separation) / 2) 0 var(--zen-element-separation);
}
#zen-sidebar-web-panel[pinned='true'] { #zen-sidebar-web-panel[pinned='true'] {
position: absolute; position: absolute;
z-index: 1; z-index: 1;
@@ -288,19 +285,6 @@
animation: better-sidebar-pinned-hide 0.15s ease-in-out forwards !important; animation: better-sidebar-pinned-hide 0.15s ease-in-out forwards !important;
} }
#zen-sidebar-web-panel-wrapper:has(#zen-sidebar-web-panel:not([hidden='true'])) {
:root:not([zen-right-side='true']) & {
margin-right: calc(var(--zen-element-separation) * 2 - 3px) !important;
}
@media (-moz-bool-pref: 'zen.view.compact') and (-moz-bool-pref: 'zen.view.compact.hide-tabbar') {
:root[zen-right-side='true'] & {
margin-left: 0 !important;
margin-right: calc(var(--zen-element-separation) * 2 - 3px) !important;
}
}
}
/** UNPINNED **/ /** UNPINNED **/
#zen-sidebar-web-panel { #zen-sidebar-web-panel {
/* Sets perspective */ /* Sets perspective */

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

@@ -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,10 +72,14 @@
} }
#browser { #browser {
--zen-toolbox-padding: calc(var(--zen-element-separation) / 1.5); --zen-min-toolbox-padding: .4rem;
:root[zen-no-padding='true'] & { @media (-moz-platform: macos) {
--zen-toolbox-padding: 4px; --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'] {
@@ -101,7 +112,7 @@
} }
& #nav-bar { & #nav-bar {
margin-bottom: 6px; margin-bottom: var(--zen-toolbox-padding);
& toolbarspring { & toolbarspring {
display: none; display: none;
@@ -122,18 +133,34 @@
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:not(:has(tab:not([hidden]))) + &,
display: none; #tabbrowser-tabs:not(:has(#tabbrowser-arrowscrollbox tab:not([hidden]))) & {
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);
@@ -223,6 +250,8 @@
#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-y: unset !important; /* DO NOT CHANGE THIS: Firefox renders badly workspace changes */
overflow-x: clip;
--tab-inner-inline-margin: 0; --tab-inner-inline-margin: 0;
@@ -230,7 +259,7 @@
border-bottom: 0px solid transparent !important; border-bottom: 0px solid transparent !important;
--tab-block-margin: 2px; --tab-block-margin: 2px;
--tab-selected-bgcolor: light-dark(rgba(255,255,255,.8), rgba(255,255,255,.25)); --tab-selected-bgcolor: light-dark(rgba(255, 255, 255, 0.8), rgba(255, 255, 255, 0.12));
grid-gap: 0 !important; grid-gap: 0 !important;
&[overflow]::after, &[overflow]::after,
@@ -242,29 +271,16 @@
& .tabbrowser-tab { & .tabbrowser-tab {
transition: scale 0.07s ease; transition: scale 0.07s ease;
#tabbrowser-tabs &:not([zen-essential='true']) { #tabbrowser-tabs &:not([zen-essential='true']) {
#tabbrowser-tabs[zen-workspace-animation='previous'] & {
animation: zen-slide-in;
}
#tabbrowser-tabs[zen-workspace-animation='next'] & {
animation: zen-slide-in-reverse;
}
#tabbrowser-tabs[zen-workspace-animation] & {
opacity: 0;
transform: translateX(-100%);
animation-delay: 0.2s;
animation-fill-mode: forwards;
animation-duration: 0.2s;
animation-timing-function: ease;
}
#tabbrowser-tabs[dont-animate-tabs] & { #tabbrowser-tabs[dont-animate-tabs] & {
opacity: 0; opacity: 0;
} }
&:is([selected], [multiselected], [visuallyselected]) .tab-background {
box-shadow: 0 1px 1px 1px light-dark(rgba(0, 0, 0, 0.09), rgba(0, 0, 0, 0.1));
}
} }
&:not([zen-essential='true']):active { &:active {
scale: 0.98; scale: 0.98;
} }
@@ -272,7 +288,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;
@@ -295,15 +310,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 {
@@ -312,16 +336,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;
@@ -335,6 +361,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;
@@ -356,10 +383,21 @@
} }
} }
#zen-browser-tabs-wrapper {
min-height: fit-content;
overflow-y: auto;
overflow-x: hidden;
height: 100%;
scrollbar-width: thin;
}
#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;
min-height: fit-content !important;
overflow: 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;
@@ -379,6 +417,7 @@
/* Mark: toolbox as expanded */ /* Mark: toolbox as expanded */
#navigator-toolbox[zen-sidebar-expanded='true'] { #navigator-toolbox[zen-sidebar-expanded='true'] {
--zen-toolbox-min-width: fit-content; --zen-toolbox-min-width: fit-content;
--tab-icon-end-margin: 8.5px; --tab-icon-end-margin: 8.5px;
padding: var(--zen-toolbox-padding); padding: var(--zen-toolbox-padding);
padding-left: 0; padding-left: 0;
@@ -400,15 +439,10 @@
padding-right: 0; padding-right: 0;
:root[zen-single-toolbar='true'] & { :root[zen-single-toolbar='true'] & {
margin-left: var(--zen-toolbox-padding);
& #urlbar:not([breakout-extend='true']) .urlbar-input-container { & #urlbar:not([breakout-extend='true']) .urlbar-input-container {
padding-left: 4px; padding-left: 4px;
padding-right: 4px; padding-right: 4px;
} }
:root[zen-right-side='true'] & {
margin-left: 0;
}
} }
} }
@@ -460,11 +494,9 @@
padding-left: 0; padding-left: 0;
} }
&:not([zen-right-side='true']):not([zen-user-hover='true']) { &:not([zen-right-side='true']) {
padding-right: 0; padding-right: 0;
& #titlebar { padding-left: var(--zen-toolbox-padding);
padding-left: var(--zen-toolbox-padding);
}
} }
& #TabsToolbar-customization-target { & #TabsToolbar-customization-target {
@@ -473,10 +505,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;
@@ -521,11 +553,6 @@
} }
& .tab-background { & .tab-background {
@media not (prefers-color-scheme: dark) {
&:is([selected], [multiselected]) {
box-shadow: 0 .5px 1px rgba(0, 0, 0, 0.1);
}
}
margin-inline: var(--tab-block-margin); margin-inline: var(--tab-block-margin);
width: -moz-available; width: -moz-available;
} }
@@ -584,7 +611,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;
@@ -633,13 +659,6 @@
margin: 0 auto; margin: 0 auto;
& .tab-background { & .tab-background {
margin-inline: auto !important; margin-inline: auto !important;
&:is([selected], [multiselected]) {
box-shadow: 0 0 1px 1px rgba(0,0,0,.1);
@media not (prefers-color-scheme: dark) {
box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.12) !important;
}
}
} }
& .tab-reset-button { & .tab-reset-button {
display: none !important; display: none !important;
@@ -714,40 +733,38 @@
transition: opacity 0.2s ease-in-out; transition: opacity 0.2s ease-in-out;
background: var(--zen-colors-border); background: var(--zen-colors-border);
appearance: none; appearance: none;
&:hover {
opacity: 1;
}
} }
/* 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;
} }
@@ -763,7 +780,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);
@@ -831,6 +848,14 @@
:root[zen-single-toolbar='true'] & { :root[zen-single-toolbar='true'] & {
--toolbarbutton-inner-padding: calc(var(--zen-toolbar-button-inner-padding) - 2px) !important; --toolbarbutton-inner-padding: calc(var(--zen-toolbar-button-inner-padding) - 2px) !important;
& #PanelUI-button {
order: -2;
}
& #unified-extensions-button {
order: -1;
}
} }
& #zen-sidebar-top-buttons-customization-target { & #zen-sidebar-top-buttons-customization-target {
@@ -870,6 +895,7 @@
#tabs-newtab-button { #tabs-newtab-button {
display: none; display: none;
opacity: 0.5;
} }
@media (-moz-bool-pref: 'zen.tabs.show-newtab-vertical') { @media (-moz-bool-pref: 'zen.tabs.show-newtab-vertical') {
@@ -923,8 +949,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;
@@ -934,16 +959,21 @@
--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));
&[selected] .tab-background { &[selected] .tab-background {
box-shadow: 0 0 1px 1px light-dark(rgba(0, 0, 0, 0.07), rgba(0, 0, 0, 0.1)); box-shadow: 0 1px 1px 1px light-dark(rgba(0, 0, 0, 0.09), rgba(0, 0, 0, 0.1));
} }
&:not([selected], [multiselected="true"]) .tab-background { &: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: 1px solid light-dark(transparent, rgba(255, 255, 255, 0.05));
} }
& .tab-content { & .tab-content {
@@ -963,14 +993,52 @@
& .tab-icon-overlay { & .tab-icon-overlay {
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') {
&[selected] .tab-background {
&::after {
content: "";
inset: -50%;
filter: blur(15px);
position: absolute;
background-size: 100% 100%;
background-clip: padding-box;
background-image: var(--zen-tab-icon);
z-index: -1;
}
background: transparent;
overflow: hidden;
position: relative;
&::before {
background: light-dark(rgba(255, 255, 255, 0.85), rgba(68, 64, 64, 0.85));
margin: 2px;
border-radius: calc(var(--border-radius-medium) - 2px);
position: absolute;
inset: 0;
z-index: 0;
content: "";
transition: background 0.1s ease-in-out;
}
}
&[selected]:hover .tab-background::before {
background: light-dark(rgba(255, 255, 255, 0.80), rgba(68, 64, 64, 0.80));
}
}
} }
/* Very special occasions */ /* Very special occasions */
/* Mark: Right side windows controls with collapsed sidebar */ /* Mark: Right side windows controls with collapsed sidebar */
@media not (-moz-bool-pref: 'zen.view.compact') { :root:not([zen-compact-mode='true']) {
:root[zen-right-side='true']:not([zen-sidebar-expanded='true']):not([zen-window-buttons-reversed='true']) { &[zen-right-side='true']:not([zen-sidebar-expanded='true']):not([zen-window-buttons-reversed='true']) {
& #navigator-toolbox { & #navigator-toolbox {
margin-top: var(--zen-toolbar-height) !important; margin-top: var(--zen-toolbar-height) !important;
} }
@@ -994,7 +1062,7 @@
%include vertical-tabs-topbuttons-fix.css %include vertical-tabs-topbuttons-fix.css
} }
:root:not([zen-right-side='true']):not([zen-sidebar-expanded='true'])[zen-window-buttons-reversed='true'] { &:not([zen-right-side='true']):not([zen-sidebar-expanded='true'])[zen-window-buttons-reversed='true'] {
& #navigator-toolbox { & #navigator-toolbox {
margin-top: var(--zen-toolbar-height) !important; margin-top: var(--zen-toolbar-height) !important;
} }
@@ -1018,3 +1086,59 @@
%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));
}

View File

@@ -20,7 +20,7 @@
--zen-primary-color: #ffb787; --zen-primary-color: #ffb787;
/* Branding */ /* Branding */
--zen-branding-dark: #202020; --zen-branding-dark: #1d1d1d;
--zen-branding-coral: #f76f53; --zen-branding-coral: #f76f53;
--zen-branding-paper: #ebebeb; --zen-branding-paper: #ebebeb;
@@ -35,6 +35,7 @@
--zen-colors-hover-bg: color-mix(in srgb, var(--zen-primary-color) 90%, white 10%); --zen-colors-hover-bg: color-mix(in srgb, var(--zen-primary-color) 90%, white 10%);
--zen-colors-primary-foreground: var(--zen-branding-bg-reverse); --zen-colors-primary-foreground: var(--zen-branding-bg-reverse);
--zen-colors-border: color-mix(in srgb, var(--zen-colors-secondary) 97%, black 3%); --zen-colors-border: color-mix(in srgb, var(--zen-colors-secondary) 97%, black 3%);
--zen-colors-border-contrast: color-mix(in srgb, var(--zen-colors-secondary) 10%, rgba(181, 181, 181, 0.11) 90%);
--zen-colors-input-bg: color-mix(in srgb, var(--zen-primary-color) 1%, var(--zen-colors-tertiary) 99%); --zen-colors-input-bg: color-mix(in srgb, var(--zen-primary-color) 1%, var(--zen-colors-tertiary) 99%);
@@ -103,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(255, 255, 255, 0.4), rgba(170, 170, 170, 0.2)); --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;
@@ -126,11 +127,12 @@
--browser-area-z-index-toolbox: 2 !important; --browser-area-z-index-toolbox: 2 !important;
--zen-appcontent-border: 1px solid var(--zen-colors-border); --zen-appcontent-border: 1px solid var(--zen-colors-border);
--zen-panel-radius: var(--zen-border-radius);
--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,15 +148,14 @@
--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), var(--zen-colors-tertiary)); --zen-themed-toolbar-bg: light-dark(var(--zen-branding-bg), #161616);
--zen-themed-toolbar-bg-transparent: light-dark(var(--zen-branding-bg), var(--zen-colors-tertiary)); --zen-themed-toolbar-bg-transparent: light-dark(var(--zen-branding-bg), #161616);
@media (-moz-windows-mica) or (-moz-platform: macos) { @media (-moz-windows-mica) or (-moz-platform: macos) {
background: transparent; background: transparent;
@@ -168,7 +169,35 @@
--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: 0 0 1px 1px rgba(0, 0, 0, 0.1) !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));
/* Nativity */
--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-webview-border-radius,
/* Inner radius calculation:
* 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).
*/
max(5px, calc(var(--zen-native-content-radius) - var(--zen-element-separation) / 2))
);
/** Other theme-related styles */
@media (-moz-platform: macos) {
font-family:
SF Pro,
ui-sans-serif,
system-ui,
sans-serif,
Apple Color Emoji,
Segoe UI Emoji,
Segoe UI Symbol,
Noto Color Emoji;
}
} }
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
@@ -184,7 +213,8 @@
--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(43, 43, 43) 80%); --zen-colors-border: color-mix(in srgb, var(--zen-colors-secondary) 20%, rgb(53, 53, 53) 80%);
--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);
--zen-urlbar-background: color-mix(in srgb, var(--zen-primary-color) 4%, rgb(24, 24, 24) 96%); --zen-urlbar-background: color-mix(in srgb, var(--zen-primary-color) 4%, rgb(24, 24, 24) 96%);

View File

@@ -18,6 +18,10 @@
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,17 +32,13 @@
#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: 1px solid light-dark(transparent, rgba(255, 255, 255, 0.1)) !important;
margin: 1px; margin: 1px;
box-shadow: 0 0 1px 1px rgba(0, 0, 0, 0.1) !important; box-shadow: none !important;
:root[zen-single-toolbar='true'] & {
box-shadow: none !important;
}
} }
#urlbar[focused='true']:not([suppress-focus-border]) > #urlbar-background, #urlbar[focused='true']:not([suppress-focus-border]) > #urlbar-background,
@@ -50,7 +50,7 @@
#identity-box.chromeUI:not([pageproxystate='invalid']) { #identity-box.chromeUI:not([pageproxystate='invalid']) {
& #identity-icon-box { & #identity-icon-box {
background: light-dark(rgba(255, 255, 255, 0.3), rgba(255, 255, 255, 0.1)) !important; background: light-dark(rgba(0, 0, 0, 0.1), rgba(255, 255, 255, 0.1)) !important;
} }
& #identity-icon-label { & #identity-icon-label {
@@ -122,14 +122,16 @@
#urlbar[breakout-extend='true'] #urlbar-background { #urlbar[breakout-extend='true'] #urlbar-background {
border: 1px solid var(--zen-colors-border) !important; border: 1px solid var(--zen-colors-border) !important;
box-shadow: var(--zen-big-shadow) !important;
backdrop-filter: none !important;
} }
:root[zen-single-toolbar='true'] { :root[zen-single-toolbar='true'] {
.urlbar-page-action:not(#star-button-box):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(-16px - 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) {
@@ -232,9 +234,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: 2px;
}
#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) {
@@ -360,6 +376,7 @@ button.popup-notification-dropmarker {
} }
#urlbar[open] { #urlbar[open] {
z-index: 2;
--urlbar-margin-inline: 5px !important; --urlbar-margin-inline: 5px !important;
& #identity-box { & #identity-box {
@@ -371,15 +388,12 @@ button.popup-notification-dropmarker {
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(rgb(247, 247, 247), var(--zen-branding-bg)) !important;
box-shadow: 0 0 1px 1px light-dark(rgba(0, 0, 0, 0.05), rgba(0, 0, 0, 0.1)) !important;
outline: 1px solid light-dark(rgba(20, 20, 20, 0.2), rgba(235, 235, 235, 0.2)) !important;
outline-offset: -1px !important;
} }
} }
:root[zen-single-toolbar='true'] { :root[zen-single-toolbar='true'] {
#urlbar[open] { #urlbar[open] {
min-width: 30vw; min-width: 40vw;
} }
&[zen-right-side='true'] #urlbar[open]:not([zen-floating-urlbar='true']) { &[zen-right-side='true'] #urlbar[open]:not([zen-floating-urlbar='true']) {
@@ -396,14 +410,17 @@ button.popup-notification-dropmarker {
--urlbar-margin-inline: 10px !important; --urlbar-margin-inline: 10px !important;
position: absolute; position: absolute;
font-size: 1.15em !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(&) {

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,
@@ -457,6 +452,27 @@
align-items: center; align-items: center;
position: relative; position: relative;
&::before {
border-radius: var(--border-radius-medium);
background: transparent;
transition: background 0.1s;
pointer-events: none;
content: '';
position: absolute;
top: 6px;
left: 2px;
z-index: -1;
width: calc(100% - 4px);
height: calc(100% - 12px);
}
&:hover,
&[open='true'] {
&::before {
background: var(--tab-hover-background-color);
}
}
& #zen-current-workspace-indicator-icon { & #zen-current-workspace-indicator-icon {
font-size: 14px; font-size: 14px;
} }
@@ -474,6 +490,10 @@
max-width: calc(100% - var(--zen-toolbox-padding) * 4); 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 { & #zen-current-workspace-indicator-icon:not([hidden]) + #zen-current-workspace-indicator-name {
padding-left: 24px; padding-left: 24px;
} }

View File

@@ -0,0 +1 @@
const drawSquircle=(ctx,geom,radii,smooth,lineWidth,color)=>{const defaultFill=color;const lineWidthOffset=lineWidth/2;ctx.beginPath();ctx.lineTo(radii[0],lineWidthOffset);ctx.lineTo(geom.width-radii[1],lineWidthOffset);ctx.bezierCurveTo(geom.width-radii[1]/smooth,lineWidthOffset,geom.width-lineWidthOffset,radii[1]/smooth,geom.width-lineWidthOffset,radii[1]);ctx.lineTo(geom.width-lineWidthOffset,geom.height-radii[2]);ctx.bezierCurveTo(geom.width-lineWidthOffset,geom.height-radii[2]/smooth,geom.width-radii[2]/smooth,geom.height-lineWidthOffset,geom.width-radii[2],geom.height-lineWidthOffset);ctx.lineTo(radii[3],geom.height-lineWidthOffset);ctx.bezierCurveTo(radii[3]/smooth,geom.height-lineWidthOffset,lineWidthOffset,geom.height-radii[3]/smooth,lineWidthOffset,geom.height-radii[3]);ctx.lineTo(lineWidthOffset,radii[0]);ctx.bezierCurveTo(lineWidthOffset,radii[0]/smooth,radii[0]/smooth,lineWidthOffset,radii[0],lineWidthOffset);ctx.closePath();if(lineWidth){ctx.strokeStyle=defaultFill;ctx.lineWidth=lineWidth;ctx.stroke()}else{ctx.fillStyle=defaultFill;ctx.fill()}};class SquircleClass{static get contextOptions(){return{alpha:true}}static get inputProperties(){return["--squircle-radius","--squircle-radius-top-left","--squircle-radius-top-right","--squircle-radius-bottom-right","--squircle-radius-bottom-left","--squircle-smooth","--squircle-outline","--squircle-fill"]}paint(ctx,geom,properties){const smoothRatio=10;const distanceRatio=1.8;const squircleSmooth=parseFloat(properties.get("--squircle-smooth")*smoothRatio);const individualRadiiProps=SquircleClass.inputProperties.slice(1,5);let squircleRadii=individualRadiiProps.map(prop=>{const value=properties.get(prop);return value?parseInt(value,10)*distanceRatio:NaN});let shorthand_R;if(squircleRadii.some(isNaN)){const radiusRegex=/([0-9]+[a-z%]*)/g;const radius_shorthand=properties.get("--squircle-radius").toString();const matches=radius_shorthand.match(radiusRegex);if(matches){shorthand_R=matches.map(val=>parseInt(val,10)*distanceRatio);while(shorthand_R.length<4){if(shorthand_R.length===1){shorthand_R.push(shorthand_R[0])}else if(shorthand_R.length===2){shorthand_R=[shorthand_R[0],shorthand_R[1],shorthand_R[0],shorthand_R[1]]}else if(shorthand_R.length===3){shorthand_R=[shorthand_R[0],shorthand_R[1],shorthand_R[2],shorthand_R[1]]}}}else{const defaultRadius=squircleRadii.every(isNaN)?8*distanceRatio:0;shorthand_R=[defaultRadius,defaultRadius,defaultRadius,defaultRadius]}}squircleRadii=squircleRadii.map((val,i)=>isNaN(val)?shorthand_R[i]:val);const squrcleOutline=parseFloat(properties.get("--squircle-outline"),10);const squrcleColor=properties.get("--squircle-fill").toString();const isSmooth=()=>{if(typeof properties.get("--squircle-smooth")[0]!=="undefined"){if(squircleSmooth===0){return 1}return squircleSmooth}else{return 10}};const isOutline=()=>{if(squrcleOutline){return squrcleOutline}else{return 0}};const isColor=()=>{if(squrcleColor){return squrcleColor}else{return"#f45"}};const maxRadius=Math.max(...squircleRadii);if(maxRadius<geom.width/2&&maxRadius<geom.height/2){drawSquircle(ctx,geom,squircleRadii,isSmooth(),isOutline(),isColor())}else{const minRadius=Math.min(geom.width/2,geom.height/2);drawSquircle(ctx,geom,squircleRadii.map(()=>minRadius),isSmooth(),isOutline(),isColor())}}}if(typeof registerPaint!=="undefined"){registerPaint("squircle",SquircleClass)}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

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.view.compact', this._updateEvent.bind(this));
Services.prefs.addObserver('zen.view.sidebar-expanded.on-hover', this._disableTabsOnHoverIfConflict.bind(this));
Services.prefs.addObserver('zen.tabs.vertical.right-side', this._updateSidebarIsOnRight.bind(this)); Services.prefs.addObserver('zen.tabs.vertical.right-side', this._updateSidebarIsOnRight.bind(this));
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'));
@@ -33,12 +39,26 @@ var gZenCompactModeManager = {
this.addContextMenu(); this.addContextMenu();
}, },
get prefefence() { get preference() {
return Services.prefs.getBoolPref('zen.view.compact'); if (!document.documentElement.hasAttribute('zen-compact-mode')) {
document.documentElement.setAttribute(
'zen-compact-mode',
lazyCompactMode.mainAppWrapper.getAttribute('zen-compact-mode')
);
}
return lazyCompactMode.mainAppWrapper.getAttribute('zen-compact-mode') === 'true';
}, },
set preference(value) { set preference(value) {
Services.prefs.setBoolPref('zen.view.compact', value); if (this.preference === value || this._animating) {
// We dont want the user to be able to spam the button
return value;
}
// 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
lazyCompactMode.mainAppWrapper.setAttribute('zen-compact-mode', value);
document.documentElement.setAttribute('zen-compact-mode', value);
this._updateEvent();
return value; return value;
}, },
@@ -58,7 +78,7 @@ var gZenCompactModeManager = {
}, },
flashSidebarIfNecessary(aInstant = false) { flashSidebarIfNecessary(aInstant = false) {
if (!aInstant && this.prefefence && lazyCompactMode.COMPACT_MODE_FLASH_ENABLED && !gZenGlanceManager._animating) { if (!aInstant && this.preference && lazyCompactMode.COMPACT_MODE_FLASH_ENABLED && !gZenGlanceManager._animating) {
this.flashSidebar(); this.flashSidebar();
} }
}, },
@@ -80,8 +100,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',
@@ -113,7 +131,6 @@ var gZenCompactModeManager = {
_updateEvent() { _updateEvent() {
this._evenListeners.forEach((callback) => callback()); this._evenListeners.forEach((callback) => callback());
this._disableTabsOnHoverIfConflict();
this.updateContextMenu(); this.updateContextMenu();
this.animateCompactMode(); this.animateCompactMode();
}, },
@@ -127,107 +144,98 @@ var gZenCompactModeManager = {
}, },
animateCompactMode() { animateCompactMode() {
const isCompactMode = this.prefefence; this._animating = true;
const isCompactMode = this.preference;
const canHideSidebar = Services.prefs.getBoolPref('zen.view.compact.hide-tabbar'); const canHideSidebar = Services.prefs.getBoolPref('zen.view.compact.hide-tabbar');
if (this._isAnimating) { const canAnimate =
return; lazyCompactMode.COMPACT_MODE_CAN_ANIMATE_SIDEBAR &&
} !this.sidebar.hasAttribute('zen-user-show') &&
this._isAnimating = true; !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');
} }
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._isAnimating = false; this._animating = false;
return; return;
} }
if (canHideSidebar && isCompactMode) { if (canHideSidebar && isCompactMode) {
window.requestAnimationFrame(() => { gZenUIManager.motion
this.sidebar.style.position = 'unset'; .animate(
this.sidebar.style.transition = 'margin .4s ease'; this.sidebar,
this.sidebar.style.left = '0'; this.sidebarIsOnRight
if (!this.sidebarIsOnRight) { ? {
this.sidebar.style.marginLeft = `${-1 * sidebarWidth}px`; marginRight: `-${sidebarWidth}px`,
} else { }
this.sidebar.style.marginRight = `${-1 * sidebarWidth}px`; : { marginLeft: `-${sidebarWidth}px` },
} {
this.sidebar.style.pointerEvents = 'none'; ease: 'easeIn',
type: 'spring',
window.requestAnimationFrame(() => { bounce: 0,
duration: 0.2,
}
)
.then(() => {
this.sidebar.removeAttribute('animate');
this.sidebar.style.removeProperty('margin-right');
this.sidebar.style.removeProperty('margin-left');
this.sidebar.style.removeProperty('transform');
this.sidebar.style.transition = 'none';
setTimeout(() => { setTimeout(() => {
window.requestAnimationFrame(() => { this._animating = false;
this.sidebar.style.removeProperty('pointer-events'); this.sidebar.style.removeProperty('transition');
this.sidebar.style.removeProperty('position'); }, 100);
this.sidebar.style.removeProperty('margin-left');
this.sidebar.style.removeProperty('margin-right');
this.sidebar.style.removeProperty('transform');
this.sidebar.style.removeProperty('left');
document.getElementById('browser').style.removeProperty('overflow');
this.sidebar.removeAttribute('animate');
window.requestAnimationFrame(() => {
this.sidebar.style.removeProperty('transition');
this._isAnimating = false;
});
});
}, 450);
}); });
});
} else if (canHideSidebar && !isCompactMode) { } else if (canHideSidebar && !isCompactMode) {
document.getElementById('browser').style.overflow = 'hidden'; document.getElementById('browser').style.overflow = 'hidden';
this.sidebar.style.position = 'relative'; if (this.sidebarIsOnRight) {
this.sidebar.style.left = '0'; this.sidebar.style.marginRight = `-${sidebarWidth}px`;
if (!this.sidebarIsOnRight) {
this.sidebar.style.marginLeft = `${-1 * sidebarWidth}px`;
} else { } else {
this.sidebar.style.marginRight = `${-1 * sidebarWidth}px`; this.sidebar.style.marginLeft = `-${sidebarWidth}px`;
this.sidebar.style.transform = `translateX(${sidebarWidth}px)`;
} }
gZenUIManager.motion
window.requestAnimationFrame(() => { .animate(
this.sidebar.style.transition = 'margin .3s ease, transform .275s ease, opacity .3s ease'; this.sidebar,
// we are in compact mode and we are exiting it this.sidebarIsOnRight
if (!this.sidebarIsOnRight) { ? {
this.sidebar.style.marginLeft = '0'; marginRight: 0,
} else { transform: ['translateX(100%)', 'translateX(0)'],
this.sidebar.style.marginRight = '0'; }
this.sidebar.style.transform = 'translateX(0)'; : { marginLeft: 0 },
} {
this.sidebar.style.pointerEvents = 'none'; ease: 'easeOut',
type: 'spring',
setTimeout(() => { bounce: 0,
window.requestAnimationFrame(() => { duration: 0.2,
this._isAnimating = false; }
this.sidebar.style.removeProperty('position'); )
this.sidebar.style.removeProperty('pointer-events'); .then(() => {
this.sidebar.style.removeProperty('opacity'); this.sidebar.removeAttribute('animate');
this.sidebar.style.removeProperty('margin-left'); document.getElementById('browser').style.removeProperty('overflow');
this.sidebar.style.removeProperty('margin-right'); this.sidebar.style.transition = 'none';
this.sidebar.style.removeProperty('transform'); this.sidebar.style.removeProperty('margin-right');
this.sidebar.style.removeProperty('margin-left');
this.sidebar.style.removeProperty('transform');
this._animating = false;
setTimeout(() => {
this.sidebar.style.removeProperty('transition'); this.sidebar.style.removeProperty('transition');
this.sidebar.style.removeProperty('left');
document.getElementById('browser').style.removeProperty('overflow');
this.sidebar.removeAttribute('animate');
}); });
}, 400); });
});
} 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;
} }
}); });
}, },
updateContextMenu() { updateContextMenu() {
document document.getElementById('zen-context-menu-compact-mode-toggle').setAttribute('checked', this.preference);
.getElementById('zen-context-menu-compact-mode-toggle')
.setAttribute('checked', Services.prefs.getBoolPref('zen.view.compact'));
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-';
@@ -244,14 +252,8 @@ var gZenCompactModeManager = {
} }
}, },
_disableTabsOnHoverIfConflict() {
if (Services.prefs.getBoolPref('zen.view.compact') && Services.prefs.getBoolPref('zen.view.compact.hide-tabbar')) {
Services.prefs.setBoolPref('zen.view.sidebar-expanded.on-hover', false);
}
},
toggle() { toggle() {
return (this.preference = !this.prefefence); return (this.preference = !this.preference);
}, },
_updateSidebarIsOnRight() { _updateSidebarIsOnRight() {
@@ -274,6 +276,7 @@ var gZenCompactModeManager = {
{ {
element: this.sidebar, element: this.sidebar,
screenEdge: this.sidebarIsOnRight ? 'right' : 'left', screenEdge: this.sidebarIsOnRight ? 'right' : 'left',
keepHoverDuration: 100,
}, },
{ {
element: document.getElementById('zen-appcontent-navbar-container'), element: document.getElementById('zen-appcontent-navbar-container'),
@@ -315,6 +318,7 @@ var gZenCompactModeManager = {
for (let i = 0; i < this.hoverableElements.length; i++) { for (let i = 0; i < this.hoverableElements.length; i++) {
let target = this.hoverableElements[i].element; let target = this.hoverableElements[i].element;
target.addEventListener('mouseenter', (event) => { target.addEventListener('mouseenter', (event) => {
if (!event.target.matches(':hover')) return;
this.clearFlashTimeout('has-hover' + target.id); this.clearFlashTimeout('has-hover' + target.id);
window.requestAnimationFrame(() => target.setAttribute('zen-has-hover', 'true')); window.requestAnimationFrame(() => target.setAttribute('zen-has-hover', 'true'));
}); });
@@ -334,8 +338,8 @@ var gZenCompactModeManager = {
return; return;
} }
if (this.hoverableElements[i].keepHoverDuration) { if (this.hoverableElements[i].keepHoverDuration && !event.target.querySelector('#urlbar[zen-floating-urlbar]')) {
this.flashElement(target, 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) + 1;
}
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,229 +138,390 @@
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);
this.browserWrapper.style.setProperty('--initial-x', `${initialX}px`);
this.browserWrapper.style.setProperty('--initial-y', `${initialY}px`);
this.browserWrapper.style.setProperty('--initial-width', initialWidth + 'px');
this.browserWrapper.style.setProperty('--initial-height', initialHeight + 'px');
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);
setTimeout(() => { const top = initialY + initialHeight / 2;
this.browserWrapper.setAttribute('animate-end', true); const left = initialX + initialWidth / 2;
this.browserWrapper.setAttribute('has-finished-animation', true); this.browserWrapper.style.top = `${top}px`;
this._animating = false; this.browserWrapper.style.left = `${left}px`;
this.animatingOpen = false; this.browserWrapper.style.width = `${initialWidth}px`;
}, 500); this.browserWrapper.style.height = `${initialHeight}px`;
this.browserWrapper.style.opacity = 0.8;
this.#glances.get(this.#currentGlanceID).originalPosition = {
top: this.browserWrapper.style.top,
left: this.browserWrapper.style.left,
width: this.browserWrapper.style.width,
height: this.browserWrapper.style.height,
};
this.browserWrapper.style.transform = 'translate(-50%, -50%)';
this.overlay.style.overflow = 'visible';
gZenUIManager.motion
.animate(
this.browserWrapper,
{
top: '50%',
left: '50%',
width: '85%',
height: '100%',
opacity: 1,
},
{
duration: 0.3,
type: 'spring',
bounce: 0.2,
}
)
.then(() => {
this.#currentBrowser.removeAttribute('animate-glance-open');
this.overlay.style.removeProperty('overflow');
this.browserWrapper.removeAttribute('animate');
this.browserWrapper.setAttribute('animate-end', true);
this.browserWrapper.setAttribute('has-finished-animation', true);
this._animating = false;
this.animatingOpen = false;
});
}); });
} }
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 });
} }
} }
manageTabClose(tab) {
if (tab.hasAttribute('glance-id')) {
const oldGlanceID = this.#currentGlanceID;
const newGlanceID = tab.getAttribute('glance-id');
this.#currentGlanceID = newGlanceID;
const isDifferent = newGlanceID !== oldGlanceID;
if (this._ignoreClose) {
this._ignoreClose = false;
return false;
}
this.closeGlance({ onTabClose: true, setNewID: isDifferent ? oldGlanceID : null, isDifferent });
// only keep continueing tab close if we are not on the currently selected tab
return !isDifferent;
}
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() { fullyOpenGlance() {
this.animatingFullOpen = true;
gBrowser._insertTabAtIndex(this.#currentTab, { gBrowser._insertTabAtIndex(this.#currentTab, {
index: this.#currentTab._tPos + 1, index: this.getTabPosition(this.#currentTab),
}); });
this.animatingFullOpen = true; this.#currentParentTab._visuallySelected = false;
this.currentParentTab._visuallySelected = false;
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.hideSidebarButtons();
window.requestAnimationFrame(() => { gZenUIManager.motion
this.browserWrapper.setAttribute('animate-full-end', true); .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) {
@@ -334,6 +555,10 @@
return false; return false;
} }
getFocusedTab(aDir) {
return aDir < 0 ? this.#currentParentTab : this.#currentTab;
}
} }
window.gZenGlanceManager = new ZenGlanceManager(); window.gZenGlanceManager = new ZenGlanceManager();

View File

@@ -246,51 +246,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) {
@@ -658,8 +613,8 @@
setTimeout(() => { setTimeout(() => {
// Reactivate the transition after the animation // Reactivate the transition after the animation
appWrapper.removeAttribute('post-animating'); appWrapper.removeAttribute('post-animating');
}); }, 100);
}, 700); }, 500);
}); });
} }

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',
@@ -315,12 +316,7 @@ class KeyShortcut {
static parseFromSaved(json) { static parseFromSaved(json) {
let rv = []; let rv = [];
for (let key of json) { for (let key of json) {
if (this.#shortcutIsValid(key)) { rv.push(this.#parseFromJSON(key));
rv.push(this.#parseFromJSON(key));
} else {
console.warn('[zen CKS]: Invalid shortcut', key['id']);
throw new Error('Invalid shortcut found');
}
} }
return rv; return rv;
@@ -338,12 +334,6 @@ class KeyShortcut {
return 'other'; return 'other';
} }
static #shortcutIsValid(shortcut) {
// See https://github.com/zen-browser/desktop/issues/4071, some *old* shortcuts dont have
// any of `key`, `keycode`, `l10nId`. This fix also allows us to avoid any future issues
return !(shortcut['key'] == '' && shortcut['keycode'] == '' && shortcut['l10nId'] == null);
}
static #parseFromJSON(json) { static #parseFromJSON(json) {
return new KeyShortcut( return new KeyShortcut(
json['id'], json['id'],
@@ -766,7 +756,7 @@ class ZenKeyboardShortcutsLoader {
} }
class ZenKeyboardShortcutsVersioner { class ZenKeyboardShortcutsVersioner {
static LATEST_KBS_VERSION = 7; static LATEST_KBS_VERSION = 8;
constructor() {} constructor() {}
@@ -820,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
@@ -918,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;
} }
} }
@@ -945,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();
@@ -1071,7 +1090,7 @@ var gZenKeyboardShortcutsManager = {
//} //}
for (let key of this._currentShortcutList) { for (let key of this._currentShortcutList) {
if (key.isEmpty() || key.isInternal() || key.isInvalid()) { if (key.isInternal()) {
continue; continue;
} }
let child = key.toXHTMLElement(browser); let child = key.toXHTMLElement(browser);

View File

@@ -47,10 +47,11 @@
} }
class ZenPinnedTabManager extends ZenDOMOperatedFeature { class ZenPinnedTabManager extends ZenDOMOperatedFeature {
init() { async init() {
if (!this.enabled) { if (!this.enabled) {
return; return;
} }
this._canLog = Services.prefs.getBoolPref('zen.pinned-tab-manager.debug', false);
this.observer = new ZenPinnedTabsObserver(); this.observer = new ZenPinnedTabsObserver();
this._initClosePinnedTabShortcut(); this._initClosePinnedTabShortcut();
this._insertItemsIntoTabContextMenu(); this._insertItemsIntoTabContextMenu();
@@ -58,6 +59,9 @@
this._zenClickEventListener = this._onTabClick.bind(this); this._zenClickEventListener = this._onTabClick.bind(this);
ZenWorkspaces.addChangeListeners(this.onWorkspaceChange.bind(this)); ZenWorkspaces.addChangeListeners(this.onWorkspaceChange.bind(this));
await ZenPinnedTabsStorage.promiseInitialized;
ZenWorkspaces._resolvePinnedInitialized();
} }
async onWorkspaceChange(newWorkspace, onInit) { async onWorkspaceChange(newWorkspace, onInit) {
@@ -68,6 +72,19 @@
await this._refreshPinnedTabs(newWorkspace, { init: onInit }); await this._refreshPinnedTabs(newWorkspace, { init: onInit });
} }
log(message) {
if (this._canLog) {
console.log(`[ZenPinnedTabManager] ${message}`);
}
}
onTabIconChanged(tab, url = null) {
const iconUrl = url ?? tab.iconImage.src;
if (tab.hasAttribute('zen-essential')) {
tab.querySelector('.tab-background').style.setProperty('--zen-tab-icon', `url(${iconUrl})`);
}
}
get enabled() { get enabled() {
if (typeof this._enabled === 'undefined') { if (typeof this._enabled === 'undefined') {
this._enabled = !( this._enabled = !(
@@ -118,6 +135,7 @@
this._pinsCache = []; this._pinsCache = [];
} }
this.log(`Initialized pins cache with ${this._pinsCache.length} pins`);
return this._pinsCache; return this._pinsCache;
} }
@@ -214,6 +232,7 @@
SessionStore.setTabState(newTab, state); SessionStore.setTabState(newTab, state);
} }
this.log(`Created new pinned tab for pin ${pin.uuid} (isEssential: ${pin.isEssential})`);
gBrowser.pinTab(newTab); gBrowser.pinTab(newTab);
newTab.initialize(); newTab.initialize();
@@ -308,6 +327,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);
} }
@@ -362,6 +385,7 @@
return; return;
} }
this.log(`Setting pinned attributes for tab ${tab.linkedBrowser.currentURI.spec}`);
const browser = tab.linkedBrowser; const browser = tab.linkedBrowser;
const uuid = gZenUIManager.generateUuidv4(); const uuid = gZenUIManager.generateUuidv4();
@@ -399,6 +423,11 @@
return; return;
} }
if (Services.startup.shuttingDown || window.skipNextCanClose) {
return;
}
this.log(`Removing pinned attributes for tab ${tab.getAttribute('zen-pin-id')}`);
await ZenPinnedTabsStorage.removePin(tab.getAttribute('zen-pin-id')); await ZenPinnedTabsStorage.removePin(tab.getAttribute('zen-pin-id'));
if (!isClosing) { if (!isClosing) {
@@ -421,7 +450,7 @@
} }
} }
_onCloseTabShortcut(event, selectedTab = gBrowser.selectedTab) { _onCloseTabShortcut(event, selectedTab = gBrowser.selectedTab, behavior = lazy.zenPinnedTabCloseShortcutBehavior) {
if (!selectedTab?.pinned) { if (!selectedTab?.pinned) {
return; return;
} }
@@ -429,8 +458,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);
@@ -445,7 +472,8 @@
this._resetTabToStoredState(selectedTab); this._resetTabToStoredState(selectedTab);
} }
if (behavior.includes('unload')) { if (behavior.includes('unload')) {
gBrowser.discardBrowser(selectedTab); gBrowser.explicitUnloadTabs([selectedTab]);
selectedTab.removeAttribute('linkedpanel');
} }
break; break;
case 'reset': case 'reset':
@@ -531,8 +559,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');
@@ -544,11 +572,13 @@
gBrowser.unpinTab(tab); gBrowser.unpinTab(tab);
} }
gBrowser.pinTab(tab); gBrowser.pinTab(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');
@@ -557,6 +587,7 @@
} }
gBrowser.unpinTab(tab); gBrowser.unpinTab(tab);
} }
gZenUIManager.updateTabsToolbar();
} }
_insertItemsIntoTabContextMenu() { _insertItemsIntoTabContextMenu() {
@@ -611,6 +642,162 @@
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');
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-browser-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;
}
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 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

@@ -45,6 +45,9 @@ var ZenPinnedTabsStorage = {
await db.execute(` await db.execute(`
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();
}); });
}, },
@@ -357,4 +360,7 @@ var ZenPinnedTabsStorage = {
}, },
}; };
ZenPinnedTabsStorage.init(); ZenPinnedTabsStorage.promiseInitialized = new Promise((resolve) => {
ZenPinnedTabsStorage._resolveInitialized = resolve;
ZenPinnedTabsStorage.init();
});

View File

@@ -173,7 +173,7 @@
} }
handleTabClose(tab) { handleTabClose(tab) {
// Nothing yet tab.lastActivity = null;
} }
handleTabOpen(tab) { handleTabOpen(tab) {
@@ -219,14 +219,14 @@
} }
unload(tab) { unload(tab) {
gBrowser.discardBrowser(tab); gBrowser.explicitUnloadTabs([tab]);
tab.removeAttribute('linkedpanel'); tab.removeAttribute('linkedpanel');
} }
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

@@ -1,176 +0,0 @@
const kZenAccentColorConfigKey = 'zen.theme.accent-color';
var gZenThemeBuilder = {
init() {
return; // TODO:
this._mouseMoveListener = this._handleThumbMouseMove.bind(this);
setTimeout(() => {
this._initBuilderUI();
}, 500);
},
get _builderWrapper() {
if (this.__builderWrapper) {
return this.__builderWrapper;
}
this.__builderWrapper = document.getElementById('zen-theme-builder-wrapper');
return this.__builderWrapper;
},
_initBuilderUI() {
let wrapper = this._builderWrapper;
if (!wrapper) {
return;
}
console.info('gZenThemeBuilder: init builder UI');
const kTemplate = `
<html:div id="zen-theme-builder">
<html:div id="zen-theme-builder-color-picker">
<html:canvas id="zen-theme-builder-color-picker-canvas"></html:canvas>
<html:div id="zen-theme-builder-color-picker-deck">
<html:div id="zen-theme-builder-color-picker-thumb"></html:div>
</html:div>
</html:div>
</html:div>
`;
wrapper.innerHTML = kTemplate;
this._initColorPicker();
},
_getPositionFromColor(ctx, color) {
var w = ctx.canvas.width,
h = ctx.canvas.height,
data = ctx.getImageData(0, 0, w, h), /// get image data
buffer = data.data, /// and its pixel buffer
len = buffer.length, /// cache length
x,
y = 0,
p,
px; /// for iterating
/// iterating x/y instead of forward to get position the easy way
for (; y < h; y++) {
/// common value for all x
p = y * 4 * w;
for (x = 0; x < w; x++) {
/// next pixel (skipping 4 bytes as each pixel is RGBA bytes)
px = p + x * 4;
/// if red component match check the others
if (buffer[px] === color[0]) {
if (buffer[px + 1] === color[1] && buffer[px + 2] === color[2]) {
return [x, y];
}
}
}
}
return null;
},
_hexToRgb(hex) {
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)];
},
_componentToHex(c) {
var hex = c.toString(16);
return hex.length == 1 ? '0' + hex : hex;
},
_rgbToHex(r, g, b) {
return '#' + this._componentToHex(r) + this._componentToHex(g) + this._componentToHex(b);
},
_initColorPicker() {
const canvas = document.getElementById('zen-theme-builder-color-picker-canvas');
const thumb = document.getElementById('zen-theme-builder-color-picker-thumb');
// A all the main colors are all blended together towards the center.
// But we also add some random gradients to make it look more interesting.
// Instead of using a simple gradient, we use a radial gradient.
const ctx = canvas.getContext('2d');
const size = 180;
canvas.width = size;
canvas.height = size;
const center = size / 2;
const radius = size / 2;
const gradient = ctx.createConicGradient(0, center, center);
gradient.addColorStop(0, '#fff490');
gradient.addColorStop(1 / 12, '#f9e380');
gradient.addColorStop(2 / 12, '#fecc87');
gradient.addColorStop(3 / 12, '#ffa894');
gradient.addColorStop(4 / 12, '#f98089');
gradient.addColorStop(5 / 12, '#f9b7c5');
gradient.addColorStop(6 / 12, '#c193b8');
gradient.addColorStop(7 / 12, '#a8b7e0');
gradient.addColorStop(8 / 12, '#88d2f9');
gradient.addColorStop(9 / 12, '#81e8e5');
gradient.addColorStop(10 / 12, '#b7e5a5');
gradient.addColorStop(11 / 12, '#eaefac');
gradient.addColorStop(1, '#fff490');
const radialGradient = ctx.createRadialGradient(size / 2, size / 2, 0, size / 2, size / 2, size / 2);
radialGradient.addColorStop(0, 'rgba(255,255,255,1)');
radialGradient.addColorStop(1, 'rgba(255,255,255,0)');
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, size, size);
//ctx.fillStyle = radialGradient;
//ctx.fillRect(0, 0, size, size);
// Add the thumb.
const accentColor = Services.prefs.getStringPref(kZenAccentColorConfigKey, '#ffb787');
const pos = this._getPositionFromColor(ctx, this._hexToRgb(accentColor));
let x = pos ? pos[0] : center;
let y = pos ? pos[1] : center;
thumb.style.left = `${x}px`;
thumb.style.top = `${y}px`;
thumb.addEventListener('mousedown', this._handleThumbMouseDown.bind(this));
document.addEventListener('mouseup', this._handleThumbMouseUp.bind(this));
},
_handleThumbMouseDown(e) {
document.addEventListener('mousemove', this._mouseMoveListener);
},
_handleThumbMouseUp(e) {
document.removeEventListener('mousemove', this._mouseMoveListener);
},
_handleThumbMouseMove(e) {
const kThumbOffset = 15;
const deck = document.getElementById('zen-theme-builder-color-picker-deck');
const thumb = document.getElementById('zen-theme-builder-color-picker-thumb');
const rect = deck.getBoundingClientRect();
let x = e.clientX - rect.left;
let y = e.clientY - rect.top;
if (x > rect.width - kThumbOffset) {
x = rect.width - kThumbOffset;
}
if (y > rect.height - kThumbOffset) {
y = rect.height - kThumbOffset;
}
if (x < kThumbOffset) {
x = kThumbOffset;
}
if (y < kThumbOffset) {
y = kThumbOffset;
}
thumb.style.left = `${x}px`;
thumb.style.top = `${y}px`;
const canvas = document.getElementById('zen-theme-builder-color-picker-canvas');
const ctx = canvas.getContext('2d');
const imageData = ctx.getImageData(x, y, 1, 1);
// Update the accent color.
Services.prefs.setStringPref(kZenAccentColorConfigKey, this._rgbToHex(...imageData.data));
},
};

View File

@@ -0,0 +1,60 @@
{
const PREF_NAME = 'zen.migration.version';
const MIGRATION_VERSION = 1;
class ZenUIMigration {
init() {
if (Services.prefs.prefHasUserValue(PREF_NAME)) {
this._migrate();
}
this.clearVariables();
}
get _migrationVersion() {
return Services.prefs.getIntPref(PREF_NAME, 0);
}
set _migrationVersion(value) {
Services.prefs.setIntPref(PREF_NAME, value);
}
_migrate() {
if (this._migrationVersion < 1) {
this._migrateV1();
}
}
clearVariables() {
this._migrationVersion = MIGRATION_VERSION;
window.gZenUIMigration = null;
}
async _migrateV1() {
// Introduction of the new URL bar, show a message to the user
const notification = gNotificationBox.appendNotification(
'zen-new-urlbar-notification',
{
label: { 'l10n-id': 'zen-new-urlbar-notification' },
image: 'chrome://browser/skin/notification-icons/persistent-storage-blocked.svg',
priority: 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;
}
}
window.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',
@@ -21,6 +20,18 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
'BMB_mobileBookmarks', 'BMB_mobileBookmarks',
]; ];
promiseDBInitialized = new Promise((resolve) => {
this._resolveDBInitialized = resolve;
});
promisePinnedInitialized = new Promise((resolve) => {
this._resolvePinnedInitialized = resolve;
});
async waitForPromises() {
await Promise.all([this.promiseDBInitialized, this.promisePinnedInitialized, SessionStore.promiseAllWindowsRestored]);
}
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').setAttribute('hidden', 'true');
@@ -66,6 +77,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
if (!this.workspaceEnabled) { if (!this.workspaceEnabled) {
return; return;
} }
await this.waitForPromises();
await this.initializeWorkspaces(); await this.initializeWorkspaces();
console.info('ZenWorkspaces: ZenWorkspaces initialized'); console.info('ZenWorkspaces: ZenWorkspaces initialized');
@@ -101,6 +113,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;
@@ -125,14 +141,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
@@ -199,7 +207,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) {
@@ -223,7 +234,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
this._swipeState = { this._swipeState = {
isGestureActive: true, isGestureActive: true,
cumulativeDelta: 0, lastDelta: 0,
direction: null, direction: null,
}; };
} }
@@ -234,12 +245,19 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
// Update cumulative delta const delta = event.delta * 500;
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));
for (const element of this._animateTabsElements) {
element.style.transform = `translateX(${translateX}px)`;
} }
} }
@@ -254,12 +272,14 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
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);
} 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,
}; };
} }
@@ -376,7 +396,6 @@ 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));
await SessionStore.promiseInitialized;
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) {
@@ -391,11 +410,11 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
activeWorkspace = workspaces.workspaces[0]; activeWorkspace = workspaces.workspaces[0];
this.activeWorkspace = activeWorkspace?.uuid; this.activeWorkspace = activeWorkspace?.uuid;
} }
await this.changeWorkspace(activeWorkspace, true);
} }
try { try {
if (activeWorkspace) { if (activeWorkspace) {
window.gZenThemePicker = new ZenThemePicker(); window.gZenThemePicker = new ZenThemePicker();
await this.changeWorkspace(activeWorkspace, { onInit: true });
} }
} catch (e) { } catch (e) {
console.error('ZenWorkspaces: Error initializing theme picker', e); console.error('ZenWorkspaces: Error initializing theme picker', e);
@@ -415,6 +434,10 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
indicator.addEventListener('click', th); indicator.addEventListener('click', th);
} }
shouldCloseWindow() {
return !window.toolbar.visible || Services.prefs.getBoolPref('browser.tabs.closeWindowWithLastTab');
}
handleTabBeforeClose(tab) { handleTabBeforeClose(tab) {
if (!this.workspaceEnabled || this.__contextIsDelete) { if (!this.workspaceEnabled || this.__contextIsDelete) {
return null; return null;
@@ -425,17 +448,33 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
return null; return null;
} }
const shouldOpenNewTabIfLastUnpinnedTabIsClosed = this.shouldOpenNewTabIfLastUnpinnedTabIsClosed; let tabs = gBrowser.visibleTabs;
let tabsPinned = tabs.filter((t) => !this.shouldOpenNewTabIfLastUnpinnedTabIsClosed || !t.pinned);
let tabs = gBrowser.tabs.filter(
(t) =>
t.getAttribute('zen-workspace-id') === workspaceID &&
(!shouldOpenNewTabIfLastUnpinnedTabIsClosed || !t.pinned || t.getAttribute('pending') !== 'true')
);
const shouldCloseWindow = this.shouldCloseWindow();
if (tabs.length === 1 && tabs[0] === tab) { if (tabs.length === 1 && tabs[0] === tab) {
let newTab = this._createNewTabForWorkspace({ uuid: workspaceID }); if (shouldCloseWindow) {
return newTab; // We've already called beforeunload on all the relevant tabs if we get here,
// so avoid calling it again:
window.skipNextCanClose = true;
// Closing the tab and replacing it with a blank one is notably slower
// than closing the window right away. If the caller opts in, take
// the fast path.
if (!gBrowser._removingTabs.size) {
// This call actually closes the window, unless the user
// cancels the operation. We are finished here in both cases.
this._isClosingWindow = true;
// Inside a setTimeout to avoid reentrancy issues.
setTimeout(() => {
document.getElementById('cmd_closeWindow').doCommand();
}, 100);
return this._createNewTabForWorkspace({ uuid: workspaceID });
}
return null;
}
} else if (tabsPinned.length === 1 && tabsPinned[0] === tab) {
return this._createNewTabForWorkspace({ uuid: workspaceID });
} }
return null; return null;
@@ -1022,25 +1061,10 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
} }
let button = browser.document.getElementById('zen-workspaces-button'); let button = browser.document.getElementById('zen-workspaces-button');
if (!button) {
button = browser.document.createXULElement('toolbarbutton');
button.id = 'zen-workspaces-button';
let navbar = browser.document.getElementById('nav-bar');
navbar.appendChild(button);
}
while (button.firstChild) { while (button.firstChild) {
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;
@@ -1050,7 +1074,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) {
@@ -1247,7 +1270,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
this._changeListeners.push(func); this._changeListeners.push(func);
} }
async changeWorkspace(window, onInit = false) { async changeWorkspace(window, ...args) {
if (!this.workspaceEnabled || this._inChangingWorkspace) { if (!this.workspaceEnabled || this._inChangingWorkspace) {
return; return;
} }
@@ -1255,15 +1278,39 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
await SessionStore.promiseInitialized; await SessionStore.promiseInitialized;
this._inChangingWorkspace = true; this._inChangingWorkspace = true;
try { try {
await this._performWorkspaceChange(window, onInit); await this._performWorkspaceChange(window, ...args);
} finally { } finally {
this._inChangingWorkspace = false; this._inChangingWorkspace = false;
this.tabContainer.removeAttribute('dont-animate-tabs'); this.tabContainer.removeAttribute('dont-animate-tabs');
} }
} }
async _performWorkspaceChange(window, onInit) { _cancelSwipeAnimation() {
const existingTransform = this._animateTabsElements[0].style.transform;
const newTransform = 'translateX(0)';
for (const element of this._animateTabsElements) {
gZenUIManager.motion.animate(
element,
{
transform: existingTransform ? [existingTransform, newTransform] : newTransform,
},
{
type: 'spring',
bounce: 0,
duration: 0.12,
}
);
}
}
async _performWorkspaceChange(window, { onInit = false, alwaysChange = false, explicitAnimationDirection = undefined } = {}) {
const previousWorkspace = await this.getActiveWorkspace(); const previousWorkspace = await this.getActiveWorkspace();
alwaysChange = alwaysChange || onInit;
if (previousWorkspace && previousWorkspace.uuid === window.uuid && !alwaysChange) {
this._cancelSwipeAnimation();
return;
}
this.activeWorkspace = window.uuid; this.activeWorkspace = window.uuid;
const containerId = window.containerTabId?.toString(); const containerId = window.containerTabId?.toString();
@@ -1272,32 +1319,74 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
// Refresh tab cache // Refresh tab cache
this.tabContainer._invalidateCachedTabs(); this.tabContainer._invalidateCachedTabs();
let animationDirection;
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); const visibleTabs = this._processTabVisibility(window.uuid, containerId, workspaces);
// Second pass: Handle tab selection // Second pass: Handle tab selection
await this._handleTabSelection(window, onInit, visibleTabs, containerId, workspaces); await this._handleTabSelection(window, onInit, visibleTabs, containerId, workspaces, previousWorkspace.uuid);
// Update UI and state // Update UI and state
await this._updateWorkspaceState(window, onInit); await this._updateWorkspaceState(window, onInit);
// Animate acordingly if (animationDirection) {
if (previousWorkspace && !this._animatingChange) { await this._animateTabs(animationDirection);
// we want to know if we are moving forward or backward in sense of animation
let isNextWorkspace =
onInit ||
workspaces.workspaces.findIndex((w) => w.uuid === previousWorkspace.uuid) <
workspaces.workspaces.findIndex((w) => w.uuid === window.uuid);
gBrowser.tabContainer.setAttribute('zen-workspace-animation', isNextWorkspace ? 'next' : 'previous');
this.tabContainer.removeAttribute('dont-animate-tabs');
this._animatingChange = true;
setTimeout(() => {
this._animatingChange = false;
gBrowser.tabContainer.removeAttribute('zen-workspace-animation');
}, 600);
} }
} }
get _animateTabsElements() {
const selector = `#zen-browser-tabs-wrapper`;
const extraSelector = `#zen-current-workspace-indicator`;
return [...this.tabContainer.querySelectorAll(selector), ...this.tabContainer.querySelectorAll(extraSelector)];
}
async _animateTabs(direction, out = false) {
this.tabContainer.removeAttribute('dont-animate-tabs');
const tabsWidth = this.tabContainer.getBoundingClientRect().width;
// order by actual position in the children list to animate
const elements = this._animateTabsElements;
if (out) {
const existingTransform = elements[0].style.transform;
const newTransform = `translateX(${direction === 'left' ? '-' : ''}${tabsWidth}px)`;
return gZenUIManager.motion.animate(
elements,
{
transform: existingTransform ? [existingTransform, newTransform] : newTransform,
},
{
type: 'spring',
bounce: 0,
duration: 0.12,
}
);
}
return gZenUIManager.motion.animate(
elements,
{
transform: [`translateX(${direction === 'left' ? '-' : ''}${tabsWidth}px)`, 'translateX(0px)'],
},
{
duration: 0.15,
type: 'spring',
bounce: 0,
}
);
}
_processTabVisibility(workspaceUuid, containerId, workspaces) { _processTabVisibility(workspaceUuid, containerId, workspaces) {
const visibleTabs = new Set(); const visibleTabs = new Set();
const lastSelectedTab = this._lastSelectedWorkspaceTabs[workspaceUuid]; const lastSelectedTab = this._lastSelectedWorkspaceTabs[workspaceUuid];
@@ -1365,9 +1454,9 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
return tabWorkspaceId === workspaceUuid; return tabWorkspaceId === workspaceUuid;
} }
async _handleTabSelection(window, onInit, visibleTabs, containerId, workspaces) { async _handleTabSelection(window, onInit, visibleTabs, 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
@@ -1524,7 +1613,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
} }
async onLocationChange(browser) { async onLocationChange(browser) {
if (!this.workspaceEnabled || this._inChangingWorkspace) { if (!this.workspaceEnabled || this._inChangingWorkspace || this._isClosingWindow) {
return; return;
} }
@@ -1663,7 +1752,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
} }
let nextWorkspace = workspaces.workspaces[targetIndex]; let nextWorkspace = workspaces.workspaces[targetIndex];
await this.changeWorkspace(nextWorkspace); await this.changeWorkspace(nextWorkspace, { explicitAnimationDirection: offset > 0 ? 'right' : 'left' });
} }
_initializeWorkspaceTabContextMenus() { _initializeWorkspaceTabContextMenus() {
@@ -1723,7 +1812,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];
} }
} }

View File

@@ -70,6 +70,8 @@ var ZenWorkspacesStorage = {
this.lazy.Weave.Service.engineManager.register(ZenWorkspacesEngine); this.lazy.Weave.Service.engineManager.register(ZenWorkspacesEngine);
await ZenWorkspacesStorage.migrateWorkspacesFromJSON(); await ZenWorkspacesStorage.migrateWorkspacesFromJSON();
} }
ZenWorkspaces._resolveDBInitialized();
}); });
}, },
@@ -603,4 +605,7 @@ var ZenWorkspaceBookmarksStorage = {
}, },
}; };
ZenWorkspacesStorage.init(); ZenWorkspacesStorage.promiseDBInitialized = new Promise((resolve) => {
ZenWorkspacesStorage._resolveDBInitialized = resolve;
ZenWorkspacesStorage.init();
});

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,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..b161c73fe690c172a9be266894f72427b1d934e3 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..b161c73fe690c172a9be266894f72427
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..b161c73fe690c172a9be266894f72427
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..b161c73fe690c172a9be266894f72427
"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..b161c73fe690c172a9be266894f72427
], ],
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..b161c73fe690c172a9be266894f72427
]); ]);
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,33 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..b161c73fe690c172a9be266894f72427
// 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 (
@@ -3609,7 +3608,7 @@ var CustomizableUIInternal = { @@ -1564,7 +1563,7 @@ var CustomizableUIInternal = {
lazy.log.info(
"Widget " + aWidgetId + " not found, unable to remove from " + aArea
);
- continue;
+ // continue;
}
this.notifyDOMChange(widgetNode, null, container, true, () => {
@@ -1574,7 +1573,7 @@ var CustomizableUIInternal = {
// We also need to remove the panel context menu if it's there:
this.ensureButtonContextMenu(widgetNode);
if (gPalette.has(aWidgetId) || this.isSpecialWidget(aWidgetId)) {
- container.removeChild(widgetNode);
+ widgetNode.remove();
} else {
window.gNavToolbox.palette.appendChild(widgetNode);
}
@@ -2678,7 +2677,6 @@ var CustomizableUIInternal = {
if (!this.isWidgetRemovable(aWidgetId)) {
return;
}
-
let placements = gPlacements.get(oldPlacement.area);
let position = placements.indexOf(aWidgetId);
if (position != -1) {
@@ -3669,7 +3667,7 @@ var CustomizableUIInternal = {
} }
}, },
@@ -81,7 +107,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..b161c73fe690c172a9be266894f72427
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 +3619,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;
@@ -90,7 +116,7 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..b161c73fe690c172a9be266894f72427
win.setToolbarVisibility( win.setToolbarVisibility(
areaNode, areaNode,
typeof defaultCollapsed == "string" typeof defaultCollapsed == "string"
@@ -4583,6 +4582,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);
}, },
@@ -98,3 +124,46 @@ index b953d7d2c8fa7fe2d320bd7cb7af9aeeef0abc86..b161c73fe690c172a9be266894f72427
/** /**
* 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,
@@ -6483,11 +6482,11 @@ class OverflowableToolbar {
parseFloat(style.paddingLeft) -
parseFloat(style.paddingRight) -
toolbarChildrenWidth;
- 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) {
- this.#target.appendChild(child);
+ win.gZenVerticalTabsManager.appendCustomizableItem(this.#target, child, gPlacements.get(this.#toolbar.id));
}
child.removeAttribute("cui-anchorid");
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,5 +1,5 @@
diff --git a/browser/components/places/content/browserPlacesViews.js b/browser/components/places/content/browserPlacesViews.js diff --git a/browser/components/places/content/browserPlacesViews.js b/browser/components/places/content/browserPlacesViews.js
index 1bfa0af16178c9b42172bc1b1e0249d28ff8e9e6..417a9dc4e55208bdc9c1422a3bae14361a4964c5 100644 index 1bfa0af16178c9b42172bc1b1e0249d28ff8e9e6..6744a37b7183ab9e3ac5bced7ded715879063eb5 100644
--- a/browser/components/places/content/browserPlacesViews.js --- a/browser/components/places/content/browserPlacesViews.js
+++ b/browser/components/places/content/browserPlacesViews.js +++ b/browser/components/places/content/browserPlacesViews.js
@@ -330,12 +330,23 @@ class PlacesViewBase { @@ -330,12 +330,23 @@ class PlacesViewBase {
@@ -13,7 +13,7 @@ index 1bfa0af16178c9b42172bc1b1e0249d28ff8e9e6..417a9dc4e55208bdc9c1422a3bae1436
+ let child = resultNode.getChild(i); + let child = resultNode.getChild(i);
+ // Skip nodes that don't belong in current workspace + // Skip nodes that don't belong in current workspace
+ if (PlacesUtils.nodeIsURI(child) || PlacesUtils.containerTypes.includes(child.type)) { + if (PlacesUtils.nodeIsURI(child) || PlacesUtils.containerTypes.includes(child.type)) {
+ if (ZenWorkspaces.isBookmarkInAnotherWorkspace(child)) { + if (typeof ZenWorkspaces !== 'undefined' && ZenWorkspaces.isBookmarkInAnotherWorkspace(child)) {
+ continue; + continue;
+ } + }
+ } + }
@@ -33,7 +33,7 @@ index 1bfa0af16178c9b42172bc1b1e0249d28ff8e9e6..417a9dc4e55208bdc9c1422a3bae1436
"scheme", "scheme",
PlacesUIUtils.guessUrlSchemeForUI(aPlacesNode.uri) PlacesUIUtils.guessUrlSchemeForUI(aPlacesNode.uri)
); );
+ element.addEventListener("command", gZenGlanceManager.openGlanceForBookmark.bind(gZenGlanceManager)); + element.addEventListener("command", (e) => window.gZenGlanceManager.openGlanceForBookmark(e));
} else if (PlacesUtils.containerTypes.includes(type)) { } else if (PlacesUtils.containerTypes.includes(type)) {
element = document.createXULElement("menu"); element = document.createXULElement("menu");
element.setAttribute("container", "true"); element.setAttribute("container", "true");
@@ -52,7 +52,7 @@ index 1bfa0af16178c9b42172bc1b1e0249d28ff8e9e6..417a9dc4e55208bdc9c1422a3bae1436
+ for (let i = 0; i < cc; i++) { + for (let i = 0; i < cc; i++) {
+ let child = this._resultNode.getChild(i); + let child = this._resultNode.getChild(i);
+ if (PlacesUtils.nodeIsURI(child) || PlacesUtils.containerTypes.includes(child.type)) { + if (PlacesUtils.nodeIsURI(child) || PlacesUtils.containerTypes.includes(child.type)) {
+ if (!ZenWorkspaces.isBookmarkInAnotherWorkspace(child)) { + if (!(typeof ZenWorkspaces !== 'undefined' && ZenWorkspaces.isBookmarkInAnotherWorkspace(child))) {
+ visibleNodes.push(child); + visibleNodes.push(child);
+ } + }
+ } else { + } else {

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">

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